この記事ではTensorRTドキュメント「TensorRT-開発者ガイド」の第4章「TENSORRT WITH CUSTOM層の拡張」を理解することを学ぶことから来ています。
カスタムC ++ API層を追加
IPluginV2ExtとIPluginCreatorカテゴリを拡張することによって達成されるカスタムレイヤを追加します。
- IPluginV2Ext:IPluginV2アップグレードバージョン実現カスタム・プラグインベースクラスは、他のフォーマットと単精度のバージョンと処理が含まれています。
- IPluginCreator:クラス定義層の作成ので、そのプラグイン名、バージョン情報、およびその他のパラメータを介して取得することができ、ネットワークはまた、プラグイン作成相を生成する方法を提供し、推論段階でそれをデシリアライズ。
良いプラグの定義ができるREGISTER_TENSORRT_PLUGIN(pluginCreator)
静的登録すること、およびを使用してgetPluginRegistry()
クエリおよび使用。公式のプラグインが実装されています。
- RPROI_TRT
- normalize_trt
- PriorBox_TRT
- Gridatrrchor_trit
- NMS_TRT
- lrelu_trt
- Reorg_TRT
- Region_TRT
- Clip_TRT
// 通过getPluginRegistry获取所有TensorRT插件,creator即IPluginCreator对象
auto creator = getPluginRegistry()->getPluginCreator(pluginName, pluginVersion);
const PluginFieldCollection* pluginFC = creator->getFieldNames();
// 填充该层参数信息,pluginData需要先通过PluginField分配堆上空间
PluginFieldCollection *pluginData = parseAndFillFields(pluginFC, layerFields);
// 使用层名和插件参数创建新的插件对象,创建在堆上,需要主动释放
IPluginV2 *pluginObj = creator->createPlugin(layerName, pluginData);
// 在网络上添加一层,并将该层和插件绑定,layer即IPluginV2Layer对象
auto layer = network.addPluginV2(&inputs[0], int(inputs.size()), pluginObj);
// TODO:创建最新的网络,并序列化引擎
// 销毁插件对象
pluginObj->destroy()
// TODO:释放TensorRT资源,network、engine、builder
// TODO:释放显存空间,如原网络参数信息pluginData
内部破壊にTensorRT内部ストレージIPluginV2ウィジェットのシーケンス内のエンジン属性情報とデシリアライズ時に、及びIPluginV2によりプラグイン・レジストリにそれをチェックする::破壊()インターフェース。
以前のバージョンでは、ユーザーが直列化復元時にnvinfer1 :: IPluginFactoryクラスによってプラグを作成する必要があり、現在のバージョンはaddPluginV2 TensorRTができます使用することができます。例えば:
// 使用Caffe解释器解析网络并添加插件
// 如果使用IPluginExt创建插件,需要搭配nvinfer1::IPluginFactory 和 nvinfer1::IPluginFactory
class FooPlugin : public IPluginExt
{
// TODO:创建插件实现方法
};
class MyPluginFactory :
public nvinfer1::IPluginFactory,
public nvcaffeparser1::IPluginFactoryExt
{
// TODO:创建插件的工厂方法
};
// 如果使用IPluginV2创建并注册插件,则不再需要实现nvinfer1::IPluginFactory,
// 但需要通过nvcaffeparser1::IPluginFactoryV2 和 IPluginCreator来完成注册
class FooPlugin : public IPluginV2
{
// TODO:创建插件实现方法
};
class FooPluginFactory : public nvcaffeparser1::IPluginFactoryV2
{
virtual nvinfer1::IPluginV2* createPlugin(...)
{
// TODO:创建并返回插件对象,如FooPlugin
}
bool isPlugin(const char* name)
{
// TODO:通过网络层的名字检验是否使用该插件
}
}
class FooPluginCreator : public IPluginCreator
{
// TODO:实现所有的插件创建
};
REGISTER_TENSORRT_PLUGIN(FooPluginCreator);
プラグインは、特定のインスタンスを表示することができ作成します。
- samplePlugin:カスタムネットワークプラグCaffeの方法。
- sampleFasterRCNN:によりTensorRTはカフェネットワークプラグを登録し、
- sampleUffSSD:UFF用(TensorFlow用)は、プラグインを追加します。
カスタムプラグインを使用します
この部分は、(基本的な状況を説明し、あなたが同様に作成するときに、カフェの通訳のために、あなたは、デシリアライズプラグインがIPluginExtの観点から定義されるときに作成され、setPluginFactoryV2とIPluginFactoryV2を経由してカスタムプラグインを使用できることに留意すべきである::破壊)手動でコールすることなく、コンテンツの内部破壊、ユーザは、プラグインオブジェクト作成プロセスを作成するために破壊される必要があります。
APIの説明
APIのIPluginV2
図1に示すように、プラグインの出力データ構造を取得し、隣接する層は、ドッキングかどうかを確認することができます。
- getNbOutputs:出力テンソルの数を確認してください。
- getOutputDimensions:検証入力寸法、寸法は、出力を得ます。
- supportsFormat:どのように治療精度、ウィジェットサポートされているデータの種類を設定します。
- getOutputDataType:ftplugin出力データ(NCHW、NC / 2HW2、NHWC8 PluginFormatTypeを参照してください、など)。
図2に示すように、入力プラグ出力を得ることに加えて、データ、コール及びビルダーを格納するための多くのスペースを取る事前に割り当てられました:
- getWorkspaceSize
図3に示すように、プラグインは一度だけ中断多段構成、初期化、実行、懸濁液、およびのみを複数回実行する、構成、初期化を作成するために、初期化メモリへの必要性が塗布時に放出されるが、終了、他のメモリニーズ破壊のリリースでは、必要なプラグインは、次のとおりです。
- configurePlugin:最も適切なアルゴリズムおよびデータ構造を選択するウィジェット構成入出力属性(数、大きさ、種類、放送、フォーマット選択、のBatchSizeの最大値)。
- 初期化:プラグイン構成後使用に推論エンジンを作成し、構成セットのデータ構造に従って実行する準備ができ;
- エンキュー:ウィジェット実際のプロセス、のBatchSizeの操作を入力する必要があり、入力ポインタ、出力ポインタ、バッファ空間ポインタ、CUDAストリーム。
- 終了:コンテキストエンジンのプラグイン内のすべてのリソースのリリースがリリースされています。
- クローン:あなたは別のプラグイン(作成された新しいビルダー、ネットワーク、エンジン)を必要とする使用。
- 破壊:ビルダー、ネットワーク、エンジン破壊呼び出し、プラグのリリースは、リソースに対応する場合には、
- セット/ getPluginNamespace:セットまたは「」(空)に、デフォルトのウィジェットの名前空間を取得します。
図4に示すように、入出力特性がIPluginV2Extをブロードキャストすることによって達成することができ、実装する必要があります。
- canBroadcastInputAcrossBatch:入力テンソルが一括で放送することが可能かどうかを判定し、リターンはそれを真のブロードキャストすることができ、TensorRTは、入力の同じコピーを入力し、使用するためにコピーされません。返す偽、TensorRTコピー入力テンソルを放送していません。
- isOutputBroadcastAcrossBatch:指定されたインデックスが放送されているかどうかを出力します。
IPluginCreator的API
IPluginCreatorプラグイン使用するライブラリから見上げると方法プラグインを作成するには:
- getPluginName:名前プラグイン、および使用とgetPluginTypeを取得します。
- getPluginVersion:リターンプラグインバージョン、TensorRT内部プラグイン1デフォルト。
- getFieldNames戻り値:PluginFieldCollection構成データ、パラメータ名と追加のプラグインを含むタイプ。
- createPlugin:構造パラメータ所与プラグPluginFieldCollection、実際の充填に必要なパラメータを作成することによって、
- deserializePlugin:内部プラグイン名とバージョン情報コールTensorRTエンジンによると、推論のためのオブジェクトをプラグイン返さ。
- セット/ getPluginNamespace:プラグインライブラリの名前空間は、デフォルトは「クリエイター」(空)。
5.XXから5.1.xのへの移行
5.XXバージョンはgetOutputDataType、isOutputBroadcastAcrossBatch、canBroadcastInputAcrossBatch、configurePluginは用configureWithFormatをアップグレードしません。5.1.xではこれらの新機能を実装する必要がありますへの移行。
virtual nvinfer1::DataType getOutputDataType(int index, const nvinfer1::DataType* inputTypes, int nbInputs) const = 0;
virtual bool isOutputBroadcastAcrossBatch(int outputIndex, const bool* inputIsBroadcasted, int nbInputs) const = 0;
virtual bool canBroadcastInputAcrossBatch(int inputIndex) const = 0;
virtual void configurePlugin(const Dims* inputDims, int nbInputs, const Dims* outputDims, int nbOutputs, const DataType* inputTypes, const DataType* outputTypes, const bool* inputIsBroadcast, const bool* outputIsBroadcast, PluginFormat floatFormat, int maxBatchSize) = 0;