Linux 和 Windows 之间的 numpy 性能差异

2023-11-22

我正在尝试跑步sklearn.decomposition.TruncatedSVD()在两台不同的计算机上并了解性能差异。

电脑1(Windows 7,物理计算机)

OS Name Microsoft Windows 7 Professional
System Type x64-based PC
Processor   Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz, 3401 Mhz, 4 Core(s), 
8 Logical Installed Physical Memory (RAM)   8.00 GB
Total Physical Memory   7.89 GB

电脑2(Debian,在亚马逊云上)

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8

width: 64 bits
capabilities: ldt16 vsyscall32
*-core
   description: Motherboard
   physical id: 0
*-memory
   description: System memory
   physical id: 0
   size: 29GiB
*-cpu
   product: Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
   vendor: Intel Corp.
   physical id: 1
   bus info: cpu@0
   width: 64 bits

电脑3(Windows 2008R2,在亚马逊云上)

OS Name Microsoft Windows Server 2008 R2 Datacenter
Version 6.1.7601 Service Pack 1 Build 7601
System Type x64-based PC
Processor   Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz, 2500 Mhz, 
4 Core(s), 8 Logical Processor(s)
Installed Physical Memory (RAM) 30.0 GB

两台计算机都运行 Python 3.2 和相同的 sklearn、numpy、scipy 版本

I ran cProfile如下:

print(vectors.shape)
>>> (7500, 2042)

_decomp = TruncatedSVD(n_components=680, random_state=1)
global _o
_o = _decomp
cProfile.runctx('_o.fit_transform(vectors)', globals(), locals(), sort=1)

电脑1输出

>>>    833 function calls in 1.710 seconds
Ordered by: internal time

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.767    0.767    0.782    0.782 decomp_svd.py:15(svd)
    1    0.249    0.249    0.249    0.249 {method 'enable' of '_lsprof.Profiler' objects}
    1    0.183    0.183    0.183    0.183 {method 'normal' of 'mtrand.RandomState' objects}
    6    0.174    0.029    0.174    0.029 {built-in method csr_matvecs}
    6    0.123    0.021    0.123    0.021 {built-in method csc_matvecs}
    2    0.110    0.055    0.110    0.055 decomp_qr.py:14(safecall)
    1    0.035    0.035    0.035    0.035 {built-in method dot}
    1    0.020    0.020    0.589    0.589 extmath.py:185(randomized_range_finder)
    2    0.018    0.009    0.019    0.010 function_base.py:532(asarray_chkfinite)
   24    0.014    0.001    0.014    0.001 {method 'ravel' of 'numpy.ndarray' objects}
    1    0.007    0.007    0.009    0.009 twodim_base.py:427(triu)
    1    0.004    0.004    1.710    1.710 extmath.py:232(randomized_svd)

电脑2输出

>>>    858 function calls in 40.145 seconds
Ordered by: internal time
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    2   32.116   16.058   32.116   16.058 {built-in method dot}
    1    6.148    6.148    6.156    6.156 decomp_svd.py:15(svd)
    2    0.561    0.281    0.561    0.281 decomp_qr.py:14(safecall)
    6    0.561    0.093    0.561    0.093 {built-in method csr_matvecs}
    1    0.337    0.337    0.337    0.337 {method 'normal' of 'mtrand.RandomState' objects}
    6    0.202    0.034    0.202    0.034 {built-in method csc_matvecs}
    1    0.052    0.052    1.633    1.633 extmath.py:183(randomized_range_finder)
    1    0.045    0.045    0.054    0.054 _methods.py:73(_var)
    1    0.023    0.023    0.023    0.023 {method 'argmax' of 'numpy.ndarray' objects}
    1    0.023    0.023    0.046    0.046 extmath.py:531(svd_flip)
    1    0.016    0.016   40.145   40.145 <string>:1(<module>)
   24    0.011    0.000    0.011    0.000 {method 'ravel' of 'numpy.ndarray' objects}
    6    0.009    0.002    0.009    0.002 {method 'reduce' of 'numpy.ufunc' objects}
    2    0.008    0.004    0.009    0.004 function_base.py:532(asarray_chkfinite)

电脑3输出

>>>         858 function calls in 2.223 seconds
Ordered by: internal time
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.956    0.956    0.972    0.972 decomp_svd.py:15(svd)
    2    0.306    0.153    0.306    0.153 {built-in method dot}
    1    0.274    0.274    0.274    0.274 {method 'normal' of 'mtrand.RandomState' objects}
    6    0.205    0.034    0.205    0.034 {built-in method csr_matvecs}
    6    0.151    0.025    0.151    0.025 {built-in method csc_matvecs}
    2    0.133    0.067    0.133    0.067 decomp_qr.py:14(safecall)
    1    0.032    0.032    0.043    0.043 _methods.py:73(_var)
    1    0.030    0.030    0.030    0.030 {method 'argmax' of 'numpy.ndarray' objects}
   24    0.026    0.001    0.026    0.001 {method 'ravel' of 'numpy.ndarray' objects}
    2    0.019    0.010    0.020    0.010 function_base.py:532(asarray_chkfinite)
    1    0.019    0.019    0.773    0.773 extmath.py:183(randomized_range_finder)
    1    0.019    0.019    0.049    0.049 extmath.py:531(svd_flip)

注意{内置方法点}从 0.035s/call 到 16.058s/call 的差异,慢了450倍!!

------+---------+---------+---------+---------+---------------------------------------
ncalls| tottime | percall | cumtime | percall | filename:lineno(function)  HARDWARE
------+---------+---------+---------+---------+---------------------------------------
1     |  0.035  |  0.035  |  0.035  |  0.035  | {built-in method dot}      Computer 1
2     | 32.116  | 16.058  | 32.116  | 16.058  | {built-in method dot}      Computer 2
2     |  0.306  |  0.153  |  0.306  |  0.153  | {built-in method dot}      Computer 3

我知道应该有性能差异,但我应该这么高吗?

有没有办法进一步调试这个性能问题?

EDIT

我测试了一台新计算机,计算机 3,其硬件与计算机 2 相似,但操作系统不同

结果为 0.153 秒/调用{内置方法点}仍然比 Linux 快 100 倍!

EDIT 2

计算机 1 numpy 配置

>>> np.__config__.show()
lapack_opt_info:
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'libiomp5md', 'libifportmd', 'mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'libiomp5md', 'libifportmd']
    library_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/lib/intel64']
    define_macros = [('SCIPY_MKL_H', None)]
    include_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/include']
blas_opt_info:
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'libiomp5md', 'libifportmd']
    library_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/lib/intel64']
    define_macros = [('SCIPY_MKL_H', None)]
    include_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/include']
openblas_info:
  NOT AVAILABLE
lapack_mkl_info:
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'libiomp5md', 'libifportmd', 'mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'libiomp5md', 'libifportmd']
    library_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/lib/intel64']
    define_macros = [('SCIPY_MKL_H', None)]
    include_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/include']
blas_mkl_info:
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'libiomp5md', 'libifportmd']
    library_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/lib/intel64']
    define_macros = [('SCIPY_MKL_H', None)]
    include_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/include']
mkl_info:
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'libiomp5md', 'libifportmd']
    library_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/lib/intel64']
    define_macros = [('SCIPY_MKL_H', None)]
    include_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/include']

计算机2 numpy配置

>>> np.__config__.show()
lapack_info:
  NOT AVAILABLE
lapack_opt_info:
  NOT AVAILABLE
blas_info:
    libraries = ['blas']
    library_dirs = ['/usr/lib']
    language = f77
atlas_threads_info:
  NOT AVAILABLE
atlas_blas_info:
  NOT AVAILABLE
lapack_src_info:
  NOT AVAILABLE
openblas_info:
  NOT AVAILABLE
atlas_blas_threads_info:
  NOT AVAILABLE
blas_mkl_info:
  NOT AVAILABLE
blas_opt_info:
    libraries = ['blas']
    library_dirs = ['/usr/lib']
    language = f77
    define_macros = [('NO_ATLAS_INFO', 1)]
atlas_info:
  NOT AVAILABLE
lapack_mkl_info:
  NOT AVAILABLE
mkl_info:
  NOT AVAILABLE

{built-in method dot} is the np.dot函数,它是 CBLAS 例程的 NumPy 包装器,用于矩阵-矩阵、矩阵-向量和向量-向量乘法。您的 Windows 机器使用经过严格调优的英特尔MKLCBLAS 版本。 Linux 机器正在使用缓慢的旧参考实现。

如果你安装ATLAS or OpenBLAS(两者都可以通过 Linux 包管理器获得)或者事实上,英特尔 MKL,您可能会看到巨大的加速。尝试sudo apt-get install libatlas-dev,再次检查 NumPy 配置,看看它是否拾取了 ATLAS,然后再次测量。

一旦您决定了正确的 CBLAS 库,您可能需要重新编译 scikit-learn。其中大部分仅使用 NumPy 来满足其线性代数需求,但某些算法(特别是 k-means)直接使用 CBLAS。

操作系统与此无关。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 和 Windows 之间的 numpy 性能差异 的相关文章

随机推荐

  • 了解 DICOM 图像属性以获得轴向/冠状/矢状切割 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我必须用 C 编写一个程序 能够解析 DICOM 并显示轴向 冠状和矢状切割 看起来工作量很大 但我必须这样做 我猜 重要的第一步是理解 DICOM 文件 我一直在读这个教程ht
  • Locale.getDefault() 返回Currency.getInstance 不支持/无效的区域设置

    我的应用程序使用以下代码来获取本地货币 Locale locale Locale getDefault java util Currency localCurrency java util Currency getInstance loca
  • 创建具有预先确定的平均值和标准差的数组

    我正在尝试使用 Numpy 创建一个具有预定平均值和标准差值的数组 该数组需要其中的随机数 到目前为止 我可以生成一个数组并计算平均值和标准差 但无法让数组受值控制 import numpy as np x np random randn
  • 如何将数组设置为mysql用户变量

    我没想到会发现这如此困难 但我试图在 MySQL 中设置一个用户变量来包含一个值数组 我不知道如何做到这一点 所以尝试做一些研究 但很惊讶没有找到答案 我努力了 SET billable types client1 client2 clie
  • 将数据从 csv 转换为动态列表 (Flutter)

    我创建了一个加载 CSV 文件并将其显示为列表视图的应用程序 我使用了以下示例 https gist github com Rahiche 9b4b2d3b5c24dddbbe662b58c5a2dcd2 问题是我的列表不生成行 I flu
  • 如何在另一个 git 存储库中提交 git 存储库

    我正在开发一个使用 git 的应用程序 因此我需要测试它与 git 的集成 在我的 git 存储库中 我需要另一个存储库 my git repo tests another repo 在没有 git 子模块的情况下如何提交它 我不想为一个文
  • 检查 Selenium 中是否存在 Element

    我想检查 Selenium 中是否存在某个元素 如果存在 则为其分配一个名称 现在我有一些看起来像这样的东西 IWebElement size9 driver FindElement By CssSelector a data value
  • 观察者模式与反应器模式

    我一直在研究两者 但找不到任何真正的区别 我错过了什么吗 在网络上 有些人说观察者应该只处理一个事件 而反应器应该处理很多事件 但我不认为这是一个真正的区别 因为反应器可以像许多观察者一样被看到 有什么区别吗 或者新名称 Reactor 只
  • OpenReadStream 允许的最大大小

    OpenReadStream 允许的最大大小是多少 现在 使用 10MB 但我认为必须有一定的上限 可以带GB吗 在 ASP NET Core 5 0 中 上传文件的框架文件大小限制为 2 GB 但是 从 ASP NET Core 6 0
  • C 中的局部结构

    如果一个结构体仅在一个函数中使用 我可以在该函数中声明它吗 我可以这样做吗 int func struct int a b s s a 5 return s a gcc 被它噎住了 但它发出了一个看起来非常奇怪的错误 我无法理解 而不是说
  • 涉及多个表的外键约束

    我在 Postgres 9 3 数据库中有以下场景 表 B 和 C 参考表 A 表 C 有一个引用表 B 的可选字段 我想确保对于表 C 中引用表 B 的每一行 c b a c a 也就是说 如果 C 引用了 B 则两行应指向表 A 中的同
  • Google Calendar V3 REST API 中的批量请求

    如何通过 V3 REST API 使用批量请求获取 添加 更新 Google 日历事件 我已经尝试过 但不起作用 根据文档 https developers google com google apps calendar batch 应该可
  • Chrome 用户脚本是否像 Greasemonkey 脚本一样与全局命名空间分离?

    我知道 Greasemonkey 脚本自动包装在匿名函数中 以某种方式隔离 以防止它们与页面中的脚本发生冲突 Chrome 用户脚本也会发生同样的情况吗 是的 Greasemonkey 脚本是通常封装在匿名函数中 And Chrome 用户
  • C++中NULL和False一样吗

    在 C gcc VS 中 NULL 被视为与 False 相同 或者更重要的是 如果在逻辑语句中 NULL 的计算结果是什么 还有许多其他问题 但没有专门针对 C 的问题 由于某种原因 使用 NULL 控件循环 for 只会冻结程序 表明
  • 在 bash 中指定两个文件扩展名完成

    我正在尝试修改 bash 完整属性 我可以这样排除命令的文件扩展名 complete f X hi vim 我想指定两个文件名进行排除 我该怎么做呢 注意 以下命令不起作用 complete f X hi o vim 一种方法是打开扩展的全
  • 操作系统中的加载程序如何工作? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我知道加载程序是一个将程序加载到主内存的程序 那么 这实际上是如何运作的呢 到底发生了什么 实际上 当加载程序加载程序时 会在 PCB 中创建一个条目 并将程序放入作业池中 程序
  • 在 C++ 中调用 this->get/this->set 方法与直接访问成员变量

    假设我有一堂课Foo 带有私有变量bar 包含一些状态Foo 如果有必要 我可以编写公共 get set 方法bar 当然 我会尽可能避免这种情况以保持封装性 假设我有这些获取 设置方法 每当我必须访问或修改bar 在属于的方法内Foo 我
  • 在 Symfony2 中,\DateTime 是什么意思?

    在 Symfony 2 中 这一行的含义是什么 task gt setDueDate new DateTime tomorrow 什么是 DateTime表示 可以从任何地方访问它吗 首先仅供参考 这与 Symfony 没有任何关系 只是碰
  • 如何防止 Play 商店测试影响 Firebase Analytics

    我刚刚启动了一个新应用程序 并且正在使用 Firebase Analytics 然而 每次我将新版本上传到 Play 商店时 Google 都会自动在 11 台设备上对其进行测试 这太棒了 有没有办法防止这些测试影响分析 我从一个小的用户群
  • Linux 和 Windows 之间的 numpy 性能差异

    我正在尝试跑步sklearn decomposition TruncatedSVD 在两台不同的计算机上并了解性能差异 电脑1 Windows 7 物理计算机 OS Name Microsoft Windows 7 Professional