深入解析liuliu/ccv项目中的NNC神经网络框架

深入解析liuliu/ccv项目中的NNC神经网络框架

ccv C-based/Cached/Core Computer Vision Library, A Modern Computer Vision Library ccv 项目地址: https://gitcode.com/gh_mirrors/cc/ccv

什么是NNC?

NNC(Neural Network Collection)是liuliu/ccv项目中新一代的神经网络框架,它是对旧版ccv_convnet的重大升级。ccv_convnet的单路径神经网络层设计已经无法满足现代复杂网络架构的需求,而NNC通过分层设计实现了更高的效率和表达能力。

NNC的设计借鉴了现代神经网络框架的优秀思想,在底层硬件抽象和上层神经网络模块之间建立了清晰的层次结构。这种设计既保证了计算效率,又提供了丰富的表达能力。

NNC的五层架构设计

1. 张量、命令和流

张量是多维数组的基本数据结构,是神经网络计算的基本单元。

命令代表具体的计算操作(在其他框架中常称为"op"),每个命令可以接受多个输入张量并产生多个输出张量。命令通过其cmd标识符来区分,并有一组属性定义其行为特征(如是否可以原地操作)。

是同步机制,同一流上的命令实例按顺序执行,不同流上的命令实例可以并行执行(如果底层硬件支持)。这种设计充分利用了现代计算设备的并行能力。

命令可以有多个后端实现,不同的后端可以针对特定输入情况(如特定张量布局、尺寸或精度)进行优化。运行时系统会根据输入类型和执行时间自动选择最优后端。

2. 计算图

计算图描述了计算的具体执行流程,它明确表达了命令实例之间的数据依赖关系和执行顺序。计算图会根据这些依赖关系将命令调度到合适的流上执行,确保计算顺序正确。

计算图支持子图结构,目前实现了两种特殊子图:

  • while类型子图:用于循环结构
  • case..of类型子图:用于分支结构

计算图可以进行自动调优,寻找最优的后端实现组合以最小化总执行时间。未来还可能支持更激进的优化,如通过张量转换来权衡转换开销与计算加速。

3. 符号图

符号图表达命令、相关张量及其执行顺序,但与计算图有几个关键区别:

  1. 没有流的概念,因为符号图不执行实际计算
  2. 不进行张量内存分配,只使用张量元数据
  3. 不保证与计算图的命令实例有1:1对应关系

符号图遵循严格的**静态单赋值(SSA)**规则,每个张量符号只能作为命令输出一次。这种设计消除了潜在的数据竞争,简化了优化过程和内存分配算法。

符号图支持多种优化过程,包括自动微分、公共子表达式消除(CSE)和算子融合等。当需要实际计算时,符号图可以编译为计算图,编译过程会进行额外的优化。

4. 动态图

动态图直接操作具体的张量实例,它接收输入张量,执行命令并产生输出。从功能上看类似于计算图,但概念上有重要区别:

  • 计算图根据规范执行计算
  • 动态图通过实际执行形成规范

动态图在执行过程中会构建符号图,这使得它可以进行各种符号图优化和分析(如自动微分)。动态图还实现了简单的记忆机制,通过哈希值缓存计算结果避免重复计算。

5. 常用神经网络原语

NNC提供了一组高级神经网络原语API,风格类似于Sonnet或Keras。这些原语在C语言层实现,可以在各种宿主语言中通过简单的封装层调用。

这些原语与动态图紧密配合,大大简化了模型构建和训练过程。原语内部管理各种状态(如可训练参数和运行平均值),减少了用户需要手动跟踪的变量数量。

NNC的高级特性

无缝矩阵转换

NNC实现了ccv_dense_matrix_tccv_nnc_tensor_t之间的无缝转换,使得神经网络计算可以与ccv的其他图像处理原语无缝集成。

自动微分

NNC实现了反向模式自动微分,得益于符号图的SSA规则,实现相对简单。每个命令需要实现前向函数和对应的反向函数,自动微分过程会为每个前向命令创建对应的反向命令。

特殊子图处理

whilecase..of子图在符号图和计算图中都有特殊处理:

  • while子图处理循环结构,支持跨迭代的张量传递
  • case..of子图处理分支结构,支持条件执行和默认值处理

这两种子图在进行自动微分时都需要提供ccv_nnc_tensor_tape_t来记录输出。

限制与约束

NNC有一些设计上的限制:

  1. 张量最多支持8个维度
  2. 每个维度大小不超过INT_MAX
  3. 输入输出张量数量理论上限为INT_MAX,但自动微分时建议不超过64
  4. 计算依赖关系不超过2^16个
  5. 子图嵌套深度不超过2^(31-4)
  6. 每台机器最多支持4095个GPU设备或NUMA节点

这些限制在大多数应用场景下已经足够,但需要在大规模模型或特殊应用中注意。

总结

NNC通过清晰的分层设计,在保持高效计算的同时提供了丰富的表达能力。从底层的张量操作到高层的神经网络模块,每一层都经过精心设计,使得开发者可以根据需求在合适的抽象层次上工作。特别是动态图与高级原语的结合,大大简化了神经网络模型的开发和训练过程。

NNC的这些特性使其成为ccv项目中强大的神经网络计算引擎,既适合研究原型开发,也能满足生产环境对效率的要求。

ccv C-based/Cached/Core Computer Vision Library, A Modern Computer Vision Library ccv 项目地址: https://gitcode.com/gh_mirrors/cc/ccv

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丁淳凝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值