深入解析liuliu/ccv项目中的NNC神经网络框架
什么是NNC?
NNC(Neural Network Collection)是liuliu/ccv项目中新一代的神经网络框架,它是对旧版ccv_convnet
的重大升级。ccv_convnet
的单路径神经网络层设计已经无法满足现代复杂网络架构的需求,而NNC通过分层设计实现了更高的效率和表达能力。
NNC的设计借鉴了现代神经网络框架的优秀思想,在底层硬件抽象和上层神经网络模块之间建立了清晰的层次结构。这种设计既保证了计算效率,又提供了丰富的表达能力。
NNC的五层架构设计
1. 张量、命令和流
张量是多维数组的基本数据结构,是神经网络计算的基本单元。
命令代表具体的计算操作(在其他框架中常称为"op"),每个命令可以接受多个输入张量并产生多个输出张量。命令通过其cmd
标识符来区分,并有一组属性定义其行为特征(如是否可以原地操作)。
流是同步机制,同一流上的命令实例按顺序执行,不同流上的命令实例可以并行执行(如果底层硬件支持)。这种设计充分利用了现代计算设备的并行能力。
命令可以有多个后端实现,不同的后端可以针对特定输入情况(如特定张量布局、尺寸或精度)进行优化。运行时系统会根据输入类型和执行时间自动选择最优后端。
2. 计算图
计算图描述了计算的具体执行流程,它明确表达了命令实例之间的数据依赖关系和执行顺序。计算图会根据这些依赖关系将命令调度到合适的流上执行,确保计算顺序正确。
计算图支持子图结构,目前实现了两种特殊子图:
while
类型子图:用于循环结构case..of
类型子图:用于分支结构
计算图可以进行自动调优,寻找最优的后端实现组合以最小化总执行时间。未来还可能支持更激进的优化,如通过张量转换来权衡转换开销与计算加速。
3. 符号图
符号图表达命令、相关张量及其执行顺序,但与计算图有几个关键区别:
- 没有流的概念,因为符号图不执行实际计算
- 不进行张量内存分配,只使用张量元数据
- 不保证与计算图的命令实例有1:1对应关系
符号图遵循严格的**静态单赋值(SSA)**规则,每个张量符号只能作为命令输出一次。这种设计消除了潜在的数据竞争,简化了优化过程和内存分配算法。
符号图支持多种优化过程,包括自动微分、公共子表达式消除(CSE)和算子融合等。当需要实际计算时,符号图可以编译为计算图,编译过程会进行额外的优化。
4. 动态图
动态图直接操作具体的张量实例,它接收输入张量,执行命令并产生输出。从功能上看类似于计算图,但概念上有重要区别:
- 计算图根据规范执行计算
- 动态图通过实际执行形成规范
动态图在执行过程中会构建符号图,这使得它可以进行各种符号图优化和分析(如自动微分)。动态图还实现了简单的记忆机制,通过哈希值缓存计算结果避免重复计算。
5. 常用神经网络原语
NNC提供了一组高级神经网络原语API,风格类似于Sonnet或Keras。这些原语在C语言层实现,可以在各种宿主语言中通过简单的封装层调用。
这些原语与动态图紧密配合,大大简化了模型构建和训练过程。原语内部管理各种状态(如可训练参数和运行平均值),减少了用户需要手动跟踪的变量数量。
NNC的高级特性
无缝矩阵转换
NNC实现了ccv_dense_matrix_t
和ccv_nnc_tensor_t
之间的无缝转换,使得神经网络计算可以与ccv的其他图像处理原语无缝集成。
自动微分
NNC实现了反向模式自动微分,得益于符号图的SSA规则,实现相对简单。每个命令需要实现前向函数和对应的反向函数,自动微分过程会为每个前向命令创建对应的反向命令。
特殊子图处理
while
和case..of
子图在符号图和计算图中都有特殊处理:
while
子图处理循环结构,支持跨迭代的张量传递case..of
子图处理分支结构,支持条件执行和默认值处理
这两种子图在进行自动微分时都需要提供ccv_nnc_tensor_tape_t
来记录输出。
限制与约束
NNC有一些设计上的限制:
- 张量最多支持8个维度
- 每个维度大小不超过INT_MAX
- 输入输出张量数量理论上限为INT_MAX,但自动微分时建议不超过64
- 计算依赖关系不超过2^16个
- 子图嵌套深度不超过2^(31-4)
- 每台机器最多支持4095个GPU设备或NUMA节点
这些限制在大多数应用场景下已经足够,但需要在大规模模型或特殊应用中注意。
总结
NNC通过清晰的分层设计,在保持高效计算的同时提供了丰富的表达能力。从底层的张量操作到高层的神经网络模块,每一层都经过精心设计,使得开发者可以根据需求在合适的抽象层次上工作。特别是动态图与高级原语的结合,大大简化了神经网络模型的开发和训练过程。
NNC的这些特性使其成为ccv项目中强大的神经网络计算引擎,既适合研究原型开发,也能满足生产环境对效率的要求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考