module 'numpy.distutils.__config__' has no attribute 'blas_opt_info'
Asked Answered
K

3

14

I'm trying to study the neural-network-and-deep-learning (http://neuralnetworksanddeeplearning.com/chap1.html). Using the updated version for Python 3 by MichalDanielDobrzanski (https://github.com/MichalDanielDobrzanski/DeepLearningPython). Tried to run it in my command console and it gives an error below. I've tried uninstalling and reinstalling setuptools, theano, and numpy but none have worked thus far. Any help is very appreciated!!

Here's the full error log:

WARNING (theano.configdefaults): g++ not available, if using conda: `conda install m2w64-toolchain`
C:\Users\ASUS\AppData\Local\Programs\Python\Python39\lib\site-packages\theano\configdefaults.py:560: UserWarning: DeprecationWarning: there is no c++ compiler.This is deprecated and with Theano 0.11 a c++ compiler will be mandatory
  warnings.warn("DeprecationWarning: there is no c++ compiler."
WARNING (theano.configdefaults): g++ not detected ! Theano will be unable to execute optimized C-implementations (for both CPU and GPU) and will default to Python implementations. Performance will be severely degraded. To remove this warning, set Theano flags cxx to an empty string.
Traceback (most recent call last):
  File "C:\Users\ASUS\AppData\Local\Programs\Python\Python39\lib\site-packages\theano\configparser.py", line 168, in fetch_val_for_key
    return theano_cfg.get(section, option)
  File "C:\Users\ASUS\AppData\Local\Programs\Python\Python39\lib\configparser.py", line 781, in get
    d = self._unify_values(section, vars)
  File "C:\Users\ASUS\AppData\Local\Programs\Python\Python39\lib\configparser.py", line 1149, in _unify_values
    raise NoSectionError(section) from None
configparser.NoSectionError: No section: 'blas'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\ASUS\AppData\Local\Programs\Python\Python39\lib\site-packages\theano\configparser.py", line 327, in __get__
    val_str = fetch_val_for_key(self.fullname,
  File "C:\Users\ASUS\AppData\Local\Programs\Python\Python39\lib\site-packages\theano\configparser.py", line 172, in fetch_val_for_key
    raise KeyError(key)
KeyError: 'blas.ldflags'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\ASUS\Documents\GitHub\Neural-network-and-deep-learning-but-for-python-3\test.py", line 156, in <module>
    import network3
  File "C:\Users\ASUS\Documents\GitHub\Neural-network-and-deep-learning-but-for-python-3\network3.py", line 37, in <module>
    import theano
  File "C:\Users\ASUS\AppData\Local\Programs\Python\Python39\lib\site-packages\theano\__init__.py", line 124, in <module>
    from theano.scan_module import (scan, map, reduce, foldl, foldr, clone,
  File "C:\Users\ASUS\AppData\Local\Programs\Python\Python39\lib\site-packages\theano\scan_module\__init__.py", line 41, in <module>
    from theano.scan_module import scan_opt
  File "C:\Users\ASUS\AppData\Local\Programs\Python\Python39\lib\site-packages\theano\scan_module\scan_opt.py", line 60, in <module>
    from theano import tensor, scalar
  File "C:\Users\ASUS\AppData\Local\Programs\Python\Python39\lib\site-packages\theano\tensor\__init__.py", line 17, in <module>
    from theano.tensor import blas
  File "C:\Users\ASUS\AppData\Local\Programs\Python\Python39\lib\site-packages\theano\tensor\blas.py", line 155, in <module>
    from theano.tensor.blas_headers import blas_header_text
  File "C:\Users\ASUS\AppData\Local\Programs\Python\Python39\lib\site-packages\theano\tensor\blas_headers.py", line 987, in <module>
    if not config.blas.ldflags:
  File "C:\Users\ASUS\AppData\Local\Programs\Python\Python39\lib\site-packages\theano\configparser.py", line 332, in __get__
    val_str = self.default()
  File "C:\Users\ASUS\AppData\Local\Programs\Python\Python39\lib\site-packages\theano\configdefaults.py", line 1284, in default_blas_ldflags
    blas_info = np.distutils.__config__.blas_opt_info
AttributeError: module 'numpy.distutils.__config__' has no attribute 'blas_opt_info'
Kranz answered 24/1, 2022 at 19:18 Comment(1)
Thank you @eshivana for making it clearer!!Kranz
F
18

I had the same issue and solved it downgrading numpy to version 1.20.3 by:

pip3 install --upgrade numpy==1.20.3
Foreman answered 31/1, 2022 at 9:57 Comment(3)
Please note, that the line should be pip3 install --upgrade numpy==1.20.3 (doubled ==)Cybernetics
Thank you! This worked! I also realised that I should have simply followed the requirements and installed the relevant versions... Well we all have to start from somewhere I suppose. But thank you guys so much!Kranz
Note: 1.21 is also fine.Sokol
L
7

Monkey-patch NumPy.

import numpy as np

try:
    np.distutils.__config__.blas_opt_info = np.distutils.__config__.blas_ilp64_opt_info
except Exception:
    pass

This working snippet comes directly from NumPy maintainer Ralf Gommers (@rgommers), who first defined a similar monkey-patch against the synthetic numpy.__config__ submodule. Issue submitter Alex Rogozhnikov (@arogozhnikov) then improved that by monkey-patching the preferable numpy.distutils.__config__ submodule instead.

For actively maintained software (...so, not theano is what I'm saying), instead:

  • Require NumPy ≥ 1.22.0.
  • Globally replace all broken references to np.distutils.__config__.blas_opt_info with working references to np.distutils.__config__.blas_ilp64_opt_info.

Danger, Will Robinson! Danger!

However, all of the above come with a critical caveat: all of this will break yet again under some future as-yet-undecided NumPy release. Why? To quote NumPy maintainer Ralf Gommers (@rgommers) yet again:

This is all going to change when we change build systems, we won't be preserving the system_info type output.

</gulp>

Loleta answered 21/5, 2022 at 5:8 Comment(1)
hahaha, thank you so much Cecil for your input!! I guess I will avoid projects that have software that is not actively maintained...Kranz
S
6

Additional information:

theano is an obsolete package and shall not be used with modern versions of numpy. However some legacy codebase will be using theano, so the workaround of downgrading numpy < 1.22 will be needed as in the accepted answer. The deprecation has been made in numpy 1.22: see numpy issue #21079.

If one would need to stick with numpy 1.22+, blas_opt_info is located in numpy.distutils.system_info.blas_opt_info, so manually patching theano to use the correct symbol would be another workaround.

Sokol answered 17/3, 2022 at 10:50 Comment(2)
Noted! Thanks for the info JongWook!Kranz
Monkey-patching theano is absolutely the way. Downgrading NumPy is neither feasible nor desirable in most contexts – especially going forward, where increasingly everything else in the Python ecosystem will require the modern NumPy API.Loleta

© 2022 - 2024 — McMap. All rights reserved.