通过对应维度设为-1表示该维度动态取值
例如要设定输入的batchsize和h,w都为动态的:
nvinfer1::ITensor* input = network->addInput("image", nvinfer1::DataType::kFLOAT, nvinfer1::Dims4(-1, num_input, -1, -1));
编译时配置OptimizationProfile实现动态shape
其中三个值可选,分别为KMIN,KOPT,KMAX,即最小,最适和最大,推理时在最小和最大范围内都可。
auto profile = builder->createOptimizationProfile();
//范围在(1,1,3,3)和(10,1,5,5)
profile->setDimensions(input->getName(), nvinfer1::OptProfileSelector::kMIN, nvinfer1::Dims4(1, num_input, 3, 3));
profile->setDimensions(input->getName(), nvinfer1::OptProfileSelector::kOPT, nvinfer1::Dims4(1, num_input, 3, 3));
rofile->setDimensions(input->getName(), nvinfer1::OptProfileSelector::kMAX, nvinfer1::Dims4(maxBatchSize, num_input, 5, 5));
config->addOptimizationProfile(profile);
推理时需要明确尺寸
execution_context->setBindingDimensions(0, nvinfer1::Dims4(ib, 1, ih, iw));
bindings[0]为输入。