CuPy:将Numpy提速700倍!

标星★公众号      爱你们

作者: George Seif

编译: 1+1=6

近期原创文章:

♥  5种机器学习算法在预测股价的应用(代码+数据)

♥  Two Sigma用新闻来预测股价走势,带你吊打Kaggle

 2万字干货: 利用深度学习最新前沿预测股价走势

♥  机器学习在量化金融领域的误用!

♥  基于RNN和LSTM的股市预测方法

♥  如何鉴别那些用深度学习预测股价的花哨模型?

♥  优化强化学习Q-learning算法进行股市

♥  WorldQuant 101 Alpha、国泰君安 191 Alpha

♥  基于回声状态网络预测股票价格(附代码)

♥  计量经济学应用投资失败的7个原因

♥  配对交易千千万,强化学习最NB!(文档+代码)

♥  关于高盛在Github开源背后的真相!

♥  新一代量化带货王诞生!Oh My God!

♥  独家!关于定量/交易求职分享(附真实试题)

♥  Quant们的身份危机!

♥  拿起Python,防御特朗普的Twitter

♥  AQR最新研究 | 机器能“学习”金融吗?

Numpy是Python社区的一份礼物。它允许数据科学家、机器学习实践者和统计学家以一种简单有效的方式处理矩阵式的海量数据。

当你发现Python代码运行缓慢时,特别是看到许多 for-loop循环时,那么将数据处理迁移到Numpy并让其向量化以最快的速度完成工作总是一个好主意!

尽管如此,即使这样加速Numpy也只能在CPU上运行。由于使用者的CPU通常有8个或更少的内核,因此可以加速的速度是有限的。

如何解决这个问题,CuPy来啦!

相关文章

1、30倍!使用Cython加速Python代码

2、10个提高工作效率的Pandas小技巧

3、高逼格使用Pandas加速代码,向for循环说拜拜!

什么是CuPy?

CuPy是一个通过利用CUDA GPU库在Nvidia GPU上实现Numpy数组的库 。通过这种实现,由于拥有许多CUDA核心GPU,可以实现更好的并行加速。

官网: https://github.com/cupy/cupy

CuPy的接口是Numpy的镜像,在大多数情况下,它可以被直接替代。 只要用兼容的CuPy代码替换你的Numpy代码,你就可以加快 GPU 的运行速度 。CuPy将支持Numpy的大多数数组操作,包括索引、广播和各种矩阵转换。

你也可以编写自定义Python代码,利用CUDA和GPU加速,如果你有一些特定的东西还不支持的话。 只需要一小段C++格式的代码,CuPy就会自动执行GPU转换,非常类似于使用Cython。

我们可以通过pip安装这个库:

pip install cupy

运行GPU基于CuPy

对于这些基准测试,我们将使用PC机进行以下设置:

  • i7–8700k CPU

  • 1080 Ti GPU

  • 32 GB of DDR4 3000MHz RAM

  • CUDA 9.0

一旦安装了CuPy,我们可以像Numpy一样导入它:

import numpy as np
import cupy as cp
import time

对于剩下的代码,在Numpy和CuPy之间切换就像用CuPy的cp替换Numpy中的np一样简单。下面的代码为Numpy和CuPy创建了一个3D数组,其中包含10亿个1。 为了测试创建数组的速度,使用了 Python的本地time库:

### Numpy and CPU
s = time.time()
x_cpu = np.ones((1000,1000,1000))
e = time.time()
print(e - s)
### CuPy and GPU
s = time.time()
x_gpu = cp.ones((1000,1000,1000))
e = time.time()
print(e - s)

令人难以置信的是,即使只是创建 数组 ,CuPy仍然要快得多。  Numpy在1.68秒内创建了10亿个1的数组,而CuPy只花了0.16秒,这是10.5倍的加速!

让我们尝试对数组进行一些数学运算。这次我们将整个数组乘以5,再次查看Numpy与CuPy的速度。

### Numpy and CPU
s = time.time()
x_cpu *= 5
e = time.time()
print(e - s)
### CuPy and GPU
s = time.time()
x_gpu *= 5
e = time.time()
print(e - s)

在本例中,CuPy完胜Numpy。Numpy花了0.507秒,而CuPy只花了0.000710秒。 714.1倍 的加速!

现在让我们尝试使用多个数组并执行一些操作:

### Numpy and CPU
s = time.time()
x_cpu *= 5
x_cpu *= x_cpu
x_cpu += x_cpu
e = time.time()
print(e - s)
### CuPy and GPU
s = time.time()
x_gpu *= 5
x_gpu *= x_gpu
x_gpu += x_gpu
e = time.time()
print(e - s)

在本例中, Numpy在CPU上以1.49秒 的时间执行该进程,而 CuPy在GPU上以0.0922秒 的时间执行该进程。 16.16倍的加速!

总是那么快吗?

使用CuPy是在GPU上多次加速Numpy和矩阵操作的一个很好的方法。需要注意的是,你将 获得的加速度在很大程度上取决于所使用数组的大小 。下面的表格显示了当我们改变数组的大小时速度上的差异:

一旦:

达到约 1000万个 数据点,加速度就会急剧上升!

而一旦:

超过 1亿个 数据点,加速度就会大大加快!

在此之下:

Numpy实际上更快!

还要记住, 更多的GPU内存将帮助你处理更多的数据,所以重要的是看看你的GPU是否有足够的内存来容纳足够的数据 ,而 CuPy是值得的!

来自: https://twitter.com/GeorgeSeif94

—End—

量化投资与机器学习微信公众号,是业内垂直于 Quant MFE CST、AI 等专业的 流量化自媒体 。公众号拥有来自 公募、私募、券商、银行、海外 等众多圈内 10W+ 关注者。每日发布行业前沿研究成果和最新量化资讯。

你点的每个“在看”,我们都认真当成了喜欢

我来评几句
登录后评论

已发表评论数()

相关站点

热门文章