alkaline-ml / pmdarima

A statistical library designed to fill the void in Python's time series analysis capabilities, including the equivalent of R's auto.arima function.
https://www.alkaline-ml.com/pmdarima
MIT License
1.57k stars 231 forks source link

aarch64 runtime causes "Schur decomposition solver error" #478

Closed andyndang closed 2 years ago

andyndang commented 2 years ago

Describe the bug

Running the following snippet on x84_64 is fine, but causes "schur decomposition solver error" in aarch64:

import pmdarima as pm
import numpy as np

model = pm.arima.ARIMA(order=(1, 0, 0), seasonal_order=(2, 1, 0, 7))
data = np.array([ 0.0, 0.0, 0.0, 0.0, 0.0, 9.85040379
, 9.54116535, 9.32663155, 9.2234745,  9.565238, 8.71925259, 9.76801205
, 9.69493675, 9.79889011, 9.49398804, 8.66767883, 9.33772945, 8.71925259
, 9.15603161, 8.45924664, 8.7293129,  9.48911667, 10.19035053, 9.22128391
, 9.01288033, 8.12544632, 9.57633972, 8.85050488, 9.03771114, 9.09411049
, 8.72431564, 8.64025211, 8.89891052, 9.55954933, 8.9926033,  8.79051018
, 9.06884098, 8.56023407, 8.63816166, 9.47813416, 10.32632923, 9.49745369], dtype=float)
model.fit(data)

To Reproduce

Running this in aarch64. We came across this on r6g.2xl instances in AWS

Versions

1.8.4

Expected Behavior

No error

Actual Behavior

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/env/lib/python3.9/site-packages/pmdarima/arima/arima.py", line 597, in fit
    self._fit(y, X, **fit_args)
  File "/env/lib/python3.9/site-packages/pmdarima/arima/arima.py", line 520, in _fit
    fit, self.arima_res_ = _fit_wrapper()
  File "/env/lib/python3.9/site-packages/pmdarima/arima/arima.py", line 508, in _fit_wrapper
    return arima, arima.fit(start_params=start_params,
  File "/env/lib/python3.9/site-packages/statsmodels/tsa/statespace/mlemodel.py", line 704, in fit
    mlefit = super(MLEModel, self).fit(start_params, method=method,
  File "/env/lib/python3.9/site-packages/statsmodels/base/model.py", line 563, in fit
    xopt, retvals, optim_settings = optimizer._fit(f, score, start_params,
  File "/env/lib/python3.9/site-packages/statsmodels/base/optimizer.py", line 241, in _fit
    xopt, retvals = func(objective, gradient, start_params, fargs, kwargs,
  File "/env/lib/python3.9/site-packages/statsmodels/base/optimizer.py", line 651, in _fit_lbfgs
    retvals = optimize.fmin_l_bfgs_b(func, start_params, maxiter=maxiter,
  File "/env/lib/python3.9/site-packages/scipy/optimize/lbfgsb.py", line 197, in fmin_l_bfgs_b
    res = _minimize_lbfgsb(fun, x0, args=args, jac=jac, bounds=bounds,
  File "/env/lib/python3.9/site-packages/scipy/optimize/lbfgsb.py", line 360, in _minimize_lbfgsb
    f, g = func_and_grad(x)
  File "/env/lib/python3.9/site-packages/scipy/optimize/_differentiable_functions.py", line 260, in fun_and_grad
    self._update_fun()
  File "/env/lib/python3.9/site-packages/scipy/optimize/_differentiable_functions.py", line 226, in _update_fun
    self._update_fun_impl()
  File "/env/lib/python3.9/site-packages/scipy/optimize/_differentiable_functions.py", line 133, in update_fun
    self.f = fun_wrapped(self.x)
  File "/env/lib/python3.9/site-packages/scipy/optimize/_differentiable_functions.py", line 130, in fun_wrapped
    return fun(x, *args)
  File "/env/lib/python3.9/site-packages/statsmodels/base/model.py", line 531, in f
    return -self.loglike(params, *args) / nobs
  File "/env/lib/python3.9/site-packages/statsmodels/tsa/statespace/mlemodel.py", line 939, in loglike
    loglike = self.ssm.loglike(complex_step=complex_step, **kwargs)
  File "/env/lib/python3.9/site-packages/statsmodels/tsa/statespace/kalman_filter.py", line 983, in loglike
    kfilter = self._filter(**kwargs)
  File "/env/lib/python3.9/site-packages/statsmodels/tsa/statespace/kalman_filter.py", line 903, in _filter
    self._initialize_state(prefix=prefix, complex_step=complex_step)
  File "/env/lib/python3.9/site-packages/statsmodels/tsa/statespace/representation.py", line 983, in _initialize_state
    self._statespaces[prefix].initialize(self.initialization,
  File "statsmodels/tsa/statespace/_representation.pyx", line 1373, in statsmodels.tsa.statespace._representation.dStatespace.initialize
  File "statsmodels/tsa/statespace/_representation.pyx", line 1362, in statsmodels.tsa.statespace._representation.dStatespace.initialize
  File "statsmodels/tsa/statespace/_initialization.pyx", line 288, in statsmodels.tsa.statespace._initialization.dInitialization.initialize
  File "statsmodels/tsa/statespace/_initialization.pyx", line 406, in statsmodels.tsa.statespace._initialization.dInitialization.initialize_stationary_stationary_cov
  File "statsmodels/tsa/statespace/_tools.pyx", line 1284, in statsmodels.tsa.statespace._tools._dsolve_discrete_lyapunov
numpy.linalg.LinAlgError: Schur decomposition solver error.

Additional Context

This is causes by statsmodels underneath the hood so I already cut a ticket there FYI: https://github.com/statsmodels/statsmodels/issues/8033

andyndang commented 2 years ago

FYI upgrading to scipy 1.7.2 fixed the issue :)

aaronreidsmith commented 2 years ago

Thanks for the issue and fix! Just as an FYI, we don't fully support aarch64 yet (see #434, #435, and #458 for more info). We'll look into this, but I wouldn't rely on pmdarima on aarch64 for any production use cases