From 5cd103862408e507a9f0d262df275d64d51ccc06 Mon Sep 17 00:00:00 2001 From: xujiao Date: Tue, 8 Jul 2025 10:42:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/html/.buildinfo | 4 + docs/html/_modules/config.html | 166 ++++ docs/html/_modules/example.html | 173 ++++ docs/html/_modules/export.html | 285 ++++++ docs/html/_modules/import_model.html | 443 ++++++++++ docs/html/_modules/index.html | 109 +++ docs/html/_modules/infer.html | 204 +++++ docs/html/_modules/quantize.html | 211 +++++ docs/html/_modules/quantize_hb.html | 200 +++++ docs/html/_modules/utils.html | 236 +++++ docs/html/_sources/appendix.rst.txt | 9 + docs/html/_sources/config.rst.txt | 7 + docs/html/_sources/dump.rst.txt | 7 + docs/html/_sources/example.rst.txt | 7 + docs/html/_sources/export.rst.txt | 7 + docs/html/_sources/file_model.rst.txt | 7 + docs/html/_sources/gen_api.md.txt | 136 +++ docs/html/_sources/import_model.rst.txt | 7 + docs/html/_sources/index.rst.txt | 22 + docs/html/_sources/infer.rst.txt | 7 + docs/html/_sources/modules.rst.txt | 17 + docs/html/_sources/netrans.rst.txt | 7 + docs/html/_sources/netrans_cli.md.txt | 192 +++++ docs/html/_sources/netrans_py.md.txt | 167 ++++ docs/html/_sources/quantize.rst.txt | 7 + docs/html/_sources/quantize_hb.rst.txt | 7 + docs/html/_sources/quick_start_guide.md.txt | 160 ++++ docs/html/_sources/setup.rst.txt | 7 + docs/html/_sources/utils.rst.txt | 7 + docs/html/_static/alabaster.css | 663 ++++++++++++++ docs/html/_static/basic.css | 906 ++++++++++++++++++++ docs/html/_static/custom.css | 1 + docs/html/_static/doctools.js | 149 ++++ docs/html/_static/documentation_options.js | 13 + docs/html/_static/file.png | Bin 0 -> 286 bytes docs/html/_static/github-banner.svg | 5 + docs/html/_static/language_data.js | 192 +++++ docs/html/_static/minus.png | Bin 0 -> 90 bytes docs/html/_static/plus.png | Bin 0 -> 90 bytes docs/html/_static/pygments.css | 84 ++ docs/html/_static/searchtools.js | 635 ++++++++++++++ docs/html/_static/sphinx_highlight.js | 154 ++++ docs/html/appendix.html | 140 +++ docs/html/config.html | 136 +++ docs/html/dump.html | 119 +++ docs/html/example.html | 124 +++ docs/html/export.html | 141 +++ docs/html/file_model.html | 119 +++ docs/html/gen_api.html | 249 ++++++ docs/html/genindex.html | 341 ++++++++ docs/html/import_model.html | 267 ++++++ docs/html/index.html | 145 ++++ docs/html/infer.html | 135 +++ docs/html/modules.html | 193 +++++ docs/html/netrans.html | 119 +++ docs/html/netrans_cli.html | 318 +++++++ docs/html/netrans_py.html | 276 ++++++ docs/html/objects.inv | Bin 0 -> 908 bytes docs/html/py-modindex.html | 193 +++++ docs/html/quantize.html | 133 +++ docs/html/quantize_hb.html | 135 +++ docs/html/quick_start_guide.html | 254 ++++++ docs/html/search.html | 122 +++ docs/html/searchindex.js | 1 + docs/html/setup.html | 107 +++ docs/html/utils.html | 180 ++++ docs/netrans.pdf | Bin 0 -> 341986 bytes netrans_py/utils.py | 1 + 68 files changed, 9568 insertions(+) create mode 100644 docs/html/.buildinfo create mode 100644 docs/html/_modules/config.html create mode 100644 docs/html/_modules/example.html create mode 100644 docs/html/_modules/export.html create mode 100644 docs/html/_modules/import_model.html create mode 100644 docs/html/_modules/index.html create mode 100644 docs/html/_modules/infer.html create mode 100644 docs/html/_modules/quantize.html create mode 100644 docs/html/_modules/quantize_hb.html create mode 100644 docs/html/_modules/utils.html create mode 100644 docs/html/_sources/appendix.rst.txt create mode 100644 docs/html/_sources/config.rst.txt create mode 100644 docs/html/_sources/dump.rst.txt create mode 100644 docs/html/_sources/example.rst.txt create mode 100644 docs/html/_sources/export.rst.txt create mode 100644 docs/html/_sources/file_model.rst.txt create mode 100644 docs/html/_sources/gen_api.md.txt create mode 100644 docs/html/_sources/import_model.rst.txt create mode 100644 docs/html/_sources/index.rst.txt create mode 100644 docs/html/_sources/infer.rst.txt create mode 100644 docs/html/_sources/modules.rst.txt create mode 100644 docs/html/_sources/netrans.rst.txt create mode 100644 docs/html/_sources/netrans_cli.md.txt create mode 100644 docs/html/_sources/netrans_py.md.txt create mode 100644 docs/html/_sources/quantize.rst.txt create mode 100644 docs/html/_sources/quantize_hb.rst.txt create mode 100644 docs/html/_sources/quick_start_guide.md.txt create mode 100644 docs/html/_sources/setup.rst.txt create mode 100644 docs/html/_sources/utils.rst.txt create mode 100644 docs/html/_static/alabaster.css create mode 100644 docs/html/_static/basic.css create mode 100644 docs/html/_static/custom.css create mode 100644 docs/html/_static/doctools.js create mode 100644 docs/html/_static/documentation_options.js create mode 100644 docs/html/_static/file.png create mode 100644 docs/html/_static/github-banner.svg create mode 100644 docs/html/_static/language_data.js create mode 100644 docs/html/_static/minus.png create mode 100644 docs/html/_static/plus.png create mode 100644 docs/html/_static/pygments.css create mode 100644 docs/html/_static/searchtools.js create mode 100644 docs/html/_static/sphinx_highlight.js create mode 100644 docs/html/appendix.html create mode 100644 docs/html/config.html create mode 100644 docs/html/dump.html create mode 100644 docs/html/example.html create mode 100644 docs/html/export.html create mode 100644 docs/html/file_model.html create mode 100644 docs/html/gen_api.html create mode 100644 docs/html/genindex.html create mode 100644 docs/html/import_model.html create mode 100644 docs/html/index.html create mode 100644 docs/html/infer.html create mode 100644 docs/html/modules.html create mode 100644 docs/html/netrans.html create mode 100644 docs/html/netrans_cli.html create mode 100644 docs/html/netrans_py.html create mode 100644 docs/html/objects.inv create mode 100644 docs/html/py-modindex.html create mode 100644 docs/html/quantize.html create mode 100644 docs/html/quantize_hb.html create mode 100644 docs/html/quick_start_guide.html create mode 100644 docs/html/search.html create mode 100644 docs/html/searchindex.js create mode 100644 docs/html/setup.html create mode 100644 docs/html/utils.html create mode 100644 docs/netrans.pdf diff --git a/docs/html/.buildinfo b/docs/html/.buildinfo new file mode 100644 index 0000000..c579169 --- /dev/null +++ b/docs/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: c457bdf30d2a3c56394067910656aaac +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/html/_modules/config.html b/docs/html/_modules/config.html new file mode 100644 index 0000000..cc0b44d --- /dev/null +++ b/docs/html/_modules/config.html @@ -0,0 +1,166 @@ + + + + + + + config — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

config 源代码

+
+import os
+import sys
+from utils import check_path, AttributeCopier, create_cls
+import subprocess
+
+
+[文档] +class Config(AttributeCopier): + """从实例化的 Netrans 中解析模型参数,并基于pnnacc 生成配置文件模板 + + Args: + Netrans (class): 实例化的Netrans类,包含 模型信息 和 Netrans 信息 + """ + def __init__(self, source_obj) -> None: + """从实例化的 Netrans 中解析模型参数 + + Args: + source_obj (class): 实例化的Netrans类,包含 模型信息 和 Netrans 信息 + + """ + super().__init__(source_obj) + + @check_path + def inputmeta_gen(self): + """生成配置文件模板 + + Return: + None + """ + netrans_path = self.netrans + network_name = self.model_name + # 进入网络名称指定的目录 + # os.chdir(network_name) + # check_env(network_name) + + # 执行 pegasus 命令 + cmd = f"{netrans_path} generate inputmeta --model {network_name}.json --separated-database" + try : + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + except : + raise RuntimeError('config failed')
+ + # os.chdir("..") + +# def main(): + +# # 检查命令行参数数量是否正确 +# if len(sys.argv) != 2: +# print("Enter a network name!") +# sys.exit(2) + +# # 检查提供的目录是否存在 +# network_name = sys.argv[1] +# # 构建 netrans 可执行文件的路径 +# netrans_path =os.getenv('NETRANS_PATH') +# cla = create_cls(netrans_path, network_name) +# func = InputmetaGen(cla) +# func.inputmeta_gen() + + +# if __name__ == '__main__': +# main() +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/example.html b/docs/html/_modules/example.html new file mode 100644 index 0000000..88bd4d4 --- /dev/null +++ b/docs/html/_modules/example.html @@ -0,0 +1,173 @@ + + + + + + + example — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

example 源代码

+#!/usr/bin/env python3
+
+import argparse
+from netrans import Netrans
+
+
+[文档] +def main(): + # 创建参数解析器 + parser = argparse.ArgumentParser( + description='神经网络模型转换工具', + formatter_class=argparse.ArgumentDefaultsHelpFormatter # 自动显示默认值 + ) + + # 必填位置参数 + parser.add_argument( + 'model_path', + type=str, + help='输入模型路径(必须参数)' + ) + + # 可选参数组 + quant_group = parser.add_argument_group('量化参数') + quant_group.add_argument( + '-q', '--quantize_type', + type=str, + choices=['uint8', 'int8', 'int16', 'float'], + default='uint8', + metavar='TYPE', + help='量化类型(可选值:%(choices)s)' + ) + quant_group.add_argument( + '-m', '--mean', + type=int, + default=0, + help='归一化均值(默认:%(default)s)' + ) + quant_group.add_argument( + '-s', '--scale', + type=float, + default=1.0, + help='量化缩放系数(默认:%(default)s)' + ) + parser.add_argument( + '-p', '--profile', + action='store_true', # 设置为True当参数存在时 + help='启用性能分析模式(默认:%(default)s)' + ) + + + # 解析参数 + args = parser.parse_args() + + # 执行模型转换 + try: + model = Netrans(model_path=args.model_path) + model.model2nbg( + quantize_type=args.quantize_type, + mean=args.mean, + scale=args.scale, + profile=args.profile + ) + print(f"模型 {args.model_path} 转换成功") + except FileNotFoundError: + print(f"错误:模型文件 {args.model_path} 不存在") + exit(1)
+ + +if __name__ == "__main__": + main() +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/export.html b/docs/html/_modules/export.html new file mode 100644 index 0000000..a854930 --- /dev/null +++ b/docs/html/_modules/export.html @@ -0,0 +1,285 @@ + + + + + + + export — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

export 源代码

+import os
+import sys
+import subprocess
+import shutil
+from utils import check_path, AttributeCopier, create_cls
+# 检查 NETRANS_PATH 环境变量是否设置
+
+# 定义数据集文件路径
+dataset = 'dataset.txt'
+
+
+[文档] +class Export(AttributeCopier): + """从实例化的 Netrans 中解析模型参数,并基于 pnnacc 导出模型ngb文件 + + Args: + Netrans (class): 实例化的Netrans类,包含 模型信息 和 Netrans 信息 + """ + def __init__(self, source_obj) -> None: + """从实例化的 Netrans 中解析模型参数 + + Args: + source_obj (class): 实例化的Netrans类,包含 模型信息 和 Netrans 信息 + + """ + super().__init__(source_obj) + + @check_path + def export_network(self): + """基于 pnnacc 导出模型 + """ + + netrans = self.netrans + quantized = self.quantize_type + name = self.model_name + netrans_path = self.netrans_path + + ovxgenerator = netrans + " export ovxlib" + # 进入模型目录 + # os.chdir(name) + + # 根据量化类型设置参数 + if quantized == 'float': + type_ = 'float' + quantization_type = 'none_quantized' + generate_path = './wksp/none_quantized' + elif quantized == 'uint8': + type_ = 'quantized' + quantization_type = 'asymmetric_affine' + generate_path = './wksp/asymmetric_affine' + elif quantized == 'int8': + type_ = 'quantized' + quantization_type = 'dynamic_fixed_point-8' + generate_path = './wksp/dynamic_fixed_point-8' + elif quantized == 'int16': + type_ = 'quantized' + quantization_type = 'dynamic_fixed_point-16' + generate_path = './wksp/dynamic_fixed_point-16' + else: + print("=========== wrong quantization_type ! ( float / uint8 / int8 / int16 )===========") + sys.exit(1) + + # 创建输出目录 + os.makedirs(generate_path, exist_ok=True) + + # 构建命令 + if quantized == 'float': + cmd = f"{ovxgenerator} \ + --model {name}.json \ + --model-data {name}.data \ + --dtype {type_} \ + --pack-nbg-viplite \ + --optimize 'VIP8000NANOQI_PLUS_PID0XB1'\ + --target-ide-project 'linux64' \ + --viv-sdk {netrans_path}/pnna_sdk \ + --output-path {generate_path}/{name}_{quantization_type}" + else: + if not os.path.exists(f"{name}_{quantization_type}.quantize"): + print(f"\033[31m Can not find {name}_{quantization_type}.quantize \033[0m") + sys.exit(1) + else : + if not os.path.exists(f"{name}_postprocess_file.yml"): + cmd = f"{ovxgenerator} \ + --model {name}.json \ + --model-data {name}.data \ + --dtype {type_} \ + --pack-nbg-viplite \ + --optimize 'VIP8000NANOQI_PLUS_PID0XB1'\ + --viv-sdk {netrans_path}/pnna_sdk \ + --model-quantize {name}_{quantization_type}.quantize \ + --with-input-meta {name}_inputmeta.yml \ + --target-ide-project 'linux64' \ + --output-path {generate_path}/{quantization_type}" + else: + cmd = f"{ovxgenerator} \ + --model {name}.json \ + --model-data {name}.data \ + --dtype {type_} \ + --pack-nbg-viplite \ + --optimize 'VIP8000NANOQI_PLUS_PID0XB1'\ + --viv-sdk {netrans_path}/pnna_sdk \ + --model-quantize {name}_{quantization_type}.quantize \ + --with-input-meta {name}_inputmeta.yml \ + --target-ide-project 'linux64' \ + --postprocess-file {name}_postprocess_file.yml \ + --output-path {generate_path}/{quantization_type}" + + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + + # 检查执行结果 + if result.returncode == 0: + print("\033[31m SUCCESS \033[0m") + else: + print(f"\033[31m ERROR ! {result.stderr} \033[0m") + + + # temp='wksp/temp' + # os.makedirs(temp, exist_ok=True) + + source_dir = f"{generate_path}_nbg_viplite" + target_dir = generate_path + src_ngb = f"{source_dir}/network_binary.nb" + if self.profile: + try: + # 如果目标路径已存在,先删除(确保移动操作能成功) + if os.path.exists(target_dir): + shutil.rmtree(target_dir) + # 移动整个目录到目标位置 + shutil.move(source_dir, target_dir) + # print(f"Successfully moved directory {source_dir} to {target_dir}") + except Exception as e: + sys.exit(1) # 非零退出码表示错误 + # print(f"Error moving directory: {e}") + else: + try: + # 仅复制network_binary.nb文件 + shutil.rmtree(generate_path) + os.mkdir(generate_path) + shutil.copy(src_ngb, generate_path) + + # print(f"Successfully copied {src_ngb} to {generate_path}") + except FileNotFoundError: + print(f"Error: {src_ngb} is not found") + except Exception as e: + print(f"Error occurred: {e}") + + try: + # 清理源目录 + shutil.rmtree(source_dir) + # print(f"Removed source directory {source_dir}") + except Exception as e: + # print(f"Error removing directory: {e}") + sys.exit(1) # 非零退出码表示错误
+ + +
+[文档] +def main(): +# 检查命令行参数数量 + if len(sys.argv) < 3: + print("Input a network name and quantized type ( float / uint8 / int8 / int16 )") + sys.exit(1) + # 检查网络目录是否存在 + network_name = sys.argv[1] + # check_env(network_name) + if not os.path.exists(os.path.exists(network_name)): + print(f"Directory {network_name} does not exist !") + sys.exit(2) + + netrans_path = os.environ['NETRANS_PATH'] + # netrans = os.path.join(os.environ['NETRANS_PATH'], 'pnnacc') + # 调用导出函数ss + cla = create_cls(netrans_path, network_name, sys.argv[2]) + func = Export(cla) + func.export_network()
+ + + # export_network(netrans, network_name, sys.argv[2]) + + +if __name__ == '__main__': + main() +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/import_model.html b/docs/html/_modules/import_model.html new file mode 100644 index 0000000..1f34baa --- /dev/null +++ b/docs/html/_modules/import_model.html @@ -0,0 +1,443 @@ + + + + + + + import_model — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

import_model 源代码

+import os 
+import sys
+import subprocess
+from utils import check_path, AttributeCopier, create_cls
+
+
+[文档] +def check_status(result): + """解析命令执行情况 + + Args: + result (return of subprocrss.run): subprocess.run的返回值 + """ + if result.returncode == 0: + print("\033[31m LOAD MODEL SUCCESS \033[0m") + else: + print(f"\033[31m ERROR: {result.stderr} \033[0m")
+ + + +
+[文档] +def import_caffe_network(name, netrans_path): + """导入 caffe 模型 + + Args: + name (str): 模型名字 + netrans_path (str): 模型路径 + + Returns: + cmd (str): 生成的pnnacc 命令行, 被subprocesses执行 + """ + # 定义转换工具的路径 + convert_caffe =netrans_path + " import caffe" + + # 定义模型文件路径 + model_json_path = f"{name}.json" + model_data_path = f"{name}.data" + model_prototxt_path = f"{name}.prototxt" + model_caffemodel_path = f"{name}.caffemodel" + + # 打印转换信息 + print(f"=========== Converting {name} Caffe model ===========") + + # 构建转换命令 + if os.path.isfile(model_caffemodel_path): + cmd = f"{convert_caffe} \ + --model {model_prototxt_path} \ + --weights {model_caffemodel_path} \ + --output-model {model_json_path} \ + --output-data {model_data_path}" + else: + print("=========== fake Caffe model data file =============") + cmd = f"{convert_caffe} \ + --model {model_prototxt_path} \ + --output-model {model_json_path} \ + --output-data {model_data_path}" + + # 执行转换命令 + # print(cmd) + # os.system(cmd) + return cmd
+ + +
+[文档] +def import_tensorflow_network(name, netrans_path): + """导入 tensorflow 模型 + + Args: + name (str): 模型名字 + netrans_path (str): 模型路径 + + Returns: + cmd (str): 生成的pnnacc 命令行, 被subprocesses执行 + """ + # 定义转换工具的命令 + convertf_cmd = f"{netrans_path} import tensorflow" + + # 打印转换信息 + print(f"=========== Converting {name} Tensorflow model ===========") + + # 读取 inputs_outputs.txt 文件中的参数 + with open('inputs_outputs.txt', 'r') as f: + inputs_outputs_params = f.read().strip() + + # 构建转换命令 + cmd = f"{convertf_cmd} \ + --model {name}.pb \ + --output-data {name}.data \ + --output-model {name}.json \ + {inputs_outputs_params}" + + # 执行转换命令 + # print(cmd) + return cmd
+ + + # result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + + # 检查执行结果 + # check_status(result) + +
+[文档] +def import_onnx_network(name, netrans_path): + """导入 onnx 模型 + + Args: + name (str): 模型名字 + netrans_path (str): 模型路径 + + Returns: + cmd (str): 生成的pnnacc 命令行, 被subprocesses执行 + """ + # 定义转换工具的命令 + convert_onnx_cmd = f"{netrans_path} import onnx" + + # 打印转换信息 + print(f"=========== Converting {name} ONNX model ===========") + if os.path.exists(f"{name}_outputs.txt"): + output_path = os.path.join(os.getcwd(), name+"_outputs.txt") + with open(output_path, 'r', encoding='utf-8') as file: + outputs = str(file.readline().strip()) + + cmd = f"{convert_onnx_cmd} \ + --model {name}.onnx \ + --output-model {name}.json \ + --output-data {name}.data \ + --outputs '{outputs}'" + else: + # 构建转换命令 + cmd = f"{convert_onnx_cmd} \ + --model {name}.onnx \ + --output-model {name}.json \ + --output-data {name}.data" + + # 执行转换命令 + # print(cmd) + return cmd
+ + + # result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + + # 检查执行结果 + # check_status(result) + +####### TFLITE +
+[文档] +def import_tflite_network(name, netrans_path): + """导入 tflite 模型 + + Args: + name (str): 模型名字 + netrans_path (str): 模型路径 + + Returns: + cmd (str): 生成的pnnacc 命令行, 被subprocesses执行 + """ + # 定义转换工具的路径或命令 + convert_tflite = f"{netrans_path} import tflite" + + # 定义模型文件路径 + model_json_path = f"{name}.json" + model_data_path = f"{name}.data" + model_tflite_path = f"{name}.tflite" + + # 打印转换信息 + print(f"=========== Converting {name} TFLite model ===========") + + # 构建转换命令 + cmd = f"{convert_tflite} \ + --model {model_tflite_path} \ + --output-model {model_json_path} \ + --output-data {model_data_path}" + + # 执行转换命令 + # print(cmd) + return cmd
+ + + # result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + + # 检查执行结果 + # check_status(result) + + +
+[文档] +def import_darknet_network(name, netrans_path): + """导入 darknet 模型 + + Args: + name (str): 模型名字 + netrans_path (str): 模型路径 + + Returns: + cmd (str): 生成的pnnacc 命令行, 被subprocesses执行 + """ + # 定义转换工具的命令 + convert_darknet_cmd = f"{netrans_path} import darknet" + + # 打印转换信息 + print(f"=========== Converting {name} darknet model ===========") + + # 构建转换命令 + cmd = f"{convert_darknet_cmd} \ + --model {name}.cfg \ + --weight {name}.weights \ + --output-model {name}.json \ + --output-data {name}.data" + + # 执行转换命令 + # print(cmd) + return cmd + + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + + # 检查执行结果 + check_status(result)
+ + +
+[文档] +def import_pytorch_network(name, netrans_path): + """导入 pytorch 模型 + + Args: + name (str): 模型名字 + netrans_path (str): 模型路径 + + Returns: + cmd (str): 生成的pnnacc 命令行, 被subprocesses执行 + """ + # 定义转换工具的命令 + convert_pytorch_cmd = f"{netrans_path} import pytorch" + + # 打印转换信息 + print(f"=========== Converting {name} pytorch model ===========") + + # 读取 input_size.txt 文件中的参数 + try: + with open('input_size.txt', 'r') as file: + input_size_params = ' '.join(file.readlines()) + except FileNotFoundError: + print("Error: input_size.txt not found.") + sys.exit(1) + + # 构建转换命令 + cmd = f"{convert_pytorch_cmd} \ + --model {name}.pt \ + --output-model {name}.json \ + --output-data {name}.data \ + {input_size_params}" + + # 执行转换命令 + # print(cmd) + return cmd + + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + + # 检查执行结果 + check_status(result)
+ + +# 使用示例 +# import_tensorflow_network('model_name', '/path/to/NETRANS_PATH') +
+[文档] +class ImportModel(AttributeCopier): + """从实例化的 Netrans 中解析模型参数,并基于 pnnacc 导入模型 + + Args: + Netrans (class): 实例化的Netrans类,包含 模型信息 和 Netrans 信息 + """ + def __init__(self, source_obj) -> None: + """从实例化的 Netrans 中解析模型参数 + + Args: + source_obj (class): 实例化的Netrans类,包含 模型信息 和 Netrans 信息 + + """ + super().__init__(source_obj) + # print(source_obj.__dict__) + + @check_path + def import_network(self): + """基于 pnnacc 导入模型 + + Raises: + FileExistsError: 如果不存在模型文件则会报错 FileExistsError + RuntimeError: 如果执行导入失败则会报 RuntimeError + """ + if self.verbose is True : + print("begin load model") + # print(self.model_path) + print(os.getcwd()) + print(f"{self.model_name}.weights") + name = self.model_name + netrans_path = self.netrans + if os.path.isfile(f"{name}.prototxt"): + cmd = import_caffe_network(name, netrans_path) + elif os.path.isfile(f"{name}.pb"): + cmd = import_tensorflow_network(name, netrans_path) + elif os.path.isfile(f"{name}.onnx"): + cmd = import_onnx_network(name, netrans_path) + elif os.path.isfile(f"{name}.tflite"): + cmd = import_tflite_network(name, netrans_path) + elif os.path.isfile(f"{name}.weights"): + cmd = import_darknet_network(name, netrans_path) + elif os.path.isfile(f"{name}.pt"): + cmd = import_pytorch_network(name, netrans_path) + else : + raise FileExistsError("Can not find suitable model files") + try : + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + except : + raise RuntimeError("load model failed") + # 检查执行结果 + check_status(result)
+ + # os.chdir("..") + + +# def main(): +# if len(sys.argv) != 2 : +# print("Input a network") +# sys.exit(-1) + +# network_name = sys.argv[1] +# # check_env(network_name) + +# netrans_path = os.environ['NETRANS_PATH'] +# # netrans = os.path.join(netrans_path, 'pnnacc') +# clas = create_cls(netrans_path, network_name,verbose=False) +# func = ImportModel(clas) +# func.import_network() +# if __name__ == "__main__": +# main() +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/index.html b/docs/html/_modules/index.html new file mode 100644 index 0000000..699f12d --- /dev/null +++ b/docs/html/_modules/index.html @@ -0,0 +1,109 @@ + + + + + + + 概览:模块代码 — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

代码可用的所有模块

+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/infer.html b/docs/html/_modules/infer.html new file mode 100644 index 0000000..54f85c1 --- /dev/null +++ b/docs/html/_modules/infer.html @@ -0,0 +1,204 @@ + + + + + + + infer — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

infer 源代码

+import os
+import sys
+import subprocess
+from utils import check_path, AttributeCopier, create_cls
+
+
+[文档] +class Infer(AttributeCopier): + def __init__(self, source_obj) -> None: + super().__init__(source_obj) + + @check_path + def inference_network(self): + netrans = self.netrans + quantized = self.quantize_type + name = self.model_name + # print(self.__dict__) + + netrans += " inference" + # 进入模型目录 + + # 定义类型和量化类型 + if quantized == 'float': + type_ = 'float32' + quantization_type = 'float32' + elif quantized == 'uint8': + quantization_type = 'asymmetric_affine' + type_ = 'quantized' + elif quantized == 'int8': + quantization_type = 'dynamic_fixed_point-8' + type_ = 'quantized' + elif quantized == 'int16': + quantization_type = 'dynamic_fixed_point-16' + type_ = 'quantized' + else: + print("=========== wrong quantization_type ! ( float / uint8 / int8 / int16 )===========") + sys.exit(-1) + + # 构建推理命令 + inf_path = './inf' + cmd = f"{netrans} \ + --dtype {type_} \ + --batch-size 1 \ + --model-quantize {name}_{quantization_type}.quantize \ + --model {name}.json \ + --model-data {name}.data \ + --output-dir {inf_path} \ + --with-input-meta {name}_inputmeta.yml \ + --device CPU" + + # 执行推理命令 + if self.verbose is True: + print(cmd) + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + + # 检查执行结果 + if result.returncode == 0: + print("\033[32m SUCCESS \033[0m") + else: + print(f"\033[31m ERROR: {result.stderr} \033[0m")
+ + + # 返回原始目录 + +
+[文档] +def main(): + # 检查命令行参数数量 + if len(sys.argv) < 3: + print("Input a network name and quantized type ( float / uint8 / int8 / int16 )") + sys.exit(-1) + + # 检查网络目录是否存在 + network_name = sys.argv[1] + if not os.path.exists(network_name): + print(f"Directory {network_name} does not exist !") + sys.exit(-2) + # print("here") + # 定义 netrans 路径 + # netrans = os.path.join(os.environ['NETRANS_PATH'], 'pnnacc') + network_name = sys.argv[1] + # check_env(network_name) + + netrans_path = os.environ['NETRANS_PATH'] + # netrans = os.path.join(netrans_path, 'pnnacc') + quantize_type = sys.argv[2] + cla = create_cls(netrans_path, network_name,quantize_type,False) + + # 调用量化函数 + func = Infer(cla) + func.inference_network()
+ + + # 定义数据集文件路径 + # dataset_path = './dataset.txt' + # 调用推理函数 + # inference_network(network_name, sys.argv[2]) + +if __name__ == '__main__': + # print("main") + main() +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/quantize.html b/docs/html/_modules/quantize.html new file mode 100644 index 0000000..5103bbc --- /dev/null +++ b/docs/html/_modules/quantize.html @@ -0,0 +1,211 @@ + + + + + + + quantize — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

quantize 源代码

+import os
+import sys
+from utils import check_path, AttributeCopier, create_cls
+
+
+[文档] +class Quantize(AttributeCopier): + """ + 解析 Netrans 参数,基于 pnnacc 量化模型 + Args: + cla (class): 实例化以后的 Netrans 类,需要解析里面包含的参数 + """ + def __init__(self, source_obj) -> None: + """ + 从 Netrans 类中获取模型信息 + Args: + source_obj (class): 实例化以后的 Netrans 类,需要解析里面包含的参数 + """ + super().__init__(source_obj) + + @check_path + def quantize_network(self): + """基于 pnnacc 量化模型 + """ + netrans = self.netrans + quantized_type = self.quantize_type + name = self.model_name + # check_env(name) + # print(os.getcwd()) + netrans += " quantize" + # 根据量化类型设置量化参数 + if quantized_type == 'float': + print("=========== do not need quantized===========") + return + elif quantized_type == 'uint8': + quantization_type = "asymmetric_affine" + elif quantized_type == 'int8': + quantization_type = "dynamic_fixed_point-8" + elif quantized_type == 'int16': + quantization_type = "dynamic_fixed_point-16" + else: + print("=========== wrong quantization_type ! ( uint8 / int8 / int16 )===========") + return + + # 输出量化信息 + print(" =======================================================================") + print(f" ==== Start Quantizing {name} model with type of {quantization_type} ===") + print(" =======================================================================") + current_directory = os.getcwd() + txt_path = current_directory+"/dataset.txt" + with open(txt_path, 'r', encoding='utf-8') as file: + num_lines = len(file.readlines()) + + # 移除已存在的量化文件 + quantize_file = f"{name}_{quantization_type}.quantize" + if os.path.exists(quantize_file): + print(f"\033[31m rm {quantize_file} \033[0m") + os.remove(quantize_file) + + # 构建并执行量化命令 + cmd = f"{netrans} \ + --batch-size 1 \ + --qtype {quantized_type} \ + --rebuild \ + --quantizer {quantization_type.split('-')[0]} \ + --model-quantize {quantize_file} \ + --model {name}.json \ + --model-data {name}.data \ + --with-input-meta {name}_inputmeta.yml \ + --device CPU \ + --algorithm kl_divergence \ + --iterations {num_lines}" + + os.system(cmd) + + # 检查量化结果 + if os.path.exists(quantize_file): + print("\033[31m QUANTIZED SUCCESS \033[0m") + else: + print("\033[31m ERROR ! \033[0m")
+ + + +# def main(): +# # 检查命令行参数数量 +# if len(sys.argv) < 3: +# print("Input a network name and quantized type ( uint8 / int8 / int16 )") +# sys.exit(-1) + +# # 检查网络目录是否存在 +# network_name = sys.argv[1] + +# # 定义 netrans 路径 +# # netrans = os.path.join(os.environ['NETRANS_PATH'], 'pnnacc') +# # network_name = sys.argv[1] +# # check_env(network_name) + +# netrans_path = os.environ['NETRANS_PATH'] +# # netrans = os.path.join(netrans_path, 'pnnacc') +# quantize_type = sys.argv[2] +# cla = create_cls(netrans_path, network_name,quantize_type) + +# # 调用量化函数 +# run = Quantize(cla) +# run.quantize_network() + +# if __name__ == "__main__": +# main() +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/quantize_hb.html b/docs/html/_modules/quantize_hb.html new file mode 100644 index 0000000..ae2c702 --- /dev/null +++ b/docs/html/_modules/quantize_hb.html @@ -0,0 +1,200 @@ + + + + + + + quantize_hb — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

quantize_hb 源代码

+import os
+import sys
+from utils import check_path, AttributeCopier, create_cls
+
+
+[文档] +class Quantize(AttributeCopier): + def __init__(self, source_obj) -> None: + super().__init__(source_obj) + + @check_path + def quantize_network(self): + netrans = self.netrans + quantized_type = self.quantize_type + name = self.model_name + # check_env(name) + # print(os.getcwd()) + netrans += " quantize" + # 根据量化类型设置量化参数 + if quantized_type == 'float': + print("=========== do not need quantized===========") + return + elif quantized_type == 'uint8': + quantization_type = "asymmetric_affine" + elif quantized_type == 'int8': + quantization_type = "dynamic_fixed_point-8" + elif quantized_type == 'int16': + quantization_type = "dynamic_fixed_point-16" + else: + print("=========== wrong quantization_type ! ( uint8 / int8 / int16 )===========") + return + + # 输出量化信息 + print(" =======================================================================") + print(f" ==== Start Quantizing {name} model with type of {quantization_type} ===") + print(" =======================================================================") + + # 移除已存在的量化文件 + quantize_file = f"{name}_{quantization_type}.quantize" + current_directory = os.getcwd() + txt_path = current_directory+"/dataset.txt" + with open(txt_path, 'r', encoding='utf-8') as file: + num_lines = len(file.readlines()) + + + # 构建并执行量化命令 + cmd = f"{netrans} \ + --qtype {quantized_type} \ + --hybrid \ + --quantizer {quantization_type.split('-')[0]} \ + --model-quantize {quantize_file} \ + --model {name}.json \ + --model-data {name}.data \ + --with-input-meta {name}_inputmeta.yml \ + --device CPU \ + --algorithm kl_divergence \ + --divergence-nbins 2048 \ + --iterations {num_lines}" + + os.system(cmd) + + # 检查量化结果 + if os.path.exists(quantize_file): + print("\033[31m QUANTIZED SUCCESS \033[0m") + else: + print("\033[31m ERROR ! \033[0m")
+ + + +
+[文档] +def main(): + # 检查命令行参数数量 + if len(sys.argv) < 3: + print("Input a network name and quantized type ( uint8 / int8 / int16 )") + sys.exit(-1) + + # 检查网络目录是否存在 + network_name = sys.argv[1] + + # 定义 netrans 路径 + # netrans = os.path.join(os.environ['NETRANS_PATH'], 'pnnacc') + # network_name = sys.argv[1] + # check_env(network_name) + + netrans_path = os.environ['NETRANS_PATH'] + # netrans = os.path.join(netrans_path, 'pnnacc') + quantize_type = sys.argv[2] + cla = create_cls(netrans_path, network_name,quantize_type) + + # 调用量化函数 + run = Quantize(cla) + run.quantize_network()
+ + +if __name__ == "__main__": + main() +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/utils.html b/docs/html/_modules/utils.html new file mode 100644 index 0000000..5d6228a --- /dev/null +++ b/docs/html/_modules/utils.html @@ -0,0 +1,236 @@ + + + + + + + utils — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

utils 源代码

+import sys
+import os
+# from functools import wraps
+
+# def check_path(netrans, model_path):
+#     def decorator(func):
+#         @wraps(func)
+#         def wrapper(netrans, model_path, *args, **kargs):
+#             check_dir(model_path)
+#             check_netrans(netrans)
+#             if os.getcwd() != model_path :
+#                 os.chdir(model_path)
+#             return func(netrans, model_path, *args, **kargs)
+#         return wrapper
+#     return decorator
+
+
+[文档] +def check_path(func): + """ 装饰器, 确保在工程目录运行 nertans + + """ + def wrapper(cla, *args, **kargs): + check_netrans(cla.netrans) + if os.getcwd() != cla.model_path : + os.chdir(cla.model_path) + return func(cla, *args, **kargs) + return wrapper
+ + + +
+[文档] +def check_dir(network_name): + """判断工程目录是否存在 + + Args: + network_name (str): 工程目录路径 + + Raises: + NotADirectoryError: 没有那个工程目录 + """ + if not os.path.exists(network_name): + raise NotADirectoryError( + f"Directory not found: {network_name}" + ) + # print(f"Directory {network_name} does not exist !") + # sys.exit(-1) + os.chdir(network_name)
+ + +
+[文档] +def check_netrans(netrans): + """判断 netrans 是否配置成功 + + Args: + netrans (str, bool): _netrans 路径, 如果没有配置(默认为False)会去环境变量里找 + + Raises: + NotADirectoryError: 找不到 Netrans 会返回 NotADirectoryError + """ + if netrans != None and os.path.exists(netrans) is True: + return + if 'NETRANS_PATH' in os.environ : + return + raise NotADirectoryError( + f"Netrans not found: {netrans}" + )
+ + + +
+[文档] +def remove_history_file(name): + os.chdir(name) + if os.path.isfile(f"{name}.json"): + os.remove(f"{name}.json") + if os.path.isfile(f"{name}.data"): + os.remove(f"{name}.data") + os.chdir('..')
+ + +
+[文档] +def check_env(name): + check_dir(name)
+ +# check_netrans() + # remove_history_file(name) + + +
+[文档] +class AttributeCopier: + """快速解析复制 Netrans 信息 + """ + def __init__(self, source_obj) -> None: + self.copy_attribute_name(source_obj) + +
+[文档] + def copy_attribute_name(self, source_obj): + for attribute_name in self._get_attribute_names(source_obj): + setattr(self, attribute_name, getattr(source_obj, attribute_name))
+ + + @staticmethod + def _get_attribute_names(source_obj): + return source_obj.__dict__.keys()
+ + +
+[文档] +class create_cls(): #dataclass @netrans_params + """快速测试时候模拟实例化Netrans""" + def __init__(self, netrans_path, name, quantized_type = 'uint8',verbose=False) -> None: + self.netrans_path = netrans_path + self.netrans = os.path.join(self.netrans_path, 'pnnacc') + self.model_name=self.model_path = name + self.model_path = os.path.abspath(self.model_path) + self.verbose=verbose + self.quantize_type = quantized_type + self.profile = False
+ + + +# if __name__ == "__main__": +# dir_name = "yolo" +# os.mkdir(dir_name) +# check_dir(dir_name) + + +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/_sources/appendix.rst.txt b/docs/html/_sources/appendix.rst.txt new file mode 100644 index 0000000..a012aa1 --- /dev/null +++ b/docs/html/_sources/appendix.rst.txt @@ -0,0 +1,9 @@ +附录 +============= + +.. toctree:: + :maxdepth: 2 + + gen_api + modules + diff --git a/docs/html/_sources/config.rst.txt b/docs/html/_sources/config.rst.txt new file mode 100644 index 0000000..edbd331 --- /dev/null +++ b/docs/html/_sources/config.rst.txt @@ -0,0 +1,7 @@ +config module +============= + +.. automodule:: config + :members: + :show-inheritance: + :undoc-members: diff --git a/docs/html/_sources/dump.rst.txt b/docs/html/_sources/dump.rst.txt new file mode 100644 index 0000000..ae53927 --- /dev/null +++ b/docs/html/_sources/dump.rst.txt @@ -0,0 +1,7 @@ +dump module +=========== + +.. automodule:: dump + :members: + :show-inheritance: + :undoc-members: diff --git a/docs/html/_sources/example.rst.txt b/docs/html/_sources/example.rst.txt new file mode 100644 index 0000000..a142c2b --- /dev/null +++ b/docs/html/_sources/example.rst.txt @@ -0,0 +1,7 @@ +example module +============== + +.. automodule:: example + :members: + :show-inheritance: + :undoc-members: diff --git a/docs/html/_sources/export.rst.txt b/docs/html/_sources/export.rst.txt new file mode 100644 index 0000000..3a5c46c --- /dev/null +++ b/docs/html/_sources/export.rst.txt @@ -0,0 +1,7 @@ +export module +============= + +.. automodule:: export + :members: + :show-inheritance: + :undoc-members: diff --git a/docs/html/_sources/file_model.rst.txt b/docs/html/_sources/file_model.rst.txt new file mode 100644 index 0000000..e837e7a --- /dev/null +++ b/docs/html/_sources/file_model.rst.txt @@ -0,0 +1,7 @@ +file\_model module +================== + +.. automodule:: file_model + :members: + :show-inheritance: + :undoc-members: diff --git a/docs/html/_sources/gen_api.md.txt b/docs/html/_sources/gen_api.md.txt new file mode 100644 index 0000000..3fab05a --- /dev/null +++ b/docs/html/_sources/gen_api.md.txt @@ -0,0 +1,136 @@ +# gen api html & pdf by sphinx + +netrans 目录结构如下 +```tree +netrans/ +│ +├── docs/ # Sphinx 项目的根目录 +│ ├── source/ # 源文件目录 +│ │ ├── _static/ # 静态文件(如图片、CSS、JS) +│ │ ├── _templates/ # 自定义模板 +│ │ ├── conf.py # 配置文件 +│ │ ├── index.rst # 主页文件 +│ │ └── my_module.rst # 其他文档文件 +│ └── build/ # 构建输出目录(生成的 HTML 文件等) +│ +└── bin/ +└── netrans_cli/ +└── netrans_py/ +``` + +1. `sphinx-quickstart docs/` 快速生成 +2. 修改 `docs/source/conf.py` , + + +### *.rst + +rst, reStructuredText 文件,用于定义文档的结构。通常放在source目录下。 + +rst 是一种和 markdown 类似的语法 + +使用目录树指令 `.. toctree::`,列出其他文档文件。 + + +## 使用 autodoc + Sphinx 实现 python api 文档(html) + +1. 修改 docs/source/conf.py +```py3 +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = 'netrans' +copyright = '2025, ccyh' +author = 'xj' +release = '0.1' + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +import os +import sys + +sys.path.append('../../netrans_py/') +sys.path.append('../../') + +# Sphinx 扩展 +extensions = [ + 'sphinx.ext.autodoc', # 自动生成文档 + 'sphinx.ext.viewcode', # 添加源代码链接 + 'sphinx.ext.napoleon', # 支持 NumPy 和 Google 风格的 docstring +] + +# 主题 +html_theme = 'sphinx_rtd_theme' + +templates_path = ['_templates'] +exclude_patterns = [] + +language = 'zh' + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = 'alabaster' +html_static_path = ['_static'] + +source_suffix = { + '.rst': 'restructuredtext', + '.md': 'markdown', +} +``` + +2. sphinx-apidoc -o docs/source/ . +生成 netrans_py 下所有的 *.py 的rst, 并添加到index.rst里. +```text +# index.rst + +``` + +3. sphinx-build -b html docs/source docs/build + + +## 使用 autodoc + Sphinx 实现 python api 文档(pdf) +1. 在可以生成 html的 基础上, 使用make latexodf 生成 *.tex文件. +这一步会报错,原因是无法识别中文 + +2.修改 netrans.tex文件 +``` +cd build/latex +vim netrans.tex +``` + +在各种usapackage的地方新增: +``` +\usepackage[UTF8, fontset=ubuntu]{ctex} +``` + +3. 使用 xelatex 生成pdf +sphinx使用的是 xelatex 而非 pdflatex +``` +xelatex netrans.tex +``` + + + +## 常见报错 + +报错 +```log +sphinx-quickstart +Traceback (most recent call last): + File "/home/xj/app/miniforge3/envs/sphinx/bin/sphinx-quickstart", line 8, in + sys.exit(main()) + File "/home/xj/app/miniforge3/envs/sphinx/lib/python3.10/site-packages/sphinx/cmd/quickstart.py", line 721, in main + locale.setlocale(locale.LC_ALL, '') + File "/home/xj/app/miniforge3/envs/sphinx/lib/python3.10/locale.py", line 620, in setlocale + return _setlocale(category, locale) +locale.Error: unsupported locale setting +``` + +解决: +export LC_ALL=en_US.UTF-8 diff --git a/docs/html/_sources/import_model.rst.txt b/docs/html/_sources/import_model.rst.txt new file mode 100644 index 0000000..3070a3a --- /dev/null +++ b/docs/html/_sources/import_model.rst.txt @@ -0,0 +1,7 @@ +import\_model module +==================== + +.. automodule:: import_model + :members: + :show-inheritance: + :undoc-members: diff --git a/docs/html/_sources/index.rst.txt b/docs/html/_sources/index.rst.txt new file mode 100644 index 0000000..b879337 --- /dev/null +++ b/docs/html/_sources/index.rst.txt @@ -0,0 +1,22 @@ +.. netrans documentation master file, created by + sphinx-quickstart on Fri Jun 27 15:04:57 2025. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +netrans documentation +===================== +netrans 是一套针对pnna 芯片的模型处理工具,提供命令行工具 netrans_cli 和 python api netrans_py, 其核心功能是将模型权重转换成在pnna芯片上运行的 nbg(network binary graph)格式(.nb 为后缀)。 + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + quick_start_guide + netrans_cli + netrans_py + appendix + + + + + diff --git a/docs/html/_sources/infer.rst.txt b/docs/html/_sources/infer.rst.txt new file mode 100644 index 0000000..c4956c8 --- /dev/null +++ b/docs/html/_sources/infer.rst.txt @@ -0,0 +1,7 @@ +infer module +============ + +.. automodule:: infer + :members: + :show-inheritance: + :undoc-members: diff --git a/docs/html/_sources/modules.rst.txt b/docs/html/_sources/modules.rst.txt new file mode 100644 index 0000000..9dc7f38 --- /dev/null +++ b/docs/html/_sources/modules.rst.txt @@ -0,0 +1,17 @@ +netrans_py +========== + +.. toctree:: + :maxdepth: 4 + + netrans + config + dump + example + export + file_model + import_model + infer + quantize + quantize_hb + utils diff --git a/docs/html/_sources/netrans.rst.txt b/docs/html/_sources/netrans.rst.txt new file mode 100644 index 0000000..185aa4d --- /dev/null +++ b/docs/html/_sources/netrans.rst.txt @@ -0,0 +1,7 @@ +netrans module +============== + +.. automodule:: netrans + :members: + :show-inheritance: + :undoc-members: diff --git a/docs/html/_sources/netrans_cli.md.txt b/docs/html/_sources/netrans_cli.md.txt new file mode 100644 index 0000000..fac7df1 --- /dev/null +++ b/docs/html/_sources/netrans_cli.md.txt @@ -0,0 +1,192 @@ +# netrans_cli 使用 + +netrans_cli 是 netrans 进行模型转换的命令行工具,使用 ntrans_cli 完成模型转换的步骤如下: + +1. 导入模型 +2. 生成并修改前处理配置文件 *_inputmeta.yml +3. 量化模型 +4. 导出模型 + +## netrans_cli 脚本 + +|脚本|功能|使用| +|:---|---|---| +|load.sh| 模型导入功能,将模型转换成 Pnna 支持的格式| load.sh model_name| +|config.sh| 预处理模版生成功能,生成预处理模版,根据模型进行对于的修改| config.sh model_name| +|quantize.sh| 量化功能, 对模型进行量化生成量化参数文件| quantize.sh model_name quantize_data_type| +|export.sh|导出功能,将量化好的模型导出成 Pnna 上可以运行的runtime| export.sh model_name quantize_data_type| + +对于不同框架下训练的模型,需要准备不同的数据,所有的数据都需要与模型放在同一个文件夹下,模型文件名和文件夹名需要保持一致。 + +## load.sh 模型导入 + +使用 load.sh 导入模型 + +- 用法: load.sh 以模型文件名命名的模型数据文件夹,例如: + + ```bash + load.sh lenet + ``` + + "lenet"是文件夹名,也作为模型名和权重文件名。导入会打印相关日志信息,成功后会打印SUCESS。导入后lenet文件夹应该有"lenet.json"和"lenet.data"文件: + + ```bash + $ ls -lrt lenet + total 3396 + -rwxr-xr-x 1 hope hope 1727201 Nov 5 2018 lenet.pb + -rw-r--r-- 1 hope hope 553 Nov 5 2018 0.jpg + -rwxr--r-- 1 hope hope 6 Apr 21 17:04 dataset.txt + -rw-rw-r-- 1 hope hope 69 Jun 7 09:19 inputs_outputs.txt + -rw-r--r-- 1 hope hope 5553 Jun 7 09:21 lenet.json + -rw-r--r-- 1 hope hope 1725178 Jun 7 09:21 lenet.data + ``` + +## config.sh 预处理配置文件生成 + +使用 config.sh 生成 inputmeta 文件 + +- config.sh 以模型文件名命名的模型数据文件夹,例如: + + ```bash + config.sh lenet + ``` + + inputmeta 文件生成会打印相关日志信息,成功后会打印SUCESS。导入后lenet文件夹应该有 "lenet_inputmeta.yml" 文件: + + ```shell + $ ls -lrt lenet + total 3400 + -rwxr-xr-x 1 hope hope 1727201 Nov 5 2018 lenet.pb + -rw-r--r-- 1 hope hope 553 Nov 5 2018 0.jpg + -rwxr--r-- 1 hope hope 6 Apr 21 17:04 dataset.txt + -rw-rw-r-- 1 hope hope 69 Jun 7 09:19 inputs_outputs.txt + -rw-r--r-- 1 hope hope 5553 Jun 7 09:21 lenet.json + -rw-r--r-- 1 hope hope 1725178 Jun 7 09:21 lenet.data + -rw-r--r-- 1 hope hope 948 Jun 7 09:35 lenet_inputmeta.yml + ``` + + 可以看到,最终生成的是*.yml文件,该文件用于为Netrans中间模型配置输入层数据集合。Netrans中的量化、推理、导出和图片转dat的操作都需要用到这个文件。因此,此步骤不可跳过。 + +Inputmeta.yml文件结构如下: + +```yaml +%YAML 1.2 +--- +# !!!This file disallow TABs!!! +# "category" allowed values: "image, undefined" +# "database" allowed types: "H5FS, SQLITE, TEXT, LMDB, NPY, GENERATOR" +# "tensor_name" only support in H5FS database +# "preproc_type" allowed types:"IMAGE_RGB, IMAGE_RGB888_PLANAR, IMAGE_RGB888_PLANAR_SEP, +IMAGE_I420, +# IMAGE_NV12, IMAGE_YUV444, IMAGE_GRAY, IMAGE_BGRA, TENSOR" +input_meta: + databases: + - path: dataset.txt + type: TEXT + ports: + - lid: data_0 + category: image + dtype: float32 + sparse: false + tensor_name: + layout: nhwc + shape: + - 50 + - 224 + - 224 + - 3 + preprocess: + reverse_channel: false + mean: + - 103.94 + - 116.78 + - 123.67 + scale: 0.017 + preproc_node_params: + preproc_type: IMAGE_RGB + add_preproc_node: false + preproc_perm: + - 0 + - 1 + - 2 + - 3 + - lid: label_0 + redirect_to_output: true + category: undefined + tensor_name: + dtype: float32 + shape: + - 1 + - 1 +``` + +上面示例文件的各个参数解释: + +```{table} +:widths: 20, 80 +:align: left +| 参数 | 说明 | +| :--- | --- | +| input_meta | 预处理参数配置申明。 | +| databases | 数据配置,包括设置 path、type 和 ports 。| +| path | 数据集文件的相对(执行目录)或绝对路径。默认为 dataset.txt, 不建议修改。 | +| type | 数据集文件格式,固定为TEXT。 | +| ports | 指向网络中的输入或重定向的输入,目前只支持一个输入,如果网络存在多个输入,请与@ccyh联系。 | +| lid | 输入层的lid | +| category | 输入的类别。将此参数设置为以下值之一:image(图像输入)或 undefined(其他类型的输入)。 | +| dtype | 输入张量的数据类型,用于将数据发送到 Pnna 网络的输入端口。支持的数据类型包括 float32 和 quantized。 | +| sparse | 指定网络张量是否以稀疏格式存在。将此参数设置为以下值之一:true(稀疏格式)或 false(压缩格式)。 | +| tensor_name | 留空此参数 | +| layout | 输入张量的格式,使用 nchw 用于 Caffe、Darknet、ONNX 和 PyTorch 模型。使用 nhwc 用于 TensorFlow、TensorFlow Lite 和 Keras 模型。 | +| shape | 此张量的形状。第一维,shape[0],表示每批的输入数量,允许在一次推理操作之前将多个输入发送到网络。如果batch维度设置为0,则需要从命令行指定--batch-size。如果 batch维度设置为大于1的值,则直接使用inputmeta.yml中的batch size并忽略命令行中的--batch-size。 | +| fitting | 保留字段 | +| preprocess | 预处理步骤和顺序。预处理支持下面的四个键,键的顺序代表预处理的顺序。您可以相应地调整顺序。 | +| reverse_channel | 指定是否保留通道顺序。将此参数设置为以下值之一:true(保留通道顺序)或 false(不保留通道顺序)。对于 TensorFlow 和 TensorFlow Lite 框架的模型使用 true。 | +| mean | 用于每个通道的均值。 | +| scale | 张量的缩放值。均值和缩放值用于根据公式 (inputTensor - mean) × scale 归一化输入张量。| +| preproc_node_params | 预处理节点参数,在 OVxlib C 项目案例中启用预处理任务 | +| add_preproc_node | 用于处理 OVxlib C 项目案例中预处理节点的插入。[true, false] 中的布尔值,表示通过配置以下参数将预处理层添加到导出的应用程序中。此参数仅在 add_preproc_node 参数设置为 true 时有效。| +| preproc_type | 预处理节点输入类型。 [IMAGE_RGB, IMAGE_RGB888_PLANAR,IMAGE_YUV420, IMAGE_GRAY, IMAGE_BGRA, TENSOR] 中的字符串值 | +| preproc_perm | 预处理节点输入的置换参数。 | +| redirect_to_output | 将database张量重定向到图形输出的特殊属性。如果为该属性设置了一个port,网络构建器将自动为该port生成一个输出层,以便后处理文件可以直接处理来自database的张量。 如果使用网络进行分类,则上例中的lid“input_0”表示输入数据集的标签lid。 您可以设置其他名称来表示标签的lid。 请注意,redirect_to_output 必须设置为 true,以便后处理文件可以直接处理来自database的张量。 标签的lid必须与后处理文件中定义的 labels_tensor 的lid相同。 [true, false] 中的布尔值。 指定是否将由张量表示的输入端口的数据直接发送到网络输出。true(直接发送到网络输出)或 false(不直接发送到网络输出)| +``` + +可以根据实际情况对生成的inputmeta文件进行修改。 + +## quantize.sh 模型量化 + +如果我们训练好的模型的数据类型是float32的,为了使模型以更高的效率在Pnna上运行,我们可以对模型进行量化操作,量化操作可能会带来一定程度的精度损失。 + +- 在netrans_cli目录下使用quantize.sh脚本进行量化操作。 + +用法:./quantize.sh 以模型文件名命名的模型数据文件夹 量化类型,例如: + +```bash +quantize.sh lenet uint8 +``` + +支持的量化类型有:uint8、int8、int16 + +## export.sh 模型导出 + +使用 export.sh 导出模型生成nbg文件。 + +用法:export.sh 以模型文件名命名的模型数据文件夹 数据类型,例如: + +```bash +export.sh lenet uint8 +``` + +导出支持的数据类型:float、uint8、int8、int16,其中使用uint8、int8、int16导出时需要先进行模型量化。导出的工程会在模型所在的目录下面的wksp目录里。 +network_binary.nb文件在"asymmetric_affine"文件夹中: + +```shell +ls -lrt lenet/wksp/asymmetric_affine/ +-rw-r--r-- 1 hope hope 694912 Jun 7 09:55 network_binary.nb +``` + +目前支持将生成的network_binary.nb文件部署到Pnna硬件平台。具体部署方法请参阅模型部署相关文档。 + +## 使用示例 + +请参照examples,examples 提供 [caffe 模型转换示例](./examples/caffe_model.md),[darknet 模型转换示例](./examples/darknet_model.md),[tensorflow 模型转换示例](./examples/tensorflow_model.md),[onnx 模型转换示例](./examples/onnx_model.md)。 diff --git a/docs/html/_sources/netrans_py.md.txt b/docs/html/_sources/netrans_py.md.txt new file mode 100644 index 0000000..654ea87 --- /dev/null +++ b/docs/html/_sources/netrans_py.md.txt @@ -0,0 +1,167 @@ +# netrans_py 使用 + +netrans_py 为 Netrans 编译器的 python 调用接口。 +使用 ntrans_py 完成模型转换的步骤如下: + +1. 导入模型 +2. 生成并修改前处理配置文件 *_inputmeta.yml +3. 量化模型 +4. 导出模型 + +## Netrans 类 + +创建 Netrans + + 描述: 实例化 Netrans 类。 + 代码示例: + + ```py3 + from netrans import Netrans + yolo_netrans = Netrans("../examples/darknet/yolov4_tiny") + ``` + + 参数 + +| 参数名 | 类型 | 说明 | +|:---| -- | -- | +|model_path| str| 第一位置参数,模型文件的路径| +|netans| str | 如果 NETRANS_PATH 没有设置,可通过该参数指定netrans的路径| + +输出返回: +无。 + + + +## Netrans.import 模型导入 + + 描述: 将模型转换成 Pnna 支持的格式。 + 代码示例: + + ```py3 + yolo_netrans.import() + ``` + + 参数: + 无。 + + 输出返回: + 无。 + 在工程目录下生成 Pnna 支持的模型格式,以.json结尾的模型文件和 .data结尾的权重文件。 + +## Netrans.config 预处理配置文件生成 + + 描述: 将模型转换成 Pnna 支持的格式。 + 代码示例: + + ```py3 + yolo_netrans.config() + ``` + + 参数: + +```{table} +:widths: 20, 30, 50 +:align: left + | 参数名 | 类型 | 说明 | +|:---| -- | -- | +|inputmeta| bool,str, [Fasle, True, "inputmeta_filepath"] | 指定 inputmeta, 默认为False。
如果为False,则会生成inputmeta模板,可使用mean、scale、reverse_channel 配合修改常用参数。
如果已有现成的 inputmeta 文件,则可通过该参数进行指定,也可使用True, 则会自动索引 model_name_inputmeta.yml | +|mean| float, int, list | 设置预处理中 normalize 的 mean 参数 | +|scale| float, int, list | 设置预处理中 normalize 的 scale 参数 | +|reverse_channel | bool | 设置预处理中的 reverse_channel 参数 | +``` + + 输出返回: + 无。 + +## Netrans.quantize 模型量化 + +描述: 对模型生成量化配置文件。 +代码示例: + +```py3 +yolo_netrans.quantize("uint8") +``` + +参数: + +```{table} +:widths: 20, 30, 50 +:align: left +| 参数名 | 类型 | 说明 | +|:---| -- | -- | +|quantize_type| str| 第一位置参数,模型量化类型,仅支持 "uint8", "int8", "int16"| +``` + +输出返回: + 无。 + +## Netrans.export 模型导出 + +描述: 对模型生成量化配置文件。 +代码示例: + +```py3 +yolo_netrans.export() +``` + +参数: + 无。 + +输出返回: + 无。请在目录 “wksp/*/” 下检查是否生成nbg文件。 + +## Netrans.model2nbg 模型生成nbg文件 + +描述: 模型导入、量化、及nbg文件生产 +代码示例: + +```py3 + # 无预处理 +yolo_netrans.model2nbg(quantize_type='uint8') + # 需要对数据进行normlize, menas为128, scale 为 0.0039 +yolo_netrans.model2nbg(quantize_type='uint8',mean=128, scale = 0.0039) + # 需要对数据分通道进行normlize, menas为128,127,125,scale 为 0.0039, 且reverse_channel 为 True +yolo_netrans.model2nbg(quantize_type='uint8'mean=[128, 127, 125], scale = 0.0039, reverse_channel= True) + # 已经进行初始化设置 +yolo_netrans.model2nbg(quantize_type='uint8', inputmeta=True) + +``` + +参数 + +```{table} +:widths: 20, 30, 50 +:align: left +| 参数名 | 类型 | 说明 | +|:---| -- | -- | +|quantize_type| str, ["uint8", "int8", "int16" ] | 量化类型,将模型量化成该参数指定的类型 | +|inputmeta| bool,str, [Fasle, True, "inputmeta_filepath"] | 指定 inputmeta, 默认为False。
如果为False,则会生成inputmeta模板,可使用mean、scale、reverse_channel 配合修改常用参数。
如果已有现成的 inputmeta 文件,则可通过该参数进行指定,也可使用True, 则会自动索引 model_name_inputmeta.yml | +|mean| float, int, list | 设置预处理中 normalize 的 mean 参数 | +|scale| float, int, list | 设置预处理中 normalize 的 scale 参数 | +|reverse_channel | bool | 设置预处理中的 reverse_channel 参数 | +``` + +输出返回: +请在目录 “wksp/*/” 下检查是否生成nbg文件。 + +## 使用示例 + + ```py3 +from nertans import Netrans +model_path = 'example/darknet/yolov4_tiny' +netrans_path = "netrans/bin" # 如果进行了export定义申明,这一步可以不用 + +# 初始化netrans +net = Netrans(model_path,netrans=netrans_path) +# 模型载入 +net.import() +# 配置预处理 normlize 的参数 +net.config(scale=1,mean=0) +# 模型量化 +net.quantize("uint8") +# 模型导出 +net.export() + +# 模型直接量化成 int16 并导出, 直接复用刚配置好的 inputmeta +net.model2nbg(quantize_type = "int16", inputmeta=True) +``` diff --git a/docs/html/_sources/quantize.rst.txt b/docs/html/_sources/quantize.rst.txt new file mode 100644 index 0000000..e90888d --- /dev/null +++ b/docs/html/_sources/quantize.rst.txt @@ -0,0 +1,7 @@ +quantize module +=============== + +.. automodule:: quantize + :members: + :show-inheritance: + :undoc-members: diff --git a/docs/html/_sources/quantize_hb.rst.txt b/docs/html/_sources/quantize_hb.rst.txt new file mode 100644 index 0000000..173d001 --- /dev/null +++ b/docs/html/_sources/quantize_hb.rst.txt @@ -0,0 +1,7 @@ +quantize\_hb module +=================== + +.. automodule:: quantize_hb + :members: + :show-inheritance: + :undoc-members: diff --git a/docs/html/_sources/quick_start_guide.md.txt b/docs/html/_sources/quick_start_guide.md.txt new file mode 100644 index 0000000..338720a --- /dev/null +++ b/docs/html/_sources/quick_start_guide.md.txt @@ -0,0 +1,160 @@ +# 快速入门 + +本文档以 onnx 格式的 yolov5s 为例,演示如何快速安装Nertans 并使用 Netrans 量化、编译模型并生成 nbg 文件。 + +## 系统环境 + +- Linux操作系统,推荐 Ubuntu 20.04 或 Debian12 +- Python 3.8 +- RAM 至少 8GB + +## 安装Netrans + +创建 python3.8 环境 + +```bash +wget "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh" +mkdir -p ~/app +INSTALL_PATH="${HOME}/app/miniforge3" +bash Miniforge3-Linux-x86_64.sh -b -p ${INSTALL_PATH} +echo "source "${INSTALL_PATH}/etc/profile.d/conda.sh"" >> ${HOME}/.bashrc +echo "source "${INSTALL_PATH}/etc/profile.d/mamba.sh"" >> ${HOME}/.bashrc +source ${HOME}/.bashrc +mamba create -n netrans python=3.8 -y +mamba activate netrans +``` + +下载 Netrans + +```bash +cd ~/app +git clone https://gitlink.org.cn/nudt_dsp/netrans.git +``` + +配置 Netrans + +```bash +cd ~/app/netrans +./setup.sh +``` + +## 使用 Netrans 编译 yolov5s 模型 + +进入工作目录 + +```bash +cd ~/app/netrans/examples/onnx +``` + +此时目录如下: + +```text +onnx/ +├── README.md +└── yolov5s + ├── 0.jpg + ├── dataset.txt + └── yolov5s.onnx +``` + +### 使用 netrans_cli 编译 yolov5s + +#### 导入模型 + +```bash +load.sh yolov5s +``` + +该命令会在工程目录下生成包含模型信息的 .json 和 .data 数据文件。 + +此时 yolov5s 的目录结构如下 + +```text +yolov5s/ +├── 0.jpg +├── yolov5s.data +├── yolov5s.json +└── yolov5s.onnx +``` + +#### 生成配置文件模板 + +配置文件定义输入数据前处理相关参数。Netrans预定义了配置文件模板生成脚本,用户需根据模型前处理参数对配置文件进行修改。 + +```bash +config.sh yolov5s +``` + +此时 yolov5s 的目录结构如下: + +```text +yolov5s/ +├── 0.jpg +├── dataset.txt +├── yolov5s.data +├── yolov5s_inputmeta.yml +├── yolov5s.json +└── yolov5s.onnx + +``` + +根据 yolov5s 的前处理参数 ,修改 yml 中的 scale 为 0.003921568627。 +打开 ` yolov5s_inputmeta.yml ` 文件,修改第30-33行: + +```text + scale: + - 0.003921568627 + - 0.003921568627 + - 0.003921568627 +``` + +#### 量化模型 + +生成 unit8 量化的量化参数文件 + +```bash +quantize.sh yolov5s uint8 +``` + +此时 yolov5s 的目录结构如下: + +```text +yolov5s/ +├── 0.jpg +├── dataset.txt +├── yolov5s_asymmetric_affine.quantize +├── yolov5s.data +├── yolov5s_inputmeta.yml +├── yolov5s.json +└── yolov5s.onnx +``` + +#### 导出模型 + +导出 unit8 量化的模型项目工程 + +```bash +export.sh yolov5s uint8 +``` + +此时 yolov5s 的目录结构如下: + +```text +yolov5s/ +├── 0.jpg +├── dataset.txt +├── wksp +│ └── asymmetric_affine +│ └── network_binary.nb +├── yolov5s_asymmetric_affine.quantize +├── yolov5s.data +├── yolov5s_inputmeta.yml +├── yolov5s.json +└── yolov5s.onnx +``` + +### 使用 netrans_py 编译 yolov5s 模型 + +```bash +example.py yolov5s -q uint8 -m 0 -s 0.003921568627 +``` diff --git a/docs/html/_sources/setup.rst.txt b/docs/html/_sources/setup.rst.txt new file mode 100644 index 0000000..1084cc6 --- /dev/null +++ b/docs/html/_sources/setup.rst.txt @@ -0,0 +1,7 @@ +setup module +============ + +.. automodule:: setup + :members: + :show-inheritance: + :undoc-members: diff --git a/docs/html/_sources/utils.rst.txt b/docs/html/_sources/utils.rst.txt new file mode 100644 index 0000000..fe1efad --- /dev/null +++ b/docs/html/_sources/utils.rst.txt @@ -0,0 +1,7 @@ +utils module +============ + +.. automodule:: utils + :members: + :show-inheritance: + :undoc-members: diff --git a/docs/html/_static/alabaster.css b/docs/html/_static/alabaster.css new file mode 100644 index 0000000..7e75bf8 --- /dev/null +++ b/docs/html/_static/alabaster.css @@ -0,0 +1,663 @@ +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: Georgia, serif; + font-size: 17px; + background-color: #fff; + color: #000; + margin: 0; + padding: 0; +} + + +div.document { + width: 940px; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 220px; +} + +div.sphinxsidebar { + width: 220px; + font-size: 14px; + line-height: 1.5; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #fff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +div.body > .section { + text-align: left; +} + +div.footer { + width: 940px; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: inherit; + font-size: inherit; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar { + max-height: 100%; + overflow-y: auto; +} + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Georgia, serif; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: Georgia, serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox { + margin: 1em 0; +} + +div.sphinxsidebar .search > div { + display: table-cell; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +div.sphinxsidebar .badge { + border-bottom: none; +} + +div.sphinxsidebar .badge:hover { + border-bottom: none; +} + +/* To address an issue with donation coming after search */ +div.sphinxsidebar h3.donation { + margin-top: 10px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Georgia, serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fafafa; +} + +div.admonition p.admonition-title { + font-family: Georgia, serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #EEE; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.field-list p { + margin-bottom: 0.8em; +} + +/* Cloned from + * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 + */ +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +table.footnote td.label { + width: .1px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + /* Matches the 30px from the narrow-screen "li > ul" selector below */ + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: unset; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +div.viewcode-block:target { + background: #ffd; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fff; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +/* Don't put an underline on images */ +a.image-reference, a.image-reference:hover { + border-bottom: none; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + +@media screen and (max-width: 940px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: #fff; + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.sphinxsidebar { + display: block; + float: none; + width: unset; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: #fff; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + min-width: auto; /* fixes width on small screens, breaks .hll */ + padding: 0; + } + + .hll { + /* "fixes" the breakage */ + width: max-content; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } + + ul { + margin-left: 0; + } + + li > ul { + /* Matches the 30px from the "ul, ol" selector above */ + margin-left: 30px; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Hide ugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + + +/* relbar */ + +.related { + line-height: 30px; + width: 100%; + font-size: 0.9rem; +} + +.related.top { + border-bottom: 1px solid #EEE; + margin-bottom: 20px; +} + +.related.bottom { + border-top: 1px solid #EEE; +} + +.related ul { + padding: 0; + margin: 0; + list-style: none; +} + +.related li { + display: inline; +} + +nav#rellinks { + float: right; +} + +nav#rellinks li+li:before { + content: "|"; +} + +nav#breadcrumbs li+li:before { + content: "\00BB"; +} + +/* Hide certain items when printing */ +@media print { + div.related { + display: none; + } +} + +img.github { + position: absolute; + top: 0; + border: 0; + right: 0; +} \ No newline at end of file diff --git a/docs/html/_static/basic.css b/docs/html/_static/basic.css new file mode 100644 index 0000000..0028826 --- /dev/null +++ b/docs/html/_static/basic.css @@ -0,0 +1,906 @@ +/* + * Sphinx stylesheet -- basic theme. + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin-top: 10px; +} + +ul.search li { + padding: 5px 0; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: inherit; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/html/_static/custom.css b/docs/html/_static/custom.css new file mode 100644 index 0000000..2a924f1 --- /dev/null +++ b/docs/html/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/docs/html/_static/doctools.js b/docs/html/_static/doctools.js new file mode 100644 index 0000000..0398ebb --- /dev/null +++ b/docs/html/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/docs/html/_static/documentation_options.js b/docs/html/_static/documentation_options.js new file mode 100644 index 0000000..57fc22d --- /dev/null +++ b/docs/html/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.1', + LANGUAGE: 'zh', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/docs/html/_static/file.png b/docs/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/docs/html/_static/github-banner.svg b/docs/html/_static/github-banner.svg new file mode 100644 index 0000000..c47d9dc --- /dev/null +++ b/docs/html/_static/github-banner.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/_static/language_data.js b/docs/html/_static/language_data.js new file mode 100644 index 0000000..c7fe6c6 --- /dev/null +++ b/docs/html/_static/language_data.js @@ -0,0 +1,192 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/docs/html/_static/minus.png b/docs/html/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/docs/html/_static/plus.png b/docs/html/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/docs/html/_static/pygments.css b/docs/html/_static/pygments.css new file mode 100644 index 0000000..9392ddc --- /dev/null +++ b/docs/html/_static/pygments.css @@ -0,0 +1,84 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #8F5902; font-style: italic } /* Comment */ +.highlight .err { color: #A40000; border: 1px solid #EF2929 } /* Error */ +.highlight .g { color: #000 } /* Generic */ +.highlight .k { color: #004461; font-weight: bold } /* Keyword */ +.highlight .l { color: #000 } /* Literal */ +.highlight .n { color: #000 } /* Name */ +.highlight .o { color: #582800 } /* Operator */ +.highlight .x { color: #000 } /* Other */ +.highlight .p { color: #000; font-weight: bold } /* Punctuation */ +.highlight .ch { color: #8F5902; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #8F5902; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #8F5902 } /* Comment.Preproc */ +.highlight .cpf { color: #8F5902; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #8F5902; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #8F5902; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A40000 } /* Generic.Deleted */ +.highlight .ge { color: #000; font-style: italic } /* Generic.Emph */ +.highlight .ges { color: #000 } /* Generic.EmphStrong */ +.highlight .gr { color: #EF2929 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #888 } /* Generic.Output */ +.highlight .gp { color: #745334 } /* Generic.Prompt */ +.highlight .gs { color: #000; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #A40000; font-weight: bold } /* Generic.Traceback */ +.highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #000 } /* Literal.Date */ +.highlight .m { color: #900 } /* Literal.Number */ +.highlight .s { color: #4E9A06 } /* Literal.String */ +.highlight .na { color: #C4A000 } /* Name.Attribute */ +.highlight .nb { color: #004461 } /* Name.Builtin */ +.highlight .nc { color: #000 } /* Name.Class */ +.highlight .no { color: #000 } /* Name.Constant */ +.highlight .nd { color: #888 } /* Name.Decorator */ +.highlight .ni { color: #CE5C00 } /* Name.Entity */ +.highlight .ne { color: #C00; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000 } /* Name.Function */ +.highlight .nl { color: #F57900 } /* Name.Label */ +.highlight .nn { color: #000 } /* Name.Namespace */ +.highlight .nx { color: #000 } /* Name.Other */ +.highlight .py { color: #000 } /* Name.Property */ +.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #000 } /* Name.Variable */ +.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000; font-weight: bold } /* Punctuation.Marker */ +.highlight .w { color: #F8F8F8 } /* Text.Whitespace */ +.highlight .mb { color: #900 } /* Literal.Number.Bin */ +.highlight .mf { color: #900 } /* Literal.Number.Float */ +.highlight .mh { color: #900 } /* Literal.Number.Hex */ +.highlight .mi { color: #900 } /* Literal.Number.Integer */ +.highlight .mo { color: #900 } /* Literal.Number.Oct */ +.highlight .sa { color: #4E9A06 } /* Literal.String.Affix */ +.highlight .sb { color: #4E9A06 } /* Literal.String.Backtick */ +.highlight .sc { color: #4E9A06 } /* Literal.String.Char */ +.highlight .dl { color: #4E9A06 } /* Literal.String.Delimiter */ +.highlight .sd { color: #8F5902; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4E9A06 } /* Literal.String.Double */ +.highlight .se { color: #4E9A06 } /* Literal.String.Escape */ +.highlight .sh { color: #4E9A06 } /* Literal.String.Heredoc */ +.highlight .si { color: #4E9A06 } /* Literal.String.Interpol */ +.highlight .sx { color: #4E9A06 } /* Literal.String.Other */ +.highlight .sr { color: #4E9A06 } /* Literal.String.Regex */ +.highlight .s1 { color: #4E9A06 } /* Literal.String.Single */ +.highlight .ss { color: #4E9A06 } /* Literal.String.Symbol */ +.highlight .bp { color: #3465A4 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #000 } /* Name.Function.Magic */ +.highlight .vc { color: #000 } /* Name.Variable.Class */ +.highlight .vg { color: #000 } /* Name.Variable.Global */ +.highlight .vi { color: #000 } /* Name.Variable.Instance */ +.highlight .vm { color: #000 } /* Name.Variable.Magic */ +.highlight .il { color: #900 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/html/_static/searchtools.js b/docs/html/_static/searchtools.js new file mode 100644 index 0000000..91f4be5 --- /dev/null +++ b/docs/html/_static/searchtools.js @@ -0,0 +1,635 @@ +/* + * Sphinx JavaScript utilities for the full-text search. + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename, kind] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename, kind] = item; + + let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + SearchResultKind.title, + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + SearchResultKind.index, + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + SearchResultKind.object, + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + // find documents, if any, containing the query word in their text/title term indices + // use Object.hasOwnProperty to avoid mismatching against prototype properties + const arr = [ + { files: terms.hasOwnProperty(word) ? terms[word] : undefined, score: Scorer.term }, + { files: titleTerms.hasOwnProperty(word) ? titleTerms[word] : undefined, score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, new Map()); + const fileScores = scoreMap.get(file); + fileScores.set(word, record.score); + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file).get(w))); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + SearchResultKind.text, + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/docs/html/_static/sphinx_highlight.js b/docs/html/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/docs/html/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/docs/html/appendix.html b/docs/html/appendix.html new file mode 100644 index 0000000..3848981 --- /dev/null +++ b/docs/html/appendix.html @@ -0,0 +1,140 @@ + + + + + + + + 附录 — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/html/config.html b/docs/html/config.html new file mode 100644 index 0000000..ed2713a --- /dev/null +++ b/docs/html/config.html @@ -0,0 +1,136 @@ + + + + + + + + config module — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

config module

+
+
+class config.Config(source_obj)[源代码]
+

基类:AttributeCopier

+

从实例化的 Netrans 中解析模型参数,并基于pnnacc 生成配置文件模板

+
+
参数:
+

Netrans (class) -- 实例化的Netrans类,包含 模型信息 和 Netrans 信息

+
+
+
+
+inputmeta_gen(*args, **kargs)
+
+ +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/dump.html b/docs/html/dump.html new file mode 100644 index 0000000..4c43501 --- /dev/null +++ b/docs/html/dump.html @@ -0,0 +1,119 @@ + + + + + + + + dump module — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

dump module

+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/example.html b/docs/html/example.html new file mode 100644 index 0000000..8a71d25 --- /dev/null +++ b/docs/html/example.html @@ -0,0 +1,124 @@ + + + + + + + + example module — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

example module

+
+
+example.main()[源代码]
+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/export.html b/docs/html/export.html new file mode 100644 index 0000000..1580100 --- /dev/null +++ b/docs/html/export.html @@ -0,0 +1,141 @@ + + + + + + + + export module — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

export module

+
+
+class export.Export(source_obj)[源代码]
+

基类:AttributeCopier

+

从实例化的 Netrans 中解析模型参数,并基于 pnnacc 导出模型ngb文件

+
+
参数:
+

Netrans (class) -- 实例化的Netrans类,包含 模型信息 和 Netrans 信息

+
+
+
+
+export_network(*args, **kargs)
+
+ +
+ +
+
+export.main()[源代码]
+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/file_model.html b/docs/html/file_model.html new file mode 100644 index 0000000..272aa53 --- /dev/null +++ b/docs/html/file_model.html @@ -0,0 +1,119 @@ + + + + + + + + file_model module — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

file_model module

+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/gen_api.html b/docs/html/gen_api.html new file mode 100644 index 0000000..b185ea6 --- /dev/null +++ b/docs/html/gen_api.html @@ -0,0 +1,249 @@ + + + + + + + + gen api html & pdf by sphinx — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

gen api html & pdf by sphinx

+

netrans 目录结构如下

+
netrans/
+│
+├── docs/                # Sphinx 项目的根目录
+│   ├── source/          # 源文件目录
+│   │   ├── _static/     # 静态文件(如图片、CSS、JS)
+│   │   ├── _templates/  # 自定义模板
+│   │   ├── conf.py      # 配置文件
+│   │   ├── index.rst    # 主页文件
+│   │   └── my_module.rst # 其他文档文件
+│   └── build/           # 构建输出目录(生成的 HTML 文件等)
+│
+└── bin/         
+└── netrans_cli/          
+└── netrans_py/           
+
+
+
    +
  1. sphinx-quickstart docs/ 快速生成

  2. +
  3. 修改 docs/source/conf.py ,

  4. +
+
+

*.rst

+

rst, reStructuredText 文件,用于定义文档的结构。通常放在source目录下。

+

rst 是一种和 markdown 类似的语法

+

使用目录树指令 .. toctree::,列出其他文档文件。

+
+
+

使用 autodoc + Sphinx 实现 python api 文档(html)

+
    +
  1. 修改 docs/source/conf.py

  2. +
+
# Configuration file for the Sphinx documentation builder.
+#
+# For the full list of built-in configuration values, see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Project information -----------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
+
+project = 'netrans'
+copyright = '2025, ccyh'
+author = 'xj'
+release = '0.1'
+
+# -- General configuration ---------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
+
+import os
+import sys
+
+sys.path.append('../../netrans_py/')
+sys.path.append('../../')
+
+# Sphinx 扩展
+extensions = [
+    'sphinx.ext.autodoc',    # 自动生成文档
+    'sphinx.ext.viewcode',   # 添加源代码链接
+    'sphinx.ext.napoleon',   # 支持 NumPy 和 Google 风格的 docstring
+]
+
+# 主题
+html_theme = 'sphinx_rtd_theme'
+
+templates_path = ['_templates']
+exclude_patterns = []
+
+language = 'zh'
+
+# -- Options for HTML output -------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
+
+html_theme = 'alabaster'
+html_static_path = ['_static']
+
+source_suffix = {
+    '.rst': 'restructuredtext',
+    '.md': 'markdown',
+}
+
+
+
    +
  1. sphinx-apidoc -o docs/source/ . +生成 netrans_py 下所有的 *.py 的rst, 并添加到index.rst里.

  2. +
+
# index.rst
+
+
+
    +
  1. sphinx-build -b html docs/source docs/build

  2. +
+
+
+

使用 autodoc + Sphinx 实现 python api 文档(pdf)

+
    +
  1. 在可以生成 html的 基础上, 使用make latexodf 生成 *.tex文件. +这一步会报错,原因是无法识别中文

  2. +
+

2.修改 netrans.tex文件

+
cd build/latex
+vim netrans.tex
+
+
+

在各种usapackage的地方新增:

+
\usepackage[UTF8, fontset=ubuntu]{ctex}
+
+
+
    +
  1. 使用 xelatex 生成pdf +sphinx使用的是 xelatex 而非 pdflatex

  2. +
+
xelatex netrans.tex 
+
+
+
+
+

常见报错

+

报错

+
sphinx-quickstart
+Traceback (most recent call last):
+  File "/home/xj/app/miniforge3/envs/sphinx/bin/sphinx-quickstart", line 8, in <module>
+    sys.exit(main())
+  File "/home/xj/app/miniforge3/envs/sphinx/lib/python3.10/site-packages/sphinx/cmd/quickstart.py", line 721, in main
+    locale.setlocale(locale.LC_ALL, '')
+  File "/home/xj/app/miniforge3/envs/sphinx/lib/python3.10/locale.py", line 620, in setlocale
+    return _setlocale(category, locale)
+locale.Error: unsupported locale setting
+
+
+

解决: +export LC_ALL=en_US.UTF-8

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/genindex.html b/docs/html/genindex.html new file mode 100644 index 0000000..ae65cd4 --- /dev/null +++ b/docs/html/genindex.html @@ -0,0 +1,341 @@ + + + + + + + 索引 — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

索引

+ +
+ A + | C + | E + | F + | I + | M + | N + | Q + | R + | U + +
+

A

+ + +
+ +

C

+ + + +
+ +

E

+ + + +
    +
  • + example + +
  • +
  • + export + +
  • +
+ +

F

+ + +
    +
  • + file_model + +
  • +
+ +

I

+ + + +
+ +

M

+ + +
+ +

N

+ + +
    +
  • + netrans + +
  • +
+ +

Q

+ + + +
    +
  • + quantize + +
  • +
  • + quantize_hb + +
  • +
+ +

R

+ + +
+ +

U

+ + +
    +
  • + utils + +
  • +
+ + + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/import_model.html b/docs/html/import_model.html new file mode 100644 index 0000000..9a3425e --- /dev/null +++ b/docs/html/import_model.html @@ -0,0 +1,267 @@ + + + + + + + + import_model module — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

import_model module

+
+
+class import_model.ImportModel(source_obj)[源代码]
+

基类:AttributeCopier

+

从实例化的 Netrans 中解析模型参数,并基于 pnnacc 导入模型

+
+
参数:
+

Netrans (class) -- 实例化的Netrans类,包含 模型信息 和 Netrans 信息

+
+
+
+
+import_network(*args, **kargs)
+
+ +
+ +
+
+import_model.check_status(result)[源代码]
+

解析命令执行情况

+
+
参数:
+

result (return of subprocrss.run) -- subprocess.run的返回值

+
+
+
+ +
+
+import_model.import_caffe_network(name, netrans_path)[源代码]
+

导入 caffe 模型

+
+
参数:
+
    +
  • name (str) -- 模型名字

  • +
  • netrans_path (str) -- 模型路径

  • +
+
+
返回:
+

生成的pnnacc 命令行, 被subprocesses执行

+
+
返回类型:
+

cmd (str)

+
+
+
+ +
+
+import_model.import_darknet_network(name, netrans_path)[源代码]
+

导入 darknet 模型

+
+
参数:
+
    +
  • name (str) -- 模型名字

  • +
  • netrans_path (str) -- 模型路径

  • +
+
+
返回:
+

生成的pnnacc 命令行, 被subprocesses执行

+
+
返回类型:
+

cmd (str)

+
+
+
+ +
+
+import_model.import_onnx_network(name, netrans_path)[源代码]
+

导入 onnx 模型

+
+
参数:
+
    +
  • name (str) -- 模型名字

  • +
  • netrans_path (str) -- 模型路径

  • +
+
+
返回:
+

生成的pnnacc 命令行, 被subprocesses执行

+
+
返回类型:
+

cmd (str)

+
+
+
+ +
+
+import_model.import_pytorch_network(name, netrans_path)[源代码]
+

导入 pytorch 模型

+
+
参数:
+
    +
  • name (str) -- 模型名字

  • +
  • netrans_path (str) -- 模型路径

  • +
+
+
返回:
+

生成的pnnacc 命令行, 被subprocesses执行

+
+
返回类型:
+

cmd (str)

+
+
+
+ +
+
+import_model.import_tensorflow_network(name, netrans_path)[源代码]
+

导入 tensorflow 模型

+
+
参数:
+
    +
  • name (str) -- 模型名字

  • +
  • netrans_path (str) -- 模型路径

  • +
+
+
返回:
+

生成的pnnacc 命令行, 被subprocesses执行

+
+
返回类型:
+

cmd (str)

+
+
+
+ +
+
+import_model.import_tflite_network(name, netrans_path)[源代码]
+

导入 tflite 模型

+
+
参数:
+
    +
  • name (str) -- 模型名字

  • +
  • netrans_path (str) -- 模型路径

  • +
+
+
返回:
+

生成的pnnacc 命令行, 被subprocesses执行

+
+
返回类型:
+

cmd (str)

+
+
+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/index.html b/docs/html/index.html new file mode 100644 index 0000000..2a170ff --- /dev/null +++ b/docs/html/index.html @@ -0,0 +1,145 @@ + + + + + + + + netrans documentation — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

netrans documentation

+

netrans 是一套针对pnna 芯片的模型处理工具,提供命令行工具 netrans_cli 和 python api netrans_py, 其核心功能是将模型权重转换成在pnna芯片上运行的 nbg(network binary graph)格式(.nb 为后缀)。

+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/infer.html b/docs/html/infer.html new file mode 100644 index 0000000..b6c9fac --- /dev/null +++ b/docs/html/infer.html @@ -0,0 +1,135 @@ + + + + + + + + infer module — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

infer module

+
+
+class infer.Infer(source_obj)[源代码]
+

基类:AttributeCopier

+
+
+inference_network(*args, **kargs)
+
+ +
+ +
+
+infer.main()[源代码]
+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/modules.html b/docs/html/modules.html new file mode 100644 index 0000000..f2ff26f --- /dev/null +++ b/docs/html/modules.html @@ -0,0 +1,193 @@ + + + + + + + + netrans_py — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/html/netrans.html b/docs/html/netrans.html new file mode 100644 index 0000000..1a3a70b --- /dev/null +++ b/docs/html/netrans.html @@ -0,0 +1,119 @@ + + + + + + + + netrans module — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

netrans module

+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/netrans_cli.html b/docs/html/netrans_cli.html new file mode 100644 index 0000000..570947a --- /dev/null +++ b/docs/html/netrans_cli.html @@ -0,0 +1,318 @@ + + + + + + + + netrans_cli 使用 — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

netrans_cli 使用

+

netrans_cli 是 netrans 进行模型转换的命令行工具,使用 ntrans_cli 完成模型转换的步骤如下:

+
    +
  1. 导入模型

  2. +
  3. 生成并修改前处理配置文件 *_inputmeta.yml

  4. +
  5. 量化模型

  6. +
  7. 导出模型

  8. +
+
+

netrans_cli 脚本

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
脚本功能使用
load.sh模型导入功能,将模型转换成 Pnna 支持的格式load.sh model_name
config.sh预处理模版生成功能,生成预处理模版,根据模型进行对于的修改config.sh model_name
quantize.sh量化功能, 对模型进行量化生成量化参数文件quantize.sh model_name quantize_data_type
export.sh导出功能,将量化好的模型导出成 Pnna 上可以运行的runtimeexport.sh model_name quantize_data_type

对于不同框架下训练的模型,需要准备不同的数据,所有的数据都需要与模型放在同一个文件夹下,模型文件名和文件夹名需要保持一致。

+
+
+

load.sh 模型导入

+

使用 load.sh 导入模型

+
    +
  • 用法: load.sh 以模型文件名命名的模型数据文件夹,例如:

    +
    load.sh lenet
    +
    +
    +

    "lenet"是文件夹名,也作为模型名和权重文件名。导入会打印相关日志信息,成功后会打印SUCESS。导入后lenet文件夹应该有"lenet.json"和"lenet.data"文件:

    +
    $ ls -lrt lenet
    +total 3396
    +-rwxr-xr-x 1 hope hope 1727201 Nov  5  2018 lenet.pb
    +-rw-r--r-- 1 hope hope     553 Nov  5  2018 0.jpg
    +-rwxr--r-- 1 hope hope       6 Apr 21 17:04 dataset.txt
    +-rw-rw-r-- 1 hope hope      69 Jun  7 09:19 inputs_outputs.txt
    +-rw-r--r-- 1 hope hope    5553 Jun  7 09:21 lenet.json
    +-rw-r--r-- 1 hope hope 1725178 Jun  7 09:21 lenet.data
    +
    +
    +
  • +
+
+
+

config.sh 预处理配置文件生成

+

使用 config.sh 生成 inputmeta 文件

+
    +
  • config.sh 以模型文件名命名的模型数据文件夹,例如:

    +
    config.sh lenet
    +
    +
    +

    inputmeta 文件生成会打印相关日志信息,成功后会打印SUCESS。导入后lenet文件夹应该有 "lenet_inputmeta.yml" 文件:

    +
     $ ls -lrt lenet
    +total 3400
    +-rwxr-xr-x 1 hope hope 1727201 Nov  5  2018 lenet.pb
    +-rw-r--r-- 1 hope hope     553 Nov  5  2018 0.jpg
    +-rwxr--r-- 1 hope hope       6 Apr 21 17:04 dataset.txt
    +-rw-rw-r-- 1 hope hope      69 Jun  7 09:19 inputs_outputs.txt
    +-rw-r--r-- 1 hope hope    5553 Jun  7 09:21 lenet.json
    +-rw-r--r-- 1 hope hope 1725178 Jun  7 09:21 lenet.data
    +-rw-r--r-- 1 hope hope     948 Jun  7 09:35 lenet_inputmeta.yml
    +
    +
    +

    可以看到,最终生成的是*.yml文件,该文件用于为Netrans中间模型配置输入层数据集合。Netrans中的量化、推理、导出和图片转dat的操作都需要用到这个文件。因此,此步骤不可跳过。

    +
  • +
+

Inputmeta.yml文件结构如下:

+
%YAML 1.2
+---
+# !!!This file disallow TABs!!!
+# "category" allowed values: "image, undefined"
+# "database" allowed types: "H5FS, SQLITE, TEXT, LMDB, NPY, GENERATOR"
+# "tensor_name" only support in H5FS database
+# "preproc_type" allowed types:"IMAGE_RGB, IMAGE_RGB888_PLANAR, IMAGE_RGB888_PLANAR_SEP, 
+IMAGE_I420, 
+# IMAGE_NV12, IMAGE_YUV444, IMAGE_GRAY, IMAGE_BGRA, TENSOR"
+input_meta:
+ databases:
+ - path: dataset.txt
+ type: TEXT
+ ports:
+ - lid: data_0
+ category: image
+ dtype: float32
+ sparse: false
+ tensor_name:
+ layout: nhwc
+ shape:
+ - 50
+ - 224
+ - 224
+ - 3
+ preprocess:
+ reverse_channel: false
+ mean:
+ - 103.94
+ - 116.78
+ - 123.67
+ scale: 0.017
+ preproc_node_params:
+ preproc_type: IMAGE_RGB
+ add_preproc_node: false
+ preproc_perm:
+ - 0
+ - 1
+ - 2
+ - 3
+ - lid: label_0
+ redirect_to_output: true
+ category: undefined
+ tensor_name:
+ dtype: float32
+ shape:
+ - 1
+ - 1
+
+
+

上面示例文件的各个参数解释:

+
:widths: 20, 80
+:align: left
+|  参数   | 说明  |
+| :---  | ---  |
+| input_meta  | 预处理参数配置申明。 |
+| databases  | 数据配置,包括设置 path、type 和 ports 。|
+| path  | 数据集文件的相对(执行目录)或绝对路径。默认为 dataset.txt, 不建议修改。 |
+| type  | 数据集文件格式,固定为TEXT。 |
+| ports  | 指向网络中的输入或重定向的输入,目前只支持一个输入,如果网络存在多个输入,请与@ccyh联系。 |
+| lid  | 输入层的lid |
+| category  | 输入的类别。将此参数设置为以下值之一:image(图像输入)或 undefined(其他类型的输入)。 |
+| dtype  | 输入张量的数据类型,用于将数据发送到 Pnna 网络的输入端口。支持的数据类型包括 float32 和 quantized。 |
+| sparse  | 指定网络张量是否以稀疏格式存在。将此参数设置为以下值之一:true(稀疏格式)或 false(压缩格式)。 |
+| tensor_name  | 留空此参数 |
+| layout  | 输入张量的格式,使用 nchw 用于 Caffe、Darknet、ONNX 和 PyTorch 模型。使用 nhwc 用于 TensorFlow、TensorFlow Lite 和 Keras 模型。 |
+| shape  | 此张量的形状。第一维,shape[0],表示每批的输入数量,允许在一次推理操作之前将多个输入发送到网络。如果batch维度设置为0,则需要从命令行指定--batch-size。如果 batch维度设置为大于1的值,则直接使用inputmeta.yml中的batch size并忽略命令行中的--batch-size。 |
+| fitting  | 保留字段 |
+| preprocess  | 预处理步骤和顺序。预处理支持下面的四个键,键的顺序代表预处理的顺序。您可以相应地调整顺序。 |
+| reverse_channel  | 指定是否保留通道顺序。将此参数设置为以下值之一:true(保留通道顺序)或 false(不保留通道顺序)。对于 TensorFlow 和 TensorFlow Lite 框架的模型使用 true。 |
+| mean  | 用于每个通道的均值。 |
+| scale  | 张量的缩放值。均值和缩放值用于根据公式 (inputTensor - mean) × scale 归一化输入张量。|
+| preproc_node_params  | 预处理节点参数,在 OVxlib C 项目案例中启用预处理任务 |
+| add_preproc_node  | 用于处理 OVxlib C 项目案例中预处理节点的插入。[true, false] 中的布尔值,表示通过配置以下参数将预处理层添加到导出的应用程序中。此参数仅在 add_preproc_node 参数设置为 true 时有效。|
+| preproc_type  | 预处理节点输入类型。 [IMAGE_RGB, IMAGE_RGB888_PLANAR,IMAGE_YUV420, IMAGE_GRAY, IMAGE_BGRA, TENSOR] 中的字符串值 |
+| preproc_perm  | 预处理节点输入的置换参数。 |
+| redirect_to_output  | 将database张量重定向到图形输出的特殊属性。如果为该属性设置了一个port,网络构建器将自动为该port生成一个输出层,以便后处理文件可以直接处理来自database的张量。 如果使用网络进行分类,则上例中的lid“input_0”表示输入数据集的标签lid。 您可以设置其他名称来表示标签的lid。 请注意,redirect_to_output 必须设置为 true,以便后处理文件可以直接处理来自database的张量。 标签的lid必须与后处理文件中定义的 labels_tensor 的lid相同。 [true, false] 中的布尔值。 指定是否将由张量表示的输入端口的数据直接发送到网络输出。true(直接发送到网络输出)或 false(不直接发送到网络输出)|
+
+
+

可以根据实际情况对生成的inputmeta文件进行修改。

+
+
+

quantize.sh 模型量化

+

如果我们训练好的模型的数据类型是float32的,为了使模型以更高的效率在Pnna上运行,我们可以对模型进行量化操作,量化操作可能会带来一定程度的精度损失。

+
    +
  • 在netrans_cli目录下使用quantize.sh脚本进行量化操作。

  • +
+

用法:./quantize.sh 以模型文件名命名的模型数据文件夹 量化类型,例如:

+
quantize.sh lenet uint8
+
+
+

支持的量化类型有:uint8、int8、int16

+
+
+

export.sh 模型导出

+

使用 export.sh 导出模型生成nbg文件。

+

用法:export.sh 以模型文件名命名的模型数据文件夹 数据类型,例如:

+
export.sh lenet uint8
+
+
+

导出支持的数据类型:float、uint8、int8、int16,其中使用uint8、int8、int16导出时需要先进行模型量化。导出的工程会在模型所在的目录下面的wksp目录里。 +network_binary.nb文件在"asymmetric_affine"文件夹中:

+
ls -lrt lenet/wksp/asymmetric_affine/
+-rw-r--r-- 1 hope hope 694912 Jun  7 09:55 network_binary.nb
+
+
+

目前支持将生成的network_binary.nb文件部署到Pnna硬件平台。具体部署方法请参阅模型部署相关文档。

+
+
+

使用示例

+

请参照examples,examples 提供 caffe 模型转换示例,darknet 模型转换示例,tensorflow 模型转换示例,onnx 模型转换示例

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/netrans_py.html b/docs/html/netrans_py.html new file mode 100644 index 0000000..beb7bbc --- /dev/null +++ b/docs/html/netrans_py.html @@ -0,0 +1,276 @@ + + + + + + + + netrans_py 使用 — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

netrans_py 使用

+

netrans_py 为 Netrans 编译器的 python 调用接口。 +使用 ntrans_py 完成模型转换的步骤如下:

+
    +
  1. 导入模型

  2. +
  3. 生成并修改前处理配置文件 *_inputmeta.yml

  4. +
  5. 量化模型

  6. +
  7. 导出模型

  8. +
+
+

Netrans 类

+

创建 Netrans

+

描述: 实例化 Netrans 类。 +代码示例:

+
from netrans import Netrans
+yolo_netrans = Netrans("../examples/darknet/yolov4_tiny")
+
+
+

参数

+ + + + + + + + + + + + + + + + + + + + +
参数名类型说明
model_pathstr第一位置参数,模型文件的路径
netansstr如果 NETRANS_PATH 没有设置,可通过该参数指定netrans的路径

输出返回: +无。

+
+
+

Netrans.import 模型导入

+

描述: 将模型转换成 Pnna 支持的格式。 +代码示例:

+
yolo_netrans.import()
+
+
+

参数: +无。

+

输出返回: +无。 +在工程目录下生成 Pnna 支持的模型格式,以.json结尾的模型文件和 .data结尾的权重文件。

+
+
+

Netrans.config 预处理配置文件生成

+

描述: 将模型转换成 Pnna 支持的格式。 +代码示例:

+
yolo_netrans.config()
+
+
+

参数:

+
:widths: 20, 30, 50
+:align: left
+ | 参数名 | 类型 | 说明  |
+|:---| -- | -- |
+|inputmeta| bool,str, [Fasle, True, "inputmeta_filepath"] | 指定 inputmeta, 默认为False。 <br/> 如果为False,则会生成inputmeta模板,可使用mean、scale、reverse_channel 配合修改常用参数。<br/>如果已有现成的 inputmeta 文件,则可通过该参数进行指定,也可使用True, 则会自动索引 model_name_inputmeta.yml |
+|mean| float, int, list | 设置预处理中 normalize 的 mean 参数 |
+|scale| float, int, list | 设置预处理中 normalize 的 scale 参数 |
+|reverse_channel | bool | 设置预处理中的 reverse_channel 参数 |
+
+
+

输出返回: +无。

+
+
+

Netrans.quantize 模型量化

+

描述: 对模型生成量化配置文件。 +代码示例:

+
yolo_netrans.quantize("uint8")
+
+
+

参数:

+
:widths: 20, 30, 50
+:align: left
+| 参数名 | 类型 | 说明  |
+|:---| -- | -- |
+|quantize_type| str| 第一位置参数,模型量化类型,仅支持 "uint8", "int8", "int16"|
+
+
+

输出返回: +无。

+
+
+

Netrans.export 模型导出

+

描述: 对模型生成量化配置文件。 +代码示例:

+
yolo_netrans.export()
+
+
+

参数: +无。

+

输出返回: +无。请在目录 “wksp/*/” 下检查是否生成nbg文件。

+
+
+

Netrans.model2nbg 模型生成nbg文件

+

描述: 模型导入、量化、及nbg文件生产 +代码示例:

+
 # 无预处理
+yolo_netrans.model2nbg(quantize_type='uint8')
+ # 需要对数据进行normlize, menas为128, scale 为 0.0039
+yolo_netrans.model2nbg(quantize_type='uint8',mean=128, scale = 0.0039)
+ # 需要对数据分通道进行normlize, menas为128,127,125,scale 为 0.0039, 且reverse_channel 为 True 
+yolo_netrans.model2nbg(quantize_type='uint8'mean=[128, 127, 125], scale = 0.0039, reverse_channel= True)
+ # 已经进行初始化设置
+yolo_netrans.model2nbg(quantize_type='uint8', inputmeta=True)
+
+
+

参数

+
:widths: 20, 30, 50
+:align: left
+| 参数名 | 类型 | 说明  |
+|:---| -- | -- |
+|quantize_type| str, ["uint8", "int8", "int16" ] | 量化类型,将模型量化成该参数指定的类型 |
+|inputmeta| bool,str, [Fasle, True, "inputmeta_filepath"] | 指定 inputmeta, 默认为False。 <br/> 如果为False,则会生成inputmeta模板,可使用mean、scale、reverse_channel 配合修改常用参数。<br/>如果已有现成的 inputmeta 文件,则可通过该参数进行指定,也可使用True, 则会自动索引 model_name_inputmeta.yml |
+|mean| float, int, list | 设置预处理中 normalize 的 mean 参数 |
+|scale| float, int, list | 设置预处理中 normalize 的 scale 参数 |
+|reverse_channel | bool | 设置预处理中的 reverse_channel 参数 |
+
+
+

输出返回: +请在目录 “wksp/*/” 下检查是否生成nbg文件。

+
+
+

使用示例

+
from nertans import Netrans
+model_path = 'example/darknet/yolov4_tiny'
+netrans_path = "netrans/bin" # 如果进行了export定义申明,这一步可以不用
+
+# 初始化netrans
+net = Netrans(model_path,netrans=netrans_path)
+# 模型载入
+net.import()
+# 配置预处理 normlize 的参数
+net.config(scale=1,mean=0)
+# 模型量化
+net.quantize("uint8")
+# 模型导出
+net.export()
+
+# 模型直接量化成 int16 并导出, 直接复用刚配置好的 inputmeta
+net.model2nbg(quantize_type = "int16", inputmeta=True)
+
+
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/objects.inv b/docs/html/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..0ee4aace0767ab0a1cb0ad1d1047ec9f4f6d50e6 GIT binary patch literal 908 zcmV;719SW%AX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkzWpr|3 zZgUDFAXa5^b7^mGIv@%oAXI2&AaZ4GVQFq;WpW^IW*~HEX>%ZEX>4U6X>%ZBZ*6dL zWpi_7WFU2OX>MmAdTeQ8E(& zIPHWL3)r)us*tEqDlY0vc{2>n>YP;nvIj34S!}4k6 + + + + + + Python 模块索引 — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Python 模块索引

+ +
+ c | + e | + f | + i | + n | + q | + u +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ c
+ config +
 
+ e
+ example +
+ export +
 
+ f
+ file_model +
 
+ i
+ import_model +
+ infer +
 
+ n
+ netrans +
 
+ q
+ quantize +
+ quantize_hb +
 
+ u
+ utils +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/quantize.html b/docs/html/quantize.html new file mode 100644 index 0000000..657e0f9 --- /dev/null +++ b/docs/html/quantize.html @@ -0,0 +1,133 @@ + + + + + + + + quantize module — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

quantize module

+
+
+class quantize.Quantize(source_obj)[源代码]
+

基类:AttributeCopier

+

解析 Netrans 参数,基于 pnnacc 量化模型 +:param cla: 实例化以后的 Netrans 类,需要解析里面包含的参数 +:type cla: class

+
+
+quantize_network(*args, **kargs)
+
+ +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/quantize_hb.html b/docs/html/quantize_hb.html new file mode 100644 index 0000000..9bf578e --- /dev/null +++ b/docs/html/quantize_hb.html @@ -0,0 +1,135 @@ + + + + + + + + quantize_hb module — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

quantize_hb module

+
+
+class quantize_hb.Quantize(source_obj)[源代码]
+

基类:AttributeCopier

+
+
+quantize_network(*args, **kargs)
+
+ +
+ +
+
+quantize_hb.main()[源代码]
+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/quick_start_guide.html b/docs/html/quick_start_guide.html new file mode 100644 index 0000000..8187fac --- /dev/null +++ b/docs/html/quick_start_guide.html @@ -0,0 +1,254 @@ + + + + + + + + 快速入门 — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

快速入门

+

本文档以 onnx 格式的 yolov5s 为例,演示如何快速安装Nertans 并使用 Netrans 量化、编译模型并生成 nbg 文件。

+
+

系统环境

+
    +
  • Linux操作系统,推荐 Ubuntu 20.04 或 Debian12

  • +
  • Python 3.8

  • +
  • RAM 至少 8GB

  • +
+
+
+

安装Netrans

+

创建 python3.8 环境

+
wget "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh"
+mkdir -p ~/app
+INSTALL_PATH="${HOME}/app/miniforge3"
+bash Miniforge3-Linux-x86_64.sh -b -p ${INSTALL_PATH}
+echo "source "${INSTALL_PATH}/etc/profile.d/conda.sh"" >> ${HOME}/.bashrc
+echo "source "${INSTALL_PATH}/etc/profile.d/mamba.sh"" >> ${HOME}/.bashrc
+source ${HOME}/.bashrc
+mamba create -n netrans python=3.8 -y
+mamba activate netrans
+
+
+

下载 Netrans

+
cd ~/app
+git clone https://gitlink.org.cn/nudt_dsp/netrans.git
+
+
+

配置 Netrans

+
cd ~/app/netrans
+./setup.sh
+
+
+
+
+

使用 Netrans 编译 yolov5s 模型

+

进入工作目录

+
cd ~/app/netrans/examples/onnx
+
+
+

此时目录如下:

+
onnx/
+├── README.md
+└── yolov5s
+    ├── 0.jpg
+    ├── dataset.txt
+    └── yolov5s.onnx
+
+
+
+

使用 netrans_cli 编译 yolov5s

+
+

导入模型

+
load.sh yolov5s
+
+
+

该命令会在工程目录下生成包含模型信息的 .json 和 .data 数据文件。

+

此时 yolov5s 的目录结构如下

+
yolov5s/
+├── 0.jpg
+├── yolov5s.data
+├── yolov5s.json
+└── yolov5s.onnx
+
+
+
+
+

生成配置文件模板

+

配置文件定义输入数据前处理相关参数。Netrans预定义了配置文件模板生成脚本,用户需根据模型前处理参数对配置文件进行修改。

+
config.sh yolov5s
+
+
+

此时 yolov5s 的目录结构如下:

+
yolov5s/
+├── 0.jpg
+├── dataset.txt
+├── yolov5s.data
+├── yolov5s_inputmeta.yml
+├── yolov5s.json
+└── yolov5s.onnx
+
+
+

根据 yolov5s 的前处理参数 ,修改 yml 中的 scale 为 0.003921568627。 +打开 yolov5s_inputmeta.yml 文件,修改第30-33行:

+
        scale:
+        - 0.003921568627
+        - 0.003921568627
+        - 0.003921568627
+
+
+
+
+

量化模型

+

生成 unit8 量化的量化参数文件

+
quantize.sh yolov5s uint8
+
+
+

此时 yolov5s 的目录结构如下:

+
yolov5s/
+├── 0.jpg
+├── dataset.txt
+├── yolov5s_asymmetric_affine.quantize
+├── yolov5s.data
+├── yolov5s_inputmeta.yml
+├── yolov5s.json
+└── yolov5s.onnx
+
+
+
+
+

导出模型

+

导出 unit8 量化的模型项目工程

+
export.sh yolov5s uint8
+
+
+

此时 yolov5s 的目录结构如下:

+
yolov5s/
+├── 0.jpg
+├── dataset.txt
+├── wksp
+│   └── asymmetric_affine
+│       └── network_binary.nb
+├── yolov5s_asymmetric_affine.quantize
+├── yolov5s.data
+├── yolov5s_inputmeta.yml
+├── yolov5s.json
+└── yolov5s.onnx
+
+
+
+
+
+

使用 netrans_py 编译 yolov5s 模型

+
example.py yolov5s -q uint8 -m 0 -s 0.003921568627
+
+
+
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/search.html b/docs/html/search.html new file mode 100644 index 0000000..93d91a9 --- /dev/null +++ b/docs/html/search.html @@ -0,0 +1,122 @@ + + + + + + + 搜索 — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

搜索

+ + + + +

+ 当搜索多个关键词时,只会显示同时包含所有关键词的内容。 +

+ + +
+ + + +
+ + +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/searchindex.js b/docs/html/searchindex.js new file mode 100644 index 0000000..51b331b --- /dev/null +++ b/docs/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles":{"*.rst":[[6,"rst"]],"Contents:":[[8,null]],"Netrans \u7c7b":[[13,"netrans"]],"Netrans.config \u9884\u5904\u7406\u914d\u7f6e\u6587\u4ef6\u751f\u6210":[[13,"netrans-config"]],"Netrans.export \u6a21\u578b\u5bfc\u51fa":[[13,"netrans-export"]],"Netrans.import \u6a21\u578b\u5bfc\u5165":[[13,"netrans-import"]],"Netrans.model2nbg \u6a21\u578b\u751f\u6210nbg\u6587\u4ef6":[[13,"netrans-model2nbg-nbg"]],"Netrans.quantize \u6a21\u578b\u91cf\u5316":[[13,"netrans-quantize"]],"config module":[[1,null]],"config.sh \u9884\u5904\u7406\u914d\u7f6e\u6587\u4ef6\u751f\u6210":[[12,"config-sh"]],"dump module":[[2,null]],"example module":[[3,null]],"export module":[[4,null]],"export.sh \u6a21\u578b\u5bfc\u51fa":[[12,"export-sh"]],"file_model module":[[5,null]],"gen api html & pdf by sphinx":[[6,null]],"import_model module":[[7,null]],"infer module":[[9,null]],"load.sh \u6a21\u578b\u5bfc\u5165":[[12,"load-sh"]],"netrans documentation":[[8,null]],"netrans module":[[11,null]],"netrans_cli \u4f7f\u7528":[[12,null]],"netrans_cli \u811a\u672c":[[12,"id1"]],"netrans_py":[[10,null]],"netrans_py \u4f7f\u7528":[[13,null]],"quantize module":[[14,null]],"quantize.sh \u6a21\u578b\u91cf\u5316":[[12,"quantize-sh"]],"quantize_hb module":[[15,null]],"setup module":[[17,null]],"utils module":[[18,null]],"\u4f7f\u7528 Netrans \u7f16\u8bd1 yolov5s \u6a21\u578b":[[16,"netrans-yolov5s"]],"\u4f7f\u7528 autodoc + Sphinx \u5b9e\u73b0 python api \u6587\u6863(html)":[[6,"autodoc-sphinx-python-api-html"]],"\u4f7f\u7528 autodoc + Sphinx \u5b9e\u73b0 python api \u6587\u6863(pdf)":[[6,"autodoc-sphinx-python-api-pdf"]],"\u4f7f\u7528 netrans_cli \u7f16\u8bd1 yolov5s":[[16,"netrans-cli-yolov5s"]],"\u4f7f\u7528 netrans_py \u7f16\u8bd1 yolov5s \u6a21\u578b":[[16,"netrans-py-yolov5s"]],"\u4f7f\u7528\u793a\u4f8b":[[12,"id2"],[13,"id1"]],"\u5b89\u88c5Netrans":[[16,"netrans"]],"\u5bfc\u5165\u6a21\u578b":[[16,"id3"]],"\u5bfc\u51fa\u6a21\u578b":[[16,"id6"]],"\u5e38\u89c1\u62a5\u9519":[[6,"id1"]],"\u5feb\u901f\u5165\u95e8":[[16,null]],"\u751f\u6210\u914d\u7f6e\u6587\u4ef6\u6a21\u677f":[[16,"id4"]],"\u7cfb\u7edf\u73af\u5883":[[16,"id2"]],"\u91cf\u5316\u6a21\u578b":[[16,"id5"]],"\u9644\u5f55":[[0,null]]},"docnames":["appendix","config","dump","example","export","file_model","gen_api","import_model","index","infer","modules","netrans","netrans_cli","netrans_py","quantize","quantize_hb","quick_start_guide","setup","utils"],"envversion":{"sphinx":65,"sphinx.domains.c":3,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":9,"sphinx.domains.index":1,"sphinx.domains.javascript":3,"sphinx.domains.math":2,"sphinx.domains.python":4,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.viewcode":1},"filenames":["appendix.rst","config.rst","dump.rst","example.rst","export.rst","file_model.rst","gen_api.md","import_model.rst","index.rst","infer.rst","modules.rst","netrans.rst","netrans_cli.md","netrans_py.md","quantize.rst","quantize_hb.rst","quick_start_guide.md","setup.rst","utils.rst"],"indexentries":{"attributecopier\uff08utils \u4e2d\u7684\u7c7b\uff09":[[18,"utils.AttributeCopier",false]],"check_dir()\uff08\u5728 utils \u6a21\u5757\u4e2d\uff09":[[18,"utils.check_dir",false]],"check_env()\uff08\u5728 utils \u6a21\u5757\u4e2d\uff09":[[18,"utils.check_env",false]],"check_netrans()\uff08\u5728 utils \u6a21\u5757\u4e2d\uff09":[[18,"utils.check_netrans",false]],"check_path()\uff08\u5728 utils \u6a21\u5757\u4e2d\uff09":[[18,"utils.check_path",false]],"check_status()\uff08\u5728 import_model \u6a21\u5757\u4e2d\uff09":[[7,"import_model.check_status",false]],"config":[[1,"module-config",false]],"config\uff08config \u4e2d\u7684\u7c7b\uff09":[[1,"config.Config",false]],"copy_attribute_name() \uff08utils.attributecopier \u65b9\u6cd5\uff09":[[18,"utils.AttributeCopier.copy_attribute_name",false]],"create_cls\uff08utils \u4e2d\u7684\u7c7b\uff09":[[18,"utils.create_cls",false]],"example":[[3,"module-example",false]],"export":[[4,"module-export",false]],"export_network() \uff08export.export \u65b9\u6cd5\uff09":[[4,"export.Export.export_network",false]],"export\uff08export \u4e2d\u7684\u7c7b\uff09":[[4,"export.Export",false]],"file_model":[[5,"module-file_model",false]],"import_caffe_network()\uff08\u5728 import_model \u6a21\u5757\u4e2d\uff09":[[7,"import_model.import_caffe_network",false]],"import_darknet_network()\uff08\u5728 import_model \u6a21\u5757\u4e2d\uff09":[[7,"import_model.import_darknet_network",false]],"import_model":[[7,"module-import_model",false]],"import_network() \uff08import_model.importmodel \u65b9\u6cd5\uff09":[[7,"import_model.ImportModel.import_network",false]],"import_onnx_network()\uff08\u5728 import_model \u6a21\u5757\u4e2d\uff09":[[7,"import_model.import_onnx_network",false]],"import_pytorch_network()\uff08\u5728 import_model \u6a21\u5757\u4e2d\uff09":[[7,"import_model.import_pytorch_network",false]],"import_tensorflow_network()\uff08\u5728 import_model \u6a21\u5757\u4e2d\uff09":[[7,"import_model.import_tensorflow_network",false]],"import_tflite_network()\uff08\u5728 import_model \u6a21\u5757\u4e2d\uff09":[[7,"import_model.import_tflite_network",false]],"importmodel\uff08import_model \u4e2d\u7684\u7c7b\uff09":[[7,"import_model.ImportModel",false]],"infer":[[9,"module-infer",false]],"inference_network() \uff08infer.infer \u65b9\u6cd5\uff09":[[9,"infer.Infer.inference_network",false]],"infer\uff08infer \u4e2d\u7684\u7c7b\uff09":[[9,"infer.Infer",false]],"inputmeta_gen() \uff08config.config \u65b9\u6cd5\uff09":[[1,"config.Config.inputmeta_gen",false]],"main()\uff08\u5728 example \u6a21\u5757\u4e2d\uff09":[[3,"example.main",false]],"main()\uff08\u5728 export \u6a21\u5757\u4e2d\uff09":[[4,"export.main",false]],"main()\uff08\u5728 infer \u6a21\u5757\u4e2d\uff09":[[9,"infer.main",false]],"main()\uff08\u5728 quantize_hb \u6a21\u5757\u4e2d\uff09":[[15,"quantize_hb.main",false]],"module":[[1,"module-config",false],[3,"module-example",false],[4,"module-export",false],[5,"module-file_model",false],[7,"module-import_model",false],[9,"module-infer",false],[14,"module-quantize",false],[15,"module-quantize_hb",false],[18,"module-utils",false]],"quantize":[[14,"module-quantize",false]],"quantize_hb":[[15,"module-quantize_hb",false]],"quantize_network() \uff08quantize.quantize \u65b9\u6cd5\uff09":[[14,"quantize.Quantize.quantize_network",false]],"quantize_network() \uff08quantize_hb.quantize \u65b9\u6cd5\uff09":[[15,"quantize_hb.Quantize.quantize_network",false]],"quantize\uff08quantize \u4e2d\u7684\u7c7b\uff09":[[14,"quantize.Quantize",false]],"quantize\uff08quantize_hb \u4e2d\u7684\u7c7b\uff09":[[15,"quantize_hb.Quantize",false]],"remove_history_file()\uff08\u5728 utils \u6a21\u5757\u4e2d\uff09":[[18,"utils.remove_history_file",false]],"utils":[[18,"module-utils",false]]},"objects":{"":[[1,0,0,"-","config"],[3,0,0,"-","example"],[4,0,0,"-","export"],[5,0,0,"-","file_model"],[7,0,0,"-","import_model"],[9,0,0,"-","infer"],[11,0,0,"-","netrans"],[14,0,0,"-","quantize"],[15,0,0,"-","quantize_hb"],[18,0,0,"-","utils"]],"config":[[1,1,1,"","Config"]],"config.Config":[[1,2,1,"","inputmeta_gen"]],"example":[[3,3,1,"","main"]],"export":[[4,1,1,"","Export"],[4,3,1,"","main"]],"export.Export":[[4,2,1,"","export_network"]],"import_model":[[7,1,1,"","ImportModel"],[7,3,1,"","check_status"],[7,3,1,"","import_caffe_network"],[7,3,1,"","import_darknet_network"],[7,3,1,"","import_onnx_network"],[7,3,1,"","import_pytorch_network"],[7,3,1,"","import_tensorflow_network"],[7,3,1,"","import_tflite_network"]],"import_model.ImportModel":[[7,2,1,"","import_network"]],"infer":[[9,1,1,"","Infer"],[9,3,1,"","main"]],"infer.Infer":[[9,2,1,"","inference_network"]],"quantize":[[14,1,1,"","Quantize"]],"quantize.Quantize":[[14,2,1,"","quantize_network"]],"quantize_hb":[[15,1,1,"","Quantize"],[15,3,1,"","main"]],"quantize_hb.Quantize":[[15,2,1,"","quantize_network"]],"utils":[[18,1,1,"","AttributeCopier"],[18,3,1,"","check_dir"],[18,3,1,"","check_env"],[18,3,1,"","check_netrans"],[18,3,1,"","check_path"],[18,1,1,"","create_cls"],[18,3,1,"","remove_history_file"]],"utils.AttributeCopier":[[18,2,1,"","copy_attribute_name"]]},"objnames":{"0":["py","module","Python \u6a21\u5757"],"1":["py","class","Python \u7c7b"],"2":["py","method","Python \u65b9\u6cd5"],"3":["py","function","Python \u51fd\u6570"]},"objtypes":{"0":"py:module","1":"py:class","2":"py:method","3":"py:function"},"terms":{"0039":13,"003921568627":16,"017":12,"04":[12,16],"09":12,"10":6,"103":12,"116":12,"123":12,"125":13,"127":13,"128":13,"17":12,"1725178":12,"1727201":12,"19":12,"20":[12,13,16],"2018":12,"2025":6,"21":12,"224":12,"30":[13,16],"33":16,"3396":12,"3400":12,"35":12,"50":[12,13],"55":12,"553":12,"5553":12,"620":6,"67":12,"69":12,"694912":12,"721":6,"78":12,"80":12,"8gb":16,"94":12,"948":12,"_netran":18,"_setlocal":6,"_static":6,"_templat":6,"activ":16,"add_preproc_nod":12,"affin":12,"alabast":6,"align":[12,13],"all":6,"allow":12,"api":[0,8],"apidoc":6,"app":[6,16],"append":6,"apr":12,"arg":[1,4,7,9,14,15],"asymmetr":12,"asymmetric_affin":[12,16],"attributecopi":[1,4,7,9,10,14,15,18],"author":6,"autodoc":0,"bash":16,"bashrc":16,"batch":12,"bin":[6,13],"binari":[8,12],"bool":[13,18],"br":13,"build":6,"builder":6,"built":6,"by":[0,8],"caff":[7,12],"call":6,"categori":[6,12],"ccyh":[6,12],"cd":[6,16],"check_dir":[10,18],"check_env":[10,18],"check_netran":[10,18],"check_path":[10,18],"check_status":[7,10],"cla":14,"class":[1,4,7,9,14,15,18],"cli":[8,12,16],"clone":16,"cmd":[6,7],"cn":16,"com":16,"conda":16,"conf":6,"config":[0,8,10,16],"configur":6,"copy_attribute_nam":[10,18],"copyright":6,"creat":16,"create_cl":[10,18],"css":6,"ctex":6,"darknet":[7,12,13],"dat":12,"data":[12,13,16],"data_0":12,"databas":12,"dataset":[12,16],"debian12":16,"disallow":12,"doc":6,"docstr":6,"document":6,"download":16,"dtype":12,"dump":[0,10],"echo":16,"en":6,"env":6,"error":6,"etc":16,"exampl":[0,10,12,13,16],"exclude_pattern":6,"exit":6,"export":[0,6,8,10,16],"export_network":[4,10],"ext":6,"extens":6,"fals":[12,13,18],"fasl":13,"file":[6,12],"file_model":[0,10],"fit":12,"float":[12,13],"float32":12,"fontset":6,"for":6,"forg":16,"from":13,"full":6,"func":18,"gen":[0,8],"general":6,"generat":12,"git":16,"github":16,"gitlink":16,"googl":6,"graph":8,"h5fs":12,"home":[6,16],"hope":12,"html":[0,8],"html_static_path":6,"html_theme":6,"https":[6,16],"imag":12,"image_bgra":12,"image_gray":12,"image_i420":12,"image_nv12":12,"image_rgb":12,"image_rgb888_planar":12,"image_rgb888_planar_sep":12,"image_yuv420":12,"image_yuv444":12,"import":[6,8],"import_caffe_network":[7,10],"import_darknet_network":[7,10],"import_model":[0,10],"import_network":[7,10],"import_onnx_network":[7,10],"import_pytorch_network":[7,10],"import_tensorflow_network":[7,10],"import_tflite_network":[7,10],"importmodel":[7,10],"in":[6,12],"index":6,"infer":[0,10],"inference_network":[9,10],"inform":6,"input_0":12,"input_meta":12,"inputmeta":[12,13],"inputmeta_filepath":13,"inputmeta_gen":[1,10],"inputs_output":12,"inputtensor":12,"install_path":16,"int":13,"int16":[12,13],"int8":[12,13],"introduct":13,"jpg":[12,16],"js":6,"json":[12,13,16],"jun":12,"karg":[1,4,7,9,14,15],"kera":12,"label_0":12,"labels_tensor":12,"languag":6,"last":6,"latest":16,"latex":6,"latexodf":6,"layout":12,"lc":6,"lc_all":6,"left":[12,13],"lenet":12,"lenet_inputmeta":12,"lib":6,"lid":12,"line":6,"linux":16,"list":[6,13],"lite":12,"lmdb":12,"load":[8,16],"local":6,"lrt":12,"ls":12,"main":[3,4,6,9,10,15],"make":6,"mamba":16,"markdown":6,"master":6,"md":[6,13,16],"mean":[12,13],"mena":13,"miniforg":16,"miniforge3":[6,16],"mkdir":16,"model2nbg":8,"model_nam":12,"model_name_inputmeta":13,"model_path":13,"modul":[0,6,10],"most":6,"my_modul":6,"name":[7,18],"napoleon":6,"nb":[8,12,16],"nbg":[8,12,16],"nchw":12,"nertan":[13,16,18],"net":13,"netan":13,"netran":[0,1,4,6,7,10,12,14,18],"netrans_c":[6,8,13],"netrans_path":[7,13,18],"netrans_pi":[0,6,8],"network":[8,12],"network_binari":[12,16],"network_nam":18,"ngb":4,"nhwc":12,"normal":13,"normliz":13,"notadirectoryerror":18,"nov":12,"npi":12,"ntran":[12,13],"nudt_dsp":16,"numpi":6,"object":18,"of":[6,7],"onli":12,"onnx":[7,12,16],"option":6,"org":[6,16],"os":6,"output":6,"ovxlib":12,"packag":6,"param":14,"path":[6,12],"pb":12,"pdf":[0,8],"pdflatex":6,"pnna":[8,12,13],"pnnacc":[1,4,7,14],"port":12,"preproc_node_param":12,"preproc_perm":12,"preproc_typ":12,"preprocess":12,"profil":16,"project":6,"py":[6,8,13,16],"python":[0,8,13,16],"python3":[6,16],"pytorch":[7,12],"quantiz":[0,8,10,15,16],"quantize_data_typ":12,"quantize_hb":[0,10],"quantize_network":[10,14,15],"quantize_typ":13,"quantized_typ":18,"quickstart":6,"ram":16,"readm":16,"recent":6,"redirect_to_output":12,"releas":[6,16],"remove_history_fil":[10,18],"restructuredtext":6,"result":7,"return":[6,7],"reverse_channel":[12,13],"rst":0,"run":7,"runtim":12,"rw":12,"rwxr":12,"scale":[12,13,16],"see":6,"set":6,"setlocal":6,"setup":16,"sh":[8,16],"shape":12,"site":6,"size":12,"sourc":[6,16],"source_obj":[1,4,7,9,14,15,18],"source_suffix":6,"spars":12,"sphinx":[0,8],"sphinx_rtd_them":6,"sqlite":12,"str":[7,13,18],"subprocess":7,"subprocrss":7,"sucess":12,"support":12,"sys":6,"tab":12,"templates_path":6,"tensor":12,"tensor_nam":12,"tensorflow":[7,12],"tex":6,"text":12,"tflite":7,"the":6,"this":12,"toctre":6,"total":12,"traceback":6,"true":[12,13],"txt":[12,16],"type":[12,14],"ubuntu":[6,16],"uint8":[12,13,16,18],"unam":16,"undefin":12,"unit8":16,"unsupport":6,"us":6,"usag":6,"usapackag":6,"usepackag":6,"utf":6,"utf8":6,"util":[0,10],"valu":[6,12],"verbos":18,"viewcod":6,"vim":6,"wget":16,"width":[12,13],"wksp":[12,13,16],"www":6,"x86_64":16,"xelatex":6,"xj":6,"xr":12,"yaml":12,"yml":[12,13,16],"yolo_netran":13,"yolov4_tini":13,"yolov5":8,"yolov5s_asymmetric_affin":16,"yolov5s_inputmeta":16,"zh":6},"titles":["\u9644\u5f55","config module","dump module","example module","export module","file_model module","gen api html & pdf by sphinx","import_model module","netrans documentation","infer module","netrans_py","netrans module","netrans_cli \u4f7f\u7528","netrans_py \u4f7f\u7528","quantize module","quantize_hb module","\u5feb\u901f\u5165\u95e8","setup module","utils module"],"titleterms":{"and":[],"api":6,"autodoc":6,"by":6,"config":[1,12,13],"content":8,"document":8,"dump":2,"exampl":3,"export":[4,12,13],"file_model":5,"gen":6,"html":6,"import":13,"import_model":7,"indic":[],"infer":9,"load":12,"model2nbg":13,"modul":[1,2,3,4,5,7,9,11,14,15,17,18],"nbg":13,"netran":[8,11,13,16],"netrans_c":[12,16],"netrans_pi":[10,13,16],"pdf":6,"python":6,"quantiz":[12,13,14],"quantize_hb":15,"rst":6,"setup":17,"sh":12,"sphinx":6,"tabl":[],"util":18,"yolov5":16}}) \ No newline at end of file diff --git a/docs/html/setup.html b/docs/html/setup.html new file mode 100644 index 0000000..e08d197 --- /dev/null +++ b/docs/html/setup.html @@ -0,0 +1,107 @@ + + + + + + + + setup module — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

setup module

+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/html/utils.html b/docs/html/utils.html new file mode 100644 index 0000000..5850cc0 --- /dev/null +++ b/docs/html/utils.html @@ -0,0 +1,180 @@ + + + + + + + + utils module — netrans 0.1 文档 + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

utils module

+
+
+class utils.AttributeCopier(source_obj)[源代码]
+

基类:object

+

快速解析复制 Netrans 信息

+
+
+copy_attribute_name(source_obj)[源代码]
+
+ +
+ +
+
+utils.check_dir(network_name)[源代码]
+

判断工程目录是否存在

+
+
参数:
+

network_name (str) -- 工程目录路径

+
+
抛出:
+

NotADirectoryError -- 没有那个工程目录

+
+
+
+ +
+
+utils.check_env(name)[源代码]
+
+ +
+
+utils.check_netrans(netrans)[源代码]
+

判断 netrans 是否配置成功

+
+
参数:
+

netrans (str, bool) -- _netrans 路径, 如果没有配置(默认为False)会去环境变量里找

+
+
抛出:
+

NotADirectoryError -- 找不到 Netrans 会返回 NotADirectoryError

+
+
+
+ +
+
+utils.check_path(func)[源代码]
+

装饰器, 确保在工程目录运行 nertans

+
+ +
+
+class utils.create_cls(netrans_path, name, quantized_type='uint8', verbose=False)[源代码]
+

基类:object

+

快速测试时候模拟实例化Netrans

+
+ +
+
+utils.remove_history_file(name)[源代码]
+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/netrans.pdf b/docs/netrans.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8c3ae897db406627b58d2488cf76c2c13afb08db GIT binary patch literal 341986 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 {_ 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≫|GN@BC{oOx{<6? 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Ð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 literal 0 HcmV?d00001 diff --git a/netrans_py/utils.py b/netrans_py/utils.py index 14803c7..4fb669a 100644 --- a/netrans_py/utils.py +++ b/netrans_py/utils.py @@ -99,6 +99,7 @@ class create_cls(): #dataclass @netrans_params self.verbose=verbose self.quantize_type = quantized_type self.profile = False + # if __name__ == "__main__": # dir_name = "yolo"