首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么M1 Max上的Python要比旧的Intel i5上的Python慢很多?

为什么M1 Max上的Python要比旧的Intel i5上的Python慢很多?
EN

Stack Overflow用户
提问于 2021-12-06 03:16:05
回答 3查看 9.3K关注 0票数 11

我刚刚得到了我的新MacBook Pro与M1麦克斯芯片,并正在设置M1。我试过几个组合设置来测试速度--现在我很困惑。首先在这里提出我的问题:

  • 为什么python在M1 Max上运行的速度比我的MacBook Pro 2016要慢得多(~100%)?
  • 在M1 Max上,为什么本地运行(由微型锻造)和通过罗塞塔(由anaconda运行)之间没有显著的速度差异-这应该是慢到20%?
  • 在M1 Max和本机运行中,为什么conda已安装的Numpy和TensorFlow安装的Numpy之间没有明显的速度差异--这应该更快吗?
  • 在M1 Max上,为什么在PyCharm IDE中运行的速度总是比从终端运行的速度慢到20%,这在我以前的英特尔Mac上是不会发生的。

支持我的问题的证据如下:

以下是我尝试过的设置:

1. 安装的Python

  • 小型锻造-武器64,因此python本机运行在M1 Max芯片上。(查看Activity,python进程的KindApple)。
  • 蟒蛇。然后蟒蛇通过Rosseta运行。(查看Activity,python进程的KindIntel)。

2.由安装的Numpy

  • conda install numpy:从原始的conda锻造通道,或预先安装的anaconda.
  • :使用微型锻造安装python,我直接安装tensorflow,numpy也将被安装。据说,以这种方式安装的numpy是针对苹果M1进行优化的,而且会更快。下面是安装命令:
代码语言:javascript
复制
conda install -c apple tensorflow-deps
python -m pip install tensorflow-macos
python -m pip install tensorflow-metal

3.从运行

下面是测试代码:

代码语言:javascript
复制
import time
import numpy as np
np.random.seed(42)
a = np.random.uniform(size=(300, 300))
runtimes = 10

timecosts = []
for _ in range(runtimes):
    s_time = time.time()
    for i in range(100):
        a += 1
        np.linalg.svd(a)
    timecosts.append(time.time() - s_time)

print(f'mean of {runtimes} runs: {np.mean(timecosts):.5f}s')

以下是研究结果:

代码语言:javascript
复制
+-----------------------------------+-----------------------+--------------------+
|   Python installed by (run on)→   | Miniforge (native M1) | Anaconda (Rosseta) |
+----------------------+------------+------------+----------+----------+---------+
| Numpy installed by ↓ | Run from → |  Terminal  |  PyCharm | Terminal | PyCharm |
+----------------------+------------+------------+----------+----------+---------+
|          Apple Tensorflow         |   4.19151  |  4.86248 |     /    |    /    |
+-----------------------------------+------------+----------+----------+---------+
|        conda install numpy        |   4.29386  |  4.98370 |  4.10029 | 4.99271 |
+-----------------------------------+------------+----------+----------+---------+

这太慢了。作为比较,

  • 使用2.39917s.芯片在我的旧MacBook Pro 2016上运行相同的代码-它需要花费i5
  • 另一个使用2.53214s,芯片(而不是Pro或Max)运行的post (but not in English)报告说,miniforge+conda_installed_numpy是post (but not in English),miniforge+apple_tensorflow_numpy是1.00613s.
  • 你也可以自己试试看。

以下是CPU信息的详细信息:

  • 我以前的i5:
代码语言:javascript
复制
$ sysctl -a | grep -e brand_string -e cpu.core_count
machdep.cpu.brand_string: Intel(R) Core(TM) i5-6360U CPU @ 2.00GHz
machdep.cpu.core_count: 2
  • 我的新M1麦克斯:
代码语言:javascript
复制
% sysctl -a | grep -e brand_string -e cpu.core_count
machdep.cpu.brand_string: Apple M1 Max
machdep.cpu.core_count: 10

我严格遵循教程中的指示--但是为什么会发生这些呢?是因为我的安装缺陷,还是因为M1 Max芯片?由于我的工作非常依赖于本地跑,本地速度对我来说是非常重要的。如果您对可能的解决方案或您自己设备上的任何数据点提出建议,将不胜感激:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-07 04:54:32

更新2022年3月28日:请见下面@AndrejHribernik的评论。

如何在M1 Max上安装numpy,性能提高最快(苹果的vecLib)?这是2021年12月6日的答案。

步骤

I.安装微型锻造

这样您的Python就可以在arm64上本地运行,而不是通过Rosseta翻译。

  1. 下载Miniforge3-MacOSX-arm64.sh,然后
  2. 运行脚本,然后打开另一个shell
代码语言:javascript
复制
$ bash Miniforge3-MacOSX-arm64.sh
  1. 创建一个环境(在这里我使用名称np_veclib)
代码语言:javascript
复制
$ conda create -n np_veclib python=3.9
$ conda activate np_veclib

II.使用vecLib指定的BLAS接口安装Numpy

  1. 要编译numpy,首先需要安装cythonpybind11
代码语言:javascript
复制
$ conda install cython pybind11
  1. 编译numpy by (谢谢@Marijn的回答) -不要使用conda install
代码语言:javascript
复制
$ pip install --no-binary :all: --no-use-pep517 numpy
  1. 2的另一种选择是从源构建
代码语言:javascript
复制
$ git clone https://github.com/numpy/numpy
$ cd numpy
$ cp site.cfg.example site.cfg
$ nano site.cfg

编辑复制的site.cfg:添加以下行:

代码语言:javascript
复制
[accelerate]
libraries = Accelerate, vecLib

然后构建并安装:

代码语言:javascript
复制
$ NPY_LAPACK_ORDER=accelerate python setup.py build
$ python setup.py install
  1. 在2或3之后,现在测试numpy是否使用vecLib:
代码语言:javascript
复制
>>> import numpy
>>> numpy.show_config()

然后,像/System/Library/Frameworks/vecLib.framework/Headers这样的信息应该被打印出来。

三.使用conda进一步安装其他软件包

使conda识别由pip安装的软件包

代码语言:javascript
复制
conda config --set pip_interop_enabled true

必须这样做,否则,如果是conda install pandas,那么numpy将出现在The following packages will be installed列表中并再次安装。但新安装的一个是从conda-forge通道,是缓慢的。

与其他装置的比较:

1.竞争者:

除了上述最优的安装,我还尝试了其他几种安装。

  • A. np_defaultconda create -n np_default python=3.9 numpy
  • B. np_openblasconda create -n np_openblas python=3.9 numpy blas=*=*openblas*
  • C. np_netlibconda create -n np_netlib python=3.9 numpy blas=*=*netlib*

以上ABC选项直接安装在conda- from通道上.numpy.show_config()将显示相同的结果。要查看差异,请通过conda list检查--例如,openblas包安装在B中。注意,arm64不支持mklblis

  • D. np_openblas_source:首先由brew install openblas安装openblas。然后将[openblas] path /opt/homebrew/opt/openblas添加到site.cfg并从源构建Numpy。
  • M1i9–9880H帖子中。
  • 我的老i5-6360U 2核在MacBook Pro 2016 13英寸。

2.基准:

这里我使用两个基准:

  1. mysvd.py:我的奇异值分解
代码语言:javascript
复制
import time
import numpy as np
np.random.seed(42)
a = np.random.uniform(size=(300, 300))
runtimes = 10

timecosts = []
for _ in range(runtimes):
    s_time = time.time()
    for i in range(100):
        a += 1
        np.linalg.svd(a)
    timecosts.append(time.time() - s_time)

print(f'mean of {runtimes} runs: {np.mean(timecosts):.5f}s')
  1. dario.pyDario Radečić在上面发布的一个基准脚本。

3.结果:

代码语言:javascript
复制
+-------+-----------+------------+-------------+-----------+--------------------+----+----------+----------+
|  sec  | np_veclib | np_default | np_openblas | np_netlib | np_openblas_source | M1 | i9–9880H | i5-6360U |
+-------+-----------+------------+-------------+-----------+--------------------+----+----------+----------+
| mysvd |  1.02300  |   4.29386  |   4.13854   |  4.75812  |      12.57879      |  / |     /    |  2.39917 |
+-------+-----------+------------+-------------+-----------+--------------------+----+----------+----------+
| dario |     21    |     41     |      39     |    323    |         40         | 33 |    23    |    78    |
+-------+-----------+------------+-------------+-----------+--------------------+----+----------+----------+
票数 13
EN

Stack Overflow用户

发布于 2022-06-06 12:30:56

迷你健忘3-MacOSX-arm64 64,和conda install -c conda-forge numpy "libblas=*=*accelerate",它完美地工作在我的Macbook M1 Max上。

  • 加速加速的M1最大值: 1.024
  • 无加速的M1最大值: 2.672
票数 6
EN

Stack Overflow用户

发布于 2022-11-13 09:57:26

谢谢你的小费。在我的新的MAC M1 MAX中,我遵循了以下命令:

  1. 我安装了Minoforge3 (bash Miniforge3-MacOSX-arm64.sh)
  2. 用Python3.10初始化conda环境(conda init)
  3. 安装的numpy as:conda install numpy "libblas=*=*accelerate"

然后是链接中建议的基准:

  1. 上面提到的脚本mysvd.py运行在mean of 10 runs: 1.08088s
  2. 来自dario.py的脚本https://gist.githubusercontent.com/daradecic/a2ac0a75d7e5f22c9aa07174dcbbe061/raw/a56ee217e6d3f949b1d1f719a7a134cef130cd9f/macs.py给出:
代码语言:javascript
复制
Dotted two 4096x4096 matrices in 0.28 s.
Dotted two vectors of length 524288 in 0.11 ms.
SVD of a 2048x1024 matrix in 0.44 s.
Cholesky decomposition of a 2048x2048 matrix in 0.07 s.
Eigendecomposition of a 2048x2048 matrix in 3.83 s.

TOTAL TIME = 19 seconds
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70240506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档