首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
OPPO Watch
Hzzone
V2EX  ›  Python

为什么同样的矩阵乘法, Pytorch 和 Cupy 要比 Numpy 慢?

  •  
  •   Hzzone · 2018-11-30 20:44:25 +08:00 · 3805 次点击
    这是一个创建于 541 天前的主题,其中的信息可能已经有所发展或是发生改变。
    import cupy as cp
    import numpy as np
    
    x_cpu = np.random.randn(100, 100).astype(np.float32)
    x_gpu = cp.asarray(x_cpu)
    
    %%timeit
    x_cpu*x_cpu
    
    2.41 µs ± 19.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    %%timeit
    x_gpu*x_gpu
    
    14.3 µs ± 53.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    import torch
    
    x_tensor = torch.from_numpy(x_cpu)
    
    %%timeit
    x_tensor*x_tensor
    
    3.01 µs ± 33.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    x_gpu_tensor = x_tensor.cuda()
    
    %%timeit
    x_gpu_tensor*x_gpu_tensor
    
    7.85 µs ± 13.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    11 条回复    2018-12-01 12:44:39 +08:00
    leido
        1
    leido   2018-11-30 21:13:15 +08:00 via Android
    用 Python 你还在乎效率?
    Hzzone
        2
    Hzzone   2018-11-30 21:14:02 +08:00
    @leido GPU 加速
    justou
        3
    justou   2018-11-30 21:19:05 +08:00 via Android
    数据量太小,让 gpu 工作的一系列中间步骤所花费的时间占主要了,换大点的矩阵试试,比如 100000*100000
    justou
        4
    justou   2018-11-30 21:22:29 +08:00 via Android
    gpu 适合一次性处理大量的数据
    wlwood
        5
    wlwood   2018-11-30 21:26:55 +08:00 via Android
    当然,矩阵计算,numpy 可是堪比 matlab 的
    necomancer
        6
    necomancer   2018-11-30 21:41:25 +08:00
    直接用 * 是矩阵乘法吗……别的不知道,numpy 下是批量相乘吧……

    numpy 里 x_cpu.dot(x_cpu) 才是矩阵乘法。
    Nimrod
        7
    Nimrod   2018-11-30 21:56:45 +08:00 via Android
    numpy 的矩阵乘法是 dot 不是*吧。。
    lonccc
        8
    lonccc   2018-12-01 01:04:42 +08:00 via Android
    你这也不是矩阵乘法啊,这是 element wise 的乘法。另外,numpy 的矩阵乘法可以用到 blas 的库,优化的很好了
    takato
        9
    takato   2018-12-01 01:22:01 +08:00
    用 matmul()
    Xs0ul
        10
    Xs0ul   2018-12-01 02:24:14 +08:00
    给个数量级参照:
    def add(a, b):
    return a+b
    def add2(a, b):
    return add(a, b)

    x = 100.0

    %%timeit
    add(x, x)
    180 ns ± 6.67 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

    %%timeit
    add2(x, x)
    281 ns ± 3.59 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

    函数调用的开销都只比你低一个数量级了
    northisland
        11
    northisland   2018-12-01 12:44:39 +08:00
    量太小了,换成 5000 维的方阵,GPU 的并行加速的特性就能体现出来了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2962 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 00:44 · PVG 08:44 · LAX 17:44 · JFK 20:44
    ♥ Do have faith in what you're doing.