探讨神经网络的节能数据流调度问题。

nn-dataflow的Python项目详细描述


神经网络数据流调度

这个python工具允许您探索节能的数据流调度 用于神经网络(NNS),包括阵列映射、环路阻塞和 重新排序,以及(粗粒度)在层内和层间并行处理。

对于硬件,我们假设一个eyeriss风格的nn加速器,即2d 处理元素数组(PE),每个PE中有一个本地寄存器文件,以及 所有PES共享的全局SRAM缓冲区。我们进一步支持平铺架构 多个节点可以在 平行的。每个节点都是如上所述的eyeriss样式的引擎。

在软件中,我们将数据流调度分解为三个子问题:

  • 数组映射,处理映射一个二维卷积计算(一个 2d ifmap与一个2d滤波器卷积以获得一个2d ofmap)到硬件上 PE阵列。我们支持行固定映射 [chen16]
  • 循环阻塞和重新排序,它决定所有2d之间的顺序 通过阻塞和重新排序嵌套循环进行卷积。我们支持 对所有阻塞和重新排序方案进行彻底搜索 分析旁路求解器
  • 并行处理,将神经网络计算划分为多个 平铺的引擎。我们支持层内和层间并行。为了 在层内,我们支持批处理分区、fmap分区、输出 分区、输入分区以及它们之间的组合(混合) [gao17] 。我们还探索了各种数据流优化,包括访问 转发和缓冲区共享我们在每个 层。对于层间,我们支持空间流水线(层间 流水线)和时间流水线(不写回的时间多路复用 中间数据)以及它们的优化调度。我们使用 逐层贪婪波束搜索。

请参阅我们的asplos'17 [gao17] 和asplos'19 [gao19] 文件中的详细信息。

如果您在工作中使用此工具,我们恳请您参考 下面的论文,并向我们发送您的作品的引文。

  • Gao等人,"俄罗斯方块:可扩展和有效的神经网络加速 "3D内存",在ASPLOS,2017年4月。
  • Gao等人,《七巧板:可伸缩神经网络的优化粗粒度数据流》 加速器",在Asplos。2019年4月。

安装

nn_dataflow 需要Python2.7,还不兼容Python3。

nn_dataflow 如果您有 定义环境变量 pythonpath 以包含顶级目录路径。 参见用法se详情请参见下文。

nn_dataflow 已注册到 pypi ,因此可以通过 为:

> pip install nn-dataflow

而且 pip 将处理所有依赖项。

仅在本地用户安装目录中安装nn_dataflow sudo ),和/或以可编辑模式安装,在顶部目录do:

> pip install --user -e .

用法

首先,在 nn_dataflow/nns 中定义nn结构。我们已经定义了 一些流行的nns,包括alexnet,vgg-16,googlenet,resnet-152, 等

然后,使用 nn_dataflow/tools/nn_dataflow_search.py 搜索最佳 nn的数据流。有关详细选项,请键入:

> python ./nn_dataflow/tools/nn_dataflow_search.py -h

可以指定nn批处理大小和字大小、pe数组大小、 平铺节点、注册文件和全局缓冲区容量,以及 所有组件。注意,阵列总线的能源成本应该是 将数据从缓冲区传输到一个pe的能量, 不是 本地邻居 传递;单位静态能量成本应为 全部的静态能量 一个时钟周期内的节点。

其他选项包括:

  • -g --目标 e d ,或 ed 。优化目标,e(能量) d(elay)或ed产品。
  • --内存类型: 2d 3d 。对于二维内存,内存通道仅打开 芯片的四个角;有了3D存储器,存储通道就在上面 所有平铺节点(每个节点一个)。
  • --总线宽度 :pe数组中一个数据的多播总线位宽度 类型。设置为0可忽略多播开销。
  • --dram bw 浮点值 inf 。所有磁贴节点的总DRAM带宽, 每周期字节数。
  • --禁用旁路:组合 i o f ,是否 不允许ifmaps、ofmaps和weights使用全局缓冲区旁路。
  • --解决循环阻塞问题 阻塞和重新排序。请参见 [gao17]
  • --混合分区 :是否在 [gao17] 中使用混合分区。 如果未启用,则使用原始分区,即用于conv的fmap分区 层和FC层的输出分区。
  • --批分区 --ifmap分区 :是否混合 分区还探索批处理和输入分区。
  • --启用访问转发 :访问转发,其中节点获取 分离数据子集并将其转发给其他节点。请参见 [gao19]
  • --启用gbuf共享 :缓冲区共享,其中全局缓冲区容量为 通过noc跨节点共享。请参见 [gao19]
  • --启用保存写回 :允许将中间数据写回删除到 如果可以存储整个 在片上缓冲器中设置数据。
  • --层间划分 跨多个层划分资源并同时处理它们。
  • --层管道时间开销 --层管道最大度 : 通过指定 最大执行时间开销,或最大管道化程度。
  • --禁用层间选项 :禁用优化,仅允许基本 层间流水线。

代码结构

    < DL>
    nn_数据流
    > UL> < DL>
    核心
    > UL>
  • 顶层数据流探索: nn_dataflow nn_dataflow方案
  • 层调度: 调度
  • 阵列映射: 映射策略
  • 循环阻塞和重新排序: 循环阻塞 , 循环阻塞方案
  • 层内分区: 分区 分区方案 buf_shr_方案
  • 层间流水线: 层间流水线 管道段
  • 网络和层: 网络
  • nns :示例nn定义。
  • 测试 :单元测试。
  • 工具 :可执行文件。
  • 验证和测试

    要根据eyeriss结果验证工具,请参见 nn_dataflow/tests/dataflow_test/test_nn_dataflow.py

    要运行(单元)测试,请执行以下操作之一:

    > python -m unittest discover
    
    > python -m pytest
    
    > pytest
    

    使用pytest cov插件检查代码覆盖率:

    > pytest --cov=nn_dataflow
    

    版权和许可证

    nn_dataflow 是免费软件;您可以重新分发和/或修改它 根据由open发布的bsd许可的条款 来源倡议,修订版。

    nn_dataflow 最初由斯坦福大学的高明宇撰写, 根据斯坦福大学的政策,原始代码的版权仍然有效 与利兰斯坦福初级大学董事会合作。

    参考文献

    < COL/> < COL/> <正文> < > <表>
    [gao19] <>1><1><1><1><1><1><1><1><1><1><1><1><1><1> <1> 2>/a>、 3> 3> 2/a>、 七巧板:优化 asplos中可伸缩nn加速器的粗粒度数据流 。2019年4月。
    < COL/> < COL/> <正文> < > <表>
    [gao17] <1 1 1 2 a 2 2 3 3 5 a id4;rel="nofollow 4" rel="nofollow4" rel="nofollow">1>1>1 Horowitz和Kozyrakis, 俄罗斯方块:可缩放和 在asplos中,使用3d存储器有效地加速神经网络。2017年4月。
    < COL/> < COL/> <正文> < > <表>
    [chen16] 1 2 3 chen、emer和sze, eyeriss:一种用于 isca中卷积神经网络的节能数据流 。2016年6月。
    < COL/> < COL/> <正文> < > <表>
    [yang16] 杨、浦、里斯特、巴格迪卡尔、理查森、科瓦廷斯基, Ragan Kelley、Pedram和Horowitz,一种系统的阻塞方法 卷积神经网络 预印本,2016年。

    欢迎加入QQ群-->: 979659372 Python中文网_新手群

    推荐PyPI第三方库


    热门话题
    java GridBagLayout不填充区域   java Memozied Fibonacci未运行与常规Fibonacci解决方案   Java Web启动未启动问题   Java中异常和if-then的区别   java从命令提示符运行批处理文件获取错误   socket在Java中验证SSL证书的公共名称   如何在JAVA中检查字符串数组中的相等字   用java语言将音频文件转换成文本文件的语音识别   java为什么foo(1,2,3)没有传递给varargs方法foo(对象…)作为整数[]   java通过蓝牙将奇怪的数据从Arduino传输到Android   java ContainerRequestFilter获取空entitystream   java如何从安卓 studio中删除不兼容类型错误   基本Java错误   在Spring引导中使用REST API时发生java错误   javascript通过从SQL查询派生的URL打开页面