我有一个外部包我想从tar文件安装到我的python virtualenv中.安装包的最佳方法是什么?
我发现了两种方法可以做到:
python setup.py install在解压缩的目录中运行.pip install packagename.tar.gz来自https://pip.pypa.io/en/stable/reference/pip_install/#examples中的示例#7如果用这两种方式做它们有什么不同.
TL; DR如何在没有重建的情况下将ATLAS/MKL链接到现有的Numpy.
我用Numpy用大矩阵计算,我发现它非常慢,因为Numpy只使用1个核心进行计算.经过大量的搜索,我发现我的Numpy没有链接到像ATLAS/MKL这样的优化库.这是我的numpy配置:
>>>import numpy as np
>>>np.__config__.show()
blas_info:
libraries = ['blas']
library_dirs = ['/usr/lib']
language = f77
lapack_info:
libraries = ['lapack']
library_dirs = ['/usr/lib']
language = f77
atlas_threads_info:
NOT AVAILABLE
blas_opt_info:
libraries = ['blas']
library_dirs = ['/usr/lib']
language = f77
define_macros = [('NO_ATLAS_INFO', 1)]
atlas_blas_threads_info:
NOT AVAILABLE
openblas_info:
NOT AVAILABLE
lapack_opt_info:
libraries = ['lapack', 'blas']
library_dirs = ['/usr/lib']
language = f77
define_macros = [('NO_ATLAS_INFO', 1)]
atlas_info:
NOT AVAILABLE
lapack_mkl_info:
NOT AVAILABLE
blas_mkl_info:
NOT AVAILABLE
atlas_blas_info:
NOT AVAILABLE
mkl_info: …Run Code Online (Sandbox Code Playgroud) 当遇到numpy运行多处理时,我遇到了一个问题,即Python意外退出.我已经解决了这个问题,所以我现在可以确认在运行下面描述的代码时多处理工作是完美的:
import numpy as np
from multiprocessing import Pool, Process
import time
import cPickle as p
def test(args):
x,i = args
if i == 2:
time.sleep(4)
arr = np.dot(x.T,x)
print i
if __name__ == '__main__':
x = np.random.random(size=((2000,500)))
evaluations = [(x,i) for i in range(5)]
p = Pool()
p.map_async(test,evaluations)
p.close()
p.join()
Run Code Online (Sandbox Code Playgroud)
当我尝试评估下面的代码时会出现问题.这使Python意外退出:
import numpy as np
from multiprocessing import Pool, Process
import time
import cPickle as p
def test(args):
x,i = args
if i == 2:
time.sleep(4)
arr = np.dot(x.T,x) …Run Code Online (Sandbox Code Playgroud) 在我的Kubuntu(x86)升级到14.04之后,我在nthony中没有使用python 2.7:
Python 2.7.6 (default, Mar 22 2014, 22:59:38)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/prylipko/.local/lib/python2.7/site-packages/numpy/__init__.py", line 137, in <module>
import add_newdocs
File "/home/prylipko/.local/lib/python2.7/site-packages/numpy/add_newdocs.py", line 9, in <module>
from numpy.lib import add_newdoc
File "/home/prylipko/.local/lib/python2.7/site-packages/numpy/lib/__init__.py", line 13, in <module>
from polynomial import *
File "/home/prylipko/.local/lib/python2.7/site-packages/numpy/lib/polynomial.py", line 17, in <module>
from numpy.linalg import eigvals, lstsq
File "/home/prylipko/.local/lib/python2.7/site-packages/numpy/linalg/__init__.py", line 48, in …Run Code Online (Sandbox Code Playgroud) 在花了大量时间从源代码构建ATLAS之后,我在OpenSUSE 13.1存储库中发现了libopenblas和libatals.我的问题是
是否易于安装(无需在您自己的计算机上进行调整)存储库中的"libatlas"真的能提高计算性能吗?
OpenBLAS比ATLAS更好还是只比Linux中的易安装"libatlas"更好?请参阅更快的R使用OpenBLAS:比ATLAS更好,切换到Ubuntu很简单.
我跟着这篇文章使用OpenBLAS编译Numpy,但找不到"numpy.core._dotblas"模块.更多的我无法同时使用ATLAS和OpenBLAS构建Numpy.
有人可以发布.py文件或bash代码来进行ATLAS和OpenBLAS之间的比较吗?例如.
我使用自己的ATLAS构建了Numpy-1.9,从源代码编译了OpenBLAS,并在OpenSUSE 13.1的存储库中安装了"libopenblaso"(OpenMP版本)和"libopenblasp"(pthreads版本).如何配置链接和库,以便在不重建Numpy-1.9软件包的情况下告诉Numpy-1.9使用OpenBLAS而不是ATLAS.
注意:如果在存储库中安装"libatlas",则ATLAS不会针对您的计算机进行调整,并且计算性能不会太高.因此,我首先构建并调整了ATLAS,然后使用我自己的ATLAS构建了Numpy.之后,我尝试将OpenBLAS链接到Numpy,但失败了.
提前谢谢了!
谢谢@Dmitry的快速回复!但问题没有解决......
$ sudo zypper in libopenblasp0
The following NEW package is going to be installed:
libopenblasp0
1 new package to install.
Overall download size: 3.0 MiB. After the operation, additional 30.3 MiB will be used.
Continue? [y/n/? shows all options] (y):
Retrieving package libopenblasp0-0.2.11-11.1.x86_64 (1/1), 3.0 MiB ( 30.3 MiB unpacked)
Retrieving: libopenblasp0-0.2.11-11.1.x86_64.rpm ...........................[done (2.1 MiB/s)]
(1/1) …Run Code Online (Sandbox Code Playgroud) 我尝试过这两种选择
objective = lambda A, x : (np.dot(x.T ,np.dot(A, x)))[0,0]
objective = lambda A, x : (np.matrix(x).T * np.matrix(A) * np.matrix(x))[0,0]
Run Code Online (Sandbox Code Playgroud)
对于主要的我使用我的算法获得5秒的运行时间使用次要我得到14秒
用MATLAB我得了2秒
我想和Numpy一起去,但显然我需要一种方法来改善这种糟糕的结果.如何获得更快的二次型矩阵,矢量积?
注意:我描述了代码,这个lambda函数饮用了所有的汁液. 改进:我只是删除了scipy和numpy的原生Ubuntu包,然后安装了以下内容
sudo pip install numpy
sudo apt-get install libatlas-base-dev gfortran
sudo pip install scipy
sudo apt-get install libpng-dev libfreetype6-dev
sudo pip install matplotlib
Run Code Online (Sandbox Code Playgroud)
我提高了性能,但仍低于Matlab
我正在使用Python 3.4.3和OpenCV 3.0.0来处理(应用各种过滤器)内存中非常大的图像(80,000 x 60,000),我想使用多个CPU内核来提高性能.经过一些阅读,我得到了两种可能的方法:1)使用python的multiprocessing模块,让每个进程处理一大片大图像并在处理完成后加入结果(这可能应该在POSIX系统上执行?)2)由于NumPy支持OpenMP,而OpenCV使用NumPy,我可以将多处理留给NumPy吗?
所以我的问题是:
哪一个会是更好的解决方案?(如果它们看起来不合理,那么可能的方法是什么?)
如果选项2是好的,我应该用OpenMP构建NumPy和OpenCV吗?我如何实际进行多处理?(我真的找不到有用的指示..)
我需要一些帮助来弄清楚如何在python中自动执行基准测试。
我正在测试通过python中的numpy调用BLAS库对线程的影响。在linux环境中,OpenBLAS中的线程是通过环境变量控制的OMP_NUM_THREADS。我想做一个测试,使我OMP_NUM_THREADS从1 递增到最大值,在每个线程计数时给例程计时,然后最后对所有线程计数操纵合计计时。
问题如下。可以在python中设置环境变量,但是它们仅影响子进程或子shell。因此,我可以使用以下驱动程序代码正确运行基准测试:
#!/usr/bin/env python # driver script for thread test
import os
thread_set =[1,2,4,8,16]
for thread in thread_set:
os.environ['OMP_NUM_THREADS']='{:d}'.format(thread)
os.system("echo $OMP_NUM_THREADS")
os.system("numpy_test")
Run Code Online (Sandbox Code Playgroud)
和numpy_test脚本:
#!/usr/bin/env python
#timing test for numpy dot product (using OpenBLAS)
#based on http://stackoverflow.com/questions/11443302/compiling-numpy-with-openblas-integration
import sys
import timeit
setup = "import numpy; x = numpy.random.random((1000,1000))"
count = 5
t = timeit.Timer("numpy.dot(x, x.T)", setup=setup)
dot_time = t.timeit(count)/count
print("dot: {:7.3g} sec".format(dot_time))
Run Code Online (Sandbox Code Playgroud)
但是分析这是一个非常手动的过程。
特别是,我无法dot_time从numpy_test外部包装例程返回值,因此无法以任何自动化方式分析测试结果。例如,我想绘制dot_time线程数与线程数的关系图,或评估dot_time/ numbers是否是常数。
如果我尝试通过定义python测试函数(避免使用上述os.system() …
我正在对两个矩阵进行 numpy 点积(假设 a 和 b 是两个矩阵)。
当 a 的形状为 (10000, 10000) 且 b 的形状为 (1, 10000) 时,numpy.dot(a, bT) 正在使用所有 CPU 核心。
但是,当 a 的形状为 (10000, 10000) 且 b 的形状为 (2, 10000) 时,numpy.dot(a, bT) 不会使用所有 CPU 核心(仅使用一个)。
当 b 的行大小从 2 到 15(即从 (2, 10000) 到 (15, 10000))时,就会发生这种情况。
例子:
import numpy as np
a = np.random.rand(10**4, 10**4)
def dot(a, b_row_size):
b = np.random.rand(b_row_size, 10**4)
for i in range(10):
# dot operation
x = np.dot(a, b.T)
# Using all CPU cores …Run Code Online (Sandbox Code Playgroud) 问题:将 numpy 链接到更正的线性代数库。过程太复杂了,我可能会第 6 次寻找解决方案,但我不知道出了什么问题。我在 Ubuntu 12.04.5 上。我重新安装了 blas 和 lapack,然后使用 pip 重新安装了 numpy。我在系统环境中这样做,然后也在 virtualenv 环境中尝试。所有的事情似乎都没有奏效。
这是我的numpy.__config__.show():
lapack_info:
NOT AVAILABLE
lapack_opt_info:
NOT AVAILABLE
openblas_lapack_info:
NOT AVAILABLE
blas_info:
NOT AVAILABLE
atlas_3_10_blas_threads_info:
NOT AVAILABLE
atlas_threads_info:
NOT AVAILABLE
blas_src_info:
NOT AVAILABLE
atlas_3_10_threads_info:
NOT AVAILABLE
atlas_blas_info:
NOT AVAILABLE
atlas_3_10_blas_info:
NOT AVAILABLE
lapack_src_info:
NOT AVAILABLE
atlas_blas_threads_info:
NOT AVAILABLE
openblas_info:
NOT AVAILABLE
blas_mkl_info:
NOT AVAILABLE
blas_opt_info:
NOT AVAILABLE
atlas_info:
NOT AVAILABLE
atlas_3_10_info:
NOT AVAILABLE
lapack_mkl_info:
NOT AVAILABLE
mkl_info:
NOT AVAILABLE
Run Code Online (Sandbox Code Playgroud)
这是一个非常常见的错误,根据用户的环境和历史有很多解决方案。我最近按照此处的说明完成了安装 BLAS 和 LAPACK …
我正在尝试安装numpy==1.10.2,scipy并matplotlib在服务器上基于opensuse.我已经从源头安装numpy了virtualenv(我也尝试过pip - 当然也是同样的结果).现在,当我尝试numpy在python控制台中导入时,我收到以下错误:
ImportError: /home/user/.virtualenvs/project/lib/python2.7/site-packages/numpy/core/multiarray.so: undefined symbol: cblas_sgemm
Run Code Online (Sandbox Code Playgroud)
注意:我不是这台服务器的超级用户.
编辑:
ldd /home/user/.virtualenvs/project/lib/python2.7/site-packages/numpy/core/multiarray.so`
linux-vdso.so.1 (0x00007fffa0d69000)
libtatlas.so.3 => /home/user/.local/usr/lib64/atlas/libtatlas.so.3 (0x00007fe366d66000)
libm.so.6 => /lib64/libm.so.6 (0x00007fe366a50000)
libpython2.7.so.1.0 => /usr/lib64/libpython2.7.so.1.0 (0x00007fe3666b2000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe366496000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe3660f0000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe367a15000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fe365eec000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007fe365ce9000)
Run Code Online (Sandbox Code Playgroud)
libtatlas.so.3 => /home/user/.local/usr/lib64/atlas/libtatlas.so.3 - 我因为libatlas的其他问题而将此链接起来:
ImportError: /usr/lib64/atlas/libtatlas.so.3: undefined symbol: clapack_ilaenv
SOLLUTION
问题出在ATLAS lib上.根据@ali_m建议我numpy从源代码安装OpenBLAS而不是ATLAS.这里链接到如何使用BLAS安装numpy的说明.
python ×10
numpy ×9
blas ×4
atlas ×2
openblas ×2
opensuse ×2
ubuntu ×2
arrays ×1
lapack ×1
macos ×1
matlab ×1
opencv ×1
openmp ×1
performance ×1
pip ×1
python-2.7 ×1
python-3.3 ×1
python-3.5 ×1
setup.py ×1
virtualenv ×1