↓ Skip to main content
  1. Posts/

tensorrt INT8 量化debug记录(cuda error 700)

·543 words·2 mins
Note: This article is available in Chinese only. 本文暂无英文版本。 View original

背景是要把某个 caffe model 转换成 tensorrt 的 INT8 模型,然后遇到如下报错:

 1
 2E0403 08:54:35.951987  5704 engine.h:62] engine.cpp (572) - Cuda Error in commonEmitTensor: 1 (invalid argument)
 3E0403 08:54:35.952157  5704 engine.h:62] Failure while trying to emit debug blob.
 4engine.cpp (572) - Cuda Error in commonEmitTensor: 1 (invalid argument)
 5E0403 08:54:35.952235  5704 engine.h:62] cuda/caskConvolutionLayer.cpp (355) - Cuda Error in execute: 1 (invalid argument)
 6E0403 08:54:35.952291  5704 engine.h:62] cuda/caskConvolutionLayer.cpp (355) - Cuda Error in execute: 1 (invalid argument)
 7W0403 08:54:35.952324  5704 calibrator.cpp:45] [4, 3, 224, 224]
 8F0403 08:54:35.992761  5704 tensor.h:149] Check failed: cudaMemcpy(raw_mutable_data(), b.raw_data(), size_in_bytes, cudaMemcpyDefault) == cudaSuccess (700 vs. 0)
 9*** Check failure stack trace: ***
10Aborted (core dumped)

cuda error 700. 原来 cuda error 的错误号可以这么大。。

查了下,说是:

in general, CUDA error 700 is drivers or timeout related.

看起来是个环境问题。然后又试了下之前转的 INT8 模型,依然没有报错。

我就很困惑了,想了下这两个模型的区别。能转的模型是从 pytorch 开始转换的,中间会 merge BN layer;而 cuda error 700 的模型是 caffe 模型,保留了 BN layer。

于是把第一个 BN 以及之后的 layer 都删除。然而仍然是这个错误。

继续删除到只剩下一个 input layer、一个 conv layer,还是报错。事情变得过于诡异了起来,看来不是模型的问题。

然后检查了一下做校准用的预处理参数,发现输入尺寸和模型的输入尺寸竟然是不一致的。跪了。。

之前的模型由于是 pytorch 模型,input size 和预处理 size 是完全由我控制的,因此不会有问题。

但是对于要转换的 caffe 模型,模型的参数和预处理部分是用户提供给我的,而我们的代码中没有做检查(似乎也不好做检查,因为校准的逻辑是在更顶层的)。

但是这个 cuda error 700 的报错也太不友好了吧。

因为之前查了 cuda error 700,发现似乎没人提到这种情况,所以还是写出来分享一下。

TensorRT INT8 校准流程:预处理尺寸需要与模型输入尺寸一致

Related

tensorRT 模型兼容性说明

·525 words·2 mins
名词说明 # CUDA. 一般来说指的是CUDA SDK. 目前经常使用的是CUDA 8.0和CUDA 10.1两个版本. 8.0和10.1都是SDK的版本号. CUDNN. The NVIDIA CUDA® Deep Neural Network library (cuDNN). 是一个可以为神经网络提供GPU加速的库 compute capability. 是GPU的固有参数,可以理解为GPU的版本.越新的显卡该数值往往越高. tensorRT.NVIDIA TensorRT™ is an SDK for high-performance deep learning inference. 是一个深度学习推理库,旨在提供高性能的推理速度. plan file,也称为 engine plan. 是生成的tensorRT 模型文件. 兼容性说明 # Engine plan 的兼容性依赖于GPU的compute capability 和 TensorRT 版本, 不依赖于CUDA和CUDNN版本.

Kubernetes(k8s)在深度学习模型转换方面的探索

·1886 words·4 mins
年中的时候接了离职的同事模型转换的锅,在不断地更新迭代的过程中,发现了一些痛点。 发现k8s能够解决一部分痛点,因此来分享一下在这方面的探索。 什么是模型转换 # 简单来说,深度学习模型的流程分为training和inference两部分。训练时用的一般是pytorch等框架,这些框架训练出的model是没办法直接部署在各个硬件平台上做inference的。因此需要将使用训练框架得到的模型,转换为能够部署到各个硬件平台上的模型。这个过程就是模型转换。

yuv 图像格式初探

·1340 words·3 mins
概述 # YUV是一种图像编码方式,或者称为色彩空间,与RGB是同级的概念. YUV是三个分量,Y,U和V,其中: Y 表示明亮度(Luminance或Luma),也就是灰度值, U,V表示色度,浓度(Chrominance、Chroma),可以简单理解成用来表示某个像素的颜色的量. YUV格式的特点是,在对照片或影片编码时,考虑到人类的感知能力,允许降低色度的带宽。 也就是说,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。

【施工中】 halide学习笔记

·1262 words·3 mins
Halide is a programming language designed to make it easier to write high-performance image and array processing code on modern machines. halide有两个特性比较吸引人。一个是对于各种平台架构的支持。 CPU architectures: X86, ARM, MIPS, Hexagon, PowerPC Operating systems: Linux, Windows, macOS, Android, iOS, Qualcomm QuRT GPU Compute APIs: CUDA, OpenCL, OpenGL, OpenGL Compute Shaders, Apple Metal, Microsoft Direct X 12 另一个是把计算什么和怎么计算(何时计算)分离开来。

优化学习笔记(1):Loop unrolling

迫于生计,最近要学习halide 先去学习/复习一下常见的编译优化技巧。 loop unrolling,也就是循环展开,顾名思义,就是把循环展开来写。 1normal loop: 2int x; 3 for (x = 0; x < 100; x++) 4 { 5 delete(x); 6 } 7 8after loop unrolling: 9int x; 10 for (x = 0; x < 100; x += 5 ) 11 { 12 delete(x); 13 delete(x + 1); 14 delete(x + 2); 15 delete(x + 3); 16 delete(x + 4); 17 } 循环展开是一种优化,可以手动实现也可以编译器自动实现。