调试法则

  1. 善用python工作流,联合python/cpp一起进行问题调试。因为python的工作流比较完善,比如有pycharm等。总之遇到一个问题时不要想着用c++调试,尽可能将工作流程转到python上,这样效率比较高,比如在终端打印由于内容太长显示不完全,这时候就可以利用pycharm调试。尤其是深度学习的东西,都是张量矩阵居多,在python上分析问题效率更高。比如onnx模型推理在python工作流上的复现就可以用onnxruntime实现推理。
  2. 去掉前后处理情况下,确保onnx与pytorch结果一致,排除所有因素。这一点通常是能够保证的。例如都输入全为5的张量,必须使得输出之间差距小于1e-4,确保中间没有例外情况发生
  3. 推理时的预处理和pytorch中的预处理一般很难保证完全一样(比如pytorch中用的PIL,推理时是opencv),考虑把python的预处理结果储存文件,c++加载文件后推理,得到的结果应该差异小于1e-4
  4. 考虑把python模型推理后的结果储存为文件,先用numpy写一遍后处理。然后用c++复现。总之是优先在python上做实验调通,理解清楚,再上到c++,这时其实就是个代码转换的过程。解决问题的效率就会变得很高。
  5. 如果出现bug,应该把tensor从c++中储存文件后,python加载文件后,放到python上调试查看。避免在c++中debug。

python中加载Tensor和储存Tensor的代码

# 以下代码是python中加载Tensorimport numpy as npdef load_tensor(file):with open(file, "rb") as f:binary_data = f.read()magic_number, ndims, dtype = np.frombuffer(binary_data, np.uint32, count=3, offset=0)assert magic_number == 0xFCCFE2E2, f"{file} not a tensor file."dims = np.frombuffer(binary_data, np.uint32, count=ndims, offset=3 * 4)if dtype == 0:np_dtype = np.float32elif dtype == 1:np_dtype = np.float16else:assert False, f"Unsupport dtype = {dtype}, can not convert to numpy dtype"return np.frombuffer(binary_data, np_dtype, offset=(ndims + 3) * 4).reshape(*dims)def save_tensor(tensor, file):with open(file, "wb") as f:typeid = 0if tensor.dtype == np.float32:typeid = 0elif tensor.dtype == np.float16:typeid = 1elif tensor.dtype == np.int32:typeid = 2elif tensor.dtype == np.uint8:typeid = 3head = np.array([0xFCCFE2E2, tensor.ndim, typeid], dtype=np.uint32).tobytes()f.write(head)f.write(np.array(tensor.shape, dtype=np.uint32).tobytes())f.write(tensor.tobytes())

部署时实现一个模型的流程

  1. 先把代码跑通predict(模型的predict),单张图作为输入。屏蔽一切与该目标不符的东西,可以修改删除任意多余的东西
  2. 自行写一个新的python程序,简化predict的流程,掌握predict所需要的最小依赖和最少代码。比如原始的predict流程可能依赖于dataset,dataloader,config等等,所以这时候应该考虑把它简化掉,因为推理时只考虑先用单张图片作为输入,所以简化的目的就是只用几行代码把predict写出来。这里的predict指的是模型的predict,并没有包含前后处理
  3. 如果第二步比较困难,则可以考虑,直接在pred = model(x)这个步骤上研究,例如直接在此处写torch.onnx.export(model, (pred,) … )。或者直接把pred的结果储存下来研究,等等
  4. 把前处理、后处理分析出来并实现一个python最简化版本。
  5. 利用简化版本进行debug、理解分析。然后考虑预处理后处理的合理安排,例如是否可以把部分后处理放到onnx中
  6. 导出onnx,在c++上先复现预处理部分(这时先不要复现后处理),使得其结果接近(因为大多时候不能得到一样的结果)
  7. 把python上的pred结果储存后,使用c++读取并复现所需要的后处理部分。确保结果正确
  8. 把前后处理与onnx对接起来,形成完整的推理

模型部署时的调试技巧,debug方法相关推荐

  1. Visual Studio中11个强大的调试技巧和方法

    调试是软件开发周期中很重要的一部分.它具有挑战性,同时也很让人疑惑和烦恼.总的来说,对于稍大一点的程序,调试是不可避免的.最近几年,调试工具的发展让很多调试任务变的越来越简单和省时. 这篇文章总结了可 ...

  2. python开发部署时新增数据库中表的方法

    在项目版本让运维部署时,涉及到数据库表的增加问题,想了一下,可以有四种方法 1.使用SQLAlchemy的db.create_all()方法 # -*- coding:utf-8 -*- from f ...

  3. 实用调试技巧 Debug Release F10 F11 初始化 越界访问 堆栈 模拟实现库函数

    目录 一.什么是bug 二.调试是什么?有多重要? 1.调试 2.调试的基本步骤 三.Debug和Release 四.windows环境调试介绍 1.调试环境的准备 2.学会快捷键 Ctrl+U 改大 ...

  4. C#,入门教程(32)——程序运行时的调试技巧与逻辑错误探针技术与源代码

    上一篇: C#,入门教程(31)--预处理指令的基础知识与使用方法https://blog.csdn.net/beijinghorn/article/details/124205075 一.关于程序错 ...

  5. 全网最实用的 IDEA Debug 调试技巧(超详细案例)

    目录 前言 正文 Debug 的常见使用场景 基础操作 行断点(Line Breakpoints) 方法断点(Method Breakpoint) 字段断点(Field Watchpoints) 异常 ...

  6. 实用的 IDEA Debug 调试技巧(超详细案例)

    文章目录 前言 正文 Debug 的常见使用场景 基础操作 行断点(Line Breakpoints) 方法断点(Method Breakpoint) 字段断点(Field Watchpoints) ...

  7. Python Debug调试技巧

    ------·今天是2020年的第14天·------ 这是ITester软件测试小栈第89次推文 Debug 对于任何coding人士都是一项非常重要的技能,它能够帮助我们准确的定位错误,发现程序中 ...

  8. 深度学习模型部署学习一

    深度学习模型部署 学习链接:模型部署入门教程(一):模型部署简介 写在前面: 本文档为学习上述链接的相关记录,基本内容一致,仅用于学习用途,若侵权请联系我删除 目   录 深度学习模型部署 1 为什么 ...

  9. 模型部署入门教程(一):模型部署简介

    前言 OpenMMLab 的算法如何部署?是很多社区用户的困惑.而模型部署工具箱 MMDeploy 的开源,强势打通了从算法模型到应用程序这 "最后一公里"! 今天我们将开启模型部 ...

最新文章

  1. Bootstrap学习记录-2.container和table
  2. 【Notepad++】Notepad++ 插件 for js 各种插件全介绍
  3. 模拟退火算法求解旅行商问题(python实现)
  4. Spring –持久层–编写实体并配置Hibernate
  5. 深入理解Solidity 三
  6. python线程池操作_python线程池和进程池
  7. 热点争议:Web设计师需要编程知识吗?
  8. 五金冲压模具设计分享pressCAD外挂使用小窍门
  9. matlab将三维bar图保存为emf格式时分辨率很低
  10. 804计算机考研,北京邮电大学804信号系统考研经验
  11. 软件项目管理六要素分别是什么?
  12. 龙果支付 mysql_开源版龙果支付系统-国内首款开源的互联网支付系统
  13. python报KeyError: ('Age', 'occurred at index PassengerId')错误
  14. 你了解 JDK 8 Stream 数据流效率吗?千万级数据量性能如何?
  15. 史上最全!支持EOS映射的交易所统计|关于EOS映射,你想知道的都在这
  16. 记一次vue2.0+vue-video-player实现hls播放全过程
  17. 51单片机频率计c语言程序,基于51单片机的频率计程序
  18. 揭秘“水军”:千元制造一条10W+ 微博打榜豆瓣刷分无所不能
  19. meituan-YOLOV6-训练自己的数据集-新鲜出炉的YOLOV6
  20. 易语言单窗口单ip教程_手游搬砖经验单窗口单IP防封黄金法则

热门文章

  1. 威漫哨兵机器人_漫威电影中,差点让变种人团灭的哨兵机器人,如何才能打败他?...
  2. Communication error with Jack server 1. Try ‘jack-diagnose‘
  3. 旁观ACM ICPC
  4. 保险业务与系统——LOMA 290 保险公司运营——第一讲——寿险公司运营
  5. iOS 上传应用到APPStore 详细版
  6. 【性能优化实战,面试大厂应该注意哪些问题
  7. nsq php,GitHub - youzan/php-nsq-client: php nsq client
  8. python语音识别预处理_自然语言处理之数据预处理
  9. RTKlib相对定位源码解析:zdres函数
  10. Flash入门对AS语言的一些理解