numpy 从Matlab调用Python时“英特尔MKL错误”

ztyzrc3y  于 2023-06-23  发布在  Matlab
关注(0)|答案(1)|浏览(219)

我一直在用Python工作,但现在我不得不和一个用Matlab工作的同事分享一个函数。因为这个东西相当复杂,调用编译后的C代码等。我认为从Matlab调用Python代码更容易。
一切似乎都很好,直到这一行:points = np.random.multivariate_normal(means, correlation, nSamples)
我得到的错误:

Intel MKL ERROR: Parameter 12 was incorrect on entry to DGBBRDM.

Intel MKL ERROR: Parameter 10 was incorrect on entry to DGESDD.
init_gesdd failed init

并且执行平稳地继续,其中点是0的数组。
当然,当直接运行Python代码时(从相同的conda env),我得到了我的多元正态样本。
在这里搜索,我只找到提到代码如何编译,如何链接以及接口可能是C或Fortran的解决方案。在这里,我没有编译任何东西,我不明白为什么中间的Matlab步骤会扰乱numpy使用的库。
我在Anaconda指南上找到了一些相关的东西,但似乎是Windows特定的,并且提到了与Matlab不同的软件,所以我甚至不确定是不是同样的问题。
一个(可能)类似question的答案建议

conda config --add channels intel
conda update --all

但这个也没什么用
总的来说,这似乎不是一个方便的方式与同事共享一些功能。

编辑

我使用的是Ubuntu 22.04.2 LTS,如果有关系的话,运行在第11代英特尔®酷睿™ i7- 1165G7@2.80GHz × 8,Python 3.9.12,MatlabR 2022 b上。
复制的两个步骤:

  • 文件testMatlabIntel.py包含:
import numpy as np
  def test():
      means = [0,0]
      correlation = [[1,0.3],[0.3,1]]
      nSamples = 300
      points = np.random.multivariate_normal(means, correlation, Samples)
      return np.std(points)
  • 从终端打开Matlab,如果需要,在python路径(insert(py.sys.path,int32(0),'path/to/file');)中添加python文件的路径,然后运行:
py.testMatlabIntel.test()

Matlab提示符中的输出为:

/path/to/file/testMatlabIntel.py:7: RuntimeWarning: covariance is not positive-semidefinite.
    points = np.random.multivariate_normal(means, correlation, Samples)

  ans =

       0

而在终端上我用来启动Matlab我看到:

Intel MKL ERROR: Parameter 12 was incorrect on entry to DGBBRDM.

  Intel MKL ERROR: Parameter 10 was incorrect on entry to DGESDD.

请注意,这不仅仅是一个方差为零的数组,而是一个零数组。
相比之下,在另一台机器(Ubuntu 20.04.6 LTS,英特尔®酷睿™ i5- 8250 U CPU@1.60GHz × 8)上,我得到的结果很简单:

ans =

      1.0136

从Python调用测试函数时没有警告,也没有从一个单位方差样本中预期的那样。

编辑2

运行Ubuntu 22.04.2 LTS的计算机:

Python: 3.9.16 (main, Feb 22 2023, 02:08:36) 
    [GCC 11.2.0]

    Numpy: 1.23.5

    MKL: Intel(R) oneAPI Math Kernel Library Version 2023.1-Product Build 20230303 for Intel(R) 64 architecture applications

我仔细检查了同一个版本是否从终端和Matlab调用。
在终端中,当调用Python时,我得到了[GCC 11.2.0] :: Intel Corporation on linux
此外,设置MKL_VERBOSE=1,它会打印:

MKL_VERBOSE DGESDD(A,8589934594,8589934594,0x7fbfc9a789b0,8589934594,0x7fbfc9a789d0,0x7fbfc9a789e0,8589934594,0x7fbfc9a78a00,-4294967294,0x7fc12b3f9010,1382979469311,0x7fbfc9a78a20,-10) 580.03us CNR:OFF Dyn:1 FastMM:1 TID:0  NThr:4
    init_gesdd failed init
    MKL_VERBOSE DGEMM(N,T,2,2,2,0x7fc12b3fabc0,0x7fbfc9a991e0,2,0x7fbfc9a97600,2,0x7fc12b3fabc8,0x7fbfc9685760,2) 131.85us CNR:OFF Dyn:1 FastMM:1 TID:0  NThr:4
    MKL_VERBOSE DGEMM(N,N,2,300,2,0x7fc12b3fabc0,0x7fbfc9685760,2,0x7fc05d198a00,2,0x7fc12b3fabc8,0x7fc05d199cd0,2) 15.14us CNR:OFF Dyn:1 FastMM:1 TID:0  NThr:4

如果这能帮上忙的话。
在另一台机器(Ubuntu 20.04.6 LTS)上,从Matlab内部我得到:

Python: 3.9.16 (main, Mar  8 2023, 14:08:28) 
    [GCC 11.2.0]
    
    Numpy: 1.23.5

    MKL: Intel(R) oneAPI Math Kernel Library Version 2023.1-Product Build 20230303 for Intel(R) 64 architecture applications

从终端调用Python时,我得到[GCC 11.2.0] :: Anaconda, Inc. on linux
总结:
| | 作品|并不|
| - -----|- -----|- -----|
| Ubuntu| 20.04.6 LTS| 22.04.2 LTS|
| Matlab| R2023a| R2022b|
| Python| 3.9.16| 3.9.16|
| 从英特尔?|没有吗|是的|
| Numpy| 1.23.5| 1.23.5|
| MKL| 2023.1| 2023.1|

xjreopfe

xjreopfe1#

我有一个类似的problem。解决方案是在启动文件中添加以下行:

py.sys.setdlopenflags(int32(bitor(int64(py.os.RTLD_LAZY),int64(py.os.RTLD_DEEPBIND))));

相关问题