\brief Sets custom dynamic range for network tensors
| 305 | //! \brief Sets custom dynamic range for network tensors |
| 306 | //! |
| 307 | bool SampleINT8API::setDynamicRange(SampleUniquePtr<nvinfer1::INetworkDefinition>& network) |
| 308 | { |
| 309 | // populate per-tensor dynamic range |
| 310 | if (!readPerTensorDynamicRangeValues()) |
| 311 | { |
| 312 | return false; |
| 313 | } |
| 314 | |
| 315 | sample::gLogInfo << "Setting Per Tensor Dynamic Range" << std::endl; |
| 316 | if (mParams.verbose) |
| 317 | { |
| 318 | sample::gLogInfo << "If dynamic range for a tensor is missing, TensorRT will run inference assuming dynamic range for " |
| 319 | "the tensor as optional." |
| 320 | << std::endl; |
| 321 | sample::gLogInfo << "If dynamic range for a tensor is required then inference will fail. Follow README.md to generate " |
| 322 | "missing per-tensor dynamic range." |
| 323 | << std::endl; |
| 324 | } |
| 325 | // set dynamic range for network input tensors |
| 326 | for (int i = 0; i < network->getNbInputs(); ++i) |
| 327 | { |
| 328 | std::string tName = network->getInput(i)->getName(); |
| 329 | if (mPerTensorDynamicRangeMap.find(tName) != mPerTensorDynamicRangeMap.end()) |
| 330 | { |
| 331 | if (!network->getInput(i)->setDynamicRange( |
| 332 | -mPerTensorDynamicRangeMap.at(tName), mPerTensorDynamicRangeMap.at(tName))) |
| 333 | { |
| 334 | return false; |
| 335 | } |
| 336 | } |
| 337 | else |
| 338 | { |
| 339 | if (mParams.verbose) |
| 340 | { |
| 341 | sample::gLogWarning << "Missing dynamic range for tensor: " << tName << std::endl; |
| 342 | } |
| 343 | } |
| 344 | } |
| 345 | |
| 346 | // set dynamic range for layer output tensors |
| 347 | for (int i = 0; i < network->getNbLayers(); ++i) |
| 348 | { |
| 349 | auto lyr = network->getLayer(i); |
| 350 | for (int j = 0, e = lyr->getNbOutputs(); j < e; ++j) |
| 351 | { |
| 352 | std::string tName = lyr->getOutput(j)->getName(); |
| 353 | if (mPerTensorDynamicRangeMap.find(tName) != mPerTensorDynamicRangeMap.end()) |
| 354 | { |
| 355 | // Calibrator generated dynamic range for network tensor can be overriden or set using below API |
| 356 | if (!lyr->getOutput(j)->setDynamicRange( |
| 357 | -mPerTensorDynamicRangeMap.at(tName), mPerTensorDynamicRangeMap.at(tName))) |
| 358 | { |
| 359 | return false; |
| 360 | } |
| 361 | } |
| 362 | else if (lyr->getType() == LayerType::kCONSTANT) |
| 363 | { |
| 364 | IConstantLayer* cLyr = static_cast<IConstantLayer*>(lyr); |
no test coverage detected