探讨神经网络的节能数据流调度问题。
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]
- --启用保存写回 :允许将中间数据写回删除到 如果可以存储整个 在片上缓冲器中设置数据。
- --层间划分 跨多个层划分资源并同时处理它们。
- --层管道时间开销 , --层管道最大度 : 通过指定 最大执行时间开销,或最大管道化程度。
- --禁用层间选项 :禁用优化,仅允许基本 层间流水线。
代码结构
- nn_数据流
- 核心
- 顶层数据流探索: nn_dataflow , nn_dataflow方案
- 层调度: 调度
- 阵列映射: 映射策略
- 循环阻塞和重新排序: 循环阻塞 , 循环阻塞方案
- 层内分区: 分区 , 分区方案 , buf_shr_方案
- 层间流水线: 层间流水线 , 管道段
- 网络和层: 网络 , 层
验证和测试
要根据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月。 |
[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月。 |
[chen16] | ( 1 , 2 , 3 ) chen、emer和sze, eyeriss:一种用于 isca中卷积神经网络的节能数据流 。2016年6月。 |
[yang16] | 杨、浦、里斯特、巴格迪卡尔、理查森、科瓦廷斯基, Ragan Kelley、Pedram和Horowitz,一种系统的阻塞方法 卷积神经网络 预印本,2016年。 |