Intel Distribution for Python在今年二月進行了更新——英特爾發布了Update 2版本。以「加速」為核心的它,相比原生Python環境有多大提升呢?
雷鋒網獲知,並行計算專家、前英特爾高級工程師James Reinders對老東家的產品進行了測試。他對外宣布:在配備四核i5的iMac上實現了20倍的性能加速,至於他是怎麼做到的,請繼續往下看(含代碼)。
ames Reinders:利用Intel Distribution for Python,我實現了 Python 的20倍加速,並且可用單個命令關閉/啟用。這還不是在最優情況下,而在虛擬環境——在 VirtualBox(下文簡稱VBox)上運行的openSUSE Linux Tumbleweed(即「滾動版本」),使用的機器是四核iMac。
這在Windows, Linux或OS X都能實現。英特爾並沒有把openSUSE加入經他們測試過的Linux配置列表中(SUSE Enterprise在表中),但我在運行中並沒有遇到任何問題。
這就是我怎麼做的:
下載Anaconda命令行安裝程序,地址為https://www.continuum.io/downloads 。
安裝:% bash Anaconda2-4.3.0-Linux-x86_64.sh
安裝英特爾加速器,作為一個單獨的、可開啟關閉的「環境」%conda config --add channels intel % conda create --name intelpy intelpython2_full python=2
運行示例程序,看到在我的openSUSE VBox設置上有15到20倍的速度提升。
% source deactivate intelpy
% python < myprog.py
np.sin
102400 10000 36.1987440586
np.cos
102400 10000 36.1938228607
np.tan
102400 10000 51.487637043
% source activate intelpy
% python < myprog.py
np.sin
102400 10000 1.76131296158
np.cos
102400 10000 1.83870100975
np.tan
102400 10000 3.38778400421
That’s all! The speed-ups are 20.6X, 19.7X, and 15.2X in this quick test running on a virtual machine.
Here’s my little Python program:
% cat myprog.py
import numpy as np
import time
N = 102400
x = np.linspace(0.0123, 4567.89, N)
def mine(x,Z,func,name):
print name;
start = time.time()
for z in range ( 0, Z ) :
y = func(x);
end = time.time()
print N, Z, end - start
return
mine(x,10000,np.sin,'np.sin')
mine(x,10000,np.cos,'np.cos')
mine(x,10000,np.tan,'np.tan')
我花很短時間搞起來這個程序,用來驗證英特爾對加速NumPy中transcendental expression的承諾。Cosine, sine和tangent 是我還能記得的、搞TI calculator時候用的transcendental,所以我用它們來試。我決定對每一個進行十億級測試——運行超過十萬個數字的函數,重複超過一萬次。
雖然未必是一個很有意思的程序,但對於加速而言是個不錯的測試。
隨時加速Python
我此前寫過一篇文章,討論「Python 加速」(「accelerated Python」)使其更適用於大數據和 HPC 應用。 在速度更快之外,我還展示了,使用Conda來開啟/關閉加速是多麼得容易。這非常贊,讓安裝它的決定變得更加安全、沒有顧慮——因為該功能是一個可選項。(對新手的提醒: Anaconda 是針對 Python 算法包的集合,Conda則是package manager,即算法包管理器。我兩個都用並且都很喜歡。)
我使用 「conda create」來創造被我稱之為intelpy的環境。然後,我能夠使用「source activate intelpy」、「source deactivate intelpy」來激活、關閉它。
Intel Distribution for Python 帶來的大幅加速能力,讓 「accelerated Python」 變得更實用更讓人信服。
值得注意的是,「accelerated Python」 只是使用更快的Python算法庫,不需要對代碼做任何改動。當然,我們的Python代碼必須使用了某些加速的東西,才能從中獲益。
英特爾通過三大方面實現Python加速:
利用多核;
利用矢量指令(SIMD),比如 SSE, AVX, AVX2和AVX-512;
使用英特爾 Math Kernel Library (Intel MKL) 的更先進算法。
對於運行於矢量或矩陣上的程序,上述這些都會生效。對於偶爾的單獨cosine,我們不應該期待大幅速度提升。同樣的,對於單核CPU,我們也不應該有性能提升的幻想。當然,英特爾72核協處理器Xeon Phi會在大量多核應用的跑分中領先。在我的例子中,我的虛擬機只利用iMac i5的四個核心。
FFT在4核虛擬機上有八倍性能提升
我也試了下Fast Fourier Transforms (FFT)。使用與原始程序相同的設置,我只是按照如下方式運行FFT程序:
% source deactivate intelpy
% python < myfftprog.py
fft
5000 2.22796392441
fft
7000 8.74916005135
% source activate intelpy
% python < myfftprog.py
fft
5000 0.277629137039
fft
7000 1.11230897903
速度提升為8和7.9倍。當然,還是運行於四核iMac上的openSUSE和VBox。這是我的快速FFT程序:
% cat myfftprog.py
import numpy as np
import numpy.random as rn
import time
def trythis(Z):
mat = rn.rand(Z,Z) + 1j * rn.randn(Z,Z)
print 'fft'
start = time.time()
# 2D transform on a complex-valued matrix:
result = np.fft.fft2(mat)
end = time.time()
print Z, end - start
return
trythis(5000);
trythis(7000);
新 Python 加速
筆者了解到,以下是Intel Distribution for Python全新Update 2版本中,得到了新的速度提升的方面:
優化NumPy的算術和transcendental表達
Transcendental expressions包含我在快速示例程序裡用的cosine, sine和tangen。這些優化的核心是對NumPy的改變,使得 primitives (在 ndarray 數據上進行運算)能選擇性地使用英特爾MKL Short Vector Math Library (SVML) 和MKL Vector Math Library (VML) 的能力。這使得 Python 利用處理器的最新矢量能力,包括多核優化和 AVX/AVX2/AVX-512。英特爾團隊表示,他們利用 Xeon Phi,實現過 NumPy 算術和 transcendental 運算在 vector-vector 和 vector-scalar 上最高400倍的速度提升。
優化NumPy和SciPy的FFT
這些優化的核心是英特爾MKL,一系列 NumPy、SciPy 函數都能用到它對 FFT 的原生優化。這些優化包含真實、複雜的數據類型,單精度和雙精度都包含 (single and double precision),從一維到多維的數據,in place 或者 out of place。英特爾團隊見到過這項更新帶來60倍的性能提升。這使得 Python 的性能可與原生 C/C++ 程序相媲美。
優化內存管理
Python是一門動態語言,為用戶管理內存。Python 應用的性能,在很大程度上取決於內存運行的性能,這包括內存分配、再分配(de-allocation)、複製和移動。英特爾提供的加速版本Python,能在NumPy分配數組時保證最佳的alignment,所以NumPy、SciPy的運算函數,能從相應排列的 SIMD 內存訪問指令獲益。英特爾表示最大的提升來自於對內存複製和移動運算的優化。
更快——能用Conda方便地關閉/啟用
Anaconda英特爾渠道的最新加速版本 Python,為Python程序帶來顯著性能優化,而無需改變代碼。下載、安裝也很方便。
我真的特喜歡用Conda把它開啟/關閉這一功能。這方便了性能對比,並且讓我感到安心——沒有這個功能的話,我會對切換到超快的數學函數感到猶豫。