2

我正在使用 Tensorrt 转换 caffe 模型,当我在嵌入式设备中运行代码时,它会提示分段错误。我知道问题出在“network->destroy();”,如果我注释掉这段代码,它不会显示“segmentation fault”。

我找到了一些方法并尝试解决这个问题,但它不起作用。此问题的常见原因:printfor语句中的格式控制字符串不正确:确保格式控制字符串与or具有scanf相同数量的转换说明符 ( %'s)分别具有要打印或读取的参数,并且说明符与要打印或读取的变量。这也适用于和printfscanffprintffscanf. 忘记在 scanf 的参数上使用“&”:函数 scanf 将格式控制字符串和变量地址作为参数,它将在其中放置读取的数据。“&”(地址)运算符用于提供变量的地址。在 scanf 调用中忘记对每个变量使用“&”是很常见的。省略“&”可能会导致分段违规。超出数组边界的访问:确保您没有违反您正在使​​用的任何数组的边界;即,您没有为数组下标,其值小于其最低元素的索引或大于其最高元素的索引。在访问指针之前未能初始化指针:必须为指针变量分配一个有效地址(即,出现在作业的左侧)在被访问之前(即出现在作业的右侧)。确保您已初始化所有指针以指向有效的内存区域。正确的指针初始化可以通过多种方式完成。下面列出了示例。错误使用“&”(地址)和“"(取消引​​用)运算符:确保您了解这些运算符的工作原理。知道何时应该应用它们以及何时不应用它们。如上所述,在scanf调用中忘记对每个变量使用“&”是很常见的。记住,scanf需要它正在读取的变量的地址。特别是,知道什么时候“&”和“ ”是绝对必要的,什么时候最好避免使用它们。

此代码用于 caffe 模型到tenserrt模型tenserNet.cpp

 builder = createInferBuilder(gLogger);
INetworkDefinition* network = builder->createNetwork();

ICaffeParser* parser = createCaffeParser();
parser->setPluginFactory(NULL);

bool useFp16 = builder->platformHasFastFp16();
//useFp16 = false;

DataType modelDataType = useFp16 ? DataType::kHALF : DataType::kFLOAT;

/** Debugging Notes
 *  1. The datatype is taken by the code.
 *  2. The network is properly defined here. A network is created here.
 *  3. There is some error with the deploy file.
 *  4. parser used here is nvCaffeParser.
 *  5. blobNameToTensor also has some name.
 * */
// const IBlobNameToTensor* blobNameToTensor =  parser->parse(deployFile.c_str(),
//                                                           modelFile.c_str(),
//                                                           *network,
//                                                           DataType::kFLOAT);
const IBlobNameToTensor* blobNameToTensor = parser->parse(deployFile.c_str(),
                                                          modelFile.c_str(),
                                                          *network,
                                                          modelDataType);

assert(blobNameToTensor != nullptr);

for (auto& s : outputs) network->markOutput(*blobNameToTensor->find(s.c_str()));
builder->setMaxBatchSize(maxBatchSize);
builder->setMaxWorkspaceSize(16 << 20);
//IRuntime* infer;
infer = createInferRuntime(gLogger);
if(useFp16)
{
    builder->setHalf2Mode(true);
}

engine = builder->buildCudaEngine( *network );
assert(engine);

context = engine->createExecutionContext();
assert(context);

network->destroy();
parser->destroy();

//gieModelStream = engine->serialize();
// engine->destroy();
// builder->destroy();
// pluginFactory.destroyPlugin();
// shutdownProtobufLibrary();
context->setProfiler(&gProfiler);
// context->setProfiler(nullptr);
CUDA_VERIFY(cudaStreamCreate(&stream));

NvInfer.h

class INetworkDefinition
{
    // ...
    virtual void destroy() = 0;
protected:
    virtual ~INetworkDefinition() {}
};
4

0 回答 0