AMD最近几年似乎是太Yes了,2016年到现在,股价从2块钱涨到40块钱,在很多地区的DIY市场份额超过英特尔,苏妈NB啊!
但在科学计算领域,CPU没有相关的配套软件支持是不行的。想自己组装个深度学习主机到底能不能上AMD?
该文章用numpy库对openblas和mkl简单测试,来回答这个问题。
目录
0. 基本概念
0.1 做深度学习还要看CPU吗?
0.2 什么是mkl与openblas?
0.3 AMD处理器用于深度学习为什么要注意这个问题?结论与openblas安装方法
2. 测试平台和方法
3. 英特尔平台测试结果
4. AMD平台测试结果
5. 小结
6. GPU测试结果
0. 基本概念
0.1 做深度学习还要看CPU吗?
要看,很多操作比如数据预处理一般是在CPU上完成的。
0.2 什么是mkl与openblas?
BLAS(Basic Linear Algebra Subprograms)即基础线性代数子程序库,可以理解为用于线性代数运算库的API。openblas和mkl是基于BLAS库的两个不同的线性运算库,python著名的numpy库底层就调用了mkl或者openblas.
0.3 AMD处理器用于深度学习为什么要注意这个问题?
因为conda装numpy和依赖numpy的库比如pytorch、tensorflow时会自动安装mkl库,而英特尔开发的mkl库对AMD处理器负优化啊!!
1.1 结论
写给太长不看党的。不过后面的测试确实可看可不看。AMD+openblas可以匹敌Intel+mkl,AMD处理器用于深度学习至少在mkl库这里不是问题。
英特尔处理器无脑选择mkl,AMD处理器必须卸掉mkl安装openblas!
我的测试结果显示,AMD 处理器下openblas的速度是mkl的两倍,AMD使用openblas和英特尔使用mkl速度相当,但我在英特尔平台+openblas的resize操作速度惨不忍睹,不清楚是什么问题。
虽然可以用,但(1)小白还是不要折腾了,选英特尔吧,用conda多舒服啊。(2)搞个人GPU工作站的话,自己愿意折腾选AMD没问题,多用户使用还是选英特尔,因为你自己编译玩的不亦乐乎,人家可不,况且还不给人家root权限......
1.2 openblas安装方法
我在Linux下使用系统python环境安装numpy直接就是基于openblas的。
Pytorch使用也没问题。
>>> import numpy as np
>>> np.__config__.show()
blas_mkl_info:
NOT AVAILABLE
blis_info:
NOT AVAILABLE
openblas_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
language = c
define_macros = [('HAVE_CBLAS', None)]
使用conda的安装方法推荐这一篇文章:xiedidan:AMD平台上配置PyTorch+Apex开发环境zhuanlan.zhihu.com
查看numpy blas依赖:
import numpy as np
np.__config__.show()
>>>
blas_mkl_info:
NOT AVAILABLE
blis_info:
NOT AVAILABLE
openblas_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/home/*/anaconda3/lib']
language = c
define_macros = [('HAVE_CBLAS', None)]
......
2.测试平台和方法
2.1 测试平台
英特尔: 志强 E5-2697 v3 @ 2.60GHz 14核
AMD : 锐龙 1500x @ 3.50Ghz 4核
再用GPU做个对比,GPU型号:
TITAN X (Pascal) x1
2.2 测试方法矩阵相乘 分别测试两个(50,50,50), (100,100,100),(150,150,150)尺寸的矩阵相乘
import numpy as np
from time import time
# 矩阵尺寸
d = 100
# 测试次数
times = 5
a = np.random.rand(d,d,d)
b = np.random.rand(d,d,d)
start = time()
for i in range (times):
c = np.dot(a,b)
end = time()
print('running time is :%f'%(end/times-start/times))
2. resize操作 分别将10000000维向量和80000000维向量resize到(100,200,500)和(200,400,1000)100次的时间。
对比操作GPU采用pytorch,做相同的运算。
import numpy as np
from time import time
times = 10
a = np.random.rand(10000000)
start = time()
for t in range(times):
for i in range(100):
b = np.resize(a,(100,200,500))
end = time()
print('running time is :%f'%(end/times-start/times))
3. 英特尔平台测试结果
3.1矩阵乘法
openblas
mkl
这里可以看到,openblas比mkl还快了很多。
3.2 Resize
openblas
mkl
这个结果很意外,openblas居然比mkl慢了这么多,不知道什么原因。
4. AMD平台测试结果
4.1矩阵乘法
openblas
mkl
4.2 Resize
openblas
mkl
5. 小结
上面两个测试结果可以看出:AMD平台下矩阵乘法和resize两个操作,openblas的速度均为mkl的两倍左右!!
单独对比(150,150,150)矩阵相乘速度:
3. 单独对比80000000维向量resize的速度:
可以看到E5+mkl的矩阵相乘速度比1500x+openblas慢(92.9s vs 75.7s),但resize的速度大幅超过1500x+openblas(2.6s vs 9.8s),多核心的优势显示出来了!! 由于两个平台不同,不能说mkl比openblas强。如果谁手上有i7-6700, i5-7600K,i5-8400这几款CPU可以测一下,这几款CPU的性能、核心数都和1500x相当。
6. GPU测试结果
这里并没有计算数据从内存加载到GPU上的时间(实际要花费不少时间)。但做深度学习你总得把数据放到GPU上,早放晚放都是放。
给跪了。以后能用GPU就用GPU吧……