模型部署时的调试技巧,debug方法
调试法则
- 善用python工作流,联合python/cpp一起进行问题调试。因为python的工作流比较完善,比如有pycharm等。总之遇到一个问题时不要想着用c++调试,尽可能将工作流程转到python上,这样效率比较高,比如在终端打印由于内容太长显示不完全,这时候就可以利用pycharm调试。尤其是深度学习的东西,都是张量矩阵居多,在python上分析问题效率更高。比如onnx模型推理在python工作流上的复现就可以用onnxruntime实现推理。
- 去掉前后处理情况下,确保onnx与pytorch结果一致,排除所有因素。这一点通常是能够保证的。例如都输入全为5的张量,必须使得输出之间差距小于1e-4,确保中间没有例外情况发生
- 推理时的预处理和pytorch中的预处理一般很难保证完全一样(比如pytorch中用的PIL,推理时是opencv),考虑把python的预处理结果储存文件,c++加载文件后推理,得到的结果应该差异小于1e-4
- 考虑把python模型推理后的结果储存为文件,先用numpy写一遍后处理。然后用c++复现。总之是优先在python上做实验调通,理解清楚,再上到c++,这时其实就是个代码转换的过程。解决问题的效率就会变得很高。
- 如果出现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())
部署时实现一个模型的流程
- 先把代码跑通predict(模型的predict),单张图作为输入。屏蔽一切与该目标不符的东西,可以修改删除任意多余的东西
- 自行写一个新的python程序,简化predict的流程,掌握predict所需要的最小依赖和最少代码。比如原始的predict流程可能依赖于dataset,dataloader,config等等,所以这时候应该考虑把它简化掉,因为推理时只考虑先用单张图片作为输入,所以简化的目的就是只用几行代码把predict写出来。这里的predict指的是模型的predict,并没有包含前后处理。
- 如果第二步比较困难,则可以考虑,直接在pred = model(x)这个步骤上研究,例如直接在此处写torch.onnx.export(model, (pred,) … )。或者直接把pred的结果储存下来研究,等等
- 把前处理、后处理分析出来并实现一个python最简化版本。
- 利用简化版本进行debug、理解分析。然后考虑预处理后处理的合理安排,例如是否可以把部分后处理放到onnx中
- 导出onnx,在c++上先复现预处理部分(这时先不要复现后处理),使得其结果接近(因为大多时候不能得到一样的结果)
- 把python上的pred结果储存后,使用c++读取并复现所需要的后处理部分。确保结果正确
- 把前后处理与onnx对接起来,形成完整的推理
模型部署时的调试技巧,debug方法相关推荐
- Visual Studio中11个强大的调试技巧和方法
调试是软件开发周期中很重要的一部分.它具有挑战性,同时也很让人疑惑和烦恼.总的来说,对于稍大一点的程序,调试是不可避免的.最近几年,调试工具的发展让很多调试任务变的越来越简单和省时. 这篇文章总结了可 ...
- python开发部署时新增数据库中表的方法
在项目版本让运维部署时,涉及到数据库表的增加问题,想了一下,可以有四种方法 1.使用SQLAlchemy的db.create_all()方法 # -*- coding:utf-8 -*- from f ...
- 实用调试技巧 Debug Release F10 F11 初始化 越界访问 堆栈 模拟实现库函数
目录 一.什么是bug 二.调试是什么?有多重要? 1.调试 2.调试的基本步骤 三.Debug和Release 四.windows环境调试介绍 1.调试环境的准备 2.学会快捷键 Ctrl+U 改大 ...
- C#,入门教程(32)——程序运行时的调试技巧与逻辑错误探针技术与源代码
上一篇: C#,入门教程(31)--预处理指令的基础知识与使用方法https://blog.csdn.net/beijinghorn/article/details/124205075 一.关于程序错 ...
- 全网最实用的 IDEA Debug 调试技巧(超详细案例)
目录 前言 正文 Debug 的常见使用场景 基础操作 行断点(Line Breakpoints) 方法断点(Method Breakpoint) 字段断点(Field Watchpoints) 异常 ...
- 实用的 IDEA Debug 调试技巧(超详细案例)
文章目录 前言 正文 Debug 的常见使用场景 基础操作 行断点(Line Breakpoints) 方法断点(Method Breakpoint) 字段断点(Field Watchpoints) ...
- Python Debug调试技巧
------·今天是2020年的第14天·------ 这是ITester软件测试小栈第89次推文 Debug 对于任何coding人士都是一项非常重要的技能,它能够帮助我们准确的定位错误,发现程序中 ...
- 深度学习模型部署学习一
深度学习模型部署 学习链接:模型部署入门教程(一):模型部署简介 写在前面: 本文档为学习上述链接的相关记录,基本内容一致,仅用于学习用途,若侵权请联系我删除 目 录 深度学习模型部署 1 为什么 ...
- 模型部署入门教程(一):模型部署简介
前言 OpenMMLab 的算法如何部署?是很多社区用户的困惑.而模型部署工具箱 MMDeploy 的开源,强势打通了从算法模型到应用程序这 "最后一公里"! 今天我们将开启模型部 ...
最新文章
- Bootstrap学习记录-2.container和table
- 【Notepad++】Notepad++ 插件 for js 各种插件全介绍
- 模拟退火算法求解旅行商问题(python实现)
- Spring –持久层–编写实体并配置Hibernate
- 深入理解Solidity 三
- python线程池操作_python线程池和进程池
- 热点争议:Web设计师需要编程知识吗?
- 五金冲压模具设计分享pressCAD外挂使用小窍门
- matlab将三维bar图保存为emf格式时分辨率很低
- 804计算机考研,北京邮电大学804信号系统考研经验
- 软件项目管理六要素分别是什么?
- 龙果支付 mysql_开源版龙果支付系统-国内首款开源的互联网支付系统
- python报KeyError: ('Age', 'occurred at index PassengerId')错误
- 你了解 JDK 8 Stream 数据流效率吗?千万级数据量性能如何?
- 史上最全!支持EOS映射的交易所统计|关于EOS映射,你想知道的都在这
- 记一次vue2.0+vue-video-player实现hls播放全过程
- 51单片机频率计c语言程序,基于51单片机的频率计程序
- 揭秘“水军”:千元制造一条10W+ 微博打榜豆瓣刷分无所不能
- meituan-YOLOV6-训练自己的数据集-新鲜出炉的YOLOV6
- 易语言单窗口单ip教程_手游搬砖经验单窗口单IP防封黄金法则
热门文章
- 威漫哨兵机器人_漫威电影中,差点让变种人团灭的哨兵机器人,如何才能打败他?...
- Communication error with Jack server 1. Try ‘jack-diagnose‘
- 旁观ACM ICPC
- 保险业务与系统——LOMA 290 保险公司运营——第一讲——寿险公司运营
- iOS 上传应用到APPStore 详细版
- 【性能优化实战,面试大厂应该注意哪些问题
- nsq php,GitHub - youzan/php-nsq-client: php nsq client
- python语音识别预处理_自然语言处理之数据预处理
- RTKlib相对定位源码解析:zdres函数
- Flash入门对AS语言的一些理解