具有 mkl-dnn 后端性能的 pytorch 在具有多线程的小型 conv 上

Posted

技术标签:

【中文标题】具有 mkl-dnn 后端性能的 pytorch 在具有多线程的小型 conv 上【英文标题】:pytorch with mkl-dnn backend performance on small conv with multi thread 【发布时间】:2020-05-11 04:30:00 【问题描述】:

我正在尝试带有 mkl-dnn 后端的 pytorch 模型。但是我遇到了一个问题,即多线程性能比预期的要慢,在小型 conv 上运行。请看这张表。 mkl-dnn performace table

运行 big conv,8 线程的性能明显比单线程快。但是运行小conv,8线程和单线程速度没有太大区别。

所以我的问题是: 1. 为什么 8 线程并没有明显比 1 线程小 conv 快? 2. 如何提高small conv 8线程的性能?

我的代码在这里

import time
import torch
import torch.nn as nn
from torch.nn.utils import weight_norm

class MyConv(nn.Module):
    def __init__(self, *args, **kwargs):
        super().__init__()
        self.cell = nn.Conv1d(*args, **kwargs)
        self.cell.weight.data.normal_(0.0, 0.02)

    def forward(self, x):
        return self.cell(x)


def main():
    #print(*torch.__config__.show().split("\n"), sep="\n")
    torch.set_num_threads(1)
    dim = 32
    kernels = 3
    seq = 100000
    MyCell = MyConv(dim, dim, kernel_size=kernels, stride=1)
    MyCell.eval()
    inputs = []
    iter = 1000
    for i in range(iter):
        inputs.append(torch.rand(1, dim, seq))

    start = time.time() * 1000
    for i in range(iter):
        print(i)
        y = MyCell(inputs[i])
        #print(y)
    end = time.time() * 1000
    print('cost %d ms per iter\n' % ((end - start) / iter))


if __name__ == "__main__":
    main()

Mkldnn 详细信息(使用“export MKLDNN_VERBOSE=1”运行)

mkldnn_verbose,exec,reorder,jit:uni,undef,in:f32_nchw out:f32_nChw8c,num:1,1x32x1x107718,2.18091
mkldnn_verbose,exec,reorder,jit:uni,undef,in:f32_oihw out:f32_OIhw8i8o,num:1,32x32x1x1,0.00195312
mkldnn_verbose,exec,convolution,jit_1x1:avx2,forward_training,fsrc:nChw8c fwei:OIhw8i8o fbia:x fdst:nChw8c,alg:convolution_direct,mb1_ic32oc32_ih1oh1kh1sh1dh0ph0_iw107718ow107718kw1sw1dw0pw0,3.87793
mkldnn_verbose,exec,reorder,jit:uni,undef,in:f32_nChw8c out:f32_nchw,num:1,1x32x1x107718,4.69116

非常感谢!

【问题讨论】:

【参考方案1】:

    更多线程并不意味着更高的速度。如果你有 4 个核心,你的速度不能超过 1 个核心的 4 倍。

    你应该做的是调整你的代码以在单线程执行中获得最大性能(关闭编译器优化),完成之后,打开编译器的优化器并使代码成为多线程,没有更多线程比你有核心。

来源:Multithreading - How to use CPU as much as possible?

【讨论】:

以上是关于具有 mkl-dnn 后端性能的 pytorch 在具有多线程的小型 conv 上的主要内容,如果未能解决你的问题,请参考以下文章

在Ubuntu中构建的Tensorflow MKL-DNN会默默地产生错误结果

深度学习系列50:苹果m1芯片加速pytorch

深度学习系列50:苹果m1芯片加速pytorch

深度学习系列50:苹果m1芯片加速pytorch

PyTorch - RuntimeError:后端 CPU 的预期对象,但为参数 #2 'weight' 获得了后端 CUDA

在 Pytorch 中实现有状态 LSTM/ConvLSTM 的最佳方式是啥?