tensor rt可以直接解析caffe模型。 對於不支援的操作op,您可以使用介面手動新增它們;
本部落格將提供了乙個廣播操作(broadcast_op)的示例, 此外,它還測試了pooling_layer,它還新增了乙個test_layer,它可以單獨列印結構中的引數並協助debug;
提供的介面類內部函式,需要根據自定義op修改
virtual int
getnboutputs()
const=0
; virtual dims getoutputdimensions
(int index,
const dims* inputs,
int nbinputdims)=0
; virtual void
configure
(const dims* inputdims,
int nbinputs,
const dims* outputdims,
int nboutputs,
int maxbatchsize)=0
; virtual int
initialize()
=0; virtual void
terminate()
=0; virtual size_t getworkspacesize
(int maxbatchsize)
const=0
; virtual int
enqueue
(int batchsize,
const
void
*const
* inputs,
void
** outputs,
void
* workspace, cudastream_t stream)=0
; virtual size_t getserializationsize()
=0; virtual void
serialize
(void
* buffer)=0
;
// 繼承 ipluginext 類
class broadcast: public ipluginext
~broadcast()
// 建構函式,定義一些必須的引數
broadcast
(const
char
* name,
const
void
* data, size_t length)
:layer_name
(name)
intgetnboutputs()
const override
// 指定該op操作的輸出tensor的shape
dims getoutputdimensions
(int index,
const dims* inputs,
int nbinputdims) override
bool supportsformat
(datatype type, pluginformat format)
const override
virtual size_t getworkspacesize
(int maxbatchsize)
const override
void
configurewithformat
(const dims* inputdims,
int nbinputs,
const dims* outputdims,
int nboutputs, datatype type, pluginformat format,
int maxbatchsize) override
intinitialize
() override
// 你需要重點關注的實現,相當於forward操作,在這裡實現op的內部操作
virtual int
enqueue
(int batchsize,
const
void
*const
* inputs,
void
** outputs,
void
* workspace, cudastream_t stream) override
}// 將計算結果再搬回gpu 用於後續layer操作
cudamemcpy
(outputs[0]
,(const
void
*)pbottom,
sizeof
(float
)* c * h * w,cudamemcpyhosttodevice)
;#if p_log
if(layer_name ==
"broadcast_mul1")}
#endif
free
(pbottom)
;free
(pbottom2)
;return0;
} virtual void
terminate
() override
virtual size_t getserializationsize
() override
virtual void
serialize
(void
* buffer) override
};
ker_size (3,3)
paddin = 1
stride =2
class poolinglayer: public ipluginext
~poolinglayer()
poolinglayer
(const
char
* name,
const
void
* data, size_t length)
:layer_name
(name)
intgetnboutputs()
const override
dims getoutputdimensions
(int index,
const dims* inputs,
int nbinputdims) override
bool supportsformat
(datatype type, pluginformat format)
const override
virtual size_t getworkspacesize
(int maxbatchsize)
const override
void
configurewithformat
(const dims* inputdims,
int nbinputs,
const dims* outputdims,
int nboutputs, datatype type, pluginformat format,
int maxbatchsize) override
intinitialize
() override
virtual int
enqueue
(int batchsize,
const
void
*const
* inputs,
void
** outputs,
void
* workspace, cudastream_t stream) override
// p2+= gap;
// }
for(
int n=
0;n<_c;n++)}
}}}}
#if p_log
// if(!strcmp(layer_name.c_str(),"reshape0"))
// fp.
close()
;// }
#endif
cudamemcpy
(outputs[0]
,(const
void
*)top,
sizeof
(float
)* _c * out_h * out_w,cudamemcpyhosttodevice)
;free
(pbottom)
;free
(top)
;return0;
} virtual void
terminate
() override
virtual size_t getserializationsize
() override
virtual void
serialize
(void
* buffer) override
};
TensorRT的自定義運算元Plugin的實現
這篇文章主要介紹了如何使用tensorrt實現自定義運算元。note 我使用的是tensorrt7.0,自定義運算元使用的ipluginv2ioext實現的。模型框架是caffe,所以以下實現都只適用於caffe模型的解析,但理論上解析tf和onnx的改動不大。實現細節不方便全部貼出,但是基本實現過...
CALayer4 自定義層
本文目錄 自定義層,其實就是在層上繪圖,一共有2種方法,下面詳細介紹一下。回到頂部 方法描述 建立乙個calayer的子類,然後覆蓋drawincontext 方法,使用quartz2d api進行繪圖 pragma mark 繪製乙個實心三角形 4 void drawincontext cgcon...
CALayer4 自定義層
自定義層,其實就是在層上繪圖,一共有2種方法,下面詳細介紹一下。回到頂部 方法描述 建立乙個calayer的子類,然後覆蓋drawincontext 方法,使用quartz2d api進行繪圖 pragma mark 繪製乙個實心三角形 4 void drawincontext cgcontextr...