Giter Club home page Giter Club logo

Comments (4)

rajeevsrao avatar rajeevsrao commented on September 27, 2024

Can you please attach the sample code?

from tensorrt.

VirtualEarth avatar VirtualEarth commented on September 27, 2024

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.

rmccorm4 avatar rmccorm4 commented on September 27, 2024

Hi @VirtualEarth,

Can you see if this works in TensorRT 7? Also assuming this commit may have been related: 5e289e9

from tensorrt.

rmccorm4 avatar rmccorm4 commented on September 27, 2024

Closing since no response

from tensorrt.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.