Comments (4)
Can you please attach the sample code?
from tensorrt.
a common head file TRTPlugin.h, i use a macro REGISTER_ZNZTENSORRT_PLUGIN that register ConvFixLayerCreator with namespace "ZNZPLGUIN"
when i call initLibNvInferPlugins(&gLogger, "ZNZPLGUIN");
auto creator = getPluginRegistry()->getPluginCreator("CONVFIX_ZNZP", "1")
the creator pointer is null. i can't find any error message,thanks.
TRTPlugin.h
#pragma once
#include "NvInfer.h"
#include "NvInferPlugin.h"
#include "cuda.h"
#include <cstring>
#include <iostream>
#include <sstream>
#include <vector>
#include <assert.h>
#include <string>
#define ZNZPLUGINNAMEPLAGIN "ZNZPLGUIN"
template <typename T>
class ZNZPluginRegisterer
{
public:
ZNZPluginRegisterer() {
bool status = getPluginRegistry()->registerCreator(instance, ZNZPLUGINNAMEPLAGIN);
if (!status) {
printf("can not register plugin %s in %s", typeid(T).name(), ZNZPLUGINNAMEPLAGIN);
}
}
private:
T instance{};
};
#define REGISTER_ZNZTENSORRT_PLUGIN(name) \
static ZNZPluginRegisterer<name> ZNZPluginRegisterer##name {}
using namespace nvinfer1;
class BasePlugin : public IPluginV2Ext
{
public:
void setPluginNamespace(const char* pluginNamespace) override
{
m_PluginNameSpace.assign(pluginNamespace);
}
const char* getPluginNamespace() const override
{
return m_PluginNameSpace.c_str();
}
protected:
std::string m_PluginNameSpace;
};
class BasePluginCreator : public IPluginCreator
{
public:
void setPluginNamespace(const char* pluginNamespace) override
{
m_PluginNameSpace.assign(pluginNamespace);
}
const char* getPluginNamespace() const override
{
return m_PluginNameSpace.c_str();
}
protected:
std::string m_PluginNameSpace;
};
ConvFixLayer.h
#pragma once
#include "TRTPlugin.h"
class ConvFixLayer : public BasePlugin
{
private:
int m_ic, m_ih, m_iw;
std::string m_LayerName;
public:
ConvFixLayer(const char* name, int ic, int ih, int iw) :m_LayerName(name), m_ic(ic), m_iw(iw), m_ih(ih) {
assert(ic % 4 == 0);
}
ConvFixLayer(const char* name, const void* data, size_t length);
int getNbOutputs() const { return 1; }
int initialize() { return 0; }
void terminate() {
//nothing to do
}
Dims getOutputDimensions(int index, const Dims* inputs, int nbInputDims) {
assert(nbInputDims == 1);
assert(index == 0);
return DimsCHW(inputs->d[0], inputs[0].d[1], inputs[0].d[2]);
}
size_t getWorkspaceSize(int maxBatchSize) const {
return m_ic * m_iw * m_ih * sizeof(float);
}
int enqueue(int batchSize, const void* const* inputs, void** outputs, void* workspace, cudaStream_t stream);
size_t getSerializationSize() const {
return sizeof(int) * m_ic * sizeof(int)*m_iw * sizeof(int)*m_ih;
}
void serialize(void * buff) const;
bool supportsFormat(DataType type, PluginFormat format) const {
return (type == DataType::kFLOAT && format == PluginFormat::kNCHW);
}
const char* getPluginType() const;
// Get the plugin version
const char* getPluginVersion() const;
void destroy()
{
delete this;
}
// Cloning the plugin
IPluginV2Ext* clone() const
{
// Create a new instance
IPluginV2Ext* plugin = new ConvFixLayer(m_LayerName.c_str(), m_ic, m_ih, m_iw);
// Set the namespace
plugin->setPluginNamespace(m_PluginNameSpace.c_str());
return plugin;
}
// Set plugin namespace
// Return the DataType of the plugin output at the requested index.
DataType getOutputDataType(int index, const nvinfer1::DataType* inputTypes, int nbInputs) const
{
assert(index == 0);
return DataType::kFLOAT;
}
// Return true if output tensor is broadcast across a batch.
bool isOutputBroadcastAcrossBatch(int outputIndex, const bool* inputIsBroadcasted, int nbInputs) const
{
return false;
}
// Return true if plugin can use input that is broadcast across batch without replication.
bool canBroadcastInputAcrossBatch(int inputIndex) const
{
return false;
}
// Configure the layer with input and output data types.
// inutDims: input Dimensions for the plugin layer
// nInputs : Number of inputs to the plugin layer
// outputDims: output Dimensions from the plugin layer
// nOutputs: number of outputs from the plugin layer
// type: DataType configuration for the plugin layer
// format: format NCHW, NHWC etc
// maxbatchSize: maximum batch size for the plugin layer
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)
{
assert(nbInputs == 1);
assert(nbOutputs == 1);
}
// Attach the plugin object to an execution context and grant the plugin the access to some context resource.
void attachToContext(
cudnnContext* cudnnContext, cublasContext* cublasContext, IGpuAllocator* gpuAllocator)
{
}
// Detach the plugin object from its execution context.
void detachFromContext() {}
};
class ConvFixLayerCreator : public BasePluginCreator
{
public:
ConvFixLayerCreator() {
mPluginAttributes.emplace_back(PluginField("C", nullptr, PluginFieldType::kINT32, 1));
mPluginAttributes.emplace_back(PluginField("H", nullptr, PluginFieldType::kINT32, 1));
mPluginAttributes.emplace_back(PluginField("W", nullptr, PluginFieldType::kINT32, 1));
mFC.nbFields = mPluginAttributes.size();
mFC.fields = mPluginAttributes.data();
}
~ConvFixLayerCreator() override = default;
// Returns the plugin name
const char* getPluginName() const;
// Returns the plugin version
const char* getPluginVersion() const;
// Returns the plugin field names
const PluginFieldCollection* getFieldNames()
{
return &mFC;
}
// Creates the NMS plugin
IPluginV2Ext* createPlugin(const char* name, const PluginFieldCollection* fc)
{
const PluginField* fields = fc->fields;
int ic, ih, iw;
for (int i = 0; i < fc->nbFields; ++i)
{
const char* attrName = fields[i].name;
if (!strcmp(attrName, "C"))
{
assert(fields[i].type == PluginFieldType::kINT32);
ic = static_cast<int>(*(static_cast<const int*>(fields[i].data)));
}
else if (!strcmp(attrName, "H"))
{
assert(fields[i].type == PluginFieldType::kINT32);
ih = static_cast<int>(*(static_cast<const int*>(fields[i].data)));
}
else if (!strcmp(attrName, "W"))
{
assert(fields[i].type == PluginFieldType::kINT32);
iw = static_cast<int>(*(static_cast<const int*>(fields[i].data)));
}
}
ConvFixLayer* obj = new ConvFixLayer(name, ic, ih, iw);
obj->setPluginNamespace(m_PluginNameSpace.c_str());
return obj;
}
IPluginV2Ext* deserializePlugin(const char* name, const void* serialData, size_t serialLength)
{
// This object will be deleted when the network is destroyed, which will
// call NMS::destroy()
ConvFixLayer* obj = new ConvFixLayer(name, serialData, serialLength);
obj->setPluginNamespace(m_PluginNameSpace.c_str());
return obj;
}
private:
static PluginFieldCollection mFC;
static std::vector<PluginField> mPluginAttributes;
};
ConvFixLayer.cpp
#include "ConvFixLayer.h"
#include <cuda_runtime_api.h>
namespace
{
const char* CONVFIX_PLUGIN_VERSION{ "1" };
const char* CONVFIX_PLUGIN_NAME{ "CONVFIX_ZNZP" };
}
PluginFieldCollection ConvFixLayerCreator::mFC{};
std::vector<PluginField> ConvFixLayerCreator::mPluginAttributes;
// Helper function for serializing plugin
template <typename T>
void writeToBuffer(char*& buffer, const T& val)
{
*reinterpret_cast<T*>(buffer) = val;
buffer += sizeof(T);
}
// Helper function for deserializing plugin
template <typename T>
T readFromBuffer(const char*& buffer)
{
T val = *reinterpret_cast<const T*>(buffer);
buffer += sizeof(T);
return val;
}
ConvFixLayer::ConvFixLayer(const char* name, const void* data, size_t length) : m_LayerName(name)
{
const char* d = reinterpret_cast<const char*>(data);
const char* a = d;
m_ic = readFromBuffer<int>(a);
m_ih = readFromBuffer<size_t>(a);
m_iw = readFromBuffer<size_t>(a);
}
int ConvFixLayer::enqueue(int batchSize, const void* const* inputs, void** outputs, void* workspace, cudaStream_t stream)
{
const void* inputData = inputs[0];
void* outputData = outputs[0];
return 0;
}
void ConvFixLayer::serialize(void * buff) const
{
char* d = reinterpret_cast<char*>(buff);
char* a = d;
writeToBuffer<int>(a, m_ic);
writeToBuffer<int>(a, m_ih);
writeToBuffer<int>(a, m_iw);
assert(a == d + getSerializationSize());
}
const char* ConvFixLayer::getPluginType() const
{
return CONVFIX_PLUGIN_NAME;
}
const char* ConvFixLayer::getPluginVersion() const
{
return CONVFIX_PLUGIN_VERSION;
}
const char* ConvFixLayerCreator::getPluginName() const
{
return CONVFIX_PLUGIN_NAME;
}
const char* ConvFixLayerCreator::getPluginVersion() const
{
return CONVFIX_PLUGIN_VERSION;
}
REGISTER_ZNZTENSORRT_PLUGIN(ConvFixLayerCreator);
from tensorrt.
Hi @VirtualEarth,
Can you see if this works in TensorRT 7? Also assuming this commit may have been related: 5e289e9
from tensorrt.
Closing since no response
from tensorrt.
Related Issues (20)
- Inference failure of TensorRT 10.0.x.x when running my internal model on GPU(T4, A100) HOT 8
- Multi streaming inference Using TensorRT HOT 2
- Missing scale and zeropoint for lot of layers on calibrating vision transformer onnx model for INT8 precision HOT 14
- Cannot install 8.6.1 via pip: Could not find a version that satisfies the requirement tensorrt_libs==8.6.1 HOT 1
- Find out the precision of the TensorRT Engine HOT 1
- Cuda Runtime (an illegal memory access was encountered) on calibrating Yolo_v5 model for int8 precision HOT 2
- Could not find any implementation for node /backbone/layers.0.1.0/attn/attn/MatMul for SegFormer onnx model for int8 precision HOT 6
- INT8 Quantization Performance Issue with BERT-like Model HOT 1
- Nothing is detected at INT8 HOT 3
- Question: Disable Optimizations for TensorRT HOT 2
- trt load plan/engine file coredump occasionally HOT 6
- Question: What problems ? HOT 1
- Int8 SmoothQuant MoE Plugin: Engine Build Error Due to Missing Int8 Scales
- Accuracy loss of TensorRT 8.6 when running INT8 Quantized Resnet18 on GPU A4000 HOT 2
- Error Code 1: Myelin ([cask.cpp:exec:972] Platform (Cuda) error HOT 3
- FP8 Convolution has no speedup versus FP16 on 4090 with TRT10.3 HOT 2
- how to support FlashAttention2? HOT 1
- Bug in build script for python - There is no TENSORRT_LIBPATH variable it should TENSORRT_BUILDDIR HOT 1
- Q-DQ nodes for int8 LayerNorm HOT 2
- onnx_graphsurgeon: toposort failed on a graph without cycle HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from tensorrt.