netrans/docs/netrans_api.md

11 KiB
Raw Permalink Blame History

Netrans Python API 参考

版本: v6.33.6 (Python 3.10)

概述

Netrans 提供简洁的 Python API用于将神经网络模型转换为 PNNA 芯片可运行的 NBG 格式。

核心流程

load() → quantize() → export()

方法总览

方法 用途
load() 加载模型并配置预处理参数
quantize() 对模型进行量化
quantize_hybrid() 混合精度量化
export() 导出 NBG 文件
add_pre_post() 嵌入前后处理节点
dump() 导出各层张量用于调试
inference() 执行推理并保存输入输出
measure() 统计模型计算量FLOPs和参数量
check_opset() 检查 ONNX 模型 opset 版本

快速示例

from netrans import Netrans

model = Netrans()
model.load('./yolov5s', mean=[0, 0, 0], std=255)
model.quantize('asymu8')
model.export('asymu8', platform='pnna')

Netrans 类

初始化

Netrans()

创建 Netrans 实例,自动验证运行环境和依赖项。


加载模型

load()

load(model_path, *, mean=None, std=None)

加载并准备模型,支持多种框架格式和预处理参数配置。

参数:

  • model_path (str): 模型目录路径,必须包含有效的模型文件
  • mean (float | list[float], 可选): 通道均值
    • v6.33.4 新增自动广播:单值或单元素列表自动广播到所有通道
    • 例如:mean=128[128, 128, 128](三通道模型)
  • std (float | list[float], 可选): 通道标准差(归一化除数)
    • 自动广播:单值自动广播到所有通道
    • 例如:std=255[255, 255, 255](三通道模型)

示例:

# 自动广播推荐v6.33.4+
model.load('./yolov5s', mean=128, std=255)         # 单值自动广播
model.load('./yolov5s', mean=[128], std=[255])     # 单元素列表也广播

# 传统方式(仍然支持)
model.load('./yolov5s', mean=[0, 0, 0], std=255)   # std 单值广播
model.load('./yolov5s', mean=[0, 0, 0], std=[255, 255, 255])  # 全指定

# 不同通道数
model.load('./lenet_gray', mean=127.5, std=255)    # 单通道:[127.5], [255]
model.load('./yolov5s', mean=128, std=255)         # 三通道:[128, 128, 128]

注意:

  • 支持的模型格式ONNX, TensorFlow, TFLite, PyTorch, Caffe, Darknet, Keras
  • 自动广播时会输出日志提示广播结果
  • 如果提供多值列表,长度必须匹配通道数

量化

quantize()

quantize(quantized, *, model_path=None, algorithm=1, iterations=1,
         entropy=False, mle=False, lid=None, in_out_quantized=None,
         quantize_file=None)

对加载的模型进行量化处理。

参数:

  • quantized (str): 目标量化类型
    • asymu8: 非对称8位无符号默认推荐
    • symi8: 对称8位有符号
    • symi16: 对称16位有符号
    • fp16: 半精度浮点
    • 更多类型详见 cookbook.md 速查表
  • model_path (str, 可选): 模型目录路径
  • algorithm (int, 可选): 量化算法,默认 1
    • 0: normal - 普通量化
    • 1: KL - KL散度默认
    • 2: moving_average - 移动平均
    • 3: auto - 自动选择
  • iterations (int, 可选): 量化迭代次数,默认 1
  • entropy (bool, 可选): 计算张量熵,用于量化分析,默认 False
  • mle (bool, 可选): 最小化层间误差,用于量化分析,默认 False
  • lid (str, 可选): 要应用自定义量化类型的层名,多个层以逗号分隔,如 'input_0''input_0,output_0'
  • in_out_quantized (str, 可选): 为 lid 指定的层单独设置量化类型,如 'dfpi16''symi16'。必须与 lid 同时使用
  • quantize_file (str, 保留参数): 当前 Python API 尚未接入 QAT 量化流程请勿使用QAT 支持以后续版本说明为准

示例:

# 基础量化
model.quantize('asymu8')

# 高精度量化
model.quantize('asymu8', algorithm=1, iterations=5)

# 量化分析模式
model.quantize('asymu8', entropy=True, mle=True)

# 自定义输入/输出层量化类型set_ioq
model.quantize('asymu8', lid='input_0', in_out_quantized='dfpi16')
model.quantize('asymu8', lid='input_0,output_0', in_out_quantized='symi16')

quantize_hybrid()

quantize_hybrid(quantized, *, model_path=None, algorithm=1, iterations=1,
                entropy=False, hybrid_qtype='dfpi16', cust_qnt_layers=None)

对指定层应用混合精度量化。

参数:

  • quantized (str): 基础量化类型
  • model_path (str, 可选): 模型目录路径
  • algorithm (int, 可选): 量化算法,同 quantize()
  • iterations (int, 可选): 迭代次数,默认 1
  • entropy (bool, 可选): 是否计算张量熵,默认 False
  • hybrid_qtype (str, 可选): 混合层量化类型,默认 'dfpi16'
  • cust_qnt_layers (str, 可选): 自定义量化层配置文件路径

配置文件格式cust_qnt_layers.txt

Conv_245
Conv_269
Conv_293

示例:

model.quantize_hybrid('asymu8', cust_qnt_layers='layers.txt')

导出

export()

export(quantized='float32', *, model_path=None, platform='pnna', 
       use_hybrid=False, preprocess=True, postprocess=True, core_num=None,
       set_name=None)

将量化后的模型导出为 PNNA 芯片可加载的 NBG 格式。

参数:

  • quantized (str, 可选): 量化类型,默认 'float32'
  • model_path (str, 可选): 模型目录路径
  • platform (str, 可选): 目标芯片平台,默认 'pnna'
    • 'pnna': 单核架构(默认平台)
    • 'pnna2': 多核架构(支持 1-4 核)
  • use_hybrid (bool, 可选): 是否使用混合量化,默认 False
  • preprocess (bool, 可选): 是否集成预处理到网络图,默认 True
    • 注意: symi16 量化类型不支持将预处理嵌入推理节点,导出时会抛出 ValueError
  • postprocess (bool, 可选): 是否集成后处理到网络图,默认 True
  • core_num (str, 可选): 多核配置(仅 pnna2 支持)
    • "1core" / "1": 单核
    • "2core" / "2": 双核
    • "3core" / "3": 三核
    • "4core" / "4": 四核
  • set_name (str, 可选): 自定义 NB 文件名,导出后将 network_binary.nb 复制为 {set_name}.nb

示例:

# 基础导出
model.export('asymu8')

# 嵌入前后处理节点
model.export('asymu8', preprocess=True, postprocess=True)

# FP16 也支持嵌入前后处理节点
model.export('fp16', preprocess=True, postprocess=True)

# 多核导出(仅 pnna2
model.export('asymu8', platform='pnna2', core_num='4core')

# symi16 需要关闭预处理
model.export('symi16', preprocess=False)

# 自定义 NB 文件名
model.export('asymu8', set_name='my_model')

输出文件:

  • wksp/<model>_<quantized>_nbg_unify/network_binary.nb: NBG 文件
  • wksp/<model>_<quantized>_nbg_unify/nbg_meta.json: 元数据

前后处理节点嵌入

add_pre_post()

add_pre_post(quantized, *, model_path=None, preprocess=True,
             postprocess=True, use_hybrid=False)

嵌入预处理和后处理节点。

参数:

  • quantized (str): 量化类型
  • model_path (str, 可选): 模型目录路径
  • preprocess (bool, 可选): 是否嵌入预处理节点,默认 True
  • postprocess (bool, 可选): 是否嵌入后处理节点,默认 True
  • use_hybrid (bool, 可选): 是否使用混合量化文件,默认 False

示例:

model.add_pre_post('asymu8', preprocess=True, postprocess=True)

调试分析

dump()

dump(quantized='float32', *, model_path=None, use_hybrid=False, save_bin=False)

导出网络各层张量数据,用于量化效果分析。

参数:

  • quantized (str, 可选): 量化类型,默认 'float32'
  • model_path (str, 可选): 模型目录路径
  • use_hybrid (bool, 可选): 是否使用混合量化,默认 False
  • save_bin (bool, 可选): 是否额外保存二进制 .tensor.bin 文件,方便 C 语言端读取,默认 False

输出: dump/<model>_<quantized>/ 目录下的张量文件

二进制格式说明: .tensor.bin 文件结构为 magic(u32) + dtype(u32) + ndim(u32) + reserved(u32) + shape[u32; ndim] + raw_dataC 端可直接 fread 读取。

示例:

model.dump('asymu8', save_bin=True)

inference()

inference(quantized='float32', *, model_path=None, iterations=1,
          use_hybrid=False, save_bin=False)

运行模型推理并保存输入输出张量。

参数:

  • quantized (str, 可选): 量化类型,默认 'float32'
  • model_path (str, 可选): 模型目录路径
  • iterations (int, 可选): 推理迭代次数,默认 1
  • use_hybrid (bool, 可选): 是否使用混合量化,默认 False
  • save_bin (bool, 可选): 是否额外保存二进制 .tensor.bin 文件,默认 False

输出: wksp/<model>_<quantized>/golden/ 目录


measure()

measure(quantized='float32', *, model_path=None, use_hybrid=False) -> str

计算网络计算量FLOPs、MACs 等),用于性能评估。

调用前必须先通过 load() 加载网络。统计非 float32 网络时需要先完成相同类型的量化Hybrid 网络还需同时传入 use_hybrid=True

参数:

  • quantized (str, 可选): 量化类型,默认 'float32'
  • model_path (str, 可选): 模型目录路径
  • use_hybrid (bool, 可选): 是否使用混合量化,默认 False

返回: 相对于模型目录的输出目录路径

输出: 普通模式写入模型目录下的 wksp/<model>_<quantized>/Hybrid 模式写入 wksp/<model>_<quantized>_hy/。统计文件的具体名称和字段以实际生成结果为准。

示例:

# 计算量化后网络的计算量
model.measure('asymu8')

# Hybrid 量化模式(需先完成相同类型的 quantize_hybrid
model.measure('asymu8', use_hybrid=True)

完整流程见 measure 示例


check_opset()

check_opset(model_path, verbose=False)

检查 ONNX 模型的 opset 版本是否符合要求。

参数:

  • model_path (str): ONNX 模型文件路径或目录
  • verbose (bool, 可选): 是否显示详细信息,默认 False

返回: bool是否符合要求

支持的 opset 版本: 7 - 17

示例:

is_valid = model.check_opset('./model.onnx')

参数速查

量化类型

详见 cookbook.md - 量化类型

量化算法

算法 说明
0 normal 普通量化
1 KL KL散度推荐
2 moving_average 移动平均
3 auto 自动选择

预处理参数

详见 cookbook.md - 预处理参数


完整示例

更多示例请参考 cookbook.md


相关文档