1.[推理部署]👉Mac源码编译TensorFlow C++指北
2.TFlite 源码分析(一) 转换与量化
3.神经网络量化入门--Add和Concat
4.部署系列——神经网络INT8量化教程第一讲!源码
5.ONNX一本通:综述&使用&源码分析(持续更新)
[推理部署]👉Mac源码编译TensorFlow C++指北
在Mac环境下编译TensorFlow C++源码,源码需要完成以下步骤,源码以避免可能的源码编译问题,确保顺利构建。源码
首先,源码米论坛源码确认系统环境满足要求。源码需有Xcode和Command Line Tools,源码JDK 1.8.0版本以支持编译过程中所需的源码Java环境,以及Bazel工具,源码TensorFlow依赖此工具进行编译。源码特别注意Bazel版本需与TensorFlow对应,源码如TensorFlow 1.对应Bazel 0..1。源码
接下里,源码安装依赖,源码包括JDK和Bazel。JDK安装时需检查电脑中是否已安装,并确保正确安装。使用HomeBrew安装Bazel,通过命令行接受协议,并使用`--user`指令确保安装在个人目录的`bin`文件夹下,同时设置`.bazelrc`路径为`$HOME/.bazelrc`。
安装自动化工具`automake`和使用Python3.7.5在虚拟环境中构建TensorFlow C++源码。推荐使用清华镜像源加速`pip`的云在线APP源码安装过程。通过`git clone`方式下载TensorFlow源码,确保checkout至r1.分支。调整域名映射以提升`git clone`速度。
进行编译选项配置,通常在TensorFlow文件夹内运行命令,根据提示选择默认选项。
开始编译TensorFlow,此过程可能需要较长时间,完成后,应在`bazel-bin/tensorflow`目录下找到编译好的`libtensorflow_cc.so`和`libtensorflow_framework.1.dylib`文件。
若遇到`Undefined symbols for architecture x_: “_CFRelease”`错误,这通常与创建软连接有关,无需特别处理。若需要手动安装额外依赖库,如Eigen3,可参考相关指南。
编译完成后,可对C++接口进行测试,验证编译过程的正确性。通常情况下,Mac下的TensorFlow 1. C++源码编译完成。
最后,编译TFLite,百棋牛牛源码生成的动态链接库将保存在指定目录下。在`CMakelists.txt`文件中增加对应配置项,以完成TFLite的构建。
总结而言,Mac下TensorFlow 1. C++源码编译及TFLite的构建,需要遵循上述步骤,并确保环境与工具版本的兼容性,以顺利进行编译过程。Linux系统下的编译方式相似,但具体细节可能有所不同。
TFlite 源码分析(一) 转换与量化
TensorFlow Lite 是 Google 推出的用于设备端推断的开源深度学习框架,其主要目的是将 TensorFlow 模型部署到手机、嵌入式设备或物联网设备上。它由两部分构成:模型转换工具和模型推理引擎。
TFLite 的核心组成部分是转换(Converter)和解析(interpreter)。转换主要负责将模型转换成 TFLite 模型,并完成优化和量化的过程。解析则专注于高效执行推理,在端侧设备上进行计算。
转换部分,主要功能是通过 TFLiteConverter 接口实现。转换过程涉及确定输入数据类型,如是个人超级签名源码否为 float、int8 或 uint8。优化和转换过程主要通过 Toco 完成,包括导入模型、模型优化、转换以及输出模型。
在导入模型时,`ImportTensorFlowGraphDef` 函数负责确定输入输出节点,并检查所有算子是否支持,同时内联图的节点进行转换。量化过程则涉及计算网络中单层计算的量化公式,通常针对 UINT8(范围为 0-)或 INT8(范围为 -~)。量化功能主要通过 `CheckIsReadyForQuantization`、`Quantize` 等函数实现,确保输入输出节点的最大最小值存在。
输出模型时,根据指定的输出格式(如 TensorFlow 或 TFLite)进行。TFLite 输出主要分为数据保存和创建 TFLite 模型文件两部分。
量化过程分为选择量化参数和计算量化参数两部分。选择量化参数包括为输入和权重选择合适的量化参数,这些参数在 `MakeInitialDequantizeOperator` 中计算。计算参数则使用 `ChooseQuantizationParamsForArrayAndQuantizedDataType` 函数,该函数基于模板类模板实现。
TFLite 支持的软件盒子app源码量化操作包括 Post-training quantization 方法,实现相关功能的代码位于 `tools\optimize\quantize_model.cc`。
神经网络量化入门--Add和Concat
本文旨在深入探讨神经网络量化中的关键操作:ElementwiseAdd(简称EltwiseAdd)和Concat。我们将逐步解析这两个运算在量化过程中的处理方式,以便为读者提供清晰、直观的理解。
EltwiseAdd量化:
在论文附录中,EltwiseAdd的量化流程被详尽阐述。了解量化基础原理后,可以轻松推导出其量化过程。量化公式如下:
\[Q(x) = \text{ scale} \times (x - \text{ offset})\]
假设两个输入张量的数值分别为 \(x\) 和 \(y\),其相加的结果为 \(z\),在全精度下的EltwiseAdd可以表示为:
\[z = x + y\]
将量化公式代入上述过程,可以得到:
\[Q(z) = \text{ scale} \times (Q(x) + Q(y))\]
简化后,我们可以观察到两个关键步骤:输出需要按照特定公式进行放缩,其中一个输入同样需要放缩,即论文中提及的rescale。尽管在PyTorch中实现这部分代码较为简单,主要工作集中在统计输入和输出的min-max值,推理引擎实现更为关键。在实际应用中,通常采用TFLite的实现方法来处理量化问题。
Concat量化:
Concat操作与EltwiseAdd类似,可以通过对其中一个输入进行rescale后再进行拼接,最后对输出进行调整。量化过程如下:
\[Q(concat(x, y)) = scale_{ output} \times (Q(x) + Q(y))\]
将量化公式代入,可以得到:
\[Q(concat(x, y)) = scale_{ output} \times (scale_x \times Q(x) + scale_y \times Q(y))\]
在实际量化过程中,为了避免精度损失,论文建议统一输入输出的scale值。尽管在没有rescale的情况下实现统一scale较为复杂,TFLite源码中提供了一种解决方案:当其中一个输入的范围覆盖整个输出范围时,将范围较小的输入进行重新量化,以匹配输出的scale和zeropoint。
总结:
EltwiseAdd和Concat量化操作在神经网络中具有重要意义。尽管量化可以减少计算资源需求,但可能引入精度损失。因此,在量化网络时,需关注输入范围的合理匹配,以避免精度损失过大。本文旨在提供这两个运算在量化过程中的直观解释,帮助读者深入理解其处理机制。
部署系列——神经网络INT8量化教程第一讲!
神经网络量化已经成为广泛应用的技术,特别是INT8量化,它在处理大型模型和提高效率方面扮演着重要角色。2年前,作者通过NCNN和TVM在树莓派上部署简单的分类模型时,主要使用了PTQ量化方法。随着时间的推移,量化技术更加成熟,作者计划分享一系列教程,从基础到实践,重点关注TensorRT的量化方式,同时也会参考其他开源工具如Pytorch、NCNN、TVM和TFLITE。
量化是将高精度模型转换为低精度计算,如FP转FP或INT8。虽然FP转换基本无损,但INT8量化更常见,因为它能更好地平衡精度和性能。INT8量化后的模型在保持大部分精度的同时,可以利用INT8的硬件优势,如NVIDIA的Tensor Cores。
量化技术已经在生产环境中广泛应用,各大公司如Google和NVIDIA都有相应的开源解决方案。TensorRT虽然不公开源码,但支持后训练量化,且最新的版本支持ONNX导出的量化模型。Pytorch Quantization是NVIDIA针对Pytorch的量化工具,支持PTQ和QTA。
在量化操作中,关键的概念是量化和反量化,前者将浮点数转换为整数,后者则是将量化后的值恢复为原始精度。对称量化,如TensorRT采用的,简化了计算,通过调整scale值来适应INT8范围。
卷积操作是量化的核心,通过im2col和sgemm转换为INT8运算。量化公式涉及scale值的处理,以及pre-tensor和pre-channel的策略,这有助于保持精度并优化计算效率。
后续内容将深入探讨非对称量化、实际部署中的代码细节,以及TensorRT、Pytorch和TVM的量化实践。如果你对此感兴趣,记得持续关注作者的更新。
ONNX一本通:综述&使用&源码分析(持续更新)
ONNX详解:功能概述、Python API应用与源码解析
ONNX的核心功能集中在模型定义、算子操作、序列化与反序列化,以及模型验证上。它主要通过onnx-runtime实现运行时支持,包括图优化和平台特定的算子库。模型转换工具如tf、pytorch和mindspore的FMK工具包负责各自框架模型至ONNX的转换。ONNX Python API实战
场景一:构建线性回归模型,基础操作演示了API的使用。
场景二至四:包括为op添加常量参数、属性以及控制流(尽管控制流在正式模型中应尽量避免)。
场景五和后续:涉及for循环和自定义算子的添加,如Cos算子,涉及算子定义、添加到算子集、Python实现等步骤。
源码分析
onnx.checker:负责模型和元素的检查,cpp代码中实现具体检查逻辑。
onnx.compose、onnx.defs、onnx.helper等:提供模型构建、算子定义和辅助函数。
onnx.numpy_helper:处理numpy数组与onnx tensor的转换。
onnx.reference:提供Python实现的op推理功能。
onnx.shape_inference:进行模型的形状推断。
onnx.version_converter:处理不同op_set_version的转换。
转换实践
ONNX支持将tf、pytorch和mindspore的模型转换为ONNX格式,同时也有ONNX到TensorRT、MNN和MS-Lite等其他格式的转换选项。总结
ONNX提供了一个统一的IR(中间表示)框架,通过Python API构建模型,支持算子定义的检查和模型的序列化。同时,它利用numpy实现基础算子,便于模型的正确性验证,并支持不同框架模型之间的转换。