amd python mkl_AMD用于深度学习到底Yes吗? 基于mkl和openblas的numpy运算速度小测与安装教程...

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.com854e0df9b9497ef24885e0d8b95fb52a.png

查看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吧……

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值