diff --git a/cpp/include/torch_tensorrt/macros.h b/cpp/include/torch_tensorrt/macros.h index 7205570d0d..304dc95276 100644 --- a/cpp/include/torch_tensorrt/macros.h +++ b/cpp/include/torch_tensorrt/macros.h @@ -24,7 +24,7 @@ #define STR(x) XSTR(x) #define TORCH_TENSORRT_MAJOR_VERSION 1 -#define TORCH_TENSORRT_MINOR_VERSION 2 +#define TORCH_TENSORRT_MINOR_VERSION 3 #define TORCH_TENSORRT_PATCH_VERSION 0 #define TORCH_TENSORRT_VERSION \ STR(TORCH_TENSORRT_MAJOR_VERSION) \ diff --git a/docs/v1.1.1/.nojekyll b/docs/v1.1.1/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/v1.1.1/_cpp_api/class_view_hierarchy.html b/docs/v1.1.1/_cpp_api/class_view_hierarchy.html new file mode 100644 index 0000000000..4460f7b720 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/class_view_hierarchy.html @@ -0,0 +1,610 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Class Hierarchy — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

+ Class Hierarchy + + ¶ + +

+ + +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/classtorch__tensorrt_1_1DataType.html b/docs/v1.1.1/_cpp_api/classtorch__tensorrt_1_1DataType.html new file mode 100644 index 0000000000..8bfc65040d --- /dev/null +++ b/docs/v1.1.1/_cpp_api/classtorch__tensorrt_1_1DataType.html @@ -0,0 +1,1337 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Class DataType — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ Class DataType + + ¶ + +

+ +

+ Class Documentation + + ¶ + +

+
+
+ + + + class + + + torch_tensorrt + + :: + + + + DataType + + + ¶ + +
+
+
+

+ Supported Data Types that can be used with TensorRT engines +

+

+ This class is compatable with c10::DataTypes (but will check for TRT support) so there should not be a reason that you need to use this type explictly. +

+
+

+ Public Types +

+
+
+ + + + enum + + + Value + + + ¶ + +
+
+
+

+ Underlying enum class to support the + + + DataType + + + Class +

+

+ In the case that you need to use the + + + DataType + + + class itself, interface using this enum vs. normal instatination +

+

+ ex. + + + torch_tensorrt::DataType + + + type = + + + DataType::kFloat + + + ; +

+

+ + Values: + +

+
+
+ + + + enumerator + + + kFloat + + + ¶ + +
+
+
+

+ FP32. +

+
+
+
+
+ + + + enumerator + + + kHalf + + + ¶ + +
+
+
+

+ FP16. +

+
+
+
+
+ + + + enumerator + + + kChar + + + ¶ + +
+
+
+

+ INT8. +

+
+
+
+
+ + + + enumerator + + + kInt + + + ¶ + +
+
+
+

+ INT. +

+
+
+
+
+ + + + enumerator + + + kBool + + + ¶ + +
+
+
+

+ Bool. +

+
+
+
+
+ + + + enumerator + + + kUnknown + + + ¶ + +
+
+
+

+ Sentinel value. +

+
+
+
+
+
+
+

+ Public Functions +

+
+
+ + + + DataType + + + ( + + + ) + + = default + + ¶ + +
+
+
+

+ Construct a new Data Type object. +

+
+
+
+
+ + + + constexpr + + + DataType + + + ( + + + Value + + + t + + + ) + + + ¶ + +
+
+
+

+ + + DataType + + + constructor from enum. +

+
+
+
+
+ + + + DataType + + + ( + + c10::ScalarType + + t + + + ) + + + ¶ + +
+
+
+

+ Construct a new Data Type object from torch type enums. +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + t + + + : +

    +
  • +
+
+
+
+
+
+
+ + + + operator Value + + + ( + + + ) + + + const + + + ¶ + +
+
+
+

+ Get the enum value of the + + + DataType + + + object. +

+

+

+
+
+ + Return + +
+
+

+ Value +

+
+
+
+
+
+
+ + + + operator bool + + + ( + + + ) + + = delete + + ¶ + +
+
+
+
+
+
+
+ + + + constexpr + + bool + + operator== + + + ( + + + DataType + + + other + + + ) + + + const + + + ¶ + +
+
+
+

+ Comparision operator for + + + DataType + + + . +

+

+

+
+
+ + Return + +
+
+

+ true +

+
+
+ + Return + +
+
+

+ false +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + other + + + : +

    +
  • +
+
+
+
+
+
+
+ + + + constexpr + + bool + + operator== + + + ( + + + DataType + + :: + + Value + + + other + + + ) + + + const + + + ¶ + +
+
+
+

+ Comparision operator for + + + DataType + + + . +

+

+

+
+
+ + Return + +
+
+

+ true +

+
+
+ + Return + +
+
+

+ false +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + other + + + : +

    +
  • +
+
+
+
+
+
+
+ + + + constexpr + + bool + + operator!= + + + ( + + + DataType + + + other + + + ) + + + const + + + ¶ + +
+
+
+

+ Comparision operator for + + + DataType + + + . +

+

+

+
+
+ + Return + +
+
+

+ true +

+
+
+ + Return + +
+
+

+ false +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + other + + + : +

    +
  • +
+
+
+
+
+
+
+ + + + constexpr + + bool + + operator!= + + + ( + + + DataType + + :: + + Value + + + other + + + ) + + + const + + + ¶ + +
+
+
+

+ Comparision operator for + + + DataType + + + . +

+

+

+
+
+ + Return + +
+
+

+ true +

+
+
+ + Return + +
+
+

+ false +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + other + + + : +

    +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/classtorch__tensorrt_1_1Device_1_1DeviceType.html b/docs/v1.1.1/_cpp_api/classtorch__tensorrt_1_1Device_1_1DeviceType.html new file mode 100644 index 0000000000..3701e66c24 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/classtorch__tensorrt_1_1Device_1_1DeviceType.html @@ -0,0 +1,1132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Class Device::DeviceType — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+ +
+
+
+ + +

+ Class Device::DeviceType + + ¶ + +

+ +

+ Nested Relationships + + ¶ + +

+

+ This class is a nested type of + + + Struct Device + + + . +

+

+ Class Documentation + + ¶ + +

+
+
+ + + + class + + + torch_tensorrt:: + + Device + + + :: + + + + DeviceType + + + ¶ + +
+
+
+

+ Supported + + + Device + + + Types that can be used with TensorRT engines +

+

+ This class is compatable with c10::DeviceTypes (but will check for TRT support) but the only applicable value is at::kCUDA, which maps to + + + DeviceType::kGPU + + +

+

+ To use the + + + DataType + + + class itself, interface using the enum vs. normal instatination +

+

+ ex. torch_tensorrt::DeviceType type = + + + DeviceType::kGPU + + + ; +

+
+

+ Public Types +

+
+
+ + + + enum + + + Value + + + ¶ + +
+
+
+

+ Underlying enum class to support the + + + DeviceType + + + Class +

+

+ In the case that you need to use the + + + DeviceType + + + class itself, interface using this enum vs. normal instatination +

+

+ ex. torch_tensorrt::DeviceType type = + + + DeviceType::kGPU + + + ; +

+

+ + Values: + +

+
+
+ + + + enumerator + + + kGPU + + + ¶ + +
+
+
+

+ Target GPU to run engine. +

+
+
+
+
+ + + + enumerator + + + kDLA + + + ¶ + +
+
+
+

+ Target DLA to run engine. +

+
+
+
+
+
+
+

+ Public Functions +

+
+
+ + + + DeviceType + + + ( + + + ) + + = default + + ¶ + +
+
+
+

+ Construct a new + + + Device + + + Type object. +

+
+
+
+
+ + + + constexpr + + + DeviceType + + + ( + + + Value + + + t + + + ) + + + ¶ + +
+
+
+

+ Construct a new + + + Device + + + Type object from internal enum. +

+
+
+
+
+ + + + DeviceType + + + ( + + c10::DeviceType + + t + + + ) + + + ¶ + +
+
+
+

+ Construct a new + + + Device + + + Type object from torch device enums Note: The only valid value is torch::kCUDA (torch::kCPU is not supported) +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + t + + + : +

    +
  • +
+
+
+
+
+
+
+ + + + operator Value + + + ( + + + ) + + + const + + + ¶ + +
+
+
+

+ Get the internal value from the + + + Device + + + object. +

+

+

+
+
+ + Return + +
+
+

+ Value +

+
+
+
+
+
+
+ + + + operator bool + + + ( + + + ) + + = delete + + ¶ + +
+
+
+
+
+
+
+ + + + constexpr + + bool + + operator== + + + ( + + + DeviceType + + + other + + + ) + + + const + + + ¶ + +
+
+
+

+ Comparison operator for + + + DeviceType + + + . +

+

+

+
+
+ + Return + +
+
+

+ true +

+
+
+ + Return + +
+
+

+ false +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + other + + + : +

    +
  • +
+
+
+
+
+
+
+ + + + constexpr + + bool + + operator!= + + + ( + + + DeviceType + + + other + + + ) + + + const + + + ¶ + +
+
+
+

+ Comparison operator for + + + DeviceType + + + . +

+

+

+
+
+ + Return + +
+
+

+ true +

+
+
+ + Return + +
+
+

+ false +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + other + + + : +

    +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/classtorch__tensorrt_1_1TensorFormat.html b/docs/v1.1.1/_cpp_api/classtorch__tensorrt_1_1TensorFormat.html new file mode 100644 index 0000000000..bf4b8abe12 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/classtorch__tensorrt_1_1TensorFormat.html @@ -0,0 +1,1288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Class TensorFormat — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ Class TensorFormat + + ¶ + +

+ +

+ Class Documentation + + ¶ + +

+
+
+ + + + class + + + torch_tensorrt + + :: + + + + TensorFormat + + + ¶ + +
+
+
+

+ + + TensorFormat + + + is an enum class which defines the memeory layout used to store Tensor Data. +

+
+

+ Public Types +

+
+
+ + + + enum + + + Value + + + ¶ + +
+
+
+

+ Underlying enum class to support the + + + TensorFormat + + + Class +

+

+ In the case that you need to use the + + + TensorFormat + + + class itself, interface using this enum vs. normal instatination +

+

+ ex. + + + torch_tensorrt::TensorFormat + + + type = + + + TensorFormat::kContiguous + + + ; +

+

+ + Values: + +

+
+
+ + + + enumerator + + + kContiguous + + + ¶ + +
+
+
+

+ Contiguous / NCHW / Linear. +

+
+
+
+
+ + + + enumerator + + + kChannelsLast + + + ¶ + +
+
+
+

+ Channel Last / NHWC. +

+
+
+
+
+ + + + enumerator + + + kUnknown + + + ¶ + +
+
+
+

+ Sentinel value. +

+
+
+
+
+
+
+

+ Public Functions +

+
+
+ + + + TensorFormat + + + ( + + + ) + + = default + + ¶ + +
+
+
+

+ Construct a new + + + TensorFormat + + + object. +

+
+
+
+
+ + + + constexpr + + + TensorFormat + + + ( + + + Value + + + t + + + ) + + + ¶ + +
+
+
+

+ + + TensorFormat + + + constructor from enum. +

+
+
+
+
+ + + + TensorFormat + + + ( + + at::MemoryFormat + + t + + + ) + + + ¶ + +
+
+
+

+ Construct a new + + + TensorFormat + + + object from torch type enums. +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + t + + + : +

    +
  • +
+
+
+
+
+
+
+ + + + operator Value + + + ( + + + ) + + + const + + + ¶ + +
+
+
+

+ Get the enum value of the + + + TensorFormat + + + object. +

+

+

+
+
+ + Return + +
+
+

+ Value +

+
+
+
+
+
+
+ + + + operator bool + + + ( + + + ) + + = delete + + ¶ + +
+
+
+
+
+
+
+ + + + constexpr + + bool + + operator== + + + ( + + + TensorFormat + + + other + + + ) + + + const + + + ¶ + +
+
+
+

+ Comparision operator for + + + TensorFormat + + + . +

+

+

+
+
+ + Return + +
+
+

+ true +

+
+
+ + Return + +
+
+

+ false +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + other + + + : +

    +
  • +
+
+
+
+
+
+
+ + + + constexpr + + bool + + operator== + + + ( + + + TensorFormat + + :: + + Value + + + other + + + ) + + + const + + + ¶ + +
+
+
+

+ Comparision operator for + + + TensorFormat + + + . +

+

+

+
+
+ + Return + +
+
+

+ true +

+
+
+ + Return + +
+
+

+ false +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + other + + + : +

    +
  • +
+
+
+
+
+
+
+ + + + constexpr + + bool + + operator!= + + + ( + + + TensorFormat + + + other + + + ) + + + const + + + ¶ + +
+
+
+

+ Comparision operator for + + + TensorFormat + + + . +

+

+

+
+
+ + Return + +
+
+

+ true +

+
+
+ + Return + +
+
+

+ false +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + other + + + : +

    +
  • +
+
+
+
+
+
+
+ + + + constexpr + + bool + + operator!= + + + ( + + + TensorFormat + + :: + + Value + + + other + + + ) + + + const + + + ¶ + +
+
+
+

+ Comparision operator for + + + TensorFormat + + + . +

+

+

+
+
+ + Return + +
+
+

+ true +

+
+
+ + Return + +
+
+

+ false +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + other + + + : +

    +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator.html b/docs/v1.1.1/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator.html new file mode 100644 index 0000000000..1be24327bc --- /dev/null +++ b/docs/v1.1.1/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator.html @@ -0,0 +1,1092 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Template Class Int8CacheCalibrator — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Template Class Int8CacheCalibrator + + ¶ + +

+ +

+ Inheritance Relationships + + ¶ + +

+

+ Base Type + + ¶ + +

+
    +
  • +

    + + + private + + + Algorithm + + +

    +
  • +
+

+ Class Documentation + + ¶ + +

+
+
+ template<typename + + Algorithm + + > +
+ + + + class + + + torch_tensorrt::ptq + + :: + + + + Int8CacheCalibrator + + : + + private + + + Algorithm + + + ¶ + +
+
+
+

+ Generic + + + Int8Calibrator + + + implementation based on a specified TensorRT calibration algorithm that only reads from a calibration file. +

+

+

+
+
+ + Template Parameters + +
+
+
    +
  • +

    + + + Algorithm + + + : class nvinfer1::IInt8Calibrator (Default: nvinfer1::IInt8EntropyCalibrator2) - Algorithm to use +

    +
  • +
+
+
+
+

+ Public Functions +

+
+
+ + + + Int8CacheCalibrator + + + ( + + + const + + std::string & + + cache_file_path + + + ) + + + ¶ + +
+
+
+

+ Construct a new Int 8 Cache Calibrator object. +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + cache_file_path + + + : +

    +
  • +
+
+
+
+
+
+
+ + + int + + getBatchSize + + + ( + + + ) + + + const + + + noexcept + + + override + + + ¶ + +
+
+
+

+ Get the Batch Size for the next batch (always 1 due to issues with TRT and explicit batch) +

+

+

+
+
+ + Return + +
+
+

+ int +

+
+
+
+
+
+
+ + + bool + + getBatch + + + ( + + void * + + bindings + + [], + + const + + char * + + names + + [], int + + nbBindings + + + ) + + + noexcept + + + override + + + ¶ + +
+
+
+

+ Get the next Batch. +

+

+ Not used always returns false +

+

+

+
+
+ + Return + +
+
+

+ false +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + bindings + + + : void*[] - An array of binding pointers (fed in from TensorRT calibrator), these buffers should be filed with batch data for each input +

    +
  • +
  • +

    + + + names + + + : const char*[] - Names of bindings +

    +
  • +
  • +

    + + + nbBindings + + + : int - Number of bindings +

    +
  • +
+
+
+
+
+
+
+ + + + const + + void * + + readCalibrationCache + + + ( + + size_t & + + length + + + ) + + + noexcept + + + override + + + ¶ + +
+
+
+

+ Read calibration cache. +

+

+ How to read from the calibration cache, only enabled if use_cache is set +

+

+

+
+
+ + Return + +
+
+

+ const void* - Pointer to cache data +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + length + + + : +

    +
  • +
+
+
+
+
+
+
+ + + void + + writeCalibrationCache + + + ( + + + const + + void * + + cache + + , size_t + + length + + + ) + + + noexcept + + + override + + + ¶ + +
+
+
+

+ Write calibration cache. +

+

+ Write a the calibration cache provided by TensorRT to a specified file +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + cache + + + : const void* - cache data +

    +
  • +
  • +

    + + + length + + + : size_t - length of cache +

    +
  • +
+
+
+
+
+
+
+ + + + operator nvinfer1::IInt8Calibrator* + + + ( + + + ) + + + ¶ + +
+
+
+

+ operator to cast to nvinfer1::IInt8Calibrator* +

+

+ Convience function to convert to a IInt8Calibrator* to easily be assigned to the ptq_calibrator field in CompileSpec +

+

+

+
+
+ + Return + +
+
+

+ nvinfer1::IInt8Calibrator* +

+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8Calibrator.html b/docs/v1.1.1/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8Calibrator.html new file mode 100644 index 0000000000..dcb11b151e --- /dev/null +++ b/docs/v1.1.1/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8Calibrator.html @@ -0,0 +1,1153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Template Class Int8Calibrator — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Template Class Int8Calibrator + + ¶ + +

+ +

+ Inheritance Relationships + + ¶ + +

+

+ Base Type + + ¶ + +

+
    +
  • +

    + + + private + + + Algorithm + + +

    +
  • +
+

+ Class Documentation + + ¶ + +

+
+
+ template<typename + + Algorithm + + , typename + + DataLoaderUniquePtr + + > +
+ + + + class + + + torch_tensorrt::ptq + + :: + + + + Int8Calibrator + + : + + private + + + Algorithm + + + ¶ + +
+
+
+

+ Generic + + + Int8Calibrator + + + implementation based on a specified TensorRT calibration algorithm and a LibTorch DataLoader. +

+

+

+
+
+ + Template Parameters + +
+
+
    +
  • +

    + + + Algorithm + + + : class nvinfer1::IInt8Calibrator (Default: nvinfer1::IInt8EntropyCalibrator2) - Algorithm to use +

    +
  • +
  • +

    + + + DataLoaderUniquePtr + + + : std::unique_ptr<torch::data::DataLoader> - DataLoader type +

    +
  • +
+
+
+
+

+ Public Functions +

+
+
+ + + + Int8Calibrator + + + ( + + + DataLoaderUniquePtr + + + dataloader + + , + + const + + std::string & + + cache_file_path + + , bool + + use_cache + + + ) + + + ¶ + +
+
+
+

+ Construct a new + + + Int8Calibrator + + + object. +

+

+ Using the provided DataLoader, construct a calibrator that can be used for PTQ with Torch-TensorRT +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + dataloader + + + : std::unqiue_ptr<torch::data::DataLoader> - A unique pointer to the DataLoader, should be what is returned from the make_data_loader factory +

    +
  • +
  • +

    + + + cache_file_path + + + : const std::string& - A path to store / find the calibration cache +

    +
  • +
  • +

    + + + use_cache + + + : : bool - Whether to use the cache (if it exists) +

    +
  • +
+
+
+
+
+
+
+ + + int + + getBatchSize + + + ( + + + ) + + + const + + + noexcept + + + override + + + ¶ + +
+
+
+

+ Get the Batch Size for the next batch (always 1 due to issues with TRT and explicit batch) +

+

+

+
+
+ + Return + +
+
+

+ int +

+
+
+
+
+
+
+ + + bool + + getBatch + + + ( + + void * + + bindings + + [], + + const + + char * + + names + + [], int + + nbBindings + + + ) + + + noexcept + + + override + + + ¶ + +
+
+
+

+ Get the next Batch. +

+

+

+
+
+ + Return + +
+
+

+ true - There is a new batch for the calibrator to consume +

+
+
+ + Return + +
+
+

+ false - There is not a new batch for the calibrator to consume +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + bindings + + + : void*[] - An array of binding pointers (fed in from TensorRT calibrator), these buffers should be filed with batch data for each input +

    +
  • +
  • +

    + + + names + + + : const char*[] - Names of bindings +

    +
  • +
  • +

    + + + nbBindings + + + : int - Number of bindings +

    +
  • +
+
+
+
+
+
+
+ + + + const + + void * + + readCalibrationCache + + + ( + + size_t & + + length + + + ) + + + noexcept + + + override + + + ¶ + +
+
+
+

+ Read calibration cache. +

+

+ How to read from the calibration cache, only enabled if use_cache is set +

+

+

+
+
+ + Return + +
+
+

+ const void* - Pointer to cache data +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + length + + + : +

    +
  • +
+
+
+
+
+
+
+ + + void + + writeCalibrationCache + + + ( + + + const + + void * + + cache + + , size_t + + length + + + ) + + + noexcept + + + override + + + ¶ + +
+
+
+

+ Write calibration cache. +

+

+ Write a the calibration cache provided by TensorRT to a specified file +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + cache + + + : const void* - cache data +

    +
  • +
  • +

    + + + length + + + : size_t - length of cache +

    +
  • +
+
+
+
+
+
+
+ + + + operator nvinfer1::IInt8Calibrator* + + + ( + + + ) + + + ¶ + +
+
+
+

+ operator to cast to nvinfer1::IInt8Calibrator* +

+

+ Convience function to convert to a IInt8Calibrator* to easily be assigned to the ptq_calibrator field in CompileSpec +

+

+

+
+
+ + Return + +
+
+

+ nvinfer1::IInt8Calibrator* +

+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/define_macros_8h_1a18d295a837ac71add5578860b55e5502.html b/docs/v1.1.1/_cpp_api/define_macros_8h_1a18d295a837ac71add5578860b55e5502.html new file mode 100644 index 0000000000..89c58b3b19 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/define_macros_8h_1a18d295a837ac71add5578860b55e5502.html @@ -0,0 +1,604 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Define STR — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268.html b/docs/v1.1.1/_cpp_api/define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268.html new file mode 100644 index 0000000000..a5fe113deb --- /dev/null +++ b/docs/v1.1.1/_cpp_api/define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268.html @@ -0,0 +1,595 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Define TORCH_TENSORRT_PATCH_VERSION — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e.html b/docs/v1.1.1/_cpp_api/define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e.html new file mode 100644 index 0000000000..ec0799846e --- /dev/null +++ b/docs/v1.1.1/_cpp_api/define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e.html @@ -0,0 +1,595 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Define TORCH_TENSORRT_MAJOR_VERSION — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827.html b/docs/v1.1.1/_cpp_api/define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827.html new file mode 100644 index 0000000000..7c4c94d1eb --- /dev/null +++ b/docs/v1.1.1/_cpp_api/define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827.html @@ -0,0 +1,595 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Define TORCH_TENSORRT_MINOR_VERSION — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b.html b/docs/v1.1.1/_cpp_api/define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b.html new file mode 100644 index 0000000000..f200560e9c --- /dev/null +++ b/docs/v1.1.1/_cpp_api/define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b.html @@ -0,0 +1,595 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Define TORCHTRT_API — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da.html b/docs/v1.1.1/_cpp_api/define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da.html new file mode 100644 index 0000000000..57cd407127 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da.html @@ -0,0 +1,604 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Define XSTR — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/define_macros_8h_1ad19939408f7be171a74a89928b36eb59.html b/docs/v1.1.1/_cpp_api/define_macros_8h_1ad19939408f7be171a74a89928b36eb59.html new file mode 100644 index 0000000000..f8d29e1130 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/define_macros_8h_1ad19939408f7be171a74a89928b36eb59.html @@ -0,0 +1,595 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Define TORCHTRT_HIDDEN — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883.html b/docs/v1.1.1/_cpp_api/define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883.html new file mode 100644 index 0000000000..c1f94d0bb9 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883.html @@ -0,0 +1,595 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Define TORCH_TENSORRT_VERSION — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/dir_cpp.html b/docs/v1.1.1/_cpp_api/dir_cpp.html new file mode 100644 index 0000000000..c600255227 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/dir_cpp.html @@ -0,0 +1,554 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Directory cpp — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/dir_cpp_include.html b/docs/v1.1.1/_cpp_api/dir_cpp_include.html new file mode 100644 index 0000000000..fc278ff073 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/dir_cpp_include.html @@ -0,0 +1,569 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Directory include — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/dir_cpp_include_torch_tensorrt.html b/docs/v1.1.1/_cpp_api/dir_cpp_include_torch_tensorrt.html new file mode 100644 index 0000000000..6d8fb0e179 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/dir_cpp_include_torch_tensorrt.html @@ -0,0 +1,596 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Directory tensorrt — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558.html b/docs/v1.1.1/_cpp_api/enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558.html new file mode 100644 index 0000000000..bad6426bad --- /dev/null +++ b/docs/v1.1.1/_cpp_api/enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558.html @@ -0,0 +1,738 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Enum Level — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ Enum Level + + ¶ + +

+ +

+ Enum Documentation + + ¶ + +

+
+
+ + + + enum + + + torch_tensorrt::logging + + :: + + + + Level + + + ¶ + +
+
+
+

+ Emum for setting message severity +

+

+ + Values: + +

+
+
+ + + + enumerator + + + kINTERNAL_ERROR + + + ¶ + +
+
+
+

+ Only print messages for internal errors. +

+
+
+
+
+ + + + enumerator + + + kERROR + + + ¶ + +
+
+
+

+ Print all internal errors and errors (default) +

+
+
+
+
+ + + + enumerator + + + kWARNING + + + ¶ + +
+
+
+

+ Print warnings and errors. +

+
+
+
+
+ + + + enumerator + + + kINFO + + + ¶ + +
+
+
+

+ Print all info, warnings and errors. +

+
+
+
+
+ + + + enumerator + + + kDEBUG + + + ¶ + +
+
+
+

+ Print all debug info, info, warnings and errors. +

+
+
+
+
+ + + + enumerator + + + kGRAPH + + + ¶ + +
+
+
+

+ Print everything including the intermediate graphs of the lowering phase. +

+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb.html b/docs/v1.1.1/_cpp_api/enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb.html new file mode 100644 index 0000000000..22b3544617 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Enum EngineCapability — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ Enum EngineCapability + + ¶ + +

+ +

+ Enum Documentation + + ¶ + +

+
+
+ + + + enum + + + torch_tensorrt + + :: + + + + EngineCapability + + + ¶ + +
+
+
+

+ Emum for selecting engine capability +

+

+ + Values: + +

+
+
+ + + + enumerator + + + kSTANDARD + + + ¶ + +
+
+
+
+
+
+
+ + + + enumerator + + + kSAFETY + + + ¶ + +
+
+
+
+
+
+
+ + + + enumerator + + + kDLA_STANDALONE + + + ¶ + +
+
+
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/file_cpp_include_torch_tensorrt_logging.h.html b/docs/v1.1.1/_cpp_api/file_cpp_include_torch_tensorrt_logging.h.html new file mode 100644 index 0000000000..03d8ff0934 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/file_cpp_include_torch_tensorrt_logging.h.html @@ -0,0 +1,813 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + File logging.h — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ + +
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/file_cpp_include_torch_tensorrt_macros.h.html b/docs/v1.1.1/_cpp_api/file_cpp_include_torch_tensorrt_macros.h.html new file mode 100644 index 0000000000..4134349068 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/file_cpp_include_torch_tensorrt_macros.h.html @@ -0,0 +1,757 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + File macros.h — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ + +
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/file_cpp_include_torch_tensorrt_ptq.h.html b/docs/v1.1.1/_cpp_api/file_cpp_include_torch_tensorrt_ptq.h.html new file mode 100644 index 0000000000..b5c5566a8f --- /dev/null +++ b/docs/v1.1.1/_cpp_api/file_cpp_include_torch_tensorrt_ptq.h.html @@ -0,0 +1,820 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + File ptq.h — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ File ptq.h + + ¶ + +

+

+ ↰ + + + Parent directory + + + ( + + + cpp/include/torch_tensorrt + + + ) +

+ +

+ Definition ( + + + cpp/include/torch_tensorrt/ptq.h + + + ) + + ¶ + +

+ +

+ Includes + + ¶ + +

+
    +
  • +

    + + + NvInfer.h + + +

    +
  • +
  • +

    + + + fstream + + +

    +
  • +
  • +

    + + + iostream + + +

    +
  • +
  • +

    + + + iterator + + +

    +
  • +
  • +

    + + + memory + + +

    +
  • +
  • +

    + + + sstream + + +

    +
  • +
  • +

    + + + string + + +

    +
  • +
  • +

    + + + torch/torch.h + + +

    +
  • +
  • +

    + + + torch_tensorrt/logging.h + + + ( + + + File logging.h + + + ) +

    +
  • +
  • +

    + + + vector + + +

    +
  • +
+

+ Namespaces + + ¶ + +

+ +

+ Classes + + ¶ + +

+ +

+ Functions + + ¶ + +

+ +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/file_cpp_include_torch_tensorrt_torch_tensorrt.h.html b/docs/v1.1.1/_cpp_api/file_cpp_include_torch_tensorrt_torch_tensorrt.h.html new file mode 100644 index 0000000000..0de9d4e746 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/file_cpp_include_torch_tensorrt_torch_tensorrt.h.html @@ -0,0 +1,903 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + File torch_tensorrt.h — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ File torch_tensorrt.h + + ¶ + +

+

+ ↰ + + + Parent directory + + + ( + + + cpp/include/torch_tensorrt + + + ) +

+ +

+ Definition ( + + + cpp/include/torch_tensorrt/torch_tensorrt.h + + + ) + + ¶ + +

+ +

+ Includes + + ¶ + +

+
    +
  • +

    + + + cuda_runtime.h + + +

    +
  • +
  • +

    + + + iostream + + +

    +
  • +
  • +

    + + + memory + + +

    +
  • +
  • +

    + + + set + + +

    +
  • +
  • +

    + + + string + + +

    +
  • +
  • +

    + + + torch_tensorrt/macros.h + + + ( + + + File macros.h + + + ) +

    +
  • +
  • +

    + + + vector + + +

    +
  • +
+

+ Namespaces + + ¶ + +

+ +

+ Classes + + ¶ + +

+ +

+ Enums + + ¶ + +

+ +

+ Functions + + ¶ + +

+ +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/file_view_hierarchy.html b/docs/v1.1.1/_cpp_api/file_view_hierarchy.html new file mode 100644 index 0000000000..e83c917e73 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/file_view_hierarchy.html @@ -0,0 +1,564 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + File Hierarchy — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/function_logging_8h_1a0593f776f469c20469e2f729fc7861a3.html b/docs/v1.1.1/_cpp_api/function_logging_8h_1a0593f776f469c20469e2f729fc7861a3.html new file mode 100644 index 0000000000..31640e28c0 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/function_logging_8h_1a0593f776f469c20469e2f729fc7861a3.html @@ -0,0 +1,608 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Function torch_tensorrt::logging::get_logging_prefix — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Function torch_tensorrt::logging::get_logging_prefix + + ¶ + +

+ +

+ Function Documentation + + ¶ + +

+
+
+ + + TORCHTRT_API std::string + + torch_tensorrt::logging + + :: + + + + get_logging_prefix + + + ( + + + ) + + + ¶ + +
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/function_logging_8h_1a0c012cb374addd90eb1f42eaec570650.html b/docs/v1.1.1/_cpp_api/function_logging_8h_1a0c012cb374addd90eb1f42eaec570650.html new file mode 100644 index 0000000000..a96eeb213c --- /dev/null +++ b/docs/v1.1.1/_cpp_api/function_logging_8h_1a0c012cb374addd90eb1f42eaec570650.html @@ -0,0 +1,628 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Function torch_tensorrt::logging::get_reportable_log_level — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Function torch_tensorrt::logging::get_reportable_log_level + + ¶ + +

+ +

+ Function Documentation + + ¶ + +

+
+
+ + + TORCHTRT_API + + Level + + + torch_tensorrt::logging + + :: + + + + get_reportable_log_level + + + ( + + + ) + + + ¶ + +
+
+
+

+ Get the current reportable log level. +

+

+

+
+
+ + Return + +
+
+

+ TORCHTRT_API get_reportable_log_level +

+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a.html b/docs/v1.1.1/_cpp_api/function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a.html new file mode 100644 index 0000000000..32d89ad5ed --- /dev/null +++ b/docs/v1.1.1/_cpp_api/function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a.html @@ -0,0 +1,625 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Function torch_tensorrt::logging::get_is_colored_output_on — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Function torch_tensorrt::logging::get_is_colored_output_on + + ¶ + +

+ +

+ Function Documentation + + ¶ + +

+
+
+ + + TORCHTRT_API bool + + torch_tensorrt::logging + + :: + + + + get_is_colored_output_on + + + ( + + + ) + + + ¶ + +
+
+
+

+ Is colored output enabled? +

+

+

+
+
+ + Return + +
+
+

+ TORCHTRT_API get_is_colored_output_on +

+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2.html b/docs/v1.1.1/_cpp_api/function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2.html new file mode 100644 index 0000000000..3addbb91e3 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2.html @@ -0,0 +1,640 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Function torch_tensorrt::logging::set_reportable_log_level — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Function torch_tensorrt::logging::set_reportable_log_level + + ¶ + +

+ +

+ Function Documentation + + ¶ + +

+
+
+ + + TORCHTRT_API void + + torch_tensorrt::logging + + :: + + + + set_reportable_log_level + + + ( + + + Level + + + lvl + + + ) + + + ¶ + +
+
+
+

+ Sets the level that logging information needs to be to be added to the log. +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + lvl + + + : torch_tensorrt::logging::Level - Level that messages need to be at or above to be added to the log +

    +
  • +
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8.html b/docs/v1.1.1/_cpp_api/function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8.html new file mode 100644 index 0000000000..ee7ac11d3a --- /dev/null +++ b/docs/v1.1.1/_cpp_api/function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8.html @@ -0,0 +1,654 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Function torch_tensorrt::logging::log — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+ +
+
+
+ + +

+ Function torch_tensorrt::logging::log + + ¶ + +

+ +

+ Function Documentation + + ¶ + +

+
+
+ + + TORCHTRT_API void + + torch_tensorrt::logging + + :: + + + + log + + + ( + + + Level + + + lvl + + , std::string + + msg + + + ) + + + ¶ + +
+
+
+

+ Adds a message to the global log. +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + lvl + + + : torch_tensorrt::logging::Level - Severity of the message +

    +
  • +
  • +

    + + + msg + + + : std::string - Message to be logged +

    +
  • +
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5.html b/docs/v1.1.1/_cpp_api/function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5.html new file mode 100644 index 0000000000..62f17b0a42 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5.html @@ -0,0 +1,638 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Function torch_tensorrt::logging::set_is_colored_output_on — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Function torch_tensorrt::logging::set_is_colored_output_on + + ¶ + +

+ +

+ Function Documentation + + ¶ + +

+
+
+ + + TORCHTRT_API void + + torch_tensorrt::logging + + :: + + + + set_is_colored_output_on + + + ( + + bool + + colored_output_on + + + ) + + + ¶ + +
+
+
+

+ Sets if logging prefix will be colored (helpful when debugging but not always supported by terminal) +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + colored_output_on + + + : bool - If the output will be colored or not +

    +
  • +
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/function_logging_8h_1af8f3443813315af7901903d25dd495cc.html b/docs/v1.1.1/_cpp_api/function_logging_8h_1af8f3443813315af7901903d25dd495cc.html new file mode 100644 index 0000000000..0df08db867 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/function_logging_8h_1af8f3443813315af7901903d25dd495cc.html @@ -0,0 +1,612 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Function torch_tensorrt::logging::set_logging_prefix — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Function torch_tensorrt::logging::set_logging_prefix + + ¶ + +

+ +

+ Function Documentation + + ¶ + +

+
+
+ + + TORCHTRT_API void + + torch_tensorrt::logging + + :: + + + + set_logging_prefix + + + ( + + std::string + + prefix + + + ) + + + ¶ + +
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c.html b/docs/v1.1.1/_cpp_api/function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c.html new file mode 100644 index 0000000000..349e918a19 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c.html @@ -0,0 +1,656 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Template Function torch_tensorrt::ptq::make_int8_cache_calibrator — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Template Function torch_tensorrt::ptq::make_int8_cache_calibrator + + ¶ + +

+ +

+ Function Documentation + + ¶ + +

+
+
+ template<typename + + Algorithm + + = nvinfer1::IInt8EntropyCalibrator2> +
+ + + TORCHTRT_API + + Int8CacheCalibrator + + < + + Algorithm + + > + + torch_tensorrt::ptq + + :: + + + + make_int8_cache_calibrator + + + ( + + + const + + std::string & + + cache_file_path + + + ) + + + ¶ + +
+
+
+

+ A factory to build a post training quantization calibrator from a torch dataloader that only uses the calibration cache. +

+

+ Creates a calibrator to use for post training quantization which reads from a previously created calibration cache, therefore you can have a calibration cache generating program that requires a dataloader and a dataset, then save the cache to use later in a different program that needs to calibrate from scratch and not have the dataset dependency. However, the network should also be recalibrated if its structure changes, or the input data set changes, and it is the responsibility of the application to ensure this. +

+

+ By default the returned calibrator uses TensorRT Entropy v2 algorithm to perform calibration. This is recommended for feed forward networks You can override the algorithm selection (such as to use the MinMax Calibrator recomended for NLP tasks) by calling make_int8_calibrator with the calibrator class as a template parameter. +

+

+ e.g. torch_tensorrt::ptq::make_int8_cache_calibrator<nvinfer1::IInt8MinMaxCalibrator>(calibration_cache_file); +

+
+
+ + Return + +
+
+

+ Int8CacheCalibrator<Algorithm> +

+
+
+ + Template Parameters + +
+
+
    +
  • +

    + + + Algorithm + + + : class nvinfer1::IInt8Calibrator (Default: nvinfer1::IInt8EntropyCalibrator2) - Algorithm to use +

    +
  • +
+
+
+ + Parameters + +
+
+
    +
  • +

    + + + cache_file_path + + + : const std::string& - Path to read/write calibration cache +

    +
  • +
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178.html b/docs/v1.1.1/_cpp_api/function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178.html new file mode 100644 index 0000000000..443e25cd45 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178.html @@ -0,0 +1,713 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Template Function torch_tensorrt::ptq::make_int8_calibrator — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Template Function torch_tensorrt::ptq::make_int8_calibrator + + ¶ + +

+ +

+ Function Documentation + + ¶ + +

+
+
+ template<typename + + Algorithm + + = nvinfer1::IInt8EntropyCalibrator2, typename + + DataLoader + + > +
+ + + TORCHTRT_API + + Int8Calibrator + + < + + Algorithm + + , + + DataLoader + + > + + torch_tensorrt::ptq + + :: + + + + make_int8_calibrator + + + ( + + + DataLoader + + + dataloader + + , + + const + + std::string & + + cache_file_path + + , bool + + use_cache + + + ) + + + ¶ + +
+
+
+

+ A factory to build a post training quantization calibrator from a torch dataloader. +

+

+ Creates a calibrator to use for post training quantization. By default the returned calibrator uses TensorRT Entropy v2 algorithm to perform calibration. This is recommended for feed forward networks. You can override the algorithm selection (such as to use the MinMax Calibrator recomended for NLP tasks) by calling make_int8_calibrator with the calibrator class as a template parameter. +

+

+ e.g. + + + torch_tensorrt::ptq::make_int8_calibrator<nvinfer1::IInt8MinMaxCalibrator>(std::move(calibration_dataloader), + + + calibration_cache_file, + + + use_cache); + + +

+
+
+ + Return + +
+
+

+ Int8Calibrator<Algorithm, DataLoader> +

+
+
+ + Template Parameters + +
+
+
    +
  • +

    + + + Algorithm + + + : class nvinfer1::IInt8Calibrator (Default: nvinfer1::IInt8EntropyCalibrator2) - Algorithm to use +

    +
  • +
  • +

    + + + DataLoader + + + : std::unique_ptr<torch::data::DataLoader> - DataLoader type +

    +
  • +
+
+
+ + Parameters + +
+
+
    +
  • +

    + + + dataloader + + + : std::unique_ptr<torch::data::DataLoader> - DataLoader containing data +

    +
  • +
  • +

    + + + cache_file_path + + + : const std::string& - Path to read/write calibration cache +

    +
  • +
  • +

    + + + use_cache + + + : bool - use calibration cache +

    +
  • +
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039.html b/docs/v1.1.1/_cpp_api/function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039.html new file mode 100644 index 0000000000..083b6158a6 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039.html @@ -0,0 +1,745 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Template Function torch_tensorrt::ptq::make_int8_calibrator — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Template Function torch_tensorrt::ptq::make_int8_calibrator + + ¶ + +

+ +

+ Function Documentation + + ¶ + +

+
+
+ template<typename + + Algorithm + + = nvinfer1::IInt8EntropyCalibrator2, typename + + DataLoader + + > +
+ + + TORCHTRT_API + + Int8Calibrator + + < + + Algorithm + + , + + DataLoader + + > + + torch_tensorrt::ptq + + :: + + + + make_int8_calibrator + + + ( + + + DataLoader + + + dataloader + + , + + const + + std::string & + + cache_file_path + + , bool + + use_cache + + + ) + +
+
+
+

+ A factory to build a post training quantization calibrator from a torch dataloader. +

+

+ Creates a calibrator to use for post training quantization. By default the returned calibrator uses TensorRT Entropy v2 algorithm to perform calibration. This is recommended for feed forward networks. You can override the algorithm selection (such as to use the MinMax Calibrator recomended for NLP tasks) by calling make_int8_calibrator with the calibrator class as a template parameter. +

+

+ e.g. + + + torch_tensorrt::ptq::make_int8_calibrator<nvinfer1::IInt8MinMaxCalibrator>(std::move(calibration_dataloader), + + + calibration_cache_file, + + + use_cache); + + +

+
+
+ + Return + +
+
+

+ Int8Calibrator<Algorithm, DataLoader> +

+
+
+ + Template Parameters + +
+
+
    +
  • +

    + + + Algorithm + + + : class nvinfer1::IInt8Calibrator (Default: nvinfer1::IInt8EntropyCalibrator2) - Algorithm to use +

    +
  • +
  • +

    + + + DataLoader + + + : std::unique_ptr<torch::data::DataLoader> - DataLoader type +

    +
  • +
+
+
+ + Parameters + +
+
+
    +
  • +

    + + + dataloader + + + : std::unique_ptr<torch::data::DataLoader> - DataLoader containing data +

    +
  • +
  • +

    + + + cache_file_path + + + : const std::string& - Path to read/write calibration cache +

    +
  • +
  • +

    + + + use_cache + + + : bool - use calibration cache +

    +
  • +
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa.html b/docs/v1.1.1/_cpp_api/function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa.html new file mode 100644 index 0000000000..ad01af93fe --- /dev/null +++ b/docs/v1.1.1/_cpp_api/function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Template Function torch_tensorrt::ptq::make_int8_cache_calibrator — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Template Function torch_tensorrt::ptq::make_int8_cache_calibrator + + ¶ + +

+ +

+ Function Documentation + + ¶ + +

+
+
+ template<typename + + Algorithm + + = nvinfer1::IInt8EntropyCalibrator2> +
+ + + TORCHTRT_API + + Int8CacheCalibrator + + < + + Algorithm + + > + + torch_tensorrt::ptq + + :: + + + + make_int8_cache_calibrator + + + ( + + + const + + std::string & + + cache_file_path + + + ) + +
+
+
+

+ A factory to build a post training quantization calibrator from a torch dataloader that only uses the calibration cache. +

+

+ Creates a calibrator to use for post training quantization which reads from a previously created calibration cache, therefore you can have a calibration cache generating program that requires a dataloader and a dataset, then save the cache to use later in a different program that needs to calibrate from scratch and not have the dataset dependency. However, the network should also be recalibrated if its structure changes, or the input data set changes, and it is the responsibility of the application to ensure this. +

+

+ By default the returned calibrator uses TensorRT Entropy v2 algorithm to perform calibration. This is recommended for feed forward networks You can override the algorithm selection (such as to use the MinMax Calibrator recomended for NLP tasks) by calling make_int8_calibrator with the calibrator class as a template parameter. +

+

+ e.g. torch_tensorrt::ptq::make_int8_cache_calibrator<nvinfer1::IInt8MinMaxCalibrator>(calibration_cache_file); +

+
+
+ + Return + +
+
+

+ Int8CacheCalibrator<Algorithm> +

+
+
+ + Template Parameters + +
+
+
    +
  • +

    + + + Algorithm + + + : class nvinfer1::IInt8Calibrator (Default: nvinfer1::IInt8EntropyCalibrator2) - Algorithm to use +

    +
  • +
+
+
+ + Parameters + +
+
+
    +
  • +

    + + + cache_file_path + + + : const std::string& - Path to read/write calibration cache +

    +
  • +
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797.html b/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797.html new file mode 100644 index 0000000000..f4079feb1b --- /dev/null +++ b/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Function torch_tensorrt::torchscript::check_method_operator_support — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Function torch_tensorrt::torchscript::check_method_operator_support + + ¶ + +

+ +

+ Function Documentation + + ¶ + +

+
+
+ + + TORCHTRT_API bool + + torch_tensorrt::torchscript + + :: + + + + check_method_operator_support + + + ( + + + const + + torch::jit::Module & + + module + + , std::string + + method_name + + + ) + + + ¶ + +
+
+
+

+ Check to see if a module is fully supported by the compiler. +

+

+

+

+ Takes a module and a method name and checks if the method graph contains purely convertable operators +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + module + + + : torch::jit::script::Module - Existing TorchScript module +

    +
  • +
  • +

    + + + method_name + + + : std::string - Name of method to compile +

    +
  • +
+
+
+

+ Will print out a list of unsupported operators if the graph is unsupported +

+

+

+
+
+ + Return + +
+
+

+ bool: Method is supported by Torch-TensorRT.TorchScript +

+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9.html b/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9.html new file mode 100644 index 0000000000..01dab78454 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Function torch_tensorrt::torchscript::compile — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Function torch_tensorrt::torchscript::compile + + ¶ + +

+ +

+ Function Documentation + + ¶ + +

+
+
+ + + TORCHTRT_API torch::jit::Module + + torch_tensorrt::torchscript + + :: + + + + compile + + + ( + + + const + + torch::jit::Module & + + module + + , + + CompileSpec + + + info + + + ) + + + ¶ + +
+
+
+

+ Compile a TorchScript module for NVIDIA GPUs using TensorRT. +

+

+

+

+ Takes a existing TorchScript module and a set of settings to configure the compiler and will convert methods to JIT Graphs which call equivalent TensorRT engines +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + module + + + : torch::jit::Module - Existing TorchScript module +

    +
  • +
  • +

    + + + info + + + : torch_tensorrt::CompileSpec - Compilation settings +

    +
  • +
+
+
+

+ Converts specifically the forward method of a TorchScript Module +

+

+

+
+
+ + Return + +
+
+

+ : A new module trageting a TensorRT engine +

+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef.html b/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef.html new file mode 100644 index 0000000000..88e8d5ab19 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef.html @@ -0,0 +1,696 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Function torch_tensorrt::torchscript::embed_engine_in_new_module — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Function torch_tensorrt::torchscript::embed_engine_in_new_module + + ¶ + +

+ +

+ Function Documentation + + ¶ + +

+
+
+ + + TORCHTRT_API torch::jit::Module + + torch_tensorrt::torchscript + + :: + + + + embed_engine_in_new_module + + + ( + + + const + + std::string & + + engine + + , + + Device + + + device + + + ) + + + ¶ + +
+
+
+

+ Take a previously created TensorRT engine and embed it in in a TorchScript module. +

+

+

+

+ Takes a pre-built serialized TensorRT engine and embeds it in a TorchScript module. Registers execution of the engine as the forward method of the module Forward is defined as: forward(Tensor[]) -> Tensor[] +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + engine + + + : std::string - Pre-built serialized TensorRT engine +

    +
  • +
  • +

    + + + device + + + : CompileSepc::Device - + + + Device + + + information +

    +
  • +
+
+
+

+ TensorRT bindings must have names with the following format: +

+
    +
  • +

    + [symbol].[index in input / output array] ex. +

    +
  • +
  • +

    + [x.0, x.1, x.2] -> [y.0] +

    +
  • +
+

+

+
+
+ + Return + +
+
+

+ : A new module targeting a TensorRT engine +

+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528.html b/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528.html new file mode 100644 index 0000000000..7bde28dcc5 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528.html @@ -0,0 +1,625 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Function torch_tensorrt::get_build_info — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+ +
+
+
+ + +

+ Function torch_tensorrt::get_build_info + + ¶ + +

+ +

+ Function Documentation + + ¶ + +

+
+
+ + + TORCHTRT_API std::string + + torch_tensorrt + + :: + + + + get_build_info + + + ( + + + ) + + + ¶ + +
+
+
+

+ Get the build information for the library including the dependency versions. +

+

+

+
+
+ + Return + +
+
+

+ std::string +

+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384.html b/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384.html new file mode 100644 index 0000000000..8436ace813 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384.html @@ -0,0 +1,641 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Function torch_tensorrt::set_device — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+ +
+
+
+ + +

+ Function torch_tensorrt::set_device + + ¶ + +

+ +

+ Function Documentation + + ¶ + +

+
+
+ + + TORCHTRT_API void + + torch_tensorrt + + :: + + + + set_device + + + ( + + + const + + int + + gpu_id + + + ) + + + ¶ + +
+
+
+

+ Set gpu device id. +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + gpu_id + + + : Sets gpu id using cudaSetDevice +

    +
  • +
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1.html b/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1.html new file mode 100644 index 0000000000..c156689bec --- /dev/null +++ b/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1.html @@ -0,0 +1,611 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Function torch_tensorrt::dump_build_info — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+ +
+
+
+ + +

+ Function torch_tensorrt::dump_build_info + + ¶ + +

+ +

+ Function Documentation + + ¶ + +

+
+
+ + + TORCHTRT_API void + + torch_tensorrt + + :: + + + + dump_build_info + + + ( + + + ) + + + ¶ + +
+
+
+

+ Dump the version information for Torch-TensorRT including base libtorch and TensorRT versions to stdout. +

+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2.html b/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2.html new file mode 100644 index 0000000000..7bc593e9a0 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Function torch_tensorrt::torchscript::convert_method_to_trt_engine — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Function torch_tensorrt::torchscript::convert_method_to_trt_engine + + ¶ + +

+ +

+ Function Documentation + + ¶ + +

+
+
+ + + TORCHTRT_API std::string + + torch_tensorrt::torchscript + + :: + + + + convert_method_to_trt_engine + + + ( + + + const + + torch::jit::Module & + + module + + , std::string + + method_name + + , + + CompileSpec + + + info + + + ) + + + ¶ + +
+
+
+

+ Compile a TorchScript method for NVIDIA GPUs using TensorRT. +

+

+

+

+ Takes a existing TorchScript module and a set of settings to configure the compiler and will convert selected method to a serialized TensorRT engine which can be run with TensorRT +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + module + + + : torch::jit::Module - Existing TorchScript module +

    +
  • +
  • +

    + + + method_name + + + : std::string - Name of method to compile +

    +
  • +
  • +

    + + + info + + + : torch_tensorrt::CompileSpec - Compilation settings +

    +
  • +
+
+
+

+

+
+
+ + Return + +
+
+

+ : std::string: Serialized TensorRT engine equivilant to the method graph +

+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/namespace_torch_tensorrt.html b/docs/v1.1.1/_cpp_api/namespace_torch_tensorrt.html new file mode 100644 index 0000000000..642dc9570f --- /dev/null +++ b/docs/v1.1.1/_cpp_api/namespace_torch_tensorrt.html @@ -0,0 +1,797 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Namespace torch_tensorrt — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/namespace_torch_tensorrt__logging.html b/docs/v1.1.1/_cpp_api/namespace_torch_tensorrt__logging.html new file mode 100644 index 0000000000..2cf77cd9bd --- /dev/null +++ b/docs/v1.1.1/_cpp_api/namespace_torch_tensorrt__logging.html @@ -0,0 +1,711 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Namespace torch_tensorrt::logging — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/namespace_torch_tensorrt__ptq.html b/docs/v1.1.1/_cpp_api/namespace_torch_tensorrt__ptq.html new file mode 100644 index 0000000000..8bcfecc155 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/namespace_torch_tensorrt__ptq.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Namespace torch_tensorrt::ptq — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/namespace_torch_tensorrt__torchscript.html b/docs/v1.1.1/_cpp_api/namespace_torch_tensorrt__torchscript.html new file mode 100644 index 0000000000..45ad12d1a1 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/namespace_torch_tensorrt__torchscript.html @@ -0,0 +1,684 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Namespace torch_tensorrt::torchscript — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_logging.h.html b/docs/v1.1.1/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_logging.h.html new file mode 100644 index 0000000000..f4e1e74a95 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_logging.h.html @@ -0,0 +1,569 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Program Listing for File logging.h — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ Program Listing for File logging.h + + ¶ + +

+

+ ↰ + + + Return to documentation for file + + + ( + + + cpp/include/torch_tensorrt/logging.h + + + ) +

+
+
+
/*
+ * Copyright (c) NVIDIA Corporation.
+ * All rights reserved.
+ *
+ * This library is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+#pragma once
+
+#include <string>
+#include "torch_tensorrt/macros.h"
+
+namespace torch_tensorrt {
+namespace logging {
+enum Level {
+  kINTERNAL_ERROR,
+  kERROR,
+  kWARNING,
+  kINFO,
+  kDEBUG,
+  kGRAPH,
+};
+
+// Are these ones necessary for the user?
+TORCHTRT_API std::string get_logging_prefix();
+TORCHTRT_API void set_logging_prefix(std::string prefix);
+
+TORCHTRT_API void set_reportable_log_level(Level lvl);
+
+TORCHTRT_API void set_is_colored_output_on(bool colored_output_on);
+
+TORCHTRT_API Level get_reportable_log_level();
+
+TORCHTRT_API bool get_is_colored_output_on();
+
+// Dont know if we want this?
+TORCHTRT_API void log(Level lvl, std::string msg);
+} // namespace logging
+} // namespace torch_tensorrt
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_macros.h.html b/docs/v1.1.1/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_macros.h.html new file mode 100644 index 0000000000..726e07d6e6 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_macros.h.html @@ -0,0 +1,564 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Program Listing for File macros.h — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ Program Listing for File macros.h + + ¶ + +

+

+ ↰ + + + Return to documentation for file + + + ( + + + cpp/include/torch_tensorrt/macros.h + + + ) +

+
+
+
/*
+ * Copyright (c) NVIDIA Corporation.
+ * All rights reserved.
+ *
+ * This library is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+#pragma once
+
+#if defined(__GNUC__)
+#define TORCHTRT_API __attribute__((__visibility__("default")))
+#define TORCHTRT_HIDDEN __attribute__((__visibility__("hidden")))
+#else
+#define TORCHTRT_API
+#define TORCHTRT_HIDDEN
+#endif // defined(__GNUC__)
+
+// Does this need to be gaurded or something?
+#define XSTR(x) #x
+#define STR(x) XSTR(x)
+
+#define TORCH_TENSORRT_MAJOR_VERSION 1
+#define TORCH_TENSORRT_MINOR_VERSION 1
+#define TORCH_TENSORRT_PATCH_VERSION 0
+#define TORCH_TENSORRT_VERSION      \
+  STR(TORCH_TENSORRT_MAJOR_VERSION) \
+  "." STR(TORCH_TENSORRT_MINOR_VERSION) "." STR(TORCH_TENSORRT_PATCH_VERSION)
+
+// Setup namespace aliases for ease of use
+namespace torch_tensorrt {
+namespace torchscript {}
+namespace ts = torchscript;
+} // namespace torch_tensorrt
+namespace torchtrt = torch_tensorrt;
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_ptq.h.html b/docs/v1.1.1/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_ptq.h.html new file mode 100644 index 0000000000..0b1eced173 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_ptq.h.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Program Listing for File ptq.h — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ Program Listing for File ptq.h + + ¶ + +

+

+ ↰ + + + Return to documentation for file + + + ( + + + cpp/include/torch_tensorrt/ptq.h + + + ) +

+
+
+
/*
+ * Copyright (c) NVIDIA Corporation.
+ * All rights reserved.
+ *
+ * This library is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+#pragma once
+
+#include <fstream>
+#include <iostream>
+#include <iterator>
+#include <memory>
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include "NvInfer.h"
+#include "torch/torch.h"
+#include "torch_tensorrt/logging.h"
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+namespace nvinfer1 {
+class IInt8Calibrator;
+class IInt8EntropyCalibrator2;
+} // namespace nvinfer1
+
+namespace torch_tensorrt {
+namespace ptq {
+bool get_batch_impl(void* bindings[], const char* names[], int nbBindings, torch::Tensor& data);
+}
+} // namespace torch_tensorrt
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+
+namespace torch_tensorrt {
+namespace ptq {
+
+template <typename Algorithm, typename DataLoaderUniquePtr>
+class Int8Calibrator : Algorithm {
+  using DataLoader = typename DataLoaderUniquePtr::element_type;
+  using Batch = typename DataLoader::super::BatchType;
+
+ public:
+  Int8Calibrator(DataLoaderUniquePtr dataloader, const std::string& cache_file_path, bool use_cache)
+      : dataloader_(dataloader.get()), cache_file_path_(cache_file_path), use_cache_(use_cache) {
+    for (auto batch : *dataloader_) {
+      batched_data_.push_back(batch.data);
+    }
+    it_ = batched_data_.begin();
+  }
+
+  int getBatchSize() const noexcept override {
+    // HACK: Torch-TensorRT only uses explict batch sizing, INT8 Calibrator does not
+    // work when reporting the batch size here and having explicity batching.
+    // So we just report batch size 1 (warnings will still be printed out).
+    return 1;
+    // return static_cast<int>(dataloader_->options().batch_size);
+  }
+
+  bool getBatch(void* bindings[], const char* names[], int nbBindings) noexcept override {
+    if (it_ != batched_data_.end()) {
+      auto status = get_batch_impl(bindings, names, nbBindings, *it_);
+      it_ = ++it_;
+      return status;
+    } else {
+      // Reset iterator if incase calibrator is going to be used again
+      it_ = batched_data_.begin();
+      return false;
+    }
+  }
+
+  const void* readCalibrationCache(size_t& length) noexcept override {
+    if (use_cache_) {
+      std::stringstream ss;
+      ss << "Reading Calibration Cache from " << cache_file_path_;
+      logging::log(logging::Level::kINFO, ss.str());
+
+      cache_.clear();
+      std::ifstream input(cache_file_path_, std::ios::binary);
+      input >> std::noskipws;
+      if (input.good()) {
+        std::copy(std::istream_iterator<char>(input), std::istream_iterator<char>(), std::back_inserter(cache_));
+        logging::log(logging::Level::kDEBUG, "Cache read");
+      }
+      length = cache_.size();
+      return length ? cache_.data() : nullptr;
+    }
+    return nullptr;
+  }
+
+  void writeCalibrationCache(const void* cache, size_t length) noexcept override {
+    std::ofstream cache_file(cache_file_path_, std::ios::binary);
+    cache_file.write(reinterpret_cast<const char*>(cache), length);
+    std::stringstream ss;
+    ss << "Saved Calibration Cache to " << cache_file_path_;
+    logging::log(logging::Level::kINFO, ss.str());
+  }
+
+  operator nvinfer1::IInt8Calibrator*() {
+    return reinterpret_cast<nvinfer1::IInt8Calibrator*>(this);
+  }
+
+ private:
+  DataLoader* dataloader_;
+  const std::string& cache_file_path_;
+  size_t cache_size_ = 0;
+  bool use_cache_;
+  std::vector<char> cache_;
+  std::vector<torch::Tensor> batched_data_;
+  std::vector<torch::Tensor>::iterator it_;
+};
+
+template <typename Algorithm>
+class Int8CacheCalibrator : Algorithm {
+ public:
+  Int8CacheCalibrator(const std::string& cache_file_path) : cache_file_path_(cache_file_path) {}
+
+  int getBatchSize() const noexcept override {
+    // HACK: Torch-TensorRT only uses explict batch sizing, INT8 Calibrator does not
+    // work when reporting the batch size here and having explicity batching.
+    // So we just report batch size 1 (warnings will still be printed out).
+    return 1;
+  }
+
+  bool getBatch(void* bindings[], const char* names[], int nbBindings) noexcept override {
+    return false;
+  }
+
+  const void* readCalibrationCache(size_t& length) noexcept override {
+    std::stringstream ss;
+    ss << "Reading Calibration Cache from " << cache_file_path_;
+    logging::log(logging::Level::kINFO, ss.str());
+
+    cache_.clear();
+    std::ifstream input(cache_file_path_, std::ios::binary);
+    input >> std::noskipws;
+    if (input.good()) {
+      std::copy(std::istream_iterator<char>(input), std::istream_iterator<char>(), std::back_inserter(cache_));
+      logging::log(logging::Level::kDEBUG, "Cache read");
+    }
+    length = cache_.size();
+    return length ? cache_.data() : nullptr;
+  }
+
+  void writeCalibrationCache(const void* cache, size_t length) noexcept override {
+    std::ofstream cache_file(cache_file_path_, std::ios::binary);
+    cache_file.write(reinterpret_cast<const char*>(cache), length);
+    std::stringstream ss;
+    ss << "Saved Calibration Cache to " << cache_file_path_;
+    logging::log(logging::Level::kINFO, ss.str());
+  }
+
+  operator nvinfer1::IInt8Calibrator*() {
+    return reinterpret_cast<nvinfer1::IInt8Calibrator*>(this);
+  }
+
+ private:
+  const std::string& cache_file_path_;
+  size_t cache_size_ = 0;
+  std::vector<char> cache_;
+};
+
+template <typename Algorithm = nvinfer1::IInt8EntropyCalibrator2, typename DataLoader>
+TORCHTRT_API inline Int8Calibrator<Algorithm, DataLoader> make_int8_calibrator(
+    DataLoader dataloader,
+    const std::string& cache_file_path,
+    bool use_cache) {
+  return Int8Calibrator<Algorithm, DataLoader>(std::move(dataloader), cache_file_path, use_cache);
+}
+
+template <typename Algorithm = nvinfer1::IInt8EntropyCalibrator2>
+TORCHTRT_API inline Int8CacheCalibrator<Algorithm> make_int8_cache_calibrator(const std::string& cache_file_path) {
+  return Int8CacheCalibrator<Algorithm>(cache_file_path);
+}
+
+} // namespace ptq
+} // namespace torch_tensorrt
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h.html b/docs/v1.1.1/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h.html new file mode 100644 index 0000000000..6c569aa5b1 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h.html @@ -0,0 +1,799 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Program Listing for File torch_tensorrt.h — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ Program Listing for File torch_tensorrt.h + + ¶ + +

+

+ ↰ + + + Return to documentation for file + + + ( + + + cpp/include/torch_tensorrt/torch_tensorrt.h + + + ) +

+
+
+
/*
+ * Copyright (c) NVIDIA Corporation.
+ * All rights reserved.
+ *
+ * This library is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#pragma once
+
+#include <cuda_runtime.h>
+#include <iostream>
+#include <memory>
+#include <set>
+#include <string>
+#include <vector>
+
+// Just include the .h?
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+namespace torch {
+namespace jit {
+struct Graph;
+struct Module;
+} // namespace jit
+} // namespace torch
+
+namespace c10 {
+enum class DeviceType : int8_t;
+enum class ScalarType : int8_t;
+template <class>
+class ArrayRef;
+} // namespace c10
+
+namespace nvinfer1 {
+class IInt8Calibrator;
+}
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+
+#include "torch_tensorrt/macros.h"
+namespace torch_tensorrt {
+class TORCHTRT_API DataType {
+ public:
+  enum Value : int8_t {
+    kFloat,
+    kHalf,
+    kChar,
+    kInt,
+    kBool,
+    kUnknown
+  };
+
+  DataType() = default;
+  constexpr DataType(Value t) : value(t) {}
+  DataType(c10::ScalarType t);
+  operator Value() const {
+    return value;
+  }
+  explicit operator bool() = delete;
+  constexpr bool operator==(DataType other) const {
+    return value == other.value;
+  }
+  constexpr bool operator==(DataType::Value other) const {
+    return value == other;
+  }
+  constexpr bool operator!=(DataType other) const {
+    return value != other.value;
+  }
+  constexpr bool operator!=(DataType::Value other) const {
+    return value != other;
+  }
+
+ private:
+  friend std::ostream& operator<<(std::ostream& os, const DataType& dtype);
+  Value value;
+};
+
+struct Device {
+  class DeviceType {
+   public:
+    enum Value : int8_t {
+      kGPU,
+      kDLA,
+    };
+
+    DeviceType() = default;
+    constexpr DeviceType(Value t) : value(t) {}
+    DeviceType(c10::DeviceType t);
+    operator Value() const {
+      return value;
+    }
+    explicit operator bool() = delete;
+    constexpr bool operator==(DeviceType other) const {
+      return value == other.value;
+    }
+    constexpr bool operator!=(DeviceType other) const {
+      return value != other.value;
+    }
+
+   private:
+    Value value;
+  };
+
+  DeviceType device_type;
+
+  /*
+   * Target gpu id
+   */
+  int64_t gpu_id;
+
+  /*
+   * When using DLA core on NVIDIA AGX platforms gpu_id should be set as Xavier device
+   */
+  int64_t dla_core;
+
+  bool allow_gpu_fallback;
+
+  Device() : device_type(DeviceType::kGPU), gpu_id(0), dla_core(0), allow_gpu_fallback(false) {}
+};
+
+enum class EngineCapability : int8_t {
+  kSTANDARD,
+  kSAFETY,
+  kDLA_STANDALONE,
+};
+
+class TORCHTRT_API TensorFormat {
+ public:
+  enum Value : int8_t {
+    kContiguous,
+    kChannelsLast,
+    kUnknown,
+  };
+
+  TensorFormat() = default;
+  constexpr TensorFormat(Value t) : value(t) {}
+  TensorFormat(at::MemoryFormat t);
+  operator Value() const {
+    return value;
+  }
+  explicit operator bool() = delete;
+  constexpr bool operator==(TensorFormat other) const {
+    return value == other.value;
+  }
+  constexpr bool operator==(TensorFormat::Value other) const {
+    return value == other;
+  }
+  constexpr bool operator!=(TensorFormat other) const {
+    return value != other.value;
+  }
+  constexpr bool operator!=(TensorFormat::Value other) const {
+    return value != other;
+  }
+
+ private:
+  friend std::ostream& operator<<(std::ostream& os, const TensorFormat& format);
+  Value value;
+};
+
+struct TORCHTRT_API Input {
+  std::vector<int64_t> min_shape;
+  std::vector<int64_t> opt_shape;
+  std::vector<int64_t> max_shape;
+  std::vector<int64_t> shape;
+  DataType dtype;
+  TensorFormat format;
+
+  Input(std::vector<int64_t> shape, TensorFormat format = TensorFormat::kContiguous);
+
+  Input(std::vector<int64_t> shape, DataType dtype, TensorFormat format = TensorFormat::kContiguous);
+
+  Input(c10::ArrayRef<int64_t> shape, TensorFormat format = TensorFormat::kContiguous);
+
+  Input(c10::ArrayRef<int64_t> shape, DataType dtype, TensorFormat format = TensorFormat::kContiguous);
+
+  Input(
+      std::vector<int64_t> min_shape,
+      std::vector<int64_t> opt_shape,
+      std::vector<int64_t> max_shape,
+      TensorFormat format = TensorFormat::kContiguous);
+
+  Input(
+      std::vector<int64_t> min_shape,
+      std::vector<int64_t> opt_shape,
+      std::vector<int64_t> max_shape,
+      DataType dtype,
+      TensorFormat format = TensorFormat::kContiguous);
+
+  Input(
+      c10::ArrayRef<int64_t> min_shape,
+      c10::ArrayRef<int64_t> opt_shape,
+      c10::ArrayRef<int64_t> max_shape,
+      TensorFormat format = TensorFormat::kContiguous);
+
+  Input(
+      c10::ArrayRef<int64_t> min_shape,
+      c10::ArrayRef<int64_t> opt_shape,
+      c10::ArrayRef<int64_t> max_shape,
+      DataType dtype,
+      TensorFormat format = TensorFormat::kContiguous);
+
+  Input(at::Tensor tensor);
+
+ private:
+  friend std::ostream& operator<<(std::ostream& os, const Input& input);
+  bool input_is_dynamic;
+};
+
+TORCHTRT_API std::string get_build_info();
+
+TORCHTRT_API void dump_build_info();
+
+TORCHTRT_API void set_device(const int gpu_id);
+
+namespace torchscript {
+struct TORCHTRT_API CompileSpec {
+  CompileSpec(std::vector<std::vector<int64_t>> fixed_sizes);
+
+  CompileSpec(std::vector<c10::ArrayRef<int64_t>> fixed_sizes);
+
+  CompileSpec(std::vector<Input> inputs) : inputs(std::move(inputs)) {}
+
+  // Defaults should reflect TensorRT defaults for BuilderConfig
+
+  std::vector<Input> inputs;
+
+  std::set<DataType> enabled_precisions = {DataType::kFloat};
+
+  bool disable_tf32 = false;
+
+  bool sparse_weights = false;
+
+  bool refit = false;
+
+  bool debug = false;
+
+  bool truncate_long_and_double = false;
+
+  Device device;
+
+  EngineCapability capability = EngineCapability::kSTANDARD;
+
+  uint64_t num_min_timing_iters = 2;
+  uint64_t num_avg_timing_iters = 1;
+
+  uint64_t workspace_size = 0;
+
+  nvinfer1::IInt8Calibrator* ptq_calibrator = nullptr;
+
+  bool require_full_compilation = false;
+
+  uint64_t min_block_size = 3;
+
+  std::vector<std::string> torch_executed_ops;
+
+  std::vector<std::string> torch_executed_modules;
+};
+
+TORCHTRT_API bool check_method_operator_support(const torch::jit::Module& module, std::string method_name);
+
+TORCHTRT_API torch::jit::Module compile(const torch::jit::Module& module, CompileSpec info);
+
+TORCHTRT_API std::string convert_method_to_trt_engine(
+    const torch::jit::Module& module,
+    std::string method_name,
+    CompileSpec info);
+
+TORCHTRT_API torch::jit::Module embed_engine_in_new_module(const std::string& engine, Device device);
+} // namespace torchscript
+} // namespace torch_tensorrt
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/structtorch__tensorrt_1_1Device.html b/docs/v1.1.1/_cpp_api/structtorch__tensorrt_1_1Device.html new file mode 100644 index 0000000000..cabff74678 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/structtorch__tensorrt_1_1Device.html @@ -0,0 +1,1246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Struct Device — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ Struct Device + + ¶ + +

+ +

+ Nested Relationships + + ¶ + +

+

+ Nested Types + + ¶ + +

+ +

+ Struct Documentation + + ¶ + +

+
+
+ + + + struct + + + torch_tensorrt + + :: + + + + Device + + + ¶ + +
+
+
+

+ Setting data structure for Target device. +

+
+

+ Public Functions +

+
+
+ + + + Device + + + ( + + + ) + + + ¶ + +
+
+
+

+ Constructor for + + + Device + + + structure +

+
+
+
+
+

+ Public Members +

+
+
+ + + + DeviceType + + + device_type + + + ¶ + +
+
+
+

+ Setting data structure for device This struct will hold Target device related parameters such as device_type, gpu_id, dla_core. +

+
+
+
+
+ + + int64_t + + gpu_id + + + ¶ + +
+
+
+
+
+
+
+ + + int64_t + + dla_core + + + ¶ + +
+
+
+
+
+
+
+ + + bool + + allow_gpu_fallback + + + ¶ + +
+
+
+

+ (Only used when targeting DLA (device)) Lets engine run layers on GPU if they are not supported on DLA +

+
+
+
+
+
+ + + + class + + + DeviceType + +
+
+
+

+ Supported + + + Device + + + Types that can be used with TensorRT engines +

+

+ This class is compatable with c10::DeviceTypes (but will check for TRT support) but the only applicable value is at::kCUDA, which maps to + + + DeviceType::kGPU + + +

+

+ To use the + + + DataType + + + class itself, interface using the enum vs. normal instatination +

+

+ ex. torch_tensorrt::DeviceType type = + + + DeviceType::kGPU + + + ; +

+
+

+ Public Types +

+
+
+ + + + enum + + + Value + +
+
+
+

+ Underlying enum class to support the + + + DeviceType + + + Class +

+

+ In the case that you need to use the + + + DeviceType + + + class itself, interface using this enum vs. normal instatination +

+

+ ex. torch_tensorrt::DeviceType type = + + + DeviceType::kGPU + + + ; +

+

+ + Values: + +

+
+
+ + + + enumerator + + + kGPU + +
+
+
+

+ Target GPU to run engine. +

+
+
+
+
+ + + + enumerator + + + kDLA + +
+
+
+

+ Target DLA to run engine. +

+
+
+
+
+
+
+

+ Public Functions +

+
+
+ + + + DeviceType + + + ( + + + ) + + = default +
+
+
+

+ Construct a new + + + Device + + + Type object. +

+
+
+
+
+ + + + constexpr + + + DeviceType + + + ( + + + Value + + + t + + + ) + +
+
+
+

+ Construct a new + + + Device + + + Type object from internal enum. +

+
+
+
+
+ + + + DeviceType + + + ( + + c10::DeviceType + + t + + + ) + +
+
+
+

+ Construct a new + + + Device + + + Type object from torch device enums Note: The only valid value is torch::kCUDA (torch::kCPU is not supported) +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + t + + + : +

    +
  • +
+
+
+
+
+
+
+ + + + operator Value + + + ( + + + ) + + + const + +
+
+
+

+ Get the internal value from the + + + Device + + + object. +

+

+

+
+
+ + Return + +
+
+

+ Value +

+
+
+
+
+
+
+ + + + operator bool + + + ( + + + ) + + = delete +
+
+
+
+
+
+
+ + + + constexpr + + bool + + operator== + + + ( + + + DeviceType + + + other + + + ) + + + const + +
+
+
+

+ Comparison operator for + + + DeviceType + + + . +

+

+

+
+
+ + Return + +
+
+

+ true +

+
+
+ + Return + +
+
+

+ false +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + other + + + : +

    +
  • +
+
+
+
+
+
+
+ + + + constexpr + + bool + + operator!= + + + ( + + + DeviceType + + + other + + + ) + + + const + +
+
+
+

+ Comparison operator for + + + DeviceType + + + . +

+

+

+
+
+ + Return + +
+
+

+ true +

+
+
+ + Return + +
+
+

+ false +

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + other + + + : +

    +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/structtorch__tensorrt_1_1GraphInputs.html b/docs/v1.1.1/_cpp_api/structtorch__tensorrt_1_1GraphInputs.html new file mode 100644 index 0000000000..4840308bd0 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/structtorch__tensorrt_1_1GraphInputs.html @@ -0,0 +1,553 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Struct GraphInputs — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ Struct GraphInputs + + ¶ + +

+ +

+ Struct Documentation + + ¶ + +

+
+

+ Warning +

+

+ doxygenstruct: Cannot find class “torch_tensorrt::GraphInputs” in doxygen xml output for project “Torch-TensorRT” from directory: ./_tmp/xml +

+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/structtorch__tensorrt_1_1Input.html b/docs/v1.1.1/_cpp_api/structtorch__tensorrt_1_1Input.html new file mode 100644 index 0000000000..fd1f60a07c --- /dev/null +++ b/docs/v1.1.1/_cpp_api/structtorch__tensorrt_1_1Input.html @@ -0,0 +1,1663 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Struct Input — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ Struct Input + + ¶ + +

+ +

+ Struct Documentation + + ¶ + +

+
+
+ + + + struct + + + torch_tensorrt + + :: + + + + Input + + + ¶ + +
+
+
+

+ A struct to hold an input range (used by TensorRT Optimization profile) +

+

+ This struct can either hold a single vector representing an input shape, signifying a static input shape or a set of three input shapes representing the min, optiminal and max input shapes allowed for the engine. +

+
+

+ Public Functions +

+
+
+ + + + Input + + + ( + + std::vector<int64_t> + + shape + + , + + TensorFormat + + + format + + = + + TensorFormat + + :: + + kContiguous + + + ) + + + ¶ + +
+
+
+

+ Construct a new + + + Input + + + spec object for static input size from vector, optional arguments allow the user to configure expected input shape tensor format. dtype (Expected data type for the input) defaults to PyTorch / traditional TRT convection (FP32 for FP32 only, FP16 for FP32 and FP16, FP32 for Int8) +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + shape + + + : + + + Input + + + tensor shape +

    +
  • +
  • +

    + + + format + + + : Expected tensor format for the input (Defaults to contiguous) +

    +
  • +
+
+
+
+
+
+
+ + + + Input + + + ( + + std::vector<int64_t> + + shape + + , + + DataType + + + dtype + + , + + TensorFormat + + + format + + = + + TensorFormat + + :: + + kContiguous + + + ) + + + ¶ + +
+
+
+

+ Construct a new + + + Input + + + spec object for static input size from vector, optional arguments allow the user to configure expected input shape tensor format. +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + shape + + + : + + + Input + + + tensor shape +

    +
  • +
  • +

    + + + dtype + + + : Expected data type for the input (Defaults to the type of the weights in the first tensor calculation if detectable else Float32) +

    +
  • +
  • +

    + + + format + + + : Expected tensor format for the input (Defaults to contiguous) +

    +
  • +
+
+
+
+
+
+
+ + + + Input + + + ( + + c10::ArrayRef<int64_t> + + shape + + , + + TensorFormat + + + format + + = + + TensorFormat + + :: + + kContiguous + + + ) + + + ¶ + +
+
+
+

+ Construct a new + + + Input + + + spec object for static input size from c10::ArrayRef (the type produced by tensor.sizes()), vector, optional arguments allow the user to configure expected input shape tensor format dtype (Expected data type for the input) defaults to PyTorch / traditional TRT convection (FP32 for FP32 only, FP16 for FP32 and FP16, FP32 for Int8) +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + shape + + + : + + + Input + + + tensor shape +

    +
  • +
  • +

    + + + format + + + : Expected tensor format for the input (Defaults to contiguous) +

    +
  • +
+
+
+
+
+
+
+ + + + Input + + + ( + + c10::ArrayRef<int64_t> + + shape + + , + + DataType + + + dtype + + , + + TensorFormat + + + format + + = + + TensorFormat + + :: + + kContiguous + + + ) + + + ¶ + +
+
+
+

+ Construct a new + + + Input + + + spec object for static input size from c10::ArrayRef (the type produced by tensor.sizes()), vector, optional arguments allow the user to configure expected input shape tensor format. +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + shape + + + : + + + Input + + + tensor shape +

    +
  • +
  • +

    + + + dtype + + + : Expected data type for the input (Defaults to the type of the weights in the first tensor calculation if detectable else Float32) +

    +
  • +
  • +

    + + + format + + + : Expected tensor format for the input (Defaults to contiguous) +

    +
  • +
+
+
+
+
+
+
+ + + + Input + + + ( + + std::vector<int64_t> + + min_shape + + , std::vector<int64_t> + + opt_shape + + , std::vector<int64_t> + + max_shape + + , + + TensorFormat + + + format + + = + + TensorFormat + + :: + + kContiguous + + + ) + + + ¶ + +
+
+
+

+ Construct a new + + + Input + + + spec object dynamic input size from c10::ArrayRef (the type produced by tensor.sizes()) for min, opt, and max supported sizes. dtype (Expected data type for the input) defaults to PyTorch / traditional TRT convection (FP32 for FP32 only, FP16 for FP32 and FP16, FP32 for Int8) +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + min_shape + + + : Minimum shape for input tensor +

    +
  • +
  • +

    + + + opt_shape + + + : Target optimization shape for input tensor +

    +
  • +
  • +

    + + + max_shape + + + : Maximum acceptible shape for input tensor +

    +
  • +
  • +

    + + + format + + + : Expected tensor format for the input (Defaults to contiguous) +

    +
  • +
+
+
+
+
+
+
+ + + + Input + + + ( + + std::vector<int64_t> + + min_shape + + , std::vector<int64_t> + + opt_shape + + , std::vector<int64_t> + + max_shape + + , + + DataType + + + dtype + + , + + TensorFormat + + + format + + = + + TensorFormat + + :: + + kContiguous + + + ) + + + ¶ + +
+
+
+

+ Construct a new + + + Input + + + spec object for a dynamic input size from vectors for minimum shape, optimal shape, and max shape supported sizes optional arguments allow the user to configure expected input shape tensor format. +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + min_shape + + + : Minimum shape for input tensor +

    +
  • +
  • +

    + + + opt_shape + + + : Target optimization shape for input tensor +

    +
  • +
  • +

    + + + max_shape + + + : Maximum acceptible shape for input tensor +

    +
  • +
  • +

    + + + dtype + + + : Expected data type for the input (Defaults to the type of the weights in the first tensor calculation if detectable else Float32) +

    +
  • +
  • +

    + + + format + + + : Expected tensor format for the input (Defaults to contiguous) +

    +
  • +
+
+
+
+
+
+
+ + + + Input + + + ( + + c10::ArrayRef<int64_t> + + min_shape + + , c10::ArrayRef<int64_t> + + opt_shape + + , c10::ArrayRef<int64_t> + + max_shape + + , + + TensorFormat + + + format + + = + + TensorFormat + + :: + + kContiguous + + + ) + + + ¶ + +
+
+
+

+ Construct a new + + + Input + + + spec object dynamic input size from c10::ArrayRef (the type produced by tensor.sizes()) for min, opt, and max supported sizes. dtype (Expected data type for the input) defaults to PyTorch / traditional TRT convection (FP32 for FP32 only, FP16 for FP32 and FP16, FP32 for Int8) +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + min_shape + + + : Minimum shape for input tensor +

    +
  • +
  • +

    + + + opt_shape + + + : Target optimization shape for input tensor +

    +
  • +
  • +

    + + + max_shape + + + : Maximum acceptible shape for input tensor +

    +
  • +
  • +

    + + + format + + + : Expected tensor format for the input (Defaults to contiguous) +

    +
  • +
+
+
+
+
+
+
+ + + + Input + + + ( + + c10::ArrayRef<int64_t> + + min_shape + + , c10::ArrayRef<int64_t> + + opt_shape + + , c10::ArrayRef<int64_t> + + max_shape + + , + + DataType + + + dtype + + , + + TensorFormat + + + format + + = + + TensorFormat + + :: + + kContiguous + + + ) + + + ¶ + +
+
+
+

+ Construct a new + + + Input + + + spec object dynamic input size from c10::ArrayRef (the type produced by tensor.sizes()) for min, opt, and max supported sizes. +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + min_shape + + + : Minimum shape for input tensor +

    +
  • +
  • +

    + + + opt_shape + + + : Target optimization shape for input tensor +

    +
  • +
  • +

    + + + max_shape + + + : Maximum acceptible shape for input tensor +

    +
  • +
  • +

    + + + dtype + + + : Expected data type for the input (Defaults to the type of the weights in the first tensor calculation if detectable else Float32) +

    +
  • +
  • +

    + + + format + + + : Expected tensor format for the input (Defaults to contiguous) +

    +
  • +
+
+
+
+
+
+
+ + + + Input + + + ( + + at::Tensor + + tensor + + + ) + + + ¶ + +
+
+
+

+ Construct a new + + + Input + + + spec object using a torch tensor as an example The tensor’s shape, type and layout inform the spec’s values. +

+

+ Note: You cannot set dynamic shape through this method, you must use an alternative constructor +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + tensor + + + : Reference tensor to set shape, type and layout +

    +
  • +
+
+
+
+
+
+
+

+ Public Members +

+
+
+ + + std::vector<int64_t> + + min_shape + + + ¶ + +
+
+
+

+ Minimum acceptable input size into the engine. +

+
+
+
+
+ + + std::vector<int64_t> + + opt_shape + + + ¶ + +
+
+
+

+ Optimal input size into the engine (size optimized for given kernels accept any size in min max range) +

+
+
+
+
+ + + std::vector<int64_t> + + max_shape + + + ¶ + +
+
+
+

+ Maximum acceptable input size into the engine. +

+
+
+
+
+ + + std::vector<int64_t> + + shape + + + ¶ + +
+
+
+

+ + + Input + + + shape to be fed to TensorRT, in the event of a dynamic shape, -1’s will hold the place of variable dimensions +

+
+
+
+
+ + + + DataType + + + dtype + + + ¶ + +
+
+
+

+ Expected data type for the input. +

+
+
+
+
+ + + + TensorFormat + + + format + + + ¶ + +
+
+
+

+ Expected tensor format for the input. +

+
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/structtorch__tensorrt_1_1torchscript_1_1CompileSpec.html b/docs/v1.1.1/_cpp_api/structtorch__tensorrt_1_1torchscript_1_1CompileSpec.html new file mode 100644 index 0000000000..2bab6f6f3e --- /dev/null +++ b/docs/v1.1.1/_cpp_api/structtorch__tensorrt_1_1torchscript_1_1CompileSpec.html @@ -0,0 +1,1169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Struct CompileSpec — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ Struct CompileSpec + + ¶ + +

+ +

+ Struct Documentation + + ¶ + +

+
+
+ + + + struct + + + torch_tensorrt::torchscript + + :: + + + + CompileSpec + + + ¶ + +
+
+
+

+ Settings data structure for Torch-TensorRT TorchScript compilation +

+
+

+ Public Functions +

+
+
+ + + + CompileSpec + + + ( + + std::vector<std::vector<int64_t>> + + fixed_sizes + + + ) + + + ¶ + +
+
+
+

+ Construct a new Compile Spec object Convienence constructor to set fixed input size from vectors describing size of input tensors. Each entry in the vector represents a input and should be provided in call order. +

+

+ This constructor should be use as a convience in the case that all inputs are static sized and you are okay with default input dtype and formats (FP32 for FP32 and INT8 weights, FP16 for FP16 weights, contiguous) +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + fixed_sizes + + + : +

    +
  • +
+
+
+
+
+
+
+ + + + CompileSpec + + + ( + + std::vector<c10::ArrayRef<int64_t>> + + fixed_sizes + + + ) + + + ¶ + +
+
+
+

+ Construct a new Extra Info object Convienence constructor to set fixed input size from c10::ArrayRef’s (the output of tensor.sizes()) describing size of input tensors. Each entry in the vector represents a input and should be provided in call order. +

+

+ This constructor should be use as a convience in the case that all inputs are static sized and you are okay with default input dtype and formats (FP32 for FP32 and INT8 weights, FP16 for FP16 weights, contiguous) +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + fixed_sizes + + + : +

    +
  • +
+
+
+
+
+
+
+ + + + CompileSpec + + + ( + + std::vector< + + Input + + > + + inputs + + + ) + + + ¶ + +
+
+
+

+ Construct a new Extra Info object from input ranges. Each entry in the vector represents a input and should be provided in call order. +

+

+ Use this constructor to define inputs with dynamic shape, specific input types or tensor formats +

+

+

+
+
+ + Parameters + +
+
+
    +
  • +

    + + + inputs + + + : +

    +
  • +
+
+
+
+
+
+
+

+ Public Members +

+
+
+ + + std::vector< + + Input + + > + + inputs + + + ¶ + +
+
+
+

+ Specifications for inputs to the engine, can either be a single size or a range defined by min, opt and max sizes Users can also specify expected input type as well as tensor memory format. +

+

+ Order in vector should match call order for the function +

+
+
+
+
+ + + std::set< + + DataType + + > + + enabled_precisions + + = { + + DataType + + :: + + kFloat + + } + + ¶ + +
+
+
+

+ The set of precisions TensorRT is allowed to use for kernels during compilation. +

+
+
+
+
+ + + bool + + disable_tf32 + + = false + + ¶ + +
+
+
+

+ Prevent Float32 layers from using TF32 data format +

+

+ TF32 computes inner products by rounding the inputs to 10-bit mantissas before multiplying, but accumulates the sum using 23-bit mantissas. This is the behavior of FP32 layers by default. +

+
+
+
+
+ + + bool + + sparse_weights + + = false + + ¶ + +
+
+
+

+ Enable sparsity for weights of conv and FC layers +

+
+
+
+
+ + + bool + + refit + + = false + + ¶ + +
+
+
+

+ Build a refitable engine +

+
+
+
+
+ + + bool + + debug + + = false + + ¶ + +
+
+
+

+ Build a debugable engine +

+
+
+
+
+ + + bool + + truncate_long_and_double + + = false + + ¶ + +
+
+
+

+ Truncate long/double type to int/float type +

+
+
+
+
+ + + + Device + + + device + + + ¶ + +
+
+
+

+ Target + + + Device + + +

+
+
+
+
+ + + + EngineCapability + + + capability + + = + + EngineCapability + + :: + + kSTANDARD + + + ¶ + +
+
+
+

+ Sets the restrictions for the engine (CUDA Safety) +

+
+
+
+
+ + + uint64_t + + num_min_timing_iters + + = 2 + + ¶ + +
+
+
+

+ Number of minimization timing iterations used to select kernels +

+
+
+
+
+ + + uint64_t + + num_avg_timing_iters + + = 1 + + ¶ + +
+
+
+

+ Number of averaging timing iterations used to select kernels +

+
+
+
+
+ + + uint64_t + + workspace_size + + = 0 + + ¶ + +
+
+
+

+ Maximum size of workspace given to TensorRT +

+
+
+
+
+ + + nvinfer1::IInt8Calibrator * + + ptq_calibrator + + = nullptr + + ¶ + +
+
+
+

+ Calibration dataloaders for each input for post training quantizatiom +

+
+
+
+
+ + + bool + + require_full_compilation + + = false + + ¶ + +
+
+
+

+ Require the full module be compiled to TensorRT instead of potentially running unsupported operations in PyTorch +

+
+
+
+
+ + + uint64_t + + min_block_size + + = 3 + + ¶ + +
+
+
+

+ Minimum number of contiguous supported operators to compile a subgraph to TensorRT +

+
+
+
+
+ + + std::vector<std::string> + + torch_executed_ops + + + ¶ + +
+
+
+

+ List of aten operators that must be run in PyTorch. An error will be thrown if this list is not empty but + + + require_full_compilation + + + is True +

+
+
+
+
+ + + std::vector<std::string> + + torch_executed_modules + + + ¶ + +
+
+
+

+ List of modules that must be run in PyTorch. An error will be thrown if this list is not empty but + + + require_full_compilation + + + is True +

+
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/torch_tensort_cpp.html b/docs/v1.1.1/_cpp_api/torch_tensort_cpp.html new file mode 100644 index 0000000000..b1b462d272 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/torch_tensort_cpp.html @@ -0,0 +1,1548 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Torch-TensorRT C++ API — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+

+ Torch-TensorRT C++ API + + ¶ + +

+

+ Class Hierarchy + + ¶ + +

+ + +

+ File Hierarchy + + ¶ + +

+ + +

+ Full API + + ¶ + +

+

+ Namespaces + + ¶ + +

+ + + + +

+ Classes and Structs + + ¶ + +

+ + + + + + + + +

+ Enums + + ¶ + +

+ + +

+ Functions + + ¶ + +

+ + + + + + + + + + + + + + + + +

+ Defines + + ¶ + +

+ + + + + + + + +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/unabridged_api.html b/docs/v1.1.1/_cpp_api/unabridged_api.html new file mode 100644 index 0000000000..83be213a79 --- /dev/null +++ b/docs/v1.1.1/_cpp_api/unabridged_api.html @@ -0,0 +1,1254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Full API — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+

+ Full API + + ¶ + +

+

+ Namespaces + + ¶ + +

+ + + + +

+ Classes and Structs + + ¶ + +

+ + + + + + + + +

+ Enums + + ¶ + +

+ + +

+ Functions + + ¶ + +

+ + + + + + + + + + + + + + + + +

+ Defines + + ¶ + +

+ + + + + + + + +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_cpp_api/unabridged_orphan.html b/docs/v1.1.1/_cpp_api/unabridged_orphan.html new file mode 100644 index 0000000000..1aa0ab23ee --- /dev/null +++ b/docs/v1.1.1/_cpp_api/unabridged_orphan.html @@ -0,0 +1,791 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Full API — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_downloads/26d49aeeb9c710e27197fda28b7c3516/yi_jing_01_chien.jpg b/docs/v1.1.1/_downloads/26d49aeeb9c710e27197fda28b7c3516/yi_jing_01_chien.jpg new file mode 100644 index 0000000000..523dc2b8b8 Binary files /dev/null and b/docs/v1.1.1/_downloads/26d49aeeb9c710e27197fda28b7c3516/yi_jing_01_chien.jpg differ diff --git a/docs/v1.1.1/_images/_notebooks_EfficientNet-example_12_0.png b/docs/v1.1.1/_images/_notebooks_EfficientNet-example_12_0.png new file mode 100644 index 0000000000..a308a0d7dd Binary files /dev/null and b/docs/v1.1.1/_images/_notebooks_EfficientNet-example_12_0.png differ diff --git a/docs/v1.1.1/_images/_notebooks_EfficientNet-example_16_2.png b/docs/v1.1.1/_images/_notebooks_EfficientNet-example_16_2.png new file mode 100644 index 0000000000..923e9af7ad Binary files /dev/null and b/docs/v1.1.1/_images/_notebooks_EfficientNet-example_16_2.png differ diff --git a/docs/v1.1.1/_images/_notebooks_Resnet50-example_12_0.png b/docs/v1.1.1/_images/_notebooks_Resnet50-example_12_0.png new file mode 100644 index 0000000000..918517c79a Binary files /dev/null and b/docs/v1.1.1/_images/_notebooks_Resnet50-example_12_0.png differ diff --git a/docs/v1.1.1/_images/_notebooks_Resnet50-example_16_1.png b/docs/v1.1.1/_images/_notebooks_Resnet50-example_16_1.png new file mode 100644 index 0000000000..67ce9b8c77 Binary files /dev/null and b/docs/v1.1.1/_images/_notebooks_Resnet50-example_16_1.png differ diff --git a/docs/v1.1.1/_images/_notebooks_dynamic-shapes_14_1.png b/docs/v1.1.1/_images/_notebooks_dynamic-shapes_14_1.png new file mode 100644 index 0000000000..90cc8518bb Binary files /dev/null and b/docs/v1.1.1/_images/_notebooks_dynamic-shapes_14_1.png differ diff --git a/docs/v1.1.1/_images/_notebooks_dynamic-shapes_8_0.png b/docs/v1.1.1/_images/_notebooks_dynamic-shapes_8_0.png new file mode 100644 index 0000000000..a308a0d7dd Binary files /dev/null and b/docs/v1.1.1/_images/_notebooks_dynamic-shapes_8_0.png differ diff --git a/docs/v1.1.1/_images/_notebooks_ssd-object-detection-demo_18_0.png b/docs/v1.1.1/_images/_notebooks_ssd-object-detection-demo_18_0.png new file mode 100644 index 0000000000..1510b460b6 Binary files /dev/null and b/docs/v1.1.1/_images/_notebooks_ssd-object-detection-demo_18_0.png differ diff --git a/docs/v1.1.1/_images/_notebooks_ssd-object-detection-demo_18_1.png b/docs/v1.1.1/_images/_notebooks_ssd-object-detection-demo_18_1.png new file mode 100644 index 0000000000..45a206ae1c Binary files /dev/null and b/docs/v1.1.1/_images/_notebooks_ssd-object-detection-demo_18_1.png differ diff --git a/docs/v1.1.1/_images/_notebooks_ssd-object-detection-demo_18_2.png b/docs/v1.1.1/_images/_notebooks_ssd-object-detection-demo_18_2.png new file mode 100644 index 0000000000..ae7a6c8850 Binary files /dev/null and b/docs/v1.1.1/_images/_notebooks_ssd-object-detection-demo_18_2.png differ diff --git a/docs/v1.1.1/_images/_notebooks_ssd-object-detection-demo_35_0.png b/docs/v1.1.1/_images/_notebooks_ssd-object-detection-demo_35_0.png new file mode 100644 index 0000000000..1510b460b6 Binary files /dev/null and b/docs/v1.1.1/_images/_notebooks_ssd-object-detection-demo_35_0.png differ diff --git a/docs/v1.1.1/_images/_notebooks_ssd-object-detection-demo_35_1.png b/docs/v1.1.1/_images/_notebooks_ssd-object-detection-demo_35_1.png new file mode 100644 index 0000000000..45a206ae1c Binary files /dev/null and b/docs/v1.1.1/_images/_notebooks_ssd-object-detection-demo_35_1.png differ diff --git a/docs/v1.1.1/_images/_notebooks_ssd-object-detection-demo_35_2.png b/docs/v1.1.1/_images/_notebooks_ssd-object-detection-demo_35_2.png new file mode 100644 index 0000000000..7189e0c703 Binary files /dev/null and b/docs/v1.1.1/_images/_notebooks_ssd-object-detection-demo_35_2.png differ diff --git a/docs/v1.1.1/_images/yi_jing_01_chien.jpg b/docs/v1.1.1/_images/yi_jing_01_chien.jpg new file mode 100644 index 0000000000..523dc2b8b8 Binary files /dev/null and b/docs/v1.1.1/_images/yi_jing_01_chien.jpg differ diff --git a/docs/v1.1.1/_modules/index.html b/docs/v1.1.1/_modules/index.html new file mode 100644 index 0000000000..c9f4843a3d --- /dev/null +++ b/docs/v1.1.1/_modules/index.html @@ -0,0 +1,635 @@ + + + + + + + + + + + + Overview: module code — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+ + +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_modules/torch_tensorrt/_Device.html b/docs/v1.1.1/_modules/torch_tensorrt/_Device.html new file mode 100644 index 0000000000..97b7d0b348 --- /dev/null +++ b/docs/v1.1.1/_modules/torch_tensorrt/_Device.html @@ -0,0 +1,761 @@ + + + + + + + + + + + + torch_tensorrt._Device — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt._Device

+import torch
+
+from torch_tensorrt import _enums
+from torch_tensorrt import logging
+from torch_tensorrt import _C
+
+import warnings
+
+
+
[docs]class Device(object): + """ + Defines a device that can be used to specify target devices for engines + + Attributes: + device_type (torch_tensorrt.DeviceType): Target device type (GPU or DLA). Set implicitly based on if dla_core is specified. + gpu_id (int): Device ID for target GPU + dla_core (int): Core ID for target DLA core + allow_gpu_fallback (bool): Whether falling back to GPU if DLA cannot support an op should be allowed + """ + + device_type = None #: (torch_tensorrt.DeviceType): Target device type (GPU or DLA). Set implicitly based on if dla_core is specified. + gpu_id = -1 #: (int) Device ID for target GPU + dla_core = -1 #: (int) Core ID for target DLA core + allow_gpu_fallback = False #: (bool) Whether falling back to GPU if DLA cannot support an op should be allowed + +
[docs] def __init__(self, *args, **kwargs): + """__init__ Method for torch_tensorrt.Device + + Device accepts one of a few construction patterns + + Args: + spec (str): String with device spec e.g. "dla:0" for dla, core_id 0 + + Keyword Arguments: + gpu_id (int): ID of target GPU (will get overrided if dla_core is specified to the GPU managing DLA). If specified, no positional arguments should be provided + dla_core (int): ID of target DLA core. If specified, no positional arguments should be provided. + allow_gpu_fallback (bool): Allow TensorRT to schedule operations on GPU if they are not supported on DLA (ignored if device type is not DLA) + + Examples: + - Device("gpu:1") + - Device("cuda:1") + - Device("dla:0", allow_gpu_fallback=True) + - Device(gpu_id=0, dla_core=0, allow_gpu_fallback=True) + - Device(dla_core=0, allow_gpu_fallback=True) + - Device(gpu_id=1) + """ + if len(args) == 1: + if not isinstance(args[0], str): + raise TypeError( + "When specifying Device through positional argument, argument must be str" + ) + else: + (self.device_type, id) = Device._parse_device_str(args[0]) + if self.device_type == _enums.DeviceType.GPU: + self.gpu_id = id + else: + self.dla_core = id + self.gpu_id = 0 + logging.log( + logging.Level.Warning, + "Setting GPU id to 0 for device because device 0 manages DLA on Xavier", + ) + + elif len(args) == 0: + if "gpu_id" in kwargs or "dla_core" in kwargs: + if "dla_core" in kwargs: + self.device_type = _enums.DeviceType.DLA + self.dla_core = kwargs["dla_core"] + if "gpu_id" in kwargs: + self.gpu_id = kwargs["gpu_id"] + else: + self.gpu_id = 0 + logging.log( + logging.Level.Warning, + "Setting GPU id to 0 for device because device 0 manages DLA on Xavier", + ) + else: + self.gpu_id = kwargs["gpu_id"] + self.device_type = _enums.DeviceType.GPU + else: + raise ValueError( + "Either gpu_id or dla_core or both must be defined if no string with device specs is provided as an arg" + ) + + else: + raise ValueError( + "Unexpected number of positional arguments for class Device \n Found {} arguments, expected either zero or a single positional arguments".format( + len(args) + ) + ) + + if "allow_gpu_fallback" in kwargs: + if not isinstance(kwargs["allow_gpu_fallback"], bool): + raise TypeError("allow_gpu_fallback must be a bool") + self.allow_gpu_fallback = kwargs["allow_gpu_fallback"]
+ + def __str__(self) -> str: + return ( + "Device(type={}, gpu_id={}".format(self.device_type, self.gpu_id) + ")" + if self.device_type == _enums.DeviceType.GPU + else ", dla_core={}, allow_gpu_fallback={}".format( + self.dla_core, self.allow_gpu_fallback + ) + ) + + def _to_internal(self) -> _C.Device: + internal_dev = _C.Device() + internal_dev.device_type = self.device_type + internal_dev.gpu_id = self.gpu_id + internal_dev.dla_core = self.dla_core + internal_dev.allow_gpu_fallback = self.allow_gpu_fallback + return internal_dev + + @classmethod + def _from_torch_device(cls, torch_dev: torch.device): + if torch_dev.type != "cuda": + raise ValueError('Torch Device specs must have type "cuda"') + gpu_id = torch_dev.index + return cls(gpu_id=gpu_id) + + @classmethod + def _current_device(cls): + try: + dev = _C._get_current_device() + except RuntimeError: + logging.log(logging.Level.Error, "Cannot get current device") + return None + return cls(gpu_id=dev.gpu_id) + + @staticmethod + def _parse_device_str(s): + s = s.lower() + spec = s.split(":") + if spec[0] == "gpu" or spec[0] == "cuda": + return (_enums.DeviceType.GPU, int(spec[1])) + elif spec[0] == "dla": + return (_enums.DeviceType.DLA, int(spec[1]))
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_modules/torch_tensorrt/_Input.html b/docs/v1.1.1/_modules/torch_tensorrt/_Input.html new file mode 100644 index 0000000000..7daa173ab7 --- /dev/null +++ b/docs/v1.1.1/_modules/torch_tensorrt/_Input.html @@ -0,0 +1,905 @@ + + + + + + + + + + + + torch_tensorrt._Input — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt._Input

+from enum import Enum
+from typing import List, Dict, Any
+
+import torch
+
+from torch_tensorrt import _enums
+from torch_tensorrt import _C
+
+
+
[docs]class Input(object): + """ + Defines an input to a module in terms of expected shape, data type and tensor format. + + Attributes: + shape_mode (torch_tensorrt.Input._ShapeMode): Is input statically or dynamically shaped + shape (Tuple or Dict): Either a single Tuple or a dict of tuples defining the input shape. + Static shaped inputs will have a single tuple. Dynamic inputs will have a dict of the form + ``{ + "min_shape": Tuple, + "opt_shape": Tuple, + "max_shape": Tuple + }`` + dtype (torch_tensorrt.dtype): The expected data type of the input tensor (default: torch_tensorrt.dtype.float32) + format (torch_tensorrt.TensorFormat): The expected format of the input tensor (default: torch_tensorrt.TensorFormat.NCHW) + """ + + class _ShapeMode(Enum): + STATIC = 0 + DYNAMIC = 1 + + shape_mode = None #: (torch_tensorrt.Input._ShapeMode): Is input statically or dynamically shaped + shape = None #: (Tuple or Dict): Either a single Tuple or a dict of tuples defining the input shape. Static shaped inputs will have a single tuple. Dynamic inputs will have a dict of the form ``{ "min_shape": Tuple, "opt_shape": Tuple, "max_shape": Tuple }`` + dtype = ( + _enums.dtype.unknown + ) #: The expected data type of the input tensor (default: torch_tensorrt.dtype.float32) + _explicit_set_dtype = False + format = ( + _enums.TensorFormat.contiguous + ) #: The expected format of the input tensor (default: torch_tensorrt.TensorFormat.NCHW) + +
[docs] def __init__(self, *args, **kwargs): + """__init__ Method for torch_tensorrt.Input + + Input accepts one of a few construction patterns + + Args: + shape (Tuple or List, optional): Static shape of input tensor + + Keyword Arguments: + shape (Tuple or List, optional): Static shape of input tensor + min_shape (Tuple or List, optional): Min size of input tensor's shape range + Note: All three of min_shape, opt_shape, max_shape must be provided, there must be no positional arguments, shape must not be defined and implictly this sets Input's shape_mode to DYNAMIC + opt_shape (Tuple or List, optional): Opt size of input tensor's shape range + Note: All three of min_shape, opt_shape, max_shape must be provided, there must be no positional arguments, shape must not be defined and implictly this sets Input's shape_mode to DYNAMIC + max_shape (Tuple or List, optional): Max size of input tensor's shape range + Note: All three of min_shape, opt_shape, max_shape must be provided, there must be no positional arguments, shape must not be defined and implictly this sets Input's shape_mode to DYNAMIC + dtype (torch.dtype or torch_tensorrt.dtype): Expected data type for input tensor (default: torch_tensorrt.dtype.float32) + format (torch.memory_format or torch_tensorrt.TensorFormat): The expected format of the input tensor (default: torch_tensorrt.TensorFormat.NCHW) + + Examples: + - Input([1,3,32,32], dtype=torch.float32, format=torch.channel_last) + - Input(shape=(1,3,32,32), dtype=torch_tensorrt.dtype.int32, format=torch_tensorrt.TensorFormat.NCHW) + - Input(min_shape=(1,3,32,32), opt_shape=[2,3,32,32], max_shape=(3,3,32,32)) #Implicitly dtype=torch_tensorrt.dtype.float32, format=torch_tensorrt.TensorFormat.NCHW + """ + if len(args) == 1: + if not Input._supported_input_size_type(args[0]): + raise TypeError( + "Input shape specifications for inputs are required to be a List, tuple or torch.Size, found type: " + + str(type(args[0])) + ) + if any(k in kwargs for k in ["min_shape", "opt_shape", "max_shape"]): + raise ValueError( + "Found that both shape (as a positional argument), and one or more of min_shape, opt_shape, max_shape were specified\nclass Input expects that only either shape or all three of min_shape, opt_shape, max_shape are defined" + ) + self.shape = tuple(args[0]) + self.shape_mode = Input._ShapeMode.STATIC + + elif len(args) == 0: + if not ("shape" in kwargs) and not ( + all(k in kwargs for k in ["min_shape", "opt_shape", "max_shape"]) + ): + raise ValueError( + "Missing required arguments for class Input\nEither shape or all three of min_shape, opt_shape, max_shape must be defined" + ) + elif ("shape" in kwargs) and all( + k in kwargs for k in ["min_shape", "opt_shape", "max_shape"] + ): + raise ValueError( + "Found that both shape, and one or more of min_shape, opt_shape, max_shape were specified\nclass Input expects that only either shape or all three of min_shape, opt_shape, max_shape are defined" + ) + + if "shape" in kwargs: + if not Input._supported_input_size_type(kwargs["shape"]): + raise TypeError( + "Input shape specifications for inputs are required to be a List, tuple or torch.Size, found type: " + + str(type(kwargs["shape"])) + ) + self.shape = tuple(kwargs["shape"]) + self.shape_mode = Input._ShapeMode.STATIC + else: + if not Input._supported_input_size_type(kwargs["min_shape"]): + raise TypeError( + "Input shape specifications for inputs are required to be a List, tuple or torch.Size, found type: " + + str(type(kwargs["min_shape"])) + + " for min_shape" + ) + if not Input._supported_input_size_type(kwargs["opt_shape"]): + raise TypeError( + "Input shape specifications for inputs are required to be a List, tuple or torch.Size, found type: " + + str(type(kwargs["opt_shape"])) + + " for opt_shape" + ) + if not Input._supported_input_size_type(kwargs["max_shape"]): + raise TypeError( + "Input shape specifications for inputs are required to be a List, tuple or torch.Size, found type: " + + str(type(kwargs["max_shape"])) + + " for max_shape" + ) + + self.shape = { + "min_shape": tuple(kwargs["min_shape"]), + "opt_shape": tuple(kwargs["opt_shape"]), + "max_shape": tuple(kwargs["max_shape"]), + } + self.shape_mode = Input._ShapeMode.DYNAMIC + + else: + raise ValueError( + "Unexpected number of positional arguments for class Input \n Found {} arguments, expected either zero or a single positional arguments".format( + len(args) + ) + ) + + if "dtype" in kwargs: + self.dtype = Input._parse_dtype(kwargs["dtype"]) + self._explicit_set_dtype = True + + if "format" in kwargs: + self.format = Input._parse_format(kwargs["format"])
+ + def __str__(self) -> str: + if self.shape_mode == Input._ShapeMode.STATIC: + return "Input(shape={}, dtype={}, format={})".format( + self.shape, str(self.dtype), str(self.format) + ) + elif self.shape_mode == Input._ShapeMode.DYNAMIC: + return "Input(min_shape={}, opt_shape={}, max_shape={}, dtype={}, format={})".format( + self.shape["min_shape"], + self.shape["opt_shape"], + self.shape["max_shape"], + str(self.dtype), + str(self.format), + ) + else: + raise RuntimeError("Unknown input shape mode") + + def _to_internal(self) -> _C.Input: + internal_in = _C.Input() + if self.shape_mode == Input._ShapeMode.DYNAMIC: + if not Input._supported_input_size_type(self.shape["min_shape"]): + raise TypeError( + "Input shape specifications for inputs are required to be a List, tuple or torch.Size, found type: " + + str(type(self.shape["min_shape"])) + + " for min_shape" + ) + else: + internal_in.min = self.shape["min_shape"] + + if not Input._supported_input_size_type(self.shape["opt_shape"]): + raise TypeError( + "Input shape specifications for inputs are required to be a List, tuple or torch.Size, found type: " + + str(type(self.shape["opt_shape"])) + + " for opt_shape" + ) + else: + internal_in.opt = self.shape["opt_shape"] + + if not Input._supported_input_size_type(self.shape["max_shape"]): + raise TypeError( + "Input shape specifications for inputs are required to be a List, tuple or torch.Size, found type: " + + str(type(self.shape["max_shape"])) + + " for max_shape" + ) + else: + internal_in.max = self.shape["max_shape"] + internal_in.input_is_dynamic = True + else: + if not Input._supported_input_size_type(self.shape): + raise TypeError( + "Input shape specifications for inputs are required to be a List, tuple or torch.Size, found type: " + + str(type(self.shape)) + + " for shape" + ) + else: + internal_in.opt = self.shape + internal_in.input_is_dynamic = False + + if self.dtype != _enums.dtype.unknown: + self._explicit_set_dtype = True + else: + self._explicit_set_dtype = False + + internal_in.dtype = Input._parse_dtype(self.dtype) + internal_in._explicit_set_dtype = self._explicit_set_dtype + internal_in.format = Input._parse_format(self.format) + return internal_in + + @staticmethod + def _supported_input_size_type(input_size: Any) -> bool: + if isinstance(input_size, torch.Size): + return True + elif isinstance(input_size, tuple): + return True + elif isinstance(input_size, list): + return True + else: + return False + + @staticmethod + def _parse_dtype(dtype: Any) -> _enums.dtype: + if isinstance(dtype, torch.dtype): + if dtype == torch.int32: + return _enums.dtype.int32 + elif dtype == torch.half: + return _enums.dtype.half + elif dtype == torch.float: + return _enums.dtype.float + elif dtype == torch.bool: + return _enums.dtype.bool + else: + raise TypeError( + "Provided an unsupported data type as an input data type (support: bool, int32, half, float), got: " + + str(dtype) + ) + + elif isinstance(dtype, _enums.dtype): + return dtype + + else: + raise TypeError( + "Input data type needs to be specified with a torch.dtype or a torch_tensorrt.dtype, got: " + + str(type(dtype)) + ) + + @staticmethod + def _parse_format(format: Any) -> _enums.TensorFormat: + if isinstance(format, torch.memory_format): + if format == torch.contiguous_format: + return _enums.TensorFormat.contiguous + elif format == torch.channels_last: + return _enums.TensorFormat.channels_last + else: + raise ValueError( + "Provided an unsupported tensor format (support: NHCW/contiguous_format, NHWC/channel_last)" + ) + + elif isinstance(format, _enums.TensorFormat): + return format + + else: + raise TypeError( + "Tensor format needs to be specified with either torch.memory_format or torch_tensorrt.TensorFormat" + ) + + @classmethod + def _from_tensor(cls, t: torch.Tensor): + if not any( + [ + t.is_contiguous(memory_format=torch.contiguous_format), + t.is_contiguous(memory_format=torch.channels_last), + ] + ): + raise ValueError( + "Tensor does not have a supported contiguous memory format, supported formats are contiguous or channel_last" + ) + frmt = ( + torch.contiguous_format + if t.is_contiguous(memory_format=torch.contiguous_format) + else torch.channels_last + ) + return cls(shape=t.shape, dtype=t.dtype, format=frmt)
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_modules/torch_tensorrt/_compile.html b/docs/v1.1.1/_modules/torch_tensorrt/_compile.html new file mode 100644 index 0000000000..5396dc1d85 --- /dev/null +++ b/docs/v1.1.1/_modules/torch_tensorrt/_compile.html @@ -0,0 +1,837 @@ + + + + + + + + + + + + torch_tensorrt._compile — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt._compile

+from typing import List, Dict, Any
+from torch_tensorrt import _enums
+import torch_tensorrt.ts
+from torch_tensorrt import logging
+import torch
+import torch.fx
+from enum import Enum
+
+import torch_tensorrt.fx
+import torch_tensorrt.fx.lower
+from torch_tensorrt.fx.utils import LowerPrecision
+
+
+class _IRType(Enum):
+    """Enum to set the minimum required logging level to print a message to stdout"""
+
+    ts = 0
+    fx = 1
+
+
+class _ModuleType(Enum):
+    """Enum to set the minimum required logging level to print a message to stdout"""
+
+    nn = 0
+    ts = 1
+    fx = 2
+
+
+def _parse_module_type(module: Any) -> _ModuleType:
+    if any(
+        isinstance(module, t)
+        for t in [torch.jit.ScriptModule, torch.jit.ScriptFunction]
+    ):
+        return _ModuleType.ts
+    elif isinstance(module, torch.fx.GraphModule):
+        return _ModuleType.fx
+    elif isinstance(module, torch.nn.Module):
+        return _ModuleType.nn
+    else:
+        raise RuntimeError("Module is an unknown format")
+
+
+def _get_target_ir(module_type: _ModuleType, ir: str) -> _IRType:
+    module_is_tsable = any([module_type == t for t in [_ModuleType.nn, _ModuleType.ts]])
+    module_is_fxable = any([module_type == t for t in [_ModuleType.nn, _ModuleType.fx]])
+
+    ir_targets_torchscript = any([ir == opt for opt in ["torchscript", "ts"]])
+    ir_targets_fx = ir == "fx"
+
+    if module_is_tsable and ir_targets_torchscript:
+        return _IRType.ts
+    elif module_is_fxable and ir_targets_fx:
+        return _IRType.fx
+    else:
+        if ir == "default":
+            # Options are listed in order of preference
+            if module_is_tsable:
+                logging.log(
+                    logging.Level.Info, "ir was set to default, using TorchScript as ir"
+                )
+                return _IRType.ts
+            elif module_is_fxable:
+                raise ValueError(
+                    "Was given a torch.fx.GraphModule, fx is not currently supported by Torch-TensorRT"
+                )
+                # logging.log(logging.Level.Info, "ir was set to default, using TorchScript as fx")
+                # return _IRType.fx
+            else:
+                raise ValueError("Module was provided with in an unsupported format")
+        else:
+            raise ValueError("Unknown ir was requested")
+
+
+
[docs]def compile( + module: Any, + ir="default", + inputs=[], + enabled_precisions=set([_enums.dtype.float]), + **kwargs, +): + """Compile a PyTorch module for NVIDIA GPUs using TensorRT + + Takes a existing PyTorch module and a set of settings to configure the compiler + and using the path specified in ``ir`` lower and compile the module to TensorRT + returning a PyTorch Module back + + Converts specifically the forward method of a Module + + Arguments: + module (Union(torch.nn.Module,torch.jit.ScriptModule): Source module + + Keyword Arguments: + inputs (List[Union(torch_tensorrt.Input, torch.Tensor)]): **Required** List of specifications of input shape, dtype and memory layout for inputs to the module. This argument is required. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using + torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum + to select device type. :: + + input=[ + torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1 + torch_tensorrt.Input( + min_shape=(1, 224, 224, 3), + opt_shape=(1, 512, 512, 3), + max_shape=(1, 1024, 1024, 3), + dtype=torch.int32 + format=torch.channel_last + ), # Dynamic input shape for input #2 + torch.randn((1, 3, 224, 244)) # Use an example tensor and let torch_tensorrt infer settings + ] + + enabled_precision (Set(Union(torch.dtype, torch_tensorrt.dtype))): The set of datatypes that TensorRT can use when selecting kernels + ir (str): The requested strategy to compile. (Options: default - Let Torch-TensorRT decide, ts - TorchScript with scripting path) + **kwargs: Additional settings for the specific requested strategy (See submodules for more info) + + Returns: + torch.nn.Module: Compiled Module, when run it will execute via TensorRT + """ + module_type = _parse_module_type(module) + target_ir = _get_target_ir(module_type, ir) + if target_ir == _IRType.ts: + ts_mod = module + if module_type == _ModuleType.nn: + logging.log( + logging.Level.Info, + "Module was provided as a torch.nn.Module, trying to script the module with torch.jit.script. In the event of a failure please preconvert your module to TorchScript", + ) + ts_mod = torch.jit.script(module) + return torch_tensorrt.ts.compile( + ts_mod, inputs=inputs, enabled_precisions=enabled_precisions, **kwargs + ) + elif target_ir == _IRType.fx: + if ( + torch.float16 in enabled_precisions + or torch_tensorrt.dtype.half in enabled_precisions + ): + lower_precision = LowerPrecision.FP16 + elif ( + torch.float32 in enabled_precisions + or torch_tensorrt.dtype.float in enabled_precisions + ): + lower_precision = LowerPrecision.FP32 + else: + raise ValueError(f"Precision {enabled_precisions} not supported on FX") + + return torch_tensorrt.fx.lower.compile( + module, + inputs, + lower_precision=lower_precision, + max_batch_size=inputs[0].size(0), + explicit_batch_dimension=True, + dynamic_batch=False, + ) + else: + raise RuntimeError("Module is an unknown format or the ir requested is unknown")
+ + +
[docs]def convert_method_to_trt_engine( + module: Any, + method_name: str, + ir="default", + inputs=[], + enabled_precisions=set([_enums.dtype.float]), + **kwargs, +): + """Convert a TorchScript module method to a serialized TensorRT engine + + Converts a specified method of a module to a serialized TensorRT engine given a dictionary of conversion settings + + Arguments: + module (Union(torch.nn.Module,torch.jit.ScriptModule): Source module + + Keyword Arguments: + inputs (List[Union(torch_tensorrt.Input, torch.Tensor)]): **Required** List of specifications of input shape, dtype and memory layout for inputs to the module. This argument is required. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using + torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum + to select device type. :: + + input=[ + torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1 + torch_tensorrt.Input( + min_shape=(1, 224, 224, 3), + opt_shape=(1, 512, 512, 3), + max_shape=(1, 1024, 1024, 3), + dtype=torch.int32 + format=torch.channel_last + ), # Dynamic input shape for input #2 + torch.randn((1, 3, 224, 244)) # Use an example tensor and let torch_tensorrt infer settings + ] + + enabled_precision (Set(Union(torch.dtype, torch_tensorrt.dtype))): The set of datatypes that TensorRT can use when selecting kernels + ir (str): The requested strategy to compile. (Options: default - Let Torch-TensorRT decide, ts - TorchScript with scripting path) + **kwargs: Additional settings for the specific requested strategy (See submodules for more info) + Returns: + bytes: Serialized TensorRT engine, can either be saved to a file or deserialized via TensorRT APIs + """ + module_type = _parse_module_type(module) + target_ir = _get_target_ir(module_type, ir) + if target_ir == _IRType.ts: + ts_mod = module + if module_type == _ModuleType.nn: + logging.log( + logging.Level.Info, + "Module was provided as a torch.nn.Module, trying to script the module with torch.jit.script. In the event of a failure please preconvert your module to TorchScript", + ) + ts_mod = torch.jit.script(module) + return torch_tensorrt.ts.convert_method_to_trt_engine( + ts_mod, + method_name, + inputs=inputs, + enabled_precisions=enabled_precisions, + **kwargs, + ) + elif target_ir == _IRType.fx: + raise RuntimeError("fx is currently not supported") + else: + raise RuntimeError("Module is an unknown format or the ir requested is unknown")
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_modules/torch_tensorrt/_util.html b/docs/v1.1.1/_modules/torch_tensorrt/_util.html new file mode 100644 index 0000000000..72e6417981 --- /dev/null +++ b/docs/v1.1.1/_modules/torch_tensorrt/_util.html @@ -0,0 +1,656 @@ + + + + + + + + + + + + torch_tensorrt._util — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt._util

+from torch_tensorrt import __version__
+from torch_tensorrt import _C
+
+import torch
+
+
+
[docs]def dump_build_info(): + """Prints build information about the torch_tensorrt distribution to stdout""" + print(get_build_info())
+ + +
[docs]def get_build_info() -> str: + """Returns a string containing the build information of torch_tensorrt distribution + + Returns: + str: String containing the build information for torch_tensorrt distribution + """ + build_info = _C.get_build_info() + build_info = ( + "Torch-TensorRT Version: " + + str(__version__) + + "\n" + + "Using PyTorch Version: " + + str(torch.__version__) + + "\n" + + build_info + ) + return build_info
+ + +
[docs]def set_device(gpu_id): + _C.set_device(gpu_id)
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_modules/torch_tensorrt/fx/fx2trt.html b/docs/v1.1.1/_modules/torch_tensorrt/fx/fx2trt.html new file mode 100644 index 0000000000..24980922e2 --- /dev/null +++ b/docs/v1.1.1/_modules/torch_tensorrt/fx/fx2trt.html @@ -0,0 +1,999 @@ + + + + + + + + + + + + torch_tensorrt.fx.fx2trt — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt.fx.fx2trt

+import logging
+import warnings
+from datetime import datetime
+from typing import Any, Callable, Dict, List, NamedTuple, Optional, Sequence
+
+import numpy
+
+# @manual=//deeplearning/trt/python:py_tensorrt
+import tensorrt as trt
+import torch
+import torch.fx
+from torch.fx.node import _get_qualified_name
+from torch.fx.passes.shape_prop import TensorMetadata
+
+from .converter_registry import CONVERTERS
+from .input_tensor_spec import InputTensorSpec
+from .observer import Observer
+from .utils import get_dynamic_dims, LowerPrecision, torch_dtype_to_trt
+
+_LOGGER: logging.Logger = logging.getLogger(__name__)
+
+TRT_INTERPRETER_CALL_PRE_OBSERVER: Observer[
+    Callable[[torch.fx.GraphModule], None]
+] = Observer("TRT_INTERPRETER_CALL_PRE_OBSERVER")
+
+
+
[docs]class TRTInterpreterResult(NamedTuple): + engine: Any + input_names: Sequence[str] + output_names: Sequence[str] + serialized_cache: bytearray
+ + +
[docs]class TRTInterpreter(torch.fx.Interpreter): + def __init__( + self, + module: torch.fx.GraphModule, + input_specs: List[InputTensorSpec], + explicit_batch_dimension: bool = False, + explicit_precision: bool = False, + logger_level=None, + ): + super().__init__(module) + + self.logger = trt.Logger(logger_level or trt.Logger.WARNING) + self.builder = trt.Builder(self.logger) + + flag = 0 + if explicit_batch_dimension: + EXPLICIT_BATCH = 1 << (int)( + trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH + ) + flag |= EXPLICIT_BATCH + + if explicit_precision: + EXPLICIT_PRECISION = 1 << (int)( + trt.NetworkDefinitionCreationFlag.EXPLICIT_PRECISION + ) + flag |= EXPLICIT_PRECISION + self.network = self.builder.create_network(flag) + + missing_ops = self.validate_conversion() + if missing_ops: + warnings.warn( + "Interpretation will fail due to missing operations \n" + + "\n".join(f"{i}" for i in missing_ops) + ) + + self.optimization_profiles: Optional[List] = None + self.input_specs = input_specs + self.input_specs_iter = 0 + self.validate_input_specs() + self._cur_node_name: Optional[str] = None + self._input_names: List[str] = [] + self._output_names: List[str] = [] + self._itensor_to_tensor_meta: Dict[ + trt.tensorrt.ITensor, TensorMetadata + ] = dict() + + def validate_input_specs(self): + for shape, _, _, shape_ranges, has_batch_dim in self.input_specs: + if not self.network.has_implicit_batch_dimension: + assert ( + has_batch_dim + ), "It's required to specify batch dimension when it's explicit in TensorRT network." + + dynamic_dims = get_dynamic_dims(shape) + if len(dynamic_dims): + assert not self.network.has_implicit_batch_dimension, ( + "Can't have dynamic dim when " + f"batch dim is implicit, got {shape}." + ) + assert len( + shape_ranges + ), "shape_ranges must be provided when shape has dynamic dim." + + if self.optimization_profiles: + assert len(shape_ranges) == len(self.optimization_profiles), ( + "Number of optimization " + f"profiles {len(self.optimization_profiles)} doesn't match with the number of shape_range" + f" {len(shape_ranges)} provided." + ) + else: + self.optimization_profiles = [ + self.builder.create_optimization_profile() + for _ in range(len(shape_ranges)) + ] + + for shape_range in shape_ranges: + assert ( + len(shape_range) == 3 + ), f"Expect three elements in shape_range, got {len(shape_range)}" + assert all(len(s) == len(shape) for s in shape_range), ( + "Expect elements in shape_range" + f" {shape_range} have the same number of dimension as the provided shape {len(shape)}" + ) + + for i in range(len(shape)): + if i in dynamic_dims: + assert all( + shape_range[j][i] <= shape_range[j + 1][i] + for j in range(2) + ), ( + "Expect dynamic dim" + f" {i} to have incremental value for shapes in shape_range {shape_range}." + ) + else: + assert all(s[i] == shape[i] for s in shape_range), ( + f"Expect non dynamic dim {i} to be the same" + f" for all shapes in shape_range {shape_range}." + ) + else: + assert ( + len(shape_ranges) == 0 + ), "shape_ranges are provided for input that doesn't have dynamic dim." + + def validate_conversion(self): + missing_converter = set() + + for node in self.module.graph.nodes: + if node.op == "call_function" and not CONVERTERS.get(node.target): + missing_converter.add(f"{node.op} {_get_qualified_name(node.target)}") + elif node.op == "call_method" and not CONVERTERS.get(node.target): + missing_converter.add(f"{node.op} torch.Tensor.{node.target}") + elif node.op == "call_module": + submod = self.fetch_attr(node.target) + submod_type = getattr(submod, "_base_class_origin", type(submod)) + if not CONVERTERS.get(submod_type): + missing_converter.add(f"{node.op} {torch.typename(submod_type)}") + + return missing_converter + + def run( + self, + max_batch_size=64, + max_workspace_size=1 << 25, + lower_precision=LowerPrecision.FP16, + sparse_weights=False, + force_fp32_output=False, + strict_type_constraints=False, + algorithm_selector=None, + timing_cache=None, + profiling_verbosity=None, + tactic_sources=None, + ) -> TRTInterpreterResult: + """ + Build TensorRT engine with some configs. + Args: + max_batch_size: set accordingly for maximum batch size you will use. + max_workspace_size: set to the maximum size we can afford for temporary buffer + lower_precision: the precision model layers are running on (TensorRT will choose the best perforamnce precision). + sparse_weights: allow the builder to examine weights and use optimized functions when weights have suitable sparsity + force_fp32_output: force output to be fp32 + strict_type_constraints: Usually we should set it to False unless we want to control the precision of certain layer for numeric reasons. + algorithm_selector: set up algorithm selection for certain layer + timing_cache: enable timing cache for TensorRT + profiling_verbosity: TensorRT logging level + Return: + TRTInterpreterResult + """ + TRT_INTERPRETER_CALL_PRE_OBSERVER.observe(self.module) + + # For float outputs, we set their dtype to fp16 only if lower_precision == LowerPrecision.FP16 and + # force_fp32_output=False. + self.output_fp16 = ( + not force_fp32_output and lower_precision == LowerPrecision.FP16 + ) + + if ( + lower_precision == LowerPrecision.INT8 + and not self.builder.platform_has_fast_int8 + ): + raise RuntimeError("Current platform doesn't support fast native int8!") + + if ( + lower_precision == LowerPrecision.FP16 + and not self.builder.platform_has_fast_fp16 + ): + warnings.warn("Current platform doesn't support fast native fp16!") + + self.input_specs_iter = 0 + run_module_start_time = datetime.now() + super().run() + _LOGGER.info( + f"Run Module elapsed time: {datetime.now() - run_module_start_time}" + ) + build_engine_start_time = datetime.now() + + self.builder.max_batch_size = max_batch_size + builder_config = self.builder.create_builder_config() + builder_config.max_workspace_size = max_workspace_size + + cache = None + if timing_cache: + cache_file = numpy.array(timing_cache) + cache = builder_config.create_timing_cache(cache_file.tobytes()) + else: + cache = builder_config.create_timing_cache(b"") + builder_config.set_timing_cache(cache, False) + + if trt.__version__ >= "8.2": + builder_config.profiling_verbosity = ( + profiling_verbosity + if profiling_verbosity + else trt.ProfilingVerbosity.LAYER_NAMES_ONLY + ) + if lower_precision == LowerPrecision.FP16: + builder_config.set_flag(trt.BuilderFlag.FP16) + + if lower_precision == LowerPrecision.INT8: + builder_config.set_flag(trt.BuilderFlag.INT8) + + if sparse_weights: + builder_config.set_flag(trt.BuilderFlag.SPARSE_WEIGHTS) + + if strict_type_constraints: + builder_config.set_flag(trt.BuilderFlag.STRICT_TYPES) + + if self.optimization_profiles: + for optimization_profile in self.optimization_profiles: + builder_config.add_optimization_profile(optimization_profile) + + if algorithm_selector: + builder_config.set_flag(trt.BuilderFlag.DISABLE_TIMING_CACHE) + builder_config.algorithm_selector = algorithm_selector + + if tactic_sources is not None: + builder_config.set_tactic_sources(tactic_sources=tactic_sources) + + engine = self.builder.build_engine(self.network, builder_config) + assert engine + + serialized_cache = ( + bytearray(cache.serialize()) + if builder_config.get_timing_cache() + else bytearray() + ) + _LOGGER.info( + f"Build TRT engine elapsed time: {datetime.now() - build_engine_start_time}" + ) + + return TRTInterpreterResult( + engine, self._input_names, self._output_names, serialized_cache + ) + + def run_node(self, n): + self._cur_node_name = str(n) + # add "_itensor_to_tensor_meta" + kwargs = dict(n.kwargs) + kwargs["_itensor_to_tensor_meta"] = self._itensor_to_tensor_meta + n.kwargs = kwargs + + # run the node + trt_node = super().run_node(n) + + # remove "_itensor_to_tensor_meta" + kwargs = dict(n.kwargs) + del kwargs["_itensor_to_tensor_meta"] + n.kwargs = kwargs + + if isinstance(trt_node, trt.tensorrt.ITensor): + self._itensor_to_tensor_meta[trt_node] = n.meta.get("tensor_meta") + + return trt_node + + def placeholder(self, target, args, kwargs): + self._input_names.append(target) + shape, dtype, _, shape_ranges, has_batch_dim = self.input_specs[ + self.input_specs_iter + ] + self.input_specs_iter += 1 + + if self.network.has_implicit_batch_dimension: + if has_batch_dim: + shape = shape[1:] + else: + for i, shape_range in enumerate(shape_ranges): + assert self.optimization_profiles + self.optimization_profiles[i].set_shape(target, *shape_range) + + return self.network.add_input( + name=target, shape=tuple(shape), dtype=torch_dtype_to_trt(dtype) + ) + + def call_module(self, target, args, kwargs): + assert isinstance(target, str) + submod = self.fetch_attr(target) + submod_type = getattr(submod, "_base_class_origin", type(submod)) + converter = CONVERTERS.get(submod_type) + + if not converter: + raise RuntimeError( + f"Conversion of module of type {submod_type} not currently supported!" + ) + + assert self._cur_node_name is not None + return converter(self.network, submod, args, kwargs, self._cur_node_name) + + def call_function(self, target, args, kwargs): + converter = CONVERTERS.get(target) + + if not converter: + raise RuntimeError( + f"Conversion of function {torch.typename(target)} not currently supported!" + ) + + assert self._cur_node_name is not None + return converter(self.network, target, args, kwargs, self._cur_node_name) + + def call_method(self, target, args, kwargs): + assert isinstance(target, str) + converter = CONVERTERS.get(target) + + if not converter: + raise RuntimeError( + f"Conversion of method {target} not currently supported!" + ) + + assert self._cur_node_name is not None + return converter(self.network, target, args, kwargs, self._cur_node_name) + + def output(self, target, args, kwargs): + assert len(args) == 1 + outputs = args[0] if isinstance(args[0], tuple) else (args[0],) + + if not all(isinstance(output, trt.tensorrt.ITensor) for output in outputs): + raise RuntimeError("TensorRT requires all outputs to be Tensor!") + + for i, output in enumerate(outputs): + if any( + op_name in output.name.split("_") + for op_name in ( + "eq", + "gt", + "lt", + "or", + "xor", + "and", + "not", + "ne", + "isinf", + "any", + ) + ): + output_bool = True + else: + output_bool = False + name = f"output{i}" + output.name = name + self.network.mark_output(output) + if output_bool: + output.dtype = trt.bool + elif self.output_fp16 and output.dtype == trt.float32: + output.dtype = trt.float16 + self._output_names.append(name)
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_modules/torch_tensorrt/fx/input_tensor_spec.html b/docs/v1.1.1/_modules/torch_tensorrt/fx/input_tensor_spec.html new file mode 100644 index 0000000000..a7c84fbb00 --- /dev/null +++ b/docs/v1.1.1/_modules/torch_tensorrt/fx/input_tensor_spec.html @@ -0,0 +1,809 @@ + + + + + + + + + + + + torch_tensorrt.fx.input_tensor_spec — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt.fx.input_tensor_spec

+from typing import Iterable, List, NamedTuple, Optional, Sequence, Tuple
+
+import torch
+
+from .types import Shape, ShapeRange
+from .utils import get_dynamic_dims
+
+
+def generate_input_specs(inputs, lower_setting, additional_inputs=None):
+    # dynamic_batch is TRT only flag.
+    if (
+        not lower_setting.explicit_batch_dimension
+        or lower_setting.dynamic_batch is False
+    ):
+        return InputTensorSpec.from_tensors(inputs)
+
+    # If we don't have additional inputs, we assume the first dimension
+    # is the dynamic batch dimension. Otherwise, we use the additional
+    # inputs to determine the batch dimension.
+    if additional_inputs is None:
+        return InputTensorSpec.from_tensors_with_dynamic_batch_size(
+            inputs,
+            (
+                0,
+                lower_setting.max_batch_size,
+                lower_setting.max_batch_size,
+            ),
+            lower_setting.opt_profile_replica,
+        )
+    else:
+        batch_dims = []
+
+        for i, j in zip(inputs, additional_inputs):
+            found_batch_dim = False
+
+            for idx, values in enumerate(zip(i.shape, j.shape)):
+                if values[0] != values[1]:
+                    assert (
+                        found_batch_dim is False
+                    ), f"We've already found a batch dim, {i.shape}, {j.shape}."
+                    batch_dims.append(idx)
+                    found_batch_dim = True
+
+            if not found_batch_dim:
+                raise RuntimeError(
+                    f"Failed to find batch dimension because shapes are the same, {i.shape}"
+                )
+
+        return InputTensorSpec.from_tensors_with_dynamic_batch_size(
+            inputs,
+            (
+                0,
+                lower_setting.max_batch_size,
+                lower_setting.max_batch_size,
+            ),
+            lower_setting.opt_profile_replica,
+            batch_dims,
+        )
+
+
+
[docs]class InputTensorSpec(NamedTuple): + """ + This class contains the information of a input tensor. + + shape: shape of the tensor. + + dtype: dtyep of the tensor. + + device: device of the tensor. This is only used to generate inputs to the given model + in order to run shape prop. For TensorRT engine, inputs have to be on cuda device. + + shape_ranges: If dynamic shape is needed (shape has dimensions of -1), then this field + has to be provided (default is empty list). Every shape_range is a tuple of three + tuples ((min_input_shape), (optimized_input_shape), (max_input_shape)). Each shape_range + is used to populate a TensorRT optimization profile. + e.g. If the input shape varies from (1, 224) to (100, 224) and we want to optimize + for (25, 224) because it's the most common input shape, then we set shape_ranges to + ((1, 224), (25, 225), (100, 224)). + + has_batch_dim: Whether the shape includes batch dimension. Batch dimension has to be provided + if the engine want to run with dynamic shape. + """ + + shape: Shape + dtype: torch.dtype + device: torch.device = torch.device("cpu") + shape_ranges: List[ShapeRange] = [] + has_batch_dim: bool = True + + @classmethod + def from_tensor(cls, tensor: torch.Tensor) -> "InputTensorSpec": + """ + Produce an InputTenosrSpec named tuple which contains the + information of the given PyTorch tensor. + + Args: + tensor (torch.Tensor): A PyTorch tensor. + + Returns: + An InputTensorSpec named tuple. + """ + return cls(tensor.shape, tensor.dtype, tensor.device) + + @classmethod + def from_tensors(cls, tensors: Sequence[torch.Tensor]) -> List["InputTensorSpec"]: + """ + Produce a list of InputTenosrSpec named tuples which contain + the information of all the given PyTorch tensors. + + Args: + tensors (Iterable[torch.Tensor]): A list of PyTorch tensors. + + Returns: + A list of InputTensorSpec named tuples. + """ + assert isinstance(tensors, (list, tuple)) + return [cls.from_tensor(t) for t in tensors] + + @classmethod + def from_tensors_with_dynamic_batch_size( + cls, + tensors: Sequence[torch.Tensor], + batch_size_range: Tuple[int, int, int], + opt_profile_replica: int = 1, + batch_dims: Optional[List[int]] = None, + ) -> List["InputTensorSpec"]: + """ + Produce a list of InputTenosrSpec named tuples which would contain + the information of all the given PyTorch tensors. The produced input + tensor specs will treat all tensors' first dimension as batch dimension + and mark them as dynmaic. + + Args: + tensors (Sequence[torch.Tensor]): A list of PyTorch tensors. + batch_size_range (Tuple[int, int, int]): The first integer indicates + the smallest batch size allowed. The second integer indiceates + the batch size that we'll optimize for. The third integer indicates + the largest batch size allowed. + opt_profile_replica (int): If dynamic shape is enabled, each execution + context requires a different optimization profile. This arg determines + how many optimization profile replicas we want to produce. + batch_dims (Optional[List[int]]): The batch dim might not be the leading dim + and allow user to specify the batch dims using this arg. Default we treat + dim 0 as the batch dim. + + Returns: + A list of InputTensorSpec named tuples with dynamic ranges. + """ + if batch_dims is None: + batch_dims = [0] * len(tensors) + + input_specs = [] + batch_size = tensors[0].size(batch_dims[0]) + + for i, tensor in enumerate(tensors): + batch_dim = batch_dims[i] + assert batch_size == tensor.size( + batch_dim + ), f"The {i}th tensor (shape: {tensor.shape}) doesn't have the correct batch size: {batch_size}." + shape = list(tensor.shape) + shape[batch_dim] = -1 + shape_ranges: List[ShapeRange] = [tuple(tuple(shape[0:batch_dim] + [bs] + shape[batch_dim + 1 :]) for bs in batch_size_range)] * opt_profile_replica # type: ignore[list-item] + input_specs.append( + cls(tuple(shape), tensor.dtype, tensor.device, shape_ranges) + ) + + return input_specs + + def to_random_tensor(self): + shape = tuple(self.shape) + if len(get_dynamic_dims(shape)): + shape = tuple(self.shape_ranges[0][1]) + elif not self.has_batch_dim: + shape = (1,) + tuple(shape) + + return torch.randn(shape).to(dtype=self.dtype, device=self.device) + + @staticmethod + def create_inputs_from_specs(input_specs: Iterable["InputTensorSpec"]): + inputs = [] + + for spec in input_specs: + inputs.append(spec.to_random_tensor()) + + return inputs
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_modules/torch_tensorrt/fx/lower.html b/docs/v1.1.1/_modules/torch_tensorrt/fx/lower.html new file mode 100644 index 0000000000..f3db3e8945 --- /dev/null +++ b/docs/v1.1.1/_modules/torch_tensorrt/fx/lower.html @@ -0,0 +1,871 @@ + + + + + + + + + + + + torch_tensorrt.fx.lower — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt.fx.lower

+import dataclasses as dc
+import logging
+from typing import Any, Callable, Optional, Sequence
+
+# @manual=//deeplearning/trt/python:py_tensorrt
+import tensorrt as trt
+import torch
+import torch.fx as fx
+import torch.nn as nn
+from torch.fx.passes.splitter_base import SplitResult
+
+from .fx2trt import TRTInterpreter, TRTInterpreterResult
+from .lower_setting import LowerSetting
+from .passes.lower_pass_manager_builder import LowerPassManagerBuilder
+from .passes.pass_utils import decorate_method, PassFunc, validate_inference
+from .tools.timing_cache_utils import TimingCacheManager
+from .tools.trt_splitter import TRTSplitter, TRTSplitterSetting
+
+from .tracer.acc_tracer import acc_tracer
+from .trt_module import TRTModule
+from .utils import LowerPrecision
+
+logger = logging.getLogger(__name__)
+
+Input = Sequence[Any]
+
+
+
[docs]def compile( + module: nn.Module, + input, + max_batch_size: int = 2048, + max_workspace_size=1 << 25, + explicit_batch_dimension=False, + lower_precision=LowerPrecision.FP16, + verbose_log=False, + timing_cache_prefix="", + save_timing_cache=False, + cuda_graph_batch_size=-1, + dynamic_batch=True, +) -> nn.Module: + """ + Takes in original module, input and lowering setting, run lowering workflow to turn module + into lowered module, or so called TRTModule. + + Args: + module: Original module for lowering. + input: Input for module. + max_batch_size: Maximum batch size (must be >= 1 to be set, 0 means not set) + max_workspace_size: Maximum size of workspace given to TensorRT. + explicit_batch_dimension: Use explicit batch dimension in TensorRT if set True, otherwise use implicit batch dimension. + lower_precision: lower_precision config given to TRTModule. + verbose_log: Enable verbose log for TensorRT if set True. + timing_cache_prefix: Timing cache file name for timing cache used by fx2trt. + save_timing_cache: Update timing cache with current timing cache data if set to True. + cuda_graph_batch_size: Cuda graph batch size, default to be -1. + + Returns: + A torch.nn.Module lowered by TensorRT. + """ + lower_setting = LowerSetting( + max_batch_size=max_batch_size, + max_workspace_size=max_workspace_size, + explicit_batch_dimension=explicit_batch_dimension, + lower_precision=lower_precision, + verbose_log=verbose_log, + timing_cache_prefix=timing_cache_prefix, + save_timing_cache=save_timing_cache, + cuda_graph_batch_size=cuda_graph_batch_size, + dynamic_batch=dynamic_batch, + ) + lowerer = Lowerer.create(lower_setting=lower_setting) + return lowerer(module, input)
+ + +@dc.dataclass +class LowerTrtInterpreter: + lower_setting: LowerSetting + timing_cache_manager: TimingCacheManager + + @classmethod + def create(cls, lower_setting): + timing_cache_manager = TimingCacheManager( + lower_setting.timing_cache_prefix, lower_setting.save_timing_cache + ) + return LowerTrtInterpreter(lower_setting, timing_cache_manager) + + def __call__(self, mod, input, split_name) -> TRTInterpreterResult: + assert self.lower_setting.input_specs, "Can't find input specs for lowering!" + logger.info(f"{split_name=} {self.lower_setting.input_specs=}") + + # Prepare algorithm selector and timing_cache for TRTInterpreter + algo_selector = None + if self.lower_setting.algo_selector: + algo_selector = self.lower_setting.algo_selector(f"{split_name}.json") + cache_data = None + if self.timing_cache_manager: + try: + cache_data = self.timing_cache_manager.get_timing_cache_trt(split_name) + except Exception as e: + logger.warning(f"Cannot load timing cache for {split_name}: {str(e)}") + cache_data = None + + interpreter = TRTInterpreter( + mod, + input_specs=self.lower_setting.input_specs, + explicit_batch_dimension=self.lower_setting.explicit_batch_dimension, + explicit_precision=self.lower_setting.explicit_precision, + logger_level=trt.Logger.VERBOSE + if self.lower_setting.verbose_log + else trt.Logger.WARNING, + ) + + interp_result: TRTInterpreterResult = interpreter.run( + max_batch_size=self.lower_setting.max_batch_size, + max_workspace_size=self.lower_setting.max_workspace_size, + lower_precision=self.lower_setting.lower_precision, + strict_type_constraints=self.lower_setting.strict_type_constraints, + algorithm_selector=algo_selector, + timing_cache=cache_data, + profiling_verbosity=trt.ProfilingVerbosity.DETAILED + if self.lower_setting.verbose_profile + else trt.ProfilingVerbosity.LAYER_NAMES_ONLY, + tactic_sources=self.lower_setting.tactic_sources, + ) + + # Update timing cache file if needed + timing_cache = interp_result.serialized_cache + if timing_cache and self.timing_cache_manager: + self.timing_cache_manager.update_timing_cache(split_name, timing_cache) + + return interp_result + + +def default_split_function( + model: fx.GraphModule, inputs: Input, lower_setting: LowerSetting +) -> SplitResult: + splitter_setting = TRTSplitterSetting() + splitter_setting.use_implicit_batch_dim = not lower_setting.explicit_batch_dimension + splitter_setting.min_acc_module_size = lower_setting.min_acc_module_size + splitter = TRTSplitter(model, inputs, settings=splitter_setting) + splitter.node_support_preview() + return splitter.generate_split_results() + + +def create_lower_trt_interpreter(lower_setting: LowerSetting) -> LowerTrtInterpreter: + return LowerTrtInterpreter.create(lower_setting) + + +def default_lower_pass( + create_trt_interpreter: Callable[[LowerSetting], LowerTrtInterpreter], +) -> PassFunc: + def lower_pass( + mod: nn.Module, input: Input, lower_setting: LowerSetting, module_name: str + ) -> nn.Module: + """ + Create a module transformation pass which lowers an `fx.GraphModule` into a + `TRTModule` + """ + interpreter = create_trt_interpreter(lower_setting) + interp_res: TRTInterpreterResult = interpreter(mod, input, module_name) + trt_module = TRTModule( + engine=interp_res.engine, + input_names=interp_res.input_names, + output_names=interp_res.output_names, + cuda_graph_batch_size=lower_setting.cuda_graph_batch_size, + ) + return trt_module + + return lower_pass + + +@dc.dataclass(frozen=True) +class Lowerer: + """Lowers a module using fx2trt. + + This is a composable class to facilitate fx2trt. A normal fx2trt process + composes of the following passes to transform an `fx.GraphModule`: + + 1. trace - use torch.fx to trace the module so we can get the graph + representation of the model. + 2. split - the graph module is split into several submodules, + running either via TensorRT, or via regular CUDA. + + For each split that need to run via TRT, the following passes are + invoked: + + 3. `TRTInterpreter` - build the TRT engine for the submodule that + can be supported through `TRTInterpreter`. + 4. Wraps the executable TRT engine into `TRTModule`, which is an `nn.Module`. + 5. The converted submodule is then set back onto the top-level module + + """ + + lower_pass_manager_builder: LowerPassManagerBuilder + + @classmethod + def create( + cls, + lower_setting: LowerSetting, + interpreter_builder: Callable = create_lower_trt_interpreter, + split_func: Callable = default_split_function, + ) -> "Lowerer": + """Instantiate a `Lowerer` instance.""" + + return cls( + lower_pass_manager_builder=LowerPassManagerBuilder( + lower_setting=lower_setting, + trace_func=lambda module, inputs: acc_tracer.trace( + module, + inputs, # type: ignore[arg-type] + ast_rewriter_allow_list=lower_setting.ast_rewriter_allow_list, + leaf_module_list=lower_setting.leaf_module_list, + ), + split_func=split_func, + lower_func=default_lower_pass(interpreter_builder), + ) + ) + + def __call__( + self, + module: nn.Module, + inputs: Input, + additional_inputs: Optional[Input] = None, + ) -> nn.Module: + lower_setting = self.lower_pass_manager_builder.lower_setting + atol = lower_setting.correctness_atol + rtol = lower_setting.correctness_rtol + + @validate_inference(atol=atol, rtol=rtol) + def do_lower(module: nn.Module, inputs: Input) -> nn.Module: + module.eval() + if ( + self.lower_pass_manager_builder.lower_setting.lower_precision + == LowerPrecision.FP16 + ): + module.half() + inputs = tuple( + x.half() if x is not None and x.dtype == torch.float32 else x + for x in inputs + ) + pm = self.lower_pass_manager_builder.build_trt_lower_pipeline( + inputs, additional_inputs + ) + lower_result = pm(module) + return lower_result + + return do_lower(module, inputs) +
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_modules/torch_tensorrt/fx/trt_module.html b/docs/v1.1.1/_modules/torch_tensorrt/fx/trt_module.html new file mode 100644 index 0000000000..85aa779b8b --- /dev/null +++ b/docs/v1.1.1/_modules/torch_tensorrt/fx/trt_module.html @@ -0,0 +1,863 @@ + + + + + + + + + + + + torch_tensorrt.fx.trt_module — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt.fx.trt_module

+from typing import Any, List, Sequence
+
+# @manual=//deeplearning/trt/python:py_tensorrt
+import tensorrt as trt
+import torch
+
+from .utils import torch_dtype_from_trt
+
+
+
[docs]class TRTModule(torch.nn.Module): + def __init__( + self, engine=None, input_names=None, output_names=None, cuda_graph_batch_size=-1 + ): + super(TRTModule, self).__init__() + self._register_state_dict_hook(TRTModule._on_state_dict) + self.engine = engine + self.input_names = input_names + self.output_names = output_names + self.cuda_graph_batch_size = cuda_graph_batch_size + self.initialized = False + + if engine: + self._initialize() + + def _initialize(self): + self.initialized = True + self.context = self.engine.create_execution_context() + + # Indices of inputs/outputs in the trt engine bindings, in the order + # as they are in the original PyTorch model. + self.input_binding_indices_in_order: Sequence[int] = [ + self.engine.get_binding_index(name) for name in self.input_names + ] + self.output_binding_indices_in_order: Sequence[int] = [ + self.engine.get_binding_index(name) for name in self.output_names + ] + primary_input_outputs = set() + primary_input_outputs.update(self.input_binding_indices_in_order) + primary_input_outputs.update(self.output_binding_indices_in_order) + self.hidden_output_binding_indices_in_order: Sequence[int] = [] + self.hidden_output_names: Sequence[str] = [] + for i in range( + self.engine.num_bindings // self.engine.num_optimization_profiles + ): + if i not in primary_input_outputs: + self.hidden_output_binding_indices_in_order.append(i) + self.hidden_output_names.append(self.engine.get_binding_name(i)) + + assert (self.engine.num_bindings // self.engine.num_optimization_profiles) == ( + len(self.input_names) + + len(self.output_names) + + len(self.hidden_output_names) + ) + + self.input_dtypes: Sequence[torch.dtype] = [ + torch_dtype_from_trt(self.engine.get_binding_dtype(idx)) + for idx in self.input_binding_indices_in_order + ] + self.input_shapes: Sequence[Sequence[int]] = [ + tuple(self.engine.get_binding_shape(idx)) + for idx in self.input_binding_indices_in_order + ] + self.output_dtypes: Sequence[torch.dtype] = [ + torch_dtype_from_trt(self.engine.get_binding_dtype(idx)) + for idx in self.output_binding_indices_in_order + ] + self.output_shapes = [ + tuple(self.engine.get_binding_shape(idx)) + if self.engine.has_implicit_batch_dimension + else tuple() + for idx in self.output_binding_indices_in_order + ] + self.hidden_output_dtypes: Sequence[torch.dtype] = [ + torch_dtype_from_trt(self.engine.get_binding_dtype(idx)) + for idx in self.hidden_output_binding_indices_in_order + ] + self.hidden_output_shapes = [ + tuple(self.engine.get_binding_shape(idx)) + if self.engine.has_implicit_batch_dimension + else tuple() + for idx in self.hidden_output_binding_indices_in_order + ] + + def _check_initialized(self): + if not self.initialized: + raise RuntimeError("TRTModule is not initialized.") + + def _on_state_dict(self, state_dict, prefix, local_metadata): + self._check_initialized() + state_dict[prefix + "engine"] = bytearray(self.engine.serialize()) + state_dict[prefix + "input_names"] = self.input_names + state_dict[prefix + "output_names"] = self.output_names + state_dict[prefix + "cuda_graph_batch_size"] = self.cuda_graph_batch_size + + def _load_from_state_dict( + self, + state_dict, + prefix, + local_metadata, + strict, + missing_keys, + unexpected_keys, + error_msgs, + ): + engine_bytes = state_dict[prefix + "engine"] + + logger = trt.Logger() + runtime = trt.Runtime(logger) + self.engine = runtime.deserialize_cuda_engine(engine_bytes) + + self.input_names = state_dict[prefix + "input_names"] + self.output_names = state_dict[prefix + "output_names"] + self._initialize() + + def __getstate__(self): + state = self.__dict__.copy() + state["engine"] = bytearray(self.engine.serialize()) + state.pop("context", None) + return state + + def __setstate__(self, state): + logger = trt.Logger() + runtime = trt.Runtime(logger) + state["engine"] = runtime.deserialize_cuda_engine(state["engine"]) + self.__dict__.update(state) + if self.engine: + self.context = self.engine.create_execution_context() + + def forward(self, *inputs): + with torch.autograd.profiler.record_function("TRTModule:Forward"): + self._check_initialized() + + with torch.autograd.profiler.record_function("TRTModule:ProcessInputs"): + assert len(inputs) == len( + self.input_names + ), f"Wrong number of inputs, expect {len(self.input_names)} get {len(inputs)}." + + # This is only used when the trt engine is using implicit batch dim. + batch_size = inputs[0].shape[0] + contiguous_inputs: List[torch.Tensor] = [i.contiguous() for i in inputs] + bindings: List[Any] = [None] * ( + len(self.input_names) + + len(self.output_names) + + len(self.hidden_output_names) + ) + + for i, input_name in enumerate(self.input_names): + assert inputs[ + i + ].is_cuda, f"{i}th input({input_name}) is not on cuda device." + assert ( + inputs[i].dtype == self.input_dtypes[i] + ), f"Dtype mismatch for {i}th input({input_name}). Expect {self.input_dtypes[i]}, got {inputs[i].dtype}." + + idx = self.input_binding_indices_in_order[i] + bindings[idx] = contiguous_inputs[i].data_ptr() + + if not self.engine.has_implicit_batch_dimension: + self.context.set_binding_shape( + idx, tuple(contiguous_inputs[i].shape) + ) + else: + assert inputs[i].size()[1:] == self.input_shapes[i], ( + f"Shape mismatch for {i}th input({input_name}). " + f"Expect {self.input_shapes[i]}, got {inputs[i].size()[1:]}." + ) + + with torch.autograd.profiler.record_function("TRTModule:ProcessOutputs"): + # create output tensors + outputs: List[torch.Tensor] = [] + + for i, idx in enumerate(self.output_binding_indices_in_order): + if self.engine.has_implicit_batch_dimension: + shape = (batch_size,) + self.output_shapes[i] + else: + shape = tuple(self.context.get_binding_shape(idx)) + + output = torch.empty( # type: ignore[call-overload] + size=shape, + dtype=self.output_dtypes[i], + device=torch.cuda.current_device(), + ) + outputs.append(output) + bindings[idx] = output.data_ptr() + + for i, idx in enumerate(self.hidden_output_binding_indices_in_order): + if self.engine.has_implicit_batch_dimension: + shape = (batch_size,) + self.hidden_output_shapes[i] + else: + shape = tuple(self.context.get_binding_shape(idx)) + + output = torch.empty( # type: ignore[call-overload] + size=shape, + dtype=self.hidden_output_dtypes[i], + device=torch.cuda.current_device(), + ) + bindings[idx] = output.data_ptr() + + with torch.autograd.profiler.record_function("TRTModule:TensorRTRuntime"): + if self.engine.has_implicit_batch_dimension: + self.context.execute_async( + batch_size, bindings, torch.cuda.current_stream().cuda_stream + ) + else: + self.context.execute_async_v2( + bindings, torch.cuda.current_stream().cuda_stream + ) + + if len(outputs) == 1: + return outputs[0] + + return tuple(outputs) + + def enable_profiling(self, profiler: "trt.IProfiler" = None): + """ + Enable TensorRT profiling. After calling this function, TensorRT will report + time spent on each layer in stdout for each forward run. + """ + self._check_initialized() + + if not self.context.profiler: + self.context.profiler = trt.Profiler() if profiler is None else profiler + + def disable_profiling(self): + """ + Disable TensorRT profiling. + """ + self._check_initialized() + + torch.cuda.synchronize() + del self.context + self.context = self.engine.create_execution_context() + + def get_layer_info(self) -> str: + """ + Get layer info of the engine. Only support for TRT > 8.2. + """ + inspector = self.engine.create_engine_inspector() + return inspector.get_engine_information(trt.LayerInformationFormat.JSON)
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_modules/torch_tensorrt/logging.html b/docs/v1.1.1/_modules/torch_tensorrt/logging.html new file mode 100644 index 0000000000..2a57541a83 --- /dev/null +++ b/docs/v1.1.1/_modules/torch_tensorrt/logging.html @@ -0,0 +1,838 @@ + + + + + + + + + + + + torch_tensorrt.logging — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt.logging

+from enum import Enum
+from torch_tensorrt._C import (
+    _get_logging_prefix,
+    _set_logging_prefix,
+    _get_reportable_log_level,
+    _set_reportable_log_level,
+    _get_is_colored_output_on,
+    _set_is_colored_output_on,
+    _log,
+    LogLevel,
+)
+
+
+
[docs]class Level(Enum): + """Enum to set the minimum required logging level to print a message to stdout""" + + InternalError = LogLevel.INTERNAL_ERROR + Error = LogLevel.ERROR + Warning = LogLevel.WARNING + Info = LogLevel.INFO + Debug = LogLevel.DEBUG + Graph = LogLevel.GRAPH + + @staticmethod + def _to_internal_level(external) -> LogLevel: + if external == Level.InternalError: + return LogLevel.INTERNAL_ERROR + if external == Level.Error: + return LogLevel.ERROR + if external == Level.Warning: + return LogLevel.WARNING + if external == Level.Info: + return LogLevel.INFO + if external == Level.Debug: + return LogLevel.DEBUG + if external == Level.Graph: + return LogLevel.GRAPH
+ + +
[docs]def get_logging_prefix() -> str: + """Get the prefix set for logging messages + + Returns: + str: Prefix used for logger + """ + return _get_logging_prefix()
+ + +
[docs]def set_logging_prefix(prefix: str): + """Set the prefix used when logging messages + + Args: + prefix (str): Prefix to use for logging messages + """ + _set_logging_prefix(prefix)
+ + +
[docs]def get_reportable_log_level() -> Level: + """Get the level required for a message to be printed in the log + + Returns: + torch_tensorrt.logging.Level: The enum representing the level required to print + """ + return Level(_get_reportable_log_level())
+ + +
[docs]def set_reportable_log_level(level: Level): + """Set the level required for a message to be printed to the log + + Args: + level (torch_tensorrt.logging.Level): The enum representing the level required to print + """ + _set_reportable_log_level(Level._to_internal_level(level))
+ + +
[docs]def get_is_colored_output_on() -> bool: + """Get if colored output is enabled for logging + + Returns: + bool: If colored output is one + """ + return _get_is_colored_output_on()
+ + +
[docs]def set_is_colored_output_on(colored_output_on: bool): + """Enable or disable color in the log output + + Args: + colored_output_on (bool): If colored output should be enabled or not + """ + _set_is_colored_output_on(colored_output_on)
+ + +
[docs]def log(level: Level, msg: str): + """Add a new message to the log + + Adds a new message to the log at a specified level. The message + will only get printed out if Level > reportable_log_level + + Args: + level (torch_tensorrt.logging.Level): Severity of the message + msg (str): Actual message text + """ + _log(Level._to_internal_level(level), msg) + + InternalError = LogLevel.INTERNAL_ERROR + Error = LogLevel.ERROR + Warning = LogLevel.WARNING + Info = LogLevel.INFO + Debug = LogLevel.DEBUG + Graph = LogLevel.GRAPH
+ + +
[docs]class internal_errors: + """Context-manager to limit displayed log messages to just internal errors + + Example:: + + with torch_tensorrt.logging.internal_errors(): + outputs = model_torchtrt(inputs) + """ + + def __enter__(self): + self.external_lvl = get_reportable_log_level() + set_reportable_log_level(Level.InternalError) + + def __exit__(self, exc_type, exc_value, exc_tb): + set_reportable_log_level(self.external_lvl)
+ + +
[docs]class errors: + """Context-manager to limit displayed log messages to just errors and above + + Example:: + + with torch_tensorrt.logging.errors(): + outputs = model_torchtrt(inputs) + """ + + def __enter__(self): + self.external_lvl = get_reportable_log_level() + set_reportable_log_level(Level.Error) + + def __exit__(self, exc_type, exc_value, exc_tb): + set_reportable_log_level(self.external_lvl)
+ + +
[docs]class warnings: + """Context-manager to limit displayed log messages to just warnings and above + + Example:: + + with torch_tensorrt.logging.warnings(): + model_trt = torch_tensorrt.compile(model, **spec) + """ + + def __enter__(self): + self.external_lvl = get_reportable_log_level() + set_reportable_log_level(Level.Warning) + + def __exit__(self, exc_type, exc_value, exc_tb): + set_reportable_log_level(self.external_lvl)
+ + +
[docs]class info: + """Context-manager to display all info and greater severity messages + + Example:: + + with torch_tensorrt.logging.info(): + model_trt = torch_tensorrt.compile(model, **spec) + """ + + def __enter__(self): + self.external_lvl = get_reportable_log_level() + set_reportable_log_level(Level.Info) + + def __exit__(self, exc_type, exc_value, exc_tb): + set_reportable_log_level(self.external_lvl)
+ + +
[docs]class debug: + """Context-manager to display full debug information through the logger + + Example:: + + with torch_tensorrt.logging.debug(): + model_trt = torch_tensorrt.compile(model, **spec) + """ + + def __enter__(self): + self.external_lvl = get_reportable_log_level() + set_reportable_log_level(Level.Debug) + + def __exit__(self, exc_type, exc_value, exc_tb): + set_reportable_log_level(self.external_lvl)
+ + +
[docs]class graphs: + """Context-manager to display the results of intermediate lowering passes + as well as full debug information through the logger + + Example:: + + with torch_tensorrt.logging.graphs(): + model_trt = torch_tensorrt.compile(model, **spec) + """ + + def __enter__(self): + self.external_lvl = get_reportable_log_level() + set_reportable_log_level(Level.Graph) + + def __exit__(self, exc_type, exc_value, exc_tb): + set_reportable_log_level(self.external_lvl)
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_modules/torch_tensorrt/ptq.html b/docs/v1.1.1/_modules/torch_tensorrt/ptq.html new file mode 100644 index 0000000000..95739dd63b --- /dev/null +++ b/docs/v1.1.1/_modules/torch_tensorrt/ptq.html @@ -0,0 +1,820 @@ + + + + + + + + + + + + torch_tensorrt.ptq — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt.ptq

+from typing import List, Dict, Any
+import torch
+import os
+
+from torch_tensorrt import _C
+from torch_tensorrt._version import __version__
+from torch_tensorrt.logging import *
+from types import FunctionType
+from enum import Enum
+
+
+
[docs]class CalibrationAlgo(Enum): + ENTROPY_CALIBRATION = _C.CalibrationAlgo.ENTROPY_CALIBRATION + ENTROPY_CALIBRATION_2 = _C.CalibrationAlgo.ENTROPY_CALIBRATION_2 + LEGACY_CALIBRATION = _C.CalibrationAlgo.LEGACY_CALIBRATION + MINMAX_CALIBRATION = _C.CalibrationAlgo.MINMAX_CALIBRATION
+ + +
[docs]def get_cache_mode_batch(self): + return None
+ + +
[docs]def get_batch_size(self): + return 1
+ + +
[docs]def get_batch(self, names): + if self.current_batch_idx + self.batch_size > len(self.data_loader.dataset): + return None + + batch = self.dataset_iterator.next() + self.current_batch_idx += self.batch_size + inputs_gpu = [] + if isinstance(batch, list): + for example in batch: + inputs_gpu.append(example.to(self.device).data_ptr()) + else: + inputs_gpu.append(batch.to(self.device).data_ptr()) + return inputs_gpu
+ + +
[docs]def read_calibration_cache(self): + if self.cache_file and self.use_cache: + if os.path.exists(self.cache_file): + with open(self.cache_file, "rb") as f: + return f.read() + else: + return b""
+ + +
[docs]def write_calibration_cache(self, cache): + if self.cache_file: + with open(self.cache_file, "wb") as f: + f.write(cache) + else: + return b""
+ + +
[docs]class DataLoaderCalibrator(object): + """ + Constructs a calibrator class in TensorRT and uses pytorch dataloader to load/preproces + data which is passed during calibration. + Args: + dataloader: an instance of pytorch dataloader which iterates through a given dataset. + algo_type: choice of calibration algorithm. + cache_file: path to cache file. + use_cache: flag which enables usage of pre-existing cache. + device: device on which calibration data is copied to. + """ + +
[docs] def __init__(self, **kwargs): + pass
+ + def __new__(cls, *args, **kwargs): + dataloader = args[0] + algo_type = kwargs.get("algo_type", CalibrationAlgo.ENTROPY_CALIBRATION_2) + cache_file = kwargs.get("cache_file", None) + use_cache = kwargs.get("use_cache", False) + device = kwargs.get("device", torch.device("cuda:0")) + + if not isinstance(dataloader, torch.utils.data.DataLoader): + log( + Level.Error, + "Dataloader : {} is not a valid instance of torch.utils.data.DataLoader".format( + dataloader + ), + ) + + if not cache_file: + if use_cache: + log( + Level.Debug, + "Using existing cache_file {} for calibration".format(cache_file), + ) + else: + log(Level.Debug, "Overwriting existing calibration cache file.") + else: + if use_cache: + log( + Level.Error, + "Input cache file is None but use_cache is set to True in INT8 mode.", + ) + + # Define attributes and member functions for the calibrator class + attribute_mapping = { + "data_loader": dataloader, + "current_batch_idx": 0, + "batch_size": dataloader.batch_size, + "dataset_iterator": iter(dataloader), + "cache_file": cache_file, + "device": device, + "use_cache": use_cache, + "get_batch_size": get_batch_size, + "get_batch": get_cache_mode_batch if use_cache else get_batch, + "read_calibration_cache": read_calibration_cache, + "write_calibration_cache": write_calibration_cache, + } + + # Using type metaclass to construct calibrator class based on algorithm type + if algo_type == CalibrationAlgo.ENTROPY_CALIBRATION: + return type( + "DataLoaderCalibrator", (_C.IInt8EntropyCalibrator,), attribute_mapping + )() + elif algo_type == CalibrationAlgo.ENTROPY_CALIBRATION_2: + return type( + "DataLoaderCalibrator", (_C.IInt8MinMaxCalibrator,), attribute_mapping + )() + elif algo_type == CalibrationAlgo.LEGACY_CALIBRATION: + return type( + "DataLoaderCalibrator", (_C.IInt8LegacyCalibrator,), attribute_mapping + )() + elif algo_type == CalibrationAlgo.MINMAX_CALIBRATION: + return type( + "DataLoaderCalibrator", (_C.IInt8MinMaxCalibrator,), attribute_mapping + )() + else: + log( + Level.Error, + "Invalid calibration algorithm type. Please select among ENTROPY_CALIBRATION, ENTROPY_CALIBRATION, LEGACY_CALIBRATION or MINMAX_CALIBRATION", + )
+ + +
[docs]class CacheCalibrator(object): + """ + Constructs a calibrator class in TensorRT which directly uses pre-existing cache file for calibration. + Args: + cache_file: path to cache file. + algo_type: choice of calibration algorithm. + """ + +
[docs] def __init__(self, **kwargs): + pass
+ + def __new__(cls, *args, **kwargs): + cache_file = args[0] + algo_type = kwargs.get("algo_type", CalibrationAlgo.ENTROPY_CALIBRATION_2) + + if os.path.isfile(cache_file): + log( + Level.Debug, + "Using existing cache_file {} for calibration".format(cache_file), + ) + else: + log(Level.Error, "Invalid calibration cache file.") + + # Define attributes and member functions for the calibrator class + attribute_mapping = { + "use_cache": True, + "cache_file": cache_file, + "get_batch_size": get_batch_size, + "get_batch": get_cache_mode_batch, + "read_calibration_cache": read_calibration_cache, + "write_calibration_cache": write_calibration_cache, + } + # Using type metaclass to construct calibrator class based on algorithm type + if algo_type == CalibrationAlgo.ENTROPY_CALIBRATION: + return type( + "DataLoaderCalibrator", (_C.IInt8EntropyCalibrator,), attribute_mapping + )() + elif algo_type == CalibrationAlgo.ENTROPY_CALIBRATION_2: + return type( + "DataLoaderCalibrator", (_C.IInt8MinMaxCalibrator,), attribute_mapping + )() + elif algo_type == CalibrationAlgo.LEGACY_CALIBRATION: + return type( + "DataLoaderCalibrator", (_C.IInt8LegacyCalibrator,), attribute_mapping + )() + elif algo_type == CalibrationAlgo.MINMAX_CALIBRATION: + return type( + "DataLoaderCalibrator", (_C.IInt8MinMaxCalibrator,), attribute_mapping + )() + else: + log( + Level.Error, + "Invalid calibration algorithm type. Please select among ENTROPY_CALIBRATION, ENTROPY_CALIBRATION, LEGACY_CALIBRATION or MINMAX_CALIBRATION", + )
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_modules/torch_tensorrt/ts/_compile_spec.html b/docs/v1.1.1/_modules/torch_tensorrt/ts/_compile_spec.html new file mode 100644 index 0000000000..750dd45a6f --- /dev/null +++ b/docs/v1.1.1/_modules/torch_tensorrt/ts/_compile_spec.html @@ -0,0 +1,1112 @@ + + + + + + + + + + + + torch_tensorrt.ts._compile_spec — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt.ts._compile_spec

+from typing import List, Dict, Any, Set
+import torch
+from torch_tensorrt import _C
+import torch_tensorrt._C.ts as _ts_C
+from torch_tensorrt import _enums
+from torch_tensorrt._Input import Input
+from torch_tensorrt._Device import Device
+from torch_tensorrt.logging import Level, log
+from typing import Tuple, List, Dict
+import warnings
+from copy import deepcopy
+
+
+def _internal_input_to_torch_class_input(i: _C.Input) -> torch.classes.tensorrt._Input:
+    clone = torch.classes.tensorrt._Input()
+    clone._set_min(i.min)
+    clone._set_opt(i.opt)
+    clone._set_max(i.max)
+    clone._set_dtype(i.dtype)
+    clone._set_format(i.format)
+    clone._set_input_is_dynamic(i.input_is_dynamic)
+    clone._set_explicit_set_dtype(i._explicit_set_dtype)
+    return clone
+
+
+def _supported_input_size_type(input_size: Any) -> bool:
+    if isinstance(input_size, torch.Size):
+        return True
+    elif isinstance(input_size, tuple):
+        return True
+    elif isinstance(input_size, list):
+        return True
+    else:
+        raise TypeError(
+            "Input sizes for inputs are required to be a List, tuple or torch.Size or a Dict of three sizes (min, opt, max), found type: "
+            + str(type(input_size))
+        )
+
+
+def _parse_input_ranges(input_sizes: List) -> List:
+
+    if any(
+        not isinstance(i, dict) and not _supported_input_size_type(i)
+        for i in input_sizes
+    ):
+        raise KeyError(
+            "An input size must either be a static size or a range of three sizes (min, opt, max) as Dict"
+        )
+
+    parsed_input_sizes = []
+    for i in input_sizes:
+        if isinstance(i, dict):
+            if all(k in i for k in ["min", "opt", "min"]):
+                parsed_input_sizes.append(
+                    Input(
+                        min_shape=i["min"], opt_shape=i["opt"], max_shape=i["max"]
+                    )._to_internal()
+                )
+
+            elif "opt" in i:
+                parsed_input_sizes.append(Input(shape=i["opt"])._to_internal())
+
+            else:
+                raise KeyError(
+                    "An input size must either be a static size or a range of three sizes (min, opt, max) as Dict"
+                )
+
+        elif isinstance(i, list):
+            parsed_input_sizes.append(Input(shape=i)._to_internal())
+
+        elif isinstance(i, tuple):
+            parsed_input_sizes.append(Input(shape=i)._to_internal())
+
+        elif isinstance(i, torch.Size):
+            parsed_input_sizes.append(Input(shape=i)._to_internal())
+
+    return parsed_input_sizes
+
+
+def _parse_op_precision(precision: Any) -> _enums.dtype:
+    if isinstance(precision, torch.dtype):
+        if precision == torch.int8:
+            return _enums.dtype.int8
+        elif precision == torch.half:
+            return _enums.dtype.half
+        elif precision == torch.float:
+            return _enums.dtype.float
+        else:
+            raise TypeError(
+                "Provided an unsupported dtype as operating precision (support: int8, half, float), got: "
+                + str(precision)
+            )
+
+    elif isinstance(precision, _enums.dtype):
+        return precision
+
+    else:
+        raise TypeError(
+            "Op precision type needs to be specified with a torch.dtype or a torch_tensorrt.dtype, got: "
+            + str(type(precision))
+        )
+
+
+def _parse_enabled_precisions(precisions: Any) -> Set:
+    parsed_precisions = set()
+    if any([isinstance(precisions, type) for type in [list, tuple, set]]):
+        for p in precisions:
+            parsed_precisions.add(_parse_op_precision(p))
+    else:
+        parsed_precisions.add(_parse_op_precision(precisions))
+    return parsed_precisions
+
+
+def _parse_device_type(device: Any) -> _enums.DeviceType:
+    if isinstance(device, torch.device):
+        if device.type == "cuda":
+            return _enums.DeviceType.gpu
+        else:
+            ValueError(
+                "Got a device type other than GPU or DLA (type: "
+                + str(device.type)
+                + ")"
+            )
+    elif isinstance(device, _enums.DeviceType):
+        return device
+    elif isinstance(device, str):
+        if device == "gpu" or device == "GPU":
+            return _enums.DeviceType.gpu
+        elif device == "dla" or device == "DLA":
+            return _enums.DeviceType.dla
+        else:
+            ValueError(
+                "Got a device type other than GPU or DLA (type: " + str(device) + ")"
+            )
+    else:
+        raise TypeError(
+            "Device specification must be of type torch.device, string or torch_tensorrt.DeviceType, but got: "
+            + str(type(device))
+        )
+
+
+def _parse_device(device_info: Any) -> _C.Device:
+    if isinstance(device_info, dict):
+        info = _C.Device()
+        if "device_type" not in device_info:
+            raise KeyError("Device type is required parameter")
+        else:
+            assert isinstance(device_info["device_type"], _enums.DeviceType)
+            info.device_type = _parse_device_type(device_info["device_type"])
+
+        if "gpu_id" in device_info:
+            assert isinstance(device_info["gpu_id"], int)
+            info.gpu_id = device_info["gpu_id"]
+
+        if "dla_core" in device_info:
+            assert isinstance(device_info["dla_core"], int)
+            info.dla_core = device_info["dla_core"]
+
+        if "allow_gpu_fallback" in device_info:
+            assert isinstance(device_info["allow_gpu_fallback"], bool)
+            info.allow_gpu_fallback = device_info["allow_gpu_fallback"]
+
+        return info
+    elif isinstance(device_info, Device):
+        return device_info._to_internal()
+    elif isinstance(device_info, torch.device):
+        return (Device._from_torch_device(device_info))._to_internal()
+    else:
+        raise ValueError(
+            "Unsupported data for device specification. Expected either a dict, torch_tensorrt.Device or torch.Device"
+        )
+
+
+def _parse_torch_fallback(fallback_info: Dict[str, Any]) -> _ts_C.TorchFallback:
+    info = _ts_C.TorchFallback()
+    if "enabled" not in fallback_info:
+        raise KeyError("Enabled is required parameter")
+    else:
+        assert isinstance(fallback_info["enabled"], bool)
+        info.enabled = fallback_info["enabled"]
+    if "min_block_size" in fallback_info:
+        assert isinstance(fallback_info["min_block_size"], int)
+        info.min_block_size = fallback_info["min_block_size"]
+
+    if "forced_fallback_ops" in fallback_info:
+        assert isinstance(fallback_info["forced_fallback_ops"], list)
+        info.forced_fallback_operators = fallback_info["forced_fallback_ops"]
+
+    if "forced_fallback_modules" in fallback_info:
+        assert isinstance(fallback_info["forced_fallback_modules"], list)
+        info.forced_fallback_modules = fallback_info["forced_fallback_modules"]
+
+    return info
+
+
+def _parse_input_signature(input_signature: Any):
+    if isinstance(input_signature, tuple):
+        input_list = []
+        for item in input_signature:
+            input = _parse_input_signature(item)
+            input_list.append(input)
+        return tuple(input_list)
+    elif isinstance(input_signature, list):
+        input_list = []
+        for item in input_signature:
+            input = _parse_input_signature(item)
+            input_list.append(input)
+        return input_list
+    elif isinstance(input_signature, Input) or isinstance(
+        input_signature, torch.Tensor
+    ):
+        i = (
+            Input._from_tensor(input_signature)
+            if isinstance(input_signature, torch.Tensor)
+            else input_signature
+        )
+        clone = _internal_input_to_torch_class_input(i._to_internal())
+        return clone
+    else:
+        raise KeyError(
+            "Input signature contains an unsupported type {}".format(
+                type(input_signature)
+            )
+        )
+
+
+def _parse_compile_spec(compile_spec_: Dict[str, Any]) -> _ts_C.CompileSpec:
+    # TODO: Remove deep copy once collections does not need partial compilation
+    compile_spec = deepcopy(compile_spec_)
+    info = _ts_C.CompileSpec()
+
+    if len(compile_spec["inputs"]) > 0:
+        if not all(
+            [
+                isinstance(i, torch.Tensor) or isinstance(i, Input)
+                for i in compile_spec["inputs"]
+            ]
+        ):
+            raise KeyError(
+                "Input specs should be either torch_tensorrt.Input or torch.Tensor, found types: {}".format(
+                    [type(i) for i in compile_spec["inputs"]]
+                )
+            )
+
+        inputs = [
+            Input._from_tensor(i) if isinstance(i, torch.Tensor) else i
+            for i in compile_spec["inputs"]
+        ]
+        info.inputs = [i._to_internal() for i in inputs]
+
+    elif compile_spec["input_signature"] is not None:
+        log(
+            Level.Warning,
+            "Input signature parsing is an experimental feature, behavior and APIs may change",
+        )
+        signature = _parse_input_signature(compile_spec["input_signature"])
+        info.input_signature = _C.InputSignature(signature)  # py_object
+
+        if not compile_spec["torch_fallback"]["enabled"]:
+            raise ValueError(
+                "Grouped inputs currently requires partial compilation to be enabled, this restriction will be relaxed in a future release"
+            )
+
+        log(
+            Level.Debug,
+            "Grouped inputs currently requires additional settings to enable the feature",
+        )
+        log(
+            Level.Debug,
+            """Adding the following ops to torch_executed_ops:
+    - aten::__getitem__
+    - prim::ListConstruct
+    - prim::ListUnpack
+    - prim::TupleIndex
+    - prim::TupleConstruct
+    - prim::TupleUnpack
+""",
+        )
+        compile_spec["torch_fallback"]["forced_fallback_ops"].append(
+            "aten::__getitem__"
+        )
+        compile_spec["torch_fallback"]["forced_fallback_ops"].append(
+            "prim::ListConstruct"
+        )
+        compile_spec["torch_fallback"]["forced_fallback_ops"].append("prim::ListUnpack")
+        compile_spec["torch_fallback"]["forced_fallback_ops"].append("prim::TupleIndex")
+        compile_spec["torch_fallback"]["forced_fallback_ops"].append(
+            "prim::TupleConstruct"
+        )
+        compile_spec["torch_fallback"]["forced_fallback_ops"].append(
+            "prim::TupleUnpack"
+        )
+
+    else:
+        raise KeyError(
+            'Module input definitions are requried to compile module. Provide a list of torch_tensorrt.Input keyed to "inputs" in the compile spec'
+        )
+
+    if "enabled_precisions" in compile_spec:
+        info.enabled_precisions = _parse_enabled_precisions(
+            compile_spec["enabled_precisions"]
+        )
+
+    if "calibrator" in compile_spec:
+        info.ptq_calibrator = compile_spec["calibrator"]
+
+    if "sparse_weights" in compile_spec:
+        assert isinstance(compile_spec["sparse_weights"], bool)
+        info.sparse_weights = compile_spec["sparse_weights"]
+
+    if "disable_tf32" in compile_spec:
+        assert isinstance(compile_spec["disable_tf32"], bool)
+        info.disable_tf32 = compile_spec["disable_tf32"]
+
+    if "refit" in compile_spec:
+        assert isinstance(compile_spec["refit"], bool)
+        info.refit = compile_spec["refit"]
+
+    if "debug" in compile_spec:
+        assert isinstance(compile_spec["debug"], bool)
+        info.debug = compile_spec["debug"]
+
+    if "device" in compile_spec:
+        info.device = _parse_device(compile_spec["device"])
+
+    if "capability" in compile_spec:
+        assert isinstance(compile_spec["capability"], _enums.EngineCapability)
+        info.capability = compile_spec["capability"]
+
+    if "num_avg_timing_iters" in compile_spec:
+        assert type(compile_spec["num_avg_timing_iters"]) is int
+        info.num_avg_timing_iters = compile_spec["num_avg_timing_iters"]
+
+    if "workspace_size" in compile_spec:
+        assert type(compile_spec["workspace_size"]) is int
+        info.workspace_size = compile_spec["workspace_size"]
+
+    if "dla_sram_size" in compile_spec:
+        assert type(compile_spec["dla_sram_size"]) is int
+        info.dla_sram_size = compile_spec["dla_sram_size"]
+
+    if "dla_local_dram_size" in compile_spec:
+        assert type(compile_spec["dla_local_dram_size"]) is int
+        info.dla_local_dram_size = compile_spec["dla_local_dram_size"]
+
+    if "dla_global_dram_size" in compile_spec:
+        assert type(compile_spec["dla_global_dram_size"]) is int
+        info.dla_global_dram_size = compile_spec["dla_global_dram_size"]
+
+    if "truncate_long_and_double" in compile_spec:
+        assert type(compile_spec["truncate_long_and_double"]) is bool
+        info.truncate_long_and_double = compile_spec["truncate_long_and_double"]
+
+    if "torch_fallback" in compile_spec:
+        info.torch_fallback = _parse_torch_fallback(compile_spec["torch_fallback"])
+
+    log(Level.Debug, str(info))
+
+    return info
+
+
+
[docs]def TensorRTCompileSpec( + inputs=[], + input_signature=None, + device=Device._current_device(), + disable_tf32=False, + sparse_weights=False, + enabled_precisions=set(), + refit=False, + debug=False, + capability=_enums.EngineCapability.default, + num_avg_timing_iters=1, + workspace_size=0, + dla_sram_size=1048576, + dla_local_dram_size=1073741824, + dla_global_dram_size=536870912, + truncate_long_and_double=False, + calibrator=None, +) -> torch.classes.tensorrt.CompileSpec: + """Utility to create a formated spec dictionary for using the PyTorch TensorRT backend + + Keyword Args: + inputs (List[Union(torch_tensorrt.Input, torch.Tensor)]): **Required** List of specifications of input shape, dtype and memory layout for inputs to the module. This argument is required. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using + torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum + to select device type. :: + + input=[ + torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1 + torch_tensorrt.Input( + min_shape=(1, 224, 224, 3), + opt_shape=(1, 512, 512, 3), + max_shape=(1, 1024, 1024, 3), + dtype=torch.int32 + format=torch.channel_last + ), # Dynamic input shape for input #2 + torch.randn((1, 3, 224, 244)) # Use an example tensor and let torch_tensorrt infer settings + ] + + device (Union(torch_tensorrt.Device, torch.device, dict)): Target device for TensorRT engines to run on :: + + device=torch_tensorrt.Device("dla:1", allow_gpu_fallback=True) + + disable_tf32 (bool): Force FP32 layers to use traditional as FP32 format vs the default behavior of rounding the inputs to 10-bit mantissas before multiplying, but accumulates the sum using 23-bit mantissas + sparse_weights (bool): Enable sparsity for convolution and fully connected layers. + enabled_precision (Set(Union(torch.dtype, torch_tensorrt.dtype))): The set of datatypes that TensorRT can use when selecting kernels + refit (bool): Enable refitting + debug (bool): Enable debuggable engine + capability (torch_tensorrt.EngineCapability): Restrict kernel selection to safe gpu kernels or safe dla kernels + num_avg_timing_iters (int): Number of averaging timing iterations used to select kernels + workspace_size (int): Maximum size of workspace given to TensorRT + truncate_long_and_double (bool): Truncate weights provided in int64 or double (float64) to int32 and float32 + calibrator (Union(torch_tensorrt._C.IInt8Calibrator, tensorrt.IInt8Calibrator)): Calibrator object which will provide data to the PTQ system for INT8 Calibration + + Returns: + torch.classes.tensorrt.CompileSpec: List of methods and formated spec objects to be provided to ``torch._C._jit_to_tensorrt`` + """ + + compile_spec = { + "inputs": inputs, + # "input_signature": input_signature, + "device": device, + "disable_tf32": disable_tf32, # Force FP32 layers to use traditional as FP32 format vs the default behavior of rounding the inputs to 10-bit mantissas before multiplying, but accumulates the sum using 23-bit mantissas + "sparse_weights": sparse_weights, # Enable sparsity for convolution and fully connected layers. + "enabled_precisions": enabled_precisions, # Enabling FP16 kernels + "refit": refit, # enable refit + "debug": debug, # enable debuggable engine + "capability": capability, # Restrict kernel selection to safe gpu kernels or safe dla kernels + "num_avg_timing_iters": num_avg_timing_iters, # Number of averaging timing iterations used to select kernels + "workspace_size": workspace_size, # Maximum size of workspace given to TensorRT + "dla_sram_size": dla_sram_size, # Fast software managed RAM used by DLA to communicate within a layer. + "dla_local_dram_size": dla_local_dram_size, # Host RAM used by DLA to share intermediate tensor data across operations + "dla_global_dram_size": dla_global_dram_size, # Host RAM used by DLA to store weights and metadata for execution + "calibrator": calibrator, + "truncate_long_and_double": truncate_long_and_double, + } + + parsed_spec = _parse_compile_spec(compile_spec) + + backend_spec = torch.classes.tensorrt.CompileSpec() + + if input_signature is not None: + raise ValueError( + "Input signature parsing is not currently supported in the TorchScript backend integration" + ) + + for i in parsed_spec.inputs: + clone = _internal_input_to_torch_class_input(i) + backend_spec._append_input(clone) + + d = torch.classes.tensorrt._Device() + d._set_device_type(int(parsed_spec.device.device_type)) + d._set_gpu_id(parsed_spec.device.gpu_id) + d._set_dla_core(parsed_spec.device.dla_core) + d._set_allow_gpu_fallback(parsed_spec.device.allow_gpu_fallback) + + if parsed_spec.torch_fallback.enabled: + raise RuntimeError( + "Partial module compilation is not currently supported via the PyTorch TensorRT backend. If you need partial compilation, use torch_tensorrt.compile" + ) + + torch_fallback = torch.classes.tensorrt._TorchFallback() + torch_fallback._set_enabled(parsed_spec.torch_fallback.enabled) + torch_fallback._set_min_block_size(parsed_spec.torch_fallback.min_block_size) + torch_fallback._set_forced_fallback_operators( + parsed_spec.torch_fallback.forced_fallback_operators + ) + torch_fallback._set_forced_fallback_modules( + parsed_spec.torch_fallback.forced_fallback_modules + ) + + backend_spec._set_device(d) + backend_spec._set_torch_fallback(torch_fallback) + backend_spec._set_precisions([int(i) for i in parsed_spec.enabled_precisions]) + + backend_spec._set_disable_tf32(parsed_spec.disable_tf32) + backend_spec._set_refit(parsed_spec.refit) + backend_spec._set_debug(parsed_spec.debug) + backend_spec._set_refit(parsed_spec.refit) + backend_spec._set_capability(int(parsed_spec.capability)) + backend_spec._set_num_avg_timing_iters(parsed_spec.num_avg_timing_iters) + backend_spec._set_workspace_size(parsed_spec.workspace_size) + backend_spec._set_dla_sram_size(parsed_spec.dla_sram_size) + backend_spec._set_dla_local_dram_size(parsed_spec.dla_local_dram_size) + backend_spec._set_dla_global_dram_size(parsed_spec.dla_global_dram_size) + backend_spec._set_truncate_long_and_double(parsed_spec.truncate_long_and_double) + backend_spec._set_ptq_calibrator(parsed_spec._get_calibrator_handle()) + + return backend_spec
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_modules/torch_tensorrt/ts/_compiler.html b/docs/v1.1.1/_modules/torch_tensorrt/ts/_compiler.html new file mode 100644 index 0000000000..acae45d8c7 --- /dev/null +++ b/docs/v1.1.1/_modules/torch_tensorrt/ts/_compiler.html @@ -0,0 +1,914 @@ + + + + + + + + + + + + torch_tensorrt.ts._compiler — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt.ts._compiler

+from typing import List, Dict, Any
+import torch
+from torch import nn
+
+import torch_tensorrt._C.ts as _C
+from torch_tensorrt import _enums
+from torch_tensorrt.ts._compile_spec import _parse_compile_spec, _parse_device
+from torch_tensorrt._Device import Device
+from types import FunctionType
+
+
+
[docs]def compile( + module: torch.jit.ScriptModule, + inputs=[], + input_signature=None, + device=Device._current_device(), + disable_tf32=False, + sparse_weights=False, + enabled_precisions=set(), + refit=False, + debug=False, + capability=_enums.EngineCapability.default, + num_avg_timing_iters=1, + workspace_size=0, + dla_sram_size=1048576, + dla_local_dram_size=1073741824, + dla_global_dram_size=536870912, + calibrator=None, + truncate_long_and_double=False, + require_full_compilation=False, + min_block_size=3, + torch_executed_ops=[], + torch_executed_modules=[], +) -> torch.jit.ScriptModule: + """Compile a TorchScript module for NVIDIA GPUs using TensorRT + + Takes a existing TorchScript module and a set of settings to configure the compiler + and will convert methods to JIT Graphs which call equivalent TensorRT engines + + Converts specifically the forward method of a TorchScript Module + + Arguments: + module (torch.jit.ScriptModule): Source module, a result of tracing or scripting a PyTorch + ``torch.nn.Module`` + + Keyword Arguments: + inputs (List[Union(torch_tensorrt.Input, torch.Tensor)]): **Required** List of specifications of input shape, dtype and memory layout for inputs to the module. This argument is required. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using + torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum + to select device type. :: + + input=[ + torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1 + torch_tensorrt.Input( + min_shape=(1, 224, 224, 3), + opt_shape=(1, 512, 512, 3), + max_shape=(1, 1024, 1024, 3), + dtype=torch.int32 + format=torch.channel_last + ), # Dynamic input shape for input #2 + torch.randn((1, 3, 224, 244)) # Use an example tensor and let torch_tensorrt infer settings + ] + + input_signature Union(List, Tuple, torch_tensorrt.Input, torch.Tensor): A formatted collection of input specifications for the module. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using + torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum to select device type. **This API should be considered beta-level stable and may change in the future** :: + + input_signature=([ + torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1 + torch_tensorrt.Input( + min_shape=(1, 224, 224, 3), + opt_shape=(1, 512, 512, 3), + max_shape=(1, 1024, 1024, 3), + dtype=torch.int32 + format=torch.channel_last + ), # Dynamic input shape for input #2 + ], torch.randn((1, 3, 224, 244))) # Use an example tensor and let torch_tensorrt infer settings for input #3 + device (Union(torch_tensorrt.Device, torch.device, dict)): Target device for TensorRT engines to run on :: + + device=torch_tensorrt.Device("dla:1", allow_gpu_fallback=True) + + disable_tf32 (bool): Force FP32 layers to use traditional as FP32 format vs the default behavior of rounding the inputs to 10-bit mantissas before multiplying, but accumulates the sum using 23-bit mantissas + sparse_weights (bool): Enable sparsity for convolution and fully connected layers. + enabled_precision (Set(Union(torch.dtype, torch_tensorrt.dtype))): The set of datatypes that TensorRT can use when selecting kernels + refit (bool): Enable refitting + debug (bool): Enable debuggable engine + capability (torch_tensorrt.EngineCapability): Restrict kernel selection to safe gpu kernels or safe dla kernels + num_avg_timing_iters (int): Number of averaging timing iterations used to select kernels + workspace_size (int): Maximum size of workspace given to TensorRT + dla_sram_size (int): Fast software managed RAM used by DLA to communicate within a layer. + dla_local_dram_size (int): Host RAM used by DLA to share intermediate tensor data across operations + dla_global_dram_size (int): Host RAM used by DLA to store weights and metadata for execution + truncate_long_and_double (bool): Truncate weights provided in int64 or double (float64) to int32 and float32 + calibrator (Union(torch_tensorrt._C.IInt8Calibrator, tensorrt.IInt8Calibrator)): Calibrator object which will provide data to the PTQ system for INT8 Calibration + require_full_compilation (bool): Require modules to be compiled end to end or return an error as opposed to returning a hybrid graph where operations that cannot be run in TensorRT are run in PyTorch + min_block_size (int): The minimum number of contiguous TensorRT convertable operations in order to run a set of operations in TensorRT + torch_executed_ops (List[str]): List of aten operators that must be run in PyTorch. An error will be thrown if this list is not empty but ``require_full_compilation`` is True + torch_executed_modules (List[str]): List of modules that must be run in PyTorch. An error will be thrown if this list is not empty but ``require_full_compilation`` is True + + Returns: + torch.jit.ScriptModule: Compiled TorchScript Module, when run it will execute via TensorRT + """ + + if isinstance(module, torch.jit.ScriptFunction): + raise TypeError( + "torch.jit.ScriptFunction currently is not directly supported, wrap the function in a module to compile" + ) + + if require_full_compilation and ( + len(torch_executed_modules) > 0 or len(torch_executed_ops) > 0 + ): + raise ValueError( + f"require_full_compilation is enabled however the list of modules and ops to run in torch is not empty. Found: torch_executed_ops: {torch_executed_ops}, torch_executed_modules: {torch_executed_modules}" + ) + + spec = { + "inputs": inputs, + "input_signature": input_signature, + "device": device, + "disable_tf32": disable_tf32, # Force FP32 layers to use traditional as FP32 format + "sparse_weights": sparse_weights, # Enable sparsity for convolution and fully connected layers. + "enabled_precisions": enabled_precisions, # Enabling FP16 kernels + "refit": refit, # enable refit + "debug": debug, # enable debuggable engine + "capability": capability, # Restrict kernel selection to safe gpu kernels or safe dla kernels + "num_avg_timing_iters": num_avg_timing_iters, # Number of averaging timing iterations used to select kernels + "workspace_size": workspace_size, # Maximum size of workspace given to TensorRT + "calibrator": calibrator, + "truncate_long_and_double": truncate_long_and_double, + "torch_fallback": { + "enabled": not require_full_compilation, + "forced_fallback_ops": torch_executed_ops, + "forced_fallback_modules": torch_executed_modules, + "min_block_size": min_block_size, + }, + } + + compiled_cpp_mod = _C.compile_graph(module._c, _parse_compile_spec(spec)) + compiled_module = torch.jit._recursive.wrap_cpp_module(compiled_cpp_mod) + return compiled_module
+ + +
[docs]def convert_method_to_trt_engine( + module: torch.jit.ScriptModule, + method_name: str, + inputs=[], + device=Device._current_device(), + disable_tf32=False, + sparse_weights=False, + enabled_precisions=set(), + refit=False, + debug=False, + capability=_enums.EngineCapability.default, + num_avg_timing_iters=1, + workspace_size=0, + dla_sram_size=1048576, + dla_local_dram_size=1073741824, + dla_global_dram_size=536870912, + truncate_long_and_double=False, + calibrator=None, +) -> str: + """Convert a TorchScript module method to a serialized TensorRT engine + + Converts a specified method of a module to a serialized TensorRT engine given a dictionary of conversion settings + + Arguments: + module (torch.jit.ScriptModule): Source module, a result of tracing or scripting a PyTorch + ``torch.nn.Module`` + method_name (str): Name of method to convert + + Keyword Args: + inputs (List[Union(torch_tensorrt.Input, torch.Tensor)]): **Required** List of specifications of input shape, dtype and memory layout for inputs to the module. This argument is required. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using + torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum + to select device type. :: + + input=[ + torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1 + torch_tensorrt.Input( + min_shape=(1, 224, 224, 3), + opt_shape=(1, 512, 512, 3), + max_shape=(1, 1024, 1024, 3), + dtype=torch.int32 + format=torch.channel_last + ), # Dynamic input shape for input #2 + torch.randn((1, 3, 224, 244)) # Use an example tensor and let torch_tensorrt infer settings + ] + + input_signature Union(List, Tuple, torch_tensorrt.Input, torch.Tensor): A formatted collection of input specifications for the module. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using + torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum to select device type. **This API should be considered beta-level stable and may change in the future** :: + + input_signature=([ + torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1 + torch_tensorrt.Input( + min_shape=(1, 224, 224, 3), + opt_shape=(1, 512, 512, 3), + max_shape=(1, 1024, 1024, 3), + dtype=torch.int32 + format=torch.channel_last + ), # Dynamic input shape for input #2 + ], torch.randn((1, 3, 224, 244))) # Use an example tensor and let torch_tensorrt infer settings for input #3 + + device (Union(torch_tensorrt.Device, torch.device, dict)): Target device for TensorRT engines to run on :: + + device=torch_tensorrt.Device("dla:1", allow_gpu_fallback=True) + + disable_tf32 (bool): Force FP32 layers to use traditional as FP32 format vs the default behavior of rounding the inputs to 10-bit mantissas before multiplying, but accumulates the sum using 23-bit mantissas + sparse_weights (bool): Enable sparsity for convolution and fully connected layers. + enabled_precision (Set(Union(torch.dtype, torch_tensorrt.dtype))): The set of datatypes that TensorRT can use when selecting kernels + refit (bool): Enable refitting + debug (bool): Enable debuggable engine + capability (torch_tensorrt.EngineCapability): Restrict kernel selection to safe gpu kernels or safe dla kernels + num_avg_timing_iters (int): Number of averaging timing iterations used to select kernels + workspace_size (int): Maximum size of workspace given to TensorRT + dla_sram_size (int): Fast software managed RAM used by DLA to communicate within a layer. + dla_local_dram_size (int): Host RAM used by DLA to share intermediate tensor data across operations + dla_global_dram_size (int): Host RAM used by DLA to store weights and metadata for execution + truncate_long_and_double (bool): Truncate weights provided in int64 or double (float64) to int32 and float32 + calibrator (Union(torch_tensorrt._C.IInt8Calibrator, tensorrt.IInt8Calibrator)): Calibrator object which will provide data to the PTQ system for INT8 Calibration + + Returns: + bytes: Serialized TensorRT engine, can either be saved to a file or deserialized via TensorRT APIs + """ + if isinstance(module, torch.jit.ScriptFunction): + raise TypeError( + "torch.jit.ScriptFunctions currently are not directly supported, wrap the function in a module to compile" + ) + + compile_spec = { + "inputs": inputs, + "device": device, + "disable_tf32": disable_tf32, # Force FP32 layers to use traditional as FP32 format vs the default behavior of rounding the inputs to 10-bit mantissas before multiplying, but accumulates the sum using 23-bit mantissas + "sparse_weights": sparse_weights, # Enable sparsity for convolution and fully connected layers. + "enabled_precisions": enabled_precisions, # Enabling FP16 kernels + "refit": refit, # enable refit + "debug": debug, # enable debuggable engine + "capability": capability, # Restrict kernel selection to safe gpu kernels or safe dla kernels + "num_avg_timing_iters": num_avg_timing_iters, # Number of averaging timing iterations used to select kernels + "workspace_size": workspace_size, # Maximum size of workspace given to TensorRT + "calibrator": calibrator, + "truncate_long_and_double": truncate_long_and_double, + } + + return _C.convert_graph_to_trt_engine( + module._c, method_name, _parse_compile_spec(compile_spec) + )
+ + +
[docs]def embed_engine_in_new_module( + serialized_engine: bytes, device=Device._current_device() +) -> torch.jit.ScriptModule: + """Takes a pre-built serialized TensorRT engine and embeds it within a TorchScript module + + Takes a pre-built serialied TensorRT engine (as bytes) and embeds it within a TorchScript module. + Registers the forward method to execute the TensorRT engine with the function signature: + + forward(Tensor[]) -> Tensor[] + + TensorRT bindings must have names with the following format: + - [symbol].[index in input / output array] + ex. + - [x.0, x.1, x.2] -> [y.0] + + Module can be save with engine embedded with torch.jit.save and moved / loaded according to torch_tensorrt portability rules + + Arguments: + serialized_engine (bytes): Serialized TensorRT engine from either torch_tensorrt or TensorRT APIs + + Keyword Arguments: + device (Union(torch_tensorrt.Device, torch.device, dict)): Target device to run engine on. Must be compatible with engine provided. Default: Current active device + + Returns: + torch.jit.ScriptModule: New TorchScript module with engine embedded + """ + cpp_mod = _C.embed_engine_in_new_module(serialized_engine, _parse_device(device)) + return torch.jit._recursive.wrap_cpp_module(cpp_mod)
+ + +
[docs]def check_method_op_support(module: torch.jit.ScriptModule, method_name: str) -> bool: + """Checks to see if a method is fully supported by torch_tensorrt + + Checks if a method of a TorchScript module can be compiled by torch_tensorrt, if not, a list of operators + that are not supported are printed out and the function returns false, else true. + + Arguments: + module (torch.jit.ScriptModule): Source module, a result of tracing or scripting a PyTorch + ``torch.nn.Module`` + method_name (str): Name of method to check + + Returns: + bool: True if supported Method + """ + return _C.check_method_op_support(module._c, method_name)
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_notebooks/CitriNet-example.html b/docs/v1.1.1/_notebooks/CitriNet-example.html new file mode 100644 index 0000000000..88ad96f6c6 --- /dev/null +++ b/docs/v1.1.1/_notebooks/CitriNet-example.html @@ -0,0 +1,1988 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Torch-TensorRT Getting Started - CitriNet — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+
+
[1]:
+
+
+
+
+
+
+# Copyright 2019 NVIDIA Corporation. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
+
+
+

+ c4da480a6f12443d90f742397285503d +

+

+ Torch-TensorRT Getting Started - CitriNet + + ¶ + +

+

+ Overview + + ¶ + +

+

+ + Citrinet + + is an acoustic model used for the speech to text recognition task. It is a version of + + QuartzNet + + that extends + + ContextNet + + , utilizing subword encoding (via Word Piece tokenization) and Squeeze-and-Excitation(SE) mechanism and are therefore smaller than QuartzNet models. +

+

+ CitriNet models take in audio segments and transcribe them to letter, byte pair, or word piece sequences. +

+

+ alt +

+

+ Learning objectives + + ¶ + +

+

+ This notebook demonstrates the steps for optimizing a pretrained CitriNet model with Torch-TensorRT, and running it to test the speedup obtained. +

+

+ Content + + ¶ + +

+
    +
  1. +

    + + Requirements + +

    +
  2. +
  3. +

    + + Download Citrinet model + +

    +
  4. +
  5. +

    + + Create Torch-TensorRT modules + +

    +
  6. +
  7. +

    + + Benchmark Torch-TensorRT models + +

    +
  8. +
  9. +

    + + Conclusion + +

    +
  10. +
+

+ ## 1. Requirements +

+

+ Follow the steps in + + README + + to prepare a Docker container, within which you can run this notebook. This notebook assumes that you are within a Jupyter environment in a docker container with Torch-TensorRT installed, such as an NGC monthly release of + + + nvcr.io/nvidia/pytorch:<yy.mm>-py3 + + + (where + + + yy + + + indicates the last two numbers of a calendar year, and + + + mm + + + indicates the month in two-digit numerical form) +

+

+ Now that you are in the docker, the next step is to install the required dependencies. +

+
+
+
+
[2]:
+
+
+
+
+
+
+# Install dependencies
+!pip install wget
+!apt-get update && DEBIAN_FRONTEND=noninteractive  apt-get install -y libsndfile1 ffmpeg
+!pip install Cython
+
+## Install NeMo
+!pip install nemo_toolkit[all]==1.5.1
+
+
+
+
+
+
+
+
+
+
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Requirement already satisfied: wget in /opt/conda/lib/python3.8/site-packages (3.2)
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+Hit:1 http://security.ubuntu.com/ubuntu focal-security InRelease
+Hit:2 http://archive.ubuntu.com/ubuntu focal InRelease
+Hit:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease
+Hit:4 http://archive.ubuntu.com/ubuntu focal-backports InRelease
+Reading package lists... Done
+Reading package lists... Done
+Building dependency tree
+Reading state information... Done
+libsndfile1 is already the newest version (1.0.28-7ubuntu0.1).
+ffmpeg is already the newest version (7:4.2.4-1ubuntu0.1).
+0 upgraded, 0 newly installed, 0 to remove and 22 not upgraded.
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Requirement already satisfied: Cython in /opt/conda/lib/python3.8/site-packages (0.29.28)
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Requirement already satisfied: nemo_toolkit[all]==1.5.1 in /opt/conda/lib/python3.8/site-packages (1.5.1)
+Requirement already satisfied: numpy>=1.18.2 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.22.3)
+Requirement already satisfied: onnx>=1.7.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.10.1)
+Requirement already satisfied: python-dateutil in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.8.2)
+Requirement already satisfied: tqdm>=4.41.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.63.0)
+Requirement already satisfied: sentencepiece<1.0.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.96)
+Requirement already satisfied: wget in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.2)
+Requirement already satisfied: numba in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.53.1)
+Requirement already satisfied: torch in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.12.0a0+2c916ef)
+Requirement already satisfied: unidecode in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.3.4)
+Requirement already satisfied: frozendict in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.3.2)
+Requirement already satisfied: wrapt in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.14.0)
+Requirement already satisfied: scikit-learn in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.24.2)
+Requirement already satisfied: ruamel.yaml in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.17.21)
+Requirement already satisfied: pesq in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.0.3)
+Requirement already satisfied: torchvision in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.13.0a0)
+Requirement already satisfied: gdown in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.4.0)
+Requirement already satisfied: editdistance in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.6.0)
+Requirement already satisfied: boto3 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.21.45)
+Requirement already satisfied: isort[requirements]<5 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.3.21)
+Requirement already satisfied: hydra-core>=1.1.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.1.2)
+Requirement already satisfied: youtokentome>=1.0.5 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.0.6)
+Requirement already satisfied: pytorch-lightning>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.6.1)
+Requirement already satisfied: jieba in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.42.1)
+Requirement already satisfied: fasttext in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.9.2)
+Requirement already satisfied: soundfile in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.10.3.post1)
+Requirement already satisfied: kaldiio in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.17.2)
+Requirement already satisfied: pangu in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.0.6.1)
+Requirement already satisfied: kaldi-python-io in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.2.2)
+Requirement already satisfied: parameterized in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.8.1)
+Requirement already satisfied: h5py in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.6.0)
+Requirement already satisfied: rapidfuzz in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.10)
+Requirement already satisfied: marshmallow in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.15.0)
+Requirement already satisfied: opencc in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.1.3)
+Requirement already satisfied: braceexpand in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.7)
+Requirement already satisfied: omegaconf>=2.1.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.1.2)
+Requirement already satisfied: sphinx in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.4.0)
+Requirement already satisfied: pillow in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (9.0.0)
+Requirement already satisfied: wordninja==2.0.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.0)
+Requirement already satisfied: torch-stft in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.4)
+Requirement already satisfied: sox in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.4.1)
+Requirement already satisfied: librosa in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.9.1)
+Requirement already satisfied: regex in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2022.3.15)
+Requirement already satisfied: sacrebleu[ja] in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.0)
+Requirement already satisfied: black==19.10b0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (19.10b0)
+Requirement already satisfied: pydub in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.25.1)
+Requirement already satisfied: sphinxcontrib-bibtex in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.4.2)
+Requirement already satisfied: inflect in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (5.5.2)
+Requirement already satisfied: pyannote.core in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.4)
+Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (21.3)
+Requirement already satisfied: kaldi-io in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.9.4)
+Requirement already satisfied: pyannote.metrics in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.2)
+Requirement already satisfied: g2p-en in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.1.0)
+Requirement already satisfied: matplotlib in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.5.1)
+Requirement already satisfied: torchmetrics>=0.4.1rc0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.8.0)
+Requirement already satisfied: nltk>=3.6.5 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.7)
+Requirement already satisfied: pyyaml<6 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (5.4.1)
+Requirement already satisfied: scipy in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.6.3)
+Requirement already satisfied: ipywidgets in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (7.7.0)
+Requirement already satisfied: pytest in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (6.2.5)
+Requirement already satisfied: pandas in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.3.5)
+Requirement already satisfied: pytest-runner in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (6.0.0)
+Requirement already satisfied: transformers>=4.0.1 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.18.0)
+Requirement already satisfied: sacremoses>=0.0.43 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.0.49)
+Requirement already satisfied: pystoi in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.3.3)
+Requirement already satisfied: attrdict in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.1)
+Requirement already satisfied: webdataset<=0.1.62,>=0.1.48 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.62)
+Requirement already satisfied: wandb in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.12.15)
+Requirement already satisfied: pypinyin in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.46.0)
+Requirement already satisfied: attrs>=18.1.0 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (21.4.0)
+Requirement already satisfied: appdirs in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (1.4.4)
+Requirement already satisfied: typed-ast>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (1.5.3)
+Requirement already satisfied: pathspec<1,>=0.6 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (0.9.0)
+Requirement already satisfied: click>=6.5 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (8.0.4)
+Requirement already satisfied: toml>=0.9.4 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (0.10.2)
+Requirement already satisfied: antlr4-python3-runtime==4.8 in /opt/conda/lib/python3.8/site-packages (from hydra-core>=1.1.0->nemo_toolkit[all]==1.5.1) (4.8)
+Requirement already satisfied: importlib-resources<5.3 in /opt/conda/lib/python3.8/site-packages (from hydra-core>=1.1.0->nemo_toolkit[all]==1.5.1) (5.2.3)
+Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources<5.3->hydra-core>=1.1.0->nemo_toolkit[all]==1.5.1) (3.7.0)
+Requirement already satisfied: pip-api in /opt/conda/lib/python3.8/site-packages (from isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.0.29)
+Requirement already satisfied: pipreqs in /opt/conda/lib/python3.8/site-packages (from isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.4.11)
+Requirement already satisfied: fonttools>=4.22.0 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (4.31.2)
+Requirement already satisfied: kiwisolver>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (1.4.0)
+Requirement already satisfied: pyparsing>=2.2.1 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (3.0.7)
+Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (0.11.0)
+Requirement already satisfied: joblib in /opt/conda/lib/python3.8/site-packages (from nltk>=3.6.5->nemo_toolkit[all]==1.5.1) (1.1.0)
+Requirement already satisfied: typing-extensions>=3.6.2.1 in /opt/conda/lib/python3.8/site-packages (from onnx>=1.7.0->nemo_toolkit[all]==1.5.1) (4.1.1)
+Requirement already satisfied: six in /opt/conda/lib/python3.8/site-packages (from onnx>=1.7.0->nemo_toolkit[all]==1.5.1) (1.16.0)
+Requirement already satisfied: protobuf>=3.12.2 in /opt/conda/lib/python3.8/site-packages (from onnx>=1.7.0->nemo_toolkit[all]==1.5.1) (3.19.4)
+Requirement already satisfied: pyDeprecate<0.4.0,>=0.3.1 in /opt/conda/lib/python3.8/site-packages (from pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.3.2)
+Requirement already satisfied: tensorboard>=2.2.0 in /opt/conda/lib/python3.8/site-packages (from pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.8.0)
+Requirement already satisfied: fsspec[http]!=2021.06.0,>=2021.05.0 in /opt/conda/lib/python3.8/site-packages (from pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2022.2.0)
+Requirement already satisfied: requests in /opt/conda/lib/python3.8/site-packages (from fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.27.1)
+Requirement already satisfied: aiohttp in /opt/conda/lib/python3.8/site-packages (from fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.8.1)
+Requirement already satisfied: werkzeug>=0.11.15 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.0.3)
+Requirement already satisfied: markdown>=2.6.8 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.3.6)
+Requirement already satisfied: setuptools>=41.0.0 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (59.5.0)
+Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.4.6)
+Requirement already satisfied: google-auth<3,>=1.6.3 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.6.2)
+Requirement already satisfied: wheel>=0.26 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.37.1)
+Requirement already satisfied: grpcio>=1.24.3 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.44.0)
+Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.6.1)
+Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.8.1)
+Requirement already satisfied: absl-py>=0.4 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.0.0)
+Requirement already satisfied: cachetools<6.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (5.0.0)
+Requirement already satisfied: pyasn1-modules>=0.2.1 in /opt/conda/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.2.8)
+Requirement already satisfied: rsa<5,>=3.1.4 in /opt/conda/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (4.8)
+Requirement already satisfied: requests-oauthlib>=0.7.0 in /opt/conda/lib/python3.8/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.3.1)
+Requirement already satisfied: importlib-metadata>=4.4 in /opt/conda/lib/python3.8/site-packages (from markdown>=2.6.8->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (4.11.3)
+Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /opt/conda/lib/python3.8/site-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.4.8)
+Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.0.12)
+Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2021.10.8)
+Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.3)
+Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.26.8)
+Requirement already satisfied: oauthlib>=3.0.0 in /opt/conda/lib/python3.8/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.2.0)
+Requirement already satisfied: huggingface-hub<1.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from transformers>=4.0.1->nemo_toolkit[all]==1.5.1) (0.5.1)
+Requirement already satisfied: tokenizers!=0.11.3,<0.13,>=0.11.1 in /opt/conda/lib/python3.8/site-packages (from transformers>=4.0.1->nemo_toolkit[all]==1.5.1) (0.12.1)
+Requirement already satisfied: filelock in /opt/conda/lib/python3.8/site-packages (from transformers>=4.0.1->nemo_toolkit[all]==1.5.1) (3.6.0)
+Requirement already satisfied: frozenlist>=1.1.1 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.3.0)
+Requirement already satisfied: yarl<2.0,>=1.0 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.7.2)
+Requirement already satisfied: async-timeout<5.0,>=4.0.0a3 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (4.0.2)
+Requirement already satisfied: multidict<7.0,>=4.5 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (6.0.2)
+Requirement already satisfied: aiosignal>=1.1.2 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.2.0)
+Requirement already satisfied: s3transfer<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from boto3->nemo_toolkit[all]==1.5.1) (0.5.2)
+Requirement already satisfied: botocore<1.25.0,>=1.24.45 in /opt/conda/lib/python3.8/site-packages (from boto3->nemo_toolkit[all]==1.5.1) (1.24.45)
+Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /opt/conda/lib/python3.8/site-packages (from boto3->nemo_toolkit[all]==1.5.1) (1.0.0)
+Requirement already satisfied: pybind11>=2.2 in /opt/conda/lib/python3.8/site-packages (from fasttext->nemo_toolkit[all]==1.5.1) (2.9.1)
+Requirement already satisfied: distance>=0.1.3 in /opt/conda/lib/python3.8/site-packages (from g2p-en->nemo_toolkit[all]==1.5.1) (0.1.3)
+Requirement already satisfied: beautifulsoup4 in /opt/conda/lib/python3.8/site-packages (from gdown->nemo_toolkit[all]==1.5.1) (4.10.0)
+Requirement already satisfied: soupsieve>1.2 in /opt/conda/lib/python3.8/site-packages (from beautifulsoup4->gdown->nemo_toolkit[all]==1.5.1) (2.3.1)
+Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.0)
+Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (8.1.1)
+Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (6.9.2)
+Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (1.1.0)
+Requirement already satisfied: widgetsnbextension~=3.6.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (3.6.0)
+Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (5.1.1)
+Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (5.2.0)
+Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (7.1.2)
+Requirement already satisfied: psutil in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (5.9.0)
+Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (6.1)
+Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (1.5.1)
+Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (1.5.4)
+Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (0.1.3)
+Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.7.5)
+Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (5.1.1)
+Requirement already satisfied: pygments>=2.4.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.11.2)
+Requirement already satisfied: stack-data in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.0)
+Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (3.0.27)
+Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.0)
+Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.18.1)
+Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (4.8.0)
+Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.8.3)
+Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (0.4)
+Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (22.3.0)
+Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (4.9.2)
+Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets->nemo_toolkit[all]==1.5.1) (4.4.0)
+Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.18.1)
+Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.7.0)
+Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.5)
+Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (6.4.1)
+Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (1.8.0)
+Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.13.1)
+Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.13.3)
+Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (3.0.3)
+Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (6.4.4)
+Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (21.3.0)
+Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (21.2.0)
+Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (1.15.0)
+Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.21)
+Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.1.1)
+Requirement already satisfied: resampy>=0.2.2 in /opt/conda/lib/python3.8/site-packages (from librosa->nemo_toolkit[all]==1.5.1) (0.2.2)
+Requirement already satisfied: pooch>=1.0 in /opt/conda/lib/python3.8/site-packages (from librosa->nemo_toolkit[all]==1.5.1) (1.6.0)
+Requirement already satisfied: audioread>=2.1.5 in /opt/conda/lib/python3.8/site-packages (from librosa->nemo_toolkit[all]==1.5.1) (2.1.9)
+Requirement already satisfied: llvmlite<0.37,>=0.36.0rc1 in /opt/conda/lib/python3.8/site-packages (from numba->nemo_toolkit[all]==1.5.1) (0.36.0)
+Requirement already satisfied: threadpoolctl>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from scikit-learn->nemo_toolkit[all]==1.5.1) (3.1.0)
+Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.7.1)
+Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.5.13)
+Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (4.1.0)
+Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.8.4)
+Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (1.5.0)
+Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.6.0)
+Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.1.2)
+Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.5.1)
+Requirement already satisfied: pytz>=2017.3 in /opt/conda/lib/python3.8/site-packages (from pandas->nemo_toolkit[all]==1.5.1) (2021.3)
+Requirement already satisfied: pip in /opt/conda/lib/python3.8/site-packages (from pip-api->isort[requirements]<5->nemo_toolkit[all]==1.5.1) (21.2.4)
+Requirement already satisfied: yarg in /opt/conda/lib/python3.8/site-packages (from pipreqs->isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.1.9)
+Requirement already satisfied: docopt in /opt/conda/lib/python3.8/site-packages (from pipreqs->isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.6.2)
+Requirement already satisfied: simplejson>=3.8.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.core->nemo_toolkit[all]==1.5.1) (3.17.6)
+Requirement already satisfied: sortedcontainers>=2.0.4 in /opt/conda/lib/python3.8/site-packages (from pyannote.core->nemo_toolkit[all]==1.5.1) (2.4.0)
+Requirement already satisfied: tabulate>=0.7.7 in /opt/conda/lib/python3.8/site-packages (from pyannote.metrics->nemo_toolkit[all]==1.5.1) (0.8.9)
+Requirement already satisfied: pyannote.database>=4.0.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.metrics->nemo_toolkit[all]==1.5.1) (4.1.3)
+Requirement already satisfied: sympy>=1.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.metrics->nemo_toolkit[all]==1.5.1) (1.10.1)
+Requirement already satisfied: typer[all]>=0.2.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (0.4.0)
+Requirement already satisfied: mpmath>=0.19 in /opt/conda/lib/python3.8/site-packages (from sympy>=1.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (1.2.1)
+Requirement already satisfied: colorama<0.5.0,>=0.4.3 in /opt/conda/lib/python3.8/site-packages (from typer[all]>=0.2.1->pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (0.4.4)
+Requirement already satisfied: shellingham<2.0.0,>=1.3.0 in /opt/conda/lib/python3.8/site-packages (from typer[all]>=0.2.1->pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (1.4.0)
+Requirement already satisfied: py>=1.8.2 in /opt/conda/lib/python3.8/site-packages (from pytest->nemo_toolkit[all]==1.5.1) (1.11.0)
+Requirement already satisfied: iniconfig in /opt/conda/lib/python3.8/site-packages (from pytest->nemo_toolkit[all]==1.5.1) (1.1.1)
+Requirement already satisfied: pluggy<2.0,>=0.12 in /opt/conda/lib/python3.8/site-packages (from pytest->nemo_toolkit[all]==1.5.1) (1.0.0)
+Requirement already satisfied: jarowinkler<1.1.0,>=1.0.2 in /opt/conda/lib/python3.8/site-packages (from rapidfuzz->nemo_toolkit[all]==1.5.1) (1.0.2)
+Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.7.1)
+Requirement already satisfied: ruamel.yaml.clib>=0.2.6 in /opt/conda/lib/python3.8/site-packages (from ruamel.yaml->nemo_toolkit[all]==1.5.1) (0.2.6)
+Requirement already satisfied: portalocker in /opt/conda/lib/python3.8/site-packages (from sacrebleu[ja]->nemo_toolkit[all]==1.5.1) (2.4.0)
+Requirement already satisfied: ipadic<2.0,>=1.0 in /opt/conda/lib/python3.8/site-packages (from sacrebleu[ja]->nemo_toolkit[all]==1.5.1) (1.0.0)
+Requirement already satisfied: mecab-python3==1.0.3 in /opt/conda/lib/python3.8/site-packages (from sacrebleu[ja]->nemo_toolkit[all]==1.5.1) (1.0.3)
+Requirement already satisfied: sphinxcontrib-htmlhelp>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (2.0.0)
+Requirement already satisfied: alabaster<0.8,>=0.7 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (0.7.12)
+Requirement already satisfied: babel>=1.3 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (2.9.1)
+Requirement already satisfied: sphinxcontrib-serializinghtml>=1.1.5 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.1.5)
+Requirement already satisfied: sphinxcontrib-devhelp in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.2)
+Requirement already satisfied: sphinxcontrib-jsmath in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.1)
+Requirement already satisfied: sphinxcontrib-qthelp in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.3)
+Requirement already satisfied: snowballstemmer>=1.1 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (2.2.0)
+Requirement already satisfied: imagesize in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.3.0)
+Requirement already satisfied: sphinxcontrib-applehelp in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.2)
+Requirement already satisfied: docutils<0.18,>=0.14 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (0.17.1)
+Requirement already satisfied: pybtex-docutils>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from sphinxcontrib-bibtex->nemo_toolkit[all]==1.5.1) (1.0.1)
+Requirement already satisfied: pybtex>=0.24 in /opt/conda/lib/python3.8/site-packages (from sphinxcontrib-bibtex->nemo_toolkit[all]==1.5.1) (0.24.0)
+Requirement already satisfied: latexcodec>=1.0.4 in /opt/conda/lib/python3.8/site-packages (from pybtex>=0.24->sphinxcontrib-bibtex->nemo_toolkit[all]==1.5.1) (2.0.1)
+Requirement already satisfied: pure-eval in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.2)
+Requirement already satisfied: asttokens in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.0.5)
+Requirement already satisfied: executing in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.8.3)
+Requirement already satisfied: pathtools in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (0.1.2)
+Requirement already satisfied: setproctitle in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (1.2.3)
+Requirement already satisfied: GitPython>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (3.1.27)
+Requirement already satisfied: sentry-sdk>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (1.5.10)
+Requirement already satisfied: shortuuid>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (1.0.8)
+Requirement already satisfied: docker-pycreds>=0.4.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (0.4.0)
+Requirement already satisfied: promise<3,>=2.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (2.3)
+Requirement already satisfied: gitdb<5,>=4.0.1 in /opt/conda/lib/python3.8/site-packages (from GitPython>=1.0.0->wandb->nemo_toolkit[all]==1.5.1) (4.0.9)
+Requirement already satisfied: smmap<6,>=3.0.1 in /opt/conda/lib/python3.8/site-packages (from gitdb<5,>=4.0.1->GitPython>=1.0.0->wandb->nemo_toolkit[all]==1.5.1) (5.0.0)
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+
+
+
+
+

+ ## 2. Download Citrinet model +

+

+ Next, we download a pretrained Nemo Citrinet model and convert it to a Torchscript module: +

+
+
+
+
[3]:
+
+
+
+
+
+
+import nemo
+import torch
+
+import nemo.collections.asr as nemo_asr
+from nemo.core import typecheck
+typecheck.set_typecheck_enabled(False)
+
+
+
+
+
+
+
+
[4]:
+
+
+
+
+
+
+variant = 'stt_en_citrinet_256'
+
+print(f"Downloading and saving {variant}...")
+asr_model = nemo_asr.models.EncDecCTCModelBPE.from_pretrained(model_name=variant)
+asr_model.export(f"{variant}.ts")
+
+
+
+
+
+
+
+
+
+
+Downloading and saving stt_en_citrinet_256...
+[NeMo I 2022-04-21 23:12:45 cloud:56] Found existing object /root/.cache/torch/NeMo/NeMo_1.5.1/stt_en_citrinet_256/91a9cc5850784b2065e8a0aa3d526fd9/stt_en_citrinet_256.nemo.
+[NeMo I 2022-04-21 23:12:45 cloud:62] Re-using file from: /root/.cache/torch/NeMo/NeMo_1.5.1/stt_en_citrinet_256/91a9cc5850784b2065e8a0aa3d526fd9/stt_en_citrinet_256.nemo
+[NeMo I 2022-04-21 23:12:45 common:728] Instantiating model from pre-trained checkpoint
+[NeMo I 2022-04-21 23:12:46 mixins:146] Tokenizer SentencePieceTokenizer initialized with 1024 tokens
+
+
+
+
+
+
+
+
+
+
+[NeMo W 2022-04-21 23:12:47 modelPT:130] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.
+    Train config :
+    manifest_filepath: null
+    sample_rate: 16000
+    batch_size: 32
+    trim_silence: true
+    max_duration: 16.7
+    shuffle: true
+    is_tarred: false
+    tarred_audio_filepaths: null
+    use_start_end_token: false
+
+[NeMo W 2022-04-21 23:12:47 modelPT:137] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s).
+    Validation config :
+    manifest_filepath: null
+    sample_rate: 16000
+    batch_size: 32
+    shuffle: false
+    use_start_end_token: false
+
+[NeMo W 2022-04-21 23:12:47 modelPT:143] Please call the ModelPT.setup_test_data() or ModelPT.setup_multiple_test_data() method and provide a valid configuration file to setup the test data loader(s).
+    Test config :
+    manifest_filepath: null
+    sample_rate: 16000
+    batch_size: 32
+    shuffle: false
+    use_start_end_token: false
+
+
+
+
+
+
+
+
+
+
+
+[NeMo I 2022-04-21 23:12:47 features:265] PADDING: 16
+[NeMo I 2022-04-21 23:12:47 features:282] STFT using torch
+
+
+
+
+
+
+
+
+
+
+[NeMo W 2022-04-21 23:12:47 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/nemo/collections/asr/parts/preprocessing/features.py:315: FutureWarning: Pass sr=16000, n_fft=512 as keyword args. From version 0.10 passing these as positional arguments will result in an error
+      librosa.filters.mel(sample_rate, self.n_fft, n_mels=nfilt, fmin=lowfreq, fmax=highfreq), dtype=torch.float
+
+
+
+
+
+
+
+
+
+
+
+[NeMo I 2022-04-21 23:12:49 save_restore_connector:149] Model EncDecCTCModelBPE was successfully restored from /root/.cache/torch/NeMo/NeMo_1.5.1/stt_en_citrinet_256/91a9cc5850784b2065e8a0aa3d526fd9/stt_en_citrinet_256.nemo.
+
+
+
+
+
+
+
+
+
+
+[NeMo W 2022-04-21 23:12:49 export_utils:198] Swapped 0 modules
+[NeMo W 2022-04-21 23:12:49 conv_asr:73] Turned off 235 masked convolutions
+[NeMo W 2022-04-21 23:12:49 export_utils:198] Swapped 0 modules
+[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/jit/_trace.py:916: UserWarning: `optimize` is deprecated and has no effect. Use `with torch.jit.optimized_execution() instead
+      warnings.warn(
+
+[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:668: LightningDeprecationWarning: The `LightningModule.model_size` property was deprecated in v1.5 and will be removed in v1.7. Please use the `pytorch_lightning.utilities.memory.get_model_size_mb`.
+      if hasattr(mod, name):
+
+[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:669: LightningDeprecationWarning: The `LightningModule.model_size` property was deprecated in v1.5 and will be removed in v1.7. Please use the `pytorch_lightning.utilities.memory.get_model_size_mb`.
+      item = getattr(mod, name)
+
+[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:668: LightningDeprecationWarning: `LightningModule.use_amp` was deprecated in v1.6 and will be removed in v1.8. Please use `Trainer.amp_backend`.
+      if hasattr(mod, name):
+
+[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:669: LightningDeprecationWarning: `LightningModule.use_amp` was deprecated in v1.6 and will be removed in v1.8. Please use `Trainer.amp_backend`.
+      item = getattr(mod, name)
+
+
+
+
+
+
+
+
+
[4]:
+
+
+
+
+
+
+(['stt_en_citrinet_256.ts'],
+ ['nemo.collections.asr.models.ctc_bpe_models.EncDecCTCModelBPE exported to ONNX'])
+
+
+
+
+

+ Benchmark utility + + ¶ + +

+

+ Let us define a helper benchmarking function, then benchmark the original Pytorch model. +

+
+
+
+
[5]:
+
+
+
+
+
+
+from __future__ import print_function
+from __future__ import absolute_import
+from __future__ import division
+
+import argparse
+import timeit
+import numpy as np
+import torch
+import torch_tensorrt as trtorch
+import torch.backends.cudnn as cudnn
+
+def benchmark(model, input_tensor, num_loops, model_name, batch_size):
+    def timeGraph(model, input_tensor, num_loops):
+        print("Warm up ...")
+        with torch.no_grad():
+            for _ in range(20):
+                features = model(input_tensor)
+
+        torch.cuda.synchronize()
+        print("Start timing ...")
+        timings = []
+        with torch.no_grad():
+            for i in range(num_loops):
+                start_time = timeit.default_timer()
+                features = model(input_tensor)
+                torch.cuda.synchronize()
+                end_time = timeit.default_timer()
+                timings.append(end_time - start_time)
+                # print("Iteration {}: {:.6f} s".format(i, end_time - start_time))
+        return timings
+    def printStats(graphName, timings, batch_size):
+        times = np.array(timings)
+        steps = len(times)
+        speeds = batch_size / times
+        time_mean = np.mean(times)
+        time_med = np.median(times)
+        time_99th = np.percentile(times, 99)
+        time_std = np.std(times, ddof=0)
+        speed_mean = np.mean(speeds)
+        speed_med = np.median(speeds)
+        msg = ("\n%s =================================\n"
+                "batch size=%d, num iterations=%d\n"
+                "  Median samples/s: %.1f, mean: %.1f\n"
+                "  Median latency (s): %.6f, mean: %.6f, 99th_p: %.6f, std_dev: %.6f\n"
+                ) % (graphName,
+                    batch_size, steps,
+                    speed_med, speed_mean,
+                    time_med, time_mean, time_99th, time_std)
+        print(msg)
+    timings = timeGraph(model, input_tensor, num_loops)
+    printStats(model_name, timings, batch_size)
+
+precisions_str = 'fp32' # Precision (default=fp32, fp16)
+variant = 'stt_en_citrinet_256' # Nemo Citrinet variant
+batch_sizes = [1, 8, 32, 128] # Batch sizes (default=1,8,32,128)
+trt = False # If True, infer with Torch-TensorRT engine. Else, infer with Pytorch model.
+precision = torch.float32 if precisions_str =='fp32' else torch.float16
+
+for batch_size in batch_sizes:
+    if trt:
+        model_name = f"{variant}_bs{batch_size}_{precision}.torch-tensorrt"
+    else:
+        model_name = f"{variant}.ts"
+
+    print(f"Loading model: {model_name}")
+    # Load traced model to CPU first
+    model = torch.jit.load(model_name).cuda()
+    cudnn.benchmark = True
+    # Create random input tensor of certain size
+    torch.manual_seed(12345)
+    input_shape=(batch_size, 80, 1488)
+    input_tensor = torch.randn(input_shape).cuda()
+
+    # Timing graph inference
+    benchmark(model, input_tensor, 50, model_name, batch_size)
+
+
+
+
+
+
+
+
+
+
+Loading model: stt_en_citrinet_256.ts
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256.ts =================================
+batch size=1, num iterations=50
+  Median samples/s: 102.0, mean: 102.0
+  Median latency (s): 0.009802, mean: 0.009803, 99th_p: 0.009836, std_dev: 0.000014
+
+Loading model: stt_en_citrinet_256.ts
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256.ts =================================
+batch size=8, num iterations=50
+  Median samples/s: 429.1, mean: 429.1
+  Median latency (s): 0.018642, mean: 0.018643, 99th_p: 0.018670, std_dev: 0.000014
+
+Loading model: stt_en_citrinet_256.ts
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256.ts =================================
+batch size=32, num iterations=50
+  Median samples/s: 551.3, mean: 551.2
+  Median latency (s): 0.058047, mean: 0.058053, 99th_p: 0.058375, std_dev: 0.000106
+
+Loading model: stt_en_citrinet_256.ts
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256.ts =================================
+batch size=128, num iterations=50
+  Median samples/s: 594.1, mean: 594.1
+  Median latency (s): 0.215434, mean: 0.215446, 99th_p: 0.215806, std_dev: 0.000116
+
+
+
+
+
+

+ Confirming the GPU we are using here: +

+
+
+
+
[6]:
+
+
+
+
+
+
+!nvidia-smi
+
+
+
+
+
+
+
+
+
+
+Thu Apr 21 23:13:32 2022
++-----------------------------------------------------------------------------+
+| NVIDIA-SMI 510.47.03    Driver Version: 510.47.03    CUDA Version: 11.6     |
+|-------------------------------+----------------------+----------------------+
+| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
+| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
+|                               |                      |               MIG M. |
+|===============================+======================+======================|
+|   0  NVIDIA TITAN V      On   | 00000000:17:00.0 Off |                  N/A |
+| 38%   55C    P2    42W / 250W |   2462MiB / 12288MiB |      0%      Default |
+|                               |                      |                  N/A |
++-------------------------------+----------------------+----------------------+
+|   1  NVIDIA TITAN V      On   | 00000000:65:00.0 Off |                  N/A |
+| 28%   39C    P8    26W / 250W |    112MiB / 12288MiB |      0%      Default |
+|                               |                      |                  N/A |
++-------------------------------+----------------------+----------------------+
+
++-----------------------------------------------------------------------------+
+| Processes:                                                                  |
+|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
+|        ID   ID                                                   Usage      |
+|=============================================================================|
+|    0   N/A  N/A      3909      G                                       4MiB |
+|    0   N/A  N/A      6047      C                                    2453MiB |
+|    1   N/A  N/A      3909      G                                      39MiB |
+|    1   N/A  N/A      4161      G                                      67MiB |
++-----------------------------------------------------------------------------+
+
+
+
+
+

+ ## 3. Create Torch-TensorRT modules +

+

+ In this step, we optimize the Citrinet Torchscript module with Torch-TensorRT with various precisions and batch sizes. +

+
+
+
+
[10]:
+
+
+
+
+
+
+import torch
+import torch.nn as nn
+import torch_tensorrt as torchtrt
+import argparse
+
+variant = "stt_en_citrinet_256"
+precisions = [torch.float, torch.half]
+batch_sizes = [1,8,32,128]
+
+model = torch.jit.load(f"{variant}.ts")
+
+for precision in precisions:
+    for batch_size in batch_sizes:
+        compile_settings = {
+            "inputs": [torchtrt.Input(shape=[batch_size, 80, 1488])],
+            "enabled_precisions": {precision},
+            "workspace_size": 2000000000,
+            "truncate_long_and_double": True,
+        }
+        print(f"Generating Torchscript-TensorRT module for batchsize {batch_size} precision {precision}")
+        trt_ts_module = torchtrt.compile(model, **compile_settings)
+        torch.jit.save(trt_ts_module, f"{variant}_bs{batch_size}_{precision}.torch-tensorrt")
+
+
+
+
+
+
+
+
+
+
+Generating Torchscript-TensorRT module for batchsize 1 precision torch.float32
+Generating Torchscript-TensorRT module for batchsize 8 precision torch.float32
+Generating Torchscript-TensorRT module for batchsize 32 precision torch.float32
+Generating Torchscript-TensorRT module for batchsize 128 precision torch.float32
+Generating Torchscript-TensorRT module for batchsize 1 precision torch.float16
+Generating Torchscript-TensorRT module for batchsize 8 precision torch.float16
+Generating Torchscript-TensorRT module for batchsize 32 precision torch.float16
+Generating Torchscript-TensorRT module for batchsize 128 precision torch.float16
+
+
+
+
+

+ ## 4. Benchmark Torch-TensorRT models +

+

+ Finally, we are ready to benchmark the Torch-TensorRT optimized Citrinet models. +

+

+ FP32 (single precision) + + ¶ + +

+
+
+
+
[13]:
+
+
+
+
+
+
+precisions_str = 'fp32' # Precision (default=fp32, fp16)
+batch_sizes = [1, 8, 32, 128] # Batch sizes (default=1,8,32,128)
+precision = torch.float32 if precisions_str =='fp32' else torch.float16
+trt = True
+
+for batch_size in batch_sizes:
+    if trt:
+        model_name = f"{variant}_bs{batch_size}_{precision}.torch-tensorrt"
+    else:
+        model_name = f"{variant}.ts"
+
+    print(f"Loading model: {model_name}")
+    # Load traced model to CPU first
+    model = torch.jit.load(model_name).cuda()
+    cudnn.benchmark = True
+    # Create random input tensor of certain size
+    torch.manual_seed(12345)
+    input_shape=(batch_size, 80, 1488)
+    input_tensor = torch.randn(input_shape).cuda()
+
+    # Timing graph inference
+    benchmark(model, input_tensor, 50, model_name, batch_size)
+
+
+
+
+
+
+
+
+
+
+Loading model: stt_en_citrinet_256_bs1_torch.float32.torch-tensorrt
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256_bs1_torch.float32.torch-tensorrt =================================
+batch size=1, num iterations=50
+  Median samples/s: 242.2, mean: 218.0
+  Median latency (s): 0.004128, mean: 0.004825, 99th_p: 0.008071, std_dev: 0.001270
+
+Loading model: stt_en_citrinet_256_bs8_torch.float32.torch-tensorrt
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256_bs8_torch.float32.torch-tensorrt =================================
+batch size=8, num iterations=50
+  Median samples/s: 729.9, mean: 709.0
+  Median latency (s): 0.010961, mean: 0.011388, 99th_p: 0.016114, std_dev: 0.001256
+
+Loading model: stt_en_citrinet_256_bs32_torch.float32.torch-tensorrt
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256_bs32_torch.float32.torch-tensorrt =================================
+batch size=32, num iterations=50
+  Median samples/s: 955.6, mean: 953.4
+  Median latency (s): 0.033488, mean: 0.033572, 99th_p: 0.035722, std_dev: 0.000545
+
+Loading model: stt_en_citrinet_256_bs128_torch.float32.torch-tensorrt
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256_bs128_torch.float32.torch-tensorrt =================================
+batch size=128, num iterations=50
+  Median samples/s: 1065.8, mean: 1069.4
+  Median latency (s): 0.120097, mean: 0.119708, 99th_p: 0.121618, std_dev: 0.001260
+
+
+
+
+
+

+ FP16 (half precision) + + ¶ + +

+
+
+
+
[14]:
+
+
+
+
+
+
+precisions_str = 'fp16' # Precision (default=fp32, fp16)
+batch_sizes = [1, 8, 32, 128] # Batch sizes (default=1,8,32,128)
+precision = torch.float32 if precisions_str =='fp32' else torch.float16
+
+for batch_size in batch_sizes:
+    if trt:
+        model_name = f"{variant}_bs{batch_size}_{precision}.torch-tensorrt"
+    else:
+        model_name = f"{variant}.ts"
+
+    print(f"Loading model: {model_name}")
+    # Load traced model to CPU first
+    model = torch.jit.load(model_name).cuda()
+    cudnn.benchmark = True
+    # Create random input tensor of certain size
+    torch.manual_seed(12345)
+    input_shape=(batch_size, 80, 1488)
+    input_tensor = torch.randn(input_shape).cuda()
+
+    # Timing graph inference
+    benchmark(model, input_tensor, 50, model_name, batch_size)
+
+
+
+
+
+
+
+
+
+
+Loading model: stt_en_citrinet_256_bs1_torch.float16.torch-tensorrt
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256_bs1_torch.float16.torch-tensorrt =================================
+batch size=1, num iterations=50
+  Median samples/s: 288.9, mean: 272.9
+  Median latency (s): 0.003462, mean: 0.003774, 99th_p: 0.006846, std_dev: 0.000820
+
+Loading model: stt_en_citrinet_256_bs8_torch.float16.torch-tensorrt
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256_bs8_torch.float16.torch-tensorrt =================================
+batch size=8, num iterations=50
+  Median samples/s: 1201.0, mean: 1190.9
+  Median latency (s): 0.006661, mean: 0.006733, 99th_p: 0.008453, std_dev: 0.000368
+
+Loading model: stt_en_citrinet_256_bs32_torch.float16.torch-tensorrt
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256_bs32_torch.float16.torch-tensorrt =================================
+batch size=32, num iterations=50
+  Median samples/s: 1538.2, mean: 1516.4
+  Median latency (s): 0.020804, mean: 0.021143, 99th_p: 0.024492, std_dev: 0.000973
+
+Loading model: stt_en_citrinet_256_bs128_torch.float16.torch-tensorrt
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256_bs128_torch.float16.torch-tensorrt =================================
+batch size=128, num iterations=50
+  Median samples/s: 1792.0, mean: 1777.0
+  Median latency (s): 0.071428, mean: 0.072057, 99th_p: 0.076796, std_dev: 0.001351
+
+
+
+
+
+

+ ## 5. Conclusion +

+

+ In this notebook, we have walked through the complete process of optimizing the Citrinet model with Torch-TensorRT. On an A100 GPU, with Torch-TensorRT, we observe a speedup of ~ + + 2.4X + + with FP32, and ~ + + 2.9X + + with FP16 at batchsize of 128. +

+

+ What’s next + + ¶ + +

+

+ Now it’s time to try Torch-TensorRT on your own model. Fill out issues at + + https://github.com/NVIDIA/Torch-TensorRT + + . Your involvement will help future development of Torch-TensorRT. +

+
+
+
+
[ ]:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_notebooks/CitriNet-example.ipynb b/docs/v1.1.1/_notebooks/CitriNet-example.ipynb new file mode 100644 index 0000000000..0573af0176 --- /dev/null +++ b/docs/v1.1.1/_notebooks/CitriNet-example.ipynb @@ -0,0 +1,964 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Torch-TensorRT Getting Started - CitriNet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "[Citrinet](https://docs.nvidia.com/deeplearning/nemo/user-guide/docs/en/main/asr/models.html#citrinet) is an acoustic model used for the speech to text recognition task. It is a version of [QuartzNet](https://arxiv.org/pdf/1910.10261.pdf) that extends [ContextNet](https://arxiv.org/pdf/2005.03191.pdf), utilizing subword encoding (via Word Piece tokenization) and Squeeze-and-Excitation(SE) mechanism and are therefore smaller than QuartzNet models.\n", + "\n", + "CitriNet models take in audio segments and transcribe them to letter, byte pair, or word piece sequences. \n", + "\n", + "\"alt\"\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for optimizing a pretrained CitriNet model with Torch-TensorRT, and running it to test the speedup obtained.\n", + "\n", + "## Content\n", + "1. [Requirements](#1)\n", + "1. [Download Citrinet model](#2)\n", + "1. [Create Torch-TensorRT modules](#3)\n", + "1. [Benchmark Torch-TensorRT models](#4)\n", + "1. [Conclusion](#5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "Follow the steps in [README](README.md) to prepare a Docker container, within which you can run this notebook. \n", + "This notebook assumes that you are within a Jupyter environment in a docker container with Torch-TensorRT installed, such as an NGC monthly release of `nvcr.io/nvidia/pytorch:-py3` (where `yy` indicates the last two numbers of a calendar year, and `mm` indicates the month in two-digit numerical form)\n", + "\n", + "Now that you are in the docker, the next step is to install the required dependencies." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: wget in /opt/conda/lib/python3.8/site-packages (3.2)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Hit:1 http://security.ubuntu.com/ubuntu focal-security InRelease\n", + "Hit:2 http://archive.ubuntu.com/ubuntu focal InRelease\n", + "Hit:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease\n", + "Hit:4 http://archive.ubuntu.com/ubuntu focal-backports InRelease\n", + "Reading package lists... Done\n", + "Reading package lists... Done\n", + "Building dependency tree \n", + "Reading state information... Done\n", + "libsndfile1 is already the newest version (1.0.28-7ubuntu0.1).\n", + "ffmpeg is already the newest version (7:4.2.4-1ubuntu0.1).\n", + "0 upgraded, 0 newly installed, 0 to remove and 22 not upgraded.\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: Cython in /opt/conda/lib/python3.8/site-packages (0.29.28)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: nemo_toolkit[all]==1.5.1 in /opt/conda/lib/python3.8/site-packages (1.5.1)\n", + "Requirement already satisfied: numpy>=1.18.2 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.22.3)\n", + "Requirement already satisfied: onnx>=1.7.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.10.1)\n", + "Requirement already satisfied: python-dateutil in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.8.2)\n", + "Requirement already satisfied: tqdm>=4.41.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.63.0)\n", + "Requirement already satisfied: sentencepiece<1.0.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.96)\n", + "Requirement already satisfied: wget in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.2)\n", + "Requirement already satisfied: numba in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.53.1)\n", + "Requirement already satisfied: torch in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.12.0a0+2c916ef)\n", + "Requirement already satisfied: unidecode in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.3.4)\n", + "Requirement already satisfied: frozendict in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.3.2)\n", + "Requirement already satisfied: wrapt in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.14.0)\n", + "Requirement already satisfied: scikit-learn in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.24.2)\n", + "Requirement already satisfied: ruamel.yaml in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.17.21)\n", + "Requirement already satisfied: pesq in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.0.3)\n", + "Requirement already satisfied: torchvision in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.13.0a0)\n", + "Requirement already satisfied: gdown in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.4.0)\n", + "Requirement already satisfied: editdistance in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.6.0)\n", + "Requirement already satisfied: boto3 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.21.45)\n", + "Requirement already satisfied: isort[requirements]<5 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.3.21)\n", + "Requirement already satisfied: hydra-core>=1.1.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.1.2)\n", + "Requirement already satisfied: youtokentome>=1.0.5 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.0.6)\n", + "Requirement already satisfied: pytorch-lightning>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.6.1)\n", + "Requirement already satisfied: jieba in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.42.1)\n", + "Requirement already satisfied: fasttext in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.9.2)\n", + "Requirement already satisfied: soundfile in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.10.3.post1)\n", + "Requirement already satisfied: kaldiio in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.17.2)\n", + "Requirement already satisfied: pangu in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.0.6.1)\n", + "Requirement already satisfied: kaldi-python-io in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.2.2)\n", + "Requirement already satisfied: parameterized in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.8.1)\n", + "Requirement already satisfied: h5py in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.6.0)\n", + "Requirement already satisfied: rapidfuzz in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.10)\n", + "Requirement already satisfied: marshmallow in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.15.0)\n", + "Requirement already satisfied: opencc in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.1.3)\n", + "Requirement already satisfied: braceexpand in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.7)\n", + "Requirement already satisfied: omegaconf>=2.1.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.1.2)\n", + "Requirement already satisfied: sphinx in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.4.0)\n", + "Requirement already satisfied: pillow in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (9.0.0)\n", + "Requirement already satisfied: wordninja==2.0.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.0)\n", + "Requirement already satisfied: torch-stft in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.4)\n", + "Requirement already satisfied: sox in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.4.1)\n", + "Requirement already satisfied: librosa in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.9.1)\n", + "Requirement already satisfied: regex in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2022.3.15)\n", + "Requirement already satisfied: sacrebleu[ja] in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.0)\n", + "Requirement already satisfied: black==19.10b0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (19.10b0)\n", + "Requirement already satisfied: pydub in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.25.1)\n", + "Requirement already satisfied: sphinxcontrib-bibtex in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.4.2)\n", + "Requirement already satisfied: inflect in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (5.5.2)\n", + "Requirement already satisfied: pyannote.core in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.4)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (21.3)\n", + "Requirement already satisfied: kaldi-io in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.9.4)\n", + "Requirement already satisfied: pyannote.metrics in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.2)\n", + "Requirement already satisfied: g2p-en in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.1.0)\n", + "Requirement already satisfied: matplotlib in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.5.1)\n", + "Requirement already satisfied: torchmetrics>=0.4.1rc0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.8.0)\n", + "Requirement already satisfied: nltk>=3.6.5 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.7)\n", + "Requirement already satisfied: pyyaml<6 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (5.4.1)\n", + "Requirement already satisfied: scipy in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.6.3)\n", + "Requirement already satisfied: ipywidgets in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (7.7.0)\n", + "Requirement already satisfied: pytest in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (6.2.5)\n", + "Requirement already satisfied: pandas in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.3.5)\n", + "Requirement already satisfied: pytest-runner in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (6.0.0)\n", + "Requirement already satisfied: transformers>=4.0.1 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.18.0)\n", + "Requirement already satisfied: sacremoses>=0.0.43 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.0.49)\n", + "Requirement already satisfied: pystoi in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.3.3)\n", + "Requirement already satisfied: attrdict in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.1)\n", + "Requirement already satisfied: webdataset<=0.1.62,>=0.1.48 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.62)\n", + "Requirement already satisfied: wandb in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.12.15)\n", + "Requirement already satisfied: pypinyin in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.46.0)\n", + "Requirement already satisfied: attrs>=18.1.0 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (21.4.0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: appdirs in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (1.4.4)\n", + "Requirement already satisfied: typed-ast>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (1.5.3)\n", + "Requirement already satisfied: pathspec<1,>=0.6 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (0.9.0)\n", + "Requirement already satisfied: click>=6.5 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (8.0.4)\n", + "Requirement already satisfied: toml>=0.9.4 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (0.10.2)\n", + "Requirement already satisfied: antlr4-python3-runtime==4.8 in /opt/conda/lib/python3.8/site-packages (from hydra-core>=1.1.0->nemo_toolkit[all]==1.5.1) (4.8)\n", + "Requirement already satisfied: importlib-resources<5.3 in /opt/conda/lib/python3.8/site-packages (from hydra-core>=1.1.0->nemo_toolkit[all]==1.5.1) (5.2.3)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources<5.3->hydra-core>=1.1.0->nemo_toolkit[all]==1.5.1) (3.7.0)\n", + "Requirement already satisfied: pip-api in /opt/conda/lib/python3.8/site-packages (from isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.0.29)\n", + "Requirement already satisfied: pipreqs in /opt/conda/lib/python3.8/site-packages (from isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.4.11)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (4.31.2)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (1.4.0)\n", + "Requirement already satisfied: pyparsing>=2.2.1 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (3.0.7)\n", + "Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (0.11.0)\n", + "Requirement already satisfied: joblib in /opt/conda/lib/python3.8/site-packages (from nltk>=3.6.5->nemo_toolkit[all]==1.5.1) (1.1.0)\n", + "Requirement already satisfied: typing-extensions>=3.6.2.1 in /opt/conda/lib/python3.8/site-packages (from onnx>=1.7.0->nemo_toolkit[all]==1.5.1) (4.1.1)\n", + "Requirement already satisfied: six in /opt/conda/lib/python3.8/site-packages (from onnx>=1.7.0->nemo_toolkit[all]==1.5.1) (1.16.0)\n", + "Requirement already satisfied: protobuf>=3.12.2 in /opt/conda/lib/python3.8/site-packages (from onnx>=1.7.0->nemo_toolkit[all]==1.5.1) (3.19.4)\n", + "Requirement already satisfied: pyDeprecate<0.4.0,>=0.3.1 in /opt/conda/lib/python3.8/site-packages (from pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.3.2)\n", + "Requirement already satisfied: tensorboard>=2.2.0 in /opt/conda/lib/python3.8/site-packages (from pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.8.0)\n", + "Requirement already satisfied: fsspec[http]!=2021.06.0,>=2021.05.0 in /opt/conda/lib/python3.8/site-packages (from pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2022.2.0)\n", + "Requirement already satisfied: requests in /opt/conda/lib/python3.8/site-packages (from fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.27.1)\n", + "Requirement already satisfied: aiohttp in /opt/conda/lib/python3.8/site-packages (from fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.8.1)\n", + "Requirement already satisfied: werkzeug>=0.11.15 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.0.3)\n", + "Requirement already satisfied: markdown>=2.6.8 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.3.6)\n", + "Requirement already satisfied: setuptools>=41.0.0 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (59.5.0)\n", + "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.4.6)\n", + "Requirement already satisfied: google-auth<3,>=1.6.3 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.6.2)\n", + "Requirement already satisfied: wheel>=0.26 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.37.1)\n", + "Requirement already satisfied: grpcio>=1.24.3 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.44.0)\n", + "Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.6.1)\n", + "Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.8.1)\n", + "Requirement already satisfied: absl-py>=0.4 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.0.0)\n", + "Requirement already satisfied: cachetools<6.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (5.0.0)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in /opt/conda/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.2.8)\n", + "Requirement already satisfied: rsa<5,>=3.1.4 in /opt/conda/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (4.8)\n", + "Requirement already satisfied: requests-oauthlib>=0.7.0 in /opt/conda/lib/python3.8/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.3.1)\n", + "Requirement already satisfied: importlib-metadata>=4.4 in /opt/conda/lib/python3.8/site-packages (from markdown>=2.6.8->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (4.11.3)\n", + "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /opt/conda/lib/python3.8/site-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.4.8)\n", + "Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.0.12)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2021.10.8)\n", + "Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.3)\n", + "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.26.8)\n", + "Requirement already satisfied: oauthlib>=3.0.0 in /opt/conda/lib/python3.8/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.2.0)\n", + "Requirement already satisfied: huggingface-hub<1.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from transformers>=4.0.1->nemo_toolkit[all]==1.5.1) (0.5.1)\n", + "Requirement already satisfied: tokenizers!=0.11.3,<0.13,>=0.11.1 in /opt/conda/lib/python3.8/site-packages (from transformers>=4.0.1->nemo_toolkit[all]==1.5.1) (0.12.1)\n", + "Requirement already satisfied: filelock in /opt/conda/lib/python3.8/site-packages (from transformers>=4.0.1->nemo_toolkit[all]==1.5.1) (3.6.0)\n", + "Requirement already satisfied: frozenlist>=1.1.1 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.3.0)\n", + "Requirement already satisfied: yarl<2.0,>=1.0 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.7.2)\n", + "Requirement already satisfied: async-timeout<5.0,>=4.0.0a3 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (4.0.2)\n", + "Requirement already satisfied: multidict<7.0,>=4.5 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (6.0.2)\n", + "Requirement already satisfied: aiosignal>=1.1.2 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.2.0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: s3transfer<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from boto3->nemo_toolkit[all]==1.5.1) (0.5.2)\n", + "Requirement already satisfied: botocore<1.25.0,>=1.24.45 in /opt/conda/lib/python3.8/site-packages (from boto3->nemo_toolkit[all]==1.5.1) (1.24.45)\n", + "Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /opt/conda/lib/python3.8/site-packages (from boto3->nemo_toolkit[all]==1.5.1) (1.0.0)\n", + "Requirement already satisfied: pybind11>=2.2 in /opt/conda/lib/python3.8/site-packages (from fasttext->nemo_toolkit[all]==1.5.1) (2.9.1)\n", + "Requirement already satisfied: distance>=0.1.3 in /opt/conda/lib/python3.8/site-packages (from g2p-en->nemo_toolkit[all]==1.5.1) (0.1.3)\n", + "Requirement already satisfied: beautifulsoup4 in /opt/conda/lib/python3.8/site-packages (from gdown->nemo_toolkit[all]==1.5.1) (4.10.0)\n", + "Requirement already satisfied: soupsieve>1.2 in /opt/conda/lib/python3.8/site-packages (from beautifulsoup4->gdown->nemo_toolkit[all]==1.5.1) (2.3.1)\n", + "Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.0)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (8.1.1)\n", + "Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (6.9.2)\n", + "Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (1.1.0)\n", + "Requirement already satisfied: widgetsnbextension~=3.6.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (3.6.0)\n", + "Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (5.1.1)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (5.2.0)\n", + "Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (7.1.2)\n", + "Requirement already satisfied: psutil in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (5.9.0)\n", + "Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (6.1)\n", + "Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (1.5.1)\n", + "Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (1.5.4)\n", + "Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (0.1.3)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.7.5)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (5.1.1)\n", + "Requirement already satisfied: pygments>=2.4.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.11.2)\n", + "Requirement already satisfied: stack-data in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.0)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (3.0.27)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.0)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.18.1)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (4.8.0)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.8.3)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (0.4)\n", + "Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (22.3.0)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (4.9.2)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets->nemo_toolkit[all]==1.5.1) (4.4.0)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.18.1)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.5)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (6.4.1)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (1.8.0)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.13.1)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.13.3)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (3.0.3)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (6.4.4)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (21.3.0)\n", + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.21)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.1.1)\n", + "Requirement already satisfied: resampy>=0.2.2 in /opt/conda/lib/python3.8/site-packages (from librosa->nemo_toolkit[all]==1.5.1) (0.2.2)\n", + "Requirement already satisfied: pooch>=1.0 in /opt/conda/lib/python3.8/site-packages (from librosa->nemo_toolkit[all]==1.5.1) (1.6.0)\n", + "Requirement already satisfied: audioread>=2.1.5 in /opt/conda/lib/python3.8/site-packages (from librosa->nemo_toolkit[all]==1.5.1) (2.1.9)\n", + "Requirement already satisfied: llvmlite<0.37,>=0.36.0rc1 in /opt/conda/lib/python3.8/site-packages (from numba->nemo_toolkit[all]==1.5.1) (0.36.0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: threadpoolctl>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from scikit-learn->nemo_toolkit[all]==1.5.1) (3.1.0)\n", + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.7.1)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.5.13)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (4.1.0)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.8.4)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (1.5.0)\n", + "Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.6.0)\n", + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.1.2)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.5.1)\n", + "Requirement already satisfied: pytz>=2017.3 in /opt/conda/lib/python3.8/site-packages (from pandas->nemo_toolkit[all]==1.5.1) (2021.3)\n", + "Requirement already satisfied: pip in /opt/conda/lib/python3.8/site-packages (from pip-api->isort[requirements]<5->nemo_toolkit[all]==1.5.1) (21.2.4)\n", + "Requirement already satisfied: yarg in /opt/conda/lib/python3.8/site-packages (from pipreqs->isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.1.9)\n", + "Requirement already satisfied: docopt in /opt/conda/lib/python3.8/site-packages (from pipreqs->isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.6.2)\n", + "Requirement already satisfied: simplejson>=3.8.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.core->nemo_toolkit[all]==1.5.1) (3.17.6)\n", + "Requirement already satisfied: sortedcontainers>=2.0.4 in /opt/conda/lib/python3.8/site-packages (from pyannote.core->nemo_toolkit[all]==1.5.1) (2.4.0)\n", + "Requirement already satisfied: tabulate>=0.7.7 in /opt/conda/lib/python3.8/site-packages (from pyannote.metrics->nemo_toolkit[all]==1.5.1) (0.8.9)\n", + "Requirement already satisfied: pyannote.database>=4.0.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.metrics->nemo_toolkit[all]==1.5.1) (4.1.3)\n", + "Requirement already satisfied: sympy>=1.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.metrics->nemo_toolkit[all]==1.5.1) (1.10.1)\n", + "Requirement already satisfied: typer[all]>=0.2.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (0.4.0)\n", + "Requirement already satisfied: mpmath>=0.19 in /opt/conda/lib/python3.8/site-packages (from sympy>=1.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (1.2.1)\n", + "Requirement already satisfied: colorama<0.5.0,>=0.4.3 in /opt/conda/lib/python3.8/site-packages (from typer[all]>=0.2.1->pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (0.4.4)\n", + "Requirement already satisfied: shellingham<2.0.0,>=1.3.0 in /opt/conda/lib/python3.8/site-packages (from typer[all]>=0.2.1->pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (1.4.0)\n", + "Requirement already satisfied: py>=1.8.2 in /opt/conda/lib/python3.8/site-packages (from pytest->nemo_toolkit[all]==1.5.1) (1.11.0)\n", + "Requirement already satisfied: iniconfig in /opt/conda/lib/python3.8/site-packages (from pytest->nemo_toolkit[all]==1.5.1) (1.1.1)\n", + "Requirement already satisfied: pluggy<2.0,>=0.12 in /opt/conda/lib/python3.8/site-packages (from pytest->nemo_toolkit[all]==1.5.1) (1.0.0)\n", + "Requirement already satisfied: jarowinkler<1.1.0,>=1.0.2 in /opt/conda/lib/python3.8/site-packages (from rapidfuzz->nemo_toolkit[all]==1.5.1) (1.0.2)\n", + "Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.7.1)\n", + "Requirement already satisfied: ruamel.yaml.clib>=0.2.6 in /opt/conda/lib/python3.8/site-packages (from ruamel.yaml->nemo_toolkit[all]==1.5.1) (0.2.6)\n", + "Requirement already satisfied: portalocker in /opt/conda/lib/python3.8/site-packages (from sacrebleu[ja]->nemo_toolkit[all]==1.5.1) (2.4.0)\n", + "Requirement already satisfied: ipadic<2.0,>=1.0 in /opt/conda/lib/python3.8/site-packages (from sacrebleu[ja]->nemo_toolkit[all]==1.5.1) (1.0.0)\n", + "Requirement already satisfied: mecab-python3==1.0.3 in /opt/conda/lib/python3.8/site-packages (from sacrebleu[ja]->nemo_toolkit[all]==1.5.1) (1.0.3)\n", + "Requirement already satisfied: sphinxcontrib-htmlhelp>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (2.0.0)\n", + "Requirement already satisfied: alabaster<0.8,>=0.7 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (0.7.12)\n", + "Requirement already satisfied: babel>=1.3 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (2.9.1)\n", + "Requirement already satisfied: sphinxcontrib-serializinghtml>=1.1.5 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.1.5)\n", + "Requirement already satisfied: sphinxcontrib-devhelp in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.2)\n", + "Requirement already satisfied: sphinxcontrib-jsmath in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.1)\n", + "Requirement already satisfied: sphinxcontrib-qthelp in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.3)\n", + "Requirement already satisfied: snowballstemmer>=1.1 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (2.2.0)\n", + "Requirement already satisfied: imagesize in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.3.0)\n", + "Requirement already satisfied: sphinxcontrib-applehelp in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.2)\n", + "Requirement already satisfied: docutils<0.18,>=0.14 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (0.17.1)\n", + "Requirement already satisfied: pybtex-docutils>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from sphinxcontrib-bibtex->nemo_toolkit[all]==1.5.1) (1.0.1)\n", + "Requirement already satisfied: pybtex>=0.24 in /opt/conda/lib/python3.8/site-packages (from sphinxcontrib-bibtex->nemo_toolkit[all]==1.5.1) (0.24.0)\n", + "Requirement already satisfied: latexcodec>=1.0.4 in /opt/conda/lib/python3.8/site-packages (from pybtex>=0.24->sphinxcontrib-bibtex->nemo_toolkit[all]==1.5.1) (2.0.1)\n", + "Requirement already satisfied: pure-eval in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.2)\n", + "Requirement already satisfied: asttokens in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.0.5)\n", + "Requirement already satisfied: executing in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.8.3)\n", + "Requirement already satisfied: pathtools in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (0.1.2)\n", + "Requirement already satisfied: setproctitle in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (1.2.3)\n", + "Requirement already satisfied: GitPython>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (3.1.27)\n", + "Requirement already satisfied: sentry-sdk>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (1.5.10)\n", + "Requirement already satisfied: shortuuid>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (1.0.8)\n", + "Requirement already satisfied: docker-pycreds>=0.4.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (0.4.0)\n", + "Requirement already satisfied: promise<3,>=2.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (2.3)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: gitdb<5,>=4.0.1 in /opt/conda/lib/python3.8/site-packages (from GitPython>=1.0.0->wandb->nemo_toolkit[all]==1.5.1) (4.0.9)\n", + "Requirement already satisfied: smmap<6,>=3.0.1 in /opt/conda/lib/python3.8/site-packages (from gitdb<5,>=4.0.1->GitPython>=1.0.0->wandb->nemo_toolkit[all]==1.5.1) (5.0.0)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "# Install dependencies\n", + "!pip install wget\n", + "!apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y libsndfile1 ffmpeg\n", + "!pip install Cython\n", + "\n", + "## Install NeMo\n", + "!pip install nemo_toolkit[all]==1.5.1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 2. Download Citrinet model\n", + "\n", + "Next, we download a pretrained Nemo Citrinet model and convert it to a Torchscript module:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import nemo\n", + "import torch\n", + "\n", + "import nemo.collections.asr as nemo_asr\n", + "from nemo.core import typecheck\n", + "typecheck.set_typecheck_enabled(False) " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading and saving stt_en_citrinet_256...\n", + "[NeMo I 2022-04-21 23:12:45 cloud:56] Found existing object /root/.cache/torch/NeMo/NeMo_1.5.1/stt_en_citrinet_256/91a9cc5850784b2065e8a0aa3d526fd9/stt_en_citrinet_256.nemo.\n", + "[NeMo I 2022-04-21 23:12:45 cloud:62] Re-using file from: /root/.cache/torch/NeMo/NeMo_1.5.1/stt_en_citrinet_256/91a9cc5850784b2065e8a0aa3d526fd9/stt_en_citrinet_256.nemo\n", + "[NeMo I 2022-04-21 23:12:45 common:728] Instantiating model from pre-trained checkpoint\n", + "[NeMo I 2022-04-21 23:12:46 mixins:146] Tokenizer SentencePieceTokenizer initialized with 1024 tokens\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[NeMo W 2022-04-21 23:12:47 modelPT:130] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.\n", + " Train config : \n", + " manifest_filepath: null\n", + " sample_rate: 16000\n", + " batch_size: 32\n", + " trim_silence: true\n", + " max_duration: 16.7\n", + " shuffle: true\n", + " is_tarred: false\n", + " tarred_audio_filepaths: null\n", + " use_start_end_token: false\n", + " \n", + "[NeMo W 2022-04-21 23:12:47 modelPT:137] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s). \n", + " Validation config : \n", + " manifest_filepath: null\n", + " sample_rate: 16000\n", + " batch_size: 32\n", + " shuffle: false\n", + " use_start_end_token: false\n", + " \n", + "[NeMo W 2022-04-21 23:12:47 modelPT:143] Please call the ModelPT.setup_test_data() or ModelPT.setup_multiple_test_data() method and provide a valid configuration file to setup the test data loader(s).\n", + " Test config : \n", + " manifest_filepath: null\n", + " sample_rate: 16000\n", + " batch_size: 32\n", + " shuffle: false\n", + " use_start_end_token: false\n", + " \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[NeMo I 2022-04-21 23:12:47 features:265] PADDING: 16\n", + "[NeMo I 2022-04-21 23:12:47 features:282] STFT using torch\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[NeMo W 2022-04-21 23:12:47 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/nemo/collections/asr/parts/preprocessing/features.py:315: FutureWarning: Pass sr=16000, n_fft=512 as keyword args. From version 0.10 passing these as positional arguments will result in an error\n", + " librosa.filters.mel(sample_rate, self.n_fft, n_mels=nfilt, fmin=lowfreq, fmax=highfreq), dtype=torch.float\n", + " \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[NeMo I 2022-04-21 23:12:49 save_restore_connector:149] Model EncDecCTCModelBPE was successfully restored from /root/.cache/torch/NeMo/NeMo_1.5.1/stt_en_citrinet_256/91a9cc5850784b2065e8a0aa3d526fd9/stt_en_citrinet_256.nemo.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[NeMo W 2022-04-21 23:12:49 export_utils:198] Swapped 0 modules\n", + "[NeMo W 2022-04-21 23:12:49 conv_asr:73] Turned off 235 masked convolutions\n", + "[NeMo W 2022-04-21 23:12:49 export_utils:198] Swapped 0 modules\n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/jit/_trace.py:916: UserWarning: `optimize` is deprecated and has no effect. Use `with torch.jit.optimized_execution() instead\n", + " warnings.warn(\n", + " \n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:668: LightningDeprecationWarning: The `LightningModule.model_size` property was deprecated in v1.5 and will be removed in v1.7. Please use the `pytorch_lightning.utilities.memory.get_model_size_mb`.\n", + " if hasattr(mod, name):\n", + " \n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:669: LightningDeprecationWarning: The `LightningModule.model_size` property was deprecated in v1.5 and will be removed in v1.7. Please use the `pytorch_lightning.utilities.memory.get_model_size_mb`.\n", + " item = getattr(mod, name)\n", + " \n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:668: LightningDeprecationWarning: `LightningModule.use_amp` was deprecated in v1.6 and will be removed in v1.8. Please use `Trainer.amp_backend`.\n", + " if hasattr(mod, name):\n", + " \n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:669: LightningDeprecationWarning: `LightningModule.use_amp` was deprecated in v1.6 and will be removed in v1.8. Please use `Trainer.amp_backend`.\n", + " item = getattr(mod, name)\n", + " \n" + ] + }, + { + "data": { + "text/plain": [ + "(['stt_en_citrinet_256.ts'],\n", + " ['nemo.collections.asr.models.ctc_bpe_models.EncDecCTCModelBPE exported to ONNX'])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "variant = 'stt_en_citrinet_256'\n", + "\n", + "print(f\"Downloading and saving {variant}...\")\n", + "asr_model = nemo_asr.models.EncDecCTCModelBPE.from_pretrained(model_name=variant)\n", + "asr_model.export(f\"{variant}.ts\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Benchmark utility\n", + "\n", + "Let us define a helper benchmarking function, then benchmark the original Pytorch model." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading model: stt_en_citrinet_256.ts\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256.ts =================================\n", + "batch size=1, num iterations=50\n", + " Median samples/s: 102.0, mean: 102.0\n", + " Median latency (s): 0.009802, mean: 0.009803, 99th_p: 0.009836, std_dev: 0.000014\n", + "\n", + "Loading model: stt_en_citrinet_256.ts\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256.ts =================================\n", + "batch size=8, num iterations=50\n", + " Median samples/s: 429.1, mean: 429.1\n", + " Median latency (s): 0.018642, mean: 0.018643, 99th_p: 0.018670, std_dev: 0.000014\n", + "\n", + "Loading model: stt_en_citrinet_256.ts\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256.ts =================================\n", + "batch size=32, num iterations=50\n", + " Median samples/s: 551.3, mean: 551.2\n", + " Median latency (s): 0.058047, mean: 0.058053, 99th_p: 0.058375, std_dev: 0.000106\n", + "\n", + "Loading model: stt_en_citrinet_256.ts\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256.ts =================================\n", + "batch size=128, num iterations=50\n", + " Median samples/s: 594.1, mean: 594.1\n", + " Median latency (s): 0.215434, mean: 0.215446, 99th_p: 0.215806, std_dev: 0.000116\n", + "\n" + ] + } + ], + "source": [ + "from __future__ import print_function\n", + "from __future__ import absolute_import\n", + "from __future__ import division\n", + "\n", + "import argparse\n", + "import timeit\n", + "import numpy as np\n", + "import torch\n", + "import torch_tensorrt as trtorch\n", + "import torch.backends.cudnn as cudnn\n", + "\n", + "def benchmark(model, input_tensor, num_loops, model_name, batch_size):\n", + " def timeGraph(model, input_tensor, num_loops):\n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(20):\n", + " features = model(input_tensor)\n", + "\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(num_loops):\n", + " start_time = timeit.default_timer()\n", + " features = model(input_tensor)\n", + " torch.cuda.synchronize()\n", + " end_time = timeit.default_timer()\n", + " timings.append(end_time - start_time)\n", + " # print(\"Iteration {}: {:.6f} s\".format(i, end_time - start_time))\n", + " return timings\n", + " def printStats(graphName, timings, batch_size):\n", + " times = np.array(timings)\n", + " steps = len(times)\n", + " speeds = batch_size / times\n", + " time_mean = np.mean(times)\n", + " time_med = np.median(times)\n", + " time_99th = np.percentile(times, 99)\n", + " time_std = np.std(times, ddof=0)\n", + " speed_mean = np.mean(speeds)\n", + " speed_med = np.median(speeds)\n", + " msg = (\"\\n%s =================================\\n\"\n", + " \"batch size=%d, num iterations=%d\\n\"\n", + " \" Median samples/s: %.1f, mean: %.1f\\n\"\n", + " \" Median latency (s): %.6f, mean: %.6f, 99th_p: %.6f, std_dev: %.6f\\n\"\n", + " ) % (graphName,\n", + " batch_size, steps,\n", + " speed_med, speed_mean,\n", + " time_med, time_mean, time_99th, time_std)\n", + " print(msg)\n", + " timings = timeGraph(model, input_tensor, num_loops)\n", + " printStats(model_name, timings, batch_size)\n", + "\n", + "precisions_str = 'fp32' # Precision (default=fp32, fp16)\n", + "variant = 'stt_en_citrinet_256' # Nemo Citrinet variant\n", + "batch_sizes = [1, 8, 32, 128] # Batch sizes (default=1,8,32,128)\n", + "trt = False # If True, infer with Torch-TensorRT engine. Else, infer with Pytorch model.\n", + "precision = torch.float32 if precisions_str =='fp32' else torch.float16\n", + "\n", + "for batch_size in batch_sizes:\n", + " if trt:\n", + " model_name = f\"{variant}_bs{batch_size}_{precision}.torch-tensorrt\"\n", + " else:\n", + " model_name = f\"{variant}.ts\"\n", + "\n", + " print(f\"Loading model: {model_name}\") \n", + " # Load traced model to CPU first\n", + " model = torch.jit.load(model_name).cuda()\n", + " cudnn.benchmark = True\n", + " # Create random input tensor of certain size\n", + " torch.manual_seed(12345)\n", + " input_shape=(batch_size, 80, 1488)\n", + " input_tensor = torch.randn(input_shape).cuda()\n", + "\n", + " # Timing graph inference\n", + " benchmark(model, input_tensor, 50, model_name, batch_size)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Confirming the GPU we are using here:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Thu Apr 21 23:13:32 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 510.47.03 Driver Version: 510.47.03 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA TITAN V On | 00000000:17:00.0 Off | N/A |\n", + "| 38% 55C P2 42W / 250W | 2462MiB / 12288MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + "| 1 NVIDIA TITAN V On | 00000000:65:00.0 Off | N/A |\n", + "| 28% 39C P8 26W / 250W | 112MiB / 12288MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| 0 N/A N/A 3909 G 4MiB |\n", + "| 0 N/A N/A 6047 C 2453MiB |\n", + "| 1 N/A N/A 3909 G 39MiB |\n", + "| 1 N/A N/A 4161 G 67MiB |\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 3. Create Torch-TensorRT modules\n", + "\n", + "In this step, we optimize the Citrinet Torchscript module with Torch-TensorRT with various precisions and batch sizes." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating Torchscript-TensorRT module for batchsize 1 precision torch.float32\n", + "Generating Torchscript-TensorRT module for batchsize 8 precision torch.float32\n", + "Generating Torchscript-TensorRT module for batchsize 32 precision torch.float32\n", + "Generating Torchscript-TensorRT module for batchsize 128 precision torch.float32\n", + "Generating Torchscript-TensorRT module for batchsize 1 precision torch.float16\n", + "Generating Torchscript-TensorRT module for batchsize 8 precision torch.float16\n", + "Generating Torchscript-TensorRT module for batchsize 32 precision torch.float16\n", + "Generating Torchscript-TensorRT module for batchsize 128 precision torch.float16\n" + ] + } + ], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "import torch_tensorrt as torchtrt\n", + "import argparse\n", + "\n", + "variant = \"stt_en_citrinet_256\"\n", + "precisions = [torch.float, torch.half]\n", + "batch_sizes = [1,8,32,128]\n", + "\n", + "model = torch.jit.load(f\"{variant}.ts\")\n", + "\n", + "for precision in precisions:\n", + " for batch_size in batch_sizes:\n", + " compile_settings = {\n", + " \"inputs\": [torchtrt.Input(shape=[batch_size, 80, 1488])],\n", + " \"enabled_precisions\": {precision},\n", + " \"workspace_size\": 2000000000,\n", + " \"truncate_long_and_double\": True,\n", + " }\n", + " print(f\"Generating Torchscript-TensorRT module for batchsize {batch_size} precision {precision}\")\n", + " trt_ts_module = torchtrt.compile(model, **compile_settings)\n", + " torch.jit.save(trt_ts_module, f\"{variant}_bs{batch_size}_{precision}.torch-tensorrt\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 4. Benchmark Torch-TensorRT models\n", + "\n", + "Finally, we are ready to benchmark the Torch-TensorRT optimized Citrinet models." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP32 (single precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading model: stt_en_citrinet_256_bs1_torch.float32.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs1_torch.float32.torch-tensorrt =================================\n", + "batch size=1, num iterations=50\n", + " Median samples/s: 242.2, mean: 218.0\n", + " Median latency (s): 0.004128, mean: 0.004825, 99th_p: 0.008071, std_dev: 0.001270\n", + "\n", + "Loading model: stt_en_citrinet_256_bs8_torch.float32.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs8_torch.float32.torch-tensorrt =================================\n", + "batch size=8, num iterations=50\n", + " Median samples/s: 729.9, mean: 709.0\n", + " Median latency (s): 0.010961, mean: 0.011388, 99th_p: 0.016114, std_dev: 0.001256\n", + "\n", + "Loading model: stt_en_citrinet_256_bs32_torch.float32.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs32_torch.float32.torch-tensorrt =================================\n", + "batch size=32, num iterations=50\n", + " Median samples/s: 955.6, mean: 953.4\n", + " Median latency (s): 0.033488, mean: 0.033572, 99th_p: 0.035722, std_dev: 0.000545\n", + "\n", + "Loading model: stt_en_citrinet_256_bs128_torch.float32.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs128_torch.float32.torch-tensorrt =================================\n", + "batch size=128, num iterations=50\n", + " Median samples/s: 1065.8, mean: 1069.4\n", + " Median latency (s): 0.120097, mean: 0.119708, 99th_p: 0.121618, std_dev: 0.001260\n", + "\n" + ] + } + ], + "source": [ + "precisions_str = 'fp32' # Precision (default=fp32, fp16)\n", + "batch_sizes = [1, 8, 32, 128] # Batch sizes (default=1,8,32,128)\n", + "precision = torch.float32 if precisions_str =='fp32' else torch.float16\n", + "trt = True\n", + "\n", + "for batch_size in batch_sizes:\n", + " if trt:\n", + " model_name = f\"{variant}_bs{batch_size}_{precision}.torch-tensorrt\"\n", + " else:\n", + " model_name = f\"{variant}.ts\"\n", + "\n", + " print(f\"Loading model: {model_name}\") \n", + " # Load traced model to CPU first\n", + " model = torch.jit.load(model_name).cuda()\n", + " cudnn.benchmark = True\n", + " # Create random input tensor of certain size\n", + " torch.manual_seed(12345)\n", + " input_shape=(batch_size, 80, 1488)\n", + " input_tensor = torch.randn(input_shape).cuda()\n", + "\n", + " # Timing graph inference\n", + " benchmark(model, input_tensor, 50, model_name, batch_size)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP16 (half precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading model: stt_en_citrinet_256_bs1_torch.float16.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs1_torch.float16.torch-tensorrt =================================\n", + "batch size=1, num iterations=50\n", + " Median samples/s: 288.9, mean: 272.9\n", + " Median latency (s): 0.003462, mean: 0.003774, 99th_p: 0.006846, std_dev: 0.000820\n", + "\n", + "Loading model: stt_en_citrinet_256_bs8_torch.float16.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs8_torch.float16.torch-tensorrt =================================\n", + "batch size=8, num iterations=50\n", + " Median samples/s: 1201.0, mean: 1190.9\n", + " Median latency (s): 0.006661, mean: 0.006733, 99th_p: 0.008453, std_dev: 0.000368\n", + "\n", + "Loading model: stt_en_citrinet_256_bs32_torch.float16.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs32_torch.float16.torch-tensorrt =================================\n", + "batch size=32, num iterations=50\n", + " Median samples/s: 1538.2, mean: 1516.4\n", + " Median latency (s): 0.020804, mean: 0.021143, 99th_p: 0.024492, std_dev: 0.000973\n", + "\n", + "Loading model: stt_en_citrinet_256_bs128_torch.float16.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs128_torch.float16.torch-tensorrt =================================\n", + "batch size=128, num iterations=50\n", + " Median samples/s: 1792.0, mean: 1777.0\n", + " Median latency (s): 0.071428, mean: 0.072057, 99th_p: 0.076796, std_dev: 0.001351\n", + "\n" + ] + } + ], + "source": [ + "precisions_str = 'fp16' # Precision (default=fp32, fp16)\n", + "batch_sizes = [1, 8, 32, 128] # Batch sizes (default=1,8,32,128)\n", + "precision = torch.float32 if precisions_str =='fp32' else torch.float16\n", + "\n", + "for batch_size in batch_sizes:\n", + " if trt:\n", + " model_name = f\"{variant}_bs{batch_size}_{precision}.torch-tensorrt\"\n", + " else:\n", + " model_name = f\"{variant}.ts\"\n", + "\n", + " print(f\"Loading model: {model_name}\") \n", + " # Load traced model to CPU first\n", + " model = torch.jit.load(model_name).cuda()\n", + " cudnn.benchmark = True\n", + " # Create random input tensor of certain size\n", + " torch.manual_seed(12345)\n", + " input_shape=(batch_size, 80, 1488)\n", + " input_tensor = torch.randn(input_shape).cuda()\n", + "\n", + " # Timing graph inference\n", + " benchmark(model, input_tensor, 50, model_name, batch_size)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 5. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of optimizing the Citrinet model with Torch-TensorRT. On an A100 GPU, with Torch-TensorRT, we observe a speedup of ~**2.4X** with FP32, and ~**2.9X** with FP16 at batchsize of 128.\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. Fill out issues at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.1.1/_notebooks/EfficientNet-example.html b/docs/v1.1.1/_notebooks/EfficientNet-example.html new file mode 100644 index 0000000000..fa4c6e6164 --- /dev/null +++ b/docs/v1.1.1/_notebooks/EfficientNet-example.html @@ -0,0 +1,1810 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Torch-TensorRT Getting Started - EfficientNet-B0 — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+
+
[1]:
+
+
+
+
+
+
+# Copyright 2019 NVIDIA Corporation. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
+
+
+

+ 0ec51db838fc4f1e8ba7341f9752d33c +

+

+ Torch-TensorRT Getting Started - EfficientNet-B0 + + ¶ + +

+

+ Overview + + ¶ + +

+

+ In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the +best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch’s JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new +world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference. +

+

+ When deploying on NVIDIA GPUs TensorRT, NVIDIA’s Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA’s Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that +perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device. +

+

+ Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch. +

+

+ Learning objectives + + ¶ + +

+

+ This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained EfficientNet network, and running it to test the speedup obtained. +

+

+ Content + + ¶ + +

+
    +
  1. +

    + + Requirements + +

    +
  2. +
  3. +

    + + EfficientNet Overview + +

    +
  4. +
  5. +

    + + Running the model without optimizations + +

    +
  6. +
  7. +

    + + Accelerating with Torch-TensorRT + +

    +
  8. +
  9. +

    + + Conclusion + +

    +
  10. +
+
+
+
+
[1]:
+
+
+
+
+
+
+!pip install timm==0.4.12
+!nvidia-smi
+
+
+
+
+
+
+
+
+
+
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Collecting timm==0.4.12
+  Downloading timm-0.4.12-py3-none-any.whl (376 kB)
+     |████████████████████████████████| 376 kB 11.9 MB/s eta 0:00:01
+Requirement already satisfied: torch>=1.4 in /opt/conda/lib/python3.8/site-packages (from timm==0.4.12) (1.11.0a0+bfe5ad2)
+Requirement already satisfied: torchvision in /opt/conda/lib/python3.8/site-packages (from timm==0.4.12) (0.12.0a0)
+Requirement already satisfied: typing_extensions in /opt/conda/lib/python3.8/site-packages (from torch>=1.4->timm==0.4.12) (4.0.1)
+Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in /opt/conda/lib/python3.8/site-packages (from torchvision->timm==0.4.12) (8.2.0)
+Requirement already satisfied: numpy in /opt/conda/lib/python3.8/site-packages (from torchvision->timm==0.4.12) (1.22.0)
+Installing collected packages: timm
+Successfully installed timm-0.4.12
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+Fri Feb  4 21:29:36 2022
++-----------------------------------------------------------------------------+
+| NVIDIA-SMI 510.39.01    Driver Version: 510.39.01    CUDA Version: 11.6     |
+|-------------------------------+----------------------+----------------------+
+| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
+| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
+|                               |                      |               MIG M. |
+|===============================+======================+======================|
+|   0  NVIDIA GeForce ...  On   | 00000000:65:00.0 Off |                  N/A |
+| 30%   28C    P8    11W / 350W |      0MiB / 24576MiB |      0%      Default |
+|                               |                      |                  N/A |
++-------------------------------+----------------------+----------------------+
+
++-----------------------------------------------------------------------------+
+| Processes:                                                                  |
+|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
+|        ID   ID                                                   Usage      |
+|=============================================================================|
+|  No running processes found                                                 |
++-----------------------------------------------------------------------------+
+
+
+
+
+

+ ## 1. Requirements +

+

+ NVIDIA’s NGC provides PyTorch Docker Container which contains PyTorch and Torch-TensorRT. We can make use of + + latest pytorch + + container to run this notebook. +

+

+ Otherwise, you can follow the steps in + + + notebooks/README + + + to prepare a Docker container yourself, within which you can run this demo notebook. +

+

+ ## 2. EfficientNet Overview +

+

+ PyTorch has a model repository called + + + timm + + + , which is a source for high quality implementations of computer vision models. We can get our EfficientNet model from there pretrained on ImageNet. +

+

+ Model Description + + ¶ + +

+

+ This model is based on the + + EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks + + paper. +

+

+ alt +

+

+ ## 3. Running the model without optimizations +

+

+ PyTorch has a model repository called + + + timm + + + , which is a source for high quality implementations of computer vision models. We can get our EfficientNet model from there pretrained on ImageNet. +

+
+
+
+
[4]:
+
+
+
+
+
+
+import torch
+import torch_tensorrt
+import timm
+import time
+import numpy as np
+import torch.backends.cudnn as cudnn
+from timm.data import resolve_data_config
+from timm.data.transforms_factory import create_transform
+import json
+
+efficientnet_b0_model = timm.create_model('efficientnet_b0',pretrained=True)
+model = efficientnet_b0_model.eval().to("cuda")
+
+
+
+
+

+ With our model loaded, let’s proceed to downloading some images! +

+
+
+
+
[5]:
+
+
+
+
+
+
+!mkdir -p ./data
+!wget  -O ./data/img0.JPG "https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630"
+!wget  -O ./data/img1.JPG "https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg"
+!wget  -O ./data/img2.JPG "https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg"
+!wget  -O ./data/img3.JPG "https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg"
+
+!wget  -O ./data/imagenet_class_index.json "https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json"
+
+
+
+
+
+
+
+
+
+
+--2022-02-04 21:30:07--  https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630
+Resolving d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)... 18.65.227.127, 18.65.227.37, 18.65.227.99, ...
+Connecting to d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)|18.65.227.127|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 24112 (24K) [image/jpeg]
+Saving to: ‘./data/img0.JPG’
+
+./data/img0.JPG     100%[===================>]  23.55K  --.-KB/s    in 0.004s
+
+2022-02-04 21:30:07 (6.40 MB/s) - ‘./data/img0.JPG’ saved [24112/24112]
+
+--2022-02-04 21:30:07--  https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg
+Resolving www.hakaimagazine.com (www.hakaimagazine.com)... 164.92.73.117
+Connecting to www.hakaimagazine.com (www.hakaimagazine.com)|164.92.73.117|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 452718 (442K) [image/jpeg]
+Saving to: ‘./data/img1.JPG’
+
+./data/img1.JPG     100%[===================>] 442.11K  --.-KB/s    in 0.06s
+
+2022-02-04 21:30:07 (6.83 MB/s) - ‘./data/img1.JPG’ saved [452718/452718]
+
+--2022-02-04 21:30:08--  https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg
+Resolving www.artis.nl (www.artis.nl)... 94.75.225.20
+Connecting to www.artis.nl (www.artis.nl)|94.75.225.20|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 361413 (353K) [image/jpeg]
+Saving to: ‘./data/img2.JPG’
+
+./data/img2.JPG     100%[===================>] 352.94K   246KB/s    in 1.4s
+
+2022-02-04 21:30:10 (246 KB/s) - ‘./data/img2.JPG’ saved [361413/361413]
+
+--2022-02-04 21:30:10--  https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg
+Resolving www.familyhandyman.com (www.familyhandyman.com)... 104.18.202.107, 104.18.201.107, 2606:4700::6812:ca6b, ...
+Connecting to www.familyhandyman.com (www.familyhandyman.com)|104.18.202.107|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 90994 (89K) [image/jpeg]
+Saving to: ‘./data/img3.JPG’
+
+./data/img3.JPG     100%[===================>]  88.86K  --.-KB/s    in 0.006s
+
+2022-02-04 21:30:10 (14.4 MB/s) - ‘./data/img3.JPG’ saved [90994/90994]
+
+--2022-02-04 21:30:11--  https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json
+Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.216.133.45
+Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.216.133.45|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 35363 (35K) [application/octet-stream]
+Saving to: ‘./data/imagenet_class_index.json’
+
+./data/imagenet_cla 100%[===================>]  34.53K  --.-KB/s    in 0.07s
+
+2022-02-04 21:30:11 (474 KB/s) - ‘./data/imagenet_class_index.json’ saved [35363/35363]
+
+
+
+
+
+

+ All pre-trained models expect input images normalized in the same way, i.e. mini-batches of 3-channel RGB images of shape + + + (3 + + + x + + + H + + + x + + + W) + + + , where + + + H + + + and + + + W + + + are expected to be at least + + + 224 + + + . The images have to be loaded in to a range of + + + [0, + + + 1] + + + and then normalized using + + + mean + + + = + + + [0.485, + + + 0.456, + + + 0.406] + + + and + + + std + + + = + + + [0.229, + + + 0.224, + + + 0.225] + + + . +

+

+ Here’s a sample execution. +

+
+
+
+
[6]:
+
+
+
+
+
+
+from PIL import Image
+from torchvision import transforms
+import matplotlib.pyplot as plt
+
+fig, axes = plt.subplots(nrows=2, ncols=2)
+
+for i in range(4):
+    img_path = './data/img%d.JPG'%i
+    img = Image.open(img_path)
+    preprocess = transforms.Compose([
+        transforms.Resize(256),
+        transforms.CenterCrop(224),
+        transforms.ToTensor(),
+        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
+    ])
+    input_tensor = preprocess(img)
+    plt.subplot(2,2,i+1)
+    plt.imshow(img)
+    plt.axis('off')
+
+# loading labels
+with open("./data/imagenet_class_index.json") as json_file:
+    d = json.load(json_file)
+
+
+
+
+
+
+
+
+ ../_images/_notebooks_EfficientNet-example_12_0.png +
+
+

+ Throughout this tutorial, we will be making use of some utility functions; + + + efficientnet_preprocess + + + for preprocessing input images, + + + predict + + + to use the model for prediction and + + + benchmark + + + to benchmark the inference. You do not need to understand/go through these utilities to make use of Torch TensorRT, but are welecomed to do so if you choose. +

+
+
+
+
[7]:
+
+
+
+
+
+
+cudnn.benchmark = True
+
+def efficientnet_preprocess():
+    config = resolve_data_config({}, model=model)
+    transform = create_transform(**config)
+    return transform
+
+# decode the results into ([predicted class, description], probability)
+def predict(img_path, model):
+    img = Image.open(img_path)
+    preprocess = efficientnet_preprocess()
+    input_tensor = preprocess(img)
+    input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model
+
+    # move the input and model to GPU for speed if available
+    if torch.cuda.is_available():
+        input_batch = input_batch.to('cuda')
+        model.to('cuda')
+
+    with torch.no_grad():
+        output = model(input_batch)
+        # Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes
+        sm_output = torch.nn.functional.softmax(output[0], dim=0)
+
+    ind = torch.argmax(sm_output)
+    return d[str(ind.item())], sm_output[ind] #([predicted class, description], probability)
+
+def benchmark(model, input_shape=(1024, 1, 224, 224), dtype='fp32', nwarmup=50, nruns=10000):
+    input_data = torch.randn(input_shape)
+    input_data = input_data.to("cuda")
+    if dtype=='fp16':
+        input_data = input_data.half()
+
+    print("Warm up ...")
+    with torch.no_grad():
+        for _ in range(nwarmup):
+            features = model(input_data)
+    torch.cuda.synchronize()
+    print("Start timing ...")
+    timings = []
+    with torch.no_grad():
+        for i in range(1, nruns+1):
+            start_time = time.time()
+            features = model(input_data)
+            torch.cuda.synchronize()
+            end_time = time.time()
+            timings.append(end_time - start_time)
+            if i%10==0:
+                print('Iteration %d/%d, avg batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))
+
+    print("Input shape:", input_data.size())
+    print("Output features size:", features.size())
+    print('Average throughput: %.2f images/second'%(input_shape[0]/np.mean(timings)))
+
+
+
+
+

+ With the model downloaded and the util functions written, let’s just quickly see some predictions, and benchmark the model in its current un-optimized state. +

+
+
+
+
[8]:
+
+
+
+
+
+
+for i in range(4):
+    img_path = './data/img%d.JPG'%i
+    img = Image.open(img_path)
+
+    pred, prob = predict(img_path, efficientnet_b0_model)
+    print('{} - Predicted: {}, Probablility: {}'.format(img_path, pred, prob))
+
+    plt.subplot(2,2,i+1)
+    plt.imshow(img);
+    plt.axis('off');
+    plt.title(pred[1])
+
+
+
+
+
+
+
+
+
+
+/opt/conda/lib/python3.8/site-packages/torchvision/transforms/transforms.py:321: UserWarning: Argument interpolation should be of type InterpolationMode instead of int. Please, use InterpolationMode enum.
+  warnings.warn(
+
+
+
+
+
+
+
+
+
+
+./data/img0.JPG - Predicted: ['n02109961', 'Eskimo_dog'], Probablility: 0.3987298309803009
+./data/img1.JPG - Predicted: ['n01537544', 'indigo_bunting'], Probablility: 0.23344755172729492
+./data/img2.JPG - Predicted: ['n02481823', 'chimpanzee'], Probablility: 0.9695423245429993
+./data/img3.JPG - Predicted: ['n01739381', 'vine_snake'], Probablility: 0.227739155292511
+
+
+
+
+
+
+
+
+ ../_images/_notebooks_EfficientNet-example_16_2.png +
+
+
+
+
+
[9]:
+
+
+
+
+
+
+# Model benchmark without Torch-TensorRT
+benchmark(model, input_shape=(128, 3, 224, 224), nruns=100)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, avg batch time 37.62 ms
+Iteration 20/100, avg batch time 37.66 ms
+Iteration 30/100, avg batch time 37.65 ms
+Iteration 40/100, avg batch time 37.66 ms
+Iteration 50/100, avg batch time 37.70 ms
+Iteration 60/100, avg batch time 37.70 ms
+Iteration 70/100, avg batch time 37.70 ms
+Iteration 80/100, avg batch time 37.71 ms
+Iteration 90/100, avg batch time 37.72 ms
+Iteration 100/100, avg batch time 37.72 ms
+Input shape: torch.Size([128, 3, 224, 224])
+Output features size: torch.Size([128, 1000])
+Average throughput: 3393.46 images/second
+
+
+
+
+

+ ## 4. Accelerating with Torch-TensorRT +

+

+ Onwards to the next step, accelerating with Torch TensorRT. In these examples we showcase the results for FP32 (single precision) and FP16 (half precision). We do not demonstrat specific tuning, just showcase the simplicity of usage. If you want to learn more about the possible customizations, visit our + + documentation + + . +

+

+ FP32 (single precision) + + ¶ + +

+
+
+
+
[11]:
+
+
+
+
+
+
+# The compiled module will have precision as specified by "op_precision".
+# Here, it will have FP32 precision.
+trt_model_fp32 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.float32)],
+    enabled_precisions = torch.float32, # Run with FP32
+    workspace_size = 1 << 22
+)
+
+
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+
+
+
+
+
+
+
+
[12]:
+
+
+
+
+
+
+# Obtain the average time taken by a batch of input
+benchmark(trt_model_fp32, input_shape=(128, 3, 224, 224), nruns=100)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, avg batch time 27.86 ms
+Iteration 20/100, avg batch time 27.71 ms
+Iteration 30/100, avg batch time 27.99 ms
+Iteration 40/100, avg batch time 27.95 ms
+Iteration 50/100, avg batch time 27.89 ms
+Iteration 60/100, avg batch time 27.85 ms
+Iteration 70/100, avg batch time 28.00 ms
+Iteration 80/100, avg batch time 27.97 ms
+Iteration 90/100, avg batch time 27.95 ms
+Iteration 100/100, avg batch time 27.92 ms
+Input shape: torch.Size([128, 3, 224, 224])
+Output features size: torch.Size([128, 1000])
+Average throughput: 4584.06 images/second
+
+
+
+
+

+ FP16 (half precision) + + ¶ + +

+
+
+
+
[17]:
+
+
+
+
+
+
+# The compiled module will have precision as specified by "op_precision".
+# Here, it will have FP16 precision.
+trt_model_fp16 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.half)],
+    enabled_precisions = {torch.half}, # Run with FP32
+    workspace_size = 1 << 22
+)
+
+
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float
+The compiler is going to use the user setting Float16
+This conflict may cause an error at runtime due to partial compilation being enabled and therefore
+compatibility with PyTorch's data type convention is required.
+If you do indeed see errors at runtime either:
+- Remove the dtype spec for x.1
+- Disable partial compilation by setting require_full_compilation to True
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT TorchScript Conversion Context] - Tensor DataType is determined at build time for tensors not marked as input or output.
+WARNING: [Torch-TensorRT TorchScript Conversion Context] - Tensor DataType is determined at build time for tensors not marked as input or output.
+
+
+
+
+
+
+
+
[18]:
+
+
+
+
+
+
+# Obtain the average time taken by a batch of input
+benchmark(trt_model_fp16, input_shape=(128, 3, 224, 224), dtype='fp16', nruns=100)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, avg batch time 12.05 ms
+Iteration 20/100, avg batch time 12.56 ms
+Iteration 30/100, avg batch time 12.39 ms
+Iteration 40/100, avg batch time 12.34 ms
+Iteration 50/100, avg batch time 12.33 ms
+Iteration 60/100, avg batch time 12.32 ms
+Iteration 70/100, avg batch time 12.30 ms
+Iteration 80/100, avg batch time 12.28 ms
+Iteration 90/100, avg batch time 12.35 ms
+Iteration 100/100, avg batch time 12.35 ms
+Input shape: torch.Size([128, 3, 224, 224])
+Output features size: torch.Size([128, 1000])
+Average throughput: 10362.23 images/second
+
+
+
+
+

+ ## 5. Conclusion +

+

+ In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT for EfficientNet-B0 model and test the performance impact of the optimization. With Torch-TensorRT, we observe a speedup of + + 1.35x + + with FP32, and + + 3.13x + + with FP16 on an NVIDIA 3090 GPU. These acceleration numbers will vary from GPU to GPU(as well as implementation to implementation based on the ops used) and we encorage you to try out latest generation of Data center compute +cards for maximum acceleration. +

+

+ What’s next + + ¶ + +

+

+ Now it’s time to try Torch-TensorRT on your own model. If you run into any issues, you can fill them at + + https://github.com/NVIDIA/Torch-TensorRT + + . Your involvement will help future development of Torch-TensorRT. +

+
+
+
+
[ ]:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_notebooks/EfficientNet-example.ipynb b/docs/v1.1.1/_notebooks/EfficientNet-example.ipynb new file mode 100644 index 0000000000..31a3dad874 --- /dev/null +++ b/docs/v1.1.1/_notebooks/EfficientNet-example.ipynb @@ -0,0 +1,693 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Torch-TensorRT Getting Started - EfficientNet-B0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch's JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.\n", + "\n", + "When deploying on NVIDIA GPUs TensorRT, NVIDIA's Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA's Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.\n", + "\n", + "Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained EfficientNet network, and running it to test the speedup obtained.\n", + "\n", + "## Content\n", + "1. [Requirements](#1)\n", + "1. [EfficientNet Overview](#2)\n", + "1. [Running the model without optimizations](#3)\n", + "1. [Accelerating with Torch-TensorRT](#4)\n", + "1. [Conclusion](#5)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting timm==0.4.12\n", + " Downloading timm-0.4.12-py3-none-any.whl (376 kB)\n", + "\u001b[K |████████████████████████████████| 376 kB 11.9 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: torch>=1.4 in /opt/conda/lib/python3.8/site-packages (from timm==0.4.12) (1.11.0a0+bfe5ad2)\n", + "Requirement already satisfied: torchvision in /opt/conda/lib/python3.8/site-packages (from timm==0.4.12) (0.12.0a0)\n", + "Requirement already satisfied: typing_extensions in /opt/conda/lib/python3.8/site-packages (from torch>=1.4->timm==0.4.12) (4.0.1)\n", + "Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in /opt/conda/lib/python3.8/site-packages (from torchvision->timm==0.4.12) (8.2.0)\n", + "Requirement already satisfied: numpy in /opt/conda/lib/python3.8/site-packages (from torchvision->timm==0.4.12) (1.22.0)\n", + "Installing collected packages: timm\n", + "Successfully installed timm-0.4.12\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Fri Feb 4 21:29:36 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 510.39.01 Driver Version: 510.39.01 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA GeForce ... On | 00000000:65:00.0 Off | N/A |\n", + "| 30% 28C P8 11W / 350W | 0MiB / 24576MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!pip install timm==0.4.12\n", + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "NVIDIA's NGC provides PyTorch Docker Container which contains PyTorch and Torch-TensorRT. We can make use of [latest pytorch](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch) container to run this notebook.\n", + "\n", + "Otherwise, you can follow the steps in `notebooks/README` to prepare a Docker container yourself, within which you can run this demo notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 2. EfficientNet Overview\n", + "\n", + "\n", + "PyTorch has a model repository called `timm`, which is a source for high quality implementations of computer vision models. We can get our EfficientNet model from there pretrained on ImageNet.\n", + "\n", + "### Model Description\n", + "\n", + "This model is based on the [EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks](https://arxiv.org/abs/1905.11946) paper.\n", + "\n", + "\"alt\"\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 3. Running the model without optimizations\n", + "\n", + "\n", + "PyTorch has a model repository called `timm`, which is a source for high quality implementations of computer vision models. We can get our EfficientNet model from there pretrained on ImageNet." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "import torch\n", + "import torch_tensorrt\n", + "import timm\n", + "import time\n", + "import numpy as np\n", + "import torch.backends.cudnn as cudnn\n", + "from timm.data import resolve_data_config\n", + "from timm.data.transforms_factory import create_transform\n", + "import json \n", + "\n", + "efficientnet_b0_model = timm.create_model('efficientnet_b0',pretrained=True)\n", + "model = efficientnet_b0_model.eval().to(\"cuda\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our model loaded, let's proceed to downloading some images!" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2022-02-04 21:30:07-- https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\n", + "Resolving d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)... 18.65.227.127, 18.65.227.37, 18.65.227.99, ...\n", + "Connecting to d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)|18.65.227.127|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 24112 (24K) [image/jpeg]\n", + "Saving to: ‘./data/img0.JPG’\n", + "\n", + "./data/img0.JPG 100%[===================>] 23.55K --.-KB/s in 0.004s \n", + "\n", + "2022-02-04 21:30:07 (6.40 MB/s) - ‘./data/img0.JPG’ saved [24112/24112]\n", + "\n", + "--2022-02-04 21:30:07-- https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\n", + "Resolving www.hakaimagazine.com (www.hakaimagazine.com)... 164.92.73.117\n", + "Connecting to www.hakaimagazine.com (www.hakaimagazine.com)|164.92.73.117|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 452718 (442K) [image/jpeg]\n", + "Saving to: ‘./data/img1.JPG’\n", + "\n", + "./data/img1.JPG 100%[===================>] 442.11K --.-KB/s in 0.06s \n", + "\n", + "2022-02-04 21:30:07 (6.83 MB/s) - ‘./data/img1.JPG’ saved [452718/452718]\n", + "\n", + "--2022-02-04 21:30:08-- https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\n", + "Resolving www.artis.nl (www.artis.nl)... 94.75.225.20\n", + "Connecting to www.artis.nl (www.artis.nl)|94.75.225.20|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 361413 (353K) [image/jpeg]\n", + "Saving to: ‘./data/img2.JPG’\n", + "\n", + "./data/img2.JPG 100%[===================>] 352.94K 246KB/s in 1.4s \n", + "\n", + "2022-02-04 21:30:10 (246 KB/s) - ‘./data/img2.JPG’ saved [361413/361413]\n", + "\n", + "--2022-02-04 21:30:10-- https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\n", + "Resolving www.familyhandyman.com (www.familyhandyman.com)... 104.18.202.107, 104.18.201.107, 2606:4700::6812:ca6b, ...\n", + "Connecting to www.familyhandyman.com (www.familyhandyman.com)|104.18.202.107|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 90994 (89K) [image/jpeg]\n", + "Saving to: ‘./data/img3.JPG’\n", + "\n", + "./data/img3.JPG 100%[===================>] 88.86K --.-KB/s in 0.006s \n", + "\n", + "2022-02-04 21:30:10 (14.4 MB/s) - ‘./data/img3.JPG’ saved [90994/90994]\n", + "\n", + "--2022-02-04 21:30:11-- https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\n", + "Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.216.133.45\n", + "Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.216.133.45|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 35363 (35K) [application/octet-stream]\n", + "Saving to: ‘./data/imagenet_class_index.json’\n", + "\n", + "./data/imagenet_cla 100%[===================>] 34.53K --.-KB/s in 0.07s \n", + "\n", + "2022-02-04 21:30:11 (474 KB/s) - ‘./data/imagenet_class_index.json’ saved [35363/35363]\n", + "\n" + ] + } + ], + "source": [ + "!mkdir -p ./data\n", + "!wget -O ./data/img0.JPG \"https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\"\n", + "!wget -O ./data/img1.JPG \"https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\"\n", + "!wget -O ./data/img2.JPG \"https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\"\n", + "!wget -O ./data/img3.JPG \"https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\"\n", + "\n", + "!wget -O ./data/imagenet_class_index.json \"https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All pre-trained models expect input images normalized in the same way,\n", + "i.e. mini-batches of 3-channel RGB images of shape `(3 x H x W)`, where `H` and `W` are expected to be at least `224`.\n", + "The images have to be loaded in to a range of `[0, 1]` and then normalized using `mean = [0.485, 0.456, 0.406]`\n", + "and `std = [0.229, 0.224, 0.225]`.\n", + "\n", + "Here's a sample execution." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from PIL import Image\n", + "from torchvision import transforms\n", + "import matplotlib.pyplot as plt\n", + "\n", + "fig, axes = plt.subplots(nrows=2, ncols=2)\n", + "\n", + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " input_tensor = preprocess(img) \n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img)\n", + " plt.axis('off')\n", + "\n", + "# loading labels\n", + "with open(\"./data/imagenet_class_index.json\") as json_file: \n", + " d = json.load(json_file)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Throughout this tutorial, we will be making use of some utility functions; `efficientnet_preprocess` for preprocessing input images, `predict` to use the model for prediction and `benchmark` to benchmark the inference. You do not need to understand/go through these utilities to make use of Torch TensorRT, but are welecomed to do so if you choose." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "cudnn.benchmark = True\n", + "\n", + "def efficientnet_preprocess():\n", + " config = resolve_data_config({}, model=model)\n", + " transform = create_transform(**config)\n", + " return transform\n", + "\n", + "# decode the results into ([predicted class, description], probability)\n", + "def predict(img_path, model):\n", + " img = Image.open(img_path)\n", + " preprocess = efficientnet_preprocess()\n", + " input_tensor = preprocess(img)\n", + " input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model\n", + " \n", + " # move the input and model to GPU for speed if available\n", + " if torch.cuda.is_available():\n", + " input_batch = input_batch.to('cuda')\n", + " model.to('cuda')\n", + "\n", + " with torch.no_grad():\n", + " output = model(input_batch)\n", + " # Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes\n", + " sm_output = torch.nn.functional.softmax(output[0], dim=0)\n", + " \n", + " ind = torch.argmax(sm_output)\n", + " return d[str(ind.item())], sm_output[ind] #([predicted class, description], probability)\n", + "\n", + "def benchmark(model, input_shape=(1024, 1, 224, 224), dtype='fp32', nwarmup=50, nruns=10000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%10==0:\n", + " print('Iteration %d/%d, avg batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output features size:\", features.size())\n", + " print('Average throughput: %.2f images/second'%(input_shape[0]/np.mean(timings)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the model downloaded and the util functions written, let's just quickly see some predictions, and benchmark the model in its current un-optimized state." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/lib/python3.8/site-packages/torchvision/transforms/transforms.py:321: UserWarning: Argument interpolation should be of type InterpolationMode instead of int. Please, use InterpolationMode enum.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "./data/img0.JPG - Predicted: ['n02109961', 'Eskimo_dog'], Probablility: 0.3987298309803009\n", + "./data/img1.JPG - Predicted: ['n01537544', 'indigo_bunting'], Probablility: 0.23344755172729492\n", + "./data/img2.JPG - Predicted: ['n02481823', 'chimpanzee'], Probablility: 0.9695423245429993\n", + "./data/img3.JPG - Predicted: ['n01739381', 'vine_snake'], Probablility: 0.227739155292511\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " \n", + " pred, prob = predict(img_path, efficientnet_b0_model)\n", + " print('{} - Predicted: {}, Probablility: {}'.format(img_path, pred, prob))\n", + "\n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img);\n", + " plt.axis('off');\n", + " plt.title(pred[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 37.62 ms\n", + "Iteration 20/100, avg batch time 37.66 ms\n", + "Iteration 30/100, avg batch time 37.65 ms\n", + "Iteration 40/100, avg batch time 37.66 ms\n", + "Iteration 50/100, avg batch time 37.70 ms\n", + "Iteration 60/100, avg batch time 37.70 ms\n", + "Iteration 70/100, avg batch time 37.70 ms\n", + "Iteration 80/100, avg batch time 37.71 ms\n", + "Iteration 90/100, avg batch time 37.72 ms\n", + "Iteration 100/100, avg batch time 37.72 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average throughput: 3393.46 images/second\n" + ] + } + ], + "source": [ + "# Model benchmark without Torch-TensorRT\n", + "benchmark(model, input_shape=(128, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 4. Accelerating with Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Onwards to the next step, accelerating with Torch TensorRT. In these examples we showcase the results for FP32 (single precision) and FP16 (half precision). We do not demonstrat specific tuning, just showcase the simplicity of usage. If you want to learn more about the possible customizations, visit our [documentation](https://nvidia.github.io/Torch-TensorRT/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP32 (single precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n" + ] + } + ], + "source": [ + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP32 precision.\n", + "trt_model_fp32 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.float32)],\n", + " enabled_precisions = torch.float32, # Run with FP32\n", + " workspace_size = 1 << 22\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 27.86 ms\n", + "Iteration 20/100, avg batch time 27.71 ms\n", + "Iteration 30/100, avg batch time 27.99 ms\n", + "Iteration 40/100, avg batch time 27.95 ms\n", + "Iteration 50/100, avg batch time 27.89 ms\n", + "Iteration 60/100, avg batch time 27.85 ms\n", + "Iteration 70/100, avg batch time 28.00 ms\n", + "Iteration 80/100, avg batch time 27.97 ms\n", + "Iteration 90/100, avg batch time 27.95 ms\n", + "Iteration 100/100, avg batch time 27.92 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average throughput: 4584.06 images/second\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input\n", + "benchmark(trt_model_fp32, input_shape=(128, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP16 (half precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x.1\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Tensor DataType is determined at build time for tensors not marked as input or output.\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Tensor DataType is determined at build time for tensors not marked as input or output.\n" + ] + } + ], + "source": [ + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP16 precision.\n", + "trt_model_fp16 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.half)],\n", + " enabled_precisions = {torch.half}, # Run with FP32\n", + " workspace_size = 1 << 22\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 12.05 ms\n", + "Iteration 20/100, avg batch time 12.56 ms\n", + "Iteration 30/100, avg batch time 12.39 ms\n", + "Iteration 40/100, avg batch time 12.34 ms\n", + "Iteration 50/100, avg batch time 12.33 ms\n", + "Iteration 60/100, avg batch time 12.32 ms\n", + "Iteration 70/100, avg batch time 12.30 ms\n", + "Iteration 80/100, avg batch time 12.28 ms\n", + "Iteration 90/100, avg batch time 12.35 ms\n", + "Iteration 100/100, avg batch time 12.35 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average throughput: 10362.23 images/second\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input\n", + "benchmark(trt_model_fp16, input_shape=(128, 3, 224, 224), dtype='fp16', nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 5. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT for EfficientNet-B0 model and test the performance impact of the optimization. With Torch-TensorRT, we observe a speedup of **1.35x** with FP32, and **3.13x** with FP16 on an NVIDIA 3090 GPU. These acceleration numbers will vary from GPU to GPU(as well as implementation to implementation based on the ops used) and we encorage you to try out latest generation of Data center compute cards for maximum acceleration.\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. If you run into any issues, you can fill them at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.1.1/_notebooks/Hugging-Face-BERT.html b/docs/v1.1.1/_notebooks/Hugging-Face-BERT.html new file mode 100644 index 0000000000..944e888524 --- /dev/null +++ b/docs/v1.1.1/_notebooks/Hugging-Face-BERT.html @@ -0,0 +1,1746 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Masked Language Modeling (MLM) with Hugging Face BERT Transformer — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+
+
[1]:
+
+
+
+
+
+
+# Copyright 2022 NVIDIA Corporation. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
+
+
+

+ 5a241c67493b41feb5c5af93f7b9d7c4 +

+

+ Masked Language Modeling (MLM) with Hugging Face BERT Transformer + + ¶ + +

+

+ Learning objectives + + ¶ + +

+

+ This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained BERT transformer from Hugging Face, and running it to test the speedup obtained. +

+

+ Contents + + ¶ + +

+
    +
  1. +

    + + Requirements + +

    +
  2. +
  3. +

    + + BERT Overview + +

    +
  4. +
  5. +

    + + Creating TorchScript modules + +

    +
  6. +
  7. +

    + + Compiling with Torch-TensorRT + +

    +
  8. +
  9. +

    + + Benchmarking + +

    +
  10. +
  11. +

    + + Conclusion + +

    +
  12. +
+

+ ## 1. Requirements +

+

+ NVIDIA’s NGC provides a PyTorch Docker Container which contains PyTorch and Torch-TensorRT. Starting with version + + + 22.05-py3 + + + , we can make use of + + latest pytorch + + container to run this notebook. +

+

+ Otherwise, you can follow the steps in + + + notebooks/README + + + to prepare a Docker container yourself, within which you can run this demo notebook. +

+
+
+
+
[2]:
+
+
+
+
+
+
+!pip install transformers
+
+
+
+
+
+
+
+
+
+
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Requirement already satisfied: transformers in /opt/conda/lib/python3.8/site-packages (4.18.0)
+Requirement already satisfied: tqdm>=4.27 in /opt/conda/lib/python3.8/site-packages (from transformers) (4.63.0)
+Requirement already satisfied: regex!=2019.12.17 in /opt/conda/lib/python3.8/site-packages (from transformers) (2022.3.15)
+Requirement already satisfied: huggingface-hub<1.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from transformers) (0.5.1)
+Requirement already satisfied: tokenizers!=0.11.3,<0.13,>=0.11.1 in /opt/conda/lib/python3.8/site-packages (from transformers) (0.12.1)
+Requirement already satisfied: numpy>=1.17 in /opt/conda/lib/python3.8/site-packages (from transformers) (1.22.3)
+Requirement already satisfied: sacremoses in /opt/conda/lib/python3.8/site-packages (from transformers) (0.0.49)
+Requirement already satisfied: requests in /opt/conda/lib/python3.8/site-packages (from transformers) (2.27.1)
+Requirement already satisfied: pyyaml>=5.1 in /opt/conda/lib/python3.8/site-packages (from transformers) (6.0)
+Requirement already satisfied: filelock in /opt/conda/lib/python3.8/site-packages (from transformers) (3.6.0)
+Requirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.8/site-packages (from transformers) (21.3)
+Requirement already satisfied: typing-extensions>=3.7.4.3 in /opt/conda/lib/python3.8/site-packages (from huggingface-hub<1.0,>=0.1.0->transformers) (4.1.1)
+Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging>=20.0->transformers) (3.0.7)
+Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (1.26.8)
+Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (2.0.12)
+Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (2021.10.8)
+Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (3.3)
+Requirement already satisfied: six in /opt/conda/lib/python3.8/site-packages (from sacremoses->transformers) (1.16.0)
+Requirement already satisfied: click in /opt/conda/lib/python3.8/site-packages (from sacremoses->transformers) (8.0.4)
+Requirement already satisfied: joblib in /opt/conda/lib/python3.8/site-packages (from sacremoses->transformers) (1.1.0)
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+
+
+
+
+
+
+
+
[3]:
+
+
+
+
+
+
+from transformers import BertTokenizer, BertForMaskedLM
+import torch
+import timeit
+import numpy as np
+import torch_tensorrt
+import torch.backends.cudnn as cudnn
+
+
+
+
+

+ ## 2. BERT Overview +

+

+ Transformers comprise a class of deep learning algorithms employing self-attention; broadly speaking, the models learn large matrices of numbers, each element of which denotes how important one component of input data is to another. Since their introduction in 2017, transformers have enjoyed widespread adoption, particularly in natural language processing, but also in computer vision problems. This is largely because they are easier to parallelize than the sequence models which attention +mechanisms were originally designed to augment. +

+

+ Hugging Face is a company that maintains a huge respository of pre-trained transformer models. The company also provides tools for integrating those models into PyTorch code and running inference with them. +

+

+ One of the most popular transformer models is BERT (Bidirectional Encoder Representations from Transformers). First developed at Google and released in 2018, it has become the backbone of Google’s search engine and a standard benchmark for NLP experiments. BERT was originally trained for next sentence prediction and masked language modeling (MLM), which aims to predict hidden words in sentences. In this notebook, we will use Hugging Face’s + + + bert-base-uncased + + + model (BERT’s smallest and +simplest form, which does not employ text capitalization) for MLM. +

+

+ ## 3. Creating TorchScript modules +

+

+ First, create a pretrained BERT tokenizer from the + + + bert-base-uncased + + + model +

+
+
+
+
[4]:
+
+
+
+
+
+
+enc = BertTokenizer.from_pretrained('bert-base-uncased')
+
+
+
+
+

+ Create dummy inputs to generate a traced TorchScript model later +

+
+
+
+
[5]:
+
+
+
+
+
+
+batch_size = 4
+
+batched_indexed_tokens = [[101, 64]*64]*batch_size
+batched_segment_ids = [[0, 1]*64]*batch_size
+batched_attention_masks = [[1, 1]*64]*batch_size
+
+tokens_tensor = torch.tensor(batched_indexed_tokens)
+segments_tensor = torch.tensor(batched_segment_ids)
+attention_masks_tensor = torch.tensor(batched_attention_masks)
+
+
+
+
+

+ Obtain a BERT masked language model from Hugging Face in the (scripted) TorchScript, then use the dummy inputs to trace it +

+
+
+
+
[6]:
+
+
+
+
+
+
+mlm_model_ts = BertForMaskedLM.from_pretrained('bert-base-uncased', torchscript=True)
+traced_mlm_model = torch.jit.trace(mlm_model_ts, [tokens_tensor, segments_tensor, attention_masks_tensor])
+
+
+
+
+
+
+
+
+
+
+Some weights of the model checkpoint at bert-base-uncased were not used when initializing BertForMaskedLM: ['cls.seq_relationship.bias', 'cls.seq_relationship.weight']
+- This IS expected if you are initializing BertForMaskedLM from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).
+- This IS NOT expected if you are initializing BertForMaskedLM from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).
+
+
+
+
+

+ Define 4 masked sentences, with 1 word in each sentence hidden from the model. Fluent English speakers will probably be able to guess the masked words, but just in case, they are + + + 'capital' + + + , + + + 'language' + + + , + + + 'innings' + + + , and + + + 'mathematics' + + + . +

+

+ Also create a list containing the position of the masked word within each sentence. Given Python’s 0-based indexing convention, the numbers are each higher by 1 than might be expected. This is because the token at index 0 in each sentence is a beginning-of-sentence token, denoted + + + [CLS] + + + when entered explicitly. +

+
+
+
+
[7]:
+
+
+
+
+
+
+masked_sentences = ['Paris is the [MASK] of France.',
+                    'The primary [MASK] of the United States is English.',
+                    'A baseball game consists of at least nine [MASK].',
+                    'Topology is a branch of [MASK] concerned with the properties of geometric objects that remain unchanged under continuous transformations.']
+pos_masks = [4, 3, 9, 6]
+
+
+
+
+

+ Pass the masked sentences into the (scripted) TorchScript MLM model and verify that the unmasked sentences yield the expected results. +

+

+ Because the sentences are of different lengths, we must specify the + + + padding + + + argument in calling our encoder/tokenizer. There are several possible padding strategies, but we’ll use + + + 'max_length' + + + padding with + + + max_length=128 + + + . Later, when we compile an optimized version of the model with Torch-TensorRT, the optimized model will expect inputs of length 128, hence our choice of padding strategy and length here. +

+
+
+
+
[8]:
+
+
+
+
+
+
+encoded_inputs = enc(masked_sentences, return_tensors='pt', padding='max_length', max_length=128)
+outputs = mlm_model_ts(**encoded_inputs)
+most_likely_token_ids = [torch.argmax(outputs[0][i, pos, :]) for i, pos in enumerate(pos_masks)]
+unmasked_tokens = enc.decode(most_likely_token_ids).split(' ')
+unmasked_sentences = [masked_sentences[i].replace('[MASK]', token) for i, token in enumerate(unmasked_tokens)]
+for sentence in unmasked_sentences:
+    print(sentence)
+
+
+
+
+
+
+
+
+
+
+Paris is the capital of France.
+The primary language of the United States is English.
+A baseball game consists of at least nine innings.
+Topology is a branch of mathematics concerned with the properties of geometric objects that remain unchanged under continuous transformations.
+
+
+
+
+

+ Pass the masked sentences into the traced MLM model and verify that the unmasked sentences yield the expected results. +

+

+ Note the difference in how the + + + encoded_inputs + + + are passed into the model in the following cell compared to the previous one. If you examine + + + encoded_inputs + + + , you’ll find that it’s a dictionary with 3 keys, + + + 'input_ids' + + + , + + + 'token_type_ids' + + + , and + + + 'attention_mask' + + + , each with a PyTorch tensor as an associated value. The traced model will accept + + + **encoded_inputs + + + as an input, but the Torch-TensorRT-optimized model (to be defined later) will not. +

+
+
+
+
[9]:
+
+
+
+
+
+
+encoded_inputs = enc(masked_sentences, return_tensors='pt', padding='max_length', max_length=128)
+outputs = traced_mlm_model(encoded_inputs['input_ids'], encoded_inputs['token_type_ids'], encoded_inputs['attention_mask'])
+most_likely_token_ids = [torch.argmax(outputs[0][i, pos, :]) for i, pos in enumerate(pos_masks)]
+unmasked_tokens = enc.decode(most_likely_token_ids).split(' ')
+unmasked_sentences = [masked_sentences[i].replace('[MASK]', token) for i, token in enumerate(unmasked_tokens)]
+for sentence in unmasked_sentences:
+    print(sentence)
+
+
+
+
+
+
+
+
+
+
+Paris is the capital of France.
+The primary language of the United States is English.
+A baseball game consists of at least nine innings.
+Topology is a branch of mathematics concerned with the properties of geometric objects that remain unchanged under continuous transformations.
+
+
+
+
+

+ ## 4. Compiling with Torch-TensorRT +

+

+ Change the logging level to avoid long printouts +

+
+
+
+
[10]:
+
+
+
+
+
+
+new_level = torch_tensorrt.logging.Level.Error
+torch_tensorrt.logging.set_reportable_log_level(new_level)
+
+
+
+
+

+ Compile the model +

+
+
+
+
[11]:
+
+
+
+
+
+
+trt_model = torch_tensorrt.compile(traced_mlm_model,
+    inputs= [torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32),  # input_ids
+             torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32),  # token_type_ids
+             torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32)], # attention_mask
+    enabled_precisions= {torch.float32}, # Run with 32-bit precision
+    workspace_size=2000000000,
+    truncate_long_and_double=True
+)
+
+
+
+
+

+ Pass the masked sentences into the compiled model and verify that the unmasked sentences yield the expected results. +

+
+
+
+
[12]:
+
+
+
+
+
+
+enc_inputs = enc(masked_sentences, return_tensors='pt', padding='max_length', max_length=128)
+enc_inputs = {k: v.type(torch.int32).cuda() for k, v in enc_inputs.items()}
+output_trt = trt_model(enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])
+most_likely_token_ids_trt = [torch.argmax(output_trt[i, pos, :]) for i, pos in enumerate(pos_masks)]
+unmasked_tokens_trt = enc.decode(most_likely_token_ids_trt).split(' ')
+unmasked_sentences_trt = [masked_sentences[i].replace('[MASK]', token) for i, token in enumerate(unmasked_tokens_trt)]
+for sentence in unmasked_sentences_trt:
+    print(sentence)
+
+
+
+
+
+
+
+
+
+
+Paris is the capital of France.
+The primary language of the United States is English.
+A baseball game consists of at least nine innings.
+Topology is a branch of mathematics concerned with the properties of geometric objects that remain unchanged under continuous transformations.
+
+
+
+
+

+ Compile the model again, this time with 16-bit precision +

+
+
+
+
[13]:
+
+
+
+
+
+
+trt_model_fp16 = torch_tensorrt.compile(traced_mlm_model,
+    inputs= [torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32),  # input_ids
+             torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32),  # token_type_ids
+             torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32)], # attention_mask
+    enabled_precisions= {torch.half}, # Run with 16-bit precision
+    workspace_size=2000000000,
+    truncate_long_and_double=True
+)
+
+
+
+
+

+ ## 5. Benchmarking +

+

+ In developing this notebook, we conducted our benchmarking on a single NVIDIA A100 GPU. Your results may differ from those shown, particularly on a different GPU. +

+

+ This function passes the inputs into the model and runs inference + + + num_loops + + + times, then returns a list of length containing the amount of time in seconds that each instance of inference took. +

+
+
+
+
[14]:
+
+
+
+
+
+
+def timeGraph(model, input_tensor1, input_tensor2, input_tensor3, num_loops=50):
+    print("Warm up ...")
+    with torch.no_grad():
+        for _ in range(20):
+            features = model(input_tensor1, input_tensor2, input_tensor3)
+
+    torch.cuda.synchronize()
+
+    print("Start timing ...")
+    timings = []
+    with torch.no_grad():
+        for i in range(num_loops):
+            start_time = timeit.default_timer()
+            features = model(input_tensor1, input_tensor2, input_tensor3)
+            torch.cuda.synchronize()
+            end_time = timeit.default_timer()
+            timings.append(end_time - start_time)
+            # print("Iteration {}: {:.6f} s".format(i, end_time - start_time))
+
+    return timings
+
+
+
+
+

+ This function prints the number of input batches the model is able to process each second and summary statistics of the model’s latency. +

+
+
+
+
[15]:
+
+
+
+
+
+
+def printStats(graphName, timings, batch_size):
+    times = np.array(timings)
+    steps = len(times)
+    speeds = batch_size / times
+    time_mean = np.mean(times)
+    time_med = np.median(times)
+    time_99th = np.percentile(times, 99)
+    time_std = np.std(times, ddof=0)
+    speed_mean = np.mean(speeds)
+    speed_med = np.median(speeds)
+
+    msg = ("\n%s =================================\n"
+            "batch size=%d, num iterations=%d\n"
+            "  Median text batches/second: %.1f, mean: %.1f\n"
+            "  Median latency: %.6f, mean: %.6f, 99th_p: %.6f, std_dev: %.6f\n"
+            ) % (graphName,
+                batch_size, steps,
+                speed_med, speed_mean,
+                time_med, time_mean, time_99th, time_std)
+    print(msg)
+
+
+
+
+
+
+
+
[16]:
+
+
+
+
+
+
+cudnn.benchmark = True
+
+
+
+
+

+ Benchmark the (scripted) TorchScript model on GPU +

+
+
+
+
[17]:
+
+
+
+
+
+
+timings = timeGraph(mlm_model_ts.cuda(), enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])
+
+printStats("BERT", timings, batch_size)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+
+BERT =================================
+batch size=4, num iterations=50
+  Median text batches/second: 599.1, mean: 597.6
+  Median latency: 0.006677, mean: 0.006693, 99th_p: 0.006943, std_dev: 0.000059
+
+
+
+
+
+

+ Benchmark the traced model on GPU +

+
+
+
+
[18]:
+
+
+
+
+
+
+timings = timeGraph(traced_mlm_model.cuda(), enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])
+
+printStats("BERT", timings, batch_size)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+
+BERT =================================
+batch size=4, num iterations=50
+  Median text batches/second: 951.2, mean: 951.0
+  Median latency: 0.004205, mean: 0.004206, 99th_p: 0.004256, std_dev: 0.000015
+
+
+
+
+
+

+ Benchmark the compiled FP32 model on GPU +

+
+
+
+
[19]:
+
+
+
+
+
+
+timings = timeGraph(trt_model, enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])
+
+printStats("BERT", timings, batch_size)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+
+BERT =================================
+batch size=4, num iterations=50
+  Median text batches/second: 1216.9, mean: 1216.4
+  Median latency: 0.003287, mean: 0.003289, 99th_p: 0.003317, std_dev: 0.000007
+
+
+
+
+
+

+ Benchmark the compiled FP16 model on GPU +

+
+
+
+
[20]:
+
+
+
+
+
+
+timings = timeGraph(trt_model_fp16, enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])
+
+printStats("BERT", timings, batch_size)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+
+BERT =================================
+batch size=4, num iterations=50
+  Median text batches/second: 1776.7, mean: 1771.1
+  Median latency: 0.002251, mean: 0.002259, 99th_p: 0.002305, std_dev: 0.000015
+
+
+
+
+
+

+ ## 6. Conclusion +

+

+ In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT for Masked Language Modeling with Hugging Face’s + + + bert-base-uncased + + + transformer and testing the performance impact of the optimization. With Torch-TensorRT on an NVIDIA A100 GPU, we observe the speedups indicated below. These acceleration numbers will vary from GPU to GPU (as well as implementation to implementation based on the ops used) and we encorage you to try out latest +generation of Data center compute cards for maximum acceleration. +

+

+ Scripted (GPU): 1.0x Traced (GPU): 1.62x Torch-TensorRT (FP32): 2.14x Torch-TensorRT (FP16): 3.15x +

+

+ What’s next + + ¶ + +

+

+ Now it’s time to try Torch-TensorRT on your own model. If you run into any issues, you can fill them at + + https://github.com/NVIDIA/Torch-TensorRT + + . Your involvement will help future development of Torch-TensorRT. +

+
+
+
+
[ ]:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_notebooks/Hugging-Face-BERT.ipynb b/docs/v1.1.1/_notebooks/Hugging-Face-BERT.ipynb new file mode 100644 index 0000000000..9b027b473e --- /dev/null +++ b/docs/v1.1.1/_notebooks/Hugging-Face-BERT.ipynb @@ -0,0 +1,714 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "9369b63c", + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2022 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "id": "d0a97ac5", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Masked Language Modeling (MLM) with Hugging Face BERT Transformer" + ] + }, + { + "cell_type": "markdown", + "id": "83f47edb", + "metadata": {}, + "source": [ + "## Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained BERT transformer from Hugging Face, and running it to test the speedup obtained.\n", + "\n", + "## Contents\n", + "1. [Requirements](#1)\n", + "2. [BERT Overview](#2)\n", + "3. [Creating TorchScript modules](#3)\n", + "4. [Compiling with Torch-TensorRT](#4)\n", + "5. [Benchmarking](#5)\n", + "6. [Conclusion](#6)" + ] + }, + { + "cell_type": "markdown", + "id": "596fa151", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "NVIDIA's NGC provides a PyTorch Docker Container which contains PyTorch and Torch-TensorRT. Starting with version `22.05-py3`, we can make use of [latest pytorch](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch) container to run this notebook.\n", + "\n", + "Otherwise, you can follow the steps in `notebooks/README` to prepare a Docker container yourself, within which you can run this demo notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "58e687d1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: transformers in /opt/conda/lib/python3.8/site-packages (4.18.0)\n", + "Requirement already satisfied: tqdm>=4.27 in /opt/conda/lib/python3.8/site-packages (from transformers) (4.63.0)\n", + "Requirement already satisfied: regex!=2019.12.17 in /opt/conda/lib/python3.8/site-packages (from transformers) (2022.3.15)\n", + "Requirement already satisfied: huggingface-hub<1.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from transformers) (0.5.1)\n", + "Requirement already satisfied: tokenizers!=0.11.3,<0.13,>=0.11.1 in /opt/conda/lib/python3.8/site-packages (from transformers) (0.12.1)\n", + "Requirement already satisfied: numpy>=1.17 in /opt/conda/lib/python3.8/site-packages (from transformers) (1.22.3)\n", + "Requirement already satisfied: sacremoses in /opt/conda/lib/python3.8/site-packages (from transformers) (0.0.49)\n", + "Requirement already satisfied: requests in /opt/conda/lib/python3.8/site-packages (from transformers) (2.27.1)\n", + "Requirement already satisfied: pyyaml>=5.1 in /opt/conda/lib/python3.8/site-packages (from transformers) (6.0)\n", + "Requirement already satisfied: filelock in /opt/conda/lib/python3.8/site-packages (from transformers) (3.6.0)\n", + "Requirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.8/site-packages (from transformers) (21.3)\n", + "Requirement already satisfied: typing-extensions>=3.7.4.3 in /opt/conda/lib/python3.8/site-packages (from huggingface-hub<1.0,>=0.1.0->transformers) (4.1.1)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging>=20.0->transformers) (3.0.7)\n", + "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (1.26.8)\n", + "Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (2.0.12)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (2021.10.8)\n", + "Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (3.3)\n", + "Requirement already satisfied: six in /opt/conda/lib/python3.8/site-packages (from sacremoses->transformers) (1.16.0)\n", + "Requirement already satisfied: click in /opt/conda/lib/python3.8/site-packages (from sacremoses->transformers) (8.0.4)\n", + "Requirement already satisfied: joblib in /opt/conda/lib/python3.8/site-packages (from sacremoses->transformers) (1.1.0)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install transformers" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "1104c4f1", + "metadata": {}, + "outputs": [], + "source": [ + "from transformers import BertTokenizer, BertForMaskedLM\n", + "import torch\n", + "import timeit\n", + "import numpy as np\n", + "import torch_tensorrt\n", + "import torch.backends.cudnn as cudnn" + ] + }, + { + "cell_type": "markdown", + "id": "acf67a5e", + "metadata": {}, + "source": [ + "\n", + "## 2. BERT Overview\n", + "\n", + "Transformers comprise a class of deep learning algorithms employing self-attention; broadly speaking, the models learn large matrices of numbers, each element of which denotes how important one component of input data is to another. Since their introduction in 2017, transformers have enjoyed widespread adoption, particularly in natural language processing, but also in computer vision problems. This is largely because they are easier to parallelize than the sequence models which attention mechanisms were originally designed to augment. \n", + "\n", + "Hugging Face is a company that maintains a huge respository of pre-trained transformer models. The company also provides tools for integrating those models into PyTorch code and running inference with them. \n", + "\n", + "One of the most popular transformer models is BERT (Bidirectional Encoder Representations from Transformers). First developed at Google and released in 2018, it has become the backbone of Google's search engine and a standard benchmark for NLP experiments. BERT was originally trained for next sentence prediction and masked language modeling (MLM), which aims to predict hidden words in sentences. In this notebook, we will use Hugging Face's `bert-base-uncased` model (BERT's smallest and simplest form, which does not employ text capitalization) for MLM." + ] + }, + { + "cell_type": "markdown", + "id": "19e711c0", + "metadata": {}, + "source": [ + "\n", + "## 3. Creating TorchScript modules " + ] + }, + { + "cell_type": "markdown", + "id": "81d4c6f6", + "metadata": {}, + "source": [ + "First, create a pretrained BERT tokenizer from the `bert-base-uncased` model" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c7c8721e", + "metadata": {}, + "outputs": [], + "source": [ + "enc = BertTokenizer.from_pretrained('bert-base-uncased')" + ] + }, + { + "cell_type": "markdown", + "id": "b7c1c679", + "metadata": {}, + "source": [ + "Create dummy inputs to generate a traced TorchScript model later" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c3827087", + "metadata": {}, + "outputs": [], + "source": [ + "batch_size = 4\n", + "\n", + "batched_indexed_tokens = [[101, 64]*64]*batch_size\n", + "batched_segment_ids = [[0, 1]*64]*batch_size\n", + "batched_attention_masks = [[1, 1]*64]*batch_size\n", + "\n", + "tokens_tensor = torch.tensor(batched_indexed_tokens)\n", + "segments_tensor = torch.tensor(batched_segment_ids)\n", + "attention_masks_tensor = torch.tensor(batched_attention_masks)" + ] + }, + { + "cell_type": "markdown", + "id": "7e31b27f", + "metadata": {}, + "source": [ + "Obtain a BERT masked language model from Hugging Face in the (scripted) TorchScript, then use the dummy inputs to trace it" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "a3cd5a35", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Some weights of the model checkpoint at bert-base-uncased were not used when initializing BertForMaskedLM: ['cls.seq_relationship.bias', 'cls.seq_relationship.weight']\n", + "- This IS expected if you are initializing BertForMaskedLM from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n", + "- This IS NOT expected if you are initializing BertForMaskedLM from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n" + ] + } + ], + "source": [ + "mlm_model_ts = BertForMaskedLM.from_pretrained('bert-base-uncased', torchscript=True)\n", + "traced_mlm_model = torch.jit.trace(mlm_model_ts, [tokens_tensor, segments_tensor, attention_masks_tensor])" + ] + }, + { + "cell_type": "markdown", + "id": "d8d2217a", + "metadata": {}, + "source": [ + "Define 4 masked sentences, with 1 word in each sentence hidden from the model. Fluent English speakers will probably be able to guess the masked words, but just in case, they are `'capital'`, `'language'`, `'innings'`, and `'mathematics'`.\n", + "\n", + "Also create a list containing the position of the masked word within each sentence. Given Python's 0-based indexing convention, the numbers are each higher by 1 than might be expected. This is because the token at index 0 in each sentence is a beginning-of-sentence token, denoted `[CLS]` when entered explicitly. " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "4d1af982", + "metadata": {}, + "outputs": [], + "source": [ + "masked_sentences = ['Paris is the [MASK] of France.', \n", + " 'The primary [MASK] of the United States is English.', \n", + " 'A baseball game consists of at least nine [MASK].', \n", + " 'Topology is a branch of [MASK] concerned with the properties of geometric objects that remain unchanged under continuous transformations.']\n", + "pos_masks = [4, 3, 9, 6]" + ] + }, + { + "cell_type": "markdown", + "id": "4d89b4c8", + "metadata": {}, + "source": [ + "Pass the masked sentences into the (scripted) TorchScript MLM model and verify that the unmasked sentences yield the expected results. \n", + "\n", + "Because the sentences are of different lengths, we must specify the `padding` argument in calling our encoder/tokenizer. There are several possible padding strategies, but we'll use `'max_length'` padding with `max_length=128`. Later, when we compile an optimized version of the model with Torch-TensorRT, the optimized model will expect inputs of length 128, hence our choice of padding strategy and length here. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "d2d7546b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Paris is the capital of France.\n", + "The primary language of the United States is English.\n", + "A baseball game consists of at least nine innings.\n", + "Topology is a branch of mathematics concerned with the properties of geometric objects that remain unchanged under continuous transformations.\n" + ] + } + ], + "source": [ + "encoded_inputs = enc(masked_sentences, return_tensors='pt', padding='max_length', max_length=128)\n", + "outputs = mlm_model_ts(**encoded_inputs)\n", + "most_likely_token_ids = [torch.argmax(outputs[0][i, pos, :]) for i, pos in enumerate(pos_masks)]\n", + "unmasked_tokens = enc.decode(most_likely_token_ids).split(' ')\n", + "unmasked_sentences = [masked_sentences[i].replace('[MASK]', token) for i, token in enumerate(unmasked_tokens)]\n", + "for sentence in unmasked_sentences:\n", + " print(sentence)" + ] + }, + { + "cell_type": "markdown", + "id": "b0b423ff", + "metadata": {}, + "source": [ + "Pass the masked sentences into the traced MLM model and verify that the unmasked sentences yield the expected results. \n", + "\n", + "Note the difference in how the `encoded_inputs` are passed into the model in the following cell compared to the previous one. If you examine `encoded_inputs`, you'll find that it's a dictionary with 3 keys, `'input_ids'`, `'token_type_ids'`, and `'attention_mask'`, each with a PyTorch tensor as an associated value. The traced model will accept `**encoded_inputs` as an input, but the Torch-TensorRT-optimized model (to be defined later) will not. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "683a4a73", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Paris is the capital of France.\n", + "The primary language of the United States is English.\n", + "A baseball game consists of at least nine innings.\n", + "Topology is a branch of mathematics concerned with the properties of geometric objects that remain unchanged under continuous transformations.\n" + ] + } + ], + "source": [ + "encoded_inputs = enc(masked_sentences, return_tensors='pt', padding='max_length', max_length=128)\n", + "outputs = traced_mlm_model(encoded_inputs['input_ids'], encoded_inputs['token_type_ids'], encoded_inputs['attention_mask'])\n", + "most_likely_token_ids = [torch.argmax(outputs[0][i, pos, :]) for i, pos in enumerate(pos_masks)]\n", + "unmasked_tokens = enc.decode(most_likely_token_ids).split(' ')\n", + "unmasked_sentences = [masked_sentences[i].replace('[MASK]', token) for i, token in enumerate(unmasked_tokens)]\n", + "for sentence in unmasked_sentences:\n", + " print(sentence)" + ] + }, + { + "cell_type": "markdown", + "id": "7a31b545", + "metadata": {}, + "source": [ + "\n", + "## 4. Compiling with Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "id": "413d8b4f", + "metadata": {}, + "source": [ + "Change the logging level to avoid long printouts" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "42862893", + "metadata": {}, + "outputs": [], + "source": [ + "new_level = torch_tensorrt.logging.Level.Error\n", + "torch_tensorrt.logging.set_reportable_log_level(new_level)" + ] + }, + { + "cell_type": "markdown", + "id": "121d6d59", + "metadata": {}, + "source": [ + "Compile the model" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "eab90150", + "metadata": {}, + "outputs": [], + "source": [ + "trt_model = torch_tensorrt.compile(traced_mlm_model, \n", + " inputs= [torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32), # input_ids\n", + " torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32), # token_type_ids\n", + " torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32)], # attention_mask\n", + " enabled_precisions= {torch.float32}, # Run with 32-bit precision\n", + " workspace_size=2000000000,\n", + " truncate_long_and_double=True\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a96751ce", + "metadata": {}, + "source": [ + "Pass the masked sentences into the compiled model and verify that the unmasked sentences yield the expected results." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "097ea381", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Paris is the capital of France.\n", + "The primary language of the United States is English.\n", + "A baseball game consists of at least nine innings.\n", + "Topology is a branch of mathematics concerned with the properties of geometric objects that remain unchanged under continuous transformations.\n" + ] + } + ], + "source": [ + "enc_inputs = enc(masked_sentences, return_tensors='pt', padding='max_length', max_length=128)\n", + "enc_inputs = {k: v.type(torch.int32).cuda() for k, v in enc_inputs.items()}\n", + "output_trt = trt_model(enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "most_likely_token_ids_trt = [torch.argmax(output_trt[i, pos, :]) for i, pos in enumerate(pos_masks)] \n", + "unmasked_tokens_trt = enc.decode(most_likely_token_ids_trt).split(' ')\n", + "unmasked_sentences_trt = [masked_sentences[i].replace('[MASK]', token) for i, token in enumerate(unmasked_tokens_trt)]\n", + "for sentence in unmasked_sentences_trt:\n", + " print(sentence)" + ] + }, + { + "cell_type": "markdown", + "id": "a398271d", + "metadata": {}, + "source": [ + "Compile the model again, this time with 16-bit precision" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "a063dee2", + "metadata": {}, + "outputs": [], + "source": [ + "trt_model_fp16 = torch_tensorrt.compile(traced_mlm_model, \n", + " inputs= [torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32), # input_ids\n", + " torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32), # token_type_ids\n", + " torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32)], # attention_mask\n", + " enabled_precisions= {torch.half}, # Run with 16-bit precision\n", + " workspace_size=2000000000,\n", + " truncate_long_and_double=True\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a926334a", + "metadata": {}, + "source": [ + "\n", + "## 5. Benchmarking\n", + "\n", + "In developing this notebook, we conducted our benchmarking on a single NVIDIA A100 GPU. Your results may differ from those shown, particularly on a different GPU." + ] + }, + { + "cell_type": "markdown", + "id": "976c6fb9", + "metadata": {}, + "source": [ + "This function passes the inputs into the model and runs inference `num_loops` times, then returns a list of length containing the amount of time in seconds that each instance of inference took." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "b72a091e", + "metadata": {}, + "outputs": [], + "source": [ + "def timeGraph(model, input_tensor1, input_tensor2, input_tensor3, num_loops=50):\n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(20):\n", + " features = model(input_tensor1, input_tensor2, input_tensor3)\n", + "\n", + " torch.cuda.synchronize()\n", + "\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(num_loops):\n", + " start_time = timeit.default_timer()\n", + " features = model(input_tensor1, input_tensor2, input_tensor3)\n", + " torch.cuda.synchronize()\n", + " end_time = timeit.default_timer()\n", + " timings.append(end_time - start_time)\n", + " # print(\"Iteration {}: {:.6f} s\".format(i, end_time - start_time))\n", + "\n", + " return timings" + ] + }, + { + "cell_type": "markdown", + "id": "0b44dcf8", + "metadata": {}, + "source": [ + "This function prints the number of input batches the model is able to process each second and summary statistics of the model's latency." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "2ef71ab7", + "metadata": {}, + "outputs": [], + "source": [ + "def printStats(graphName, timings, batch_size):\n", + " times = np.array(timings)\n", + " steps = len(times)\n", + " speeds = batch_size / times\n", + " time_mean = np.mean(times)\n", + " time_med = np.median(times)\n", + " time_99th = np.percentile(times, 99)\n", + " time_std = np.std(times, ddof=0)\n", + " speed_mean = np.mean(speeds)\n", + " speed_med = np.median(speeds)\n", + "\n", + " msg = (\"\\n%s =================================\\n\"\n", + " \"batch size=%d, num iterations=%d\\n\"\n", + " \" Median text batches/second: %.1f, mean: %.1f\\n\"\n", + " \" Median latency: %.6f, mean: %.6f, 99th_p: %.6f, std_dev: %.6f\\n\"\n", + " ) % (graphName,\n", + " batch_size, steps,\n", + " speed_med, speed_mean,\n", + " time_med, time_mean, time_99th, time_std)\n", + " print(msg)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "afe97b9b", + "metadata": {}, + "outputs": [], + "source": [ + "cudnn.benchmark = True" + ] + }, + { + "cell_type": "markdown", + "id": "eba98b24", + "metadata": {}, + "source": [ + "Benchmark the (scripted) TorchScript model on GPU" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "bab5fa8f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "\n", + "BERT =================================\n", + "batch size=4, num iterations=50\n", + " Median text batches/second: 599.1, mean: 597.6\n", + " Median latency: 0.006677, mean: 0.006693, 99th_p: 0.006943, std_dev: 0.000059\n", + "\n" + ] + } + ], + "source": [ + "timings = timeGraph(mlm_model_ts.cuda(), enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "\n", + "printStats(\"BERT\", timings, batch_size)" + ] + }, + { + "cell_type": "markdown", + "id": "bc79c452", + "metadata": {}, + "source": [ + "Benchmark the traced model on GPU" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "5c0bd8e9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "\n", + "BERT =================================\n", + "batch size=4, num iterations=50\n", + " Median text batches/second: 951.2, mean: 951.0\n", + " Median latency: 0.004205, mean: 0.004206, 99th_p: 0.004256, std_dev: 0.000015\n", + "\n" + ] + } + ], + "source": [ + "timings = timeGraph(traced_mlm_model.cuda(), enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "\n", + "printStats(\"BERT\", timings, batch_size)" + ] + }, + { + "cell_type": "markdown", + "id": "41db22a1", + "metadata": {}, + "source": [ + "Benchmark the compiled FP32 model on GPU" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "ade7b508", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "\n", + "BERT =================================\n", + "batch size=4, num iterations=50\n", + " Median text batches/second: 1216.9, mean: 1216.4\n", + " Median latency: 0.003287, mean: 0.003289, 99th_p: 0.003317, std_dev: 0.000007\n", + "\n" + ] + } + ], + "source": [ + "timings = timeGraph(trt_model, enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "\n", + "printStats(\"BERT\", timings, batch_size)" + ] + }, + { + "cell_type": "markdown", + "id": "57b696de", + "metadata": {}, + "source": [ + "Benchmark the compiled FP16 model on GPU" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "f61b83fd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "\n", + "BERT =================================\n", + "batch size=4, num iterations=50\n", + " Median text batches/second: 1776.7, mean: 1771.1\n", + " Median latency: 0.002251, mean: 0.002259, 99th_p: 0.002305, std_dev: 0.000015\n", + "\n" + ] + } + ], + "source": [ + "timings = timeGraph(trt_model_fp16, enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "\n", + "printStats(\"BERT\", timings, batch_size)" + ] + }, + { + "cell_type": "markdown", + "id": "43f67ba3", + "metadata": {}, + "source": [ + "\n", + "## 6. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT for Masked Language Modeling with Hugging Face's `bert-base-uncased` transformer and testing the performance impact of the optimization. With Torch-TensorRT on an NVIDIA A100 GPU, we observe the speedups indicated below. These acceleration numbers will vary from GPU to GPU (as well as implementation to implementation based on the ops used) and we encorage you to try out latest generation of Data center compute cards for maximum acceleration.\n", + "\n", + "Scripted (GPU): 1.0x\n", + "Traced (GPU): 1.62x\n", + "Torch-TensorRT (FP32): 2.14x\n", + "Torch-TensorRT (FP16): 3.15x\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. If you run into any issues, you can fill them at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4ebd152d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/v1.1.1/_notebooks/Resnet50-example.html b/docs/v1.1.1/_notebooks/Resnet50-example.html new file mode 100644 index 0000000000..36f2f0ad39 --- /dev/null +++ b/docs/v1.1.1/_notebooks/Resnet50-example.html @@ -0,0 +1,2018 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Torch-TensorRT Getting Started - ResNet 50 — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+
+
[1]:
+
+
+
+
+
+
+# Copyright 2019 NVIDIA Corporation. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
+
+
+

+ 549ce3f46e334eb49742498ad8cacb89 +

+

+ Torch-TensorRT Getting Started - ResNet 50 + + ¶ + +

+

+ Overview + + ¶ + +

+

+ In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the +best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch’s JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new +world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference. +

+

+ When deploying on NVIDIA GPUs TensorRT, NVIDIA’s Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA’s Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that +perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device. +

+

+ Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch. +

+

+ Learning objectives + + ¶ + +

+

+ This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained ResNet-50 network, and running it to test the speedup obtained. +

+

+ Content + + ¶ + +

+
    +
  1. +

    + + Requirements + +

    +
  2. +
  3. +

    + + ResNet-50 Overview + +

    +
  4. +
  5. +

    + + Running the model without optimizations + +

    +
  6. +
  7. +

    + + Accelerating with Torch-TensorRT + +

    +
  8. +
  9. +

    + + Conclusion + +

    +
  10. +
+
+
+
+
[2]:
+
+
+
+
+
+
+!nvidia-smi
+!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org
+
+
+
+
+
+
+
+
+
+
+Tue Feb  8 19:16:53 2022
++-----------------------------------------------------------------------------+
+| NVIDIA-SMI 510.39.01    Driver Version: 510.39.01    CUDA Version: 11.6     |
+|-------------------------------+----------------------+----------------------+
+| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
+| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
+|                               |                      |               MIG M. |
+|===============================+======================+======================|
+|   0  NVIDIA GeForce ...  On   | 00000000:65:00.0 Off |                  N/A |
+| 30%   29C    P8    15W / 350W |      0MiB / 24576MiB |      0%      Default |
+|                               |                      |                  N/A |
++-------------------------------+----------------------+----------------------+
+
++-----------------------------------------------------------------------------+
+| Processes:                                                                  |
+|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
+|        ID   ID                                                   Usage      |
+|=============================================================================|
+|  No running processes found                                                 |
++-----------------------------------------------------------------------------+
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Collecting ipywidgets
+  Downloading ipywidgets-7.6.5-py2.py3-none-any.whl (121 kB)
+     |████████████████████████████████| 121 kB 5.3 MB/s eta 0:00:01
+Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)
+Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.7.0)
+Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.3)
+Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (7.31.0)
+Collecting jupyterlab-widgets>=1.0.0
+  Downloading jupyterlab_widgets-1.0.2-py3-none-any.whl (243 kB)
+     |████████████████████████████████| 243 kB 2.6 MB/s eta 0:00:01
+Collecting widgetsnbextension~=3.5.0
+  Downloading widgetsnbextension-3.5.2-py2.py3-none-any.whl (1.6 MB)
+     |████████████████████████████████| 1.6 MB 3.5 MB/s eta 0:00:01
+Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)
+Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.1.2)
+Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)
+Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.4)
+Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.1)
+Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)
+Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)
+Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)
+Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)
+Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.0)
+Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.24)
+Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)
+Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)
+Requirement already satisfied: pygments in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.1)
+Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)
+Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (0.3)
+Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (22.3.0)
+Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (2.8.2)
+Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (4.9.1)
+Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)
+Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.4.0)
+Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (5.4.0)
+Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.18.1)
+Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.7.0)
+Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)
+Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)
+Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (1.16.0)
+Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.5.0->ipywidgets) (6.4.1)
+Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.8.0)
+Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.3)
+Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3.0)
+Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.13.0)
+Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.12.1)
+Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (6.4.0)
+Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.2.0)
+Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.15.0)
+Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.21)
+Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.0.1)
+Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.1.2)
+Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.7.1)
+Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (4.1.0)
+Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.10)
+Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.0)
+Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.5.0)
+Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.8.4)
+Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3)
+Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.1)
+Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.6)
+Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets
+Successfully installed ipywidgets-7.6.5 jupyterlab-widgets-1.0.2 widgetsnbextension-3.5.2
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+
+
+
+
+

+ ## 1. Requirements +

+

+ NVIDIA’s NGC provides PyTorch Docker Container which contains PyTorch and Torch-TensorRT. We can make use of + + latest pytorch + + container to run this notebook. +

+

+ Otherwise, you can follow the steps in + + + notebooks/README + + + to prepare a Docker container yourself, within which you can run this demo notebook. +

+

+ ## 2. ResNet-50 Overview +

+

+ PyTorch has a model repository called the PyTorch Hub, which is a source for high quality implementations of common models. We can get our ResNet-50 model from there pretrained on ImageNet. +

+

+ Model Description + + ¶ + +

+

+ This ResNet-50 model is based on the + + Deep Residual Learning for Image Recognition + + paper, which describes ResNet as “a method for detecting objects in images using a single deep neural network”. The input size is fixed to 32x32. +

+

+ alt +

+

+ ## 3. Running the model without optimizations +

+

+ PyTorch has a model repository called + + + timm + + + , which is a source for high quality implementations of computer vision models. We can get our EfficientNet model from there pretrained on ImageNet. +

+
+
+
+
[3]:
+
+
+
+
+
+
+import torch
+import torchvision
+
+torch.hub._validate_not_a_forked_repo=lambda a,b,c: True
+
+resnet50_model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)
+resnet50_model.eval()
+
+
+
+
+
+
+
+
+
+
+Downloading: "https://github.com/pytorch/vision/archive/v0.10.0.zip" to /root/.cache/torch/hub/v0.10.0.zip
+Downloading: "https://download.pytorch.org/models/resnet50-0676ba61.pth" to /root/.cache/torch/hub/checkpoints/resnet50-0676ba61.pth
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
[3]:
+
+
+
+
+
+
+ResNet(
+  (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
+  (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+  (relu): ReLU(inplace=True)
+  (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
+  (layer1): Sequential(
+    (0): Bottleneck(
+      (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+      (downsample): Sequential(
+        (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      )
+    )
+    (1): Bottleneck(
+      (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (2): Bottleneck(
+      (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+  )
+  (layer2): Sequential(
+    (0): Bottleneck(
+      (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+      (downsample): Sequential(
+        (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)
+        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      )
+    )
+    (1): Bottleneck(
+      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (2): Bottleneck(
+      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (3): Bottleneck(
+      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+  )
+  (layer3): Sequential(
+    (0): Bottleneck(
+      (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+      (downsample): Sequential(
+        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)
+        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      )
+    )
+    (1): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (2): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (3): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (4): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (5): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+  )
+  (layer4): Sequential(
+    (0): Bottleneck(
+      (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+      (downsample): Sequential(
+        (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)
+        (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      )
+    )
+    (1): Bottleneck(
+      (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (2): Bottleneck(
+      (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+  )
+  (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))
+  (fc): Linear(in_features=2048, out_features=1000, bias=True)
+)
+
+
+
+
+

+ With our model loaded, let’s proceed to downloading some images! +

+
+
+
+
[4]:
+
+
+
+
+
+
+!mkdir -p ./data
+!wget  -O ./data/img0.JPG "https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630"
+!wget  -O ./data/img1.JPG "https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg"
+!wget  -O ./data/img2.JPG "https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg"
+!wget  -O ./data/img3.JPG "https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg"
+
+!wget  -O ./data/imagenet_class_index.json "https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json"
+
+
+
+
+
+
+
+
+
+
+--2022-02-08 19:17:19--  https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630
+Resolving d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)... 18.65.227.99, 18.65.227.37, 18.65.227.223, ...
+Connecting to d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)|18.65.227.99|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 24112 (24K) [image/jpeg]
+Saving to: ‘./data/img0.JPG’
+
+./data/img0.JPG     100%[===================>]  23.55K  --.-KB/s    in 0.002s
+
+2022-02-08 19:17:19 (14.6 MB/s) - ‘./data/img0.JPG’ saved [24112/24112]
+
+--2022-02-08 19:17:19--  https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg
+Resolving www.hakaimagazine.com (www.hakaimagazine.com)... 164.92.73.117
+Connecting to www.hakaimagazine.com (www.hakaimagazine.com)|164.92.73.117|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 452718 (442K) [image/jpeg]
+Saving to: ‘./data/img1.JPG’
+
+./data/img1.JPG     100%[===================>] 442.11K  2.40MB/s    in 0.2s
+
+2022-02-08 19:17:19 (2.40 MB/s) - ‘./data/img1.JPG’ saved [452718/452718]
+
+--2022-02-08 19:17:20--  https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg
+Resolving www.artis.nl (www.artis.nl)... 94.75.225.20
+Connecting to www.artis.nl (www.artis.nl)|94.75.225.20|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 361413 (353K) [image/jpeg]
+Saving to: ‘./data/img2.JPG’
+
+./data/img2.JPG     100%[===================>] 352.94K   366KB/s    in 1.0s
+
+2022-02-08 19:17:24 (366 KB/s) - ‘./data/img2.JPG’ saved [361413/361413]
+
+--2022-02-08 19:17:24--  https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg
+Resolving www.familyhandyman.com (www.familyhandyman.com)... 104.18.201.107, 104.18.202.107, 2606:4700::6812:ca6b, ...
+Connecting to www.familyhandyman.com (www.familyhandyman.com)|104.18.201.107|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 94328 (92K) [image/jpeg]
+Saving to: ‘./data/img3.JPG’
+
+./data/img3.JPG     100%[===================>]  92.12K  --.-KB/s    in 0.005s
+
+2022-02-08 19:17:25 (16.8 MB/s) - ‘./data/img3.JPG’ saved [94328/94328]
+
+--2022-02-08 19:17:25--  https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json
+Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.217.41.222
+Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.217.41.222|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 35363 (35K) [application/octet-stream]
+Saving to: ‘./data/imagenet_class_index.json’
+
+./data/imagenet_cla 100%[===================>]  34.53K  --.-KB/s    in 0.07s
+
+2022-02-08 19:17:26 (481 KB/s) - ‘./data/imagenet_class_index.json’ saved [35363/35363]
+
+
+
+
+
+

+ All pre-trained models expect input images normalized in the same way, i.e. mini-batches of 3-channel RGB images of shape + + + (3 + + + x + + + H + + + x + + + W) + + + , where + + + H + + + and + + + W + + + are expected to be at least + + + 224 + + + . The images have to be loaded in to a range of + + + [0, + + + 1] + + + and then normalized using + + + mean + + + = + + + [0.485, + + + 0.456, + + + 0.406] + + + and + + + std + + + = + + + [0.229, + + + 0.224, + + + 0.225] + + + . +

+

+ Here’s a sample execution. +

+
+
+
+
[5]:
+
+
+
+
+
+
+from PIL import Image
+from torchvision import transforms
+import matplotlib.pyplot as plt
+import json
+
+fig, axes = plt.subplots(nrows=2, ncols=2)
+
+for i in range(4):
+    img_path = './data/img%d.JPG'%i
+    img = Image.open(img_path)
+    preprocess = transforms.Compose([
+        transforms.Resize(256),
+        transforms.CenterCrop(224),
+        transforms.ToTensor(),
+        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
+    ])
+    input_tensor = preprocess(img)
+    plt.subplot(2,2,i+1)
+    plt.imshow(img)
+    plt.axis('off')
+
+# loading labels
+with open("./data/imagenet_class_index.json") as json_file:
+    d = json.load(json_file)
+
+
+
+
+
+
+
+
+ ../_images/_notebooks_Resnet50-example_12_0.png +
+
+

+ Throughout this tutorial, we will be making use of some utility functions; + + + rn50_preprocess + + + for preprocessing input images, + + + predict + + + to use the model for prediction and + + + benchmark + + + to benchmark the inference. You do not need to understand/go through these utilities to make use of Torch TensorRT, but are welecomed to do so if you choose. +

+
+
+
+
[6]:
+
+
+
+
+
+
+import numpy as np
+import time
+import torch.backends.cudnn as cudnn
+cudnn.benchmark = True
+
+def rn50_preprocess():
+    preprocess = transforms.Compose([
+        transforms.Resize(256),
+        transforms.CenterCrop(224),
+        transforms.ToTensor(),
+        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
+    ])
+    return preprocess
+
+# decode the results into ([predicted class, description], probability)
+def predict(img_path, model):
+    img = Image.open(img_path)
+    preprocess = rn50_preprocess()
+    input_tensor = preprocess(img)
+    input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model
+
+    # move the input and model to GPU for speed if available
+    if torch.cuda.is_available():
+        input_batch = input_batch.to('cuda')
+        model.to('cuda')
+
+    with torch.no_grad():
+        output = model(input_batch)
+        # Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes
+        sm_output = torch.nn.functional.softmax(output[0], dim=0)
+
+    ind = torch.argmax(sm_output)
+    return d[str(ind.item())], sm_output[ind] #([predicted class, description], probability)
+
+def benchmark(model, input_shape=(1024, 1, 224, 224), dtype='fp32', nwarmup=50, nruns=10000):
+    input_data = torch.randn(input_shape)
+    input_data = input_data.to("cuda")
+    if dtype=='fp16':
+        input_data = input_data.half()
+
+    print("Warm up ...")
+    with torch.no_grad():
+        for _ in range(nwarmup):
+            features = model(input_data)
+    torch.cuda.synchronize()
+    print("Start timing ...")
+    timings = []
+    with torch.no_grad():
+        for i in range(1, nruns+1):
+            start_time = time.time()
+            features = model(input_data)
+            torch.cuda.synchronize()
+            end_time = time.time()
+            timings.append(end_time - start_time)
+            if i%10==0:
+                print('Iteration %d/%d, ave batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))
+
+    print("Input shape:", input_data.size())
+    print("Output features size:", features.size())
+    print('Average batch time: %.2f ms'%(np.mean(timings)*1000))
+
+
+
+
+

+ With the model downloaded and the util functions written, let’s just quickly see some predictions, and benchmark the model in its current un-optimized state. +

+
+
+
+
[7]:
+
+
+
+
+
+
+for i in range(4):
+    img_path = './data/img%d.JPG'%i
+    img = Image.open(img_path)
+
+    pred, prob = predict(img_path, resnet50_model)
+    print('{} - Predicted: {}, Probablility: {}'.format(img_path, pred, prob))
+
+    plt.subplot(2,2,i+1)
+    plt.imshow(img);
+    plt.axis('off');
+    plt.title(pred[1])
+
+
+
+
+
+
+
+
+
+
+./data/img0.JPG - Predicted: ['n02110185', 'Siberian_husky'], Probablility: 0.49785590171813965
+./data/img1.JPG - Predicted: ['n01820546', 'lorikeet'], Probablility: 0.6445754766464233
+./data/img2.JPG - Predicted: ['n02481823', 'chimpanzee'], Probablility: 0.9899807572364807
+./data/img3.JPG - Predicted: ['n01749939', 'green_mamba'], Probablility: 0.39485082030296326
+
+
+
+
+
+
+
+
+ ../_images/_notebooks_Resnet50-example_16_1.png +
+
+
+
+
+
[8]:
+
+
+
+
+
+
+# Model benchmark without Torch-TensorRT
+model = resnet50_model.eval().to("cuda")
+benchmark(model, input_shape=(128, 3, 224, 224), nruns=100)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, ave batch time 75.34 ms
+Iteration 20/100, ave batch time 75.33 ms
+Iteration 30/100, ave batch time 75.35 ms
+Iteration 40/100, ave batch time 75.37 ms
+Iteration 50/100, ave batch time 75.38 ms
+Iteration 60/100, ave batch time 75.38 ms
+Iteration 70/100, ave batch time 75.39 ms
+Iteration 80/100, ave batch time 75.39 ms
+Iteration 90/100, ave batch time 75.40 ms
+Iteration 100/100, ave batch time 75.41 ms
+Input shape: torch.Size([128, 3, 224, 224])
+Output features size: torch.Size([128, 1000])
+Average batch time: 75.41 ms
+
+
+
+
+

+ ## 4. Accelerating with Torch-TensorRT +

+

+ Onwards to the next step, accelerating with Torch TensorRT. In these examples we showcase the results for FP32 (single precision) and FP16 (half precision). We do not demonstrat specific tuning, just showcase the simplicity of usage. If you want to learn more about the possible customizations, visit our + + documentation + + . +

+

+ FP32 (single precision) + + ¶ + +

+
+
+
+
[9]:
+
+
+
+
+
+
+import torch_tensorrt
+
+# The compiled module will have precision as specified by "op_precision".
+# Here, it will have FP32 precision.
+trt_model_fp32 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.float32)],
+    enabled_precisions = torch.float32, # Run with FP32
+    workspace_size = 1 << 22
+)
+
+
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+
+
+
+
+
+
+
+
[10]:
+
+
+
+
+
+
+# Obtain the average time taken by a batch of input
+benchmark(trt_model_fp32, input_shape=(128, 3, 224, 224), nruns=100)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, ave batch time 41.02 ms
+Iteration 20/100, ave batch time 41.12 ms
+Iteration 30/100, ave batch time 41.22 ms
+Iteration 40/100, ave batch time 41.14 ms
+Iteration 50/100, ave batch time 41.20 ms
+Iteration 60/100, ave batch time 41.20 ms
+Iteration 70/100, ave batch time 41.19 ms
+Iteration 80/100, ave batch time 41.23 ms
+Iteration 90/100, ave batch time 41.20 ms
+Iteration 100/100, ave batch time 41.21 ms
+Input shape: torch.Size([128, 3, 224, 224])
+Output features size: torch.Size([128, 1000])
+Average batch time: 41.21 ms
+
+
+
+
+

+ FP16 (half precision) + + ¶ + +

+
+
+
+
[11]:
+
+
+
+
+
+
+import torch_tensorrt
+
+# The compiled module will have precision as specified by "op_precision".
+# Here, it will have FP16 precision.
+trt_model_fp16 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.half)],
+    enabled_precisions = {torch.half}, # Run with FP32
+    workspace_size = 1 << 22
+)
+
+
+
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float
+The compiler is going to use the user setting Float16
+This conflict may cause an error at runtime due to partial compilation being enabled and therefore
+compatibility with PyTorch's data type convention is required.
+If you do indeed see errors at runtime either:
+- Remove the dtype spec for x.1
+- Disable partial compilation by setting require_full_compilation to True
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+
+
+
+
+
+
+
+
[13]:
+
+
+
+
+
+
+# Obtain the average time taken by a batch of input
+benchmark(trt_model_fp16, input_shape=(128, 3, 224, 224), dtype='fp16', nruns=100)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, ave batch time 14.48 ms
+Iteration 20/100, ave batch time 14.58 ms
+Iteration 30/100, ave batch time 14.72 ms
+Iteration 40/100, ave batch time 14.73 ms
+Iteration 50/100, ave batch time 14.70 ms
+Iteration 60/100, ave batch time 14.79 ms
+Iteration 70/100, ave batch time 14.73 ms
+Iteration 80/100, ave batch time 14.69 ms
+Iteration 90/100, ave batch time 14.68 ms
+Iteration 100/100, ave batch time 14.69 ms
+Input shape: torch.Size([128, 3, 224, 224])
+Output features size: torch.Size([128, 1000])
+Average batch time: 14.69 ms
+
+
+
+
+

+ ## 5. Conclusion +

+

+ In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT for EfficientNet-B0 model and test the performance impact of the optimization. With Torch-TensorRT, we observe a speedup of + + 1.84x + + with FP32, and + + 5.2x + + with FP16 on an NVIDIA 3090 GPU. These acceleration numbers will vary from GPU to GPU(as well as implementation to implementation based on the ops used) and we encorage you to try out latest generation of Data center compute +cards for maximum acceleration. +

+

+ What’s next + + ¶ + +

+

+ Now it’s time to try Torch-TensorRT on your own model. If you run into any issues, you can fill them at + + https://github.com/NVIDIA/Torch-TensorRT + + . Your involvement will help future development of Torch-TensorRT. +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_notebooks/Resnet50-example.ipynb b/docs/v1.1.1/_notebooks/Resnet50-example.ipynb new file mode 100644 index 0000000000..f020662c73 --- /dev/null +++ b/docs/v1.1.1/_notebooks/Resnet50-example.ipynb @@ -0,0 +1,925 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Torch-TensorRT Getting Started - ResNet 50" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch's JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.\n", + "\n", + "When deploying on NVIDIA GPUs TensorRT, NVIDIA's Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA's Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.\n", + "\n", + "Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained ResNet-50 network, and running it to test the speedup obtained.\n", + "\n", + "## Content\n", + "1. [Requirements](#1)\n", + "1. [ResNet-50 Overview](#2)\n", + "1. [Running the model without optimizations](#3)\n", + "1. [Accelerating with Torch-TensorRT](#4)\n", + "1. [Conclusion](#5)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tue Feb 8 19:16:53 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 510.39.01 Driver Version: 510.39.01 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA GeForce ... On | 00000000:65:00.0 Off | N/A |\n", + "| 30% 29C P8 15W / 350W | 0MiB / 24576MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting ipywidgets\n", + " Downloading ipywidgets-7.6.5-py2.py3-none-any.whl (121 kB)\n", + "\u001b[K |████████████████████████████████| 121 kB 5.3 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)\n", + "Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.7.0)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.3)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (7.31.0)\n", + "Collecting jupyterlab-widgets>=1.0.0\n", + " Downloading jupyterlab_widgets-1.0.2-py3-none-any.whl (243 kB)\n", + "\u001b[K |████████████████████████████████| 243 kB 2.6 MB/s eta 0:00:01\n", + "\u001b[?25hCollecting widgetsnbextension~=3.5.0\n", + " Downloading widgetsnbextension-3.5.2-py2.py3-none-any.whl (1.6 MB)\n", + "\u001b[K |████████████████████████████████| 1.6 MB 3.5 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)\n", + "Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.1.2)\n", + "Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)\n", + "Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.4)\n", + "Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.1)\n", + "Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)\n", + "Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.0)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.24)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)\n", + "Requirement already satisfied: pygments in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.1)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (0.3)\n", + "Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (22.3.0)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (2.8.2)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (4.9.1)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)\n", + "Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.4.0)\n", + "Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (5.4.0)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.7.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (1.16.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.5.0->ipywidgets) (6.4.1)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.8.0)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.3)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3.0)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.13.0)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.12.1)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (6.4.0)\n", + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.21)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.0.1)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.1.2)\n", + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.7.1)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (4.1.0)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.10)\n", + "Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.0)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.5.0)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.8.4)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.1)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.6)\n", + "Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets\n", + "Successfully installed ipywidgets-7.6.5 jupyterlab-widgets-1.0.2 widgetsnbextension-3.5.2\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "!nvidia-smi\n", + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "NVIDIA's NGC provides PyTorch Docker Container which contains PyTorch and Torch-TensorRT. We can make use of [latest pytorch](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch) container to run this notebook.\n", + "\n", + "Otherwise, you can follow the steps in `notebooks/README` to prepare a Docker container yourself, within which you can run this demo notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 2. ResNet-50 Overview\n", + "\n", + "\n", + "PyTorch has a model repository called the PyTorch Hub, which is a source for high quality implementations of common models. We can get our ResNet-50 model from there pretrained on ImageNet.\n", + "\n", + "### Model Description\n", + "\n", + "This ResNet-50 model is based on the [Deep Residual Learning for Image Recognition](https://arxiv.org/pdf/1512.03385.pdf) paper, which describes ResNet as “a method for detecting objects in images using a single deep neural network\". The input size is fixed to 32x32.\n", + "\n", + "\"alt\"\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 3. Running the model without optimizations\n", + "\n", + "\n", + "PyTorch has a model repository called `timm`, which is a source for high quality implementations of computer vision models. We can get our EfficientNet model from there pretrained on ImageNet." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Downloading: \"https://github.com/pytorch/vision/archive/v0.10.0.zip\" to /root/.cache/torch/hub/v0.10.0.zip\n", + "Downloading: \"https://download.pytorch.org/models/resnet50-0676ba61.pth\" to /root/.cache/torch/hub/checkpoints/resnet50-0676ba61.pth\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a7036a6122874340b14aaef7b8319260", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0.00/97.8M [00:00] 23.55K --.-KB/s in 0.002s \n", + "\n", + "2022-02-08 19:17:19 (14.6 MB/s) - ‘./data/img0.JPG’ saved [24112/24112]\n", + "\n", + "--2022-02-08 19:17:19-- https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\n", + "Resolving www.hakaimagazine.com (www.hakaimagazine.com)... 164.92.73.117\n", + "Connecting to www.hakaimagazine.com (www.hakaimagazine.com)|164.92.73.117|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 452718 (442K) [image/jpeg]\n", + "Saving to: ‘./data/img1.JPG’\n", + "\n", + "./data/img1.JPG 100%[===================>] 442.11K 2.40MB/s in 0.2s \n", + "\n", + "2022-02-08 19:17:19 (2.40 MB/s) - ‘./data/img1.JPG’ saved [452718/452718]\n", + "\n", + "--2022-02-08 19:17:20-- https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\n", + "Resolving www.artis.nl (www.artis.nl)... 94.75.225.20\n", + "Connecting to www.artis.nl (www.artis.nl)|94.75.225.20|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 361413 (353K) [image/jpeg]\n", + "Saving to: ‘./data/img2.JPG’\n", + "\n", + "./data/img2.JPG 100%[===================>] 352.94K 366KB/s in 1.0s \n", + "\n", + "2022-02-08 19:17:24 (366 KB/s) - ‘./data/img2.JPG’ saved [361413/361413]\n", + "\n", + "--2022-02-08 19:17:24-- https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\n", + "Resolving www.familyhandyman.com (www.familyhandyman.com)... 104.18.201.107, 104.18.202.107, 2606:4700::6812:ca6b, ...\n", + "Connecting to www.familyhandyman.com (www.familyhandyman.com)|104.18.201.107|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 94328 (92K) [image/jpeg]\n", + "Saving to: ‘./data/img3.JPG’\n", + "\n", + "./data/img3.JPG 100%[===================>] 92.12K --.-KB/s in 0.005s \n", + "\n", + "2022-02-08 19:17:25 (16.8 MB/s) - ‘./data/img3.JPG’ saved [94328/94328]\n", + "\n", + "--2022-02-08 19:17:25-- https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\n", + "Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.217.41.222\n", + "Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.217.41.222|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 35363 (35K) [application/octet-stream]\n", + "Saving to: ‘./data/imagenet_class_index.json’\n", + "\n", + "./data/imagenet_cla 100%[===================>] 34.53K --.-KB/s in 0.07s \n", + "\n", + "2022-02-08 19:17:26 (481 KB/s) - ‘./data/imagenet_class_index.json’ saved [35363/35363]\n", + "\n" + ] + } + ], + "source": [ + "!mkdir -p ./data\n", + "!wget -O ./data/img0.JPG \"https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\"\n", + "!wget -O ./data/img1.JPG \"https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\"\n", + "!wget -O ./data/img2.JPG \"https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\"\n", + "!wget -O ./data/img3.JPG \"https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\"\n", + "\n", + "!wget -O ./data/imagenet_class_index.json \"https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All pre-trained models expect input images normalized in the same way,\n", + "i.e. mini-batches of 3-channel RGB images of shape `(3 x H x W)`, where `H` and `W` are expected to be at least `224`.\n", + "The images have to be loaded in to a range of `[0, 1]` and then normalized using `mean = [0.485, 0.456, 0.406]`\n", + "and `std = [0.229, 0.224, 0.225]`.\n", + "\n", + "Here's a sample execution." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAADnCAYAAAC9roUQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOz9WbBnyX3fiX0y86z//e639qV3dLMbDRAEARIkRYmklhmt1ihmFKMJTThke+wXP9mPEw6Hww92+M12hB22R7akkWStExxRJEVxARcQaKDRDfRa3V171d3v/e//s2T6ITPPOf9bVY0GOQWhwpXdt+7/nv9Z8uTyze9vTWGM4Wl5Wp6Wp+Vp+dEU+R+6Ak/L0/K0PC3//1Segu7T8rQ8LU/Lj7A8Bd2n5Wl5Wp6WH2F5CrpPy9PytDwtP8LyFHSflqflaXlafoQleBw3/Ue/9x0znU6rv4UQCCEAkFKitUZrvXSNP0cIgTGm+mkeF1KAEEgpMRrKUlPqkqTVIQwiDCWBCkjTDkmSEAQBSoWEYYCUCikMKgAhQWDA3VcJgTEarZvPMygpCAT2Oimqei4V5/0hDCDw/9Rfu0MGKAFjTH3w9LkNTxL7HONubD8adyNjDKUBo0FrqnaSUoAAXRqKLKfIC/IiRwBhHCMAnRcs5nNmeUZh6j449VYPFlOf49ug2Ra/+OK5H3iLp+VpeVoeE+gqpQjD8FO/V0oBNWD44j83QdcfN8Ie11ojkCgpLWgqRRCGSBkQhiFJkhCGIUHgwFYKpIRQCZQEhFkCciGgLEEpgUA4AAPpQFSIh4BtXWFbXwesmAe+cmAqHkA2+37V2QhRYfgPLELYZ1ZtYwzGgEBgtAFtMGVJvsjQWmO0QUpJkedkRc5ndRX05/l2afaPf7aUTwWmp+Vp+azlsYDup03CJnj9oIl/ekKbJjNzQIMQSCEJVIAKII5iwjAkDEOUUkhpma1yPxZAqY7be4HxnwGJsUy4OmKx1Ne8+c0Db9AAVrP054N/2XfydfAg9pCbPKJtxKkTtLb11kWBLgqKPMeUJQLIFwvHkA2l0RjLmx91+8brCLdeiAcWR98/j1yQnpan5Wl5oDwW0P20Sdhkr6dBVwgPdcKJ/tKCoxAWUIwBx4CRFsQCFSKEREmIVEAoA0IlCAOJklZNIISwrLUC3BpAhDAIrIrBCfC+NhaAHRiaZcz8k7SK1RRUaNsAPGEa4CdOPeYhDz3Vvl4qACiKEp3nFHlOWRTVe2oPuLqstRuNJ1QA2riv1h6cxUP7tMl8n5an5Wn5bOWxgK4vTd3tkm62obc9PWntdwKtNUEgkFK5c+x9jNEVwGhjCJRCBQqlJFJYlYOUElkBgkc6K48bLCOUjvVakdw44Flm6FJ4FcPD9K3u82doB/tOy+ca4eHVU92a9TZF9+r801KBAXOKpxpjKMuCvCgoygLdWKRKYyjQjbZgSePh1TRN2C0pl/qvWYenDPdpeVr+ZOWxgK4xhqIoKMuyPihqDndab2sNXsqCMPXkVkqhwggQ6LJAYDClrq4VWHYWqMCxYolU6gH1htcDG6RjuYBTIUhnnHuYoG1YZpFV3R3trXSqn6E9HqZaeOBh1QevODBL3zXroc2D97UqB7fYBJJSl+hCY7S2cCuWkX9pEWi0efUMrR8A26c63KflafnTlccCumVZMyRPqgBwzPa054LWusGcLJAIIQnChDhJLGBmgrIsKzZq0AilKt2mMJZ9KSkt8Ph7G1PBmKwYLU7VULNh4Rixv59GoI3n1/Zuyj74tHR/Slv7qGIqnvlgEY1/qR5gmlzWgDZWzeLPEXYZWmpHjcEIkFIRBIbCmIaXwiNq6bBYGAgCVfVRWcqqr5qeJHU1nzLdp+Vp+WHLYwHdxWIBOF2sqaFDCFlN3NPA64sxhrIoUUGEkMp5Hyi0NpiyqCz+xgiEssxWSIlwlrESgzAajEDoEuN0ul6fKyQIKZDSuoE5/F0yFgkck2TZJctIgRKmuqYygvGgqO/fv3ovGp5iS6d+CnA5FYIxouEe5u+9/IyyLCnLsmKlUghQyrJVbdnuw57kVRxCCGuAjEKEEBRFgWjohP2zTgPv04RJT8vT8sOVx6ZeiKLIivXGoB3TUlKhpHS6x3JZjdBwIVNOReANPF7fWKoQg0CXGik1KlDEcUwUxagwQgQBQgWgrOgvpEQ23MOktF4LUnl9rUGaUzyzYeAyBoy2jLcyvDklr1pyMDA/kOl6MP/hQcrqg/1lWludtpcMvH+uV8809eRe4vDqntN+z9UTnJQQhqHToXupQWGUNyQu65lPq4ielqflafls5bGAbhRFS8Yy7X578R9qZtYE1eYEDgJF064lhEAFgWXJUiOkIE5ikjgliiJUEKBU4AxqoJREKeu1UFnnhXb+twYlbDjeaRctI7AiurFgp42pDG/GWAC2J9ZsUzZUKPZ2Xj3QKJ8JmJbB23sOSAFa+LpodKkxUiOUtAuUECglEcLqxr0Bs6mPrQC/wej9F8JgdeHKLkz+FaQSKFSjQvVbnmbxT8vT8rR8tvJYQNcGJcgadB3b8seFEOR5vsSa/Plaa5QSKClRgSJwYByFIRJDKVywglTEcUIURQRBQBA0giACVbNaalbmAx6EcxUwS0aiWo9ag26DqRuJ0BYWtXR63IYjgGygZRM4PQh73fLpsmykqmvhrzVeL+EMZ0ZryjynMAYZBBCDEEHD7cu/q6wWNitFmCXgP81YpfP6qNUW1rXOGPHQ8wU2sEQ59c7T8rQ8LZ+tPFamCzwAuqd9dE8baPznIAwIg9Alh3B6YAEicOJ9YKPPLOhKhLQgIYXVu0oHztLpcYEldygjKtOZwyLjnBKcZ0IjxLaKghOBra92umHHkmt9rXDGtoe7wv0gtmuMdyV70DMBgNJ6b+iiJMsyZOBUAY1Fq3pWoy0rj4NHuHxVUX1B4BizB3B1KjS6qd819X2egu7T8rR85vKYQDekMi8ZMFpjjBX5eYSPblMdgRAWAKSf7KCNtsCKQEjp1Af1jw+i8EazKmeBaN7fA6WpwNZo736Fd9oFvI+xVS04TLZGOp+3oVoswEgwso4Qk04x/DA9r3nggzPCmeUYuKp+rlperaCLkrIo0E5fW6gA6dQMVSCEflAPK4UEYVU8QRCggtrzA+EkC6UqHXgQyMpwV7ebb8slv4qnoPu0PC0/RHksoBtHEeBZrsHoWqfrj4vAgbArVWCAQyslFcIYO8FNiTEFAu9aZnXDgRSVblY6OV9gMMKgjXUdQxvH3Grg0Mb+o52hrNTaBRLU76CNdvWuagiA0B59SusFIaTThVqPCA1IZAOkmuz2FAw7TwbtdMdGi4pB+hM8yy4LTVEUFEVOWdaqmSLPkLnCSwNC1MY2nEeCD5+2KhdVLVSV1IHXe1u3OF8H7aWB0yuF8OEkT275V//wf2eM86ypu965F/pX88edSsr2buNL0fB+qVf3uj2b96R+xnJwjaju3xwfVlKT1rf6tLFXehWZldgwBlElDLTvpCqfmtql0nv+2Mwl7r5esjMVFam8Zqxnu+9/gzEaUdld7J01ujlAcDMQV21KYT9rR3asK6YLVzcCIzTCWCnW3te9R3VP41Rc2jWixN/c9o12rVi3MEJiTOmO2xlpRF0n13sYNBLbHrbW1h6kAWGac8O2rhESYyRClBhj29DgRV4XuVnVQ/Cf/p3/+qGT5LGAbuJ8ay07q9ULS4YdKSqvBjgteRuEsFFltuttg3tx3npDqSVH/lpdge0fYY1flauYqCdJxSwN6BJKTWXsA88U68FVP6NpnLJ1FI49SmmQynWQsN/Vda4nV5M22gXFLky61JZZat8CNSu3oFtSZBlFntl7uJcrnWeCcEwVfD2s2G8XOoN0BjlfL9kMlFgykNW9UOWm8Kf4geje4Ul2WvCg0vxbOVCAxjjxYeDVUWt5FKeyojYNk6fFmcotDztxbZEIoavvhZCNZ9aTVxjriaOofcYrNZnwgGG7RjpwCyo9vKzBoaq6Vb9VeqyqBu4NRQ3Owgi0A+LaQ0dU49YIgTASY40dNcD793DjrhT2LiXYUH43tyyWC7TwwGqqt3ww66xw429Zgq0bXNg29co+IbF5/URlF6kXVgviDk5cF9t5oo0lTc0et5PC3lmK0rWJxIg6JsAsV+pTy2MB3W63S57n5HlOWdj0i17FUIGuEciGSN0cBAKQQiKEwghTuW0Zn1XMhQYbrTENg10TeCuvCCFcJrGmTtKL4TYNovUKsOJ66TJyQb3ye5WFcanE/IARnqE45i28igOv5qhZtmX1xgGxrDrTOMAty5KyMOR5WXke+Gu1saCrdYE0hjAIUFFs2aqLZ1YqsO2itGVJUjgvDjvoJMK6xwnf3DXAVkuLWWb2xtfRHa8Gr3FTw0snD9M//9gXywbLairWXAUa7WAcJFVzuwasaiGl2bD1YgmnLK5LwAUgbVrRZrWEd5Wsp71np4ADYYOsALEGfCEcIAvHUKkB11ajZnwCC3bCWKCyAKrdiRpjPBDTACZwPNDWo6q5wAhFrhUloJAYkxPI0r2DcZzQLWrGVNBaW4obg3EJSJut4445hlx1UtVYjVwhACj7t/BAX/e0BWVd9YVBV6CunSwAVpK1c90tKW4u2WcptwD5VnDk0MjlPj1VHhPTjQjDgKKIyLKMLMssk3NynE3NWFvG64Z2lRfN7FUGLQW6rNZiB2xW3EGXlLhwYyMr3axn1mUFQNaVodZ76hqsyxKtS4qisOqQJaZSG5K8R8Npg9XDXLHqHLcSqSAMVeVZUEXBVYBmo+3yLCcvCmx+Cft8T4wF1rgYRSFRFBKGyvoMa0VelMznGZgcbUqyPKPISqQ0pGlEmqbEkSKJrc4WA1pYw5qBJeCpNNPGDu7KWOiYggdfW0fLAPSnjbAf01KxOFPBYzUMmxoe4Wi+qEiBZ3MOeAVgvMTlEbcx9YVjVh6kXVvLCrAt4zVu8lcATy2s+qtk9Z2ygCgsYEo31qxYbNll9STPmo2VGCXSpUgF2WSOph4DVXy7O15DoHDc1aAFFCbiqFzh5nSLg6zL7jTGFAU5AlMuWA3nXGjtcnXliE4wsXcx7l2N58KeI5YYo7DqAsfw/bJSLXQWJP24q20LdiGqWsx4UKR+J/cU359+znq+YIyVUHUlJThpRjiOa04rgOp11p7XWDhOjaHT5TGldrRszmfz0lpTihJRmorF2Up7EaJemyrvBecGhnDidelyORhpI9WE10tp68olLAgbbUNlfd6HCvikRKgm0NVqD12WaBft5vV8otG8tVuXbHymOl+4OjYXbGtoUwihUNp6VjQnp6Go7uPbI4wC4iSs2sWraLznRxha7wIV2MEwGs5YLEqKogShybIZu7t7nJyMwQiOxxOuX7/BpfMXWMwzLl2+wHNXL3D2zCpBI+ihNJqd+4d8+P4dvvyVl4mTOheyF/s8u7dGvZpkaA1lc5I+IUVXv2u9pTe2AhYfHCJLBzKW+Qg3oUQ1MY3wZKvOkue1N7qah14NIByANyU752mDtDpad9ROXuNrCLhIw4oIWFblmbWXnvwdpFsofJ6SWs1Ro4K3HVdDd0mXWi9GtilMtUBMzAq/f/gy741XuDvWxHlGK4CFDhlnObNFgNY9ZouEvtjkz1055mcv3iKQmdO3esit2asFXlkx44ole91Is/41Bavu5QP9RQW4xq2D9lojrBrRNq+ujgl8NkGvTvBd4KNPhfssMFUOWE2lvffqleb68Clj7zGldqzHlAlsQnOtDYg6GMKeV4OvFPU6EoYhcRwThJ6+W/DJ85yicEpsd420o9WqCEpDWXWXLU3Vgym9jsf63lq/V+MGAdbvVEpnFLN8wetbS+fNQD1Mlt41UAKfdKcZKWajxaTLaaCqEa51rTfyi5O/Vko3eSux3tQBEMoGluzsnXByMmZl0KHXgsU8Yz6f0Y1Dzj93hcODY44P9nnpykU+/xMvcP/eHv/gH/1T1rY3+erPfpVz5y9wcjzk1s0bZJM5rXbCiy89Zxl0xdap3rduz6qX3QIHjbRGT1BpqqNqsdL3rJ9AiIaE5VieVzfJapLb+wkcSPr8IMKBpPHfO6G/mpS1gcYDr3Hn2TvIKrWo191CXR/pJngN9A0EtYf829TgX51i1Ql2Ia1DxJtwBqZSq1TAZSSjPOa7e2f46Djkjd0xk/GCJArIhCA0kAaGeWHQiykLJAeZ4v/+/bN8/6DLf/7y+3TisZ1bPhuJse/qua/9UVTSrH9v4xccp/4Q9rxKTYAGoXxzO5yulCwOzD1DXpY83IhoqCBtSzeoV9WgwgO8F2ywGGZtT8K90sPTHMDjYrqOwmvnfqSCkNCAyTIKk6NCa0EPfLivqFUJBlAqIAqtdwJCYpCUxgYDqDyn1Noa0qq0jxY8i0JDXtjMWl48lk48WjLaGevV4BmDlAShrCLaPJMwxqAL48JpS4qGasH7xtqQZQuI0nkE2Ny9jcnoFodaTeHusyTGOuAVGp8D2BoZLGsKjaEUhsPhjLff/oDeoMvWap9erDBlwTxfsNLrIGWPyWzG0eEeV7e3iOOQYjZjc32F2eiYj/Z32bt7g/XtCwwnCy5sDPilX/oFtrfWSdsxsXI8wy35VVBHk7YZO3l9Ap8nULuA548l1AY146L/PGd1beBZbKXXq0iCceKqcOBsZ6HnahWhdH3oOdpS1mIhlwJ4rL3XMVNTqyashrH2PrDMUDvw9X3m+WytEnAPcXDfUCG4PrZivHCU18Gem79erEYKSg3DMbx/Y4gINfPb/1+ufbckUy+RRc+QGU0ic/7j1WPmh9cZiBb/OvkiE5Fi4pDCwNfvdjmevMDf++I11tJjaNTTqj5qacpUTNLXt8Dzbss2/dvVemM3SKt+acJp1RJOv+u9EyRWzeQXqAqYG1faOsrq+xq863pYbbVTQzT0vA8rjyefrtd5gt21IRCATaQSRaFLx1i7LQnP7FyxAQ4QeLYsBMoISgGBFBXza65KGuNAU6GKgrKs+b43btE43z9HuCg25dmtA0rcL59CUbv0iODYraFWobgkOkJ4sdLU53kApmmPdfrhpWlRsyfRGADSlCAk2gju7w75/W99j6PDQ37xa1+k305QlGSFIVABMlAMj47o9Hq0woD/7p/9c175/E/wE194jVs3bnC4v4PWmps3PuTihT3+yt/6W2wMuuzcvclKP2VzY2D5RQNQpdeBY2VNYdyLOA8eIVw++SetGCgrJl9xUCt+VkzIZ7Rziymmag9bvJHFTvZKMBf2O0cRHYt1i3XFjH1j0niSHeP2o+e19diAhlZV+OtqEVk0dfDOYLakq62ehmNjnvNSM1rcNaaOANo/nHP91oSVwQoXzp3jmeef4923ND91519z7f63eO/wCkkwZVv1efvWTcTKJuNrb/ILv7zFv5hdRecCI9uYcs47xzH/xz/+HP/rL79NNx0tkaGa02q3GFAvCP4thDtTeAnFzTfpvRS84cx/V8No86hpqJIqG0t1RZPv++tqplsx7sYyVi1yolZcPao8noQ3+AlpmUNQiduhraDb6UG55AfSMwL/XtL73tYTWguX40A47zgv8hj7XekHnlDIQKJLoDHYfcPadvNigj2u3L1rxXj9HpZVgDGyamIvClbv2LimoSWp71Uxl0YbPaBpd9N86Vo7wbQRHAynfOt7H/DJjZv84s99kfV+i0hBnhVMpxNKbcjmGZ1Oizs3b/D7v/3bnAxPSDptPvroI373d7+OknB8uM/6+iYr6ytonfF7v/3bfPVnfprtzQ0SF9RSDXFHxn27aGz+Ya3rd5JN7HiCijHe79agwOlSDbXRzLsUiRqIHOOt12/j9LDGAZ7wNM0toJ5zagfc7rz6CO4RtrgETLKh0rBepjVvNR7o7QVOsG4a+qgZKjW7tezOM0k32YRXLQh3Zn2uERKzKNjfOebgOzd5KYoY//G3WRQFN3/5ddaSFf7nf+ev8uZ3f59/8eY+OyczevM9vnd4yMnN6zy72uZCdp/B4GVOTIo+mdmsd6Xg+gH8P751mf/qK+8TBXNniPXP1g1ANEugXAGiEbhQpWrB8N4UjqRX/r/VClPdX1RtUUkp1bf1zK+nca3YwX/y48DZbTBNBVuJ+QGbrD8W0HXOFLUVVRiUNBjp120Lhj42woJuk/WBf0GJndQSD7q2UaWsG0DjBqqyng6lEbXNqoGAsmFkEMJU10tjlkS8JdR09be90uCqov4tGoO45idmqZv98333amqf5SXNUcW+vJZLsD+a8403P+SjT67z/DPnWO0mhFJa391CM1/Mabd6tBPFdDFiOhnz9ltvs3NwTPpHbzBdTFhkMxbzGbOTE9rdDiJq89233iNE8Mxzz9BJ0woErDuZ03cDRrt+E3aBs4uRbUNZL/Gnh8GPdTGidDhqgcsYkEJXi7Ifvd66rZqGiqaCQDieKrT1k3XHMKYC8iVx1S/W7t96TIjGteDVU7Umt/JAdYu8/abE38/d3wm6Vh/afGGo7+a8AnTtBuUNQH5xkQjk927ypd/+Q9LhDpO9EbNWi/sXz5D31wnTguNbnxDv3uFXLvf51fc6DDnhb/9sm2k246eSl/mN6AqtMqMoSuRKyImJ0SdzQPKt4xV+9f2L/OWXriHcAqcr10PvpeAr7t/OL15Uf+NJkSNz/rhfOKlQyC5GfmadjlhtNBJeKl6SgYTEbqTogy7AWfCrFscjljl93+Xy2NQLHhwrNinrQQNOJ+o+e1CtW9MJFkIg61zo1deefTUh0hok7MFHuTCJpc81y6jDYRsVbF7UNEc2G9QfrthQ4zvn1F7driF7WtBqMIuG9V+4FbzQgsks52g44Y+/831OxjO2N1Z45tJ5umkLhHUzWywWSKlIWhGLxYw7O/f5nW98k/aZS3z+lZ8kL0qEFkQq5MzlZyi1JGn3EFGKiju0kgAZd20eh1Ov79vF92Xtp1tnjrPs7skLA66ZlLAM04GUz0rndbh2saknlMKzTx/Z5YDO+bU2xXtvaRG4nByNRc2ySVE9C6gNYUI29Mj22caYxrBzxxxhsAPx1CJvGsPZi8MVAfbA5sDKq7pcBwsjkGXJ5T/4Ptsne7Bxhdalgna6xuWXXuOTL/0FVJoSBQEj+X9g5/230eGXua6njI7us722zdvlBRYzRdgTbAUFkyBilmcsAg3YnB6/eus8l9I9XrmwTxDIpXrZKCHPQhts0+iqvRoiAl4hVi9wtd+txQvXh8avMP56L1M0Jq9YcrqryVjD39qCq4+OkwhRWJc3HLh/ikfPY1Mv+NVHGid+Czd5XZ09g/XFu8AADdHb0NBVL7GLJj+sVxlOnfiwmlWwv3SvT71WnPpw6hq/jtaAu4zc9qmGUtc313Lpyup2JZJZrvnk1j7f/u67HJ8cMhoPuXzpHC8+e4mNlT6htIEh3i1usLJClhd8cO0Ov/eH3ybTCWvblzg43McYw9aZs5w7v4ESgg+3z7C7u8/WhUvMZgXjecbb71znmQvbRPJUOz74KktCKFCFeD9pTFf4SeoHmABh6lgk6ZTXfuFpSkl1Kk/n+Wp8OKkbi84rYMnmIAwI6SZcrTaop7FlVxUvM1Tqs1IYAvd0r/sFGu3eEI4barBKleAlKj+vlvrUuWdVeOQWg9mU+RvfRj93gWQ0JV69xIIS8d3f4dv5jHxtjTSV3H3vGm/d7TINtyiSi9zVBXfDlF4kWC3HtOcjZkjCIqMddBGRZIGGMGVawj/9+DmeOTOjLcdWVPfAaFvtVK/Z961A2Ph280DtPROMa78G1zFeRmjey/2uhq9vH7/4+UPm1DUCKKsHCGGjQEtZQC5PXfNgeTzeCw1tlhFOrSCw+qyGka05WCReLyUqNlhBwAN46lvDuOd9+pQ3zbEmHnZmwz/TU4T6L2pezHLnPKpUz9AVC9I+isn4Hz+AoNAlo1HGZLrgxt0Drt24w5079zC6YD49YTDosrU2YKXXIpSG6WxGFEUUeUlmBLv39/nw2idc++QOWrWYTA6YjI4YnxwTt1IGgzY/9YWfYNDr0mm1uHV7l1e/+Brff+cTbly7SVYUVnVQBdrXDWCc5FAKnyNC1AwX56r3aabaH/NS81azNDZq4BUoUYOv734tHLM1tRjvPVNqX17HobzXQwWyPsTAVDNFiHocV6EVriuUqUd99cHU53ojYLUkOsJTTREBOMnEM3PrfVKDybKLk6Fstzhab9P75BbrnZiwyGCtw/Gzqwj5Eff/6Nc4GilOxori7F+mGyhanVWKg2PkYoGJEwoCBhR0VMFdo5kYQdJpoVHElCxkwN3FgH954zX+9nPfRFBU+mbjfYxrOYB69tcMFVFSq3sqKu/ucZoMlJUeV4hGG7nr6kXSyTHemGeWPRWsd4IfM/YZRSHQ4Qzd0USmS6vdeeSYezx+un5VrqJEqvo2xIQGUxUNVmAa14jlJqvIYSUa1Pf7VJ7lG7iuxtKnB5cAls6qr3z40x5Y2Kp+t4MhcDcxaEqsG1imYTpZcP/+AW++9SG/9wdvECcps3zC6mqf6fiYo4N9VgY9Ll/cJk0iyjyjUIpFWTAezjEaFmXBZDyi3+3wk59/hWuf3ORwb4fNrVXSJGBldZXXXnqRFy5eQCrJlcsX6Q/WeOnZi+zdO2HaP+Y/+jM/SSSN1YX7Nm+8jxfcjF8MRQ28Uj6ZEWkAtQvXsutQgKhE/+YU9+DmdZA+eKDEs19T6YcFzbFvyYQfZabycrGrsOPU1JKU9aJQDXWbtYPUaoamt0EFnS422/9XGZL8ABXUoCaM8+l3XjmNnB/oAmTA7H/2N/jk//QPCRYTWvs3uV0MuPM//Sucyec8e38PjOCa7PKv9vcZXfk8CQWTOGRqIlZGhygzZ8qMTCnuD55HLOZkSQfVCgnDmBRBnEhuzSO+f/AiL6++jbeo13PKq2Ga6pO6XeqoSerrPFAvhejWc9z3iahUMqK61p5lgbypVfQ2UqDhsiaWfHVV3kKUM8rBAYvkR8x0qSrvxCVTH2mu0t541XTT8sdxh/ylAirLrz1klu/5KexziTU/9ITaCdwhND53QiO2pbLmN6gNVO/hv/ecwTEhDCWCRV4ymWUcHg25v3PAt998l2984w12d/cIQ8WZs+dotyQhObt3btiQXZMxHh3R7SREgUTnBTPmHI9Hjj2XbK6scHZthXbaIlCKL/3EC5yMv0KUxBwcnRDGKWv9FmkEhYbFdM6gm7LWTXj9c8/xyz/zKqu9FG940afIgVkSE5rO46L6/qHCw4958Yu6Mk4ag8oDwfu72n61s0oKbIY5pxi149Ht6OHu6JmTdrkPcPeugdughSDAg7RAGEHwkPaT1SxoQIxb6Cr965KtwTNE/7fzzqjcm6yU6ff+owJo8D65puKVwiL4lUuM/+v/Ce/t7tE/uEt85x4agQpj4gsvcGH/+6xzxEfpIb+ZlwyFQAeKIrP67gPZIj35mHnnImb3DgUxuruFWECqIJYFl1qCQay4MbnC+fYO3ehexcz9u9kgEKdSEALMabVD1aNUYIhx0Xqmbrvm0laxOt8g9UK5TOiEbSxv0KieUYkQS3UQZQxHiozDh9TRlscHuk1XMD9BK4x0XStANEQv3wbNMbj0mmJZ1KgNa59OtcQjPlfPaOCIqJYue0/pY+epRR3LTHwYoeVI3h1HA9N5wfBkxp07uwyHM/aHE27fvcf+zn2OD4945+23yXRBb6VPf7XF8z/xKu12l+OjA1hMyRcLxsdDtjbWODo+5PBgj7NnN1mEAePplNwY9g+PGQy6rPa7tMOAQCkEgqQTsdpdozCag3s7/F//L3+fF154jv/i7/x1FouM+TRjY3ud8bhkdaXNhbM9axMwyy5tvlRBAK59jAEjhU3Us2Ruf8KKcOkPqwVbIKQLzmmM1yo/c20VroIWtMTlOqBmoHiJ0wKsdPexRi9HFkQd61RLFrJiXsKcHqX1SugBt9YanBKxhKH2irH/CpfCxYOF8AuNqVmxv2flu2ks4QhWumQrA3a5itAF2mik0GTnz9L91rcxa8/zRXGZ320PWOiQMAkx0xHz4Q5Z3EHGWwxFh0gawiQkHn9Mv9fi4uKIC+khz/Qm/MSZKaKn2Ly8x/gk5O6dmGzu2b1szG+32FAbvqyxWrt3sovmkq2oBh37S1iJrfKld0RpyUh/6lmIJg+ulybwWQfr1rbTJUAe9x859B6TeqGCxeplT0vfPjKkpr4NDwJ37ek8B7rBLE8/71N47EOLz5lgH91wdG5UQhiB0II6yto4v3HDdFGwyAuOT0YMTybki4yD/UO+8Udv8P1334coREtY294GIbhz/Rrjk2Nm8wX9wSorcczGmTNcuHIVESiEKZieHHB8cEC+mJPEIbdufEKrlXDvzm3OnjvDdDwhLwobDo0kmkQUhUZEXudo/QaNsS5Ozz17kT//Sz/L+x9+RF7YpEOXL55DCMn33/6Qr3zlBUJlV3Lv/1m1aUPdo0Q9SP3C8kM2949d8TpV5UJ5EbWaATwhcAoCu8pWoqxnh9I4DukmZWnqMV/fx+14ggUEm/VL1J4K1YB3umX/Z9OuIU5JHNVArXvMg4cXyZZhFwcgPgVjo1SLhXWLMqZ217JSm8H6nmogAKPRBibtGKEUwcH3eGF9wOv9lJuLiMOpQIspetBlPb3D1vAGl/qKi9036cfHtM9KyuhZtrbHdDbfI+1mtLua1dUOa501dJbz0su/wPvv9bj1SUlRONe5SsdLDZiNNJC1K55rj6V/ar9b0+jDiuw2BnPlqNBovVpOMY1VFddOzdasJeDiU+wcj43pLlXiITP0f8g523y/psX40072lmGvq8RY3WSel8zmGcfHY0bjKTfv7HJ4PCUvS3YPDsjyHK1hb+eQ6XjC7s59xuMjRif7CFMwPLzHbDokSrtcvvIs09EJW2cv0O90MeWM7bNbHA9HhJHg6tULbJzd5PatW9y5eYPdO3fZuXubOApZWVtlMZuiywXHRwccHuwTpy1OToZkWUa/v8Z8VvDGd9/hJz//OXrthEhaAUo7AEmTiF/+pa/xtZ//CnEcoNqSJI3RSJ45d4Zupxkw6iP3Ti2QDeOQMU7U43Rk+ZOKwC6KXtQqIRf1SvOdLBN1LdOQxKqJa/ySJSviXE1s47ODnbZviDqgAlONR+8dapYmtjvHLCsBvN62UoEZ6smwJA77qgsrmjsQP82SLeB6Ebt0l9ssw/b60o0Ug5Gwf2GVC5M5O5liOJkShAU/u/VvOXv133EmvcH2mRntRKAKQVHkbJ+FOBUU+R1UaEgSkJlBlFCOh5Sxoiwk6H/Jq69e5eqV13jrO13292yD2kVR1jkbGhBbLVHG92tD8qhaq+6TKljK81qvujHLGCIaY6EiZs72wSlS6IljKQy/ceM3+Nv8708POOAxgq5fKSs1gKlXG/8ila/tQ4GyQfkb1nLf6V4V01z5/Llg0FqQFSWT6ZwsK8izgvFoyiLLOTwckmtNWRSURcFsvmBv74jj4zH37+8xm8/4+MYtToYnpElAu9MlTlrIOKCVtmh12syzGWknoVumRC1odSIO9+7RXd2k21/h5HCHD9/+Fq1On9loH6MEvcEq1979Pv1+l97WOqtrKwhKpuMR4+GQxWyC1AXDoyFxFJKmKQd799lJYsaTKUGUsHPvHkeHR2xszTh78TL39/a59vF1nr1ykUE7AYnNqgbYPwyt2G6triT0WpHd+VeCMorS67xOtX1dlg04NWOozzkNUk9GcXkuKrA0VQCEDXZojM8lAG6YdGocxuuAG4IwIJyKob7eu9svnyUaF9bMuXnctrlu+Nkuj3xj/L4WHpRNdYY/x6VkqdQKdf3rz00gEdQ7Q/iautmFETC+8grXb2/xvwl/jlj8Jv/LL/43nDu/Q3cA2QwWC0ErhTgxXP9EMJkaytLQTSRJakhbIUWRkSjItWFv/4AkbaGyGeOTd+it3OMXf+m/4M3vTPjoPY02sjLO+7b0QRA+oaWXNHxmsqZm3AeSuBMeii8yEFWAWR1OfGrHkMYvMJwmtR+cvMcnh2/yqPKYma4tVf5ZTB1NI5anabVmNVcQt7r5UFzv36yNZ/gGb1DQQpAtcj75+DZvvPku337zHW7d2aEUEbnOGE6OMGXJxsYGV5+9SpykxHFEmc05ORpy9+5dDJrxaEi33+fln/wcaadNFARkWcF0MuVgb5f5+JiynKNNyXw+IoliiiBABCFnLz/DbDZFGrjw7Isc7N0nm08J45jB2irT6YxOq0XSSrn87BUClyvhcH+fxXQGBkIVMi8N0+EYISAKI452DzjcP+J4OGR/b4/h4TGLRUHcajPodxiOpuzuHSLMCv12anNWONFYCeGs4M7pXViHPmWkFXsbYqwXw2pxtKlPs5OtNjLgjfJPpCHNpgWVlU2hjkh06oHKfVdUJNczRB/x5flV7XPrPQtOQbWonNLqCD4HnhVxEO4vF1EjaWbdasiMxoFeddTULNwDrcbu29e8EMdshX+vBvj6laPmsdU1QKX/pfrWMsLjtZ/iHxytcSX6B/yNv/b/IewVTKaCIFCEWtPtAYUlQFsphErSGmjMrESMYToJWFuTzIdz0tBACMfjnNWeJBKa+cl9iuTXefWVLTqtS7z9XUlZBhWj9Ab4umZ1G1YkTVARNKt+W2a9tlE9WJcUayPktI0Yh7XKZmmhO10aKif391ayxtfOf/kh59ry2FI7Pqx+otFYgkerAioANjWzAn/PhvOHMeQlHI1m/PbvfoPf/q3f5xvf+CZFPmE2GwGaMGqztnWGsxevcOn5q1y+cp5OJ6bX6dFKUspswY1bt7nw3AXGozHHxyekrZTVtVU63TZCSO7euU9RZuzfu818OCZsJahQsZjNCMIQLRVnzp2nFIK1M2eQQlCanPPPP8N0PCIJJLc++ZjpyRFJkrJ9/iIXLpyjKAqOjw6598nHTCcTwjhhsL6OigJmkymT8ZgkSRgeHfPB997i0nPPkSYp42DE+PiI4fEJK/0+02wOUrB/eECZd1lZXbW7Rsg6YQ3Q2JHi1IpHk7k+qGKoT6p7qAKJJxFxgSp3hAdLb1PwASJeTPWGmQYrrLIfuDaTbmLKJYlXVOQCaESf2XO8sc3u5uDZricnNZQ0mWgzMste7rxuaBiYTelyF9QuYzXYmuWOXQJ/U4ezN76uzhGW9fphktPjH3/QYm/4r/nSa/+U6cJwMYJIGcbzElMKyhm0kpjjYUaSGIQWrG8p9ndKxkeQLWYY3SZqhZT3croJtFTG/o5ic73HYjbnqPwe/Y0Tzq3u0fmZV/nmNyIWWYRo5KCoMrk1GthK+35BopEAyPcPVd8Zp0s3CPKTjHn7Pt32ZYJJsrzaQUPqE1W/6NKGwwdRTJEXrAabbKxsPHLoPTZD2rJcVH/8THPUTwB3XSN4C78qC6BA8HtvXOM7737C7s5dovV1Xv/5r2G04WBvjygMSbst4jhga2ud3qDHfDpBUVIsFixaqc12FsDR3V1GowkgCRSgc4TOmU7mfHLtfSbjGUJqolaICgXT8TF7d+6Sdrt0eivMRiN0EHLu/DlanZhWFDCfzpgNT/jg7e9z/+Z12p0OvQsDXnz5ZaSUlGXG8OSYg/t3mUwmbJ6/xOrZLVbPbjIdjjg5OiKfZ7S7XW5+9BGmtEaYoiiYTSZMxxOm0xlJegapAjpJytFwhApjwiCkncYI1Uy8blgscsIwRDrjW7Xx4ZKbjBOqmgPUneM8qNxcFcuT+Akq0m1dA6oymiG8V80pUdL7A7pp7idcpQKoJDGxdKzWG7rgHxoJbIRmyYXJo7FnYd6LxhiMtATDG5eFqPvJs/FKzykagF3xuYrq1ZZ2/z6mkYuWWtbxi4KtC1XbWKNgwMc3zvLxje8xePWfMzMDvvfRLqXSlBIWE0Eaw1pfMFca2ob5BERo2Ns3dDci9nZzZjPD0f6YbkfRTSU3P5BcPV8SFwJuGFZW+4hxiNpuU2xrusU7fPG1i3zjjQ2b0EoImjF6zaxjlarBlWaiIeH+Ni5KsI4ZECSLNXJzzFH4LudWf4riuKTUpW+E6n5+oTZaM/rwHjwTs739Mvf/4T/lxmHCTz136ZFj7zFFpC2r+6V4MGrM9/0PNHz54gaTZ79Fafj9b3/I1//4PTbPrnCpfZ47d+9SaMNiMefspYsopYhixZXL50liRaQUYRAwm89RUjAajQA43D9k5849tDYcHB7SWxtw5swZkjhmni1ASLLFgm6vy/HhIfPZlOO9HYpsQpHHzOZzDg8PWNvaZjGfsbExgLIgyzMW8xmT8QhjDEVZsFjMGQx6rK6scGt0y+qV8wX5fIIQ0Or22d7aYDQ84ca1a4yOTpjNDTKIuHfnNt3BgDBNIMDurEFBURRgDEoquv0Bk9mcTjuwkWYycCuzwWjBNNOU2ZT1ICBxuzPrajI6vWRDovAZMl0XWEOdsamjETZS7VMMtT+2RQu/k7QBr8OlZqRLPkSVPC7wG0VCTR6rHXUd82/IFoAD2dM6RqfKsAa2ppbXA7VrWPeQ5eP+dqbWDFCrAHzUpzEPssCl7Tj9O1GDkbsTni36u2vHqoWAhV7je9+5wdtv/GP+3i9vcfFcCnKX63cisjInm0K/A6U0TBYFaRvmBjolLEaGtJ2ztqE4zkvSNcP0umZ+oAiF4d2vS157uUURlZj3FSocUB6EpLsRer1DmA+40hV8dFy7htWJbryax6rBTpFa+1YN1wWBbDYxoZIURtDNn0GYe5wkH7B97nOc3JuhC91I2WAIhaJFwPxoyMnqHuurZ/jg5lv8t//i23RiSTG+x998xNj7keh0gQZb+GGuqT96IDCiRAu4vTfl99+8QW89JMsy7t67zvDwmNmsYP3MFlGouHBum3YnIYlCYrfVzXA4ZLGYcXg4YTweMZvNGJ+MGA1PSNMWk+EQpSSLlRWm0yndXodLly4gjKFczFEYrr33DvPxkMJIOv1VuivrdAd9jDB02ylKQGk0Os9Jo5goimi1WsznU2aTMbPJiDDcotNp026nhEnM7M6YyckQrUGGIecunCUMBJ98+AnFzi4mbTEcDgnzgqsvXaIscgKl6XZSssWU4+EJaM1gdUAripFSUpRAVuvohuM57374CfNsxhdefp6L22sVGNSsSNTd1fjGHqvdxZf66AkEXa9awGetarojembvZTbPOj3DdAxQG1EFObj/HY412rHZWg09hWl84zWMS/65QjeCcSyke1nam8k8AakzPYMP9PFbWFXPqLwVBPV2OfU13nhXvb7LZ1BrJLxyQ5CP1zCjd9GjAya3f4V9OWHzwg7IfSSwkIaP9wR39gSdLkQSjDJ0JQz6gsVtuzB0OpDsKC693OGdb07odiQb2wauZaSbLdgUyOMAM40odtrIiYBixnPRCocy4IgFmMIterLOWyE8xbOt41rPHbHSol8mfS9JAUEgKfMCIUK6xTmmh7e5n32flc3z6GGEngm6cUwrz5hPxyxKwb3ZITfMNxGHL7CYR1z63AptCiZh/six95h0uj+YvS6d0ViSHnblshpKMJoU/Kt//XvkxQgxTxDM0GXO/bt36HbXuHj5Aqu9Fiu9NoaC6WTGycmEsiyYTEZobQgCRRRFTCYTsmzObDqiyDKy2ZRFFHF8dIRSijPBFkkS0e12uHWwz9HOHcZHB+iiYHX7EoP1beJ2CyMEg0GXIBDoIufk6JCTo0P2dnaRUpKVBbrI0WXBaHjCwcE+WhdcuHCOja1Ndj++znw8ZjgcoYKItJ1y5sI5ikJjypLjw2OkiukMurQ6HdbWVomVIgyl3R2iLNFSssgyjArQoqTdajHPcoyxjPXXf/N3+fv/r39EkqT8lb/yF/mv/sd/o9oO5oE2N/WP75fTZ4pHHH8SSuXi5dibBR4nqlYuQV7qF7W3TBXBJBCi3mC1NtLwgEO+1yfWygmvylhmk7VZy9S5sKHBeGkwabNk4PLn+QxXHnC9a5OH+ipbWXWZrvyGfS2orvedbyqyL4A7731MPtshTltM71/i/tERu7de4tkv/BFJb46KDWECsxHkC4HWkjDQDLVgnIGaSEwmaAlJT2uiWUG00uHoRNKZ5SgBo0lCMusSLFpMRprOokAVfVpiQj6+y1dbF/lOa5N74j7G2JwKNmmPN29WtNS1uleV1Hr2OsDCIFDMs4I//J3f5LlnXmHj/HkSeR49yTicntBrC85vpxzcm3EnF5gggRBYbXHz6wfk999g6+xZfv6nf5rhcMR4Pnzk2HuMwRFNmuqOn7Kw1Xuk8UAk2oPFiTla8Gu/9QZ3jg7ZPrfKycmQ+WzK0c4h2Tzn6hcuY7IpQgcIYjK3r9rB4THD4QlCGKI4IAoDgkDSaiUUWYfhyTHZbIZUAqEkk/EEpRS6KFjf3CRMQorFnLsfvc98kXPmyoucuXiFVn9AksaUZUZ/0CUvFhyfzNnb2eHk8IgyzxCAkorWyjpr29skrTZlntvVNZRcfvZZPnrrTcYn+0xPjtGFIYpSOu0W2SJjdHLMbD5HRoL1zW0uXrzAYKVLEkVEQcTw5AQB9PoDlAwIgpAoVESBoJO2OTgeUZaG1dU10rTD1vYan3/1RZQXL13D23nu95GzQSEVcLgfjRVFtYvsqUTXJ6zUjgoNdYIzfpkKlZxetuGDWUUjVaAsaqbsTeX4e7v7GG/0sfcy0sFABaaVd24FxJ69CtPQs9LkJ2JJteCBeclnvTK01fX2XNaI0t7bBU34/BoWXQ3eTcwDuxfWNYr50T7FYsy5jTMcHoz53GrKvfcvMooPMduf0N8Y0Y5h0DOMDgR6ZuhtGkYngnkJWWDQuWY2TRgVkrFRaBlyWG5zGYWe54gy5qSMSFRAoEPm0xItp4h2iAk6tCYHfDHXvN/vc41j2z7GB5fURq7KYImHXt0Y875dXSJ6ITnzzFX+5a/+E7pBDxUHhJcFul3y0y9cQKtz5MUVEHb/tkSmTPduwKTF9cmMNDmhi8SEC175/OuPHHuPL+GNaK7fNWN64NzmwIeqcx9yU8Bw+/4Jv/MH32JlYxUlJHs7OxRlTtqJ+U//9v+I9a11DvcPuXvvDovFDIPdXWE+nzOfLwhCiZAwm06JwpAwDAkju/ttURTEcYTWBTrPONjd4eTwkOloxPHREXc+fpf5ImPz7BXWz1/kyovP0+51yeczyiKj2+2gAml3cihLTk5OKIsCIwRpu03aSml3O4xHYzrtlCSJicKQrQtn6a6vM75+h707t9m9f5+1tR6ttE2SpsTtFptntxgOZ0RJQqvTY3V1hSgIiIKQPC84Ojomjlus9nruvRRxIGlFgtZ6n6woWP/5L/K1L75Ep53S66TgggKkEdXOHH7/LV8aRMzl0BXV5NZaPDwM/gkoAsvuKmND5WJkWB6CDsyo2V4l8os64YmhVjtUm6wKU4N29eBaZVEH6HgnNLBb0Zg6AU0FHDT6pQbEitD5ulY1NA13Kc+fPQNsMGt3j2pfOK9kcAxZUzNgz8qDXNEVBdNuj+noY9TgKhfEgvKtc8y/s6Dz5T3K/hyZZER7XaKNKcWiRMuA3sqc27cDdFszywv6Zo18PyCchhRG8Vsf9fmLHQimBiVK5hJEoRGEULbQBMQpLOYFmRa8bDTZoMMtM0aLEuGCuKuWcuHejTfDA7QRdXpNXH9cufQsvS88S/Fexnj3iNGtMZe/nHLxxVe5fftD1sVVhNFEQUJX9Hjl8udJwy3eeu/3uHf7HZ7/ouH82k85FcfDy2PX6VYDYont1n9XzeOZQ3Xe8l0MkOeG/+6//30KYUgSyc3r161P7Lmz/JmvfZkz66tkRU6Z5dy6XXL77j3arZTFPLebVmJQUqKkZF4ULOZzgiCg2+2SJAmjo2MQEqkEh3u76CJndHzIR6VmMhpT5CWbl57n/HMvMFhZp5W26CQxJg5I04QoDjg8OiRbLFgsFrTabQDyxdRtrx7T7fXJs4zpbIpSEq01SRzR6vaR0S7ZdMLBzg7D89tEkf1+sLpC2m6hohPanS5hGNPvD5DGECjF5tYWRVHSbnWwG4EqgkARhIF9H2FIw4AkVKx0IsD6NWsE0ouVBu8iig9drXZCaDIqrxkzFnCfRCMaOC4kmywVl/S/Dvus2SvVpGx6MTRZhHefk43x7NmoJyFNSiFq2b/WOjq/2Sr9aU1rq0f6Y82YQH+tPU83VBBWdDbabxHuYwkdBLmON9U9rJFNe/cqYceHRlQbeApj2OiEHLnv7sqAT4Z3eCFJWA8LinGf6NsxZVujVYacr7MnNdHVXTobc+azE7KsoBjnhMLALCAaZyyyPQ5251y/p7g/XfD3vnCOdDbH6JBQKVAKNS9RwRbZcEaU5EzLCe+OIi6FqxTtgnssGn3jSmX4tOzXRwcuyQ8NTxGB5PXLL/PNb/4WLTmjvxLwc3/pNfYne7YdgV5nnVh30UXBjVv3WcwyzicJzz3/K+RMqSL/HlEeO+guDc1Gewio9j/7LGoFMLx/7TZvfv9d+hsDJtMx+/v32dza5M//2a9xdmOAKQ1FltFOY86fP8d0OmM6GRO0I46OhwRhSBhEHO0fMJtPkUrSbrcRrZD5bE62mBN1O8StFmEYMzk5YTGdMp1O2b54kSDucvXFF1g7s4U0hu2tNVrtGLA+sJPJmEAqpJCsbW3S6kwpsozJWFHmGXEco5Tk5PiY3koHoSwrVmHA1eeeY/fGXbr9LqOTA8ajEe1Oi8UiJwgj4iSl2xtwfDRiNpsTqYReu4XA0GtppFSkaUqaJBhjiKUkErIyQNp8CcsM1nrciGqTSTQEos7BIIVGG0HpBqTdH825GDnWpTH1LsFPUBHCOxtZ8V/gtvV2sKkbulPwxKFBK70k7hcqvGqiAdr+Dh6A/aVN4PSRUU7UXwpGER6c7YOa4b84sdkAQrvvjT6lwquB1IOqzz5mwVs3GKCu9b9uMSgbagW7p5hBkHH+TIvknQPm7cv8q2zMKOrzph7yUhQi22ukJkfMY0opOUoS5uUB4laffKckzBJWe4asoyENyIsFB1rTjRLObrSZ3g94dzTl//a9Q/4X59sE0lCaCKVDEIpimgMKoQ0r7ZyMjPd3Si72WxTrIXvYcDK/oDQjCJd7xYNwDbz2tUue37zE4K/9AidHH7Hy+grd1RVu3H+PLXWVlfQSg6TDrRu3ONg/4GjvA1Qw5vLrnyeIu9zf+4j54og46j9y7P0IvBeag4CKMYjGtz+oGEAXgn/2z36NolwQRnDn7l22tjb5a3/5L3LhzCYBJXNdMFvMyLKMMAhYW1uj1+0AhsGgy71797h39z4CQakNMlC0uz067Q6hChkeD9nu9VgZDAiUYtrtkHTarG1s0Bv0KbKSwdoKYRzRShOEhPl8gS5LxpMJRZ6jlMIYQxiGmFYKaUKchghtyPIMFVpVxtHhEWEYEgQBoZRM51OiNCHtdYnimCLPmIxHTKYTiqLgzJltVgZ9nr0aUxYl89mctcEAhWE2m9FqpyRJYndaloI4aGwQI2hM+WUu0BQlm196a7mPpPKBkMr5NRqBjXrSoqmNeIKKqH585qkmI/CBDl7311Q71Hpf97dotGvVfo1IpVofYc/XlmV7Pa5FPsuOJNYNb2nPPuE5mY3PrBZMV5ZVIk4mMdYP2D663hzK6nIFhqKWXhxLtuTbApCVdPzG4tqqGYxlyuqs4vn1Fh8ND7gsFboVM1InvJ9OiFsKOQ8pyoKWLogikFFAwD7j/IQkyUnKgvZUgJozac3Jdcp0done3QFfXBU801vnuwcL/t93FvzdcwoZzhGBscnkS43JIie+p2zICOYnHIaSraOU0WDBXOraWUr4kdtYLR3rt29vrBrIYHdBcYvm+sULdD5nKJOM8aSkyCcMkpdYHE64V+xz5/q7LGZ3WT1/lu7G84BEm4L11Qvsn7zBevjFR468HwHoNunsg7JocxV6AILd6BIYbly/y+99/Q944QsvYzBsnTnPL/2Zn+PSmS1iockWOdPpjEWes8gW7O7u0un22NpcIwwkwpQMuglRoDg6GVOeGPorKwRhTJK2OP/MM4ymUwIJeTanvbrCmXNnGI9GTifbYjZdoE1JGkdgSqIoJFsUDIcT5vMZUiqGw2OyLMNv2y6kQChlF4s4IowjkiQhSSPSNCUMQ6aTKWmrTdrt0FlZZX1zCyFhkc0py5IoitjcWGdjtUen06csDaaEosiJ04SEFO237xHQCiOUoMG6HtbyP6DLxPI1wqkiwE5M1QCRJ1GtK52sXo0/IR3ggAVIWY0/z2TBmpxEA/VE9T21SsGV6lbu+mWNmlMnVABgXJt7UGjMCB9Z5Zh2M0esfbZNpV6Z+ip8MfgkNvZAlY6eGopMrUGp6ldijJcDLORqX19KxumQtStnWXn/kAujOW/tTojPrWEGE2R7HzkrCDJYzBTdJKLQGSQQRZJpviDuhcymOaPckLQgY47cC5ClJMcwEBm/eDbinUnEv8ki/noaks2HmHaMCCKINEUhSUtBKTWLecTiZA95ts+5do8b8by5pFT9vSRHGNPob9vWgTDksSCPJmStI4piiMkMJ9N9ImWYHxTkw4/Zv3uLMJ1w9uWXUXHLefkYhEv1mCQtsmL8yLH3I/PTbW5xDlT6Q6ih9uGEyVAaza/+239P0m8RJglp2mF7a4tLZzZIAmsAW+QFUipaSYtOe0GcJEwnUyaTmJVeh27aIlYB+YWzxOkhUkpa7S537t1FCMnW9hlWVvq045jRaMTh8RGz+Yw4juj1OkymE5QsKfOSvZ17BJFkb3cXYxRFqcmzBUIYptMpWmuUUsRJUol7URwhtCGKIlbXVuh0u4RhgDCadprS6XV5/tVX2Dp/kc2tLfJ8ThgF9HpdVgd9zp/ZoN9p0Uo7SBmiS5jPZggEYRyCMeT5gnarSxSHf4IeqhWGtcbL9Z0x1VY9nv1aA9yndtyPddHCbb3uhe+G2quybjuPBsv4oHLzmk0QrU4tHVQqBjuRpTtglr6DimXhoc8xzEqv7heAhjrD65UrpkmDUmNVBpVfqicwFjQdP22I2P75pjq3FKC8D29lb5H2nYWNdNNGYyjBRfEVZOw9e5Hu8YTzwzGHWvM7f/Qx0Zbk4i8k9LZ26ZQzilyymHdIkylZNgIlCVuSnTKjNZCEGg6mAVL1SNKEbJAymc5YjGEDzedXYV8kfC9IeTmbkk+OkCsB2ayDNF1MFpGEKavRhF+/dpPudJ8rwSXa5/qcyIzaT6/RdtQSxOkw9txo5vEOs+SIEAlKYjJJUZ4QZwMm+zvs7Nxk++I67a3n7R10bWrUWoCQxOEVjsbvPXLsPV7Q9YOIOqPPw3x4zfK718Up/g+Pp3zru+/xwsufYzyfsCpKnn/2Iv22ZZyLPGeeZ9YGLOwuuUJKoigijmPKUlMUBePxkHwxY321T6fdYTyZc/H8RfK8ICsWrK30ee7KZaaTKXuHB+zs7mKMIc8zDvf3OTo8soxPBshQkqRt4ih1DHtBq9Wi1W6hNURRRBgGSCWI477dN0trWu2Efr9Lp9tHGI0pC7JFxmBlwOb2Nuvrm3S6HaYzq67o9bpcPH+OjdUV0jhGSoUUISYQhIFCa40UEEcxGEMSBFXi7AeSYTcXvdrr/cEvl3QP/sNDpBBz+oInp9iE4ZIqSbbR7jPVQukZbt1M9j0LMSOghd01Vla5ce23Eh8K5q+tGGW1lDXavgG4D5NG6mtqycX3nXbzqmKzwuOMqwOWfdWCtA+rMA6IauzOxjuozhqBCNDCqhe0sQY4UbkPuucKw6ijCV46z+YHn/DFUcGdC5f47ltv0jbnSf/sJtng+4TRFNkeIkxC3ArReorUBj0NGE+7IBShVkR3P0dvLmlFBbqniTuGe9Oc+6OQpFXwT3aP+KutiC+0VhCLFiYEMsEi10gj6CcDrpzf5p/c/4SfuX2XFV0iLvaw2ces3lxX6iS/wEjXZF6vbVsomg6Yx3MWxRwl4GB8HYDhnYjJzodceuUnCNPUqVtcDmRTmUIRRqNkhOFHHBzx0PKQefsDL3Hs6ne//ib9jW2yfI4pM1YGLZLAIE1JkZfMswXzfMZ8kVNqKIoSKWWl4wQoS402Je00ptXqUgJ3ij1Goyk+FPKFZ67QayWsdTtsb66x0m9zeHzMbDZHCUlv0CfPS0ajMcPjIwKprIfDyQlBFBElA+KkRa/bIwhChDB0OilBIJESRKmJk5A0jVEywJQFpdCUheDs2W16/QGrq2sESjJftJhNp2ysrrO1ukIripBKolSA3/I8CEKOj09QgSIOQlpxQhpEjVDez9YvS/71P/B043IyOEgSPrXjk1X81uu1Jtflv/MqAuHDTJuuVwACmUjyckYUdNwRW3wyFBCVMwFeMez9aB3Y1UERDe+BpqqiQsRmqm7RqE+9bbwvwlhjmveCsIuJM5zhI9xM9Qzj9NlWJ6X4aOff8uyZv1hn8AOnXLARbM1t4Euh2d9ucealc6y8c53Pj94hf/kV9u/eonjvEsMzKTI8Ieq8DatHdtcMGaDLkjgtGO1KVg5+ip5WKJMynw+ZjYasDgSd1JB2F0zKjLuHmjyN+PtHBVG4wusRpGIVnURI2hTTCUXY5VeeeZ37ccR7szs8fzIk2QkItxMb8FJ5EtTKhno5831mdcZxtMJY3iYvpmQLSVkcEAcDklaf7S8+i5GhdZ304E1R3drepUSYgH763CPH3uMHXWMQsiG5NL76wXNVMJ4s+PXf+Dqr5zc4OTxk0B+wsb5GuxWCKcnLHKGEdb8yJcPRiNmioJXGZIsF85lhYTRlFBKFEWWpKXWJVCFRGGJ0ye7ePs9cOU+33aKdxkRxRJZlPPfMFWbzOVlWcnh4zCTPmcwWTCYzbt28xfDkkPliisEazqIoIopCgjAgjkN6nQ6tVgJogkDSbSUARFGIznOKPKcsAsqi5MzmBoOVVVqtFtpoOu2ErNWi2+7QTltEUUStv/MbQhrSJEaqgCSM6Max3Z69nrkPbeWlHTnc70pIWtLlekd9lgIlvI7ydGTPk1QqsDElCKtoqF/QQVK1A2xtAUcYpGgx0iNCOlVkWxX6W9HSGtrs/w/ZTty5d9Ws1H72br4gEabecW9Z54tTpvv7+pwDXo1QiyLCMz27E6VzExSUwqDcYhCqAeP8Ojvjt9juvFrpKev7N5Qi/tWE5OBLz7C9t8OFj3dI73yTb599mShbcHgzwRQxw/sv8OqXW0zkNVqJIs9CZqMUWUj0ccYEzXqqbb4CmTLeGzLpQX8DVjpzopU5O0ddht0V/lWhiUSLl+MVGA9J9XXM0W0Ua6gw4z85+zz/5304Sqaom/uc65+D1Iec1Gy03jvOvlWgFOv9dQarz3Nz9gllPkGXiuPR+0RBiJaa1a1zmNway+pwRYPVfyugBKPcOCgJ5Y94N2BfrBHA7ZWG+YzzsnmS4drHt/ngww+4YMbs3P4YVMyLLz7DdDoh73Qdu9AYrZES0nZK2o2YzeacHB+TZwvarYQszzA6ZJEVaJGRtmM63S5ZfhulJL1u2wJmEJHlBVIpeu027U4HjKTXG3A8HHE0HDOf3ieOUwZrG2idMToZksYJaZpY41igaKcx6yt9kjhGSkGShKRRaKeoEOTZnMlkQhgEhGFEGEZ0Oh2iKAKsnjoJYlppilQBQigb59/IFaocmw+kopMmFnBdEy4ZRj5jWbLIN66v3ebd5KfeSeKHfcaPT3Esh3qc+tQvNcurWwC8eC8RIqYMdhtGNFPdo+lnaxrXLakTHOP0Envl+oVXw3l26lUgNSO2GOmB3NTuucJUAE2DRTvZxJ20vLAaFxJhF9CIQbzJzujbtOI+aXDBRR02WLOgYbyz4yBrxez+yk+z+S9/m+5wSjD8mN3jdxAbV9htbxP31jBHa7SLAePxEVJrWkmfPC8g1gi9YJRltClpY+gmKaPxlN2hILkc0Vqdce7iEb05nIxjflOlrMxmXJ5eBwFRp4tUHfTwBu0s42+uX+T/ebRDxgHqnUPOvL5WE4lGvwghacUJm2uXWOufY14U7Ozf5K75XXKhOT7aQZYFffMCgUiJ4gCdObUMfjES+J2BbZ8W1e4en2ZefsxM14svf5JiNz78+u9/l/WNVUxZIAUMD/d4+9vf4erFMxRFDthUh14007oky6bkeY5SArRiNpuRxjGT+ZzJbEY3iijyAmOg1WqhVEAcxYRhSKvVptAlSikQhsC5RfVVSBgGtFptJuMZO3u7xCqhLAOMHtLudFhZWSGOYzbW1ul2UnrtDmkYowKBlBCFoTVKGMPC7fBgvQ4MaWpdvgROOV9qpBJIaVMz+ggm4YwmSkmrOjGGVhQSBfX+BL7F/zTcs5lf90FkXb5zLbA+OcUIkEZjhPJHgEZggZfMPIAJn+zHYFDE0lDqnEBG1NBrHKh6tknFZB22OgJqMG4bd6orG1nKTG38qnLcNrwZ7L20+6CdJqLufV3pKR1LrhZhu6hoqJ7h6ymlYGvlp9m5/8+4N/wmV1ZaQB8Pz/56G8Ulq/fRwKwT0/ra68S/8zZbKuRKd4XZ4oBv7Ay5sfk8pQxJojaqGFGYgtlwn07SYjEzlFHIwgimZc5ELxhITS8J6ZuIg3sltw6he1Gyed6Q9k7YH3X4d0XEfyY3aBW7LDII4wgMBPMFV/uavzQ4y68mCTevf0Lr9ojehTZenSCFpN9ZYWv9Mq14ldHJEfeuv8fh/nXGbUOxOmQ6HmMWIy7Gv0hkVjGLEpPpJUNm5dvr2twY7+yusCoGP64eLI8FdH2HQEMP5b/wIk/TciZOX20n/Wiy4Nr12yTtmNHwgNl4jKJkNp1QasN8kdmQy8ppH3ycuBSG6XSMLksCJdHETOcLZvOMTl8gpKQo58RJzGDQZ3VlQBKnSGX1o8a9hFBugkroyA5RVPLcs1fZ3Nrk2kcfc3B4wAGC6WTK1nZIK0npd9us9nqkcUyoAlQgkdWWAdgUjwiSJLW+gca4wI0A3ECOwsi+k6jZq/1lUEoRBAFKCKIgIFY1UDyoy20cMMsTt9FbDzmO06k3DTx1OKU5baR7AkuVjaARCCHcJmnVqBXVxkd4XbpA0DUtJpwQskkFsE2QBOeKVRvQ7AjV9eYvpuqS6pgFMrf5jPBQYVVJwoF1re5oihreEaypz63TnttrTX2Jy+eLAS000kAan6Eddphm9zkcfpOV/i+4d7a5NqQxVUBJc6E1GA4ubbL2E5eJvn8HNZyx1Q74j0PNB/vf5V7rC5wEKTIMKMZ2Z5WDoyGdNARato4yYaI1C5GT5YaugI0opCvb3Lme8+Fhxsb5FTb6XfYPSn47KvmVvE8cHVMWNmQ41yXR9Igvxau8u3/IW9029z7ap7vdIoxDVnobbG1eQRFTTEfsHl7j/r3r3L99g/v3r3P2F89Q5oLF9Jjz0VeJWLHv5xdLr4+nrFUMzbngdeqioY56SHnM6oU6o1G1Vj5krj5wyBkRPvzkLiKCuBUjVQ+dzRgeH3L//n2Oj064cvYMSRgxLzKUUjYwQWvyLKMoCvJsgZSK0XhCEMVkRYk2EEcJYRShRxMGgx6DXoetzXWSOCGOwqpGdmsWgxbOIV0FgGR10CeNI6QpyS6d5cXnnmU0GtHtdmm3W2yurdJOYgK3INQLjG54DQibmEaFCAFFWVIWpT1XCMIoZJFl1oIscHRFooQgVIIgECQqJKioz8MA9+FtfPo0U51hTh0X9QR2RwyS0vi38fvEPnkAXOWZrTfScWoZgXZ+sZWngL2idisTIOQaU32LjtjEJrTRFWD6LdorN1Dq+H7PYZtqBSOEc7/zTNcBr6mSOFZ3qe9TOSpVPed9af1f1a4Y/h2q53uWXFYLjgGUkZztfon3D/4tu9xGJu/Qj16p4PX06Kji45z70eGrl1kfTYk+3iUnZO3cWV7ev8Pmvbd4L1plp71CHsUUWUYnSRnOZoj5IavdHkJEZKrFSEIuc0pZUCLpCMGVtM9BHnD7u3O6mwYVx9xYTbkxvc5Fs0YcSERpCJgyzwISdZ+/sdrlrT/+I4ZrbU52cr76Cz+L1Irp4S5H+zuMxyfcvv0BRTGhtbbClbOvkbdOmIz3OBt8nph1C6ZGV31oP+jqd9WsWC8RO4Z8zoX/gGHAPh+9wSW+/oylNJCbgN6gjTZTpEjob64hAzDakC8WLOYLQqmqQIT5bOZcw8YcHx+T5zkyiCm0YTKbs8gyAhVQliWTyRxdGlpxxLmtTVb6PdIkJA4CKkd4xzS1LjHGUBjH0AWgIy6cO8N0MWcxyMmyjDRNicOQMFBEYVCHcILVOxsL5FmWMRyNaKctOmstABZZRpZlgFU7RJFlukbbd8PgANcmuYkDVU+ExnM+c1L4qoiHTChfmoDrjpjay1Nj0MaqgZ489UJzMXR6U6EAUfkfN3dvqNkw7uUDSjOnICMwAQ1TJD6/LlVLCWrY8uoC2Ty78kjwWd48KNtTXEIcp5LwwE614NUZyewx43ivWXqqcMuoVz74BceyM3tGr/0c7P4Ow8WIYPgd0hVBHD6P1gojNbEImBXeYm8wosQFUVMqycFPv8j5eUF5f0hxdEiv1AStlDTIuHv0IZ8EK+wIKGVMJ47IS8P+cAQSummfPEnJdcDcFGy2FHkQkBrBRhrSayfslzmZANNK+Wh9QHTvPhGGVnvDBitNj9nTkvODbf5Xr7/G//Y7f8xbb39Mf3CWTrHLweiAo5N9Sjlh5exF2oNnQCq++40PufXWPV7cbJE+t+VUehq/JX0lQRiXZ++USGjX8Notjx+1eqGqC/UkrWPUH35eQwmBEJCX8MmtO9bVShqiKOTkeIEUgnTQQ4YBaZpa30qn71RBQOn0sXme2x10Q+3SO2ryLGdlYJOTh1FCmsSsDrqs9rt0WilJGFbGKAEYpWyDygCDITAQSE2hFZGU5GWJlFbEL+OYOI4JlHLvqiudK0BZGkpdUuQF09mMyXhCp9VCCK8aMZalF7kF5jwDBFEcE6iAUAUkQUAUhkRKVbtz+FI7fNf/PlrEqd3la6L8qLNFbUAxvj+F82hwnfWEAS6AD6m1bSGo86xWsEbtZ+t3qfQ+uPa8WCVMyzFdMaBKz2hq0bt5j8rqT3Nh9CKKRghFzVp9XUz9PLdo4xmyC112HNs9xbOwajP4hhxS0x/TON8b5rRjb0oozvRf4sP9b5PKEQejP+LS6m0OdZfRaMSZwZ+tckVo9zyvI0ZIiijg7tdeZvPffZvpzgHTbELZTog6q7wclmyWu9xWMZ+UEceyg1QpSRwxzTLm5YxsOCWKu6TtDrtFwFRAr9smKXIGSciZKGGsZ8x1RDEcc6s8QRQlg6xEqS0mWUEETMd7XFnZ4O9eucB/sz/h3/37P+DqVkZnXbBy6Sxhq4tQlpkWuWJ/X/PeH73DV//LX8QYiU30fsqoWhGoWrSspRD8ytlgQg8vP4IsY58m2NaldnyxP8NxQWk07XbK/n5Bls8IAsU8y8gWU/YPD8mKkjBSDtwkKggRQhKGIb1ej9F4wnA0RmtYzEta7ZjxZEzabtHrpKx0u6yvDuh2WrSikKDJZvBzq56MCgidq1YRKLKyJAgs+/SbPlpXrprV2ltY4NLGsMgzirJwrm/rRIGiKAxxGBAFirIsKbRmMptSlppet0caxaRhRCsObPy5ofIzbRbx4KGlFq9E5VMvKXQ1/V20ac3BTHUPUfmY+qxTFcQv7cj4ZBQjdGOTHJajJRscVDRA1n/2kNySKxzrIV3Ts/eo+hsLwrKeqF615rnm6RSmtbAOlWduJcE0dwY2S2qKJR4rfB3txPfX1FhtquTkTa2s1yGXjgVv9V7lndtvMgpKEq25M/qIiTb01M+gdSOdj/ALSW1EBEOeRuz8uZ9k67e+SXAvQ81zCCdkSYe1WBMXBSvjO9xTHT5RA4bBClEQEsYJC10wN3P2DuYM1tYoVI/ZBDY3zpKhaYuSQGmCw7ski5xcdDD6hOH0Hl2RUWrDraMZfdNGdFpcvHCRvxTc49dPRtwdtvjpL14hVPWGYiaXvPm77/DNf/+b/PW/+SW6Z89ilWaGOuih6fvs3rfpElhRlrpXEOUjx97j25jSD9Tq6KMB93QpDNzbHzIZj1DKGpyUkkgkcaQ4PDxiNrN5FpI4Qhtc6kZJHLfQzMjLkqIsieOYPLeKb6Ui4jikk8Rs9PvW3zeJaMURkZL1/lWwPAtZBlAlBEpCGEiiQFKEmiy3inxtNJR+vlh9l5TS5aK1RrA0TcEIoihCGMuWwzBESokUVrfYarU4ODwkTUKSKCBxgFuJvqda19axXrQ+tcVPY6R4UGdndc+nxJPGCu6lbmsI/EE9+uNX7O4Qp1rQGOotG5w0UA1mN7n8giQEgU4oxD4lJdIEjTFjVz//jIqlNvRB9fTVLqOZqdtZVPhV8dVa1eN1qLVx2p8jqolf73mmTQOyhX9N7bwQasgurYIAYwRB2KWTdCmCE2bZgqwwmEJx/sxz1aJc77XmXqoxX4yBIgm590tfYv1b79F55yP0eIYJW4SRZNCN6UjDYDRmkO9yx2TstzYYkxIFMYFIUDJjPj8mNyVqfZu9wxHdOGShc8TshI2VPicr6yTX3yYbZeSyB5MFSpX0oi6f3Nqh09vgfrnCYHCBP9e+yx+MFrz7xh1e+cnzCGEoF3B4/y733/n3fPUnz3H55WeQQVD5Jxs/TvAqBfueTRuHHUum8tO2w0PyKbPvRxiR9mnF18/1W65h72jIdDLi8HCP2WxKFMXIQBGImP5gwN7uHifDIZ1W6hLMCIyGvCgYTycUuiRttQiChNlsAQjW1zYYdFPOba6zvrpCO45Io5BEBY3B7Q0mDdGdUxjsvlKACOyGl1EQsCgLcl1SFJaxetC1obqCIAhsFrAgxBtpyqKsWLI3BEohaacpan2NOAyJgoBAWsD1Aqs+VZfl5mwc/EEEtDrVTZ4GgpqHnUadREcASIF59KL+Y1yWCYF9P+lYphX1l9+/MdH8AixtwvsZM9rG5k72Hgt2CNWM2Xuh2O3arfjq9X92oZRYVyPhdjGwi55PhlOzLQ+eGuHyK9i3abBf48G59mbwGceMMwxJz4gx+C3bG4I0a4NN7kxPGC00aSAITAslk0p/78+tF2TjFrH62WUYsPflV5gNWrTf+j7s7aEHPVpCEkYxq/GCVqbYFjPu736fvWiN/fWrnLQGhGmb6WKKETA/3ke1BsyFIM0mtKKARV5QiJJ06woDUo6LKVlp2JQGJSNWVi7wO29e42uf/ypvThYk7U2+crbkg/KE2x/dY3WzTxiUnItjfvav/Vk62+dcv/jUpX6JqxRpVKuhlyLcWlNL86Lhu/0fUL3wWYugFo2nk5zd/T1yPSdOErQuSZKQQMXs7w3pdLusrq3R7fVRUiFVQLnImC0WTKZTptMZWkOWl2isv+7WxiYXtrfodVNW+h3i2PrdRkFQxdoj/JD77KKyr3OoBIG02e/LwKCNtjkftKZ0GcCMDvDO5tYhXdot0p3BLstzDIZYhQggcVuph1KhGghgJ+9yedi6+si19rQo7RM9CwsK2qkQqgneWBSlZ1pI5zz/6QPsx7cY15B1Swo8a/cKBJy9QNdJaYQzRekxO9l9tIJpMKaVtZ0/rDNQGVMlBvNAKitjm9cRN1QYuMQ17jrvAyuhBsQQdGkQ2i+9pn4Pp/et4cGngLS8t1YIG5qeyTQA1+K8W37CkFYIRSFoRQnk7QbfrhegemgI625X6fidKkrA6KVnyda7rP/OH6HHhxCAHCToJKQVaCKlSOWUDTNkPHuPgyPBvk456W4y7W0yB4zOkQWIMIRAosM2i8mY0WzMMAnZFpvcXYw4mE/ZbA1AatbXC77+wUdcef513ji4zX6ouTxQjDoSEUIQRWi5T2frgm13U9aLic/LW40V/066mjO1jbX2JLHjRuKztD2s/NiAri9GwGiW0UojkjRmNp0QBAFBoFgsNCvra4RhSH/QRwpJnhcUZUFeZIxGQ46ODlnkC7KF3Za83+mwvbnJxuoandQq7ZMoIg5CkiiyARRAJTafRqqH4YmoP9QLvdXZhUISSgCJDtwW5tSM1xv9pBDkZclsoZHKgrQQirLMKbRGCo1SgV1UpKwfe0ptU4upP7g0875WopFj9qZiz95IJh4AXLuy1xuGV+5Pjx5fP8bFIVVDP7rk0VAZxAx1msMSoSVGGgQx8dwwVffJWpDJAbGOK9az1EPuo92Lq3TfNHMCuO+NrnZtMK4OWngvBMNoPuWDyTu83v9itQ2Pk81q9oWd+gq/U7F2MFtWTLtePPwC6jpZaNvv+YJesEZ/4xU+vPU9MLn1IadxbmXgoxYDmzlqfb2wvquLjU12f/nnWf3kY4rDGZ28QK1twOiYMtckrRSlDbGAaHFMe3GXyehjjj9MGK1eIvvcC8wmGhVIwnaf2fEh2XRGQE7c7/HBvfv0Ox2OwphxeUxsFBEZ/Y5kf+c6F1cGXD/aZVYGXMpD0tBg5mMWK30qt7DK5mGNlM33rX1CGseqpqh9qv2k+TQnoscWHGHrbqpcnT/4CntWqWG8yCnLHCEF48mYTqdD4TKHtdotJpMJRVEym00pF4KTyQnD8Zij4UmVy1YqydkzZ7h8/jxrK6vOlUsQBSFRENKKbJ6C6ukNsJWV2ICz6jbKkvKzoYIQ9ZFKWBV2/7GqBVStNRaAFJKsKClcGLPVsym0MeS6RAjre9xUqZ5uywpIH6FYfSTbpZ4oBihNrZvVRtj3FjhxySzdSNBM8l0nZHnSis/a5fMaVG3b7N9T+lMjtOtTRT+5RKIHHBT3OFZ7bHN+qf9NpRP3R+11ppqUwgErLj+CPSZPTWzvtNQKUm5NdojDN3m59Xpj3HoFAmhRIis9pMsJTIGNI9OVHruGEA/JurqfUBEb3c+jxQKCDxBSE2ivrzTLE0b4xOrOX8Kd0zC34Vlv1u2x88qr7Beajffe59xUEwcR8zxjXpbIqISkjVg7Q6QixOo6SWeDdaORg3XmWcj7b+8yH0+Q+ZQgCNFCkeUFQTumnxraE82RCimCiKK1Dse7JEJyfABb/VX2J0dcO5ZcDkLaHCPSlo3/EF4K8cBZey5Ug8PUenJRtbpXKVQhLz8Q8B4L6Pr9tWypGdWj6uLFMIlhmhnu7+7brdILQyCU7VclGHQ3yOZzWmnXXmcyZtMZo+GQRVHQSlq0khZJEpEmKSsrK/RaLZIkRkmFknaXhiSJCMMH6VkFJq7aQljtXgVGS4D7qNL013gAIusV0EAgJUoqhKi3zhNyOStSICU+HcsPU8ypxzfZbT22PNI4m7q7qBIajWfB1VyqxFotaoatfmjf4B+DIgzLmxj6yK86p5fFDBeGXTcVPuWoJCBVq6xpxaG8x0ItiMoIv8G7ZTz1hKzHTx2w4D0J/Cef/wq89GHcVjm2li8PXuStg++wlZxnVa5VvNqgLRiYGg7sPZaXxOZTvXubPVdWT/SQoohoqx7zbESiYgfWdapIf55ftKie7DXVTknl9dQGSiEwYcjO515A3log7x5wYkbMB13iV65QIiiVokg6lEGAQKGMzXFw96MDfvPf/PfsT+Ern3+ZV197EVGUzMZD2q0YdXaDZHKLNA/ZOSkpckWwcoZsOmYgjzgY5Wy14WRR8O6dfc4NWvTf3SG6NKDox9RudfrUG7oEOU6aaG5Iatfl2s+Zavl7dPkRqhf81H30BC0x7B6Mmc1mzGYT9vZ26Q76jMcnmNIwGU/QZUm/2+PC2bN00pRcQjCZkqoAKRVxnNBppbRaLZI4Jols1JdSEoEgjkOSMLTDYkncXi51mr6a3Eq/CJ56q6XrTr9frRN44CoBNpJOu3TaphbHBFa9ECjVYBafzmofXupVevk60XDnt9ND412OnFLRuOtE/Z7aMTOfjuUUCX5yituu2xq5apCrzZT1nmGw3INN3gqCVA5o58cMwx1WuVBBrgcpOwRquKu2Rq9AvXTg3wAsoytpQ/pEOsCF9CLX0o/41s4f86UzX2ZVDhBl7YDmQdP+p+u+q4xqVB1mn2nBVhq7gY+HbO9u0UvOsT96m6DTx4a/1r1tXd9kVetK3K6WEfdWDZWJW7IpA8lur0d70eODbEhurnGht0Zt9JPVuM8Xmg+/+zE7Nz/hmQspg9GY+fQW2xdf4d6ORImIla0BZhAxX7uKwLA2z7lzaxfmISYdUOYT2nFOVgb0ggKF4cbxjM1Wh607GelCk2/E9XZ/3vuk0bLWt9IDaz0q/Lvafm7KpQ8vP9J8ugYerutwSFYYzTw3gEYbq6c1ooUBxsMhQgVIpXj++ed5+cUXiclZhCGagFIXBEFEmraIw8DmJlCKUFr9qUQQRyFpbLeyeVip8PEh7dVQEoDxanZ3+ulrHrj/8pfNpUe4NvEg7xXxNqw5qM73uGs+pTM/O/hZ1lUaKqAvjXcv8pjb9CStNVkG4zartC9uAK2bb/RkFLtPX22OqkV9g1TWYOWWWnC7JtRjQ1aAJoxACE1fnmevfJ88mBEVSXWq8EZKBMJopDGUjtE2s4vVvyv6ZAEXq/oB6+ESy5Bz6Rk+Lm7xb6/9c3754p9jPbzopBDP0erINWvw8f3nXdOsDcGfWzNXx62NAGk1ySvtS9w7eJs47ldG4EYrOhuFb6fGW7gh4QG81oeKSmIQccSsyJkXx6y9uFmPMue6J4RidDDmwze+x2g4ZjgakXRafOWVC7zwhS+BDIjTfTorEbIfU4gcYRQG+N7wQ945fptndZeN+Av0eyuYIiMwEp0XdKOMSGlGxrCbhawfaeTomPjiOnlUNNYWX3+shxTLOveHye+eDT+qPBbQlc1+aawGpavI6aTXftAVpWIyW1DqDK1LwjCiLDS6LMkWM1qDFV753Ku8/uqrpJGkLDRBlNDtBTZqK4yQUtp9yYzdnA5pXbHiMCKNApsgp1qp3PPN6Tp/WrHX18akJcmiFiF/AAZ5oBZCoEvjNAq1VVu5XYX97R51S//dQ59xuuZO/+oIbGV99e9T6xmX1x7pKlu6742bF7UW5MkCXKDquKW2FSCMxMiSRTInnsbgPEuqxncBDxY4LBjaCLKAXnmGo/IOm+KqBelKS2uZaxPGPch7Mm2EcbpYVy9nsNSOoToPMoSBy+kV7mbXGc4qTaoDVutlgfcbrYSVhsENHD9tgrRpfAM+WsZgaMUbBCIgibssR2j5AUx1ByFs4FDtlOwbuill1dfooM39/B6L7ojO1nO2/iiQUOaSwzvHfPid72NMjhAlnXbBKz/1OhsXLlp3S6PZ2Fpx47GskMZg+NatN7h9cMQ02uWCKXhGfpVO0ELoguECUhWSyoJuPmEsOtyaSM6mHbL3T0gvdGDgJU7ntrck9brPPgq0YvinQsUfUR4P062sgI1KNDqnOqeyegIGsqwgSgI6nTZZltlMW2XBaDhCCsmrL7/Mz37lp+mmKabMEFIRKEEQRnYbG5cGUbosUUoYwtAm+I6CsAH2D1mdGmPEToS61R5YtXySEGMeaORHEOUHn0eTPbtPnt24JDnWy+Ez3vBRK+updzZmWcsn3UTxeSJK4wXdUw/1IH1qGTD1eHyyStNy2mQ1QkAu0HLCtJORjvrVZLa+1bIhZoKnbQZDLPvI4h5ZNCMuWw6MTQWWXioSDpCNEFZKEPWzq5YXNqdFDdX1mOwGHaQpGHTOkGHdDEu03/uCZcNnw0BWJfLxe6f5d7J38AuwVbnY65QIuLRyiXaQklf3rCeLcIZBD9I2MsgZ3cyycck7PACU+YBP3rxG2JnyzEsX8DIeCCaHC9795ofc//gD2n2FiFK2zm9x5aUvEbT7VsVlCuodnDUQOJC0Y/nLF77IpPw6M53x3ug6ImjzQvvnYC4JA8HdwxPSpM1KBMFiyiJMuV0knI8Djj+ekKwq0ostSrFojJnGWG+qpIRzE6sa/dMn7WN19nmAhXmGZB5eJaUErVZEEAZsbW0SRiGj8Qmj0Yif/Mkv8/Nf+Sr9dogUhVUZSFm5kymlXICB3YI8UpJWEtNNUpIgsBnyH2XhF5ahavGnI20/NPYIL+ay5ErmAfd0VT5NtfCZ6me8KuPRdTaNdqi4iQfl5hWNtfOH0zH/eBRjGvFbwkWOCW8AMqSLVUw+Z9I9rnxXgXqyLemipL2fDFgNXmRc3nWeEe4czzgdqAj3HJ+G1E7ZRlCvmyACy34tA/a/DVob+uEmW4OLjIoxu8WQ37/1azVr9RIJNTAY7ILquar1A16GX29Us/t/1X17rvMF1meZ/d7lg7Z1r7XX9fiQ1SRyHNc3HH5h0fmAm394g5XtkrMvbiCjFJDoMuXOxyP++Nd+n+//0RugDHcPx2xfWuGZ1z+HSrtoXaK1lQyNMdbrx7iFw9jdY7TRvLj+PH/jpb9At9XnxfMX+bnXv8zWMyGH8YK5CBj0u4znY3YWESpMaImSkJy7OgGhuHVzzL3vHmMWbrv3pfzHkmp7p+qzP+7UVp/iR/lYQFebumMr4G04Z/vvq4xVxlYkDKz+rN/v0uv3abUTjCk5c2aLr3z5y6RRZEmGtqKFClSlu0VCqCRpGNJJInrtFq04QXl6uyztLP2cJj268eMFSB/G+zCAMTQFr4c85yHFVyeQAiWsKsEnOBdY8PVRTKL6+fQV4fSrPerJD7tLqQ3NbAS+70pqQ5pwbaWgCoUO1KNJ9o9zET6s0/N+v7mjqc2L7fk6UucsekPXYRoV+Qy1pgJjb/gsi5LDk0Ni02KhRh5vTz3Xiq1+3Al/UiNhjr1nxW/dGKihURjD1eQ5ZvmUUkk+2r9DJ+g1RF+nkmisjB5S/X5ptoO1e2+3YXmlevNQancCXsiYaCRol/7+7n7GJvf0Ok8tmjKUb1dvkHYj2fS4/5191i4H9C8MEFKgS8VimHB0/YR7H3zMtVuHMMr46MNDvvJzr3H1tVctGTCFW5DKagGwgR8lNkGNY+nG1mm7fYb/6Lk/z9ee+3kCGZNxzFH6q+StAtNus7G+gihnHC2gRCKKAiFK9kRIEodc2xlz7Y19inEPYayfsqiMzKcXE6hdA+HB7Znq8nhcxtwKbYTxMqmrXnPlrbqhqrgU0G2nxKFg2u9x5swWmJJ+u0MShRitKR1T8PlzBaCkIFKKJIwIZK1/q+7dEAsehg/m1PGmb/GDk+ZBZmdO3fhR19bf19onJXB6Ztd2xum1GoSybqPPWJpMdsnaLKrx0TjB/vIiISyJxNJ3lBSValM7OdF7MgThE4m6DvCcIciJ+AKBXiwQcYBBkU5XmQ4OyVfnBCctFvEJhDHRLPLModIbzGVClsQkChbmkJg2VNZ9avWBZSEVaFd7mDn/Wns7U6lGhfdqQVcpH1eDFQZ5l810CxMfcanzqmc3eD9T03hWLegbzJJxzRZTxXLLqg7+3yIIuLXa4vlM8G5inEdGbTirs5U1zZIPzgJdJuy9eUzQH9I527PBQPOURHSYjncwMuDbb1/j5PCI1bWU/+Rv/Qyr5886wqOpQ+DdhDZ2i3ghXBi/yynRnPD9eBUhSrQpOBnvMrsz5ePFv+HZzV9Cxqu045TZcMiNwwnbqx0SBKbdZbQY0+62ef/+MVrusXV5g/7GCCMLC+017XVuerVZ1uLvjzgiTTv94KfBRe083aiMFLQjRWACttZWCZVkY3WFQbdLGkeAqaKzVGDTLkopSYOANFQ0/QV/GIz605bGuvInuFYQKMWiyDFaV9FddsKYyqPBM+A/aTGP+Aw0JowtPjm5wJGfB1QdTfHRf3rCgNepTJpZ1TzwyjBgXh5wJI5pxWuEWcq0NaS1ojFlyVycsAhAlQEUYEqDNBELc0wQSEazBWkS0+2UjEe1SsGllEE0dMIWO4TbLNLWw3od2LoIt6I3DWk+2PS55ApTccJakBEHHSrLphNTvPa2AkaopChtakbruXtzM3LtnucNvoWSXC/GnDEt7njPDf8CeN2uqOrt8d8XrVP2v7egEDtsPbNBGq9TTCLMfMTR+B6zWYYoDygK+OrrHZ778k/SP3fG5ZI2VsQ3Gl0FMQv3v3K2Gqfi8BILEk3JIh9x//AG9/ZvUCwKonSV9U7J+bNTFuYMRwcRYRDST9vc3t9jTUVkxdjmeYgjVjZX2VkIzN6C1bUOWh4vgWtF4KuX9eqjRyPCY4tIq0TSylDgmBaV40rFGn0oqjAQSNChopOkhKuKtZUVQqWQwg0EA0GgKjEtVIo4stS/qY99GKjz0CPu+Ckm/MB5ohrL1d+nB9YPC7zeTUxKp4T3SW/wCgX7IN+ej3rAA3poc6rLK9Zsmn/WL+KJg2NEpTaUfpZjma80csljAyxDryfrk1Zc4If2IiP1IJCKhE1WdMQ422NUzNBzyUTdJ4p6iCBAuIQupcgwam7Hm14Qa0GZTInLgPb165QrX2Uqm5PUYFxyG0yt2rJKAS+223nhg49tCp6arfocCQkRs/GCNhp0iRB2HPm8DXau+RBXgRSm6mPfi5p6YcfXi+ohtp0cm59EMZvHC5J2wDyy7+Hj5Rq1s3c3loFKJFo9w2K/4ODw93jta1eJg1Vi2szVmDv3dphMDugOBPH6CqmEi89s0z9zDq39zrvOZ9e490PgfcklgsPxfYo5rK72CIMOmoLRfJeP777Hwc4tWnFC2OnT7nbIygNePffzBNEKLTGkFaaMFy0m04gglkR6wuUrHYxYMJvMKHWCISZUc3K1oOo04/W8finzo8rX8UfMdCsMqKz7rmqNYIQq8YsP63CTQErchoyCKFAEwu4FVhY5Stn0h2WpUUjiMKQVBQ0XnPoZp2ryqUTsYVuSV5c1UFj7ufmwl/1TED0pQLhsXUVhiCOrKPWqMGvc8rbdR9DqRsUMTgWAd9muNX2+6IZOykOxT08nhXT+pO7GhqXrlwz3NIfck1bquC04JbEISNUKCQMKM2G62OeovM5I3iaN2sTZglmckhUZulhgAFVqUtOhJbcJ1DoHScT524fcvrBK0bR2u4fo6phXIfjvHNvEZgPzqgBpas7qBcmV6AxMM4SsRerSGGaHU1przoPCuZD5a7TRVRL8pqrPqySoQNgzEf9bcLMreOHI8O56Ha1YSzoGlQtMOUMnLUTwEq32NjduT7h//2Ne/uLryDxiPl+wP7zJOLvBqNhn++o2gWxx953rvPjSgP5gC1Mx1iZRq5UkHuxOshN+45u/TjGf02612Ny8yGhyQrE4pNdps3Z+hU6SEhjBdvdZDvItijJDGZvuNY4mRPGE1Z7EbBmkShAix9Cm3fN1KPDZ2SzZ87ggq/rYJUhgU4N+Oqw+vuAIJxY9cNg0gKx5qvskrMCAlAIT2O1TvO+hwCeFEgTC0HJb4tTuJn+K6j7gImaq+tonPuT+/wNgjcAao6QQVl/tt+dRtmsehq/LzPa0KGct1AVWR+5FILN0xfLVTZZf7SrrRI+KHZta54tYBvAnsVi/2EZbuPm9LF8IhBSEpkM/7NINL3CQv8tU7GKyMTOdIVH0wy3irEccrdAONvB5vPII7gQ5G3eH7J3tUkpT8UJwbW38bhE10Pp+qPSjDi3nkxFRJ0aYECWcGk8oIqlYOMIhgbRUHI+OaK2lCOFS3RgoZwVSaWQUVukcrWSuXTYzr5ekKUBTu0NpCqXYjUs2piU7bZsVrZwZVBTYUP1DxSJVTORzZHmXe7fvcff2DQ7vXeO1s69S5CP2Du4zntznuHuDMjKUuye0OgFnt7fZeuUqwbzAiIDZZJe0vQLY3WHrzGmaTOfcOrjFH3znmxTzKSIAM52S3fmQza0Oa9trdNqGRCg2k0u04jMIEXImWgdT4HXxRng/a+PUFHY+2F0x/Oio55gR2g2SSnyvc+k6H5TmQv6w8njUC6butqZj+dIAh0oX4g0a7pAVW5VCSInUoIvc+eb54WyIw7D2TKAG80e5L/2gvcOa34vGv9XHBov8zOURjPR0FWWlVijshGuAvh0YzVs6EGwea+h7K+MMXmVQn3OqGtbGbaxhxbIWUd3XM56mrtc3icayqWVVzJPFdgWW7UtRJ5TxKq5KTPaN5CFIhKzGn2PCmHmSckFeRRrJPJzRkimx2gZdc0SBoEwidtcMmzeGjDYCZlFEqWxIQ6vsYEzBRE4aKhrnjmXqvva2CqFnzMsdtnpXYJqBkcxu3OSb795Edu/yhS99GXUy5dgErJ1/hlCF4H1atWZxtI/qSwhsStFSlGhj4+Ok63tLeCS6hPFYIJMCsBsCBJFEiJL9nuK5G2OO4w6LQEJomJ9MufnxCavFgM3PbbHW7pCNbvPJO7/LIk8oipJ33/02YSLorIZsnz9DMJxzv/0JM1HS75yBsM3xvROU2eX+0ZhPbtxBhS1QAd02XFl5ntW1MyAk/+4bv8bt/V3iWHDhQpd+L0HEXeb5HmmroCMlZ5ILdONnkDKs5gNIpIzcOK+pg6n0xo1R7ZC2ERzt0lc2sEa4seIHj1d2/6gNaX74+IyUfjtpj8GVuNqI6PBgYzMlgZHK6qa0ptQlCFWl3pMCwjC0jeFmjHH3abIVX2yDfza4fBh0NJng0l1+wC1P38s0bqYb15duogceAVx9jTCUlIBs6Oke/uxKi+t+KazvaTNL2jIAN/Y5o6E3rhKSi8qXVQsP0A3xFgfSDYPpE1WMn0reEk/FfIXwQQP16T6RjBACsRCcDV4lFCkCQavUHOV7vHPyh7x+9jXSWRtRWA+U+WjOeHzCzr1jLuwIuLxKZAStRZcX7i0oyoL9swnXL2ZInwBJKiIVIGRIqCLQmpIA3b3EvLxDNkzodNYZDifcPrzHaGh49xsfciHtcHx4wMlMc/7Zl+mt9kjbHWRZYnRJZ2UbrQv0eEEYdpmNx5SLGUk6sBuglrntax2ACGH/mBvHc+7d+oSJDNjeaPHScz1MT3J7q8XZayfce2aNeQDBSsKFc5pg1uInrj7HeDxDr7T40k9/kY/2NN+/dh+hPuDcSy9gTACiZKN7lTVzhVwX3Avu0SkizPouxYmmbRIuXOyxWEC+KEkixTi7xezgBkGQsL4ZsXbuHFpltNKUWX5CKId0gxCAy2uvkagNjFF4N0AN1jaEchKGC/H2hMsYlgJf8MAKdeRhQxKkguJapAS0KRGfsg3vY3IZkzXIUv8WpyxRDfbuRCp7HGNckg9BaTwsgJISvw+ZfQ4PzHdh6hxPP/zOuA1gevDWPxzLdeefvqZakJa+EEgl7Q4TFauyQFC6DH0Nu9ZDyunlQCwdau5q6zeY1LisV03FiWncyhgL2jifZfcy9quGI/8Tqmfwslgl1zim7wUzH6Hn837ZawRCS7aDFwlJa2FEhdy5f4/f/eg36eqQ58NtomALspxwMuXO967xvQ9vcX7jDBuR4PzWBpOD64Sbl1g5e4a42+PMah8pbEL+2XTKYj4nK0r2D49YZDPybEF32/DBH75P3F5je/2Y9z+6aQfGaotgQ/Lrb7zD+c0EE0R8eP07iFuavDSIICYKIgKpkCokX9h37iQJSoI2u7QUHB4ckrQSjqcLJhmgAj748C56NmE+nnHltcuIu5rv/cYHXH3l8whOaH/YYqgLttcjnt04S7x2kTu3b5KVhmvvv4P4eIdy0GdyWPLcz71CoXxgg7BkCrglrnGiF6SF4nCxw1ZynpXuBt1Jn3xyTDpYYY9jlA4xYoERmnayQV4MEZSEekGntwY6w4iIxWxEELSxhrcSYaS1x3ibhYVfmwazgkDn52vquWOo3fqoZD4/GeuZ493y7G7SD5v1y+WxgG7pLMKVH7E7LvE2UpYjrhrqB9su1phj3GeE1a1Vr++CBh6gnQ1DnRcnxNJxL/Q1rmlWwB9pWP+bSa0fUDkswfLDnUSaxyoDSCWyNNQq7p20MTb4o9RWgV0a6qi1h9/XHnBDYknmb15gKnVDPSxqr5Fm+kL/vTb1ZiXGUWFvWa9Z7hNavHSEV2+JalIuh6c3+9VgipJQdRtNa9Blyctbr6GEZLp7m/uvnCWSh7TLFlF/jWfPrrL+hRcoJyUr7VXykwn7wynH4Q7rapv8aI+ja2+TmznkY4zO0GiMLohbMZqS/dkuF9QWZy+vIFXJdHKbF35izSa6V9t89c98vvJEqBNL2sQ2Bh9FphGl5s73dvj3v/ldtF6Q5wvOnGnzyleeo301pdNt0zYdhLJS0vYzCSe7exzuHHPz+JB5ueBgcsJgcsLNoyHD4wOunF1nfFASvZ7yh7/zWwznU/TOPrN7x/zsXc1bzx6g46vot24iX71AKcrKkH4cHDEpb4Nc59rJtxnIDVQYIBAMOucw7XMAKB0xyY+ZiZJ5MUcXJ7RUi4HapC/OEqV9NIaJPmFXXGOuj2nRsWxW1Dkqql4XZmnW+3SN9k9nYPRqUqHd9Y1ADwe6RtReG9bXWVUL9qPKYzKkuU43orL4e/9CCTQ3BPQg5MHRszmljVMzSIS0Gzj6BkAE1D6BsNSe1H6HSw8RHuBMrWY2zfDFRhHNWz6i8U4fbiwcj2K3/iSz9J1w64UiSBLyLCfXBk1JBAghyUttrdPUi4Be6lTReHfTyDFhv/NhpcapHJZc6xyw+rFU+ls5v1LtWEk11oyP1jPVNkO1HvRJKroCW7uVji+ikjasYalxhTZ2TzjtnePrb6WUPLf2Mt+490e8d3+MCk+42nmJZ1t/lSgc0EoVs9mMw51b7B3fJb15h+wbb3D4j/81K9M5rV/+HMHPfRklByBdULCwEuMnBzcZFjm99iqoEG00rV6v8fSiohMuULgx5y0ESwkChQkEBRHrAQxeOsfnv/oSUbeDkT5ZjXaSjdUyt1dh65lNjNFMjkbcu7ZHKzbsz4/ZHWdcv3mLlWTKQa65M9xn9XKf8y+dQ5wckZozfDJ8h4Puq0TxgDtvf4/La32Kc20MBVES8/H0m7SSAfN8gZ4eIlqbJEkH8OMQMIJEbpCEW2gzYRwcslMWbKgeq+3P4xSYSKCvOggBx5MbtLtnQQuMCJDO89xLM0uOz1C5TC4BqxsPtV9ulV7I1a9phLYs2JMWIU6jQF0ej3rBq0lEwwdSeGi14oW2SwWeefrIZhdJ54MVq8FtjQsWPGbzBUVhSOIY9/Y0Hfjd4xq9RuMbe25z599Gqlr3tVj+7lOLWf4llkG1OqtxUOAGuF+chO3OVhQzQ5JnGcLgwFZjtDVweOnBTh9nqDRezeLVB6JWy/oloDJsOgbr2Z3PROUNcZ7BVnX2zLZWI9Sh2wJjZPX9k1YqZ7oGqxWNrG6+LPs2N81d7l/jMhAYwf3Dt5lQslEEPNv/82x1fpbZFO7e22Ex2cGUJ7TaAc+8dJb0W98h+/7HhEqwuLrK+JkLrIcJOGZqb69BKD4Yf8D56Dz4nWor5XstDtcumH4BdVpMZxvwK+3KUNFLI87/3Z9B9AfOBdZKV9olvTF4QHHjy3X+xsYq7UEXjGI+FCTfu8FifsS9Mudzn79A9/wG7Y0W0eyQ45U7jPM2ShbMP/yIxeCYyWSHfHcDc66NMZLFPCORXeKgzcH8iJW4hymmzt+YemA1WKUULXoiJU9y2qqD9tF1RmDcrhm94CylnKHlCGUG1Yj2rNff1Af+uGlkB0G1/To1iBiwagU3VExzjHhdhEUx4/a5+7TY+McDuo1seFpWGoJK9q0nqXD/O32JGyzSWdNtjlfX+S7Zq9aGyWyK1jN6vR6RB14HJB5wK9j0DdQA1ib9936sTXboDZLC+BQW9bUs/e3uUbF1UTHBB4tZ+uR1q+DngyAQAiUDFhRkRU6oBOQapRRa2S3YDRJVqW6WI1/MAx3tl+G63UtT77nl1Rv1fepG8vXzuyw3J4HRXr1gjxdPIOhCrWiymrhaOhLG+2Q3IXd5NfUbVQoBUkakrT4XWq9x9fJfIJ8EjI/3uXbjDZAz0k7CynqXMNpCO4Pc/L/8q8ivvUY2H6NffIb1+P/H3n8925bcd57YJ81y2x5/Xd1b3hcKhjAE2WSz2a2WRpppSd0RHTOhGD3qRaE/Qs96UISe+k0zCulBIYVmRqPRqN2wp5tsohsECRBAVQFlrnfHn+2WzUw9ZK619rl161aRmCqQwfMDTt1z9l42V65v/n7fn0vx6bRrXQuEf5GPVo94WV/pVnQXANf/3z+cNEspipI2ntStPXvpLBLJxv6C6anl1qtjlIp8WJT1YG0CgPf7t3OgdUEJctMQZY85vfUGs08+ZDK8xO7VB1z/mmL8nECJM45O3yeVz9G8foVH7h6TU83g4AzOTsl2E3585wFvfvN6eFccmdihsXMmeoC0p54W7ZdEWlBrn4Mv/CPZ4iqizBGZpC8c1PLvio3BK8T1MUYEIFx/N8RagkX7d/cOrOeb9Yts64/qrcSwjWvnUX+8HoWeLl9O9IJnrVvwD4DrENZPJEOrRfYhSV2gTUcs+odiEdjQD03piNEwY5AOcM7RNA1IiYwiCBlTgr5oyJNg2mmj3ff9A21X9W7sQp68bLVoFwy1tVXMv6QiPPAetNZB3q0BXn8djrbWkAOctSHt0nPXjRNUVUMkLXGkUY0jUhBFGuksBjyXJyTiGQ+3C3UJGn97jk6b7TyRT4yHEzjrze420/5cCIcPK/G1Z91fpBbxXx1pQ6Q8wIYSmq1V1SoCIhQQb9MB17InhFREKmVjtItKNqhNxP49zeGjXyLMnNFIsndtExnt+B2cC8XerS9irsC+8RL9gwjx2fj3on2sDoGRJS4atXYizkosDUq2LXYcD1dHfHD2S97ZfIuBjBG2pZUcKRGTgyNKbTm6MqEJFEmfGtFDjbcqWy3a0XW/FQ5jwMw0xcFjtra3ODn9mDd/XzEZDDAHNbd+dpPr33uLSO+BHFNs/ZzBf/IuN040VitGr15mRwYbTXgtPI4i4niT1WLOg+MZL14adk5kf9r2pVx/hxwqSkEPw7E6OO4BFajlFtKK4PsSa1quou+b0o8hrC9W5yG4U97CdfWMsFj/EJDh3r5i0O1iwNZM1V6rX7u5YBa16bDiHEC1TgFYVBWHJ/tsbWyQrwRZmlDkOWnmixILI5BKIxGhqaTo3pHuXVpD3w5mWuUar0G3PJ5Z02o6LVbQAXBQLuhrPYj2Lzp+pOU619C2hzfRm+ngOzE474CsrOV0UTA/O+Pg4X02NzbJEs3mxpTxcAxNjTSW4WRC4SrSLG3n5KfgtzMVA29raEv7uVCYvL8yt7aTC3HhNmi6YQTC93Rhe+ulYP+6ScvQ9RX4RA/ECMoatHDY0O5cS41SCTpKwSqKvMaWcO/khKPjj8iXj6jkPq+88BpxfNkvbM56AOtyuB19MsSa/taaEiFrrH+WluNyxtLMqBLfTKdqHLfvvc/mzpCt0dWwOAiOiyX/7P1/ww/iH7M7vsb2YMJ2OmYSD7hq4HTT8Prum9w6PAGn6YMFu9I44fpa4IX1agwtBWeTAcpZ/tWPPiaJP+Kb397h5OAhk8dbXHvjXbTawjqI9IhETThRv2R4+Tk2N9+kKE4ZJmDc5W4+ZVHEzDbMHuWczR36Uk+Otc+pc5zTKxmhNFFQanyRKA8faxEEApwKioTs41AEPcj68RcQFgGB8NXSHF2YoB+oHlxbpSX0D4FwjXRjJjtn5tPky+kcIXsHVfev9JFr7UsalC9aUlD2qgZSgDF+kJSEZWn55PZjiga0bKjynHsP7vHSiy+hleP55y6zMR37ypaCTmvxcb+91tuhE3T1ldux8iZIO8T9I3HhGtuY4PXr7sOme9Oi5zjbkKvuAzreFQ+ArcZtrKdSamOxxjIZDmjyBdIZtLDMT06xteXgcEm+XDIcpuwZGA9iBmlo+/2UhbXl94QQvTZqg+MsrOQEYG2jElqxHYcLbdQCOB9Fcs6jf95y++siSvoaF62ybytLGiWcnpTMlxX7j86IbMl4OiUdDKhMQ748ZrZYMj855vjWhyhd8s5vfZPJ1phSP2KQaqJ4GGKwW+3Iv5p0i2ygbUTbDj1QBh3ghpENz+1nj35ErBNWtgYsH9/9E4rBHQzPs8EV5nXBx/NH/P9+8QcICbUrOFve4bhQ3I00TdUQO8HvXn8LtfuIWlYkbHSg1caLC9qSq2u0V6flA1JQ6lMWy0Pu3h1w89YdvvX3lywWBRv6BuKF14l0Gu5IYJ1gZ+cdHpV/jNAPOCkOiNQZLhdk6XcRXMcCg3hIUdfs33lELCWRzMLJ115QwriIFuoCISlaKJZ9dbFezaMN4hdr7zXCL4Ydh9gtK2s44VoL2LdI6v06/XctsnSUhnOAd/A/6SN6Ur6c2gst59hqYAKE9JNMhmtvv5fITw0V+Nq4zjlq5xgPhlx//hWEhOFgg+Fkg+HmJpPREO0aJqMhcQDbc5llgaZgbXg6afvehT+7cRX9WtB93gLquXjn/jyfWtPcmubIWmKg68+4Xru2BTgi39/J4rg8vs7bL14L49dv2webie7Ipl1InvRoCbri2OAQzqLDXk3Yto1caPnb9jj9i0fgdMPENEGDsOf3+esmP/vzYwrjWB2fsL23wXC0ReRy7ty8yaOHtzk4O2GYanY2YwbDhGwwIMLx6JOHfHhnn8t7Y/7+f/j7TLYv8d//dz/kdOe/5zde/A/o2q671jpoE3/DQNIzNN3iDN1DcKLPAXROcH3yHB88/jPK/AimrxBvn1Erwbw84p/f+qd8cusWp6bCjhzDNCKNI8pFQdk4dJPxxvg637z6LvF4wrJektmE/fIOe9mNtQQd11lAndLRdX2wCAW5u8PKHpGs3mFrb8B3vnPE9otHjO0bJMPX8VDi1ua+YZBd4Vr8CpW+42tGy2vUTc1SfIS0ZwzEa5SyZpwnxGJFqiRaZK3uGC4uBKp3Oq6f/a0jXmJBrJeAX9+vt848XSA8d9vxs6FgTedMc2vPwXFOc+w4/PA8W8t8jQoi3Lc/z2dD65eaBtxer/+QjmPoAaN3VPWg2xsQDhDKcXUn49r2C8jW+SUENgCRFK7XoNfPR3dA1kelJfDPf3p+fM9v34v9DHwRT/zVAuOnN3z6Aazo79+xDmRtosS6k3AdwLtR+ozrWruWdjGxa7+3lxS8v/1l+m99hf7eYbZuJXRg/OSXf03kX/7Tf4WQsLe9wccffsjmdsKrL2zz4itbvP3Nd4mShDhJQap+ATUGOfu3PPjkLr/3W7/P7x5tIY6OcTcuc3/8O4zUAOFsGC8HTnY91dpWMr6l+rqjznXj663A1iry0PLC9BUune5QVUdY4dCjBDs7YxCPmAwd29uG7WbKL9wxq8YgjOF3zQbTnRe49tw7xCrDCUEjahpriURKvip5YG9xefg80F9v50Rr55Zz6MRRRI9x5RwWI+a/aFgs9tm4WrGZvcEgeQPngknv+nnsRZKorzNQY7LBQxpb0+gNFkWJs3PK6ufIxSYJBZuDiNxA7JK1oj/n55RDhHoiraLWAmNoobSOHF0argfl0PM4AK3oABhh2iWRdtlxnaPN9THs3TXI1vyDDsHaL3ugdk+MxLp86d2AXTeAQcQTf4cPe+sgJFAIwsCokFQh20pzCAGqNXefBPfPELGO7M/e8ukbPsWCf+rh1m/1sy7KrQdmtbv1q1Nf/wCckJyrvP+pY4tzC9pny/lx6hIucN4KEfgGmWvabjeJAzo714OxpxzWAPmvmfzu71xlY7JB01gGkyG7l7bJBqOgVzmaLnrDrXGu8Prf+01eeO0Kv/14i607P8UNDX/HPOYnv/N7nKRJRy145cmFHo8hOWH9VXRtfYV2/Nbpqu5DJPDO9Nt8PHuPJiqoVofEwz0EgoEb8OaVN5noXX4D+Hd3f8JvD69yRe/irvq6EM5Zz99bjTE+F+u5zZf4b97/b/nuqxk78Y7HCtdqqX2lsWggqOMjbNMwr+ak1Qtce/V5fvynf04TL8miN+k7sfa+/tZSbBWCun4VmW8w2HiIkksqW4ItqKqC+OEp9SBinlckcUwsh7R+E//O9eZ8L0/ESYs2Mr+d0cGh1jnVXEcTdlSh8IkMLiyC/YrR3k+7iHT25BOvWdiuw7OWbnBPOO0+LV9aj7R1E7Ubj3ZVQmJduJmn4FIXpBLMByGsH0QsEl+WztMTf1HtqgUe8Zk/7XbnKBKxdgv0hIEMa65c09jb6/q8a3NrP34hCZNE9Ly0FP5RqvD7Zx4xPPh2//Xz9/fWarXh7GG+9AxZy8X3x5ASlBahspu/Wl9xr+eArQ2pyn/N5Jvf+x4vvfU6r339LZ578XniwTDw70Hzs677YU2jF1IxuHqd27c/wEYCcfkF5OEB1/7ov8AvgK22CB6GTAdGbTBY+6JbXD+fAiCIAMbW2c4Re2P4IrP8hMf5e4h4ilYjhJRkyYBGO07MMc+P3+A/ff5/zNX0EuLyKwgrsdbX7LUYbLliNV8hnG8P9dbe2/zXP/7nPCwOAsb1mh1AlCY0Sc68XDBfHBCXcCV6ifF4QpTm7G1sI0jW0sPbhbhduAU+rEAiMFTlFquTV5CMSaIBQw0DdY1s+g2ce5eTU4e2MVEy9vuJsD/QEpP9HF6jzBC9dRDmqN8kAGFY7LrY5nUwDG19bBfJAH0OJv7JOHAh3kq0Cg79dfXnDed0Gvc5sCq+jFTO92a+zIoQ3jssAqhoEWhn1wOZXgOTPorB114QtqcTPH3SrnCfBtzPg9/1GN4n5Wlj0Ff6+qzxedrRAvO5Pg/+gvLUVkBPOec6vWDPbff0u+z802ExNCEWep3TBTDO4qzsj+/wFAM+uqKjG9rjhIy137z219GddiEX8tXLl6LpfhrEgpZEeMlFDxJPbfT4hM0q1kDsr3q+f5fMwZqW3K7Qv5I8/QDngry/oPShSuevtT3ek9ryk9utWzHymSr4hVzIhTwpX15yRJsEsoafbbHf/h1tw6rabQOnteZI8sWE1/f5LH31q5L1c396AZBija39VflO0d+3Wz/o+hUEjmo9Ku3J7/0Xa4dttX4h1oJtwzbnON3wcQimP3cdImTfuScrpl3IhVzIs+RLcqStv7herZW6B6O+yUVPkTgcqt0v/LQUepukdr7O5f8Q2mO42i98oBbwP5t26HmffvO/iHK+fi3PJBoC6LXhLuthZee36+kD1zog1ugdKdecYWunkFJ8phXioKvT21ovF3IhF/LF5EuhF5Tuyei2CPC6J3i9io93xpxXCVuuse1k76z9LIz7Ky3rXOmXepJniji3OFnrQjWpdv8nK5atH3rNgx82Xj+WC46eZ2XfXMiFXMh5+VI03UgL6ga896/Vdtvg4labFd1//d/04Ny+2WvaVKv5/qra7V+2nc9fRNarlH3KqRaiB74oGH8uh70W+vXESdaO0X60dl2uj8RYp0Q84xBooHAf1vYFQtqynC1PbZ1AXai6F3IhX1i+HNAFmvXAWBeCO7owJv9x3yjFb+RBud3nqXEGtJkgzyr08izp8PwLK2efdZ4veP41yrR3Hn7BU39qQ/GprwQ+29x0sPsZ1+UCp946yUIY1BqN212sBKxZz7xZoygCrxAaneAQF5zuhVzIX0C+tOQIRyjpKx2EXOceKJ8sOQFdrB8OIdeqDD1hHnca6V/aaR407C/Etf6KgMunAfdXl/6I68WCPu+yBKDWFrJWOX1aRlsb6udsO96hMIyx57cN1INfKD+7J9SFXMiF9PKlNqaEYIau9ZDpc6o99HpYXScQnoIda7jgHWi9w607z1/iOv8ijEIfMvWE6f6U384nMj95INZG4C8vbUbOueIz6w68c9sKnlzh2v2fnjjjzl2jcyEpAl96EttrvBfRuRdyIX8x+XI03eBgcUJ0xYHbTKv2ZRbBjFXCdSmIXfrCkxxhu5/7NOj9ahe5doJf8UhPBCx0Ytc2ar8TYq3p7l9aBG1PrycjDz5PwuOhrbfalqhzEKpyii7lui+pvbb/ehyyw4cIXsiFXMgXki9J033SeeY/b9Nl29Llnps9X8X9nNn/1HfZH9vaz85O+6xr+gw9+quRAFDQ3l+vof6luhY/je9tvWOfcf5+515T7r5+WkxwF17W672thutTMV1IdL0A3Qu5kC8qX5qm2763UrSc7HqtdddzuK365zjPT0KnebWhr5/S6Frw+B8kaPeznVYQru2JrcS5358G6euFfOg19o5W+RxZX4E6imBtfLpU4CfL53y+rGP2k1TCsxYmIb2a3oWZuc8OObuQC7mQT8uXU8RcrDO3rqMFHHQtUnxR7ae/3H2tSl8jQLqwg2gddOsgd54P/ixZD6Z4yhmf3PpztxKf8fsXlfM1k55+aR6wuwKA63rpeU63W3j+Ytew3r3C/71WHm896qL9Yx2oRc8HX/C6F3IhX1y+lII3F3IhF3IhF/J0+dJKO17IhVzIhVzIp+UCdC/kQi7kQr5CuQDdC7mQC7mQr1AuQPdCLuRCLuQrlAvQvZALuZAL+QrlAnQv5EIu5EK+QrkA3Qu5kAu5kK9QLkD3Qi7kQi7kK5QL0L2QC7mQC/kK5QJ0L+RCLuRCvkK5AN0LuZALuZCvUC5A90Iu5EIu5CuUC9C9kAu5kAv5CuUCdC/kQi7kQr5CuQDdC7mQC7mQr1AuQPdCLuRCLuQrlAvQvZALuZAL+QrlAnQv5EIu5EK+QrkA3Qu5kAu5kK9QvpxuwBdyIX9N5Hv/8HknQmdN0XXYtOFvEEL5H6lQMkIojZQKKaXfvu1k7SSC0ETU+XafInRSdc43Z7W2AWzX0NPRYG3TdXX+9HX4rfo/RfjOH883Em2/suFzB5iwnwNhcc7iMGF7h7UGh8U5g3MG6xqsNVhrEZZzLVC7wwvRXVffV9Gda0oqhEPIJ/fr93WibbGqkFIjhEapCCH8mLb3JoRbG3vR3vq5xquf7u0ouhMKoVHtj1LhR3bNXH1TW4l0Yu1ZSJwNJ3G+9a1vvu1wGPycsGGcz99f/6T8//4f/8cfP7NV6wXoXsjfaFl/eX0XagCHlBKEBOkBQkqNFBqxBrg9IAhkizah83XfOblto+xQSuOcQTgPjgKFw4Ewz7hCDwQCEQBl7ahCemAFWqPVd25WtMDrUcXinMQ6g7MWKcE5QQsf/hBurbN238H7s8aq6/XtngCeJ/5u93M43woc3w7cX6fDWouUFmsFUkqklGuLydpi1J5aPA1wObdwdedbA/zPuranigCw4cm5sJR+agP6Pt79Yuk4D8pPkwvQvZC/0eJfkjVgC9qkkCr8eI1MCAVSIvA/IHCi1ZlEt7cT/bE8EAj/tluHcwKHwGI9WFrh/3Xty8s5ba4FDCHOX1u7nYcC22lwzoGUQdMV/m+/lYFw5U5afx3CghUeB3FYJ3HC9GvEk+Pk3KdAuL/gAMB4zdHftevuxeFv0eG6exFOgAUnHdY6pLTBGqBbSNrxc+19u6dfRw/CYh0DPwXOUq5d0NpV96AZ/nZ+TB147dybFd04P3nvDvsF0dzLBeheyN9ocR3gytYWRiqFUEGjRQXTVyKExEmJFa3WKcIrK5EtAHfg0GtdXhMWOAt2HWMlSCTOqXMA0Zrk/vcebFvQ6DQ3HKC6O1n/1wNVq1EHPVaIQCmAdRIpBda2x/TLgQdofw1PAtyTIPYpDdK1O9Kqzx5sPb72Wnq3GPjrk9hAlzzrOZ3XZJ++ADz9AP14PrnPE2PWft2B63lAbhe+ln5qF7Vz1Mcz7qGVC9C9kL/Z4ryuivSg6vnaVqsVnlek5W8DhyuF/1nTQAODu/bC+rdQBvARznlt2XmAt9bijEN0JGgLKq2G216gCIAv/Clbbe0JjdRhgwkfjoPEYQKQttRHuAd/BdigvYlgQgvRani2WyzOo8inNcynUQniCQBy69fbMgVuDZvD4uC61YgnNMdudDvAfZIH76+vR87+u3UrwRMG/vye6mjR1npuyB/B9Zp6sFtaWwaCFSNku73r+N+n0OGfkgvQvZC/0dJii0AghUIK7f9FdoAohUQIhQtg25nIrQba8qmiff16kO4o14AyMujWxhqskDgjwNYBlPvr6uliGRxKEhkcS05YnHB+HzgPkM527721zlO9ztMLQohgvoPF+sXFghPKQ7NwnjJxTQfi7tzxnybiib8cYg171nTFAGY98Lfg1YKtDXyz/1zgZFjjHHgapd9n3aknOipFdIvaZ4OfCAtS2PwcUPfPqtN6O168vZv2nm33uT+CDUzS56u6F6B7IX+jpaUNvJbrvem9o6x3mPWarneatRqnFLIHX6F6cHIigLkH5JYuDF+CNUhRewrA0AFP60Q6TyuE62u14vBvSwkIIbA+7GDNBPb3FlTJTjv0jiqHFDpwqf7c0imsIWwLFu/ww9nAHHcQzDpInQO9LhSg19rbP70mGBYjJE7IoDtKnOs1ag+8/hqxPeXTRYQ8BUw7M/8zkPY8ELYWytq+a8/M/7OmcdMr6b07zZ0D3DBqTz330+SZoPtP/sn/weEEVV1xfHLG/sEhx2dHyETx1qsv8+rzL7EzmRKJCFM3nJ6e8tGtW/z4/V/w4c27zGYryspQG4MxBuccZs16UGFyaylRSgR2yvNfsp1fa5PfITHOYWyDbQyNsThrsdb5z/2y7c2mMIYuDKZ/8HZtrfKmomzNOan8Cu3arYKjREiGgxFvvvM1NqdT/vbf+l3Oliuy4RDXGKIowmG5tL3DqigRtuHg6JD9g0MePXzIvfu3ee/996nqCicVLlJYrbHSeX7PWpx13bmxBtdYXFPjGotxDmFdoMucd9oI7/eWQuCEpA1Dsu00cF7jsGG2eH5uzQgOGlnrw7HdBOr9137eORAWgfIT0XlnkA2TvPfqurD2h+O2NqSwCCf9dHX9Vqydozp99MVn65cgqtVuuygFFSIXRKAYesagnYuyAz0PwH5/D8RS9MDSRhSIdfQBpLMYazAiOGqEwFqHs3YNNwI4SAlt6JR48hX3L3+HOUH7ap14Uoow5i3vawPPC8bhzePgxJLWeieg8M/aR0bZ3lnofIiZfQqd0N2jCyFzCD+XWbvkjmMIIBs0WT8/wyg7D2zWeWefDPPX4IFdBnB+Gt+8nnLg+eF+iegg1HXDGs7nj2WfBOXzd9guB+Fbtwbv68Dr6LXxZ8szQdfWNRaoqgrnLEor0sGQrZ0pV69c5bkrV9nb2CSLMrCWxWLGdDxiPMwYDjN+8eEdDo7OkFVDLSSN8bGC1vpV2ViLwE84ZQUqcFla+gcjpEAL4QFZahASh8VaidWWumkwjcEYi3LeG2vCqtoOugmPwwmHcfKJMJneTJQIdKRJ0hTnHLt7e+xdvsp4POHS3mW+8fVvsrd7GR3FHnSEREUKWzfESrJcLUBEOOe4FGVcvfoc0W98j4ODx3zw8S/5+KMPufvoPqfLBY0UNM6RlwVNXYPwmoR3yIAQ3qMupPSLVff8RT9pWk1BCHASpEOsza4O/DqHTMARQfe5V2Rcx6+BC6ay8y8e4IS/Jr8IgbMB0Akg1I2jDJBqe5BCdVqK5wq96R3UC++Q+nVLiFDoAFcoD6pS4sKYCiF6aoE1DVcIlNIoGUA3ON88vaA6LRe8+elcNzm9mz5otjYApmufSQCUDuTbmODuWL1m3ALGp51c+HcoKBf9nuBjVL0SYtprFdbPOylwVoWTNB5k2kVWSH8fTwzhU03qXj30M6JVnALgdtpxGz7XLUwBBJ0PI+sjN+gWgPXznudtaRnb7vtz19ZaLO0R1+Zme3LveFzXdHvFYm3wO+A9N4PF2m7PkGeCbl1Xfn6YhjiKmUwmjCZTrl7d5crOJXY2t9ne3CKLUgQwGg1Ik5g4joijlEGS8cEnt3n4+Ih8VVI2II3ACOEdCc5PGisExvrQGyUFTjmUkGg8mEgEWgqUklgk1nmtQAmo8BqztV7rlWFi24AkJgy6dX6ltK5zOQRT0R8bPCC9+fqbvPr6W7z99ltcvXodkCRJjJSSs9MF8/kSpRRWSCKtURIWRckyzzHGUDcNWZrQNJAXS7LBgG997Td46/WvcXp2wmq15N7BA37yi/e4+/ghK0N48Ux42AEgpcTHdNIuyrRLdbdQCK/99ppO//Sf/NzPNX+/SvQT1Mgw0brwwn7CeaCWHQXndep2LG0IDwpjt3Z1HeB3J6b/1LVWnOCLaAVftvTUgudMpVRI5UHHiWBGCq8AiEAl+HhSjWwD76X/ly7KQfiIBxQErVOE4HpvNguENeAinG3jaQN4uTXOUrS0xVoMLt4EbzWr8/rckzfXPx//CGW3vRQ+kkKiMDhkCN3q6WHntV7nr7u9FwF4yuHJ2NXz4lpStF2wvVIdlIQwLtZ/56eeCRanCCaqvz9CVEkXftdabZ+aOr3+CWvabhvudW5Y3Hm07LUahFgbz3ae9jfif1sHaQjqBuFaPx91nwm6VV2DMSAUSRKTZBlpmnL10mV2t3YYD8cMsiFJmgIQRQotdSD8JSrSpFlKkt3iwf19ZvMVdd1gjKABGuuwWHAWE8wIg8QhPYkuQBjnTSxr1zzKIAIIKysRwjsFjBVg/PF8GKRA2uA0wANua7KEBRelFHGk2d7Z5dU33uA7v/E9XnrhZYxtqFY5i8WSoqqCp1ehI01dNzTWMRikICTVasVildPUNUppjo8NVVUyTBOGoxHGNJR1TVM3TAZDvvHKG9y4dJWb9+7w4Z2bfHznNvPFAussCodwntqwzgazvn0R2oU2aEUixDsG7cO1plfQSjtHS5gzCojaV0+IzmCyzoXtWx3ZX4PnJK0Pawoah5AOYbxfnE4bdsGcfEIbgzDhWzN3na98Wt7TVy+tZtsCrpDKUzYeXfw9BueONzBkANvIa7kBeFvQbjlYhMRzmO2CKTsAQ+Izv6xCWt0vuEFhkGHRJVxCqw2uZ4I512ZHrQOuoNXW/J8ixA23c6jVGp23jAhapwvxx0IFnlj0dBLr0QJy7ZkFTf1Zg3vOxBedht6PSdB8bTDiRB+Tu+6APO84exrgnjspnQbhpKfvntB423tqR6xd8NoQu35MwzwV3WxmXb/tDBfh40N6Cu3Z8kzQlVFE3VQI4dDRgDjJGA3GTEYjxoMhaZKidQSR9pqQyMiALWc8Z2UdTgqEkkRacf/hPrPZgrJsEI3AGYO14IzpAvmc9eaWcQKFpUGAaOhi+gJ31r7ISnktpV/9BdbKkIhj2veGFrGs9YAjpUbpiNdef5U3X3udV195nc3NbUzjODw8xDnLarmiqBuauqZoGpx1pGkKQmBsQ6QikiShrmuOjo5oGuu1AxyDQUZZlKzKitEg9hPQNBydnYKEsqrYzCZ85/V32JlO+emHH7JYzClXeeBYLQKJoueYPVi2U991k7VlV0Uw3VsFzbUmfTuzwu9CgCJEZApPDNju1einpleOA78uPOzYAEYuOF0kniboNOuOlnSBgwuLnguB+CHF8wnF5Ncmcj3jTGoEOtwP+BduPSVYIpSnEZSSAXB1oBja1NagoXYvZ3hZgznvnPXPSAis9Fqyk95OsNYDvNe8e8++z959kkZo/4Y+K63l/vvTAgF4A1yEtS/AxDnzXKDCc2xTiNuFGGjjdxFhQWFt1pw/X3de6Cy1MNoQIgfC8tBpkc6Ghbm7HOkViqci7LMmj8M5bz04IXFOduPYOulaaqO9hhZk+wXh08C7Ln0MdeDs2+3FU4fhU/JM0E2TDIyhrkuEsygpkUqilSZSGq00Uqv+KWuQiSYxKaPxmN2dmsI0FFVFbWqQDh0pzs5WVEWFqAWqMdQOGpw3W4LG66z1ky8MhnVeiVXST3avmQikjIKm4ENLtI6ojZ8Mpig8neC85jAej4jihHQwZGNzi52dXb729te4evkqWkVY09BUBYtVjnWWfLXi9GxGnucgJEprzpAhO9RrOJGOQSmKPKdqGmyYkLOzM3CO0WTCapixOfWLlZKCs8WS2ji0kCgp+PrLb/Lqczf4yS/f5/2PPmI+m2GdQEUxQnhrQwrB5sYGw9EI1ziOjg4wTd1pLk4I/14I/6b4hy/6yd29rJ4v9g44Fzjd7s06pzdZ17tgWs1XEVJPpeteqpYn9taFw7q1VEw49zK1FEPP8f56pU09lcIDrp9zMoBtr90JIRFaobQHWimkX/C1RqoILUNYmWgZweAYdn4EnfD+Cw8CwXmqJMJ4sLYWlHSdid1ql9Zanz0maXGPXtt6+vj14+2vX64BQhuL2odKtc6f8FytP1EXmSoCBy8IYIbX4Nvvn+RE166pZ0dl9yNE8Kt0eNpeRw/IXXQG3pIT1oFa02Cfcsf9uLS/OoywCOcd7dbaNY29nX9h73PDGBSITlFrFzJBTzU8IeJTvzxTPh90rQ3AZRHO0dQ1dVODc6j2FbVNeHFt8IZKkiRhOBwwmQzY2dlkUS6omgpwKKmYzxaoQlBWIVrBWE8PWOudSmHCWevnrfc9OIxUKOeII69ntau1UorxZIM33voa2WDA/Qf3efDgIaenJ1Sm8cUtZMzu3lXeeedtXrh+ndFwjBOKsqpppKUqCxaLJas8p25qTGNRUUwsBIvlkuXxGcJZ6rpmMByRDYaMhqBlgrWWpqrJy4pVsaBpDFma0VhDVRas8pzpKGNjMmY6GhLHCdYYtBQ0xpIlQ77++ttsjsd8fO8+R0eHLGdzsJpv/8Z3eev1N3jt5VdZzub88Z/8e/7sz/+Uw8cPvBsa12kUreHeroN+0aLXWixYKQL37RBdXGcL092v3qERUlVbs1NikUJgVatVi/784DVZGzi8c9pCr966oIbLLzZHv1RZB7m+MAu0QNCFbEmfOKGFQomWw40QKkJIDYFSCFZzCLfqwfOcI0x4R7GUPsPNSYVSLQDSO5nwC1pLMbXo1oVpdR+1x3ZPvPdB33b+HesZ4DY1GFqw8+cN4WdOrmmh4bidOttblD78gB61xJPGdbC+UH5shF90vDXQ0x3rIXnrencfprfmn/hsBbfbs6ULcCZEhphO42213fMLVquprqkcT43NJSwI8txl9DbiF1Mingm6Wkl0FBPb4NUUYEzNarWkKAvquiKpK1Qgvp3z6qi1DVY4nBZESUQ2SplsjNhYjSmqHGsNUjnUXCGKElk2qNrQNIbGCYQxfcokDmN8MLmyDqUcDo2SDin8a62k4vkXX+Fv/52/ywvPv8jLL72CE5Kbt27yySefcPv2bWazGZcuX+LGtatMp1vgLGVZczZfMhpkHhgXC2azs8CnSQwedGkaVnnOcrXCNBVKCKbTKdb4AiI45518tmG5OKM2NSqKPSdrDVVZooRgKbwHOFIKhSXSEcbUCCCKE5Ik4+o3LvPyC6d8ePsTHj18wP/8P/iP+OY3v8W//oN/wb/8Z/+UWGnefu11nIQf/tuc07NTz8m2piV4/aJdD3G4EJvjPw8UjiQUXlmbKh5j/fTpHJAW6ySq05D9BqpVVWzQaoNZ6tWY8Lddf0tsoEYC8OK+6Bz9UqWtpeBjWoM2Fj73fK6nFHo6oY0mCE63kMWGUAFI2vsS50ClzfLyjiTrFxzhAddKhRY+JLJHl/ZfjZI+KgdpAu610Sn+POcWtKcMaguV63jS0k8hbgchDF11r7BKi242tVqeCg6y4FxboybWr7rVqrvU6i7RpAfW1hmMCBAm2gvr457X6044XHcP/in15r0/p1hbG4LF4CwO76Q2tuXbFdbZoP235t3aHO1vhw5OO01EdJ89ZSI9oTF/tjwTdE1TAw6tI3Sk0VqBg8ViwcnpMZMsJYoUaeIPY43BWkdZ1+RlQVlXGCxSCeIkYjhMGU8HVLbGSVCRIs4jilVFsawo6xrVNN7JRgiHsR4AGgcGixYCYSyNaZBodBJz9bnr/N7f/j3+5I9/wH/1//ov+O53vsfv/d7fY2tzl+u/+zz5bM6du7epbcNqWfDg4SPKskRIwSAbsFotefR4n7KqWC6XaKUZDkcoqVktV5yeHLFa5pRlhcAipKQoCgaZNzWd8VrycjkPHLhEWEtT1xht0dpRVSVCOAZZhowiojgF5ygrQ1XUUNWkccRysWCaDfjWa2+SffM3eOetrzFMUv7+3/ufMJls8H/7v/5n/Py9n/LNb/4G165fZ5EvacoG0/JY3WSBNmxOBPLXAdI6lHBI6zVO69p6AO0+YT9HZypjvONOKhlKvbRONv+vEfhY4nY/t6ZRObpJ22rF3Uv6V6Kac+v4ajlnrxV6Z62n06RSnlprQVZIVJsq3CVQtE4oOnOhBYvuI9YcUsJH5hCcd53pam3nn+i5QxUiXFz/Zj/xhnsnXYCzp2iDTzri2hjtDthcu29b0Kd1yhLAqz2o7KHnCfXTtdpqd0wZ8CzUrehGnDApgsNMCEQ3c9tF5PxNiPZ8Yl29cF2UhOg+J3wexluYEPFkOh1dhuP0zroedNfHrud223O0Vks3qf9S8kzQLYolUiiU1iRxjJaaxjQslgv2jxTjQUqSxmg1RAiHqS1V01DUFas89yZ5vqJsfJyvjgXZUDMyCQhLnEiKPGaZVKxUyWpVUJYllRAgLE3jg7G9xuQH0hqLFQbTQIXgyt5lvva1b/BP/8v/ko9v3cIIWM7OKMuCr3/z+wyHA7SSzBcrzuZznPPxsXmeMxoNiaKIYpUTxTHz1QqcZTQZIZxiVRacnpyyynNWZUFVV2gpSCKNszAYDjDWUBZLVOBylVDkZY5z1idc4NDRlFgPUUJwdHDAZDxiMpkyGGSMN7dY5QVVVbBcLoh0hKUmiyNeufEi0jlOj485PTrCVQ2bkym3b33CD3/wh7z+1jvk129w89ZNbGXb4IA1I7LVQEKwOXTB+O0rYMN25wLEnZ/MNtRfbYTngFUbLC9BiT6ioQ3X89wZGGc74PXah9f0Ws1GOesjWJ+MtP81iJSi18i6xAYPHlJ62kqqkBosAigJFdKB+0wxKfvMM9dqUQ4CweO5yTZszL/6ICxCSSRRiF1v6YV+0WzfbSlFqPcKfdFa0fGsvXNI0K90/XHafzvga7VeWuANERciXFuwbHwkgyR488IesptZnSYcFh7abD78eLZHCat0d852kRHd4uJaHO6vq1OZz4Ow18W8o7mLIT+3CLm1bQ3WCqyQXQo0+NuT3aJm17ZftzJEd77WwdYqEG0I218Ge58Juk1TIYQiVhKtFZHU4ByLsuTg9Jjt6ZjN6YRhmiAl1E1DWTeUZcWyWHG6XLBYLVmtlpR1jqFCxY5kqHAyJk4USdIQ6ZhIaLSULIVAygofVCZorMGZEJsYzOjGGISAwXDIa6++zr/+gz/g1u07aK2J44h5XvCjH/8ZOh5w9co1pBAcHR+zKEuEEBjTcOXKZdIkYbnKcY0B6xgOBjAYYB3M5wuKsqSoK2rbkGiFqxXGVDSNQgKJjojTjNVyQV3WWNOwXM6oqoqqqUmSFIGnaDY3t4kjzXgyociXzOYLhBRUdU0UJ0RxzMCNmC9X5IsVgyTio08+IUszZrMzzmanPHr4CB3FTDe3qJuGg/19bly5xunpKUeHhz4j7/ycW7OGepoBPN61YNxppP18hO678Go4C07ipEAjfOJASOlwOIwFY51/Xu1EddI7gVz/0rSZcn8FmAWAwBsGIG1BVeITHVSr3fY1dLti2118byhy3tZbAFr3kWuP74Lh7xr8H22SgOtMYSl9EW2vANs+K9K1Wq/swMGJ9jvRnbPVWp+CGeeljYgg5HCtGx9CdgvGOjsrggZ8roQiijaJBwQujINcX7jWNVYRtNgeewOWBn+BCHOlA+Ewbmv311oQrlvCXTe2nxXz7a/ZYGyNsA4lbFhcWItS6bbuLZM2fTosMn6sWw26jWhRXfTIF6m50MozQXcwGFHVBcbVgEUpQWP8lMqLilWRU5cVpq4RWmOspWkayqpmmRcs8iWL1ZJlsaSochrjQ790ZBmqGBNZoihCixhp24kLMlfgSqyooRGIoNkaazHh5ddC8sILL/Po3l0ePHrMcDggyzLidEA6GjEYjDg6OWRjMkFHUSDxHU3dcOnyHlmScHo2Q0rFapUHIJdoJSlXS0zQzuumZrFckC9zqiL3CRHKZ64Za8D5oO75ck7dNFRNTV7m1HVNYyxKx6xWK/b3H3Pj2jV0FLE7vUK+XDI/m6GiCKFyBoOMJMtACJRW1HnB+x+8z+ZkzNliztnpGdPpNleuvsBgsklTlcRKs7ExZXtrl9V8jjGGpmloo0BaL3HP27ambkghps8yM62JKVwwv1oNxnX+BSttp+PYYITi+sSKrv6pwwPy+XihTvMFF2KMv/A8/dKkd+JAq7m0INinBYvus96x5mN1pVBdCGOrvXWpIaK3OsLZuvO2VMz5i3Eh21GEhWrdtPVZcJbzXvjexF9nHMK+HRPRUxxtQsunuV/Ra730z6o/5loJyZAZ6ULGYR/jqzqNvxXZEQdtYSBvxXZYLELqcktl0Wudn6VGnou5dW2MeQugT1IBfuFyzoewImxvqYRr69Pj+2fVF/lpF1LZj2uniLTH//R1PUueCbqbO5dYrRYUxQpnTfACGp+xY0ItzjBJlVBo4dt9FKUH3VVesipyVnlOUeWUTUFtS4SCOFagI5SyCGNxRnYTTWr/8FQhKMqaupHUCKQJLUWED/+6cukS7//sZwyGQ8ajMZPpBhub20w3tkgGGVpFHJ2dIqWPULDOMRmPsXXF8UnF3t4eRV5ydjZnOBqQRhEP9x9jm4Y0iThbnDGfnTA/O8Vai1KSNIkZZymTyYTxeAwItNJMxhMiKSmLAlN7rdeamtXiBFxNohXHJ8ckiyXD4ZDJeIQej8mLFeViSVMVWCE6KsUYy2Rjk7IqyVcFr7z1LulgRL5ccsNaGtuwmM9RSvL66zA7O+Hs5MinqyJC1lhwsD3hjVa0BmSY6CG4u7XmEMG4DHPQCdEl27S8pYAuF94KXzhFWokVFuXaF1d6Z12vP7TKCr3O/esVzwB0rx0AQsoQmijPAW7749N9dcfnStcXummdUz7d2Ycs+UWwBZPWUec9+211Kv9u2U4D6wzsVrttnT1rBXHOv+PnR7PlNNuv3HkEDd+0KdkuXGtIDw6LUGuRCNdq78LPGbGm/XqzoHMutjw/qPA622DxGED7xVz4+Gd/GoUT1hfsEcrXFml507Vb8PMpxNLiA9BaP0V7f/3C13PSPUB6+ksQouLCV6L7aQG1XyCFU74+xTmaZo0K4dML569cZWxzc5skHTCfn2LrgqqqvAOrjZXVkQ8KR6KCuWWso6wqVkVJUZTkZcmqKCjqktrWGFd7T7AUiEhiG0mcOmwtaTMi4yQmjhPiIkIvc/JViRRQSxEy0xSDwZB8tUInKbvDCVsbO2xubTIajtnY3PK586bm9OyEk6NDirpmY2OTxjTMFzUvv/IytjGcnZ6SpglN1XD74SOMM5R5QWNqHj96SFmWpEkMSGKlGAwGTCebxEnCYDDEWOfpgShmNBwTpwPi45jlculBR/gQlcVyjhAOaywb4ylZcoPJdIMkTakGFSdHhz6hxDmWyxUKgZIeGuNsSLnKSeKMq5cvU5sGiWS1mSNNw3Q65e6dT6jLnNVqgbMC5RyNbY0wP1lUpwX4ySLDC2WlV4f7aSeQDowME9v1k7Ofr2Fr0RlgaCXAypChIzs+rtWyO7NWCHqHyK9b2pc7OH+k6OZ378jqgRcZed5yLfOyM0NbbtTvRZuF1ufzt2DZ88HebDfnzWjEued2LhOt/a1z8vSm7Xo92vPaoGiZjPaRhJC2T2/rz+6Lt3dAvZZg0N4ZwlMKCO3jmhGBI/WftckyTiiEc4y3X+fS9d9gvDHFlScc3v+ARwcfY5pVAOQQmujaEMU+4+3p+u7as4Pu+vw4tvUhWu09LHVOYlzjFwHbJll1y1tH9bSj4HncNqtwbcES4jPB9VcG3WwwJIpSpFQs5icsF3OqqgIBUeQB1wkfz2msozaGsq5YlQV5UXjQXeUUZUHZ1FgMSIkWEcJJbGNxTqGlItKSJLYooWisIUkr4iImSWJmesFqmaOrUBxHa567epV4MGI83WSysc10c5vpZEQcJ6yWS06Pjzg+OWZVFmitieKExXLBcDjktVdfoywKTs7mDEdjqqrg3v17lEXJcnHGYrkABEkc8fprr3vNXkqasqKsarIsYzQckCUxMkmxztGUJUVR4NwYIWF7y5CmKY1rOD46oa4qH1ZW1yxWc/YPDyirkuFowmg0wU43WSxmOOeooor7Dx5QFwXD4YAkSTk+OcKZhutXr/Pa2++yubnJtvD560Wx5Pu/9Tuczc4oihyhBHXlY6Jb/c2/KK7XMAUeUIMbW4pWlxBB2+lylp7QBMKr7hyq1YTw2pGSDicDSDs6rVbQphoHEA+Ux1+F2gvQ3rXtONoWcD0IS2+Khjhc0RXGkaGsY6gC1qbt0Zv8bQZab76Cf5kDdeOsP28XuO8B4zxwug5Q3JMg2Vbrco4u6aXdpz3KmvOspdgIzwdChua5yAZ/3HU46vE5zKauf1xYOFA4oUjGu2zuvsyl6+8wGU2xzlIXC+4/fEhzsOLN8YvMasGfPMr5xm/8p3xnKDk5vMPZ7C5nJw85Pr7DqjhFqYg4VsyXx2AKpKvWtOXzch4AQ4RHlzovQy3eNXi2PrEdqZFOdpqqn+Nyba6LdkT7ok4hRtfaTwPrOs3zefJM0BVCESearBnQ1BWr1ZLGGu/NVRonBdb4MnW1MdRVTV6ULHNvEq9WK1arnKKpaZxFKIeWConGOYWnH705IKXzhXLiBIslqRPiOCZLEnSkiWLFallQlzWRjhlkGVVRsbW1x+6Va2RZhqsLjvYf8/HNj1ksFlggywbUxiBUhDOW8WjCwdGxpwrShJOTY+7evct8PqcucpTW7F25xje+/i7f+fa3uLR3GaUjVnmBVJKz2YzDxwc8fPSQIi/BGbIkxsWa7b1ttra22NnZJk1ShsMxKtI0dcXJyQmf3LrD+++9x61PPuHe/Qes8pIrQjEcDplOJzTOcnp6ShzHbGxMefhgyf7+I8q8JE5imqbhzu2bHBwd8N3v/haTzW2KPMeYhheu3eDS5SvsHzxmlee+kEpLBwjRqTnrSU2tudZOyxYkO49z0Ix6OAmmYwDlBhHANWiC9Hn1zrX56D6+UoaIiJ7C+KtBMLSZc14j6iMRfJZa0F6lAtU2pexrNXjtrg35WjueawHX+AUtfHfO6UUActdW+FqvSeBTv1s31TrofioSwT2pXYlzANB9I1prpk2MEd1z6nXJFqF6E7slFixtGUtA+IJP0nm6IBnu8cqbv4+avsTm9h6LVcVhUxIPB5SyYv/gI148fED+8Z9w4+W3+GV+yL/+4H2u3niJN7ff5Y3nvsc8XxAJGCnBJPVKzfHqEZ/c/RF/+Ef/F0x19Klnd37RdoHC6aM5hGvjdc8tQxgrw+iqri5y6/htF0UPwG1SUA/uXsFoTYZzp//Cs/nZBW+qGhXSfJXSaJ2QxL55nURQVTV5WVKUFToSrMqCVV6wylcsliuWyxVlEWJIJaAkkYpRMvYV8513XiHACYuOZdCs/bGTJKIyMToRxIkgSSNWiwJn/AuRpQlCJeTLBU25oljOuXf/Hnfv3CHJMqbTDZq6QmpFU1dsXbuOEIIo0qRJyv7+Y+7cu8PZ7IxYKS5fv8G3vvMd3v36u2ghOTw64ujxe4ynU6rGx9qOhkOGgyHvvvsuTWOYn50iEMRpwnAyRThHWRQUq4L5yT0QktFoSBrFvP3G63ztrTe5dfs2P/jBH/PwwQPu37+LqWsuX7nCdDIhL0pOj4+QSjMajcmylKODfQ4OHntrovTheEWZ8/qb7yKAPM/J4ojNjS2UjMAWmMbPBP+SnM8Uav1bXinqYxDE2otpXeuI8y8oov09HMTi62q0jgzwYWUiBLGHSW+Fz+AMLBwWh0J4HvivQMiYT8m1PrdBhljkrp5uWwSnL/2oOkAOhcyF7ECuB0bf4rxd6DqTvgPdNgkBekdUeFbSa7xWVIETbWOfP0PzDT8txK7zmGBak6KnBtYccO3zJ2jd4RBri3H7sNs45rDoBg1fKMX0+vfZev47/OTuIeXRfXjvI6yKKbd3GPGI4vgQcecB4tEnPLp3G/fjH3JgYg6muzy+85DHO1dIpOGNl17ByAF70w1G0y3QCZM05XvvvspsfsaP/uQ/6yia88+vVxp8FaH1+NvwXERwHbb3jvF1WZDBudfW6w7qhmsBV3bccs8Tt3yz4Auj7BPy7JCxuqRpoK4bn7KqI9J0gDEN1sJ8ueLo9IxISJJ0wKoomOcrlqsVy9WSoqioGoOTnp+MkohEx+AkTRMKXAuf6y2lr/iVJJF3YmhJZDUpGp1AHEmiSKOjiKbwNRzKMudscYgQijSJqcqSR48f0ThLLCVVXdM0NeNkxOWr1xhPJkRak+qIw/3H3PzkJkcnh+g45u23v8Zv/9ZvszGdcHZyyuzsjOVszmy+4OGDuxwcHtAYQ5okXL58lRdfeYVsMKSuG4bDEQ8fPCRKEt5/72c8enAP6WA0TInimJ29K1y6dJXJxhZRpLl2aY9/9L/8h/z7P/kRP/zRD7l99y6L1Yqd3UsMBwMiKTk9O0WhODk9YmNrh8ViycGjh9S1J75v3/6Ek5Mj0jQjTVLSJKOocoyxFHXdaVhtDdK26pj/O4CBC4474TrNwAXKoTdhPT8rQlIFSF9824LPrPKTT0kPviqYdeJpmpgAaYM53xbA+TWLNQalw4vVUgodga098AqNFr6oTR+D6ljPIOvSTp05d7/AWk3i8LcLWll4Br64C2Ghat2b4bl1YXvteey5Z+M13jXqZw0IOg2t/TZQPK1DqXNxtpfr/Da2+2mvr20V72N2PQ4p9O43mY1e46c//RjXLGlqh8tXxNMhy6M76J1NDh4dk+Q1Q0DWNUenSxYbV5lEI9K7HxH/8gfUWvAv/w1w+RXklTfYuv4ir17a4J0rz7HXpPzmt/8x9+/8KY8O/qzjzlkHUdcWhWrjMkJMuPPX3XKyQthugTSuoa8Hoda03LBPuzCGRbFtrS6EQdK2TfrLzblnt+sRgqrKyfMcZwxS+Ow0nKOuK2bzwtdfsDAa1BhnyfOcfLmiyAvq2uDwKbJJosmShFgmNI2hpgLh6+YK7R+2VAqtRGgMCInyXJGOPY2E9JzuwlSUZUFTOmanxzR140Ou0gHG+mPa2iAHgsEwY2Nzh73dXYbZgMl4zEcff8Sj/UPmixkIydtvv833v/dd5qdHzE6OqcqS+/fvc3i4z6OHD3hw/y5lXYJURDri7r3b/OQnf8J0Y5PtvaskUczZ2Yy7dz4iywaczRecnRwxSGK2t7cwBo4ODhmNhjz3wksIfQXpLN/99reRSvGDH/wxB0fHFFXF1uYWk8mYzc0pQjiKcsBiOWd3d5f5bEZ+eozWkjTLKFYLytWKE+fY3NhCJJqqqRDCJyzYAKTtWyVCeVIbOFbhWofDGs8nCLxXoATC90K4zhSzodOFE77Eo6cWvFFsAnDIMNH7LCoPIm3BrL4c5K9XjG1QtvEp2622z3kAbiMYRKvpEcYgtA13LQ9rHaHqEJ/WhPwYtDVrn+RRzxWdwadZOyQG32Gid3q1x1qLCmn/s3ZKf5kynNn2n4YNTBcJHPYNgNtqz62m246Hcu0CEzLStl7iRF/iwa33UYlh8tw2pZXs7DxHJuCsOGRXxWxee4nZ0WWOftRQyYriG8+z8dbfwv7gj0hv/YQIB8+9RjaeYOenbJU/4ocPf8rd51/nZ3fuMc5Sdnev0Exehv0fBypnXQs/P8TnKoWJ4JlfR0cRymsSigk5gZC1L3gkdBhg1dExhJEWa+ewbeaaaHn6tcN/AT/FM0FXBa92UxdYY0PgMyAk1lmKsuZM5kQqoqw87TBfLFgsFhRlgXUNSkkiLYhCYXMlNE3jQnX+UIBcBE+99NWbOgCOhc/YUb72QmMsRdFQV/5lSeKE+WxGYy3YhkhpitxX8NrY2EAryWS8wfVrz5FFmtVqxcnxCUdHR6wWM+qq4qUXX+J73/4uSTbEOcEnn3zEL977Obc++YjZ7Ji6rnx8n5RUjQHhY3JHwxFSx5ycfUBZl2ipWK2W3L9/x4e1SUVd58xmp9y6fRulIybjEVdv3+LGiy/z6iuvUjWG568/z+HRMb94/30ePXpEnhcsV14jLiqDs47JeJOT4wMuX9ojXy1xxpJon0FXlBXWWUaDjJ2NS36u2LYgej9dOmbA2jVXjThHGfh3t1XP+gB9KxxatDSE39LSlsn0cOqcr10sgznXJcEGK1uKDpqCLtIylr9esVisa3Cuxrm4hbFwZZ736xMG2pfdF3FxTnTj0SUxIFlTPDvpKYjQ9iY0i3RrANc62vyIhgw30a6Dtj+maxc02zk8uwgDERFpiYoGpNmUNBnQOEeSZNSmoVzMyKsFq+UR1CtsRz21ziOLwYaaHf7T1mJqt3Iiphw+z2NrGU4rfuutTaaqRrmCjyJJXq34/tYG16Ypm5MrmGbKj69tk43HqMuX+XBmyS/9L3jp1RdJrWD/pXcoxJSHj28x/OinXHZnRHafo49/xrHe4e7yFfaOb6NpQ9rkWnzCedV+LcqYPkyPLpqirT/S+TTwcenW1cHi08F6a/nsvvBpFwpI+2YFZWIt4sF9AfX32ZquE11l/LosvLklVChYo4jTDCcilrWjNgswNbP5jMVqQdPUvvSi0uhIkkYpWkY93xLSL4USXalE4XyAvsUXGlFKIbTDCkncxESJIUpKVOSjEVI96Eo8zlc5xrrAERtOT0/YvbTHxmTq60FUNa5xnJwec3R6zGK55OrlK7z26mtUZcnHH/6S/UePeO+9n3Dzkw85Pj2jKCtMqHomhV840ijGaI01llXRdouoiZPU12AwDXVVU5YljTFdPQrrII5j7j96xMPHjzDGcmlvj/Fkyo3nnuNg/zE3b51y6/ZNLuUrNje3aawjTmKMaRhPNzk82CeOY1Skqaoi0Dy+DF8cJyAUkdbeMg4LY4eh3YIvuvc7MAPBnGo/OLeu0/ZIsy249lMaB1jn40uF895sK3y4mutAJGzrfPNER4vz4q+EphtuAmcN53nM89u0Xv+ubkJbfrANkwLWedGnaTw21FWwYSXqnW6eklnnBmwL3ghP2eCo/cXSaW8OpIoYjy+xsX2DrZ0bPH/jVaJ0EytSJmlGMsj45HTJhpNsDjPyJkdQU8wPeP+jP+XjD/+Yk/1PkK4OdMJaV4h2gjwhzeAyD1czkg34zrWUr0cL9vfnLBclm+KQq8MENaw5mN9itZXzwDV87c3vUSUjFk3C5rhksJjz/N/9nzHYGNMUC+bLmo+GG6zSa7x7opGzE3Z39liYmqPhnNnD+09chWgfzBOfrX3X6fJtfC+dNbM+30W7IArTGQMizN++gH2Yr6JXZdYdnXTP8NPj9aQ8m9M1jXce6BhETt00aO1XiTgZkA18/KpwjrycUy3nzGczyrLAYVAqJo6Vj7uNEpTS2KpBOokSCqssCBtifP2aaq1ENITYP5BCo3weBZFyKFVibcHZfEayNUIrDbbGoCirio3plIeP93E6RilNXVe+l5oxHB4dcf/RA8qqYjKaMB2POT18zJ2PPmC1WnB4eMC9Bw+YLxbM85xlUdBYhxKKKJKUTUOuKrSQxEqjtHcOqZDVJqSiLAqsbWgaS9nUvn5EiJetGm/GmtsfU+YLnr/xAltbu2xdvsJ0OmE4yKjrmkcH+1R1zWg8wYSmnkWxYjCecHx8SKQ1p6cnvo1S7DPj4tjzx5PpFFM35EUe+pn10s0HIeiCyR3eDBMEjj2YTiGhouupRgu6rQc3HNH5Ty3W87TgNQZEaLgpOi3DAiI4z5zriwv+WsWt/9v3HKOlW9r0Z+crrrWxuXJNu2k5YCds4MjpeV8bKl217alsyyuKUNjGa1DrVQV7kT65gjamVwXTVjGebrJ76RXefP27JJPrlEZQN5JjLPunFZvG8jCr+fCjA64hceOUXy5L6ga+Pc7Q2XU2XtjiH7zxd3lw78f84R/931me3PR9yQIQtbh0LnwMxSoasnIl192E1SrlX54eUa9qmtzgGsNVtcfB/Ye8+eJrLH75kCvX3+DjW3cYDIf8eSypJxvIyykH7pTm9vvohweMbt/lzePHiKrhjnPspJvoKGYiar4xGPAjrShLHzbmXK/fdkDaXaN/eJ2z68lH7c09ED65Z32vdtF0+Fq8UlgEkT9WV8bSD4pr/0WsrU1dnuYz5ZmgW5YlcRyhdYTSCcassKbxPaHimHQwRDpNXVWUxZK8qFiucpqmQSrQCqJIkMYJUZTgrKNpbChF6I1UKR1K+QnmrG+/Y1r9y4XV38lw0/7HCf/yirAU6VC13xf1dmxOpzgU1kJtLdPJlIf373P/8SOKsgRncbamrgo+/viXLBczVqsVx0fHnM3nLIqSqrEMhhOklDShBVAifS0IYx2VMMRWoLXqCrzUVekLvxhHVRssgsFgTJLElFVFvlqxKkpwYMxDmrrm+OSIjdNjJtNtnDHEkbcglqsch2U8HNM4X3ZvYzom394hjTSLxZk3fKxjNBwyGg5x0rKxvYGToGcztBCg/MJgQucLhJ9bxvrFwIf8hWydsHS3vJ6UijbsqdMaQqpwy9V6S60lE9oJHDQIWpPOT0TpPFXRmq3qi6gFX7qs6e5ripMHQnEuztO6PskB6JxU/vcQWCdbkxPaYjQuZKQ524JuT/CEnekuYE382hfqL1iH0im7V17n+kvfpdY7RKMhxyLj6ChHKsXduuL+Sc5vWsHN2PHLMmG7MmxNBvxbU0Ad85oQfOhiZouc1GmWeUO9/Tbf/3v/O37+h/9n7tz+IUBIE+cJEPFpEyu7QiUSsTRYKZFFykBGIAqIapbLE9Qo4een+1zevsoDW2OaM9zpbX62fESaJFwTI6qV4uj+Q2ZK8IvZMZvZmHvVjPHWFe6RM5kOuDLZQVpIpKLEnrfYAgXSj9b6r/1s7KJFIKiubeLFeh5itzUO01kh3qGmvbOtpY86LTkksYgQ3eFa1eLZ8kzQnc0XbG1u+D5icYppah+CBURakUQxiKhbxYuqoqprHA6tJDIClUiSWBNJr4kaY7E0IRXQILVEKoGw0Ji1QO6gZTgnsJY1j6pPP05jnzgxHo1YLH3IlxEQRZq9S5c5W+RESUIcxTx4eJ/9gwOKsmB+dkYUScbDjMXijMXpCfv7+yyXS5ZlSVkbyrpGSsVoMGK5WpCmMYPhCFNX1GVJU9ckcYIPsxYoDY2FWAgqaylrT0lo6btNOOuwjSHNYkxjKBuDXeW4w32KumK+XHL5SoPUCrMy5KsZOopYrlZY41sEJVFGvprz+suvsJyf0VQFOEjimMl4SpKmxJOMOM0Ybyu29i6zPZ2wu7dHmsZ+okoR2sAImqqmKHKWqwWr+YK8KLAmgASCsqzIF3OqPMeZhrJqqOrw/AJlYpzzE6jVbB2hEpbtyzgKD0iCwA2H98HSm2W/TjkPtOHfzmHmuVtxjkoQa/u2O/rPpGyLwojOTLdBu6WrxGYg8LMiaM2u1ZTWjt9FJDiHUCnjS6+jr36d6WCX9+cF18ZDHtw/REeKN0bb/H8f3uOhTHm7qPn48pRfRhFbwNcnY95XObke8K5M2Eojblc1W2nG1zc2+PnJPsel5eXxNV76jX/M4/3b5Pn+2l3KcK2u0+pi25A0BUYkPDhY4vKKSGnSWGDqisFQkWhBFhtwh4iHj8lwJE7xzbNT0sZhiPgQi4linLW8e+k6WmhO6oI9EhrtGFLiFjmzKCfPT3iifcZnSE+JdPz82prWWtTOWdomlC073D1XQpw1dLWHhWjDKluNt01ykU9Qcp8/p58JukfHx6RJTJolaK3RUUzdVNRNTeosUgpab6Axhqr2aruKIUoESaKIY43Uwn/f1F5TdBYhDEL5CmNKSZrKBeeA8auRDJX/nI97bIu51LWhaRxnxYLrVyRXr13lzl3fKlqmknQw5NqV57hkavbPzkgjxYP9fU4XMxbzBaau0DpjmKYsl3PKsqCsKsrG0FhL4yzSGTYGGVf2dqjLAbcePCaJIuIoQhjLIPElLeu6IlUaJySVMahIUxQ5br7E5gWpsFy+9gJ7meRnNz9htZgT66irblQVNWdyhgCK5QxkRF3XGFPTmIbhcELdNCQ4kkhw9caLJHHEzTwnTVKcdago5sqVq0it2JhMeOP1N9ifzaiKiuvXrvP8tWvcuP4c440NojjqlABjDXVdsZjPWcxOKaoSH5VSU1cG6xynZ4ecHh2yOD1lPl9wOjtjPvehgBYHyqKj0CAUn2FYlhVlWeGsQycRyWBIlg3QUUSUJKRp5p2MxpAvlp87Qb98aTPoRMvc4V/APiXkvFIqOvO2fZk7qHS9o9HhQdb/iNAgscHH74LoKmCIPjvMSSwK8MDsEGxsvEB87Vv85Myx2rfU7LNbLrk1jDi0Oe8mY/7fCj4aJLxYR6SXRhxPNb+ZbvFWbfh3riEebfKOiNhsBD+o5uzEGS/LiF+cHrLMMq7ECWVZkG9d5Vu/+Y/5oz/4J4BZy1704yHDopC5ChFP0E6SJQkrU9LUS1a58EWqTEQdDahKR2VKzLLAIcltTapiTl3BeDxgNTvkuXhMHI9BaaRMePvSS8hoxDCJKeoZo6hi/6M/pjYrP9YuRE+05S/PPcnO7Rd+TPdNC7jOhogMEVK0xTpcrmnLnSPNdcdzmL4k5pqzDdG3pf+VHWn7h8cMBynbatM7Z6RE6QhTlzSBJ5XCOyGsaTDOoiJFFEVEiSTJfEaZEoraGkxjcLZGSAOqQiqH1EAoSmhtW7czhOoI0Q0u1pvBddNQNw1FXlE3hijWTCdTTF1icESR8u2kDYyHY47P5pyenTKbLSjKUPfWxBwfH+K7R5TUpqa2jadR4pRi6XhuqNlpDvnodEWqIYozhINLV3bZ2tpBaUmxmCGcIC9K5osZw8kUJwRH8iFVfch2arnuHtGsFNoYUq0wQpNlMVif/ukB0DKfz0gGE6QQngqQkqosyLIhzgqM9XUBmrqiKHOSJENrhY4jXn3xBR4fnzIcThhsbFDYO9QDRzIcMZlO2du7zOXLlxgMh72zyEFd1+TLJXXlky2MleR5TlUVCAdlXTA7PebxowecnZxycnrK4fEJs/kCJx1RLBlkGq0ItIqlrgxFUaLimK3tPba2d5lOt5hsbDGdbJJmQ4yDsqiYz04/d4J+2bKeJdY7y85/78IGbWWwvsTf+v59eJVPi7ed4+x8Nlm773nesY3dtQGYo3jIZO8NJjuv86PHllFd8iifUecV48jyi+1rfH9wmQ0MH8eOvzve5dK85L+TZ2yWEc/VNQ+ujKjdioktuTwTPN6LuTaYMl6VNIuK5tIQcXjMxKV8QMFz0wn2xW9x7YN3ePzwJ+BUV/K4zToEQVws0eNdSieZTjbJFESuQVrBqpgjIk2iFKPxFGMrkiihsTW1MWwMNijzUyJb88611xjrCRWC+8sDdkfbvKKHzBtDNtQ0Tc3hgw9oVgfhGtaeCz0U9t/1dULWt1p/NuePsA7QXnret9+qfT4tbdRu2BZ+t6JdBFogfrY8E3SPT07YnGSkiSbLUhS+v5lSGinBmtqT+6bG2QYhHTIK4WGp9mZxHINT1K72HJe0SGUR0hJFChWBbQw+LVEEZ4znCi0GLQIkB61XIhgNh7z64qtcvXqNRw8eMh4MOJ3VTEcjkIplUbAqamaLOVVd+5KLpsY50JFPvqiKHCkFxtREWhNrSzYa49CMBxOWcUxlNDZJ2BolbO3uoaRkc2uT6WSDpjGojR2ssxyfHJENR2QjX/DGrEqsFZwtTrlfJOQNTLevoHQIdRGCYrUgXy2RQtBUFUVZE2XOA25jqGyF1r5ZZl4sUcMxR6e+8JAUkuFwDM6wt3uJX3xyk+HGJienc5xyKCSlraiaylesUpIo9kWE0tibQ9ZamiZmNEjJ8yJEW1h2dwVN40t5lkVBvrPNxuaU06Mjjk7OGD9+zMnZKdYZ0ixikMVo5WsXWGNpal+8Zbp1ma3NPSbjDcabm2xu7jEaTtAq8gtnVVKU+edO0C9f+iwyu8a9OkEf72lDFn7gVy0ghVozY9ttw9/OZzytZ4GtrXVBLNZ6uqelI6yrsM4xGOxgN17h1jLm8PQ+qqq5YwWiaphOhvx8usGLtSPTln81kSRGolcNP9obkWSCiaiYnMFdk3MpqrkSC8RozD9fHCNP5/x9kfFwc8IPHu/zH46HlLOK8UTC8YyFNVy/8Q0eP/gZXXZbqwAF7TwWGh2lxMmAs9MDrm1sEEtoyoqd8QiDZVWXmKYk0wqpGjAV42zEIBowTickKkYLTRaP0Uhem2wziFKWecFoMqaRNQ/3H3E6uwfOO9Zd25k5AFvL7QY89GV3RKuhPplm3hYaakuPEurGiJA0Efj61nEY2tJ3Lew7rlbStqzvoL/Vir9AjC58DuguVznz+YI0URgzJNYREoijGK21V76dxVpfzEZriSFCa59EEccJWsXUtW3nLT4R1CCUQEU+vdLgzVnhY51oWZU2t6Qtbqy1ZjKdsjmNUU6yXC5Jsoy6LNhL9pBSkw4y8qpikZ+RVxV1WbDKl1S5dzZYa/ykKA2R8gVMsnQAKmZraxchJPlqRZSmjMdTLsUJgywLGXkxk/GYycYGdVWTxjFIQTYYYYzxTscoJUJyucxZzM6ItC+GYpuG5WoB1hInKcdKYqxFSf84y6pGr1a+20SkobIYY1mVORvxhHy1RKQp0voY5DhKGGYps9WS2aogGky4tDskHaRc2d3jbLVERApT1zw+OGRV1KRxwiCKcc4yGqSoKKKoSt9+RgiyLCUdxCgpaeoSk2VUwyFRu4AOBqhYk44HNE3FYBAzzmIi7aegcQ22MQyyEePpJYajDQbDCZONTcajDdIk88/bNNR17fnNX7NY63vt9eFcBmMNoguiByGlB+IQa++rjbUaVqAkvB1Oy8O2mmsbqrSu0fZ/mg6ofT89QZTsEG2/yy/PFJFt2M8LXtrcYV6veNUUzIYOuTPmrXiPW5xi3JzXok2eiyQPoxXjpua52vJoJ+b/uTzAnp3yHxdb3MlW/Ky6yR4jnN3jD1YfsECQu4R/S46+t+B6HLOVKQbPvUE22qNYHiBD+UYrI6J4zMbWNTavf4NltsuDk/sM1AMWszM2k4hYRUTGJ92MdYKOBwjhUGLIxnQP6yxpkqGkpMgLSDNsmjKoHdJatJJsX9plURxz8+M/ZH//A6SrOlwLumYYvrWylGE1a+vqdnHVHYfbj38vrlstbduqyD+g4CDz+zxB269RSOsu1RC161y3IDxLngm6q6KkyHOKPCKKHI2OiFSMjjMipZACH9LUVIAl0golNFHkiGIVstfANn7CBqXLm6aRQkWqM9WM9SuqaG84hC5ZvAYihO/AkKaCQTJhPJgghebg6JjGwTBNGA4G5LVlscrBOfI8ZzGfk69Wflikz8Qqq5pYK6SMaGqDUpqhSoiUYjrdpJ54LnU8GofrN0jp414HozFSKCJlsHWFsQZnGoZp6ttxa8Xm1gb2xHWONq0kdVUiI4m0UDW1LwvZ1Ejn06xRito0PqNOx7jKpzBb68tPbmxu4Jxjd/cysVYM0oTTsxMOTk6wQnN86qszXb28w3Q8ZHc0oUFw+PCQWx/fReuY6WSK0IosTYjjyNeESFKUklza22JrZ5Mk9mX5okjiXIpcLRkz8gV0BNTG4CTUTc0g0WwMEyLlE2na4jFpNiIbbjIaTMiGI4ajIekg6SgR01jqquxCpn6d0pr9Leia0H8PFArP0QkbKo05CcrhnOpaendpw5x/rdvqXe05vEbdmp8hlVd4KqINIXPxNveqCY9+8TFiWXHoGjYmO/wkqXk93sDcyDiexnw9b1hlCw53IjJRUjQr/mSww784u0lU5PxDe43o9Dab+T2G+QmRu0YcNXzj+Ba70SbVICcqH/BCPGU5cczK+7y79RofsOStQjHMG15/++9xvDqmaBrGwylbWzeYbN/AxCNWThObikNr+eRwn6s6I2tq4romjjSREDgjkJVD6cQrNQgaDcuqQQrDcLyLVgmmriGJGA2GKCG59+A9PvjlH9CYOXKtM8mnArHculZ7Pp35af5Z7zhbd4KuWydyjZLwz6XlZj0ut/E5IoCreCIkrVsROrrjWfLskLGioqxKpJLEcQw4alMhTLQ2kQzG1L48Y5KA0KjI+NKPQtMY317HYUAYhLJIDTrWRFrhTA+yPi40pPlJkNIPgBSCJE7ASRql0TJGRxFlXmIaQ+0EjanY3LxMdTynaRoWqyV1VVDVvjOvkjYUnxaURYnKUogEURqHAuURSRwjnWOYZJSRoSxXjAYjnDGsyoLr12/4zqxNwSBNQ0KCgEDO18aXfhwMhjTWcXi4z2Q4pChrZmfHxHGM0NrzyEXl+VpT+8VGSt/yBryDLkmZz0+ZTjdxUpAXBaNsBM73J0vTjAcffsDZMmcynmAFlE3NydmCNEkxtmI+X/D46MhzqFXDfeVrVwyygY8LHo+4tLvDSy/e4IXnrzEcxkDIEsRRlAVIi9Yh1jrNSAcDsjJH15JBqskGMXGkfLU/61O4ZRSRpRFJGpEkMVEk0ZFAxwKpBE5KpIhwTfW5E/TLFm/Whx9rME3j66yGlhq2SwX2ZR+NA6e8F1t2fdLWQNetcY2uT6VugbV9QdvOBE5YX8uiGfG4yCjziubhXeTmJps3XuHaaIfDqGFntMd76oxVdkI8eZHKCWaP7rGth7zaxPxI/4LB8fsM8hrHjL0Yvn2yT7WY4fQROYbN1RkTdcR8eJ/tqmJvlLMqcq6amok4RDUz7g12iOucd1/7Hr//yjuc5iWZSjmdFcRpQm0rZnXFe0cPeSAtxfNXuXXzZ8zPZkx0wkApNpIUJRVZptBSY6xDao2Wmigek8W+ZOyiOuVoeQ8WDdGJ4vjoY44Pb+FcTTugnmb0IkO4YvulN//Xi9msWRznQLN7OmvcbOf+DJ/323WHWOuQIQI4t87PPpy7Jb3bBfZXDBnLQ1bVYDRhc2sP5yDPV9RN5Z0tQNPUNMagdESKzzpC+ephjXHUlW8w2diQ7S0kkYxRKkEIHTKdHMpX2/X8l5RoKZHK4qQvkmLwTSmVkKFXGyRJ7AvjRDFGCo5mOYcnp5RlgZCKOMrQusRaQ2MEUinv/NMRKklxzvn0YyV8QfEopW5qiDTOGuIoYjmbMRhPeOml6yRJQqwlly5d8yZ5FLFaFcRaY0KzxbquuP/gEWkS8c7bX+PmzY+p64KdvUucnBxjm5o4jhkkGU1T+u4SqqBqfHF423iTs64rhJQsV0u2traJksQT9hJG4xG3Htzh7v6+L4ATuOqFlKhQNSuOI4oypypLauNjbrEOjPePO2MYZik7u9tsbG1hLKzy0gNoFFFbQ2Mb3wGjMUghQ1foCKmVz6cQDrr6DSI0b/QzuCxXCCURWoIGqzw3L5SmMbZvLcT4cyfplytt1IyPLrC2wdYCExIiOoeuUv3LGEoCOuc7BcsuI+3ca8ynTdo1ESJEOIBzGXcWGQ9OjymcRQ7HVOMh1+qKD8Ux188U1daSZgN28hmRnvELazg8/YTCJizY49uiYvPgBDMvEOaUPIvR+ZLYgs4MZ1XB2AoSWXF4OicWGqEds/KMqUh4tFqxo2IeylOu7l5mZQx3lzOfgekqVKoppWUm4MwY5qll98qY/JMPKaoZj/IckUQ0WlI1ORuDEc1yQVnXjCZTIpmgdMpwMMZgufXwx9y7/SOq8tSzr7Kt6mVAKHxHDa+AOWGw7bOgDc8KAOtDT8JItxxmy+fKboETbZ3nFoBdH6fbAbMLC6jzONXHYbf0w1pES3CgtY/a+2A/X8uFzwPdoqKy3qTe2d5DKc1iteTk5MCnuhY5ta8hSBSnKG2pTY2xFbbxpnxVNFS1r7drhGdppYpQVtE0Ctv4ViU41bV28XUFVRhcf6PGOJJ4QCxSkiglTVLOFgWj8dj3IcsLjk9nWGvQcUxxfMyqKJBSUpWVf3FClEWSZejQ6E9FMYNIYxqDjQXD8cSHlUiHtI6rL77IYDiiKks2J2M2t7ZI04yjw0M2hwO0SnC24eT0hPF45ON5Ldy/f5/5YsGVvSvcf3CHe7dvMRyNSAZDhMWn65JyNjsm0pF/+fBp07EQ5HlDGic0xlLmBePBiFHmm2D+/PF9Hh0e4qxBK0lerJjNNNgmpGKfsgzlNaWKQno0JKnvIbdcLdmoN8mGGUdHR6RpwjCL2NoYo4SgrCpfXKhpKOuaqq5wznPqWTYgTiKoJYlShAYr+KwtH9rnrKUxNuSz+AiUsikRucbiMx1r02CM461Ll77QRP2ypE1c8G2MLdCEYKkG1b6sQmEda22IQAjZl60MDt4QzdunmbJOL7QigzHsY52dVZyuUg7vHaKFZTLeJE0T1JWXGZmau3bO9Rsv893xJkeHn5DnUy6JnEIckZyckpaGqjpCp4qdvKJwgoGWGGdIdcQoSrHOoLRmHGWs6oJIx8Qq4mi+9LVOWLKqG9LxlFhHLDLNmXFcpqGJYpamZi4FBkfuHLUyXJMJ5vYR9w5u05QLJoMJDsjLApWmXfKMxFNRIvYOq5v3fsbjxx+QLx54vTEUf5ddFEHrvAq+HWHoQsE6dPRZfq3e2dE2Tqztu5ay0619Yu0YwZoR7dEFsUyZ6AmjJCM3hquXXuPB4W0OFnfXtO0WXF33LP2T7lONP0+eCbqLvGCxKrFCkg3GDIcjBqMJQjpOjg7JFwvffFHF6MjHjVIrmrKhqRrquqEqGl9VzFoqalTkG/4JFVYSA00JpsZXhwcQisY6RCORWhKpAUSGemWopSXNIsraEGkNtsAZQ1PXzJYLVqslq3yFaWqcczRNqP8bhWI61pGlKYM0pakKkkhjjaFqKp8EohQ7e7tk2dAXrVaSoix57vp1dnd2SJKEJEoRTpBkGUdHxzhTs7OzS5IkOCSTTUjHUx4/vMfNTz5hMt1gMBixKpaYusYYi3SNL7ZiLEiNUBbjfDufqirRceQph6rEAKUx5FWFNRU3799nsVgQxZpBNkDqGGcanDUsFkufmIIvXLfKVz45UQXNTSq0Ur4YUexDziaTMVJKyrrBGHz4i/FArZRAK4Ux3quvpfL98LRGqxitpQ8ZEw5q5+OxTYnQESrS1HWNKHJsvcJgMdaF4kUGPs3UfeXShor57LwaKxSY3jMtrMBKiwhlGxUqVKSKaNOiXWiT0em2n+tMCfy3dZRNxMFxzsw2VLtXmFjD2bUpe+WMX744wTnHJM35o1nOe7d+xLZMWKorvJ0JNlfWO2BxuCoiQmIVREnGss49/aUUZWVIkpRZvkCiiKSiyHOUUljnKwZK45ifHmPTlJM6J7oRkd78kCvPXWFjPGKoFImWnBVLbs5O+OX9u/zy/Z9hZhYayXSU0tQFm/GAYTqisYbRYEwyHKKTlPnikP2P3idfPgZf/n4NDF0/dkHzbEuQStfXoWhrdfTdgp+wJjrNcy1y4Vw3atH5OsOBvHUiBNrFjM0GO8UWz2VXef6Nd3jj9d/jdH7I4+Vt/vzWD/n43s+ZFYcdaWzXFtb+eL+iI22+KjiZLZjNl1SNYSOK0HFEY3ZomoblckFtDINYE0UR1uK76lqBqS11aSmLhqoxlMbSALFVCKUwoXuns2AqsLUjEtLXLEWAUxjjHTc4g3AJOhYM0wF11bBarVgWhqooyIsVVVlgmxIlQuiIEig0oqlRSqFVhDENcRyhhPKxrlr5QH7hH7KKtC/a7jyvKZMYUxteeuklNra2yYuSu/c+5Otfe5fdvV2qyofKSSnY3NxCOMeDB3f52fsf8Npb7/Lqa28wHo748x//KVEcMdH+JSryFdI2YCvi6QStYmarJYenp6jIv/TOmE5LbZoGrSLKuibWGq09p16VNVo3xEJRW8vpyQnGOfIiRwoZQvZSUBoVabT0L1ljKsq65PDomOnWlKOTI4bDhOEgRmoVzO2GvKyoK08f1Y2hqkryIsc01teYVdrXOFZQm8oX9mksVZljxSpUrPKNK72iYnHSt7P2HRqiz52gX770kQbWWoxtoNW7nPVFzJ1DWIuTXsOK2vdd2dC8UILQ3jILxG4fv7ue8usAi7MN1lrqxvHw3gmHc4HSGduRYmc45e5ZzkuTLeThkqUVxOaIg+qUF4uaDWoKcx9ZpFzWmlPpUE6h4iGiqYmVxShHVVVU5ZyTconQEXYJg2Tbp+zbAq0UpWn65qM44khTy4aiqLl37xOaFwV3D2Pk8TG1NRw2DbFUfLJ/j5N7t3DLhk0ZsTPeYBwNiAYbDIRmkI7QaUwymGCsYf/xTUSVs7F1lc2965R15cuHK4EThrxYYm2FaQrqusCZEucaREhBd21djxZrW0uiizqQPf46WE+KaNPWz8fv0j8TJ0hUym52FXEkuPPzW1z55jXeeuG32NnaY3O6xw33Jt954++zv3jMBzd/yPu3f8zH939OXi9pbB0KOYUIii+g6z67c0RecXR8xsNHjzk6PWYyGZOlGVk6ZDTcIM1OqesZQvmKYDhH09RUpc9qqitLVVmKqqYwDY0D4xRN0Lx8QpvDNd4U8WFkvnOv0AorFUongMBZyXSyQRYn2DS0BlqeUhYFdV15jSuUXxTWMMyGmGWORBBlA8rCTzQp8Ykd1oCzaKlRWoMxnJ2deVNDSnQUIUzD5ctX2dzeRUjFxx/9nB/80R8QS8crr7zJcLIJQpENB2gdc//Wh/z8/Z/zpz/+MTu7e0yGA3Z29/jau1/n1q3bOODxw/uUdYkpS+p8gVKKF65dJ82GWOOYlwUmpqvENcgGWGMQ1pHECVW5YjyZ0FQl8+UCZxuMkVgHDT5UTwBlaANfpwaplQ+NUoo4SamSGOMclXOoLOqyDherOZHWDLIErHeQzhZn1GWNMVAUJaaqiJXEOoVScs109qUbGxu6JkiBsbVvZd806Dj2hZOk9KU4HUiVfO4E/bJlvRuDtRZpLcKzz/6FD86wnusLmhFBJ3MWgabtigtPe7kD2DrrOWPrq8+5KgISRlsDGqtRWcTx5oRDu8/h1jVunt5HnD6mzp7j20nGsR5T1AXDSNPgiIUm0ZoKKCPBfPaQ1XKfsphjbdM5ddqC6eXgGoPtV7G2pqpypLEI63z6sjW42iGlZqA0i9WCx7c+wWSPKFzhwwGdQGJwizl6dsq1JEMKzU42xVpNpDKGgxGoiHi4wbff/CZZNKJuLEmWYWqf4CSkQiiJkwKNIdKOSDhWVcFZPmOxnFM1K+bzYx4f3eTw9C7l8ohqeUjdLFF+xfOO+Ta+n7Wyii4QBm0xkXPP2yt70vnC5RLFcxsvcGPwArdvf8zmcIs3336b4vgRj+qaOJsgtCKKEqZyj++/8R/x/Tf/p4ioYVHNeXh8jw9v/YwPbv6YO4cfUJn6c+fcM0HXGMPh8Yy7dx/y6PlHbEzGyK1tEAIdRQxHY28+4svWVXVBkS+8d77x9QaqxlLVjqp2NEJjhaYyCgtoKZDCoRxEQKUMroEkS6mdoKodpqwZZAM2RiOSKMbXYnCczeaYpmY2P6OqSrIkpSpKmqZiY2uLVVExWyxRnvRBS4lWviNuWyhaR6l3BjpBWRQ+rAQYjSY+lCpO2N3d9ZXW4oTtvSsURc1//f/5r3jlxZ/z7jd/kzgbMphs8Od//mf823/zL7h55za7u1cZDkZIqamqkul0iytXKo4Ojtja3OQXv3yfIl9inMEZw8nZGePxhM2tHRqcj2KwNrzsCqskq9XSh41Zy3K5JIojBoyo6xKofbU1Z2mqCi0lZQj499024q7MZGMbhNMUdUHWjDg4OMQ1FQdHB2xNNxlkPoRMK19HdJBFvm1S3dDUNVjjLQnZVoEDKTXKWgy+5KcWGUiJ1DFCarTWpHFKFMUgBI0JqeA6/twJ+tWIB1yD8fVAnC92Y1yfU99prsbrVuvhYs664Aj6LOeZ16RN65g0PjTt4HjG/ZOKaFyTDbYYzWYUuwk3SslkPmNvtk/S1IjyFFcXPJ8mrHRE3hhOmophNCLOFCdHN3n88AHO5LQanJQeYNrQNOdgsbwPG7tw+XXU0QPk2dzXQA4ByKapESH8byQk5WpOvTxBSEcsBJEUKCEp6wobZ2RKkcQpZdP4aJVkwKKyGCu4Ptrhl3cXZBuwPVDc/MUBIkowWkOUoZsK4WBnZwOnDJlSjMSIK1uXyTcNOZJdA6/b0i/csuL0+DYf3v1Tjh+/x8HD93D1wvd7eyIKwXWZLYGWaD1deEpTodlINnn3lW+zMZxy+5Nfcve9W9z9+B6/8+3f5flXv8buc9c5O5pxfHjIyeExZdmQJCmDjSmz0wVvvPMGe9uXuXbjKt95/ruY37f89MMf8Kfv/eBzZ9vn1NOF1bLg4OSY46MDTo42fNfeJEEKR5pmDIdDyjynrgryfEVZ197r7Xz7nTiCqva6vZYxOI1pvCexEQKl/IwQ0pAkCQIoCsNkY4dJHPsan9YyGkwYJBG2qTlczijLiuViSV366ISj4yMkgmQwIsmGzJY5tmmIopimsURaUxa+ueQ4SYljTTYYUKxyhG0YD316apb6AH6tY65du0ocJyit0HHKdDLl1dde5yc/+ff8uz/5Ae998B7f+d5vc/PmhFsf/4J7D+4yHI546+2vsbN3mWzgeWGRpuxJX+/g4PABSZqxWC0BxWA4xFQlVV0zXy6praUsPT0QxTGRiqmtI0kSX9chtFqZzedo5ev65tUKKSRN09A0NU5ItNQMRkMP3tZ6DjbLyAYDX5wnStBCYfKag/KIk8MTppMJ4/EYKQTDQcp4kHAkRGhpowFHLH1dDC2hDhWbfD0XQd14r39oOIYQsY9pdRJrHFb54vXCiOB4Us+cfl+F9DV0fQSDMb64uHT4uRo60Gql/bbGkybmXDcJ67twBJBriwqFM2BsgzE1pq2vbAzGWMpFw/Z4kyQbcCQtcm9CsSx5eLTktd2c72d7nIk5iZRYpWgMJDpCRJpVFDNvTjh99AlNOesWgnWXXUvf4RS+nKFl8eDniOEYhptkq5IYA1WJUK0zKnT0cA0aSxRqYoNFOcdASxYIsuGAeVHQGIOOEo7nK05vnTBfWbY3r/Hg8KeMr1xH3wdpK+6ZIYtBRtZI8qrkuY1dylRTNw07VcFukvHW9jYfFacUCHZ0wiUBjw1YnZDqIenmlL+19TZbI8Of3/p3/Pjn/5LHt/4EVx55usF2lYA7psE52f2N87HW33jpu/yD7/8nvHDtbT76+M9QK8290zvsp8dcuXoD63yy1mR7m7wo+NnBAU4PuL69i04ThsOKs/1H2HpKkiqWpydopbgs9vhH3/9ffe6cezbo4mt+FoUvyl3kK/LVwi/3ThBrRZpm1HVFvlj51ic6YTCMaaqasqyRSnitBh/n6ITysXVSEAmJFL4jRZZodNCgRsMxWscY67v5DpKIKIqJIk1e1zRlQ1WWnJyeYkwTqnE1xOmAYZx4IG5qojgGBEI5ynxFXdckMkZGEZGOENLzl7777iZN5R1+jWnYvrTDZHMTITQqiomUZvfSFb717e8jhOP+3ZvkywVHjx9w5XpCEidcvXKDV157izfe/jqD0ZTaND5MrW7I84IkiSnKkqqq2Nz0HYOFNZi6ZJWvmK9W1I2P9Ih0RDIYsJjPiXSCQNA03uE3n88ocg/MOom6JJVIa6SUvsB7iCPWkQ+vc9ZgKoeNI6RQxEITIRgNxhhryFdn7BcHFEVJMkhZFjnzlSKOJNPRmKKsaGpLGkWhbZMCY2gaSR15J1tZNSCNd6IJhTAKI6GpLJXz5TFdiIWVUqG/YIjNlynW+t5ZMmSdmbajgxC+prPxGUsG03UJttaCab3qIfNMWt/AUvgqeOseG2Prri6yDck0xjiWxmKVI3cNXBoTC58BOjZnlKuUvek2l8cxpTUUVcNpVaNqgxwPqJb3ONr/COfqtcI7a17/JzKrfMEaBxjqm39G9Ny7rKZT6sWcLBYI06CVb9NEcD4rCc4YVDhBYxoqBFVjaBZLnJPcfvCQ5emS41WNibfY2bnCfpFzUqwY4qiiiKVOyHRFNTvE7F7meGPMSaaJTclwLthS8G8w/PjslMtxxNtpyqJZMtcx9xqLyB3v2IhNFfFJZVjGCS/d+Nu8fO03+eWdP+Lf/OF/TrH/IYSSjMpHfNFWxyXwwQ5HIiLevf4tdtPrpMmIy9vXKfYP+Ojkpzx3+Sovv/4GiY44u3eHKMto8hlNviJvKu5WFW+/+xYvvfEyTVmSZBnpaEBdG1+m1DXUy8Xnzrlnt2B31nsPbU8Um8ZQ5Cvf1UHg42mFD51IkpTBIME5SVnkHB0fQ1WjI987S0e+Uq51IKQgiSUYB1YgtCSOYgaDEUXl6+IK5UOMzpY5kSx93y1rMQga60OY8nzpec2m9mXPraOsCqwz+ELuEldXNE2N0oLRYNhnQjkf65skiY+okL5sYRJHKCWp8gKEZrVYMpxsMN7c4tXX3mRzc5MH926Rz2eMxiMePrzP9s4eb731DZ5/6WU2tnY5OT1lPjtBK8ndO7dZzefs7O2g4wQnFZGKGWUDhLPUjWa+mFM2FVL5zhBaa6qiBASL5Zy9QRY4Qf9CNI1BabBl4cskGouQMVFIW07SNMQ1SpI0VInTPjmibGqgIc9XSKmJkoRssIlz3uF5cniAsQ3DNGGQJRzN516LaxqyKCbWmiSOqAYpWeyLueOcLxbvLEQNg2yENoamAeEqmkjQ1H5xoPE8s/z1ZwF3mq61odyodF0vOUxbc8Cbq221SizBD+E1KWu9Fi+EYb2Pmj++X/CsbTrQxRqwjlRHyDjCKMnIRDR5yRtZhs12yZRiZmo2RIQyhqFOMFpRxorTxV3OHn8Qrqltmtj3nHNOYp2v8SqkROmMOB4yGEwZjrcYTbbZ2X2ReLLHe3duc3DvJsXsAF02aGFD6xpLY2uEUlRlSRrFnM3OSKTk5OSUk6NT6lXJ8dkCE49IrlxnY3cHN455/YXXuV8b5iryjknjMDohF4IqUhR1wVYWkzp4QM1DrRiOE35zFHN3/4A/dlM2h1N2tMLahlg6TpclhyPJQsDZ0YpXhgk3xiPeevnvMJk+x7/45/8nTu79O9omksKKgEshnTus78/vvcALl9+hmM0pkkPEYsUnP/8pjx485MaVF9CxJh6OWa0KyqIhHW/wD/7jf4QejDB5SRRH5KslOp5isdSNZePSJZqqQFjDYJB97px7Juha5zDOhnKDvtC1MQ3OOeraoVQceD1JnCYkyZAsHfvmkcsFy2JJWRekSJS1KN22MvBmaRLHUAuMlaRJTJZkSAlJrGhsRd2UFMUC5xSDJAXnMI2lsTCaTFmtVpyenSKlIhukDCdjXyMhkrilQAjti9oEemMwHBElsXcqhdApEbJOyiL3kRc4rl65RpYOkEoxHI7JhmO/6NQ1cZzx3PMvsrW9RV3kNE3N9Rde9vV3R1OiJKPIV6SRZHRpj/l8zqW9SyTPP4+SsHlvhwcPHtE0JaZJiSK/sEipwRriQcKqyImyEfN8RRrFISzJV/RfLpYMB2OKlefvJBBFPsQpjVOixD/0OkRlaKU9/6o80AuhyZIYoRSNaVgt52TOEMUJDYba1pzOzqic4c5+Tpoo4jhGC4GWkY/VjSLG2YBhFjNMY+Io8oVbnKRx1i+oWUmaDrzzr3ZoVaJlFEDLtxGS6tdPL3SarvD1FJy1IU3Hd9HA+GSVVlPyipNDOgmuwTmJCCnE6ynBQE81BnrBhlKP0rvpQMNSVFQDQVV6a+3t0Q02tGRuC5x17C9n4IQvYqQ0L3/zb3Hp+BoHu9dxtqGpS8qqQKsELTVC4kuXDrf83E2HjIdTBsMNEBHG+fZbjXXsL5bsXX2Lld7BnZ2yOnpINT+gXhxxcnCf1ekB5XLuu5AYQzFfghKYSOGyDKkyop0dTBLTbKTkk4x0OuFHj35BMdxmsnWVLE6pa8tRtoGYjHgjS7i5f8DpMOVkusvLg5jp/gN+Vs/5odtm47nrmNWCPz6d8dZE8414zE9dzXwo2ahrZF3ibMy9gyULKYmsYSN7md/5vf8t/+y/OSU/eq/veh0iFrrsMefYGGyyNb3M1nQH4SwDUVNXDVcvvcxv/+3/EciI5WLBfLZgdjZHRxF1A5eev8FgPMKZmuXhQ+LxBjJJEaGH3vLsiMM7nyCl4tKbX3vmnHsm6LpgDpZ5wXyxpChzmmaI1pKyzFGqCi1eHGk6YDAeM8qmOGN9eFakEbJByQYrLUgTiqtopFJkqUCmA0xtiHVGXha+B5hOMXVDmmQ4ITCNz14qK4MJWWTj0Yj5YMDm1gYKQVUbHwMrFbZyPqIigK2U2nPIxiFUhBQNWZrgHKRxSpnnWKlBKTYmU1548QWmW9vMz2bM52cIKYmTFKUimqaExhHrhHQ6CI4khcP6BaGu0UqhZEJT10gcOtLkRc50POaVl17mzq3blKs5whXMFy0AhTRTY2iqkqJYUeU5sdY+5TQ8k7IovRavPEhnaYqOJJPRhEE2RKsY6wx1XVJWVUjYMdi6pHaWWmhUFCF0TJZmpGnqnWYSmqrBCoFzinnuwwSXZY0QOY1pKOqSLPJ94rIkYTzIGMQJkY59ooRSOOFrTSjtw8niJCGNU2IVoXVMorV3XprGp3n/msVZgxMKpEVY6cuCWhdqglgMDQ4fCucjdPBhb75zngddKXHWhowq8AkS3RmwIdPNWd9e3YVW4KmMibUkTQdIlRBnEadNQSZTNmXMolohtV80q9rAtWvceOnrjF+OKZuaoRAUxtM+DgvKOzxN49Aq8gF7TYlUEYd5gXE+MmdZ5szrFUsreDSf46TmXmPRKmNWCSKjKErDg9sPaESDzCKII6KXXySKNSsqkt0rjLausGET7t5/H72doK4OeOX6a9z75BMepCuKXcdrl6/zYpHwn9/8MU2yw0fj63zr6tscP3zAL80x+0XCxqVtXrIVHzQF+8byv97aIs1WvKdhnsJvJQMenM15aCXvJmMWkaZxlsg5toXkrDKMN1/nm7/7v+GP/9v/PS4/wDqQXUqDT6iIZMzu5CrSgDG+hdbRwSGHBye88+73uPLKm6yWS0Rh2N7d4cr15/7/zP3Zj25plt6H/d5hj98Y8xkzTw5VlZWVNfRQ3RRJsSmx1TQtSCJswTDMGxn0haEL+68w4EvbuvCNL3wnSDYEQYJsmKAgqdXsgeyusWvK8cwn5vimPb2jL94dJ7PaZqVgWipuIDMjT5yMjO/E/tZe71rP83uIUrK9ueb5z3/E3uE+IcD12SnZpqXa2+NsvebZZ5/y5OOPUEIwX+7xe19yz31J0U1/67qe9WpL03TM5wbvJX03ELxLy5woUVVBnhdkeY73AaUlSqcX65zBRkMUSVwvdEEkxwwtWgsyXROAPM/o+hatA1IX7MbcMRDYztD0LXmW4Z1nt9mQa8VysWS93mKjJfhAJhNIx7ce4x1K5PiQFkFhtJ9W5YSyrhn6DmMdg7FUdcFib58P3v8G+wdHrNebcT6apcy3GCmKSJQaKeLovFLookgSFCFTbqfQqWu2lqbdYaylKMrxlBB4cO8+v/d7v8ePfvA9ut0N1vQEBOVswbp5hbep++u7NlmBmSWQkErJGzpTbLYNzhlyrZhUJXVVU09nTGb7LBb7TIqcIlNsthtevnpK0/f4eJtmAfhIVLcUrGRuUUJS5iWN6ZhNJjTecNUk56H3ljwrcM6y3myQMgWWZlpTZAW5yih0inXKlCaXyQCT6dRVCZW0rJlSyWYsFIGUF/frvuLIbw5BIuUIHJepc0VGbqNyBLcxL+PICoG4LbxBJLnAFzkMr7veW0auf51AcMvtlZlk5z3DpuW9Nw9Z5CWDNQx4bjabcZ6avm7rHH2mQAd6ASHmPDOGQpZkeUxpJCHi0BgpaIeBQoAVmnZwaJExaIn3gZ2AT/uBlWnoW0vT9ywKiM0AwvD89BP67RnywQFZiMQ8UL/xEHVwj+n8hLtVRhsCl6bH1nN++/2v8+TZY87anj85/4zfeP/b3LMdPx7O2dot+u4dfr/+Gj9yW742zfhf3Nnjs3nB/2X9Kd9ZHHFX1bwvS/7Di6esc80PpORvL07YXjzjuYGX0fO7h0f8sem40AX3kdh+YCEVtRKcGccQBW/e+22efO0PePHD/wgZHb/kXRCCt4/f462jr9G3A1K1eNvxo3/6F0wW9zEmYHvDvUePkDKdXtr1DeurV5R1zersOT/7/p8y+Ixv/s7fwKqM/vIaoSKHD++x/+Ae0+kMa4Yvvee+RL2Qbo5+MFyv1qzWG5aLBVVZ4Bz0w4C3G3ReMi9rlEwb7hgcwbmUjusMTbfBBocQgiwrEbEgzyUh5MSoyfIpxlhsiPgQiU5hBzMWmTwtJ3wguMDl6grrLZNcY52lbQe0ztHOoVTGbD7FDJa23SHEqD8EtMroh7Rtnc4mZFLjhKDpB/K8oJ5M+fa3f4Nvf+c7CCGxLhkwdtttQlkqSd+nYMK8LNBKp+5USax3KCGx1uCsxdoBZxxaKiyKzWYDwHRSU1YVH3zwDR4+fMg/+7M/5enTT7m6vETkBfV8wTBYsqJivV4xqSfJDSaTJTqMkrBENY3MZjPKIs1wq3KSnHaTCcu9EwiW6fKQoqx48vQzjDW4UZssZCob1gyjxAbm0wnBOnRIc8LD+R7OO9Ztw3q3pjM9GZJJWTNYi7WOzligRZJ02tkIgcnQI1FOpbWOkOOR/PP3QCCdon7dV/zC30IIqWu9JY/d7sIjyBBGB5IljhpPwoh4FKM8S34esPp50U1QcjHaVj+HyEekiiyrktnekrxQLKoJpa9o221iZWhFRNIMDus815sNf7474/fvvEPjBcUQcUGwNpY8i4QgGJBYCVaXrIeBC+eYZSVb12FNx1X0fNKtmU1K5gqG0OD7az787KdEHIfBoCqoqoOk5a4K7j98i20MrI6WhJMH/I8ffoeDMucn65c83a55Wx8QspLr7VO88ny4Peffuf8+f3q64p8OW358+Yz/zYP3+eT5Ez62A5/Ynm/s7fPv4bmxAyYM6IMZf83XXIUBJXpOiop/ePcO389WRFGhhOa3RcY/axuM1PxriwWn0pNFyRSDHwaUqvjqB/8WLz/9J8TNZ5/L/WIa333w5u/wla/8LlVRUxYlZy+uufv2B/ytv/8PMH3LfDFjspxj2gFnTNK024FmfcHp9QU/e/yEqGeojz9GRMfq+pJXL55xdXXO+cUlAejalt//d//nv/Ke+5KiOyaZWsf19YqLiyv2FnvJdz6GL/ZdjzSeampTFphPR2xrUrKDs5G+G+jtgM5KhmFHnGqybI4UE4g1Tevoe0NvEjvTmNRFuxjwdpuy04JDS0mz29J3DRsRGboOpRV1WXKwXKTZE3Bxc4kWKgF2gqfIciyWoQ/kWYaSgsEOWOeZzafsLfd55513+eCbHyCEoBu5tnleUFYVfT+wWa/p+54sz6mqGkGKVI9SYYaePMvxztL3KVXDGpvAMFKlTT+C3W6Hs4bZfMbR4RG//3f/Hn/0h/81f3b9R1jrkkpB5nTtDq01CInzjrqu6fpmjAlnlN/JpG9WivlsRlnPmE6nLObLNM9SCq1z9g/u0A89F5fndMMwzo8FWgR8BGt6skzTDpbgTLI363FJikCGmKRlwRGkwBqT5rbjks6N0G/jB4aQlhbiNlGWtEb+YpDgrVcgjlv/X/d1i+mLXyi8o+cUEW5f50jNlZ9rEgLJHjxuhdNMO1FZUpQ3SRYpxS2eZQQQfj5gpFCGYbBMspKTxT7OeC7alma9JgabcJJy/PMLEa5v+NMPP+Q39u/ycDLljIiXOUbByiUljiw8SmrsMKDygq8Vcz6+uuaJcKhaYVDbagAAeDZJREFUEXrDVw/2+d7zn3HhHYUqyM0Vk2OFOV+xjZ7FG++wWl0ziAb25+QP3+KkyGhKz6wsMM2aH708p3Etd3xggmW2ueAt0yOl4j43uOe/YN/s6HLBcb6k3jUs8oKH04rnfc9gV7xdH/BnuzN+FDb82ZXn35/d5T9bPeef+is+jI7/5d4J97aeTvYoJfit5Qw/FSBLLIJJF3hsWr6RFfi8guC5y9vcf/f3eP7954TgYCy9R5P7fPXRb1NWU8x2jYwON/Qsl0v27pywu7ogeI+MkXyUppoYaLqBjz98TNsL7r/xVX7+8cf8Z//5f8q0LJkUJcfHx9zsWp6enhFITsAvu371eAEgCrwPrDZbzs6v2FvO0VpQ5DlaZuRZRRjp98E6vLAYM4xRPgqtSkLQrNcrsixy984jpvVh0s8FgVJpXisBbx390I9bXjEmDBiGoYex+G+2K6xJdt/lfMZilpZcfd8hYmS32WL7IcWjhziqESRKFylCWylcjGhkYgB0hvkbC777u38NN/Sst9sRlKNAwvnZGTFGhq5PbATniFIgBQlVVxR0Q8+kmqAENLuGokyjkVxnyDwfs+Qks+kkFVMS5OfO8SFf+frX+f4Pv8dm2xCkQEtNkRfYosB7n1xlNiX5Wu9ApvGD95HddkuRZbRdT1bMECLDDAOZ88nWHBPk5uDwTnL5mBH8g8Qj8dYiVTam1HqsCwTvED5ZiO8u9pOe1Fl8CHRDj/MWNzIUJIzzzNv5f0p6FjGOaQujE+u1uCq8dtqJz++wX/t1mxb7+cMgaXZVHGVhIj00iWnRJsfCOoYrj0VbwKg7FqSHTnrRo6LgCxnrrw0L0mLsDusNlSrQ2hNjQ8wzYpSp03SJXRKFIG92XL18xv/5h3/MP/z6tzmoKgSRbFowN4ZXPnKvnPDjm1Puz/ZYO8eHu0veP9njcHPNXw7X3F3M8V3Pm1PBbnXD6csVhZpxhwW/MM8IZUaWK95+9CYfDVdM5vuc6IKpg+pizVFoCOGM3dUpNgwUUrFVBXrXsq9TCviy7DHXl7zpe1jlnMxXtOfXzAhstjPqxRFvTo8wXnBpe76elzwUBVkQOF0zzQINgZvWcGPm/N/choeV4d8vK+Z9i88HSjXh7qTElY7eRvKYAZJDOeFb3/77vPjFP4btCxLVsODvfOff5uTgLuuXT7l59Yzz01O6zvA3/83/KX2zxduBTEna3ZYsS7jXpmlYHt/jO793l5ubcz760ffZ31silUZFxR/83X+Tr37rG3zvz/+Y/+A/+D+ybRpmi/0vvd++ZKYbRz9qwBrDzW7F9Tr59PeWexRaI2OJKDRFkfLhvbOJgxAcuc6o8ppMTdCyRcsKbwX49Fbc2g6ahtRLqFGzG9ntNlgXkErjvcUOPcYarBmwxgIisXgj7LY7iqpASZUKtrPoLKPICzZNQ1GUVGVJ9AGrDJnWRB8RWmAHw+HhIf/K3/gbVFXBeujpjGG1WuGsoZpMGEz6/3oXQMiESrRJnua8Qxc5IoLtB/IsI8SIjgmgriaKoW1TKKOUBFciKkmI6YGy2Wy5f/8+X3//m/z5X/wFzhqMt/jgMdYhBAgkbdOglaK3Jr3BQ6S3PVIUGGtpu5aybBjMBNUCZY0gMgSHYEJZVdRlhR0G1rtdUjWIgrqeY53FWctsMkPVirbtaLsmzZO1YplXbOQGLyWyqGitwg5NcgYSET5pI+XnblduwxdHRfpfqa2fH9n/u8RV//d9fQ4aF2MeaiSQwknjOGpBhtctrohq5CePXS23lu3bbnZ8qIgR0BIDfKHg3v4/k5nBUmcDkyLDi8DVds3NdpUIUMS0kB3RkoMb0FoyPXvJJjr+g6bl2/ffZLacUsWMd5dLQtOy8S33pOAn22sOspL72vLD65dU2YT39JT/8vQpN1bxMO6xufyUprmiCRvulEuK+QJk5GFRc1eWDLam7h2HZy8J6wa5PmNlLZ2NXF9cYqzlIkaeouichzpjPqupl4dEmZFVOcobSger9ZZp8MjrnGy2h997wGdZyWEpqSYTjgtPMIJjDLmW7AmYWY8nUqiBKiie7LZUlPxRu+JhGfkDodgjGZuyXvBJ01FmBcd3H7H/4De4+tkrYgzcXdzn3fvv0V1dcvHpp4QAZT3jzhvHiOhp19eEvqWYLxj7R6SWTGYT2s5i+g4hIsv9fd4SirPzS66vr7m5POXHf75ldXXJd3/nu1xeXTOp5196z32pTjdGUJlAVxDkgHENTbsizyVqskCrlOigpSbGkOAoJiU3FEXBfD7lsNujNw197zBDy+Mn18ymC6qqhiAIIgnOBRoRPbNZSdP27HY7tk3D0A+vVQFSBGZVyXRSo7XG+4BWCjN0dG2L1BlCJUeUkjrpiaVAqWx0eCkIge12iw+Rb3zwHd566212uy3DkCLWi5HwtVmt04wZQdO2FEVBZ4YRQZlkRFqqxCRwgZ3fUk9n9MMGM3bpjrQUm04m9MOQmAZs6c2CelJz5/iIv/W3/3U++uQzLs5eEUVSKCghRsmewzlHjCnKPUaPAJTUKXVApG7TWstudYWcOaaTKaZvcLZHj9Ks5WyWFnzOs9ltsCEB48tqivOOXd9xdLCPQiazRt9SlYnmf1DPcMHT7Hb4kOLnB5sAN7dzf+Lt0Tnwmj7yurqOcSaM//5X6/Cv8fql0MIxGy2+julJPFcRAolAmCzoUd4GdMPnr/MWk5P+eznObePnT6L0u1+DcNKvy9CxW71i+vBdjNQMWhOFex113/tAEDAvcza9YeJaJmcXbJqep7s1H2nNV4/e4D9+9gu+ObvDj82Wvz474U+3p7RFwd8ul/zh+hV9zPhr2ZQXuxu2XYc2kqmDKw/T4NjvW8yQ9MTTZkUMCnH5ivVuS9sO9Fdrrq+usV2HHyzejovQ2weITK9eZ4pP64piUjM52uPg5Jj6+A6mKHFlQR4ycufpOsfaRfJaIaoaPznkWVYRdWBSKg7KGUJ6BJ5v5JZD7dnLHR2A6Fj1lp0vuPaKLZavlBP2igzlBMJovv7Nv8d/89EfUdiO9+9/k/3ZAaXM0V9R4AJ3vvoBeVWwPn3J+uI0LXnHU2mE16fkvtnRNS1KZuwd3yUrp/Qu4lxg8A63WrG5WZOrnEIXzMrJl95zXzJeSH+Y1SRjb69gNs9RZQRlcb7HuAKtMlTI8dZguTVPpDe3EJqyyDnYX2B8z263pjMdugh0doULPUVekmU1Ep04DcZjjE0MXpfevIMZiM4gyFL45Hjzt22DEIK2cylOvTcUdXrR1lnyIseHgHMBKcJrKZOPKXsszwvu3r9HXuRkQ3J22WGg6Tp2bZNsxsag8owoEsDdD4mgXxUVTdeRFQUxRsqyZLNeJWlbNyCUxHhLXeQEXeGFwI4PjqzMEdEzqWvyLKOuC5SSdENPVZWvH14xBowxCAQm2FG65LDWsJjN6LsWPxZ3o/sk3O52BGfRWhOCZ7fbEKLAIdFFTW5SKoVxBmM6ohBUZY1CMFjP4d4e1lvatqHru/SgEop5MUHojHZoac0w1tkIzuOM+QI4Bj53EYwfi9t/Bj4PDPyXpuyOwJTx4/SPEYDjQYxAmFtbrxgHJnGcXUtJIIxT3yTsizEQRPo96b/5AnXsdfUFQUBJR9dd8v0Xz4m9g2EgeoMmkitNpmUa/RjHJMvQ3tPuGo58YLve8N7enGZ1icwL3EFLYxqudh2Zb1JaQ+E5aK9wQTBlS312TuxbDoKi2KyxTcMyRMrYk19dsdnd8GLXYXc9V5fXOBtA54lsV8wJxRzpHQwd0ZmU/mEDwTnwDmsC1li2N1tuXp1zPX3G9fEx9dE+1cE+i/0l9cEhqy7SApVX1MZQ9o5TY2llQJaaUC94Ts5OBKpKM62mZDU8i5aT0nKczdFl5FloecwOEe4wj4GDokJUkjcefEC5vM9hu+J3P/hX2d87pLtZYXerlFw+7MimNUpJLl4+Z7k8pChrAKTW5PWUEEAVBcuqwlpLNZkyXx5weHKXi9MzijJnc33NrE8BsPPJdByr/errS2zAEZXDZJazXE7Y36+YzXOmexOW0yWZqLAuYJ2hbXfkOsc4Q9e3I79AJ/uuzijLjMFnoD0+SJQqgAyCxrrULbbdQAwCY9NCLcsLlJRoIn2zJQaPHRKYvAkeHwKm77DWQPQIKdlfLlmtNwidOFAheCKCvu+QOiPLMpq2TV2xVCitqKqM6/P0daazaUqacB5XJlJT8ImHUJVVArpkOX3fE30ky7JkDviCHtg4ixKaUiiE0mS6wJgenamUdDHiE1c3KyKRly9fsdmsidGPryVt9gUihVcKyTD0ZEpizAB4BBlVWUCMeG9xdiC4Aj2ZMpgu6XytQUhFWc5ASrw1yTqcaVrTQ3RgBrIsR2cFvTFse818Nmez3dG0DcImy2okyaJ0XhC9S0kXzqF9pJQSa1zq/mQcifq3qau3ReavEJ8CnxelX+P1OSTt8xnsbT5BEJ7bGBYh5OvJtAgxuR0jIzUrwX/CF3K4IiNtTdzacz+/xBdmvSkkb0cYtpTVCTqAsBLjB/rBjCwHRak1nTVEF5kVJbumpcoU2SpgLge+tdinOb/ivbxgr9zx2bDmTjUjZpfUmwsKIcl0zd7pS0o/UIoMdjvk9pKmtzzvHZcXF2zalhg1kgy7uAN5Ri5zYlHggoEQ0NFTW0vb9/i+xfctOIscElEuJSEnvsR2u2O725G9eMnhnSPCozcRjWFVlqhJReYnZEGzNVs23iEzyTSWFL7jqr9GyMhMw/50jyu55iYMxLqgmJ1wXUSa3LE/VWTS8cwXnNJypAJ7ewsO7n2T+csfUWUFw26HdRZVlezOznj54c+5KJ+wurriFz/5CW+/8xV0pnB1TV5URJVRzubkMzDdwESNrktjcN5RTiuef/QRu92GB2885F5wnL588cvmmH/O9aWOtDwTVJVmNitYLGrmswl7e3uc7N9Bi5q2dbTdlqFrXhdAF6EoCm7xakoKpvUUlQtctBgbsX2JNRnd0NF1G/rB0nfdeJwPaKGJSuKDQ4qI8w4RAirPQESaNs0dtZDIUZ5TTaZAImRlWcau7ZJX3ju6YaCUKfU2AakT4Pzs/JSXp+dkRYYfBvrd5nWY5L17Dzg7OxuP5Q5nky650JpsnJFO65LBpDdXVVdIneMj1HWdEhfQFGVBWeQ0TUuz2XD37h3W2y3zSYXxlpvVGu9H5YP1KV05BpAS4QMmetquZVKWo4IhMVnryZRMK3IlURK8M3TtDiWgNxbjDZnKkSojz3MCkTwvMNaQS0VvBwafHlZCauqRL0xw1EVB1zap046BQim8FJghoHVOFiLB2tFi7dBC4G8ts1KO6c7wutDejhxCQIWEFPzlRIVfz3XrJAPSzHa0kkeSsy5ya5YIIElJGSEiPESZeOdy/BqBz7W5EY8Q8XX3e3uJ/y//IoSjWX9EMT/meuuJw4COnlwoRAwMw4ALPuX4SUnT7ABBKTPW12smWiLcil27pSozrtDUpmFSVNxEzbDbEqTgQmZ0mzXeG7ZRYrctu80NuIhWJbY+Rs8Tm9mojCAUOTATmoZImdfU3rOLhlZZfF4ipjP0YHCmJ/Q9wg7Q7RBu4DYHTiqJc4HTVy/pZU43PSJ2a/ZtzwGCzgquEcRCMmHCTIM3FiEVe7kik1Bax7VpkViKoUI0lk/dc1bLCSeHd5jLyKdix03TsMyWBFly/857yKunXD17gSkajh99hTe/+gj7lsFFSbe6Yj2eZq9ePufw6JDFwRFRSGxvyKdz9OgLkEoiEXjv6DY7ri8vePHqlD/7kz/lN77zHeo8Y29/STX5FxwvQEQJRZYpijKnqiqqqmIynTBfLqmzJWaAq+tzrvqWttliXUCX9WsNa4yKTEnKqgbjGKxmtzW0O8utZzx4x267oW1bhEikr6JMTITBCIwzzKeTFHOuNFEEnEkPBSXS3KwoCkqtEMFTFgVxzOsarE2ErBhxxtCbnlwrlBR07ZbPPvmUNx6+QbvZ0PctXdtxefoyzS37jkIJRF6QaY0xPWVWUNUV3jpO7p4g8wKpHUpp0rhYkGcKIRRlnmGdo2sbrLU8+fQTiqJgubfP0fExz5+/ZHFwyPe/9wOGYUiW4OBv3eJkQuK8xVqbZGwhUOaaTAq8czhnyLIalWkCCXa+221QMrEpIiC0SA/ErqXvWrTWY3CmwwVH2w8gFVlZj5IykZyESpJlGmf6xMdwlqgiSmfUxHSUHIuQHOfPSEXUkjjaqyPx864ujh0iqUip8OsvuOmS42LrFuM44gDDOAqQ8FrDKwRB+DSvDeo1SNvLiJQBH2X6OtGPI4WYPBMiLengFj0zKhxee1Qlvrti+/zPme29jcgOaNY3bPoGbw1agBJgbD9yM5J78WaTkrBVUXC+ukrJ1K3j2nSJUaIHzo2hHXoymUA8XdOCd+xUhpQFy8O3mU4XbF1kZwZyZ8mspSOio0DqyEak8VTIMvZnM/CBo6LGmI5z12CMQzqP6na4dkuYzZF9B9aAHYjRE4WBIFmdPcNlGW/8zX+DOKlYu4F106CVYCEnlIUgOI8vFIuypNAZlcxo7UCe55yokoXK02nVDsxiz77MuXQZ2xLuzuZsEDwJWx7sH/PNv/Fvc3dyjDWBarlkcXwPKVIiuFnuU+8fYIeBVx9/ineRrKxQeUk3DFiT9PdCCprNBmstSiraZsuf/OEf8otPPqMY8QRlkaO1Ji++pKTy30GnKyToLMmY6nLCpJpR5BV5XlJXM6oqLXTaZsdms8Y4NyZAaLRKXnupMqL1SLHH0G+RMZBnin4wtG3HetfgvWdSVeOyK0sFPs+TJEbUr7WOInp2ux1VUTKtazItabsW5yxCRPq+wTgHMsO6pB22pk+FyFnW6xXz6ZRMa7abLR9++AsevfU2jx7e5+byEqQgqyY8ffIYpU45OT6ins1RWYYSgroomFQlLk++/c3VNW3bppSGQrPb9jhnsdZgjOHs/Iy2aajqGfdOTvjGN7+FyjKurq5Y7O9z58EDpovZ6MkXY4coUSTb6XqzGjWvHmcHmuBRIlLojMxHfBC4qChksqDmWcZgDFmWYUa9dDYGblrvkHa05pYVw2DItafrWvKiHheSQEhLuyzLRu10TAYI5/BhwMnA3qRCKIhZQ7QpJbdF0IqEIbw9qsex2ogQkN6jrEMBmfDIf0ki2BMS8XbBF5FBvjbtvxZgxPj6r7T0/WIW2vj5MbvrVvVz2+lLeZvvdft7bz/+4pw30nendMMV9fH7lIcPMOeXRHdDNwz0Q4d3nmwcc7SDwQUSrD8YpPPMtEZ7SR0ylJQpRD4GJmTkUYMQzOdT5osTZgcHzKdzms0Nl9sbht0W4S0DHq8iCEWVl9B1BK0o8wK05nnwSBk50ZJ3732V4vKK62bNttsQsgyhC6SzME33rOx2uGYNpgfviN6xe/mCj/7xf8Z7//Y/oPyN32XV3rA8e8HMtHgpmZc1ZZWjhCCXqehVVUkpUiKwcwEnJfOqZKIVZbPhs+0N+d6SE1nzqtggtGQ/K9nLCoa2p2t6jnWBKnIkAe09sshwZUU1W3C13nL6/IK94/tMDnO0Lggh3bfESN809EOP0skUtVwuWa9WvPvGu3zwnW+x2Jvw+MOf8k//5C/4t/69//WvvOe+VKcrlSLPS2bTJfPZIWU5R5ER/BiZLpN3fDJbkt1c0pn16/8+8UlNgpFbSWcceTah7yUuDOx2A6vVjq7rmNYTqqLAWkMIjq5tcUNPJuHocJ+qrhPTwfZcFxk36w1d37PeGtwwMJvVKJXRdT3Oj5HaPrw+3EUpiT7Qd0lT68ZAzel0SlEWvPv1r3Hnzgl/8of/hMVizsnvfJdXLy94+uQx69VPEzS8rtlfzNBSstlu2O52rLe78U2YijCCJONqO0Cyv3/E+x98i6+8+xVm8wnX19d0/cDR8TFvvvM2n3z2bJwNF5SFxRjojUGQEoHNkObVUmm8NZRC4gEnI9YnDGTXG7SqX8NnUupykhwNbsC7niAUNkSCG7DeUVZT8rLGeIvynr5rUEozneb0g0FLUDJLJhMREB6Uc5Q4tI5UKrKcV6hZTgwepzRbF7joDBvjb1OwklFDiPQanCPXiqkIVCKOqMFf7xVDkgJ+UeIWEK9HVilJNi0Ib40TUoyt8G1hTjHWI7diJH6NLe1toSaOyoXIGJ742ksxys9yZF6z3LvP/sEdjo8ekX37r/OLzz6jefEpu8sz+t0WNdqJZ1VGpnOm0ylSJ6OKzIoxlSLhSoWQ2ChxKiNWM3ReYJ0j6prTzYar63MWMRCFZC+rKQfHhTEEoRDOsptM8PmMIHIO6op9FxBlRjSGs+01f9quiT4yUZq9suBytyPWU2QU5N4wDA1+tiSbzhFDg+9bYrslDD1mfcNP/pP/K4t2xfaD7xD371A2V8xtxwfe8D6aLIIWkmmZUkokis5Y2hDYqyfJjB3gxvTE6Njb7bD6Gj8pOZotWG2uWcfIspyyd3SHoqxStFIMENN+aGgb1jfXPH32lDqvuPfWI/L5nLyaJGPPGJpgjUFJxXw+Z7eDkzsnfPvr7/HeV9/n8N4dvE+nkK7vvvSe+9VFV6RuZz7bZ1bvU2ULclkRvaRvB3LRkuXpxsx10n12XYcP6egbraXrBvreEqOkyCvW6y39MLAZYTLeOQ73D3E+HcOJgTxX7M8X1PWEST3BWsOuablZXbNarzHDgLdDmq1KQT6p0pHZebyzWB/ZNQ1FlWRlhNGCqdJTcrvdJLF5mUEMmN7w8sUps7rgzXfe5NWLV2w3Ow4P93nj0dvsdjsef/IJn3zyEZ989CFd09INHf2o2dUqcWyLvGC+2OP+vQf81m+8wztvf4XpcsF2t+Hy+oxnL9LM+r1vvM9bb7/Lrml59fIFP/jhX7DdbNJr1xrlAqhA03bjQsKiQ0zzXZuSelWeY30aKYQsYJzHBkE+AoLyXGPskNI2hKDbbRmcT3CeEJCqJ4RAnlV0Q0JfWmcTaTM9bhF4JnUJAygnEU5Q6QqyQJVHjiY506pAKEUf4LpzyG1Dd7kiuHFxJkf4SxBoBNM642iSMSsVVfbrj+sRr7vtEd0ox2QRcatY+Dy6O4VJpllukoGNUTGCMRom8RnG2ppsz/ELs+uxsAtB+vpaocp9Dg7f4WD5kLtHb3F4/CZVvUAIyVUz8NWvHfLq3ntcXt/Q7a6Ruyv2hKcHOmdZljnLyYRd12L7nv35DKlrrpqWVdfTRU0+P6BznuH6nJvdhpYNcbfF+IYmOrquIViDUhJVTdjTJVnXcrNrkGVNCD3XKnITPNJGltWEOycPOd11tK5jg6PSEya6xniPUWCtg6xESIEXgSossTcXkJeIriOajjBY1v+v/xw5dIT33qeRsBssZ8OKP7x4SYXh3eWUr072eGeyx8F0RpVn5HlG8JHeGno8pVQsVQbOc3X5gn19j3vlgvnxe9zNLXuzmhgUeZWKrvDJAr+7vuby8pyuaZjPFzhnaTY7Zm2fOvZRtd02Kew2ywsQkuA8cbB87avvsH+YuAw+eHbbHX3bf+k996UQ87KsqPOKXI3fRBBYE9htWtwARTUkj70IlOWEup4zDB1Dn1xMTdfjY8rw2jVpI97sthQ5LGY1oUpbQW89mRRkOmO52KMoJyAU66aj7xqub64Y2i3BOZzpE3RFSxSC6Rib3nUJMNMPlqZtkVmOlpJcSZK3QRMwbJoGrRUH+weUVcVHn37MdD7ha1/7Csd37yJ0xtPHT1htNlxf33B8dMLv/e2/xe//G7+PGUz6IbQt6/WKEAJ1PaEqqxSxXtYIKdltVrSbaz76+Y/Zdg3z+ZK9w0PKomS+2B+3ug3Pnz1laBuGrmEySWYFSHlou6ZFCUWIFucGtNIM1qFznbpqUhCosYY8z7EIBhfpjcGHmLJ0kKM5zGNMj5A6xasjybUiAkVRst6sRxSmZjKZ0I96ZKUkRVZgMcmNZh1FJtmrJhwsag72ZqhcsR0satNhpOS8aTDbnijka8OAjJBrwf685u7BjP15xbz69RfdmKJJ0jx3TE+4xSPcTl8T0AZem3lvs8fGZhc+192K12qH9PvHz46SOYHQBeX0mJM773Hn5G0OD95gsbhDpiuEULRuYN1bNsZxNQS2IXITFU21wFVzxN4xJofOeZoouDAD/c0VYuOQUVLsNDYE5Laja3Z0RcFktaXPNbkS+KIg367QdodwKfjxuJhx1p6yFTBIwQ5HVpdoUaBUyRt1zdnZK0xW0yvF1WDZxg3V5IilXHC9vmSnKmShWRYF6+sr/GRKnEtqCV1zQ+8C4mgKpkV4h2g3uPU5YbMh/Df/iCpa+ve/SpxXBGMZYkkv4C/aNd+/vuYrxZT/0YN3eGexT6YFWZajNExQBBdw1hFRvHPvbQ6Wx0ityPqesshRMuUtZnk+GgsTonZoW0SI3Lt3n3lRM3Q9zWbL1dkVSzLKmSTK0egkFVIKrDXpPTObol3BbtdwfvaC1c2K7WbH7F90kSZEit9WagSVBwgWjHc4ERhag97tqOoahKLICyaTOSGShusyQ8gC7wPtKAkTQrC3V2Osw1iBJqU65ALINJPJlOlin8EY2mbLMAwMQ4cZOiIC48NofEjQ88O9OYOLXN1cE0lHgW3TYJ1nGAzCO6rlAiUExiUG8K5p8QEQkovzM4Zh4L/6R+dUVcnJ0TFVXfPGoze4urjk+dOnPHnyMZ9+8jNypdnfP6SYzMjrmsX+XuJLGMt2u+L64hWbzYZVs0uJv0pSTebMFkt0VTGdzdhtdjRNg3OOFy9fcnl1TV1XSVWhNINJ/OJu6CHGkXLWpqXhKGsKIRKDR4s0e3Qx0vQDZR0gOiIS5yxSaYIcOzWpyFXOYA1RKYwz5FkNUpKFhHlsmw0qS9CiuqwSuMinxAchEsIw2IAbUvqBVJos1+RFiUORF54itxR6jLaJ7nVViiFQFprFfMLR4YKj/QnzSf3fvTr+93R5nzpUKQQiiM+/3yhG1nLq1lN7K8Z7zMOomrldForb7ncszMmhJ5MsTlbU+3d4+OAD3nrzOxwfPWI+OcSN38PgHL0X9M6zHXqEFLTGsusNaxPYbm4QZofZbtldvOCTi1esrSFO93Cq4rCz1FlGXxbYyw2hKCHXzJdzpt7wIKt5uWs5u17jzl7QdxvsdEIIkUoqFvsPeDibjBJBwcXmhk2UmKImaM1L68kOjplnigPvebW6opcTjNkxLXLmQrH2A15Hdr2nqGssYJXEqpx8WWD6DkSG7je4ZoXMlggZoSiJuw3ue99H7k2JX3mLqAvYWUQLWIXy6c/z5W7Dsqg4nNRoEZlkWYq1mkyZTQ+YTPbIVUZQiugD1XxKJhvaZkc52UdIgbOG0A+EALKsyLxnryhYzOesLlc8f/yCcHaJKmtCpgkENustrm9QPThvOH/2govzc3z0XJ++ZLAd282WN998gyL/F7QBpxFXHJ1Q6SYKAaIPxOiILsm5vDNJvpQpqqpMVl3hCVGTEwjCoF1PXQiKomRwA2dnA8FFTLdDhIALjrIssRF0UeBDAtp0w4AxPUQwxhCDZ1JXlJnmYG9BiILV5oYsy9hutjRNm6JlYqTte0SR0fcdeZ6nbtCmqJkQI6ZPnIfV6pqynPD82XPefust1psNeVlwfHICQnBzc83zx0+4bi74+V/+gE3b0lvHtMhpxpyoXGtyrQlCstzb486DN6inU/KiQkrBdr2hyAqmsxmm71ivblivV3z44c8QwpONiaxmMHRdg86y0VfgCSGMDrTRKaVSmm9vDLMypUV0fc+2aZlOEvjDegdYqqqmtw6tC4Ty4EViXUid2MQidXFlUWGsZ+g7vA/kWY6SSSKjdArWCS4Bd5zx2MFiekPbW1AKaw3eufSXTwwHGQVBpFKkYpI8TeqC2WzCbDqjKn/9Eeze+7FojuSwmDrbcDtrhdHLMbrNYgSRuLjItPR8XWS57XLTHCEKwfzobX73t/8t3nnjWxwsD9FCMYTIzjlaE5DBsus6ghDgA93lOTfX13TNmub0BY+ffMTjx5+wajdQ1Mz3jtCLAyblFHt5hS8rLqf7lHsH7AXPYd+y2mzYygwTenb9NacSBg86Ro7mNSJTXERQWY7dXfLR2WeJ6aEL9ucL3jp4m9Vqy+AC59fnbAudjtux4ETnPKxmXLuGNjZswgQ9mTHPMjaXF5jFDJdXLPKM1eUZrpxSLvbJJYl5PdsnypwQDXoyx/U7xHqL3d3AX/yAyb0Zclqz8wOYSOk8d4qCd5aHlCrDktKEG+OYFCXTsmZ//yFBlngp+MuPHrMboCwl7x8oCtkxbFboYs4wGELTYJodIXqazYbrswvyomC6mCKznBCTfDLLUnqMs562bRk2a4osAym4OD/l8aefMnQdRSGxwbBrbvgnf/wJm92G/+3/7v/0K++5L9U3+JDA4X7MwIpBjJBsg3MDuRAIlSDcVVGTa0WWaQYfqKuK6XSO94HLy1dsVtd0fU/XCXY7S9c2ODOQqzRWqOuaqp5junZcODU0bYOzKXAx04rFdMJilv7adkMSaHvHepMWcoNNGWQoSXSWqAVDP6SOXaeEYiUEzgd6m1gMmcpYXV/R7Dacnp4hhGC1uubm5pq6qhiMoZ5NKCYVXkB/fs75i+fstglIE0mR7Y/eeovF/iF929IPPTYEysqxmC8IPiQFgXVUteT6ZoX3ntlsxtX5K1Rd4QMMJpHAfAw4n7LpQvAj7T/BViAtY8LIeNBZQZml4EqpBJOiwpGSPuhbHJLlwSH9kEYULnoGMyT7ttaJvCYkeZFjjMGZDmM6yrrGDoau76jqCWVe0JsUWdJ0lvObFQ7HdJgxBM+m61nvGtouJQ24LxYqItH7MUIljUWGLwcy/fd+heBH62cgRgU+/fkKkey+6TeRRhCCpEqQach7C/cR8vO5b7oEMUoWi/v8wd/4ByyXDwh9z6tX54nt4Qx972iuVzw+/xRrAmFoybzg8ZNP2DYrtqsNzeoS53tkFIg8J+qMJnr0MCCl5qia4HuDN5e4l0+5KhXn9QwtQDvL/nSJmh7wYnMFfQ/dlpeTKi3KlGI5KTguTrhqN4hqSdCaq3bL2XZNJGM2nXLfT7herdjljhB6XhYJ2nR4dIewW7NF4vMSU84o7xb0bkfMNH1eM330Fruuw0RHuVhgdi1BVsjJArob1NAghCZmc6IuiNtL5j/8FPnb77NrLKofKLzhaDJP9245pdQFKsuZFhlVOcPqOT8/7ZkvM27anlUsyaYZV03D01fnmOGCQuUs74GxA+31Dduba3Rdcv7ylCc//QVvfuUrLI9PWBxpDlcdqp4wnU2pZhNC01KWNb7vyIsshXRqzXQxgTDw3nvv8PjpZ3z/Lz5h07b4f1FH2vjcJvjI0Bka2dHnBu87+n6XMp6yjKHTQAK5aJWjtGY6y5gtD5hUM+xgsWag2ba0g2N107Dbbl9bB73UTOspVT0lArvdjma3wRmLcw7jLCIGFrM5Rwf75FnGatvQdgNaSbp+oO16nEvW4YhAS4USoFUqVkpndF2yvRZ5xjBYnLFM6xohIpNJTd/3PH78GVVZsr9cMpRVmt/udggh6LuOwVoOjk9AyvE1bdOWOARsSBSqzXaD95HZfI41HucC+weHRB9YLJf0g2Wz3XJzdcW0rrmK8XUUknXJ9quFZjsYhn6EIt8yDmQaHeRZ8TqtwAwDRVXjSQ9HF9OfgQ2OEJKl+PLyirIo6YEsWkywtF1HlhcEH5nVFYtJpJWCXdclTW+WpDO79oZ+6KjqKVoqnPXsnGO923B2dcl0PkPlOa0LXG1bhj5J9WK4hX4nMdXQG7brhlWtsUOb6Gu/5ivEAMGP4xOV3Gi3fIUvGCdeJ/+qdPKT8lZxGyDc4ivTJaIiKyreefNv8tOPT/HyFb1xxCDZ7Qae2Y62HziuKsqu57Td0vcbsiAojGV7dsEgAjHPwUZkljGpa0ResdAVze6Gpl/TZim5ei8rKboNlzuLK1tcXpDFwHOXRlxonYJXt2u2Z5eYeg71lMDAej5PVtfJjOOipPvFK7ZZRixytt2WrlCUb77Bicw5e/kRXmqcitzs1hwdH6O6hrUUNJOayfSI4uWHtHlGO51xNMlouyf4eo9hsqCqW3oTkUoQzRqnM4IWxDJD6gxdlnQvV7gPHyMXJfeKklwq9vKa+/MD0rlIIoRCZlPE7D5PL7dsrm84e3XORgma7Qp7ccVs/4CZvEYOlzx48A66rMiyAqk1SMnu6ppXz56yWt3wSCuq2ZTZfI43gZv1Fh8C1hr63RZrB4pphes6rl9ecn72ima7wQfDfDnl3eIdzi+2fPzpp7x89eJL77kvmemmWe7QDWw2O/ARnQlcGNLIQCa8nXMDsQuE6KknS7SSTGcz5oslmSowysAVbFvHarVlNaYyVGVB23ryrGRaTxkGR9u1mCF1r8YZrHMQApO6QijNrhswmzYNt5UcM61GuRYiRUJrjRotvj6kpFczmGTPRaB0RlFofPAEH5iOcrTNes3Zq1NO7pww/fZ3uHv/Ps+fPmWxWLBerWi6pCfe7W7GYMicsq5RUnCzXjMMHW3bpFmy2LHcWyZ8pDFE76mnE7bbLT/68Y/QRcn65gYpoChLCGCswfR9io0XJqXtjkCREGPavIoUXu5GK6p1EaRD9D1CRDb9gNpLTj6lNP1gUUoy9C1ST0FpVCZRAUJwOGvQUtJZyyRPMPg8QNc15GVNXU3I85KubWibBiUVw+AQUnF1vaXvdjj1gnw6IaicXYyYkGa4t7SxGMHHSNsOvHp1TjAtdalx/tcPMSeIhCYNyeIrZUCE0dIr1eti+xr/KFLBDSEpFtJ75JbHe8te8OwvHoFYsNltcQouzlt67VBdgsW00fFkc8mbkwnaR4bzCy5Mj7ctOpeIrqfYNnSlpA8RszVk2Yb9ySP2JhNod3TDBm8sF1VBNp+T64rDvODudMnN1SXPLy9xeU6c1Fxmivm9+0yFoPKKPeDTm5dszBpdzmi9IRQFByd3mJhIu77kOot4VWJ0T1xW3Hn0Ho1vWdmOYVLzynoe3H+EHRxNFhlU5OFv/DY3py9YK822mrD/3vtcrncEnZNNFcOLC0I9Q+8fYc2AaHviYKGo0VWO3K4pbzrKWc69vORodoAMEu8sVZ7T9i3brKIPkvOfPOFlFBjpCTc77j84pnA9w3QOwaJcS5GVHNy5QzWbopQkKwuUErx68oRPP/mYWT1lvpecZPnYgDRdT9M0DDi2q2tEDFSTmnWz5tnTJzx+8in9bsXJ4R5D37JcLPid3/lr/Gu///f46c9+8qW33K8sukqQ5BW9pWt6MqUpkERhidrhpQSd4k2MMVgfiFFS1VOKIicTwGhmOL9csdm0dG3S1CkRk0wpeParikwLmrbDDD3D0OGDZ3AOYy2Zkqgspx08N+trlEp6yEylN24+Rqoba5IGUgiUFEmzah15VeGsJXiXlnA6GR2sT2OLsqqw/cDPf/ozDg4PaD9t2N874PjeHbSSnNw5Zr1eUeQlwTrOz89xPrlTgguUVYEQEmcdN+s11lkqOWHX7hBCs39wSFWVXFxeIoXkxbOnGDPQNTu0UtRFwbZJzh5rB0QEJctUaIHbBc6tpVnKHCVIYx5nUEphokFpibWebbOlyPNx657RdDuqoqBvGrJiQoyWoijwQeNDIHqLM9AL8N4hCWR5Qd/tyMZYHqMVzpqUzTZu45VQDL2jNwOrTYeoaqgKQqaJpJ/R6/198PSd53zo2axWaBHxxv3zbr3/Aa8k+wpRvHbOKW4jfNLnX3e5Am6jgoUYTQ+EUcMrkPLWgSfJ1YyPP/6IItecrm+Yl0tunj1lpyR75YQ7zvNye8MvLgIZkaW0NO2awVucCwibopkKoAjytcb3bHUBOiNTOUezOWzWPN9tkuSyqmnFjqbt2D8+4cHeHkpkqMHyUey49oJMZjRKIoeWo85QrBv8dGA7qXkca4SqyOqS49mbhPMLttlAyAIrIttqwuHeXeanT9hmmpDnvOwd94/nmGef4hYHbLzgjb05P9ruGHRBsZxThYG2nBKLktJ7+sFSnRzgzi8QeYFa7cjMwELnTBdLBtux7ycsdcFeVlDrkhAck1yzPzvAFYf89GYgoCkKhbcBYxv86iKFzgbHQimO6ilHB0uWd+9QVAXeOvCebtfw9LOnvDq/5M637lNOysR4yTPq2YR6UnJ+fs6UPYqyIAsaYqAZWi62F7TlwPmrU/b2JlxfXXN+ec0//kf/Fe997QN+7+/+3S+9476UvRBCwBqH6Q2utmRokA4YUuelEy80uIi3A34X8UJQ9QNa9jSt5fGzF1xe3UCwCcHYD6jgIViKLCXNnl9esmt76lxhrWXTtJhhoMoV08kcIRTOdCiZEoEjSeQ8DAlfGMcM1zTrdBR5iYiCLFMJ0BJTEZA6QhytwlEkWhQJUNL2O+KlR6uMi/NTPvz4F7z7zjvcuX+X/f092qYhliWL6ZTL6yuyvMIFi/eesiyoyop+sHiXZrCz6ZLF/t6YNOxo24bHn35G3/dsNtcEH1FSMJvNcZs1w9AzmKTwSI2uR8Rbi22SX0mdpCsxpuVaFGDGwpurHCEiXbNDiCkCS15OEDGBc7CGGBUyy/DRUxQlfd8jlEQqhYiRTOnRoBIJHjbbFUVRIiLorMRbO84wI/v7J1xeX+GjQ8oioSZjfM0uuHV43bq6/Bh02ZqeaA3R/fo73fhXPooxEKL4XEQ/LsSSlTdxGVJHzOvuN35hdh0jCKVZXe+4vrpgVhWsr9dc84KoFG0/MIhzjhZ7VFqh2w7rLZchoOdTpl2P7hvW1tLlGq0ztJIcZTVd17FtdpBpZFFzFQPZZMZk/wjdG0rn2RG4WU7ojEFqzVx4lrs1s8tXdHlJNquJQ8/L+Zz8zfsUWcXdYoZ7/FNsGxF7NU4JznQkf/Q2x0TOH/8YHyJiX7JuJIs3vsKd1QterJ7j1ANCn3Nvf8Fzs+W69bzxxtscqS2XlWNbR37r4CH/rOmwWcVhdszL8xWmmiCvb/BZhTAWqyPrwTEpCma2oNhYDu/UqAjzPONwskddFFi1x0tf0QaLefmck4kmMw4dGq4/ecpalzQXa777r/4WVVWwf+eEvK4TJtWYlJ7cDaw3SV4qtWIwPe1ui5AQZEBm0FxfUkxzJnvLtLRutlxvVlx0p9ja8e5vfkDzvMG4kre+/jXm3/sJH374M77727/7pffcl6YBO+voup7eDoRQIYTAxwElQyq4OoE9VMjBJVuqMZa+7fA2cHW94/z8DBmSCLvpOoZhQIQEqzla1OyGgYubFVVRcLPdsdlt6duWXGnKYkYQMm3VXaKPhRipqppd25IJsHYghIAPyUWVLEIR6yx1meNHmY/WEiUFIniyIiMWIzyn2SXso5QpjaEu+bN/9mcMw0CMgd1uy717d5nUJXmmuNaKO3fu4HziRkwmEy4vL5kvFsTtjpOTY4JLyRAyLzh/dZqOYG3D5fkpN6sbjk9OeHV6SlWWyUUUA9b0iakgzevCx+jmEviksSXRzCAQnCUryteWWz9aFqM3NLvtCC5vESqlZIQoMW5LnS1TQbeWPMsJ3oyOuoCxFi01IVhc8Ay9S59zHi8gz4r0dcyAkIK79x5yev6coBROSWwMaTl1uzy77XVDHFkFIR3NPwd4/ZqvdIoQpAfJaxbaOJaChH6MyJGMlrTqUccxuBJuHWi3IZdKZ9STQ4gdLzdXzBd7nBuDK0sezGDb7jhzA1oo3lweslrfcNGsCAE0AYxBh0gYBqJzOB84mwTy6ZRa1Uyzilk55dN+Q5MlZ18xqZk7T3H+Cms63N4hGYGrrmM1XyAfvsFMZEy3K876lmF/gXWeXe6xwlC++3VqqQirS85FjxcVViuyacWDD34TE+Dy8jFuEOyqJe/s3aPpNrRhy4vW8duP7tE//wTDlHvDnJfbn3CgTvjAlzhzTVUGptNH/MbJG6yUxkXQB3sED5U6oNu1SQOsNUe5Yxg65jHnrZNDtBDUmcaKjJ+/vOayXXGz2TLVsDaBt5dTVmvLbrbHR23g7skDhE70P12WANi2xbY7XN+TZ4Jvfvs97t/fYzop2K5uEELR9R1CS/q+QSiBMQOy3ZFXJUIL+tBSTCf87e/8AW8cvsF/8h//R3z0yce8/f57/L1/53/Cf/of/t+5vNx+6R33peoF5xLf1ntPwBNiSnZVWQLahNFvrnREyRxrA1KkOW/X9ZydXxCsIXjHZrvDDIa+a5AxouuK3gbOrm8QMdJ7R9O1aKDISqq6JkjF0Pc02w1Spkyw6XRKiIHoLE5L+q4jSgVKE28h5ELgRwi7eG3BFLRt8k+rLAHNnXM0TctiuWQxnXNurljfrMdodcnpqzP29/b56KOPePDwPqYfuF7dMKknrDcJN6mznPl8QZYVFFkCc0wP0nLpxauXfPr4Uwqdk5U5N6sbvLcMXUsxWjWbrsOMHbKIEWNTtpOSKa5cyMRqzXUxvqaYYsNjwFlDXk3GyG0gJvuvc56maShKR1mmmbUjcQZM25JXk8SrKGR6mCFwpO461ZwA4yJJkFQsxhkGO1AWFWVR09ueIq/Iqgm9+1yKEEOC23yhhCFCHBMXJFHrJLnyv0zg+nVc4nZW+9p2Nj4qhPilRVr8Qk8shGDcvyHVra53/PUoEaKkazuikgQHG2EwQ09vOnI5Yb7cZ7h6yWAdz9uGyWLBMlgwPTfe0s1miBgpvKUyhsb19GXBIJLsS+Wavbxkv+/Z9gNIi900vCgKsuMDiqxGDwPi9BWXJ8cE4RC2YVAZcVZRxiXeZsRcEczAWqfXoPOc+3v7LPsNbZ3jxcCq6bmpa46WNdWpZSe2lNHzamj54Lc+4Acf/TEqqzjuppj1GrMLbK4f82bb89lPv8+H2WMePTjgneUed9+6y8ODG+rC0sQj1GyLbzpkloMU5KVEjYGuLq+57AMfyEguHTYqfnph+Nn1jjKfcG9vSq4U56eP+WeXl1xdvmKIgmu95NuHMzanL+H+HlmuESEwdBuGZoPtepQKHJ4sKCqPDJroLH3bYIeegGd1eUEUlmAH1pcd5aQiiMiinvMP//7/Ch0if/SHf8jp6RUqdvyTf/Rf8Jt//W/w9//dv0/s1Zfec1+q043W46NDkKJ0pIxILcl1Ih35aDEBMhHJtKKQKS7cW0ez6zFdR5UpHp9dY4eBvu+wZkAKyLIl1+sNzhgyJXEhkEmN0hpdpCOds4aubbHWUhYZQSSCVj+GULphwAeQOsMOHURPpstkZ43gvEsyqxiIPrDrB4osUJaOosghU3R9ix0qnLdIKZhUJRGRjA431/zxn/4xe4sF9WRCUVWc3L1L9IHBWHSuWF9eM5nUVPUMHwNaK2J0DNbw/Nkz1jc3GDvgY6DIC5RQNE1DVmQorRm6lmHoCN5/Tqki4j0ooUblfYo9FzHNdQkOosS4Hik1skwjAoRMeMzg8SJiraDMa4SSuMGQ5wVD3xLEWGAjIFQqyKMeO/V1aeZNiAxSjeL/SLfdEqxjNl1QZAU9AzIv8MHgY0TElA92e+QWY7oAMVG3UqqHAKX+peDpJrUCCS42dq1RCnyMfwXKmB4hrxN9R+davOXvjjFFCQ2UE4DL1Q3Hy0N+3lyxnC+YNC2vJhk703O3mrMKWy61ZNd1zLRmYTNuwkAoCpARN4AZLEVVI3oLtUIqyW53w8fjz73OchaN43GZ4yfJ8DA4yzSDxf6SA+tpVUEIDSbLOZ8tkA/epJwtedMFPn3yl2Br1OEhynhOfUG+d8SjquKT858T8hmSHDm03Hn3PVzf8PTiF/DGHYTrWYqcqSn59MNTZt2Un3/0E546KNotWZFzciTYnZ5xFg27t0659wd/i+/eecipmOLye/z4fI2VGtG9SEkdYUtQEzIpuewsT8+eYnbPWHOXy+m3oJpRB0N/c8VPXr1ivbvkJmYoHdnLZry7zCi2L1DFgsXyAXlVELzB9hv6ZsVmtWV9vcKajn7YUugp1XQfNRL1tts1zWadnKDOgIB2s2VSV7xx9AarlxdMFzOePXvBbDLBGPjxhx/RdS1/7a//TR48+vqX3nNfQhkDH31aGmjQWURnEZUrdKaTrzo4fIh4AlEJCjVBjfOw3XaL1pKb1TrlwQeHHYa0fKonNIOh7Ycxrh1QMh2FY0AJhekahJC0fYeKEY9EC0XTdFjXE2IKs0RluBCwXUeRa/IspzM2Wf1MRCUjVyJdMS5EYiDXioCmbTsyldgJ08qhtOLmOqVAXF+eY50n+sDpy1ccHh1ztbomU2nGZ4xhtlhSFCVN21KXJW3f0VtLXnb0Q8JJOjdaaPMKmeVEIsPgqESGMQPRpUWfUJro/ec8WpmoUmGMp08ISYV3Ay64kQtsCD1kWqN0hoCEZXRuVD54vHHYoRsLRsDtNiids7GWST3BWQ8xgbcnVYUfC6d3hooyGTJ8T4gRNxgatuRFTlFW5DpLQKHXReiLYTbiC3IqCZlAoMbP/PolY+mhM34vQaQbxad/xltQwjiUvk01jiMm7HaGe9sZR1Kg5bTaQ/iKob+gPCrJLi3rYcVBvkBudjg/cNHvqMopehiIwbHb7nDTimo+I7+5wbdrWqWwi3nSUkvBQcxog+FKeaLtkCSaWL634P5guHQ9IZNYY9lk0MwLimrKo9kB5uPHfKw7/ABCS4T2XGrFyVd/AxktZ68+oZ1NiPkcOyiaCIdqyXZaouyK8/Oey/0Fv31c8eLmJe94zXG/TzALfvyDv6C5vmF2vWHfB967/yb333nEt7/5Dd557xuUWcazV8+4WW/Y/eWH3DkfmD16xPe05lkVUd6zzQq+VUS+PvTMl3soJJUP4FdsN1te+j3K0jK/uUR2F/zR6TUxm7LJFshqQs7AfrXgTogslOZ4Pmc2n6EleNNi+oZms+b0xSlXV9dst9fstg1f+9q3ubvYo5xMaDYB79JMX0qJj6C0IsbAfLbk6vQVJlgeP/2Mpy/PefL0KbPZhNOzFbtdy8XlJe+++3N+/3/2LxDBntJeI3kORSHRWTJC6Eynbo4wZglZovBkKh0TtALn3AglD1g3UOaSi6GnH4aELsyylElmhrQxFyBDUhZ4wLaJJeqtRQlBlMlF1lvL0HVoBUiNjxItJcPQpfeHSvwAIRwhCKIWqTDfHsuJSCFH1mlMqRa5JlOSSV0zDAN5kZHlGqUEzhisdzSbNbumYdM+5ulnj3nnnbew1rHcWyAKhY+By8tzqumEZy9eMTQN220zJhlHlFRkmUx4wywtxIZuwJiBtmmwzhDGtAghxHi090iVj1v0FPqZ5Rkg0Log2oFIRAHODsmaGxxlNUkLQiEQQo60N59sq84RAesMZfl5HhSElMXmHS5LiRQ6y9MD0VpCCGNBTYu7MVAcnRfUZYU0Dc6710yIyNjxSka3lkzULSlTt5tCx/5/KZP/f71uHw63TJrbB8EX84pTIvDt7x+zjOP4YIly5DF8/gixg0G4HYv5kifbFUdonhY1m7ri5PqK9eaK1cEeRimObcCsdlwsSqzUxGA5OTgiuJ6WQPAGj8fqDF9XzLMpoVsTQqQPsDUDH8oVZV5wf3aMuN7xGRuMVCm12XZc9StOHr3F0dUrOuEI2tKtzjgr5shu4M29ffZiRtNsyUsojGO7seTTgm/s7/GXT79PPJqyPy+Ydpb7jcQ8ueC//uFT/tajr6GfvkA+ecVsVvOdb3yNb37jGzx8cJ8Hj97CBYMdDMezOXOVM51UNLuG/NVjTnzk9ydT8jsPkW/e50BnHLjfZDopUBJmyz2csfzgo2f8H/7xH3L2F3/MbzxY8kRIWufJ7BaCo2o37N+7z9GwYonl/sk+b7x9j6ou8KbH7tb0zZbN6oZnT55wtd5gvWMx3ef4/kMOju+QFUUaaxhHpnNChCAl3qd4q+XRESpXvHz8FOsjD+7cY1rVdH3D4f6cz5485kcffsZPPn3C//5L7rlf3ekqQVFpqlqTV5KsFGS5Is81Ut7OTAVRBJSSlOWEMqshZtjeIESg63vqssANDus8gQTGcd7T9W2ypAqBHeeAOgq6Zpc29jEtCRKkRdH3Hd6lAipkmWaEUmK9S8sbrZLUzBps8COQO0XlBB/w40bdhUDfD2RaUVWSSVXivUmZSDLFm7sYyZXCFQLTOlSmuTw/5eXpGdY6JpNETNs/2Gc6m+JMT9sNvDo/Z71as91sWK3XKbo9OLI8Z1LVuBjQMeBtmpt2XZPUDUMyRYhEvR7nibdzc/9aqRBHB9QtI8EFB0oS7KiaCB4jJOV0npINiCmtQY+6ZGfT7DuM9FfvGUyKi49jZ+2cR8qQlpNEBjOQ1zUxOJRUSUNth9QFNjtmkymF3jKMuMw4do5Rjl1uEK/XVaj06ygJ8suBz/+DXLeEG3H7wPj8En/1o8jrznc8P/H6E+MvRRlpTENWTmluztkrphTrNV0cmBeaHAGbG/qqZBMli8mEcrVhmGqE0GyGgcnBAQfG0zc3qEnGWkReeYuKgZPZHvPdwDNa2hw8HhMM0nW8fXjE3goufYMsAtH2nO8C52LHfF5wz0o+++wxfl5DtOiiRq0lk6MFR/sL1mcXPLVb7HxBlkfuNBcU/Q0TbdmzCz6zgXuLR3zvR/81WYh875NP6J+csa8Fd/dnDH3Lj378fT799Bcc/uSQYjLl/a99g6HpCMFx6gNCqJSkMvQonbG/WaX3SlWxnkz41re+gxksn/z8OV3b848/vmQjSvqjEz7tLT+4biCr6a0hHNwhUxO+cXTM/e6Ce3Lg29/6Osf375Bl0K6vGLZrumbHbrPl+vqKs6sVOqt4eP+AveMTyukMIQWTxRylNeubFd3QY70nUGL6nvOXT9G64PLikq7dkmWCw8MFUS55+eols9mMXdNwvVp96e32q3W6uaSa5tTTkrLOycuMolDoLHWKMYVhoaIiL0pmswV1vsA7Rd/doLOUEFzkY1R42yOQlHkiv8cQUEqPfn2Hkpqu3ybvfhxTWPMsRco4i/eB6AxZOSUKnbovEdIsl8TejD5iZSpSZGlu6ULEOEcMfrT9ajKdMfQGrRVVVWH7HsYgQOMspdbEsmRoWiKStm3RKqVHDF3PJx99xMHhIZ9+9CGL5QLrHbumBc8oN4o0uy1KjdyCEHEhoRV7Y4nO4Z3H2B5n/eia02l+O27OI3JkA4ysLiEIPlAVVVqa+YAIHhVT9x68I0Q3duc2xYVHj/cOoXX6OlqhpMQrgTMDkpQkLERKo4g+oKQkUxIpk/vHh4AzyUTho0MplZjFwac8OWs5nu3RB0tvhtdSqnR3jEkMt78gJVHI2xL8a78if3V2+8+/fvn7VXwR7Zi+VgJitm1PzGYp/UDnXNWKh/kdrnZrzpXi6K13mV5c0mi41hIv4GBRIy9XXEnPusxohKCYVTysS/pmy8obApogJWtsssO3kr7bEKYK7WG3veHnZUe1v+Stvmb98innc01QEYopfaFQywVv1DPWrseFjl2z4pN+RTRzjpTh0XLK44s/pw4TTuQ97mT3ODr+FleXF/zs1Y/wQ0/QObN1w/b5OVetZV5lHO3NQESMMUwmNUTo+47Tiwt+8fNf8MH7H1Bmiq7teOONt7nZrOm6gZcX5/CXP+bh/TdQSnKwv+C/+E8+5qMPPyEEh5rv8dnkTfTefZazkvPrCxbHR9TVhO3umreLigc68LbYssgMbx3vc3CyRzWpGZobzHaNsyYBucqavb19Tq/WTCdzHj56xHRvLy3lB0+Mkno6S3r5kUuyWt3QrFd89pMfM13ucXhyyP/jH/8/OX35ismkRmlNZ3qur6/puwElvpwn8iuL7i3ApqpLyjJ/DY2RWYKzZLw28qT8pGpGXcwgKJptj9IKrQKQZGdt25FnGSKmohp8wEeHNTbNyVRiGXRdCp/M8zwl2brUySoiWVmS5VlaAkmJ6XqsTbHgLqbjbamSSUCQgOIp6DGMDU3KW1OqRCmN6QcmdZWCHW0qIlpKMqWwSr3uOJ1ztF2fkiicBWC9WuGdpdnuaJod7dCjVE5eZDAex7M8f92JD2YgV2lR6LwnOIMzJv1ZRMiVREqNC4mbIEYzRJbd5s2lGaOxJvnBSYoBJUH6CFqOMKJA33ZUVUVEMBhDIVIRdTZ9PaUcwXlEpmnbljiqHrz3adFZliigGHkM3trEhPB2nNiKdNrxHjsMiEwyr6YQAyak0c4XG8Egb+ejknjL2P2lnvLXcynkyMNNetx/3nckbhvhW+vyCMQRI/QmXRKQyAz6rsMGA85zvlsxySpKAS9DQwiSd5cz5NBzbnc0MknxHh4d0qxXbIcGyhQ5ZaYTqumUvZvrlBNIoO1aPq4ixeGCN2zF8OqUVxOLrWscnn7YMN8/YuHv0dgbhthTigKzHfhF2yDKnPfvvwkvL/nxdEPUA2Um+Nb+e9RWcNJZamHZXK35Lz/8bziZT3l3uke+u2Y/K9Bnp2x+8QJipJ4U1FWG9w4oaLuOtutQmaQsS6qiom07fvKTHzGZzHh49y5t1/Hhhx8RhWS12VJXJdvdmqIo+MEPnvLwwRvcufuQk7sP+HDVcvnyBulroq4Ikxk5OYfC87fu3eHtwrHQEXvzilz01JOcEF0CBp2f0Ww3RME4ckzY0lxnzKczlkeHiV/vbWo28iItd0Wk71uEFlSTin/6x79ARccvPvuMew8eMJ3NeOuNmqIouHvvDsYP/PGf/Qmrze619f1XXV+iXpAopSiLgrq6LbzpGBqEAKmQEaSQFHmNkhl5XmAN5EVBnmm0EljjUkKvTBv43g54b2iGJkWQ6AzvLN7Dbpdi1dW45e6G7vMYGwlapRgaIRTRWKzpU9LtmBSRlhvJDixjmoOqLMOFSKY1fhT/KKnSjFMK+r5n2zSEAFmRQRSYYUAJgZYCkSmMNWzNKiXnqiTXMqZDROh2m5Syq1QCuKelJ0pprEuCbEKOFDKFRYaA9yPsOoQRFXibJJCG+FKmIb61aamWFxlK6VGHm+LBhdZEN4w/aJ/swyGlCafIoERLstYjxUBWlmhdIGM6FVgsPniEjLRdQ5kXCCTWGoSI1HmOlCotHGWaDSunMEMPUmGdJZNJ/jX0HS4aEDLFdcd0yvDjAkrGOLoF45i8wBcJMb/265e+ky/wFn7l7/9iBz9+LKTA+p5icY/dekt1co/l5Skvu5bj5THzi2cI0fEiSA5O7rB83uGVox86XswL5nfvwrOnBBNYuZYndkAVJftHB8xfnHKd9ZhKQ/AMtmGyXDDTb1LtLgl2R17MyBCcbzfEqeJgdp/DVc+r9oatXENWk+s5izIjTmv2r3dkwTJT+3z28hn1bMlvfuX3+fMf/hkXzWdIHdD6iIPZjPerCnN5TWwbfueDtxFSJidcbwje0vYDzqe8QuUD6/Ul8+mUqixpmob95R6nlys++uxlCio4OCTGDffu3WdWV0gl+O7v/DbTyZzrqxsyJbixgqArbFkwnR+geofKCx5VkW8eTzlmh12d8fTyJdIbDveXNKsNTXCcPn7C1eUlUiZ9/tB3nF9f0TUNgpDUVNueWOboPCfLMoaupes72maD94YoFccnx/zxf/vfYoPjk6efMZ3u89d/93eZTwtWq2t+/NMnWOdYLOaUxZczon9l0fU20Lee4CBTJXlWkumkzUWo8UgbEWi0KEeBffKmV1WBznOUzmjajrbt8T6gC5UWxM6PEGhF13VpYRMjmVLp6Ckl1hikUmn2GDxaFbiQPhdCSMyHGNFSp5EcoHSOdxZJ6mhjhOh9gsNIMepY0/KjH35ZW2pHfSxC4oxBjBZYIQJ93xFiREtHpjJk9KN5IXU6ozk0HVWCJ0qVlAPOJfsuCaChpUSPHaKPKWH2ttCmDXpAqQwvDVIKiqLA+RQBo7R63RzGAFlWYIcOFyIhSkqVEXWK8UmyrTEefHy9wQ6UVZK1ERRK5zjnyFRy5TiZNNi5Sq8/aE2uc1AZUkQ6Y1AymSfk+HNy1iIR5FqjXUJvRlKWJaO+mBHwnStJWWUUVYHKFIFff9G9hY0nQUL8lQ+CNJm+LbTyl757IQRSSKRQiOhxtiM4w43bMDc917nimbTcFZpd33ChFatuxZ3JBH/+krNJxrZbc5U3vHE0wZxe46ucmEm8jpjMUy3nVNYxxA6Vg1JwvWu5LKZM99/h682atlnztH2BqwqErtmTmvvH73D54nvUYcc8z5llFeetobp7xHvVb3H29FNe9o6d/RRxFvHLe9ydHyFFzzvHR9ytFtBsOZCRF9sNzbolWIsZLJN5zXw6wQyCYbBorVku51hr6U3PYJJdPsbA1fUVnz45Z7lYEIPjerXiYO+Aptnx1qMHXJy+5MXT52w2Hc4Y7j44obmxlJO7qIP7gKI0W+oq5927C8ruHNee8eLjn/Ps+SnH+8skVV3vaLuGJ89e8tlnnzL0A7NpzaTKWG93SKGYTecJ63qzoqwq9o/28d7SNluasYla7h/y0cc/5/rijOViQTEp+OGPf4IULS9Pn/InTz7m7PwiNTVRsDdffI4D/RXXryy6zkVWq4bzix0nRwOL5QTyZBoQUiBlkqyIUWJhrCWTPVIlSVSeJ6pPyg0ac6aiRwmNM44YAtaktNsQPHmeo1Wa1TprU/yxTxjJPC8QIpGzNArnTMqx1zp1rCGRunSeeALOBYL3aakTwms8ZaZS0bfO47xHCckwOCKCTKfPDSNusreOQmuc64mk7lCJREmSQqYHxygZUkAmIUaFJ6YQAm/hVnaER+i09fYuvXbnPASPzlPUiNYZUaa5rYgpdicrCqR3SKlQKkuSN6WI0aOVIs8rnO3ROvEmhJRoIkWmyXWWvq+iIgabpGRaoaPGhEAg4BxkKvnoUzijJ40O0kNAqjT6kEpTVkl1EAHjLEVZ46yjHwYqPWVWVGxD6na0UriYjDJJcqiYVQV7i5rjgxnzSf0vRdG9fYrdRux8YVP2S9dfpY1JkcYrQvB54q8YR0AYCt1T1wUzJRgKzVQEgmvocshCgZYWiaERnvpgHzUkIti0LFn1LdUbd9kbfMo/ywTr3ZpdqZnslbxlcgoj+FlzRp9lCDWg7Y7j47e5OZUo9xkz2XJQTFnmB6z3S75y8DtMf2bQfsJnVwO7ix8QReAre3eZVnt0l88o9MBRtcdbywNOJhMuV5BLmAdH9IYyy4kH+zztDLPpBKN7JlWBJFDkOXVlyKuK1WrFrumQI6d5GAyz6ZTzqzVN2xCxaKFZLJYsFkvu3b2HVpq95SFDb5hMZggcP3/yhJd2yraLHB/cg3KOnC8o3UDcrAiu4fzZZ3z66Wccntznqx+8z+GD+0TncdbTDAYTIlEpglK0NmAd3Ln7BvcevY0qatp2QKks7WqGju1mQ7PdUZQlKstxxpOrHOd6Lp68RIvAanXOH/3RC6SE1WqDtZ69vX1i8Aj15ff0rx4vxIC3juv1msurNctFRV5Mk/RJyoS3i/q17tI7zxA6hExov6IomE7nWHdKJNK0DWQagsF5k0YKwQEBrdRrM0MEUCl+/BbcrbMMRIJqayUwfYrQIKTQRhcdiITm895iQ3LB3ZK5IiKNJILHukA7GHIlEqMWsN6Ny5/kXEsgkxHXePumjCmqu9A6AVJ0cmrdZmHJEFGSlDgQ4+tkX0aDgHeRLMuxowPMe08IDq1Th6lVQkQikz46bcsqdJ4njqcQaKXJixrjEqYyr2qUSInLSnhiNGiVURYFWVkiSCGF+KQoUFLggyDLCkwMCGlx3qG1xvlAlqVMOVRSGCilU75ZnpOTpGAhRkTXIWIgL3Kk1jTNmqqqmOqca9fifGIsh5iSc8ssYzYtub8/5c27h8zq6l+SVdptcxu/+C/jx7dTEPF6ni7H2biQYiSM3Z5UBFKq9L5AYM0NTkypbM4TOXCSJ47ARwwsphPe9hmddzzr1mzrguN6yrEs+bQ5Y206rqPn4XyPBw08Hc5w/pqgp/TMWNx9i2zjqW8uQF5QS7hbvstHvqN8dI93rixic0M/7PHDZ0+xT39BWSi+u3ibV6eXWFpwG1Se0XVrvjJ/g53fcXe/YlksuVvXSN+zJwJLAr5bp6O2CNw92qcqCpqu48Z0OOfIixohJDfPdmSlJc+zZJzyjvXNiocP7rO3f8jP/ux7TCYlSufszw/5re98l+XhPg/u3WG7veSjTz7i6eMn7C2PMcNArwrk3gmZqui7HXuLAwYTyTNwRJpux2q9YjaZ861vfZN7775Fnhdcnr7i4vyCi8srVptt4ugOHdNqwny65Ktf+zrLoxOKakpWJSmsGQaGvme7XhO8T6RDO1DojOlsxtfee59PP/6Ir3/1PcwwsN1uGILl6dPnnJ6fM5gOqSqUzr/0fvvVOl0tyCcSnQUG17JrdlSTHJ1VY4DfKHKPqU1wzqYuTUq0LimLgkk9RQiVrMTB4azDjtv1NDYISDWOKmJ4HZzog38dmaIyjRRgbI8Qkq6xeOdQuX49S0uAaTmaNTyEtKjTUhNcknwRw+tuMMZkcVYqdW7epeItBfgQMH2HHI0ImJAeKwJciBSFpJAKaSXWpAKpRl2kZBw3hDFdQIDOctwwJIB3jAzWkmXZqHQlDfGVRumcoduSZRVeZTibxivEiBy76RBDGnnIYsx6Cug6LbBECoJjWk+Y1hVeJsVCqRXVdELf90QhkJkikhFiIL9dMBKIAawZKLN04hACqrJOtl6tEEKyV5bJeYYYZ+siEc1iUjGURY4UPT4GvB8B30QyAdNcs6hKlmXFvKoIv/492nil8U0KvpcEEX+54L4uyLy+327Tgm/xp0n7PXa6EgoN9aQgiyVLViyrGt8ZqmgJec+cfVx3QzZpCZlnvjik2EGlLUZb8sqznE0ZSs1ijFGSdYkuD/ik65ktpnx1+nV215+RVXf45HrF1r1CaMXX9u+yDJIXuzXBrSlzSR1rXBy4s9hn214wFDPuTRe8Oz/mKK+I6hjre8Sw47w5pVtfUxlHPZ1RZJpV0/Ls1SmQEnHvP3yAmHtM6MAbohd85b0HnJ5viS4wmZQ0TUsgcHm14qNPnjKdptzD+8cP+Jv/yr/CZFIzX84oC82LZys2Nzd88P7XWe7v0bYdjYHdjWXtO3QxYVYWONMlC7yIdL2lbQ1vPnrE3YcPmM7n7G5uOH91yieffsrLs1e8ePmCruuZVDVvPXiT7/7mX+ONdx8x399DqowYPVKk9/v12Rm7piErc05fvuTq1Svefe/rHN25w89/8kP29+ecX5xxdLDPwzfu8tmTx9y7d0JZV5yenVFVBVn2L2gDLmvNYlmy3CsoagHSJ8KXB3QCr8ioIYxC95A6VW8DJYK6rOnznKIo0gJFqjS8Hnqij/hRo5vlOd45BDLlf43FJNM5MQSKskxZXYC1FmdNWr75dDQPwcE4ughi7CBH8frtsizPM6IP6XgsBdY6gghIodPWOqaIGZ2NIxOpUtEpcjqT1BREXrNUwxhCKNU4Y47pv5FjYkMMyaGXaUWuJCLTo8sldX6ZzrG2QwiJHkPvhhHoI1VaYFobxze3GmVajlyXCMHruaq1FqTC2w4bPFVVcXiwj1aa3nqiFNRVwbSajEYJQdQJOo+3iFik3Dk8WJfCKLOMup5Q5BmzyQQhVYpKIjkRDxaSy5vr9PPwyXihVZIHqgi51HTWjLdEeg3BJW1v27Xs2pb0vPyXo9N9ff2S/vb/4xPjqenzYvv5x7fLz/HXxtOW7ltcVvH28g5ZvkdfR94bPPX0kMu1Z14XvI9mUh7xdBO4qQIHk0dMzIq6PuSTqy1GBd7cu89Bs0RlBT+9aehiw6rb4KcHPCofcbHtCH5Ai0AuFcZ2nBwf02wEvSzxMlConL1qyvFixsRU+DhQa8FJmdN117j2FX13Ru9bgjdor1hfKq5fXlOWOduRD6KzgvW25e7dgsXRnJ+8+Cg5+qSgypYs3/0G12dXKOcokDx/fkap4Wj/kN224avvvsMf/J2/QxTQm5bnP/iM7W5HmWmqquTps6d88ulnbJstSmX0i4f0HZzzU+oq5+DoLrMo6F59zO70JfPJlEdfeZfp3hJ8YH1xydnLV6w2a5q2Yxgc00nN3cNjvvtb3+Vr33ifgzvHKJ1hjSVEzzAMrC4vuD59RcwUnsB8sQcx8PMP/5JXr55CSDmMLgSads29k2POT1+RFSWLWY13e+x2W2T88nv6VxfdScZ8UbG/X7NYlEwWNfPlnDwrCdETg0xHeikJPh09fQxJfyoG8rxEKUFdlXifBOjW9Ijx6J38+ILgU6dog0MJSQgSNaLzsiIfVQmp+/XOpnGBVK91rSEBA9Lya+y4JaSuOUYEikzluJhGCN6nMUGIpAgi0kw4U5EgoCwLrEvFvdaKuijpuwEISNLyMIxvQmTAu7S0UmqUDsWA0qlQZlonfoKKSbI1qjU+f4Omrb71kUwGAiNjYTRJiHHjnxUFgzEEn/LkBJE4OvikVNi+gSjZny9Zzqapi1RpFpznJYNz5FmGi1CVFdaD6TRaenwUKJWhIsQYqPOcQipm9ZQsz6mrCc6lSHipJEUWU5DfZoPS4MaThfMeEQLzYkLv7Njtk9QNg2e7brkAhA+s1xX6y3lL/wNcAVC/NGJIP8UvPBLEreGD18X1dafL+DMaT1C33F0hBM61hN6j5wdkfmB6uOREvUe7atlUBkTGvpriVxYXG5zQhMmCN8tDLpqOrLC4sGXjOh7s36G/blhOYSYLikwwqwqOju4w6Ttys8EJQ1UVHJVzvjq/w3SzxJUST8N+VXNvusBst8hty9nFOXa35vGwwdiWEJO0MtlhAj5qRCaxHWgTsJ3BhwS2ci7QdQMH945RrzJcMEQEje9pRaBfHNDe3KBLwWT/ANUZ3njwJt/9je+wN58yX07487/4PtY4Htx/wMM7D9GF4od/+X3OL6/I8oIsz7m+uWarlsjZHWIcWG0ueXDnmKV3RL/DmoY337rP0d0jdK7YXl9zdXHGerNi12xwzrF3sMfDk31+8zvf4oNvfp3l4T55UeBMT7db0ex2rG9u6DYNfdcRtKK7WdH3La/On/PDH34Pa/3/u70za5Ikua7z5x4ea2bWvnRX790DDDaCEERBJCiCRpleKJF/QH+Iv0Lvkt70IJnM9AiRIClAwACcpdEzPdNdS9deucfq7nq4nlk1JISmGcAhzFC3J7snqyIja/G4cf3cc89hdTAgy1LmVcnlxZS9nV22NrY4Ojmm1+uRpYbp1NL9IySif+mqTzNDvydGgiuDgpXBKuubOxgM0/lYlP+18BUdgmPKcxEVrkqDxhFFiixNRFMgSDA6J2pW1jk8QplaYIkKwRY9SjQEWouzVpKd90RRqC4ioZrpSAe7G0cUSyK31glk4SxK60DRUjS2w3joOkeioQMU0tBK8kRseLouJD9D27UMBgOGkyltY0lMcKQIYjDWeryXKlgpTxRF13J/UYTRGm+twBQQknNEF7i+GoEcrHNExHITU0K81zoK8ItejjZLQzKIr/iOLO2LyaYTc8w4kXMYE5GiiZQRNoIFkxoiJ00uH7Bep6CravKsR6eF4qeVI89SgUxaS61ber0eeZHTVBUzoLYpK4MV5vM5SZTivMIBk9kE72V02wbIQpqGMLUzfN0yvJqiTfRLKVlffCwSKNc3OxZMBXVND1scHRKuXjBPbiTb6/DEpkXbKf31DYrEkG9tcmd1m2I2pFItRVJIA6qecU5DkmesZH02Zw2r7YypL8mzgkG+yrt3n7I9GzF2FVnmGRR9Hva2WI9zzsoJnarpbEmuFbmas1WXzLqK0eiQo9mQ/aak60qsb5Yj8dZZPBbvXXhY0eqgIyoMvta0nVvCXM6Jseu8rCmqmNQUtM2CBeRIsx5x1qfIV0ks+PiIr+3t8Sd/8PuMhpfYrsHWDQ/v7tBZx9npERtfepc0S6jqEm1iNjY3uTw/ZTS8hGiANgW2mlLS0OQJ2caAXlQzeLjL3qN7xGlMO59ydfqG0eiCsprRNC06isiTmHffeYdnz56yvrGGiRVtOWV4dc7p8RtODo8YDickSUZvbZ3ZbM50MuLTz15y+OaIOzuPiE1E25Zoozg8OWY+nXJ8dsbD+3scvjnkcP8zIhOx0ssw5lcdjog0SSJlf54X5L2Mfr9PojK6zjGtx3jZsQtdSknSJVJ0Tce8HNOUnjg2bKyv8mr/DZExuNYG+laY+/eetquJtApuB5o0k/E7rTXetzjElFGkGjV4K5MmCL/V2+vPi/mhDcNdljgyotylZKFFkaazHh0ZamuFUtZaih7gZPxVjBoNjbUY58iSGNs0aAXGiBW8KBFotHK0nbjmRlrjjcIFse9Iaaz2YcLML0n4TdeFalYucuesTJ+hcK7FKzBG2AqxSdFakqVGzmW7BeNYdGpd26CzDBPYHCaKaDpHnBi0jsjjIMZtHTqKiSNHnGW0zpGmooWhjYGuIU8MJjb0ewVxnFI3LbP5XOx7BqtkvT56OGI619jWygWpIzG4jDRX1ZSei/G2wzqHcoLdV7ajLGuwogW8gIz+WUMRph6ET7zk3d6EGYQhtkyq19zcRXMtwA3cSNQhbGSJ/AznpiQ+I/OW7b0dtptNrqopPonYeTDg/qTmuBxT+pY8Tbn3YMDDquGymhDFUrRsxykP6oyrasa0vKSaH3Nx9ZLLrqZsauq2pGsrvG3w3sq15MS52+FwvluKGjnvhfqJD8LtNrh+25CIFWmuWMt3GR5cSSPaA86TJgng0DZmkK8yrUdhACFiZ2WDROV4PSMeXrL3pcd85dkzskQzNZpHT9+hms24OD8hi6FfxMzqEe+/eMX52QnjWcVweEE5n8rw0uQCm+S0cQ9zWsnY8/07bKxnbN+9Q9bPqeZTZsMrhhcn1PVMDGA7se1aX11jZ2uH/mAAwHw6ZHY14fTNMa8PDji/HGK9YnUjw3jPtKyYTMfUdUWSpDy8d5/d3S3eHB/w4uMXFHnBcDThg48/kdHhfsHoYk7TzOlvbpCkv2IjLTIRSZKQZ336xSpZ0sfEhtTkZFnOvJ7gXQdKGlAKaJXDaycYZTVjMqnRQfbROUdiDLVt0Ij2aJgQQClpmHsnjaIowA/eOqkqvRc8VGtx+nUO77qAfyYi4ag1rhMzRhUqS+usDDhoI5WokqpSK03TNMRJSt3WdM7StB6NQBBxbFDao70OCy2liiocXu782oQmkcV2oCJxBFYAnccbQxwnKO8w4YcjIuuiwaW9R+lItubaC2c5OBZ4J0I8nXOSRKMInODTtrMynOIt2ossZZoV2NYSFRG9rEBHskswoTpZ8E+7rsU7MHkf27UkJqUxLc41KAVZ3mM2afHaoOOUpnWkWUzRS5nPp1TjK6xdIU5ier1iCdXUTU1R9KlaEX23SjOrShKv6Lwi0IxlV+Acznqw4LvfhE6aSE6Kyy94taCQhRSqRUtBaR8s16+ZDEKb1KGZdo3vLl6PIEN0ruXq8jOmoyPik5zR7j16+YBYG3RsOIvP0U1H1jXEOJp5xauTGbruaH2LtQ3n9ZzXbY3GhmrUhaGYpWSPPPyNh7sWecJbgQ+Cyhzeowjn8aKO5q1dJmCFYWNlh997+of8tH2P5y8+EAtyPJPxFbar2N3ZIjPFEpqJ8KzGinZc0rMt3/7db7C5vkLbyui4dZ4P3vsRzlnSOIfIMGtrfvC//gezSSlUMSWJLEk0Vd3irEyVDgYFa3lObEtWfMPmyjbZoCcMiZMzTo+POB9eMJ7NqNpWbNQV7G5tkiYxrm0ppyMmwzFnJxccHZ9weHpG6yBJUrxWdLZjc3ODj5//jNl8JhO5RcZ0dMVsMiKKQOOYTkpOT6co79nb3WB1dUBTl0wnU1b0r5h0kyRh0F9jbbBFnq1jdLqUYIwiEdi2gdKlQmdXe/BaeJkuYERJalBBVMR2HTpCBhC8AyvW3EYrNB4fGaKAdaZZiqiVKlpn8X6xffdEKDpvcV1HkffAeaI4oWlq8J4oku68UgaNwoRJKGmaSVJru5YkSZjNZhAZ2rYVdwklbsJKOUA4vmmSkKUpnZWKQJsIEwlsYQOsEAUOsAtiOYmJsbYRAR0rMIe6oa7ltQhhKy8XtNYKHZnQBJSLWpgWHQ7RUu06JXY4ztF5L5KXoWo2YbzYetBWbnxGCe83imJM5Om8lUahiYk7sezxXoRvbOfoD9ZxXYMjou46TN1Q9HL6/QHj8YjZeEhSiMlfnvfoOksXbn6b/S1GUYT1sGk3OLk8DuaTfqlQJipvXsaC/xGcxn/quE6SgHLXCxmBixbVr9JcP24kWKUFz70JSQDXesJhvXlncVS0ruZgfyS6DYj0pvwX9CrCkIZBnEwiFTR8AQHxQpHiQ5Uq74ZfPl/8e+NPgAycdyHJurA9lPUtDEeHc600gRVEUcTdzcd8/dm3qYee5y8+oKoqsYWKYyKt6JoW12o0Maku2C0ecF8VPPnyHTbXB0xHl3RtQxobbDPn4aPHRApefvycSTnl+M0ZhweHuE6ztbXD5tYOz188p+1qmqaiKivK2qGjnF6/z3rsuNcfsLsxoFjtY+KE4fkp+4cHnJ6eMpqOuRgOuZzUOKfY3Nxgc3UAOOaTCaOzU4ajCSdnlxxfDBlOw+4tSZiXJbNyxqBXsHvnLnGccnJ+wgcfvs+/+6M/ZDS6YjicMivnSzroaDRha61PmhtWV1fxRIwm07euuV+adPv9NQbFOlncJ9YZyhnquUVbkWMU5SgXKgB5TaTDr9w5olh0eGOlieMocEQ7vAPrWlHt10oaOVoWrYz/ikNEhEy4tVpBKwsmMYbOtigT49tWtiBdK1tnLTisVbKF9p1QmnDy2ihOUKF69J3MWkfGLDUOGhtgDxSJRswumy64KSjZOrSyMJ0DtApuwwYTSdJz3tM2DUkcVLvQeIL1i4oAG2QXCRWgRStNFBqSUj0LwhgFE0hxkJCvSyuP64QH7bzFa49u6rBTEF0GFORJClqhjQ6yjE6GL1DMqxlJUlD0e6iZJHvbddJoxGCSmM56olgEtq33rPZ7rK1vMp9NSZKYuq6ZdlaclZOUq/EVnXWsbWxLIu5a5r0VXDmlrmusb9FG6Gtay+9kqaf4zxoyS7jgYMvzheNFjEIyrQr8XLQD7T7HXtCLqphFQg6wz0KTYcHbdgK/+UWhIi3c64ZdECrTXoEKtkZ6kcDD1xdoh/7Gz877a9ofyK6JMJG4qGIXfoeC38pNwHtR3rNIdbuQ73Qo0qTgwc5D1le3KPoFg16P6XRKHMesr/Ypspgkiri/+oiEjDsrd9ldvcuD+w8YDHrMZ1MGg1VcW7O/f4BGsfco4vTygtOzE95//iHD8ZiVlTUePnrMaHzJJ5+8YD6bhDVmKLKcNIbIKHaLmDsrBU/u32X77i5JnlPNZ5ydnrL/5pir0ZjT80vOhyOqtmVjsMqgyIi0TGJenJ0wHF4wn3dcjkqqWthSURSRZRkKxfMXLzg4+JR3v/wuf/Cvv8v3v/992nLGyckxDx7s0XaKv/voI4p8hqdiNK64Gs7Z3XpMVU5BObJi5a0r7pcm3V6Sk+oUTQROY1sopxVt1dG6ail07YUkK1WAtBdk62UicZ1twITml3M+CNh4tBEalYkSQpsJpRRJFAlvNeixNlFEhUAPeLvUYtBKLhNx+pWLODIRtm6lEedkO60CBhpFHms7kiShcTIQ0FQVRmvazstNgGtKUBxFGGNEzDiKaDpD5CyRgtaJURHh4nOwpKsppTEmwURgMbLb0zroHGjZ7csdRdTylQyaKBS2a0iSDG2MOESAMDpsR5wV2K4RQfTOCp4YWB8e+d6EPmeEwRFpiKMweOLwKqP1wjTQtiMyKWliaNoGp8W6pfUVRW9AU82AiDjJaFpL2Vh6eUyvP0AhzZThcEQbcKEIxdnFCU3TsLKyDloza+bUbU3dlOR5Qi9LGPQSktSQJIok+k1gL1zHsgGqQ7JULjTQrpPpTVz3/98IvFYeu3H2sOP3cl4IuV19riq+OYnsEShGLY4P1EZuJl0f6H5cJ2PBZkNTzLllleuXlW74vJOdqPVuWTODNHd70Tq2dHz26gVn50d474WeiKfrUuraMxpesbK+zW7+gPube6z0+1TzKeVsSNs6PptMuLe9xaOHjzk9O+avfvC/eXN8DEqxd/8R5vSU2WzEq9ef0DYNk/E05BSB4Tpa1tc2KHorbKQFX33yhAf39yj6OVU54+D1az58/hHnl1cMJ3POh2PGUxFvitaQPkgsmrij0YSr4YTprGTegFUCnRZFQdXW5HnO2kqfn43G/NXf/g3j0ZhvfO1rmAhefvqcy6tznj35Ov/2e9/j4OiI//uTn3B4fMr+2YhHDx27d+7zev8V0/mvWOkKDUYaXi5skTttUTR0rqSjQ2sxLXSRNBI8MqjgQ+VmYo3ynn4vxSiYt8HWheA04Dw6NmF7pUWMJY6J4xijFW3XSQNJaYEiIuHGOifJzeMDE2IhfyhKT0qBNolYK8cpXVuFVS522R6FMoa2rsI4pyRwHUWkcSyaDklM5sSzTG4OEXUNJjJgGyItCW0h5SgKX2C0MBxc2xJFGq0TsdDxHhv4ElrrpRPxomMuNxFJwLGJltW794JBa7xoVDgrWds5THDvtV2LbRuauiYxBov4zHnriWKBS6wXFbckjulsR2xlCtB5S9M0mDijbUXxbWVljdlsirUteZ4yK2c4D/1eQRrLhjfNUpGptDII4m3HbCauqlrBzsYOUZKgrkCrjo21PlsbA9YGOSuDHlnydvzrnzokcUqFK7nuptCjC0iDusZJuX5IEl48v8nbXfbYwusXlfM1ngo3C/3wPv560MjrxWcWUIJ8rXbR3/PXRp9yrgWM4yDof9hQ4fobSVegqe66eeYDcwE5l/eK1f4O3/3mn7Bd3OGj5x/y8uXP5TrSEbaztG1HEmfM65bdLGW7t0KeZ1wOh5R1iTGa+WTOt//Ft8iSjJ9/+FOOTk/ZPzohz3pkec7B61c0XctkMqZparpWiqE8EmcY7zxJnJGlPQbFgC8/eMDe3g5ZL6dtGg5fv+a9937My5evGE2nWBVRVQ3eOVb6fWFLuVZ2ZMpTVhWTyYxZ1WKJUJEmH+QMVleom4aDg31Gowu++c1/wf/54Q/56OcviFTMowd3Ob+85PT8lKPjC+7fe8zjR4/5l9/+NhsH+/zs/Y94dfCG7Z0d9u494vBo/61r7pdbsFsh+uPEA6r1Dtc6vG1xvkIZh06NUEycRovXBNpHQXdVBZEWS1YkxInBT2VIgoBNRSYRWpQxYS3JNmzRgW+7LljWEGhXPuzLRUTGmCxgoB4T+JPGxKA0JvIyHhsZ2jpU4Dg6J80o5YSyZt31tk3Ea8Trax54qULDlA5yWdfESULdCm9RxcJR1gjXFxVR9PtkWYyta+LEgIrDgEHLeHQlWKmRbatTQifTaSRfq4cszUTByYubhPWeNMuXY7WRk6mypmmJuibwlztxj3C5uC0HVwilRXEtDxi2846mlVFhG6fUdS084tB4MUZTl1OKdJ0iy8OWE5Ikx9pWBHJMirUdXdfJyPXC8y7SzGdjWtuysrJGFMVsrGzgfItzJXvbm9y7u87OxhpFkcna+E0K7wP90S3hnJt/locRGm9LvUcXoIQlyBAS7g0IYPHXMnEv3nJR5crLbWiGaU/Ab1me17OoeEOJYa9vBNe0LznO+y7c6KXi9Qhu753F+S5UuzcaaUrWPCi2Bpv87rvf4uHuM9ZX1vm7D39M55xMJTpFYy19k5KkBbubW/TyjNFkJgMPcykA9u5u8eknz7FWKuLz4ZjIxDx++oTz81MuLy+om1quP9tJk1V1mEiTxIbV1Q12tnZY6a/x6MFj7t7bJilSWtdwenTEez/9KT/+2QdcDUUSMklz0jABuzLoUaQpXddyfn5OliZUVU1ZN9SdQ0cGo0Vft+1kruDs+JTxZML9+32ePHxEXZXs3t3BFBleJyiVM5lN+Pjlp+wfHlL0Cu7c3ePf/P53+PFPfsKnrw9490vvsL6x+9Zl9kuT7n/+T//l19rp+Iu/+HWe7TZu49cRn59A8wvWjCI00QgJdnGsX6ZAv6iOQyPqGm4IjbgblLPleRdJV30uRUOAzBRSc6vggil9NSXN1sV5lBynljrR7jrpski61wyHhfKdc/Y6CXsRPFriw34xPWjo5i0/+eHf8tnmK169fs35+Qmz+VzYSV1Hkq6zkuf80b/6Fttbq1yeX9FWJfuvj7h//y7zSc3B60+XRdWr/QNGs4r19TX+8gc/oK7naOVpW8u8qskyoSuORhOU79HLCzY31tnd3ubp42fs7GwTZym2bTg+esXz5y/48KMXnJxd0jlLmhV4D03bUKwUbK2tMsgT2nrG1XAG3tN1shtx2mAiQ5zlmLSH6zpoHU8ePmZlbZ3L4TlZFtE2DeV8zHh4zt0799ja2mM4GlKWc7SW3smnn7zg61//HZ49e8ZwOOTs/JL79x68dcX9ZoFqt3EbX3iESlG8ipaJU+pXaV7pBbMBJfv+JS6wwHUDL8MvGmw3Ob7h/wNWKTWq2EYtcrRevOGNjpr36gYqsaCBLYpl6T8EfA4fKld5pfBxPcI3XzxwXUjE19CGU/I9ehYGm4pIGerS8snHn5EeXnJ6fkakUp4+ekJblRwcf8bThw/4zu98hdVexNXFMUXRo5/FfOnhHqPxkGo2o+gVTCYT3hweMCvnZGkiMKDWxEnO6qDHweERVW2xzlGVQRLUKnZ373D/7h6PHj5ia2cdnUY43/Hpy5c8//nHvDo6ZTQrWVvfEGlRrUnSlEgbelnGoCjYXh/Q1CmnZ2fMyhLbeiIjWs/GxPRWN4jXdtlZLdjpRbz//k/48c9+RK9fcPzmkDzvcefONvsHL0XGQGuaxhKblKLXwyP6uYeHB6R5QVs3zKcVw4vJW1fcbdK9jd/yuJntFpWoNKZuVsAS13jt9fE3n4ePLulxSHZTnz/H5477Bc04D1gVEn5QBRIqolu8q7w2MEAWz4WTG3DcG0l3WWW76wQLMkgUiA5LHkVETKxSkjTl97/7x6R5j/OTC3pxxs8/eo8igz/6vW8SR3Bxds54POXOrsHbhvOLE6bzEtDMzq8o5yVFvsrG1n3G0xHnl6dU1ZzYJGgVc//+Y+LkjOl8zGg8Jo5jtrZ22draYXd3l16/EKXBDk4Oj/jwo+d8dnTGeDLBJBl5VlAkOU3TkCYp2WpCnqWkaYL3oJVB6xjnykBjNcSxoVhZx6xs0hXrzOKE46t9jk4OefnJx/T7PZSK+MpXHnJ4+JrZXGRpT88vA8tObq5N05GnGXt7O0zPxygUTx485cnTd9664m6T7m38locPAxFBcB233NrLFl7JBGQ4Vv52QpW8Tq1LvHXRF2CBx4YGGbBs1iofIToeC8z2xqkWH/KgQ6/Ce8R1w4UqOcACKmC/+GipmbAY5100zqR5tmDoBTNStaiYZUDJhxJaoVDWUE86Xl18hv3L/8nThw/pD+4xWLvL1dUZf/h73yBSlquzc5SK2drYoSgGnF+cc3JyTBQlvPP0MUolbG3tsba5zdlwxI9++h5XM8u3nv0uiVH0Bgk//dmHrK2v0rRzVldylIqIY0Oaipbt5dWQJEmYTEa8fPWa129OOD65oCwr1je30bH8NNbX1un3ByIuZeSbm85K5uWMaVkJ0wfRaDFJTrK6gU16WJNz2mns/hnnF5fc23vAV9/5Ei2OD3/+PvP5jDhJSeIeedqK5omSxn2aSoN9PJ5SV5Z7O4/5xte+wYNnT9664m6T7m38VsciJ6pFYvx7n/uHcZPBED6yrFhdoHXBwu5ShWy6GJJ4W/yDwjjAEn5R8aqgveFEIH5J2wx/JLmqJT1NitzFqC+4hUAU1z29BetIBaNN7z1dZ/n+D/6Kzz59yZ/96X8kigx372zh2znHR5dsr29Qd56N3R32Xx/w0c9fsLm+wZcfP2T/7Jg3pxecjc7pH6/T76/ynW9/i8fjKRcXp7x4/gGnJ/s4h6j9OUuWxWRpQRRp5mXJp5/to6MI23VcDa84vbzi6OyS4XAqei1XQ7ZUTB7ngPixJbEB1zGcjJhNRkxnM9Fj0QIrKAtR1qdVhnkH1bzCaS02SoN1mukVRW+Nsp1SpH3Oji/Y3lkn0oqNjdWgK+KoKidsnyjBuZi9nUf8+//wZ+w9fcLq9vZbf8e3Sfc2fqvD61+cWtWiQ4ZaFqxwA84NeOrimMXRUgBLAlQqVMD+5hlCFazU8mR/H2JYvIWISC3wYH8N74Yk2S00m8O7L5KzNM/8kizhPFgvQv4BGkaqZQKWvfg2hN9jTAydCLSXVU05HdM1M1wHw8spsYF8r8erFy/Yf3PCxsZdMZ18eJ83l+f84Ec/pmpacB9jTMLaxiZ3drc5fHNCax2TyQRnFXFi6FQk+i5ZinagTMRwPGHoZ3ivaLuWeV1yfjni8mKM85AVPbK8TxKnpElKkma0bYftWrquZjyZUE7ndF1HluUkaYZHoU2KU4bKKq4mJZfjGqci1tZSIOZP//zPefTsIT/867/hm1/7HVb7fT7+9GN8YSjLkulsRtM2dJ2nqR15FvHVJ1/ie9/7Y979xldZ29ymKAZvXXO3Sfc2fqsjMFQl8f2CQlTdSKqfjwUdS31+8mzBMFiezC7PdH0+HSCHX4zpwqKRpwINUybNFpjuAoJYVLHAUi7VORew2wU0IRKmYXZ0WTGjbtxACCcLk3ddJ+4tcSSuubPpmPFoxPadRxx9ckyeJewf7PPik5dYr+i6iKdPn3B6esxf/+g9us6xd2eTsiwpS8/hmxOGw0vSLGVeVhRpzMZan5m1lLUnSlNMrEi9GArMywpjUrxX4nlYVYwnc6qqJsky4iRla2uXvZ1dVgd9EVMq52gtRgfzeUlZVuA9/V4iiVAb0TrxIqN6MRlxXLVk/XVeW9gsBpTtlP/+3/4rXWV5cP8+jx8/4Oj0iJOTI7T2VGUJSmOtQuuEr375q3z3D77D42eP6A8GJMET8m2h/jFbntu4jdu4jdv49YR++yG3cRu3cRu38euK26R7G7dxG7fxBcZt0r2N27iN2/gC4zbp3sZt3MZtfIFxm3Rv4zZu4za+wLhNurdxG7dxG19g/D8GDVx+dznetwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from PIL import Image\n", + "from torchvision import transforms\n", + "import matplotlib.pyplot as plt\n", + "import json \n", + "\n", + "fig, axes = plt.subplots(nrows=2, ncols=2)\n", + "\n", + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " input_tensor = preprocess(img) \n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img)\n", + " plt.axis('off')\n", + "\n", + "# loading labels \n", + "with open(\"./data/imagenet_class_index.json\") as json_file: \n", + " d = json.load(json_file)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Throughout this tutorial, we will be making use of some utility functions; `rn50_preprocess` for preprocessing input images, `predict` to use the model for prediction and `benchmark` to benchmark the inference. You do not need to understand/go through these utilities to make use of Torch TensorRT, but are welecomed to do so if you choose." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import time\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "def rn50_preprocess():\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " return preprocess\n", + "\n", + "# decode the results into ([predicted class, description], probability)\n", + "def predict(img_path, model):\n", + " img = Image.open(img_path)\n", + " preprocess = rn50_preprocess()\n", + " input_tensor = preprocess(img)\n", + " input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model\n", + " \n", + " # move the input and model to GPU for speed if available\n", + " if torch.cuda.is_available():\n", + " input_batch = input_batch.to('cuda')\n", + " model.to('cuda')\n", + "\n", + " with torch.no_grad():\n", + " output = model(input_batch)\n", + " # Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes\n", + " sm_output = torch.nn.functional.softmax(output[0], dim=0)\n", + " \n", + " ind = torch.argmax(sm_output)\n", + " return d[str(ind.item())], sm_output[ind] #([predicted class, description], probability)\n", + "\n", + "def benchmark(model, input_shape=(1024, 1, 224, 224), dtype='fp32', nwarmup=50, nruns=10000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%10==0:\n", + " print('Iteration %d/%d, ave batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output features size:\", features.size())\n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the model downloaded and the util functions written, let's just quickly see some predictions, and benchmark the model in its current un-optimized state." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "./data/img0.JPG - Predicted: ['n02110185', 'Siberian_husky'], Probablility: 0.49785590171813965\n", + "./data/img1.JPG - Predicted: ['n01820546', 'lorikeet'], Probablility: 0.6445754766464233\n", + "./data/img2.JPG - Predicted: ['n02481823', 'chimpanzee'], Probablility: 0.9899807572364807\n", + "./data/img3.JPG - Predicted: ['n01749939', 'green_mamba'], Probablility: 0.39485082030296326\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " \n", + " pred, prob = predict(img_path, resnet50_model)\n", + " print('{} - Predicted: {}, Probablility: {}'.format(img_path, pred, prob))\n", + "\n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img);\n", + " plt.axis('off');\n", + " plt.title(pred[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 75.34 ms\n", + "Iteration 20/100, ave batch time 75.33 ms\n", + "Iteration 30/100, ave batch time 75.35 ms\n", + "Iteration 40/100, ave batch time 75.37 ms\n", + "Iteration 50/100, ave batch time 75.38 ms\n", + "Iteration 60/100, ave batch time 75.38 ms\n", + "Iteration 70/100, ave batch time 75.39 ms\n", + "Iteration 80/100, ave batch time 75.39 ms\n", + "Iteration 90/100, ave batch time 75.40 ms\n", + "Iteration 100/100, ave batch time 75.41 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average batch time: 75.41 ms\n" + ] + } + ], + "source": [ + "# Model benchmark without Torch-TensorRT\n", + "model = resnet50_model.eval().to(\"cuda\")\n", + "benchmark(model, input_shape=(128, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 4. Accelerating with Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Onwards to the next step, accelerating with Torch TensorRT. In these examples we showcase the results for FP32 (single precision) and FP16 (half precision). We do not demonstrat specific tuning, just showcase the simplicity of usage. If you want to learn more about the possible customizations, visit our [documentation](https://nvidia.github.io/Torch-TensorRT/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP32 (single precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP32 precision.\n", + "trt_model_fp32 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.float32)],\n", + " enabled_precisions = torch.float32, # Run with FP32\n", + " workspace_size = 1 << 22\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 41.02 ms\n", + "Iteration 20/100, ave batch time 41.12 ms\n", + "Iteration 30/100, ave batch time 41.22 ms\n", + "Iteration 40/100, ave batch time 41.14 ms\n", + "Iteration 50/100, ave batch time 41.20 ms\n", + "Iteration 60/100, ave batch time 41.20 ms\n", + "Iteration 70/100, ave batch time 41.19 ms\n", + "Iteration 80/100, ave batch time 41.23 ms\n", + "Iteration 90/100, ave batch time 41.20 ms\n", + "Iteration 100/100, ave batch time 41.21 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average batch time: 41.21 ms\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input\n", + "benchmark(trt_model_fp32, input_shape=(128, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP16 (half precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x.1\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP16 precision.\n", + "trt_model_fp16 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.half)],\n", + " enabled_precisions = {torch.half}, # Run with FP32\n", + " workspace_size = 1 << 22\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 14.48 ms\n", + "Iteration 20/100, ave batch time 14.58 ms\n", + "Iteration 30/100, ave batch time 14.72 ms\n", + "Iteration 40/100, ave batch time 14.73 ms\n", + "Iteration 50/100, ave batch time 14.70 ms\n", + "Iteration 60/100, ave batch time 14.79 ms\n", + "Iteration 70/100, ave batch time 14.73 ms\n", + "Iteration 80/100, ave batch time 14.69 ms\n", + "Iteration 90/100, ave batch time 14.68 ms\n", + "Iteration 100/100, ave batch time 14.69 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average batch time: 14.69 ms\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input\n", + "benchmark(trt_model_fp16, input_shape=(128, 3, 224, 224), dtype='fp16', nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 5. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT for EfficientNet-B0 model and test the performance impact of the optimization. With Torch-TensorRT, we observe a speedup of **1.84x** with FP32, and **5.2x** with FP16 on an NVIDIA 3090 GPU. These acceleration numbers will vary from GPU to GPU(as well as implementation to implementation based on the ops used) and we encorage you to try out latest generation of Data center compute cards for maximum acceleration.\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. If you run into any issues, you can fill them at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.1.1/_notebooks/dynamic-shapes.html b/docs/v1.1.1/_notebooks/dynamic-shapes.html new file mode 100644 index 0000000000..0fdcbe3ac4 --- /dev/null +++ b/docs/v1.1.1/_notebooks/dynamic-shapes.html @@ -0,0 +1,1962 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Torch-TensorRT - Using Dynamic Shapes — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+
+
[1]:
+
+
+
+
+
+
+# Copyright 2020 NVIDIA Corporation. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
+
+
+

+ Torch-TensorRT - Using Dynamic Shapes + + ¶ + +

+

+ Torch-TensorRT is a compiler for PyTorch/TorchScript, targeting NVIDIA GPUs via NVIDIA’s TensorRT Deep Learning Optimizer and Runtime. Unlike PyTorch’s Just-In-Time (JIT) compiler, Torch-TensorRT is an Ahead-of-Time (AOT) compiler, meaning that before you deploy your TorchScript code, you go through an explicit compile step to convert a standard TorchScript program into an module targeting a TensorRT engine. Torch-TensorRT operates as a PyTorch extention and compiles modules that integrate into +the JIT runtime seamlessly. After compilation using the optimized graph should feel no different than running a TorchScript module. You also have access to TensorRT’s suite of configurations at compile time, so you are able to specify operating precision (FP32/FP16/INT8) and other settings for your module. +

+

+ We highly encorage users to use our NVIDIA’s + + PyTorch container + + to run this notebook. It comes packaged with a host of NVIDIA libraries and optimizations to widely used third party libraries. This container is tested and updated on a monthly cadence! +

+

+ This notebook has the following sections: 1. + + TL;DR Explanation + + 1. + + Setting up the model + + 1. + + Working with Dynamic shapes in Torch TRT + +

+

+ torch_tensorrt.Input( min_shape=(1, 224, 224, 3), opt_shape=(1, 512, 512, 3), max_shape=(1, 1024, 1024, 3), dtype=torch.int32 format=torch.channel_last ) … ``` In this example, we are going to use a simple ResNet model to demonstrate the use of the API. We will be using different batch sizes in the example, but you can use the same method to alter any of the dimensions of the tensor. +

+
+
+
+
[2]:
+
+
+
+
+
+
+!nvidia-smi
+!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org
+
+
+
+
+
+
+
+
+
+
+Mon May  2 20:40:30 2022
++-----------------------------------------------------------------------------+
+| NVIDIA-SMI 470.57.02    Driver Version: 470.57.02    CUDA Version: 11.6     |
+|-------------------------------+----------------------+----------------------+
+| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
+| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
+|                               |                      |               MIG M. |
+|===============================+======================+======================|
+|   0  NVIDIA Graphics...  On   | 00000000:01:00.0 Off |                    0 |
+| 41%   51C    P0    62W / 200W |      0MiB / 47681MiB |      0%      Default |
+|                               |                      |             Disabled |
++-------------------------------+----------------------+----------------------+
+
++-----------------------------------------------------------------------------+
+| Processes:                                                                  |
+|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
+|        ID   ID                                                   Usage      |
+|=============================================================================|
+|  No running processes found                                                 |
++-----------------------------------------------------------------------------+
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Requirement already satisfied: ipywidgets in /opt/conda/lib/python3.8/site-packages (7.7.0)
+Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)
+Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.3.0)
+Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.13.0)
+Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)
+Requirement already satisfied: widgetsnbextension~=3.6.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (3.6.0)
+Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (8.2.0)
+Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (1.1.0)
+Requirement already satisfied: psutil in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (5.9.0)
+Requirement already satisfied: tornado>=6.1 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)
+Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (21.3)
+Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.5)
+Requirement already satisfied: matplotlib-inline>=0.1 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)
+Requirement already satisfied: jupyter-client>=6.1.12 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.2.2)
+Requirement already satisfied: debugpy>=1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.6.0)
+Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.1)
+Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)
+Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)
+Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)
+Requirement already satisfied: stack-data in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)
+Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)
+Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)
+Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.29)
+Requirement already satisfied: pygments>=2.4.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.2)
+Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)
+Requirement already satisfied: pyzmq>=22.3 in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (22.3.0)
+Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (0.4)
+Requirement already satisfied: python-dateutil>=2.8.2 in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (2.8.2)
+Requirement already satisfied: jupyter-core>=4.9.2 in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (4.9.2)
+Requirement already satisfied: jsonschema>=2.6 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)
+Requirement already satisfied: fastjsonschema in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (2.15.3)
+Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (0.18.1)
+Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (21.4.0)
+Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (5.7.0)
+Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (3.8.0)
+Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)
+Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)
+Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.8.2->jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (1.16.0)
+Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.6.0->ipywidgets) (6.4.1)
+Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.1.1)
+Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.14.1)
+Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.8.0)
+Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3.0)
+Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (6.5.0)
+Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.3)
+Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.2.0)
+Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.15.0)
+Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.21)
+Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.1.1)
+Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.7.1)
+Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.2.2)
+Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.8.4)
+Requirement already satisfied: nbclient>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.6.0)
+Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (5.0.0)
+Requirement already satisfied: tinycss2 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.1.1)
+Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.5.0)
+Requirement already satisfied: beautifulsoup4 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (4.11.1)
+Requirement already satisfied: soupsieve>1.2 in /opt/conda/lib/python3.8/site-packages (from beautifulsoup4->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.3.1)
+Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.1)
+Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->ipykernel>=4.5.1->ipywidgets) (3.0.8)
+Requirement already satisfied: asttokens in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (2.0.5)
+Requirement already satisfied: pure-eval in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.2.2)
+Requirement already satisfied: executing in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.8.3)
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+
+
+
+
+
+

+ Setting up the model + + ¶ + +

+

+ In this section, we will: * Get sample data. * Download model from torch hub. * Build simple utility functions +

+

+ Getting sample data + + ¶ + +

+
+
+
+
[3]:
+
+
+
+
+
+
+!mkdir -p ./data
+!wget  -O ./data/img0.JPG "https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630"
+!wget  -O ./data/img1.JPG "https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg"
+!wget  -O ./data/img2.JPG "https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg"
+!wget  -O ./data/img3.JPG "https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg"
+
+!wget  -O ./data/imagenet_class_index.json "https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json"
+
+
+
+
+
+
+
+
+
+
+--2022-05-02 20:40:33--  https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630
+Resolving d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)... 18.65.227.37, 18.65.227.99, 18.65.227.223, ...
+Connecting to d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)|18.65.227.37|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 24112 (24K) [image/jpeg]
+Saving to: ‘./data/img0.JPG’
+
+./data/img0.JPG     100%[===================>]  23.55K  --.-KB/s    in 0.005s
+
+2022-05-02 20:40:33 (4.69 MB/s) - ‘./data/img0.JPG’ saved [24112/24112]
+
+--2022-05-02 20:40:34--  https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg
+Resolving www.hakaimagazine.com (www.hakaimagazine.com)... 164.92.73.117
+Connecting to www.hakaimagazine.com (www.hakaimagazine.com)|164.92.73.117|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 452718 (442K) [image/jpeg]
+Saving to: ‘./data/img1.JPG’
+
+./data/img1.JPG     100%[===================>] 442.11K  --.-KB/s    in 0.02s
+
+2022-05-02 20:40:34 (26.2 MB/s) - ‘./data/img1.JPG’ saved [452718/452718]
+
+--2022-05-02 20:40:34--  https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg
+Resolving www.artis.nl (www.artis.nl)... 94.75.225.20
+Connecting to www.artis.nl (www.artis.nl)|94.75.225.20|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 361413 (353K) [image/jpeg]
+Saving to: ‘./data/img2.JPG’
+
+./data/img2.JPG     100%[===================>] 352.94K   608KB/s    in 0.6s
+
+2022-05-02 20:40:36 (608 KB/s) - ‘./data/img2.JPG’ saved [361413/361413]
+
+--2022-05-02 20:40:37--  https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg
+Resolving www.familyhandyman.com (www.familyhandyman.com)... 104.18.201.107, 104.18.202.107, 2606:4700::6812:c96b, ...
+Connecting to www.familyhandyman.com (www.familyhandyman.com)|104.18.201.107|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 90994 (89K) [image/jpeg]
+Saving to: ‘./data/img3.JPG’
+
+./data/img3.JPG     100%[===================>]  88.86K  --.-KB/s    in 0.006s
+
+2022-05-02 20:40:37 (15.4 MB/s) - ‘./data/img3.JPG’ saved [90994/90994]
+
+--2022-05-02 20:40:37--  https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json
+Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.217.33.238
+Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.217.33.238|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 35363 (35K) [application/octet-stream]
+Saving to: ‘./data/imagenet_class_index.json’
+
+./data/imagenet_cla 100%[===================>]  34.53K  --.-KB/s    in 0.07s
+
+2022-05-02 20:40:38 (489 KB/s) - ‘./data/imagenet_class_index.json’ saved [35363/35363]
+
+
+
+
+
+
+
+
+
[4]:
+
+
+
+
+
+
+# visualizing the downloaded images
+
+from PIL import Image
+from torchvision import transforms
+import matplotlib.pyplot as plt
+import json
+
+fig, axes = plt.subplots(nrows=2, ncols=2)
+
+for i in range(4):
+    img_path = './data/img%d.JPG'%i
+    img = Image.open(img_path)
+    preprocess = transforms.Compose([
+        transforms.Resize(256),
+        transforms.CenterCrop(224),
+        transforms.ToTensor(),
+        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
+    ])
+    input_tensor = preprocess(img)
+    plt.subplot(2,2,i+1)
+    plt.imshow(img)
+    plt.axis('off')
+
+# loading labels
+with open("./data/imagenet_class_index.json") as json_file:
+    d = json.load(json_file)
+
+
+
+
+
+
+
+
+ ../_images/_notebooks_dynamic-shapes_8_0.png +
+
+

+ Download model from torch hub. + + ¶ + +

+
+
+
+
[5]:
+
+
+
+
+
+
+import torch
+
+torch.hub._validate_not_a_forked_repo=lambda a,b,c: True
+
+resnet50_model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)
+resnet50_model.eval()
+
+
+
+
+
+
+
+
+
+
+Using cache found in /root/.cache/torch/hub/pytorch_vision_v0.10.0
+
+
+
+
+
+
+
+
[5]:
+
+
+
+
+
+
+ResNet(
+  (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
+  (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+  (relu): ReLU(inplace=True)
+  (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
+  (layer1): Sequential(
+    (0): Bottleneck(
+      (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+      (downsample): Sequential(
+        (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      )
+    )
+    (1): Bottleneck(
+      (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (2): Bottleneck(
+      (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+  )
+  (layer2): Sequential(
+    (0): Bottleneck(
+      (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+      (downsample): Sequential(
+        (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)
+        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      )
+    )
+    (1): Bottleneck(
+      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (2): Bottleneck(
+      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (3): Bottleneck(
+      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+  )
+  (layer3): Sequential(
+    (0): Bottleneck(
+      (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+      (downsample): Sequential(
+        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)
+        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      )
+    )
+    (1): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (2): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (3): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (4): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (5): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+  )
+  (layer4): Sequential(
+    (0): Bottleneck(
+      (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+      (downsample): Sequential(
+        (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)
+        (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      )
+    )
+    (1): Bottleneck(
+      (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (2): Bottleneck(
+      (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+  )
+  (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))
+  (fc): Linear(in_features=2048, out_features=1000, bias=True)
+)
+
+
+
+
+

+ Build simple utility functions + + ¶ + +

+
+
+
+
[6]:
+
+
+
+
+
+
+import numpy as np
+import time
+import torch.backends.cudnn as cudnn
+cudnn.benchmark = True
+
+def rn50_preprocess():
+    preprocess = transforms.Compose([
+        transforms.Resize(256),
+        transforms.CenterCrop(224),
+        transforms.ToTensor(),
+        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
+    ])
+    return preprocess
+
+# decode the results into ([predicted class, description], probability)
+def predict(img_path, model):
+    img = Image.open(img_path)
+    preprocess = rn50_preprocess()
+    input_tensor = preprocess(img)
+    input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model
+
+    # move the input and model to GPU for speed if available
+    if torch.cuda.is_available():
+        input_batch = input_batch.to('cuda')
+        model.to('cuda')
+
+    with torch.no_grad():
+        output = model(input_batch)
+        # Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes
+        sm_output = torch.nn.functional.softmax(output[0], dim=0)
+
+    ind = torch.argmax(sm_output)
+    return d[str(ind.item())], sm_output[ind] #([predicted class, description], probability)
+
+# benchmarking models
+def benchmark(model, input_shape=(1024, 1, 224, 224), dtype='fp32', nwarmup=50, nruns=10000):
+    input_data = torch.randn(input_shape)
+    input_data = input_data.to("cuda")
+    if dtype=='fp16':
+        input_data = input_data.half()
+
+    print("Warm up ...")
+    with torch.no_grad():
+        for _ in range(nwarmup):
+            features = model(input_data)
+    torch.cuda.synchronize()
+    print("Start timing ...")
+    timings = []
+    with torch.no_grad():
+        for i in range(1, nruns+1):
+            start_time = time.time()
+            features = model(input_data)
+            torch.cuda.synchronize()
+            end_time = time.time()
+            timings.append(end_time - start_time)
+            if i%10==0:
+                print('Iteration %d/%d, ave batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))
+                print('Images processed per second=', int(1000*input_shape[0]/(np.mean(timings)*1000)))
+    print("Input shape:", input_data.size())
+    print("Output features size:", features.size())
+    print('Average batch time: %.2f ms'%(np.mean(timings)*1000))
+
+
+
+
+

+ Let’s test our util functions on the model we have set up, starting with simple predictions +

+
+
+
+
[7]:
+
+
+
+
+
+
+for i in range(4):
+    img_path = './data/img%d.JPG'%i
+    img = Image.open(img_path)
+
+    pred, prob = predict(img_path, resnet50_model)
+    print('{} - Predicted: {}, Probablility: {}'.format(img_path, pred, prob))
+
+    plt.subplot(2,2,i+1)
+    plt.imshow(img);
+    plt.axis('off');
+    plt.title(pred[1])
+
+
+
+
+
+
+
+
+
+
+./data/img0.JPG - Predicted: ['n02110185', 'Siberian_husky'], Probablility: 0.49788108468055725
+./data/img1.JPG - Predicted: ['n01820546', 'lorikeet'], Probablility: 0.6442285180091858
+./data/img2.JPG - Predicted: ['n02481823', 'chimpanzee'], Probablility: 0.9899841547012329
+./data/img3.JPG - Predicted: ['n01749939', 'green_mamba'], Probablility: 0.45675724744796753
+
+
+
+
+
+
+
+
+ ../_images/_notebooks_dynamic-shapes_14_1.png +
+
+

+ Onwards, to benchmarking. +

+
+
+
+
[8]:
+
+
+
+
+
+
+# Model benchmark without Torch-TensorRT
+model = resnet50_model.eval().to("cuda")
+benchmark(model, input_shape=(16, 3, 224, 224), nruns=100)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, ave batch time 10.01 ms
+Images processed per second= 1598
+Iteration 20/100, ave batch time 10.01 ms
+Images processed per second= 1598
+Iteration 30/100, ave batch time 10.21 ms
+Images processed per second= 1566
+Iteration 40/100, ave batch time 10.33 ms
+Images processed per second= 1549
+Iteration 50/100, ave batch time 10.31 ms
+Images processed per second= 1552
+Iteration 60/100, ave batch time 10.25 ms
+Images processed per second= 1560
+Iteration 70/100, ave batch time 10.20 ms
+Images processed per second= 1568
+Iteration 80/100, ave batch time 10.18 ms
+Images processed per second= 1572
+Iteration 90/100, ave batch time 10.16 ms
+Images processed per second= 1574
+Iteration 100/100, ave batch time 10.15 ms
+Images processed per second= 1575
+Input shape: torch.Size([16, 3, 224, 224])
+Output features size: torch.Size([16, 1000])
+Average batch time: 10.15 ms
+
+
+
+
+
+

+ Benchmarking with Torch-TRT (without dynamic shapes) + + ¶ + +

+
+
+
+
[9]:
+
+
+
+
+
+
+import torch_tensorrt
+
+trt_model_without_ds = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((32, 3, 224, 224), dtype=torch.float32)],
+    enabled_precisions = torch.float32, # Run with FP32
+    workspace_size = 1 << 33
+)
+
+
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+
+
+
+
+
+
+
+
[10]:
+
+
+
+
+
+
+benchmark(trt_model_without_ds, input_shape=(32, 3, 224, 224), nruns=100)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, ave batch time 6.10 ms
+Images processed per second= 5242
+Iteration 20/100, ave batch time 6.12 ms
+Images processed per second= 5231
+Iteration 30/100, ave batch time 6.14 ms
+Images processed per second= 5215
+Iteration 40/100, ave batch time 6.14 ms
+Images processed per second= 5207
+Iteration 50/100, ave batch time 6.15 ms
+Images processed per second= 5202
+Iteration 60/100, ave batch time 6.28 ms
+Images processed per second= 5094
+Iteration 70/100, ave batch time 6.26 ms
+Images processed per second= 5110
+Iteration 80/100, ave batch time 6.25 ms
+Images processed per second= 5118
+Iteration 90/100, ave batch time 6.25 ms
+Images processed per second= 5115
+Iteration 100/100, ave batch time 6.40 ms
+Images processed per second= 5002
+Input shape: torch.Size([32, 3, 224, 224])
+Output features size: torch.Size([32, 1000])
+Average batch time: 6.40 ms
+
+
+
+
+

+ With the baseline ready, we can proceed to the section working discussing dynamic shapes! +

+
+

+ Working with Dynamic shapes in Torch TRT + + ¶ + +

+

+ Enabling “Dynamic Shaped” tensors to be used is essentially enabling the ability to defer defining the shape of tensors until runetime. Torch TensorRT simply leverages TensorRT’s Dynamic shape support. You can read more about TensorRT’s implementation in the + + TensorRT Documentation + + . +

+

+ To make use of dynamic shapes, you need to provide three shapes: * + + + min_shape + + + : The minimum size of the tensor considered for optimizations. * + + + opt_shape + + + : The optimizations will be done with an effort to maximize performance for this shape. * + + + min_shape + + + : The maximum size of the tensor considered for optimizations. +

+

+ Generally, users can expect best performance within the specified ranges. Performance for other shapes may be be lower for other shapes (depending on the model ops and GPU used) +

+

+ In the following example, we will showcase varing batch size, which is the zeroth dimension of our input tensors. As Convolution operations require that the channel dimension be a build-time constant, we won’t be changing sizes of other channels in this example, but for models which contain ops conducive to changes in other channels, this functionality can be freely used. +

+
+
+
+
[11]:
+
+
+
+
+
+
+# The compiled module will have precision as specified by "op_precision".
+# Here, it will have FP32 precision.
+trt_model_with_ds = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input(
+        min_shape=(16, 3, 224, 224),
+        opt_shape=(32, 3, 224, 224),
+        max_shape=(64, 3, 224, 224),
+        dtype=torch.float32)],
+    enabled_precisions = torch.float32, # Run with FP32
+    workspace_size = 1 << 33
+)
+
+
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+
+
+
+
+
+
+
+
[12]:
+
+
+
+
+
+
+benchmark(trt_model_with_ds, input_shape=(16, 3, 224, 224), nruns=100)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, ave batch time 3.88 ms
+Images processed per second= 4122
+Iteration 20/100, ave batch time 3.89 ms
+Images processed per second= 4116
+Iteration 30/100, ave batch time 3.88 ms
+Images processed per second= 4123
+Iteration 40/100, ave batch time 3.86 ms
+Images processed per second= 4142
+Iteration 50/100, ave batch time 3.85 ms
+Images processed per second= 4156
+Iteration 60/100, ave batch time 3.84 ms
+Images processed per second= 4166
+Iteration 70/100, ave batch time 3.84 ms
+Images processed per second= 4170
+Iteration 80/100, ave batch time 3.83 ms
+Images processed per second= 4172
+Iteration 90/100, ave batch time 3.83 ms
+Images processed per second= 4176
+Iteration 100/100, ave batch time 3.83 ms
+Images processed per second= 4178
+Input shape: torch.Size([16, 3, 224, 224])
+Output features size: torch.Size([16, 1000])
+Average batch time: 3.83 ms
+
+
+
+
+
+
+
+
[13]:
+
+
+
+
+
+
+benchmark(trt_model_with_ds, input_shape=(32, 3, 224, 224), nruns=100)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, ave batch time 6.71 ms
+Images processed per second= 4767
+Iteration 20/100, ave batch time 6.48 ms
+Images processed per second= 4935
+Iteration 30/100, ave batch time 6.39 ms
+Images processed per second= 5005
+Iteration 40/100, ave batch time 6.38 ms
+Images processed per second= 5014
+Iteration 50/100, ave batch time 6.38 ms
+Images processed per second= 5016
+Iteration 60/100, ave batch time 6.37 ms
+Images processed per second= 5020
+Iteration 70/100, ave batch time 6.37 ms
+Images processed per second= 5024
+Iteration 80/100, ave batch time 6.37 ms
+Images processed per second= 5027
+Iteration 90/100, ave batch time 6.37 ms
+Images processed per second= 5026
+Iteration 100/100, ave batch time 6.38 ms
+Images processed per second= 5018
+Input shape: torch.Size([32, 3, 224, 224])
+Output features size: torch.Size([32, 1000])
+Average batch time: 6.38 ms
+
+
+
+
+
+
+
+
[14]:
+
+
+
+
+
+
+benchmark(trt_model_with_ds, input_shape=(64, 3, 224, 224), nruns=100)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, ave batch time 12.31 ms
+Images processed per second= 5197
+Iteration 20/100, ave batch time 12.42 ms
+Images processed per second= 5153
+Iteration 30/100, ave batch time 12.85 ms
+Images processed per second= 4980
+Iteration 40/100, ave batch time 12.71 ms
+Images processed per second= 5033
+Iteration 50/100, ave batch time 12.67 ms
+Images processed per second= 5052
+Iteration 60/100, ave batch time 12.63 ms
+Images processed per second= 5067
+Iteration 70/100, ave batch time 12.58 ms
+Images processed per second= 5088
+Iteration 80/100, ave batch time 12.56 ms
+Images processed per second= 5096
+Iteration 90/100, ave batch time 12.55 ms
+Images processed per second= 5100
+Iteration 100/100, ave batch time 12.57 ms
+Images processed per second= 5091
+Input shape: torch.Size([64, 3, 224, 224])
+Output features size: torch.Size([64, 1000])
+Average batch time: 12.57 ms
+
+
+
+
+

+ What’s Next? + + ¶ + +

+

+ Check out the + + TensorRT Getting started page + + for more tutorials, or visit the Torch-TensorRT + + documentation + + for more information! +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_notebooks/dynamic-shapes.ipynb b/docs/v1.1.1/_notebooks/dynamic-shapes.ipynb new file mode 100644 index 0000000000..a0ceaab576 --- /dev/null +++ b/docs/v1.1.1/_notebooks/dynamic-shapes.ipynb @@ -0,0 +1,1023 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "332a2ed8", + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2020 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "id": "18ee9d62", + "metadata": {}, + "source": [ + "# Torch-TensorRT - Using Dynamic Shapes" + ] + }, + { + "cell_type": "markdown", + "id": "73703695", + "metadata": {}, + "source": [ + "Torch-TensorRT is a compiler for PyTorch/TorchScript, targeting NVIDIA GPUs via NVIDIA's TensorRT Deep Learning Optimizer and Runtime. Unlike PyTorch's Just-In-Time (JIT) compiler, Torch-TensorRT is an Ahead-of-Time (AOT) compiler, meaning that before you deploy your TorchScript code, you go through an explicit compile step to convert a standard TorchScript program into an module targeting a TensorRT engine. Torch-TensorRT operates as a PyTorch extention and compiles modules that integrate into the JIT runtime seamlessly. After compilation using the optimized graph should feel no different than running a TorchScript module. You also have access to TensorRT's suite of configurations at compile time, so you are able to specify operating precision (FP32/FP16/INT8) and other settings for your module.\n", + "\n", + "We highly encorage users to use our NVIDIA's [PyTorch container](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch) to run this notebook. It comes packaged with a host of NVIDIA libraries and optimizations to widely used third party libraries. This container is tested and updated on a monthly cadence!\n", + "\n", + "This notebook has the following sections:\n", + "1. [TL;DR Explanation](#1)\n", + "1. [Setting up the model](#2)\n", + "1. [Working with Dynamic shapes in Torch TRT](#3)" + ] + }, + { + "cell_type": "markdown", + "id": "1603028d", + "metadata": {}, + "source": [ + "---\n", + "## TL;DR Explanation\n", + "\n", + "Making use of Dynamic Shaped Tensors in Torch TensorRT is quite simple. Let's say you are using the `torch_tensorrt.compile(...)` function to compile a torchscript module.\n", + "\n", + "One of the `args` in this function in this function is `input`: which defines an input to a module in terms of expected shape, data type and tensor format: `torch_tensorrt.Input`. \n", + "\n", + "For the purposes of this walkthrough we just need three `kwargs`: `min_shape`, `opt_shape` and `max_shape`. \n", + "```\n", + "...\n", + "torch_tensorrt.Input(\n", + " min_shape=(1, 224, 224, 3),\n", + " opt_shape=(1, 512, 512, 3),\n", + " max_shape=(1, 1024, 1024, 3),\n", + " dtype=torch.int32\n", + " format=torch.channel_last\n", + " )\n", + "...\n", + "```\n", + "In this example, we are going to use a simple ResNet model to demonstrate the use of the API. We will be using different batch sizes in the example, but you can use the same method to alter any of the dimensions of the tensor." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "db3493d2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mon May 2 20:40:30 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA Graphics... On | 00000000:01:00.0 Off | 0 |\n", + "| 41% 51C P0 62W / 200W | 0MiB / 47681MiB | 0% Default |\n", + "| | | Disabled |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: ipywidgets in /opt/conda/lib/python3.8/site-packages (7.7.0)\n", + "Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.3.0)\n", + "Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.13.0)\n", + "Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)\n", + "Requirement already satisfied: widgetsnbextension~=3.6.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (3.6.0)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (8.2.0)\n", + "Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (1.1.0)\n", + "Requirement already satisfied: psutil in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (5.9.0)\n", + "Requirement already satisfied: tornado>=6.1 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (21.3)\n", + "Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.5)\n", + "Requirement already satisfied: matplotlib-inline>=0.1 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)\n", + "Requirement already satisfied: jupyter-client>=6.1.12 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.2.2)\n", + "Requirement already satisfied: debugpy>=1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.6.0)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.1)\n", + "Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: stack-data in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.29)\n", + "Requirement already satisfied: pygments>=2.4.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.2)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "Requirement already satisfied: pyzmq>=22.3 in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (22.3.0)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (0.4)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (2.8.2)\n", + "Requirement already satisfied: jupyter-core>=4.9.2 in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (4.9.2)\n", + "Requirement already satisfied: jsonschema>=2.6 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)\n", + "Requirement already satisfied: fastjsonschema in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (2.15.3)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (21.4.0)\n", + "Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (5.7.0)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (3.8.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.8.2->jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (1.16.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.6.0->ipywidgets) (6.4.1)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.1.1)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.14.1)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.8.0)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3.0)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (6.5.0)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.3)\n", + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.21)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.1.1)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.7.1)\n", + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.2.2)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.8.4)\n", + "Requirement already satisfied: nbclient>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.6.0)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (5.0.0)\n", + "Requirement already satisfied: tinycss2 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.1.1)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.5.0)\n", + "Requirement already satisfied: beautifulsoup4 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (4.11.1)\n", + "Requirement already satisfied: soupsieve>1.2 in /opt/conda/lib/python3.8/site-packages (from beautifulsoup4->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.3.1)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.1)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->ipykernel>=4.5.1->ipywidgets) (3.0.8)\n", + "Requirement already satisfied: asttokens in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (2.0.5)\n", + "Requirement already satisfied: pure-eval in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.2.2)\n", + "Requirement already satisfied: executing in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "!nvidia-smi\n", + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org" + ] + }, + { + "cell_type": "markdown", + "id": "0ed1b4f7", + "metadata": {}, + "source": [ + "---\n", + "## Setting up the model\n", + "\n", + "In this section, we will:\n", + "* Get sample data.\n", + "* Download model from torch hub.\n", + "* Build simple utility functions" + ] + }, + { + "cell_type": "markdown", + "id": "5934504f", + "metadata": {}, + "source": [ + "### Getting sample data" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e46814cc", + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2022-05-02 20:40:33-- https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\n", + "Resolving d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)... 18.65.227.37, 18.65.227.99, 18.65.227.223, ...\n", + "Connecting to d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)|18.65.227.37|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 24112 (24K) [image/jpeg]\n", + "Saving to: ‘./data/img0.JPG’\n", + "\n", + "./data/img0.JPG 100%[===================>] 23.55K --.-KB/s in 0.005s \n", + "\n", + "2022-05-02 20:40:33 (4.69 MB/s) - ‘./data/img0.JPG’ saved [24112/24112]\n", + "\n", + "--2022-05-02 20:40:34-- https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\n", + "Resolving www.hakaimagazine.com (www.hakaimagazine.com)... 164.92.73.117\n", + "Connecting to www.hakaimagazine.com (www.hakaimagazine.com)|164.92.73.117|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 452718 (442K) [image/jpeg]\n", + "Saving to: ‘./data/img1.JPG’\n", + "\n", + "./data/img1.JPG 100%[===================>] 442.11K --.-KB/s in 0.02s \n", + "\n", + "2022-05-02 20:40:34 (26.2 MB/s) - ‘./data/img1.JPG’ saved [452718/452718]\n", + "\n", + "--2022-05-02 20:40:34-- https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\n", + "Resolving www.artis.nl (www.artis.nl)... 94.75.225.20\n", + "Connecting to www.artis.nl (www.artis.nl)|94.75.225.20|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 361413 (353K) [image/jpeg]\n", + "Saving to: ‘./data/img2.JPG’\n", + "\n", + "./data/img2.JPG 100%[===================>] 352.94K 608KB/s in 0.6s \n", + "\n", + "2022-05-02 20:40:36 (608 KB/s) - ‘./data/img2.JPG’ saved [361413/361413]\n", + "\n", + "--2022-05-02 20:40:37-- https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\n", + "Resolving www.familyhandyman.com (www.familyhandyman.com)... 104.18.201.107, 104.18.202.107, 2606:4700::6812:c96b, ...\n", + "Connecting to www.familyhandyman.com (www.familyhandyman.com)|104.18.201.107|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 90994 (89K) [image/jpeg]\n", + "Saving to: ‘./data/img3.JPG’\n", + "\n", + "./data/img3.JPG 100%[===================>] 88.86K --.-KB/s in 0.006s \n", + "\n", + "2022-05-02 20:40:37 (15.4 MB/s) - ‘./data/img3.JPG’ saved [90994/90994]\n", + "\n", + "--2022-05-02 20:40:37-- https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\n", + "Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.217.33.238\n", + "Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.217.33.238|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 35363 (35K) [application/octet-stream]\n", + "Saving to: ‘./data/imagenet_class_index.json’\n", + "\n", + "./data/imagenet_cla 100%[===================>] 34.53K --.-KB/s in 0.07s \n", + "\n", + "2022-05-02 20:40:38 (489 KB/s) - ‘./data/imagenet_class_index.json’ saved [35363/35363]\n", + "\n" + ] + } + ], + "source": [ + "!mkdir -p ./data\n", + "!wget -O ./data/img0.JPG \"https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\"\n", + "!wget -O ./data/img1.JPG \"https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\"\n", + "!wget -O ./data/img2.JPG \"https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\"\n", + "!wget -O ./data/img3.JPG \"https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\"\n", + "\n", + "!wget -O ./data/imagenet_class_index.json \"https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7392a8ec", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# visualizing the downloaded images\n", + "\n", + "from PIL import Image\n", + "from torchvision import transforms\n", + "import matplotlib.pyplot as plt\n", + "import json \n", + "\n", + "fig, axes = plt.subplots(nrows=2, ncols=2)\n", + "\n", + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " input_tensor = preprocess(img) \n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img)\n", + " plt.axis('off')\n", + "\n", + "# loading labels \n", + "with open(\"./data/imagenet_class_index.json\") as json_file: \n", + " d = json.load(json_file)" + ] + }, + { + "cell_type": "markdown", + "id": "1374edab", + "metadata": {}, + "source": [ + "### Download model from torch hub." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "659fa798", + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using cache found in /root/.cache/torch/hub/pytorch_vision_v0.10.0\n" + ] + }, + { + "data": { + "text/plain": [ + "ResNet(\n", + " (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n", + " (layer1): Sequential(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (layer2): Sequential(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (3): Bottleneck(\n", + " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (layer3): Sequential(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (3): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (4): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (5): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (layer4): Sequential(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n", + " (fc): Linear(in_features=2048, out_features=1000, bias=True)\n", + ")" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import torch\n", + "\n", + "torch.hub._validate_not_a_forked_repo=lambda a,b,c: True\n", + "\n", + "resnet50_model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)\n", + "resnet50_model.eval()" + ] + }, + { + "cell_type": "markdown", + "id": "0a67e8db", + "metadata": {}, + "source": [ + "### Build simple utility functions" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "60286396", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import time\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "def rn50_preprocess():\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " return preprocess\n", + "\n", + "# decode the results into ([predicted class, description], probability)\n", + "def predict(img_path, model):\n", + " img = Image.open(img_path)\n", + " preprocess = rn50_preprocess()\n", + " input_tensor = preprocess(img)\n", + " input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model\n", + " \n", + " # move the input and model to GPU for speed if available\n", + " if torch.cuda.is_available():\n", + " input_batch = input_batch.to('cuda')\n", + " model.to('cuda')\n", + "\n", + " with torch.no_grad():\n", + " output = model(input_batch)\n", + " # Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes\n", + " sm_output = torch.nn.functional.softmax(output[0], dim=0)\n", + " \n", + " ind = torch.argmax(sm_output)\n", + " return d[str(ind.item())], sm_output[ind] #([predicted class, description], probability)\n", + "\n", + "# benchmarking models\n", + "def benchmark(model, input_shape=(1024, 1, 224, 224), dtype='fp32', nwarmup=50, nruns=10000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%10==0:\n", + " print('Iteration %d/%d, ave batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + " print('Images processed per second=', int(1000*input_shape[0]/(np.mean(timings)*1000)))\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output features size:\", features.size())\n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))" + ] + }, + { + "cell_type": "markdown", + "id": "21402d53", + "metadata": {}, + "source": [ + "Let's test our util functions on the model we have set up, starting with simple predictions" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "bb3e4a0d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "./data/img0.JPG - Predicted: ['n02110185', 'Siberian_husky'], Probablility: 0.49788108468055725\n", + "./data/img1.JPG - Predicted: ['n01820546', 'lorikeet'], Probablility: 0.6442285180091858\n", + "./data/img2.JPG - Predicted: ['n02481823', 'chimpanzee'], Probablility: 0.9899841547012329\n", + "./data/img3.JPG - Predicted: ['n01749939', 'green_mamba'], Probablility: 0.45675724744796753\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " \n", + " pred, prob = predict(img_path, resnet50_model)\n", + " print('{} - Predicted: {}, Probablility: {}'.format(img_path, pred, prob))\n", + "\n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img);\n", + " plt.axis('off');\n", + " plt.title(pred[1])" + ] + }, + { + "cell_type": "markdown", + "id": "2fc7f347", + "metadata": {}, + "source": [ + "Onwards, to benchmarking." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "f182b433", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 10.01 ms\n", + "Images processed per second= 1598\n", + "Iteration 20/100, ave batch time 10.01 ms\n", + "Images processed per second= 1598\n", + "Iteration 30/100, ave batch time 10.21 ms\n", + "Images processed per second= 1566\n", + "Iteration 40/100, ave batch time 10.33 ms\n", + "Images processed per second= 1549\n", + "Iteration 50/100, ave batch time 10.31 ms\n", + "Images processed per second= 1552\n", + "Iteration 60/100, ave batch time 10.25 ms\n", + "Images processed per second= 1560\n", + "Iteration 70/100, ave batch time 10.20 ms\n", + "Images processed per second= 1568\n", + "Iteration 80/100, ave batch time 10.18 ms\n", + "Images processed per second= 1572\n", + "Iteration 90/100, ave batch time 10.16 ms\n", + "Images processed per second= 1574\n", + "Iteration 100/100, ave batch time 10.15 ms\n", + "Images processed per second= 1575\n", + "Input shape: torch.Size([16, 3, 224, 224])\n", + "Output features size: torch.Size([16, 1000])\n", + "Average batch time: 10.15 ms\n" + ] + } + ], + "source": [ + "# Model benchmark without Torch-TensorRT\n", + "model = resnet50_model.eval().to(\"cuda\")\n", + "benchmark(model, input_shape=(16, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "id": "21e56cdf", + "metadata": {}, + "source": [ + "---\n", + "## Benchmarking with Torch-TRT (without dynamic shapes)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8c9ed780", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "trt_model_without_ds = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((32, 3, 224, 224), dtype=torch.float32)],\n", + " enabled_precisions = torch.float32, # Run with FP32\n", + " workspace_size = 1 << 33\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "58a4ba94", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 6.10 ms\n", + "Images processed per second= 5242\n", + "Iteration 20/100, ave batch time 6.12 ms\n", + "Images processed per second= 5231\n", + "Iteration 30/100, ave batch time 6.14 ms\n", + "Images processed per second= 5215\n", + "Iteration 40/100, ave batch time 6.14 ms\n", + "Images processed per second= 5207\n", + "Iteration 50/100, ave batch time 6.15 ms\n", + "Images processed per second= 5202\n", + "Iteration 60/100, ave batch time 6.28 ms\n", + "Images processed per second= 5094\n", + "Iteration 70/100, ave batch time 6.26 ms\n", + "Images processed per second= 5110\n", + "Iteration 80/100, ave batch time 6.25 ms\n", + "Images processed per second= 5118\n", + "Iteration 90/100, ave batch time 6.25 ms\n", + "Images processed per second= 5115\n", + "Iteration 100/100, ave batch time 6.40 ms\n", + "Images processed per second= 5002\n", + "Input shape: torch.Size([32, 3, 224, 224])\n", + "Output features size: torch.Size([32, 1000])\n", + "Average batch time: 6.40 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_model_without_ds, input_shape=(32, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "id": "cd233b85", + "metadata": {}, + "source": [ + "With the baseline ready, we can proceed to the section working discussing dynamic shapes!" + ] + }, + { + "cell_type": "markdown", + "id": "bd5746da", + "metadata": {}, + "source": [ + "---\n", + "## Working with Dynamic shapes in Torch TRT\n", + "\n", + "Enabling \"Dynamic Shaped\" tensors to be used is essentially enabling the ability to defer defining the shape of tensors until runetime. Torch TensorRT simply leverages TensorRT's Dynamic shape support. You can read more about TensorRT's implementation in the [TensorRT Documentation](https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#work_dynamic_shapes).\n", + "\n", + "#### How can you use this feature?\n", + "\n", + "To make use of dynamic shapes, you need to provide three shapes:\n", + "* `min_shape`: The minimum size of the tensor considered for optimizations.\n", + "* `opt_shape`: The optimizations will be done with an effort to maximize performance for this shape.\n", + "* `min_shape`: The maximum size of the tensor considered for optimizations.\n", + "\n", + "Generally, users can expect best performance within the specified ranges. Performance for other shapes may be be lower for other shapes (depending on the model ops and GPU used)\n", + "\n", + "In the following example, we will showcase varing batch size, which is the zeroth dimension of our input tensors. As Convolution operations require that the channel dimension be a build-time constant, we won't be changing sizes of other channels in this example, but for models which contain ops conducive to changes in other channels, this functionality can be freely used." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "9a04007d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n" + ] + } + ], + "source": [ + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP32 precision.\n", + "trt_model_with_ds = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input(\n", + " min_shape=(16, 3, 224, 224),\n", + " opt_shape=(32, 3, 224, 224),\n", + " max_shape=(64, 3, 224, 224),\n", + " dtype=torch.float32)],\n", + " enabled_precisions = torch.float32, # Run with FP32\n", + " workspace_size = 1 << 33\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "f0babc85", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 3.88 ms\n", + "Images processed per second= 4122\n", + "Iteration 20/100, ave batch time 3.89 ms\n", + "Images processed per second= 4116\n", + "Iteration 30/100, ave batch time 3.88 ms\n", + "Images processed per second= 4123\n", + "Iteration 40/100, ave batch time 3.86 ms\n", + "Images processed per second= 4142\n", + "Iteration 50/100, ave batch time 3.85 ms\n", + "Images processed per second= 4156\n", + "Iteration 60/100, ave batch time 3.84 ms\n", + "Images processed per second= 4166\n", + "Iteration 70/100, ave batch time 3.84 ms\n", + "Images processed per second= 4170\n", + "Iteration 80/100, ave batch time 3.83 ms\n", + "Images processed per second= 4172\n", + "Iteration 90/100, ave batch time 3.83 ms\n", + "Images processed per second= 4176\n", + "Iteration 100/100, ave batch time 3.83 ms\n", + "Images processed per second= 4178\n", + "Input shape: torch.Size([16, 3, 224, 224])\n", + "Output features size: torch.Size([16, 1000])\n", + "Average batch time: 3.83 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_model_with_ds, input_shape=(16, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "e86a3541", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 6.71 ms\n", + "Images processed per second= 4767\n", + "Iteration 20/100, ave batch time 6.48 ms\n", + "Images processed per second= 4935\n", + "Iteration 30/100, ave batch time 6.39 ms\n", + "Images processed per second= 5005\n", + "Iteration 40/100, ave batch time 6.38 ms\n", + "Images processed per second= 5014\n", + "Iteration 50/100, ave batch time 6.38 ms\n", + "Images processed per second= 5016\n", + "Iteration 60/100, ave batch time 6.37 ms\n", + "Images processed per second= 5020\n", + "Iteration 70/100, ave batch time 6.37 ms\n", + "Images processed per second= 5024\n", + "Iteration 80/100, ave batch time 6.37 ms\n", + "Images processed per second= 5027\n", + "Iteration 90/100, ave batch time 6.37 ms\n", + "Images processed per second= 5026\n", + "Iteration 100/100, ave batch time 6.38 ms\n", + "Images processed per second= 5018\n", + "Input shape: torch.Size([32, 3, 224, 224])\n", + "Output features size: torch.Size([32, 1000])\n", + "Average batch time: 6.38 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_model_with_ds, input_shape=(32, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "35800f63", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 12.31 ms\n", + "Images processed per second= 5197\n", + "Iteration 20/100, ave batch time 12.42 ms\n", + "Images processed per second= 5153\n", + "Iteration 30/100, ave batch time 12.85 ms\n", + "Images processed per second= 4980\n", + "Iteration 40/100, ave batch time 12.71 ms\n", + "Images processed per second= 5033\n", + "Iteration 50/100, ave batch time 12.67 ms\n", + "Images processed per second= 5052\n", + "Iteration 60/100, ave batch time 12.63 ms\n", + "Images processed per second= 5067\n", + "Iteration 70/100, ave batch time 12.58 ms\n", + "Images processed per second= 5088\n", + "Iteration 80/100, ave batch time 12.56 ms\n", + "Images processed per second= 5096\n", + "Iteration 90/100, ave batch time 12.55 ms\n", + "Images processed per second= 5100\n", + "Iteration 100/100, ave batch time 12.57 ms\n", + "Images processed per second= 5091\n", + "Input shape: torch.Size([64, 3, 224, 224])\n", + "Output features size: torch.Size([64, 1000])\n", + "Average batch time: 12.57 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_model_with_ds, input_shape=(64, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "id": "f87a75bd", + "metadata": {}, + "source": [ + "## What's Next?\n", + "\n", + "Check out the [TensorRT Getting started page](https://developer.nvidia.com/tensorrt-getting-started) for more tutorials, or visit the Torch-TensorRT [documentation](https://nvidia.github.io/Torch-TensorRT/) for more information!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/v1.1.1/_notebooks/lenet-getting-started.html b/docs/v1.1.1/_notebooks/lenet-getting-started.html new file mode 100644 index 0000000000..f39052cfbf --- /dev/null +++ b/docs/v1.1.1/_notebooks/lenet-getting-started.html @@ -0,0 +1,1783 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Torch-TensorRT Getting Started - LeNet — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+
+
[1]:
+
+
+
+
+
+
+# Copyright 2019 NVIDIA Corporation. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
+
+
+

+ 8c61796f30be47b69e6e6bf3e244c0fd +

+

+ Torch-TensorRT Getting Started - LeNet + + ¶ + +

+

+ Overview + + ¶ + +

+

+ In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the +best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch’s JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new +world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference. +

+

+ When deploying on NVIDIA GPUs TensorRT, NVIDIA’s Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA’s Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that +perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device. +

+

+ Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch. +

+

+ Learning objectives + + ¶ + +

+

+ This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a simple LeNet network. +

+

+ Content + + ¶ + +

+
    +
  1. +

    + + Requirements + +

    +
  2. +
  3. +

    + + Creating TorchScript modules + +

    +
  4. +
  5. +

    + + Compiling with Torch-TensorRT + +

    +
  6. +
+

+ ## 1. Requirements +

+

+ Follow the steps in + + + notebooks/README + + + to prepare a Docker container, within which you can run this notebook. +

+
+
+
+
[1]:
+
+
+
+
+
+
+!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org
+!nvidia-smi
+
+
+
+
+
+
+
+
+
+
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Collecting ipywidgets
+  Downloading ipywidgets-7.6.5-py2.py3-none-any.whl (121 kB)
+     |████████████████████████████████| 121 kB 12.7 MB/s eta 0:00:01
+Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)
+Collecting jupyterlab-widgets>=1.0.0
+  Downloading jupyterlab_widgets-1.0.2-py3-none-any.whl (243 kB)
+     |████████████████████████████████| 243 kB 115.0 MB/s eta 0:00:01
+Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)
+Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.3)
+Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.7.0)
+Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (7.31.0)
+Collecting widgetsnbextension~=3.5.0
+  Downloading widgetsnbextension-3.5.2-py2.py3-none-any.whl (1.6 MB)
+     |████████████████████████████████| 1.6 MB 122.5 MB/s eta 0:00:01
+Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)
+Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.1)
+Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.1.2)
+Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.4)
+Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)
+Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)
+Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)
+Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)
+Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)
+Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.24)
+Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)
+Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.0)
+Requirement already satisfied: pygments in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.1)
+Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)
+Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (22.3.0)
+Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (0.3)
+Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (4.9.1)
+Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (2.8.2)
+Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)
+Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.4.0)
+Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (5.4.0)
+Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.18.1)
+Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.7.0)
+Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)
+Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)
+Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (1.16.0)
+Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.5.0->ipywidgets) (6.4.1)
+Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.12.1)
+Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.13.0)
+Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.3)
+Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3.0)
+Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (6.4.0)
+Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.8.0)
+Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.2.0)
+Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.15.0)
+Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.21)
+Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.0.1)
+Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.0)
+Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.7.1)
+Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.1.2)
+Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.10)
+Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (4.1.0)
+Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.5.0)
+Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.8.4)
+Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.1)
+Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3)
+Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.6)
+Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets
+Successfully installed ipywidgets-7.6.5 jupyterlab-widgets-1.0.2 widgetsnbextension-3.5.2
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+Thu Feb 10 22:01:27 2022
++-----------------------------------------------------------------------------+
+| NVIDIA-SMI 510.39.01    Driver Version: 510.39.01    CUDA Version: 11.6     |
+|-------------------------------+----------------------+----------------------+
+| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
+| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
+|                               |                      |               MIG M. |
+|===============================+======================+======================|
+|   0  NVIDIA GeForce ...  On   | 00000000:09:00.0 Off |                  N/A |
+|  0%   42C    P8    20W / 320W |      0MiB / 10240MiB |      0%      Default |
+|                               |                      |                  N/A |
++-------------------------------+----------------------+----------------------+
+
++-----------------------------------------------------------------------------+
+| Processes:                                                                  |
+|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
+|        ID   ID                                                   Usage      |
+|=============================================================================|
+|  No running processes found                                                 |
++-----------------------------------------------------------------------------+
+
+
+
+
+

+ ## 2. Creating TorchScript modules +

+

+ Here we create two submodules for a feature extractor and a classifier and stitch them together in a single LeNet module. In this case this is overkill but modules give us granular control over our program including where we decide to optimize and where we don’t. It is also the unit that the TorchScript compiler operates on. So you can decide to only convert/optimize the feature extractor and leave the classifier in standard PyTorch or you can convert the whole thing. When compiling your module +to TorchScript, there are two paths: Tracing and Scripting. +

+
+
+
+
[2]:
+
+
+
+
+
+
+import torch
+from torch import nn
+import torch.nn.functional as F
+
+class LeNetFeatExtractor(nn.Module):
+    def __init__(self):
+        super(LeNetFeatExtractor, self).__init__()
+        self.conv1 = nn.Conv2d(1, 128, 3)
+        self.conv2 = nn.Conv2d(128, 16, 3)
+
+    def forward(self, x):
+        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
+        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
+        return x
+
+class LeNetClassifier(nn.Module):
+    def __init__(self):
+        super(LeNetClassifier, self).__init__()
+        self.fc1 = nn.Linear(16 * 6 * 6, 120)
+        self.fc2 = nn.Linear(120, 84)
+        self.fc3 = nn.Linear(84, 10)
+
+    def forward(self, x):
+        x = torch.flatten(x,1)
+        x = F.relu(self.fc1(x))
+        x = F.relu(self.fc2(x))
+        x = self.fc3(x)
+        return x
+
+class LeNet(nn.Module):
+    def __init__(self):
+        super(LeNet, self).__init__()
+        self.feat = LeNetFeatExtractor()
+        self.classifer = LeNetClassifier()
+
+    def forward(self, x):
+        x = self.feat(x)
+        x = self.classifer(x)
+        return x
+
+
+
+
+
+

+ Let us define a helper function to benchmark a model. +

+
+
+
+
[3]:
+
+
+
+
+
+
+import time
+import numpy as np
+
+import torch.backends.cudnn as cudnn
+cudnn.benchmark = True
+
+def benchmark(model, input_shape=(1024, 1, 32, 32), dtype='fp32', nwarmup=50, nruns=1000):
+    input_data = torch.randn(input_shape)
+    input_data = input_data.to("cuda")
+    if dtype=='fp16':
+        input_data = input_data.half()
+
+    print("Warm up ...")
+    with torch.no_grad():
+        for _ in range(nwarmup):
+            features = model(input_data)
+    torch.cuda.synchronize()
+    print("Start timing ...")
+    timings = []
+    with torch.no_grad():
+        for i in range(1, nruns+1):
+            start_time = time.time()
+            features = model(input_data)
+            torch.cuda.synchronize()
+            end_time = time.time()
+            timings.append(end_time - start_time)
+            if i%100==0:
+                print('Iteration %d/%d, ave batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))
+
+    print("Input shape:", input_data.size())
+    print("Output features size:", features.size())
+
+    print('Average batch time: %.2f ms'%(np.mean(timings)*1000))
+
+
+
+
+

+ PyTorch model + + ¶ + +

+
+
+
+
[4]:
+
+
+
+
+
+
+model = LeNet()
+model.to("cuda").eval()
+
+
+
+
+
+
+
+
[4]:
+
+
+
+
+
+
+LeNet(
+  (feat): LeNetFeatExtractor(
+    (conv1): Conv2d(1, 128, kernel_size=(3, 3), stride=(1, 1))
+    (conv2): Conv2d(128, 16, kernel_size=(3, 3), stride=(1, 1))
+  )
+  (classifer): LeNetClassifier(
+    (fc1): Linear(in_features=576, out_features=120, bias=True)
+    (fc2): Linear(in_features=120, out_features=84, bias=True)
+    (fc3): Linear(in_features=84, out_features=10, bias=True)
+  )
+)
+
+
+
+
+
+
+
+
[5]:
+
+
+
+
+
+
+benchmark(model)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 100/1000, ave batch time 5.56 ms
+Iteration 200/1000, ave batch time 5.56 ms
+Iteration 300/1000, ave batch time 5.56 ms
+Iteration 400/1000, ave batch time 5.56 ms
+Iteration 500/1000, ave batch time 5.56 ms
+Iteration 600/1000, ave batch time 5.56 ms
+Iteration 700/1000, ave batch time 5.56 ms
+Iteration 800/1000, ave batch time 5.56 ms
+Iteration 900/1000, ave batch time 5.56 ms
+Iteration 1000/1000, ave batch time 5.56 ms
+Input shape: torch.Size([1024, 1, 32, 32])
+Output features size: torch.Size([1024, 10])
+Average batch time: 5.56 ms
+
+
+
+
+

+ When compiling your module to TorchScript, there are two paths: Tracing and Scripting. +

+

+ Tracing + + ¶ + +

+

+ Tracing follows the path of execution when the module is called and records what happens. This recording is what the TorchScript IR will describe. To trace an instance of our LeNet module, we can call torch.jit.trace with an example input. +

+
+
+
+
[6]:
+
+
+
+
+
+
+traced_model = torch.jit.trace(model, torch.empty([1,1,32,32]).to("cuda"))
+traced_model
+
+
+
+
+
+
+
+
[6]:
+
+
+
+
+
+
+LeNet(
+  original_name=LeNet
+  (feat): LeNetFeatExtractor(
+    original_name=LeNetFeatExtractor
+    (conv1): Conv2d(original_name=Conv2d)
+    (conv2): Conv2d(original_name=Conv2d)
+  )
+  (classifer): LeNetClassifier(
+    original_name=LeNetClassifier
+    (fc1): Linear(original_name=Linear)
+    (fc2): Linear(original_name=Linear)
+    (fc3): Linear(original_name=Linear)
+  )
+)
+
+
+
+
+
+
+
+
[7]:
+
+
+
+
+
+
+benchmark(traced_model)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 100/1000, ave batch time 5.56 ms
+Iteration 200/1000, ave batch time 5.56 ms
+Iteration 300/1000, ave batch time 5.56 ms
+Iteration 400/1000, ave batch time 5.56 ms
+Iteration 500/1000, ave batch time 5.56 ms
+Iteration 600/1000, ave batch time 5.56 ms
+Iteration 700/1000, ave batch time 5.56 ms
+Iteration 800/1000, ave batch time 5.56 ms
+Iteration 900/1000, ave batch time 5.56 ms
+Iteration 1000/1000, ave batch time 5.56 ms
+Input shape: torch.Size([1024, 1, 32, 32])
+Output features size: torch.Size([1024, 10])
+Average batch time: 5.56 ms
+
+
+
+
+

+ Scripting + + ¶ + +

+

+ Scripting actually inspects your code with a compiler and generates an equivalent TorchScript program. The difference is that since tracing simply follows the execution of your module, it cannot pick up control flow for instance, it will only follow the code path that a particular input triggers. By working from the Python code, the compiler can include these components. We can run the script compiler on our LeNet module by calling torch.jit.script. +

+
+
+
+
[8]:
+
+
+
+
+
+
+model = LeNet().to("cuda").eval()
+script_model = torch.jit.script(model)
+
+
+
+
+
+
+
+
+
[9]:
+
+
+
+
+
+
+script_model
+
+
+
+
+
+
+
+
[9]:
+
+
+
+
+
+
+RecursiveScriptModule(
+  original_name=LeNet
+  (feat): RecursiveScriptModule(
+    original_name=LeNetFeatExtractor
+    (conv1): RecursiveScriptModule(original_name=Conv2d)
+    (conv2): RecursiveScriptModule(original_name=Conv2d)
+  )
+  (classifer): RecursiveScriptModule(
+    original_name=LeNetClassifier
+    (fc1): RecursiveScriptModule(original_name=Linear)
+    (fc2): RecursiveScriptModule(original_name=Linear)
+    (fc3): RecursiveScriptModule(original_name=Linear)
+  )
+)
+
+
+
+
+
+
+
+
[10]:
+
+
+
+
+
+
+benchmark(script_model)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 100/1000, ave batch time 5.56 ms
+Iteration 200/1000, ave batch time 5.56 ms
+Iteration 300/1000, ave batch time 5.56 ms
+Iteration 400/1000, ave batch time 5.56 ms
+Iteration 500/1000, ave batch time 5.56 ms
+Iteration 600/1000, ave batch time 5.56 ms
+Iteration 700/1000, ave batch time 5.56 ms
+Iteration 800/1000, ave batch time 5.56 ms
+Iteration 900/1000, ave batch time 5.56 ms
+Iteration 1000/1000, ave batch time 5.56 ms
+Input shape: torch.Size([1024, 1, 32, 32])
+Output features size: torch.Size([1024, 10])
+Average batch time: 5.56 ms
+
+
+
+
+

+ ## 3. Compiling with Torch-TensorRT +

+

+ TorchScript traced model + + ¶ + +

+

+ First, we compile the TorchScript traced model with Torch-TensorRT. Notice the performance impact. +

+
+
+
+
[13]:
+
+
+
+
+
+
+import torch_tensorrt
+
+# We use a batch-size of 1024, and half precision
+trt_ts_module = torch_tensorrt.compile(traced_model, inputs=[torch_tensorrt.Input(
+            min_shape=[1024, 1, 32, 32],
+            opt_shape=[1024, 1, 33, 33],
+            max_shape=[1024, 1, 34, 34],
+            dtype=torch.half
+            )],
+            enabled_precisions = {torch.half})
+
+input_data = torch.randn((1024, 1, 32, 32))
+input_data = input_data.half().to("cuda")
+
+input_data = input_data.half()
+result = trt_ts_module(input_data)
+torch.jit.save(trt_ts_module, "trt_ts_module.ts")
+
+
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float
+The compiler is going to use the user setting Float16
+This conflict may cause an error at runtime due to partial compilation being enabled and therefore
+compatibility with PyTorch's data type convention is required.
+If you do indeed see errors at runtime either:
+- Remove the dtype spec for x.1
+- Disable partial compilation by setting require_full_compilation to True
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT TorchScript Conversion Context] - Max value of this profile is not valid
+
+
+
+
+
+
+
+
[14]:
+
+
+
+
+
+
+benchmark(trt_ts_module, input_shape=(1024, 1, 32, 32), dtype="fp16")
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 100/1000, ave batch time 1.41 ms
+Iteration 200/1000, ave batch time 1.40 ms
+Iteration 300/1000, ave batch time 1.40 ms
+Iteration 400/1000, ave batch time 1.39 ms
+Iteration 500/1000, ave batch time 1.40 ms
+Iteration 600/1000, ave batch time 1.40 ms
+Iteration 700/1000, ave batch time 1.40 ms
+Iteration 800/1000, ave batch time 1.40 ms
+Iteration 900/1000, ave batch time 1.40 ms
+Iteration 1000/1000, ave batch time 1.40 ms
+Input shape: torch.Size([1024, 1, 32, 32])
+Output features size: torch.Size([1024, 10])
+Average batch time: 1.40 ms
+
+
+
+
+

+ TorchScript script model + + ¶ + +

+

+ Next, we compile the TorchScript script model with Torch-TensorRT. Notice the performance impact. +

+
+
+
+
[16]:
+
+
+
+
+
+
+import torch_tensorrt
+
+trt_script_module = torch_tensorrt.compile(script_model, inputs = [torch_tensorrt.Input(
+            min_shape=[1024, 1, 32, 32],
+            opt_shape=[1024, 1, 33, 33],
+            max_shape=[1024, 1, 34, 34],
+            dtype=torch.half
+            )],
+            enabled_precisions={torch.half})
+
+input_data = torch.randn((1024, 1, 32, 32))
+input_data = input_data.half().to("cuda")
+
+input_data = input_data.half()
+result = trt_script_module(input_data)
+torch.jit.save(trt_script_module, "trt_script_module.ts")
+
+
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float
+The compiler is going to use the user setting Float16
+This conflict may cause an error at runtime due to partial compilation being enabled and therefore
+compatibility with PyTorch's data type convention is required.
+If you do indeed see errors at runtime either:
+- Remove the dtype spec for x.1
+- Disable partial compilation by setting require_full_compilation to True
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT TorchScript Conversion Context] - Max value of this profile is not valid
+
+
+
+
+
+
+
+
[17]:
+
+
+
+
+
+
+benchmark(trt_script_module, input_shape=(1024, 1, 32, 32), dtype="fp16")
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 100/1000, ave batch time 1.43 ms
+Iteration 200/1000, ave batch time 1.41 ms
+Iteration 300/1000, ave batch time 1.40 ms
+Iteration 400/1000, ave batch time 1.42 ms
+Iteration 500/1000, ave batch time 1.42 ms
+Iteration 600/1000, ave batch time 1.41 ms
+Iteration 700/1000, ave batch time 1.41 ms
+Iteration 800/1000, ave batch time 1.40 ms
+Iteration 900/1000, ave batch time 1.40 ms
+Iteration 1000/1000, ave batch time 1.40 ms
+Input shape: torch.Size([1024, 1, 32, 32])
+Output features size: torch.Size([1024, 10])
+Average batch time: 1.40 ms
+
+
+
+
+

+ Conclusion + + ¶ + +

+

+ In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT and test the performance impact of the optimization. +

+

+ What’s next + + ¶ + +

+

+ Now it’s time to try Torch-TensorRT on your own model. Fill out issues at + + https://github.com/NVIDIA/Torch-TensorRT + + . Your involvement will help future development of Torch-TensorRT. +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_notebooks/lenet-getting-started.ipynb b/docs/v1.1.1/_notebooks/lenet-getting-started.ipynb new file mode 100644 index 0000000000..2db954946d --- /dev/null +++ b/docs/v1.1.1/_notebooks/lenet-getting-started.ipynb @@ -0,0 +1,718 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Torch-TensorRT Getting Started - LeNet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch's JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.\n", + "\n", + "When deploying on NVIDIA GPUs TensorRT, NVIDIA's Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA's Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.\n", + "\n", + "Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a simple LeNet network. \n", + "\n", + "## Content\n", + "1. [Requirements](#1)\n", + "1. [Creating TorchScript modules](#2)\n", + "1. [Compiling with Torch-TensorRT](#3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "Follow the steps in `notebooks/README` to prepare a Docker container, within which you can run this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting ipywidgets\n", + " Downloading ipywidgets-7.6.5-py2.py3-none-any.whl (121 kB)\n", + "\u001b[K |████████████████████████████████| 121 kB 12.7 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)\n", + "Collecting jupyterlab-widgets>=1.0.0\n", + " Downloading jupyterlab_widgets-1.0.2-py3-none-any.whl (243 kB)\n", + "\u001b[K |████████████████████████████████| 243 kB 115.0 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.3)\n", + "Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.7.0)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (7.31.0)\n", + "Collecting widgetsnbextension~=3.5.0\n", + " Downloading widgetsnbextension-3.5.2-py2.py3-none-any.whl (1.6 MB)\n", + "\u001b[K |████████████████████████████████| 1.6 MB 122.5 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)\n", + "Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.1)\n", + "Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.1.2)\n", + "Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.4)\n", + "Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)\n", + "Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.24)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.0)\n", + "Requirement already satisfied: pygments in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.1)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (22.3.0)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (0.3)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (4.9.1)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (2.8.2)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)\n", + "Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.4.0)\n", + "Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (5.4.0)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.7.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (1.16.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.5.0->ipywidgets) (6.4.1)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.12.1)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.13.0)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.3)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3.0)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (6.4.0)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.8.0)\n", + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.21)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.0.1)\n", + "Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.0)\n", + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.7.1)\n", + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.1.2)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.10)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (4.1.0)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.5.0)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.8.4)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.1)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.6)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets\n", + "Successfully installed ipywidgets-7.6.5 jupyterlab-widgets-1.0.2 widgetsnbextension-3.5.2\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Thu Feb 10 22:01:27 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 510.39.01 Driver Version: 510.39.01 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA GeForce ... On | 00000000:09:00.0 Off | N/A |\n", + "| 0% 42C P8 20W / 320W | 0MiB / 10240MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org\n", + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 2. Creating TorchScript modules\n", + "\n", + "Here we create two submodules for a feature extractor and a classifier and stitch them together in a single LeNet module. In this case this is overkill but modules give us granular control over our program including where we decide to optimize and where we don't. It is also the unit that the TorchScript compiler operates on. So you can decide to only convert/optimize the feature extractor and leave the classifier in standard PyTorch or you can convert the whole thing. When compiling your module to TorchScript, there are two paths: Tracing and Scripting. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import torch \n", + "from torch import nn\n", + "import torch.nn.functional as F\n", + "\n", + "class LeNetFeatExtractor(nn.Module):\n", + " def __init__(self):\n", + " super(LeNetFeatExtractor, self).__init__()\n", + " self.conv1 = nn.Conv2d(1, 128, 3)\n", + " self.conv2 = nn.Conv2d(128, 16, 3)\n", + "\n", + " def forward(self, x):\n", + " x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))\n", + " x = F.max_pool2d(F.relu(self.conv2(x)), 2)\n", + " return x\n", + "\n", + "class LeNetClassifier(nn.Module):\n", + " def __init__(self):\n", + " super(LeNetClassifier, self).__init__()\n", + " self.fc1 = nn.Linear(16 * 6 * 6, 120)\n", + " self.fc2 = nn.Linear(120, 84)\n", + " self.fc3 = nn.Linear(84, 10)\n", + "\n", + " def forward(self, x):\n", + " x = torch.flatten(x,1)\n", + " x = F.relu(self.fc1(x))\n", + " x = F.relu(self.fc2(x))\n", + " x = self.fc3(x)\n", + " return x\n", + "\n", + "class LeNet(nn.Module):\n", + " def __init__(self):\n", + " super(LeNet, self).__init__()\n", + " self.feat = LeNetFeatExtractor()\n", + " self.classifer = LeNetClassifier()\n", + "\n", + " def forward(self, x):\n", + " x = self.feat(x)\n", + " x = self.classifer(x)\n", + " return x\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let us define a helper function to benchmark a model." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import numpy as np\n", + "\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "def benchmark(model, input_shape=(1024, 1, 32, 32), dtype='fp32', nwarmup=50, nruns=1000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%100==0:\n", + " print('Iteration %d/%d, ave batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output features size:\", features.size())\n", + " \n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### PyTorch model" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LeNet(\n", + " (feat): LeNetFeatExtractor(\n", + " (conv1): Conv2d(1, 128, kernel_size=(3, 3), stride=(1, 1))\n", + " (conv2): Conv2d(128, 16, kernel_size=(3, 3), stride=(1, 1))\n", + " )\n", + " (classifer): LeNetClassifier(\n", + " (fc1): Linear(in_features=576, out_features=120, bias=True)\n", + " (fc2): Linear(in_features=120, out_features=84, bias=True)\n", + " (fc3): Linear(in_features=84, out_features=10, bias=True)\n", + " )\n", + ")" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = LeNet()\n", + "model.to(\"cuda\").eval()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 5.56 ms\n", + "Iteration 200/1000, ave batch time 5.56 ms\n", + "Iteration 300/1000, ave batch time 5.56 ms\n", + "Iteration 400/1000, ave batch time 5.56 ms\n", + "Iteration 500/1000, ave batch time 5.56 ms\n", + "Iteration 600/1000, ave batch time 5.56 ms\n", + "Iteration 700/1000, ave batch time 5.56 ms\n", + "Iteration 800/1000, ave batch time 5.56 ms\n", + "Iteration 900/1000, ave batch time 5.56 ms\n", + "Iteration 1000/1000, ave batch time 5.56 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 5.56 ms\n" + ] + } + ], + "source": [ + "benchmark(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When compiling your module to TorchScript, there are two paths: Tracing and Scripting. \n", + " \n", + "### Tracing\n", + "\n", + "Tracing follows the path of execution when the module is called and records what happens. This recording is what the TorchScript IR will describe. To trace an instance of our LeNet module, we can call torch.jit.trace with an example input. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LeNet(\n", + " original_name=LeNet\n", + " (feat): LeNetFeatExtractor(\n", + " original_name=LeNetFeatExtractor\n", + " (conv1): Conv2d(original_name=Conv2d)\n", + " (conv2): Conv2d(original_name=Conv2d)\n", + " )\n", + " (classifer): LeNetClassifier(\n", + " original_name=LeNetClassifier\n", + " (fc1): Linear(original_name=Linear)\n", + " (fc2): Linear(original_name=Linear)\n", + " (fc3): Linear(original_name=Linear)\n", + " )\n", + ")" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "traced_model = torch.jit.trace(model, torch.empty([1,1,32,32]).to(\"cuda\"))\n", + "traced_model" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 5.56 ms\n", + "Iteration 200/1000, ave batch time 5.56 ms\n", + "Iteration 300/1000, ave batch time 5.56 ms\n", + "Iteration 400/1000, ave batch time 5.56 ms\n", + "Iteration 500/1000, ave batch time 5.56 ms\n", + "Iteration 600/1000, ave batch time 5.56 ms\n", + "Iteration 700/1000, ave batch time 5.56 ms\n", + "Iteration 800/1000, ave batch time 5.56 ms\n", + "Iteration 900/1000, ave batch time 5.56 ms\n", + "Iteration 1000/1000, ave batch time 5.56 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 5.56 ms\n" + ] + } + ], + "source": [ + "benchmark(traced_model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Scripting\n", + "\n", + "Scripting actually inspects your code with a compiler and generates an equivalent TorchScript program. The difference is that since tracing simply follows the execution of your module, it cannot pick up control flow for instance, it will only follow the code path that a particular input triggers. By working from the Python code, the compiler can include these components. We can run the script compiler on our LeNet module by calling torch.jit.script.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "model = LeNet().to(\"cuda\").eval()\n", + "script_model = torch.jit.script(model)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "RecursiveScriptModule(\n", + " original_name=LeNet\n", + " (feat): RecursiveScriptModule(\n", + " original_name=LeNetFeatExtractor\n", + " (conv1): RecursiveScriptModule(original_name=Conv2d)\n", + " (conv2): RecursiveScriptModule(original_name=Conv2d)\n", + " )\n", + " (classifer): RecursiveScriptModule(\n", + " original_name=LeNetClassifier\n", + " (fc1): RecursiveScriptModule(original_name=Linear)\n", + " (fc2): RecursiveScriptModule(original_name=Linear)\n", + " (fc3): RecursiveScriptModule(original_name=Linear)\n", + " )\n", + ")" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "script_model" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 5.56 ms\n", + "Iteration 200/1000, ave batch time 5.56 ms\n", + "Iteration 300/1000, ave batch time 5.56 ms\n", + "Iteration 400/1000, ave batch time 5.56 ms\n", + "Iteration 500/1000, ave batch time 5.56 ms\n", + "Iteration 600/1000, ave batch time 5.56 ms\n", + "Iteration 700/1000, ave batch time 5.56 ms\n", + "Iteration 800/1000, ave batch time 5.56 ms\n", + "Iteration 900/1000, ave batch time 5.56 ms\n", + "Iteration 1000/1000, ave batch time 5.56 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 5.56 ms\n" + ] + } + ], + "source": [ + "benchmark(script_model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 3. Compiling with Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### TorchScript traced model\n", + "\n", + "First, we compile the TorchScript traced model with Torch-TensorRT. Notice the performance impact." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x.1\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Max value of this profile is not valid\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "# We use a batch-size of 1024, and half precision\n", + "trt_ts_module = torch_tensorrt.compile(traced_model, inputs=[torch_tensorrt.Input(\n", + " min_shape=[1024, 1, 32, 32],\n", + " opt_shape=[1024, 1, 33, 33],\n", + " max_shape=[1024, 1, 34, 34],\n", + " dtype=torch.half\n", + " )], \n", + " enabled_precisions = {torch.half})\n", + "\n", + "input_data = torch.randn((1024, 1, 32, 32))\n", + "input_data = input_data.half().to(\"cuda\")\n", + "\n", + "input_data = input_data.half()\n", + "result = trt_ts_module(input_data)\n", + "torch.jit.save(trt_ts_module, \"trt_ts_module.ts\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 1.41 ms\n", + "Iteration 200/1000, ave batch time 1.40 ms\n", + "Iteration 300/1000, ave batch time 1.40 ms\n", + "Iteration 400/1000, ave batch time 1.39 ms\n", + "Iteration 500/1000, ave batch time 1.40 ms\n", + "Iteration 600/1000, ave batch time 1.40 ms\n", + "Iteration 700/1000, ave batch time 1.40 ms\n", + "Iteration 800/1000, ave batch time 1.40 ms\n", + "Iteration 900/1000, ave batch time 1.40 ms\n", + "Iteration 1000/1000, ave batch time 1.40 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 1.40 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_ts_module, input_shape=(1024, 1, 32, 32), dtype=\"fp16\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### TorchScript script model\n", + "\n", + "Next, we compile the TorchScript script model with Torch-TensorRT. Notice the performance impact." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x.1\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Max value of this profile is not valid\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "trt_script_module = torch_tensorrt.compile(script_model, inputs = [torch_tensorrt.Input(\n", + " min_shape=[1024, 1, 32, 32],\n", + " opt_shape=[1024, 1, 33, 33],\n", + " max_shape=[1024, 1, 34, 34],\n", + " dtype=torch.half\n", + " )],\n", + " enabled_precisions={torch.half})\n", + "\n", + "input_data = torch.randn((1024, 1, 32, 32))\n", + "input_data = input_data.half().to(\"cuda\")\n", + "\n", + "input_data = input_data.half()\n", + "result = trt_script_module(input_data)\n", + "torch.jit.save(trt_script_module, \"trt_script_module.ts\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 1.43 ms\n", + "Iteration 200/1000, ave batch time 1.41 ms\n", + "Iteration 300/1000, ave batch time 1.40 ms\n", + "Iteration 400/1000, ave batch time 1.42 ms\n", + "Iteration 500/1000, ave batch time 1.42 ms\n", + "Iteration 600/1000, ave batch time 1.41 ms\n", + "Iteration 700/1000, ave batch time 1.41 ms\n", + "Iteration 800/1000, ave batch time 1.40 ms\n", + "Iteration 900/1000, ave batch time 1.40 ms\n", + "Iteration 1000/1000, ave batch time 1.40 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 1.40 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_script_module, input_shape=(1024, 1, 32, 32), dtype=\"fp16\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT and test the performance impact of the optimization.\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. Fill out issues at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.1.1/_notebooks/ssd-object-detection-demo.html b/docs/v1.1.1/_notebooks/ssd-object-detection-demo.html new file mode 100644 index 0000000000..73b0bf41c1 --- /dev/null +++ b/docs/v1.1.1/_notebooks/ssd-object-detection-demo.html @@ -0,0 +1,2080 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Object Detection with Torch-TensorRT (SSD) — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+
+
[1]:
+
+
+
+
+
+
+# Copyright 2020 NVIDIA Corporation. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
+
+
+

+ 11e4a7a3ef4941759f5a16b4b08bd679 +

+

+ Object Detection with Torch-TensorRT (SSD) + + ¶ + +

+
+

+ Overview + + ¶ + +

+

+ In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the +best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch’s JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new +world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference. +

+

+ When deploying on NVIDIA GPUs TensorRT, NVIDIA’s Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA’s Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that +perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device. +

+

+ Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch. +

+

+ Learning objectives + + ¶ + +

+

+ This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained SSD network, and running it to test the speedup obtained. +

+

+ Contents + + ¶ + +

+
    +
  1. +

    + + Requirements + +

    +
  2. +
  3. +

    + + SSD Overview + +

    +
  4. +
  5. +

    + + Creating TorchScript modules + +

    +
  6. +
  7. +

    + + Compiling with Torch-TensorRT + +

    +
  8. +
  9. +

    + + Running Inference + +

    +
  10. +
  11. +

    + + Measuring Speedup + +

    +
  12. +
  13. +

    + + Conclusion + +

    +
  14. +
+
+

+ ## 1. Requirements +

+

+ Follow the steps in + + + notebooks/README + + + to prepare a Docker container, within which you can run this demo notebook. +

+

+ In addition to that, run the following cell to obtain additional libraries specific to this demo. +

+
+
+
+
[2]:
+
+
+
+
+
+
+!pip install scikit-image==0.19.1
+!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org
+
+
+
+
+
+
+
+
+
+
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Collecting scikit-image==0.19.1
+  Downloading scikit_image-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.8 MB)
+     |████████████████████████████████| 13.8 MB 8.8 MB/s eta 0:00:01
+Requirement already satisfied: networkx>=2.2 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (2.6.3)
+Collecting tifffile>=2019.7.26
+  Downloading tifffile-2022.3.16-py3-none-any.whl (179 kB)
+     |████████████████████████████████| 179 kB 110.1 MB/s eta 0:00:01
+Requirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (21.3)
+Requirement already satisfied: scipy>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (1.6.3)
+Requirement already satisfied: numpy>=1.17.0 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (1.22.2)
+Collecting imageio>=2.4.1
+  Downloading imageio-2.16.1-py3-none-any.whl (3.3 MB)
+     |████████████████████████████████| 3.3 MB 42.3 MB/s eta 0:00:01
+Requirement already satisfied: pillow!=7.1.0,!=7.1.1,!=8.3.0,>=6.1.0 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (9.0.0)
+Collecting PyWavelets>=1.1.1
+  Downloading PyWavelets-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.9 MB)
+     |████████████████████████████████| 6.9 MB 61.3 MB/s eta 0:00:01
+Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging>=20.0->scikit-image==0.19.1) (3.0.7)
+Installing collected packages: tifffile, PyWavelets, imageio, scikit-image
+Successfully installed PyWavelets-1.3.0 imageio-2.16.1 scikit-image-0.19.1 tifffile-2022.3.16
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Collecting ipywidgets
+  Downloading ipywidgets-7.7.0-py2.py3-none-any.whl (123 kB)
+     |████████████████████████████████| 123 kB 12.1 MB/s eta 0:00:01
+Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.9.0)
+Collecting jupyterlab-widgets>=1.0.0
+  Downloading jupyterlab_widgets-1.1.0-py3-none-any.whl (245 kB)
+     |████████████████████████████████| 245 kB 60.6 MB/s eta 0:00:01
+Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.3)
+Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)
+Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (8.0.1)
+Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)
+Collecting widgetsnbextension~=3.6.0
+  Downloading widgetsnbextension-3.6.0-py2.py3-none-any.whl (1.6 MB)
+     |████████████████████████████████| 1.6 MB 35.2 MB/s eta 0:00:01
+Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.4)
+Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.1.2)
+Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)
+Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)
+Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.1)
+Requirement already satisfied: stack-data in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.1.4)
+Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.26)
+Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)
+Requirement already satisfied: pygments in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.2)
+Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)
+Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.1)
+Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)
+Requirement already satisfied: black in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (22.1.0)
+Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)
+Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)
+Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)
+Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (0.3)
+Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (22.3.0)
+Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (4.9.1)
+Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (2.8.2)
+Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)
+Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.4.0)
+Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.18.1)
+Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (5.4.0)
+Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.7.0)
+Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)
+Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)
+Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (1.16.0)
+Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.6.0->ipywidgets) (6.4.1)
+Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.1)
+Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.8.0)
+Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.1)
+Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.0.3)
+Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (6.4.2)
+Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3.0)
+Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.2.0)
+Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.15.0)
+Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.21)
+Requirement already satisfied: pathspec>=0.9.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (0.9.0)
+Requirement already satisfied: tomli>=1.1.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (2.0.1)
+Requirement already satisfied: mypy-extensions>=0.4.3 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (0.4.3)
+Requirement already satisfied: click>=8.0.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (8.0.3)
+Requirement already satisfied: platformdirs>=2 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (2.4.1)
+Requirement already satisfied: typing-extensions>=3.10.0.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (4.0.1)
+Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.0.1)
+Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.7.1)
+Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.8.4)
+Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.11)
+Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.0)
+Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.1.2)
+Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (4.1.0)
+Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.5.0)
+Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.1)
+Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3)
+Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.0.7)
+Requirement already satisfied: executing in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.8.2)
+Requirement already satisfied: pure-eval in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.2.2)
+Requirement already satisfied: asttokens in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (2.0.5)
+Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets
+Successfully installed ipywidgets-7.7.0 jupyterlab-widgets-1.1.0 widgetsnbextension-3.6.0
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+
+
+
+
+
+

+ ## 2. SSD +

+

+ Single Shot MultiBox Detector model for object detection + + ¶ + +

+ + + + + + + + + + + + + + + + + +
+

+ _ +

+
+

+ _ +

+
+

+ alt +

+
+

+ image1 +

+
+

+ PyTorch has a model repository called the PyTorch Hub, which is a source for high quality implementations of common models. We can get our SSD model pretrained on + + COCO + + from there. +

+

+ Model Description + + ¶ + +

+

+ This SSD300 model is based on the + + SSD: Single Shot MultiBox Detector + + paper, which describes SSD as “a method for detecting objects in images using a single deep neural network”. The input size is fixed to 300x300. +

+

+ The main difference between this model and the one described in the paper is in the backbone. Specifically, the VGG model is obsolete and is replaced by the ResNet-50 model. +

+

+ From the + + Speed/accuracy trade-offs for modern convolutional object detectors + + paper, the following enhancements were made to the backbone: * The conv5_x, avgpool, fc and softmax layers were removed from the original classification model. * All strides in conv4_x are set to 1x1. +

+

+ The backbone is followed by 5 additional convolutional layers. In addition to the convolutional layers, we attached 6 detection heads: * The first detection head is attached to the last conv4_x layer. * The other five detection heads are attached to the corresponding 5 additional layers. +

+

+ Detector heads are similar to the ones referenced in the paper, however, they are enhanced by additional BatchNorm layers after each convolution. +

+

+ More information about this SSD model is available at Nvidia’s “DeepLearningExamples” Github + + here + + . +

+
+
+
+
[3]:
+
+
+
+
+
+
+import torch
+torch.hub._validate_not_a_forked_repo=lambda a,b,c: True
+
+
+
+
+
+
+
+
[4]:
+
+
+
+
+
+
+# List of available models in PyTorch Hub from Nvidia/DeepLearningExamples
+torch.hub.list('NVIDIA/DeepLearningExamples:torchhub')
+
+
+
+
+
+
+
+
+
+
+Downloading: "https://github.com/NVIDIA/DeepLearningExamples/archive/torchhub.zip" to /root/.cache/torch/hub/torchhub.zip
+/root/.cache/torch/hub/NVIDIA_DeepLearningExamples_torchhub/PyTorch/Classification/ConvNets/image_classification/models/efficientnet.py:17: UserWarning: pytorch_quantization module not found, quantization will not be available
+  warnings.warn(
+
+
+
+
+
+
+
+
[4]:
+
+
+
+
+
+
+['nvidia_convnets_processing_utils',
+ 'nvidia_efficientnet',
+ 'nvidia_efficientnet_b0',
+ 'nvidia_efficientnet_b4',
+ 'nvidia_efficientnet_widese_b0',
+ 'nvidia_efficientnet_widese_b4',
+ 'nvidia_resneXt',
+ 'nvidia_resnet50',
+ 'nvidia_resnext101_32x4d',
+ 'nvidia_se_resnext101_32x4d',
+ 'nvidia_ssd',
+ 'nvidia_ssd_processing_utils',
+ 'nvidia_tacotron2',
+ 'nvidia_tts_utils',
+ 'nvidia_waveglow']
+
+
+
+
+
+
+
+
[5]:
+
+
+
+
+
+
+# load SSD model pretrained on COCO from Torch Hub
+precision = 'fp32'
+ssd300 = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_ssd', model_math=precision);
+
+
+
+
+
+
+
+
+
+
+Using cache found in /root/.cache/torch/hub/NVIDIA_DeepLearningExamples_torchhub
+Downloading: "https://download.pytorch.org/models/resnet50-0676ba61.pth" to /root/.cache/torch/hub/checkpoints/resnet50-0676ba61.pth
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+Downloading checkpoint from https://api.ngc.nvidia.com/v2/models/nvidia/ssd_pyt_ckpt_amp/versions/20.06.0/files/nvidia_ssdpyt_amp_200703.pt
+
+
+
+
+

+ Setting + + + precision="fp16" + + + will load a checkpoint trained with mixed precision into architecture enabling execution on Tensor Cores. Handling mixed precision data requires the Apex library. +

+

+ Sample Inference + + ¶ + +

+

+ We can now run inference on the model. This is demonstrated below using sample images from the COCO 2017 Validation set. +

+
+
+
+
[6]:
+
+
+
+
+
+
+# Sample images from the COCO validation set
+uris = [
+    'http://images.cocodataset.org/val2017/000000397133.jpg',
+    'http://images.cocodataset.org/val2017/000000037777.jpg',
+    'http://images.cocodataset.org/val2017/000000252219.jpg'
+]
+
+# For convenient and comprehensive formatting of input and output of the model, load a set of utility methods.
+utils = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_ssd_processing_utils')
+
+# Format images to comply with the network input
+inputs = [utils.prepare_input(uri) for uri in uris]
+tensor = utils.prepare_tensor(inputs, False)
+
+# The model was trained on COCO dataset, which we need to access in order to
+# translate class IDs into object names.
+classes_to_labels = utils.get_coco_object_dictionary()
+
+
+
+
+
+
+
+
+
+
+Using cache found in /root/.cache/torch/hub/NVIDIA_DeepLearningExamples_torchhub
+
+
+
+
+
+
+
+
+
+
+Downloading COCO annotations.
+Downloading finished.
+
+
+
+
+
+
+
+
[7]:
+
+
+
+
+
+
+# Next, we run object detection
+model = ssd300.eval().to("cuda")
+detections_batch = model(tensor)
+
+# By default, raw output from SSD network per input image contains 8732 boxes with
+# localization and class probability distribution.
+# Let’s filter this output to only get reasonable detections (confidence>40%) in a more comprehensive format.
+results_per_input = utils.decode_results(detections_batch)
+best_results_per_input = [utils.pick_best(results, 0.40) for results in results_per_input]
+
+
+
+
+

+ Visualize results + + ¶ + +

+
+
+
+
[8]:
+
+
+
+
+
+
+from matplotlib import pyplot as plt
+import matplotlib.patches as patches
+
+# The utility plots the images and predicted bounding boxes (with confidence scores).
+def plot_results(best_results):
+    for image_idx in range(len(best_results)):
+        fig, ax = plt.subplots(1)
+        # Show original, denormalized image...
+        image = inputs[image_idx] / 2 + 0.5
+        ax.imshow(image)
+        # ...with detections
+        bboxes, classes, confidences = best_results[image_idx]
+        for idx in range(len(bboxes)):
+            left, bot, right, top = bboxes[idx]
+            x, y, w, h = [val * 300 for val in [left, bot, right - left, top - bot]]
+            rect = patches.Rectangle((x, y), w, h, linewidth=1, edgecolor='r', facecolor='none')
+            ax.add_patch(rect)
+            ax.text(x, y, "{} {:.0f}%".format(classes_to_labels[classes[idx] - 1], confidences[idx]*100), bbox=dict(facecolor='white', alpha=0.5))
+    plt.show()
+
+
+
+
+
+
+
+
+
[9]:
+
+
+
+
+
+
+# Visualize results without Torch-TensorRT
+plot_results(best_results_per_input)
+
+
+
+
+
+
+
+
+ ../_images/_notebooks_ssd-object-detection-demo_18_0.png +
+
+
+
+
+
+ ../_images/_notebooks_ssd-object-detection-demo_18_1.png +
+
+
+
+
+
+ ../_images/_notebooks_ssd-object-detection-demo_18_2.png +
+
+

+ Benchmark utility + + ¶ + +

+
+
+
+
[10]:
+
+
+
+
+
+
+import time
+import numpy as np
+
+import torch.backends.cudnn as cudnn
+cudnn.benchmark = True
+
+# Helper function to benchmark the model
+def benchmark(model, input_shape=(1024, 1, 32, 32), dtype='fp32', nwarmup=50, nruns=1000):
+    input_data = torch.randn(input_shape)
+    input_data = input_data.to("cuda")
+    if dtype=='fp16':
+        input_data = input_data.half()
+
+    print("Warm up ...")
+    with torch.no_grad():
+        for _ in range(nwarmup):
+            features = model(input_data)
+    torch.cuda.synchronize()
+    print("Start timing ...")
+    timings = []
+    with torch.no_grad():
+        for i in range(1, nruns+1):
+            start_time = time.time()
+            pred_loc, pred_label  = model(input_data)
+            torch.cuda.synchronize()
+            end_time = time.time()
+            timings.append(end_time - start_time)
+            if i%10==0:
+                print('Iteration %d/%d, avg batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))
+
+    print("Input shape:", input_data.size())
+    print("Output location prediction size:", pred_loc.size())
+    print("Output label prediction size:", pred_label.size())
+    print('Average batch time: %.2f ms'%(np.mean(timings)*1000))
+
+
+
+
+
+

+ We check how well the model performs + + before + + we use Torch-TensorRT +

+
+
+
+
[11]:
+
+
+
+
+
+
+# Model benchmark without Torch-TensorRT
+model = ssd300.eval().to("cuda")
+benchmark(model, input_shape=(128, 3, 300, 300), nruns=100)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, avg batch time 165.38 ms
+Iteration 20/100, avg batch time 165.99 ms
+Iteration 30/100, avg batch time 166.04 ms
+Iteration 40/100, avg batch time 166.32 ms
+Iteration 50/100, avg batch time 166.49 ms
+Iteration 60/100, avg batch time 166.74 ms
+Iteration 70/100, avg batch time 166.88 ms
+Iteration 80/100, avg batch time 167.05 ms
+Iteration 90/100, avg batch time 167.18 ms
+Iteration 100/100, avg batch time 167.31 ms
+Input shape: torch.Size([128, 3, 300, 300])
+Output location prediction size: torch.Size([128, 4, 8732])
+Output label prediction size: torch.Size([128, 81, 8732])
+Average batch time: 167.31 ms
+
+
+
+
+
+

+ ## 3. Creating TorchScript modules +

+

+ To compile with Torch-TensorRT, the model must first be in + + TorchScript + + . TorchScript is a programming language included in PyTorch which removes the Python dependency normal PyTorch models have. This conversion is done via a JIT compiler which given a PyTorch Module will generate an equivalent TorchScript Module. There are two paths that can be used to generate TorchScript: + + Tracing + + and + + Scripting + + . - Tracing follows execution of PyTorch generating ops in TorchScript corresponding to +what it sees. - Scripting does an analysis of the Python code and generates TorchScript, this allows the resulting graph to include control flow which tracing cannot do. +

+

+ Tracing however due to its simplicity is more likely to compile successfully with Torch-TensorRT (though both systems are supported). +

+
+
+
+
[12]:
+
+
+
+
+
+
+model = ssd300.eval().to("cuda")
+traced_model = torch.jit.trace(model, [torch.randn((1,3,300,300)).to("cuda")])
+
+
+
+
+

+ If required, we can also save this model and use it independently of Python. +

+
+
+
+
[13]:
+
+
+
+
+
+
+# This is just an example, and not required for the purposes of this demo
+torch.jit.save(traced_model, "ssd_300_traced.jit.pt")
+
+
+
+
+
+
+
+
[14]:
+
+
+
+
+
+
+# Obtain the average time taken by a batch of input with Torchscript compiled modules
+benchmark(traced_model, input_shape=(128, 3, 300, 300), nruns=100)
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, avg batch time 165.53 ms
+Iteration 20/100, avg batch time 166.19 ms
+Iteration 30/100, avg batch time 166.12 ms
+Iteration 40/100, avg batch time 166.16 ms
+Iteration 50/100, avg batch time 166.24 ms
+Iteration 60/100, avg batch time 166.33 ms
+Iteration 70/100, avg batch time 166.43 ms
+Iteration 80/100, avg batch time 166.44 ms
+Iteration 90/100, avg batch time 166.53 ms
+Iteration 100/100, avg batch time 166.59 ms
+Input shape: torch.Size([128, 3, 300, 300])
+Output location prediction size: torch.Size([128, 4, 8732])
+Output label prediction size: torch.Size([128, 81, 8732])
+Average batch time: 166.59 ms
+
+
+
+
+
+

+ ## 4. Compiling with Torch-TensorRT TorchScript modules behave just like normal PyTorch modules and are intercompatible. From TorchScript we can now compile a TensorRT based module. This module will still be implemented in TorchScript but all the computation will be done in TensorRT. +

+
+
+
+
[15]:
+
+
+
+
+
+
+import torch_tensorrt
+
+# The compiled module will have precision as specified by "op_precision".
+# Here, it will have FP16 precision.
+trt_model = torch_tensorrt.compile(traced_model,
+    inputs= [torch_tensorrt.Input((3, 3, 300, 300), dtype=torch.half)],
+    enabled_precisions= {torch.half}, # Run with FP16
+    workspace_size= 1 << 20
+)
+
+
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - For input x, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float
+The compiler is going to use the user setting Float16
+This conflict may cause an error at runtime due to partial compilation being enabled and therefore
+compatibility with PyTorch's data type convention is required.
+If you do indeed see errors at runtime either:
+- Remove the dtype spec for x
+- Disable partial compilation by setting require_full_compilation to True
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+
+
+
+
+
+

+ ## 5. Running Inference +

+

+ Next, we run object detection +

+
+
+
+
[16]:
+
+
+
+
+
+
+# using a Torch-TensorRT module is exactly the same as how we usually do inference in PyTorch i.e. model(inputs)
+detections_batch = trt_model(tensor.to(torch.half)) # convert the input to half precision
+
+# By default, raw output from SSD network per input image contains 8732 boxes with
+# localization and class probability distribution.
+# Let’s filter this output to only get reasonable detections (confidence>40%) in a more comprehensive format.
+results_per_input = utils.decode_results(detections_batch)
+best_results_per_input_trt = [utils.pick_best(results, 0.40) for results in results_per_input]
+
+
+
+
+

+ Now, let’s visualize our predictions! +

+
+
+
+
[17]:
+
+
+
+
+
+
+# Visualize results with Torch-TensorRT
+plot_results(best_results_per_input_trt)
+
+
+
+
+
+
+
+
+ ../_images/_notebooks_ssd-object-detection-demo_35_0.png +
+
+
+
+
+
+ ../_images/_notebooks_ssd-object-detection-demo_35_1.png +
+
+
+
+
+
+ ../_images/_notebooks_ssd-object-detection-demo_35_2.png +
+
+

+ We get similar results as before! +

+
+

+ 6. Measuring Speedup + + ¶ + +

+

+ We can run the benchmark function again to see the speedup gained! Compare this result with the same batch-size of input in the case without Torch-TensorRT above. +

+
+
+
+
[18]:
+
+
+
+
+
+
+batch_size = 128
+
+# Recompiling with batch_size we use for evaluating performance
+trt_model = torch_tensorrt.compile(traced_model,
+    inputs = [torch_tensorrt.Input((batch_size, 3, 300, 300), dtype=torch.half)],
+    enabled_precisions= {torch.half}, # Run with FP16
+    workspace_size= 1 << 20
+)
+
+benchmark(trt_model, input_shape=(batch_size, 3, 300, 300), dtype='fp16', nruns=100)
+
+
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - For input x, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float
+The compiler is going to use the user setting Float16
+This conflict may cause an error at runtime due to partial compilation being enabled and therefore
+compatibility with PyTorch's data type convention is required.
+If you do indeed see errors at runtime either:
+- Remove the dtype spec for x
+- Disable partial compilation by setting require_full_compilation to True
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, avg batch time 45.88 ms
+Iteration 20/100, avg batch time 46.20 ms
+Iteration 30/100, avg batch time 46.10 ms
+Iteration 40/100, avg batch time 46.19 ms
+Iteration 50/100, avg batch time 46.15 ms
+Iteration 60/100, avg batch time 46.17 ms
+Iteration 70/100, avg batch time 46.19 ms
+Iteration 80/100, avg batch time 46.20 ms
+Iteration 90/100, avg batch time 46.22 ms
+Iteration 100/100, avg batch time 46.21 ms
+Input shape: torch.Size([128, 3, 300, 300])
+Output location prediction size: torch.Size([128, 4, 8732])
+Output label prediction size: torch.Size([128, 81, 8732])
+Average batch time: 46.21 ms
+
+
+
+
+
+

+ 7. Conclusion + + ¶ + +

+

+ In this notebook, we have walked through the complete process of compiling a TorchScript SSD300 model with Torch-TensorRT, and tested the performance impact of the optimization. We find that using the Torch-TensorRT compiled model, we gain significant speedup in inference without any noticeable drop in performance! +

+

+ Details + + ¶ + +

+

+ For detailed information on model input and output, training recipies, inference and performance visit: + + github + + and/or + + NGC + +

+

+ References + + ¶ + +

+ +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_notebooks/ssd-object-detection-demo.ipynb b/docs/v1.1.1/_notebooks/ssd-object-detection-demo.ipynb new file mode 100644 index 0000000000..f2a0bd8063 --- /dev/null +++ b/docs/v1.1.1/_notebooks/ssd-object-detection-demo.ipynb @@ -0,0 +1,943 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2020 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Object Detection with Torch-TensorRT (SSD)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Overview\n", + "\n", + "In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch's JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.\n", + "\n", + "When deploying on NVIDIA GPUs TensorRT, NVIDIA's Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA's Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.\n", + "\n", + "Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained SSD network, and running it to test the speedup obtained.\n", + "\n", + "## Contents\n", + "1. [Requirements](#1)\n", + "2. [SSD Overview](#2)\n", + "3. [Creating TorchScript modules](#3)\n", + "4. [Compiling with Torch-TensorRT](#4)\n", + "5. [Running Inference](#5)\n", + "6. [Measuring Speedup](#6)\n", + "7. [Conclusion](#7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 1. Requirements\n", + "\n", + "Follow the steps in `notebooks/README` to prepare a Docker container, within which you can run this demo notebook.\n", + "\n", + "In addition to that, run the following cell to obtain additional libraries specific to this demo." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting scikit-image==0.19.1\n", + " Downloading scikit_image-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.8 MB)\n", + "\u001b[K |████████████████████████████████| 13.8 MB 8.8 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: networkx>=2.2 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (2.6.3)\n", + "Collecting tifffile>=2019.7.26\n", + " Downloading tifffile-2022.3.16-py3-none-any.whl (179 kB)\n", + "\u001b[K |████████████████████████████████| 179 kB 110.1 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (21.3)\n", + "Requirement already satisfied: scipy>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (1.6.3)\n", + "Requirement already satisfied: numpy>=1.17.0 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (1.22.2)\n", + "Collecting imageio>=2.4.1\n", + " Downloading imageio-2.16.1-py3-none-any.whl (3.3 MB)\n", + "\u001b[K |████████████████████████████████| 3.3 MB 42.3 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: pillow!=7.1.0,!=7.1.1,!=8.3.0,>=6.1.0 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (9.0.0)\n", + "Collecting PyWavelets>=1.1.1\n", + " Downloading PyWavelets-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.9 MB)\n", + "\u001b[K |████████████████████████████████| 6.9 MB 61.3 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging>=20.0->scikit-image==0.19.1) (3.0.7)\n", + "Installing collected packages: tifffile, PyWavelets, imageio, scikit-image\n", + "Successfully installed PyWavelets-1.3.0 imageio-2.16.1 scikit-image-0.19.1 tifffile-2022.3.16\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting ipywidgets\n", + " Downloading ipywidgets-7.7.0-py2.py3-none-any.whl (123 kB)\n", + "\u001b[K |████████████████████████████████| 123 kB 12.1 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.9.0)\n", + "Collecting jupyterlab-widgets>=1.0.0\n", + " Downloading jupyterlab_widgets-1.1.0-py3-none-any.whl (245 kB)\n", + "\u001b[K |████████████████████████████████| 245 kB 60.6 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.3)\n", + "Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (8.0.1)\n", + "Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)\n", + "Collecting widgetsnbextension~=3.6.0\n", + " Downloading widgetsnbextension-3.6.0-py2.py3-none-any.whl (1.6 MB)\n", + "\u001b[K |████████████████████████████████| 1.6 MB 35.2 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.4)\n", + "Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.1.2)\n", + "Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)\n", + "Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)\n", + "Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.1)\n", + "Requirement already satisfied: stack-data in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.1.4)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.26)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)\n", + "Requirement already satisfied: pygments in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.2)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.1)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: black in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (22.1.0)\n", + "Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (0.3)\n", + "Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (22.3.0)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (4.9.1)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (2.8.2)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)\n", + "Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.4.0)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (5.4.0)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.7.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (1.16.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.6.0->ipywidgets) (6.4.1)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.1)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.8.0)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.1)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.0.3)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (6.4.2)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3.0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.21)\n", + "Requirement already satisfied: pathspec>=0.9.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (0.9.0)\n", + "Requirement already satisfied: tomli>=1.1.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (2.0.1)\n", + "Requirement already satisfied: mypy-extensions>=0.4.3 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (0.4.3)\n", + "Requirement already satisfied: click>=8.0.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (8.0.3)\n", + "Requirement already satisfied: platformdirs>=2 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (2.4.1)\n", + "Requirement already satisfied: typing-extensions>=3.10.0.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (4.0.1)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.0.1)\n", + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.7.1)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.8.4)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.11)\n", + "Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.0)\n", + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.1.2)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (4.1.0)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.5.0)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.1)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.0.7)\n", + "Requirement already satisfied: executing in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.8.2)\n", + "Requirement already satisfied: pure-eval in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.2.2)\n", + "Requirement already satisfied: asttokens in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (2.0.5)\n", + "Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets\n", + "Successfully installed ipywidgets-7.7.0 jupyterlab-widgets-1.1.0 widgetsnbextension-3.6.0\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install scikit-image==0.19.1\n", + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 2. SSD\n", + "\n", + "### Single Shot MultiBox Detector model for object detection\n", + "\n", + "_ | _\n", + "- | -\n", + "![alt](https://pytorch.org/assets/images/ssd_diagram.png) | ![alt](https://pytorch.org/assets/images/ssd.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "PyTorch has a model repository called the PyTorch Hub, which is a source for high quality implementations of common models. We can get our SSD model pretrained on [COCO](https://cocodataset.org/#home) from there.\n", + "\n", + "### Model Description\n", + "\n", + "This SSD300 model is based on the\n", + "[SSD: Single Shot MultiBox Detector](https://arxiv.org/abs/1512.02325) paper, which\n", + "describes SSD as “a method for detecting objects in images using a single deep neural network\".\n", + "The input size is fixed to 300x300.\n", + "\n", + "The main difference between this model and the one described in the paper is in the backbone.\n", + "Specifically, the VGG model is obsolete and is replaced by the ResNet-50 model.\n", + "\n", + "From the\n", + "[Speed/accuracy trade-offs for modern convolutional object detectors](https://arxiv.org/abs/1611.10012)\n", + "paper, the following enhancements were made to the backbone:\n", + "* The conv5_x, avgpool, fc and softmax layers were removed from the original classification model.\n", + "* All strides in conv4_x are set to 1x1.\n", + "\n", + "The backbone is followed by 5 additional convolutional layers.\n", + "In addition to the convolutional layers, we attached 6 detection heads:\n", + "* The first detection head is attached to the last conv4_x layer.\n", + "* The other five detection heads are attached to the corresponding 5 additional layers.\n", + "\n", + "Detector heads are similar to the ones referenced in the paper, however,\n", + "they are enhanced by additional BatchNorm layers after each convolution.\n", + "\n", + "More information about this SSD model is available at Nvidia's \"DeepLearningExamples\" Github [here](https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/Detection/SSD)." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "torch.hub._validate_not_a_forked_repo=lambda a,b,c: True" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Downloading: \"https://github.com/NVIDIA/DeepLearningExamples/archive/torchhub.zip\" to /root/.cache/torch/hub/torchhub.zip\n", + "/root/.cache/torch/hub/NVIDIA_DeepLearningExamples_torchhub/PyTorch/Classification/ConvNets/image_classification/models/efficientnet.py:17: UserWarning: pytorch_quantization module not found, quantization will not be available\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/plain": [ + "['nvidia_convnets_processing_utils',\n", + " 'nvidia_efficientnet',\n", + " 'nvidia_efficientnet_b0',\n", + " 'nvidia_efficientnet_b4',\n", + " 'nvidia_efficientnet_widese_b0',\n", + " 'nvidia_efficientnet_widese_b4',\n", + " 'nvidia_resneXt',\n", + " 'nvidia_resnet50',\n", + " 'nvidia_resnext101_32x4d',\n", + " 'nvidia_se_resnext101_32x4d',\n", + " 'nvidia_ssd',\n", + " 'nvidia_ssd_processing_utils',\n", + " 'nvidia_tacotron2',\n", + " 'nvidia_tts_utils',\n", + " 'nvidia_waveglow']" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# List of available models in PyTorch Hub from Nvidia/DeepLearningExamples\n", + "torch.hub.list('NVIDIA/DeepLearningExamples:torchhub')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using cache found in /root/.cache/torch/hub/NVIDIA_DeepLearningExamples_torchhub\n", + "Downloading: \"https://download.pytorch.org/models/resnet50-0676ba61.pth\" to /root/.cache/torch/hub/checkpoints/resnet50-0676ba61.pth\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1c7cf3e1635d4a2b9c8731b7fc9ce724", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0.00/97.8M [00:0040%) in a more comprehensive format.\n", + "results_per_input = utils.decode_results(detections_batch)\n", + "best_results_per_input = [utils.pick_best(results, 0.40) for results in results_per_input]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualize results" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "import matplotlib.patches as patches\n", + "\n", + "# The utility plots the images and predicted bounding boxes (with confidence scores).\n", + "def plot_results(best_results):\n", + " for image_idx in range(len(best_results)):\n", + " fig, ax = plt.subplots(1)\n", + " # Show original, denormalized image...\n", + " image = inputs[image_idx] / 2 + 0.5\n", + " ax.imshow(image)\n", + " # ...with detections\n", + " bboxes, classes, confidences = best_results[image_idx]\n", + " for idx in range(len(bboxes)):\n", + " left, bot, right, top = bboxes[idx]\n", + " x, y, w, h = [val * 300 for val in [left, bot, right - left, top - bot]]\n", + " rect = patches.Rectangle((x, y), w, h, linewidth=1, edgecolor='r', facecolor='none')\n", + " ax.add_patch(rect)\n", + " ax.text(x, y, \"{} {:.0f}%\".format(classes_to_labels[classes[idx] - 1], confidences[idx]*100), bbox=dict(facecolor='white', alpha=0.5))\n", + " plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Visualize results without Torch-TensorRT\n", + "plot_results(best_results_per_input)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Benchmark utility" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import numpy as np\n", + "\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "# Helper function to benchmark the model\n", + "def benchmark(model, input_shape=(1024, 1, 32, 32), dtype='fp32', nwarmup=50, nruns=1000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " pred_loc, pred_label = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%10==0:\n", + " print('Iteration %d/%d, avg batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output location prediction size:\", pred_loc.size())\n", + " print(\"Output label prediction size:\", pred_label.size())\n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We check how well the model performs **before** we use Torch-TensorRT" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 165.38 ms\n", + "Iteration 20/100, avg batch time 165.99 ms\n", + "Iteration 30/100, avg batch time 166.04 ms\n", + "Iteration 40/100, avg batch time 166.32 ms\n", + "Iteration 50/100, avg batch time 166.49 ms\n", + "Iteration 60/100, avg batch time 166.74 ms\n", + "Iteration 70/100, avg batch time 166.88 ms\n", + "Iteration 80/100, avg batch time 167.05 ms\n", + "Iteration 90/100, avg batch time 167.18 ms\n", + "Iteration 100/100, avg batch time 167.31 ms\n", + "Input shape: torch.Size([128, 3, 300, 300])\n", + "Output location prediction size: torch.Size([128, 4, 8732])\n", + "Output label prediction size: torch.Size([128, 81, 8732])\n", + "Average batch time: 167.31 ms\n" + ] + } + ], + "source": [ + "# Model benchmark without Torch-TensorRT\n", + "model = ssd300.eval().to(\"cuda\")\n", + "benchmark(model, input_shape=(128, 3, 300, 300), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 3. Creating TorchScript modules " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To compile with Torch-TensorRT, the model must first be in **TorchScript**. TorchScript is a programming language included in PyTorch which removes the Python dependency normal PyTorch models have. This conversion is done via a JIT compiler which given a PyTorch Module will generate an equivalent TorchScript Module. There are two paths that can be used to generate TorchScript: **Tracing** and **Scripting**.
\n", + "- Tracing follows execution of PyTorch generating ops in TorchScript corresponding to what it sees.
\n", + "- Scripting does an analysis of the Python code and generates TorchScript, this allows the resulting graph to include control flow which tracing cannot do. \n", + "\n", + "Tracing however due to its simplicity is more likely to compile successfully with Torch-TensorRT (though both systems are supported)." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "model = ssd300.eval().to(\"cuda\")\n", + "traced_model = torch.jit.trace(model, [torch.randn((1,3,300,300)).to(\"cuda\")])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If required, we can also save this model and use it independently of Python." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# This is just an example, and not required for the purposes of this demo\n", + "torch.jit.save(traced_model, \"ssd_300_traced.jit.pt\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 165.53 ms\n", + "Iteration 20/100, avg batch time 166.19 ms\n", + "Iteration 30/100, avg batch time 166.12 ms\n", + "Iteration 40/100, avg batch time 166.16 ms\n", + "Iteration 50/100, avg batch time 166.24 ms\n", + "Iteration 60/100, avg batch time 166.33 ms\n", + "Iteration 70/100, avg batch time 166.43 ms\n", + "Iteration 80/100, avg batch time 166.44 ms\n", + "Iteration 90/100, avg batch time 166.53 ms\n", + "Iteration 100/100, avg batch time 166.59 ms\n", + "Input shape: torch.Size([128, 3, 300, 300])\n", + "Output location prediction size: torch.Size([128, 4, 8732])\n", + "Output label prediction size: torch.Size([128, 81, 8732])\n", + "Average batch time: 166.59 ms\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input with Torchscript compiled modules\n", + "benchmark(traced_model, input_shape=(128, 3, 300, 300), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 4. Compiling with Torch-TensorRT\n", + "TorchScript modules behave just like normal PyTorch modules and are intercompatible. From TorchScript we can now compile a TensorRT based module. This module will still be implemented in TorchScript but all the computation will be done in TensorRT." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP16 precision.\n", + "trt_model = torch_tensorrt.compile(traced_model, \n", + " inputs= [torch_tensorrt.Input((3, 3, 300, 300), dtype=torch.half)],\n", + " enabled_precisions= {torch.half}, # Run with FP16\n", + " workspace_size= 1 << 20\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 5. Running Inference" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we run object detection" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# using a Torch-TensorRT module is exactly the same as how we usually do inference in PyTorch i.e. model(inputs)\n", + "detections_batch = trt_model(tensor.to(torch.half)) # convert the input to half precision\n", + "\n", + "# By default, raw output from SSD network per input image contains 8732 boxes with \n", + "# localization and class probability distribution. \n", + "# Let’s filter this output to only get reasonable detections (confidence>40%) in a more comprehensive format.\n", + "results_per_input = utils.decode_results(detections_batch)\n", + "best_results_per_input_trt = [utils.pick_best(results, 0.40) for results in results_per_input]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, let's visualize our predictions!\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Visualize results with Torch-TensorRT\n", + "plot_results(best_results_per_input_trt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We get similar results as before!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 6. Measuring Speedup\n", + "We can run the benchmark function again to see the speedup gained! Compare this result with the same batch-size of input in the case without Torch-TensorRT above." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 45.88 ms\n", + "Iteration 20/100, avg batch time 46.20 ms\n", + "Iteration 30/100, avg batch time 46.10 ms\n", + "Iteration 40/100, avg batch time 46.19 ms\n", + "Iteration 50/100, avg batch time 46.15 ms\n", + "Iteration 60/100, avg batch time 46.17 ms\n", + "Iteration 70/100, avg batch time 46.19 ms\n", + "Iteration 80/100, avg batch time 46.20 ms\n", + "Iteration 90/100, avg batch time 46.22 ms\n", + "Iteration 100/100, avg batch time 46.21 ms\n", + "Input shape: torch.Size([128, 3, 300, 300])\n", + "Output location prediction size: torch.Size([128, 4, 8732])\n", + "Output label prediction size: torch.Size([128, 81, 8732])\n", + "Average batch time: 46.21 ms\n" + ] + } + ], + "source": [ + "batch_size = 128\n", + "\n", + "# Recompiling with batch_size we use for evaluating performance\n", + "trt_model = torch_tensorrt.compile(traced_model,\n", + " inputs = [torch_tensorrt.Input((batch_size, 3, 300, 300), dtype=torch.half)],\n", + " enabled_precisions= {torch.half}, # Run with FP16\n", + " workspace_size= 1 << 20\n", + ")\n", + "\n", + "benchmark(trt_model, input_shape=(batch_size, 3, 300, 300), dtype='fp16', nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 7. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling a TorchScript SSD300 model with Torch-TensorRT, and tested the performance impact of the optimization. We find that using the Torch-TensorRT compiled model, we gain significant speedup in inference without any noticeable drop in performance!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Details\n", + "For detailed information on model input and output,\n", + "training recipies, inference and performance visit:\n", + "[github](https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/Detection/SSD)\n", + "and/or [NGC](https://ngc.nvidia.com/catalog/model-scripts/nvidia:ssd_for_pytorch)\n", + "\n", + "### References\n", + "\n", + " - [SSD: Single Shot MultiBox Detector](https://arxiv.org/abs/1512.02325) paper\n", + " - [Speed/accuracy trade-offs for modern convolutional object detectors](https://arxiv.org/abs/1611.10012) paper\n", + " - [SSD on NGC](https://ngc.nvidia.com/catalog/model-scripts/nvidia:ssd_for_pytorch)\n", + " - [SSD on github](https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/Detection/SSD)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.1.1/_notebooks/vgg-qat.html b/docs/v1.1.1/_notebooks/vgg-qat.html new file mode 100644 index 0000000000..a47192b83e --- /dev/null +++ b/docs/v1.1.1/_notebooks/vgg-qat.html @@ -0,0 +1,2340 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Deploying Quantization Aware Trained models in INT8 using Torch-TensorRT — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +

+ Deploying Quantization Aware Trained models in INT8 using Torch-TensorRT + + ¶ + +

+

+ Overview + + ¶ + +

+

+ Quantization Aware training (QAT) simulates quantization during training by quantizing weights and activation layers. This will help to reduce the loss in accuracy when we convert the network trained in FP32 to INT8 for faster inference. QAT introduces additional nodes in the graph which will be used to learn the dynamic ranges of weights and activation layers. In this notebook, we illustrate the following steps from training to inference of a QAT model in Torch-TensorRT. +

+
    +
  1. +

    + + Requirements + +

    +
  2. +
  3. +

    + + VGG16 Overview + +

    +
  4. +
  5. +

    + + Training a baseline VGG16 model + +

    +
  6. +
  7. +

    + + Apply Quantization + +

    +
  8. +
  9. +

    + + Model calibration + +

    +
  10. +
  11. +

    + + Quantization Aware training + +

    +
  12. +
  13. +

    + + Export to Torchscript + +

    +
  14. +
  15. +

    + + Inference using Torch-TensorRT + +

    +
  16. +
  17. +

    + + References + +

    +
  18. +
+

+ ## 1. Requirements Please install the required dependencies and import these libraries accordingly +

+
+
+
+
[ ]:
+
+
+
+
+
+
+!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org
+
+
+
+
+
+
+
+
[1]:
+
+
+
+
+
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import torch.optim as optim
+import torch.utils.data as data
+import torchvision.transforms as transforms
+import torchvision.datasets as datasets
+import torch_tensorrt
+
+from torch.utils.tensorboard import SummaryWriter
+
+import pytorch_quantization
+from pytorch_quantization import nn as quant_nn
+from pytorch_quantization import quant_modules
+from pytorch_quantization.tensor_quant import QuantDescriptor
+from pytorch_quantization import calib
+from tqdm import tqdm
+
+print(pytorch_quantization.__version__)
+
+import os
+import sys
+sys.path.insert(0, "../examples/int8/training/vgg16")
+from vgg16 import vgg16
+
+
+
+
+
+
+
+
+
+
+
+2.1.0
+
+
+
+
+

+ ## 2. VGG16 Overview ### Very Deep Convolutional Networks for Large-Scale Image Recognition VGG is one of the earliest family of image classification networks that first used small (3x3) convolution filters and achieved significant improvements on ImageNet recognition challenge. The network architecture looks as follows + 3a4df2d5843f45a98c1e22f0e89feecb +

+

+ ## 3. Training a baseline VGG16 model We train VGG16 on CIFAR10 dataset. Define training and testing datasets and dataloaders. This will download the CIFAR 10 data in your + + + data + + + directory. Data preprocessing is performed using + + + torchvision + + + transforms. +

+
+
+
+
[2]:
+
+
+
+
+
+
+classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
+
+# ========== Define Training dataset and dataloaders =============#
+training_dataset = datasets.CIFAR10(root='./data',
+                                        train=True,
+                                        download=True,
+                                        transform=transforms.Compose([
+                                            transforms.RandomCrop(32, padding=4),
+                                            transforms.RandomHorizontalFlip(),
+                                            transforms.ToTensor(),
+                                            transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
+                                        ]))
+
+training_dataloader = torch.utils.data.DataLoader(training_dataset,
+                                                      batch_size=32,
+                                                      shuffle=True,
+                                                      num_workers=2)
+
+# ========== Define Testing dataset and dataloaders =============#
+testing_dataset = datasets.CIFAR10(root='./data',
+                                   train=False,
+                                   download=True,
+                                   transform=transforms.Compose([
+                                       transforms.ToTensor(),
+                                       transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
+                                   ]))
+
+testing_dataloader = torch.utils.data.DataLoader(testing_dataset,
+                                                 batch_size=16,
+                                                 shuffle=False,
+                                                 num_workers=2)
+
+
+
+
+
+
+
+
+
+
+
+Files already downloaded and verified
+Files already downloaded and verified
+
+
+
+
+
+
+
+
[3]:
+
+
+
+
+
+
+def train(model, dataloader, crit, opt, epoch):
+#     global writer
+    model.train()
+    running_loss = 0.0
+    for batch, (data, labels) in enumerate(dataloader):
+        data, labels = data.cuda(), labels.cuda(non_blocking=True)
+        opt.zero_grad()
+        out = model(data)
+        loss = crit(out, labels)
+        loss.backward()
+        opt.step()
+
+        running_loss += loss.item()
+        if batch % 500 == 499:
+            print("Batch: [%5d | %5d] loss: %.3f" % (batch + 1, len(dataloader), running_loss / 100))
+            running_loss = 0.0
+
+def test(model, dataloader, crit, epoch):
+    global writer
+    global classes
+    total = 0
+    correct = 0
+    loss = 0.0
+    class_probs = []
+    class_preds = []
+    model.eval()
+    with torch.no_grad():
+        for data, labels in dataloader:
+            data, labels = data.cuda(), labels.cuda(non_blocking=True)
+            out = model(data)
+            loss += crit(out, labels)
+            preds = torch.max(out, 1)[1]
+            class_probs.append([F.softmax(i, dim=0) for i in out])
+            class_preds.append(preds)
+            total += labels.size(0)
+            correct += (preds == labels).sum().item()
+
+    test_probs = torch.cat([torch.stack(batch) for batch in class_probs])
+    test_preds = torch.cat(class_preds)
+
+    return loss / total, correct / total
+
+def save_checkpoint(state, ckpt_path="checkpoint.pth"):
+    torch.save(state, ckpt_path)
+    print("Checkpoint saved")
+
+
+
+
+

+ + Define the VGG model that we are going to perfom QAT on. + +

+
+
+
+
[4]:
+
+
+
+
+
+
+# CIFAR 10 has 10 classes
+model = vgg16(num_classes=len(classes), init_weights=False)
+model = model.cuda()
+
+
+
+
+
+
+
+
[5]:
+
+
+
+
+
+
+# Declare Learning rate
+lr = 0.1
+state = {}
+state["lr"] = lr
+
+# Use cross entropy loss for classification and SGD optimizer
+crit = nn.CrossEntropyLoss()
+opt = optim.SGD(model.parameters(), lr=state["lr"], momentum=0.9, weight_decay=1e-4)
+
+
+# Adjust learning rate based on epoch number
+def adjust_lr(optimizer, epoch):
+    global state
+    new_lr = lr * (0.5**(epoch // 12)) if state["lr"] > 1e-7 else state["lr"]
+    if new_lr != state["lr"]:
+        state["lr"] = new_lr
+        print("Updating learning rate: {}".format(state["lr"]))
+        for param_group in optimizer.param_groups:
+            param_group["lr"] = state["lr"]
+
+
+
+
+
+
+
+
[6]:
+
+
+
+
+
+
+# Train the model for 25 epochs to get ~80% accuracy.
+num_epochs=25
+for epoch in range(num_epochs):
+    adjust_lr(opt, epoch)
+    print('Epoch: [%5d / %5d] LR: %f' % (epoch + 1, num_epochs, state["lr"]))
+
+    train(model, training_dataloader, crit, opt, epoch)
+    test_loss, test_acc = test(model, testing_dataloader, crit, epoch)
+
+    print("Test Loss: {:.5f} Test Acc: {:.2f}%".format(test_loss, 100 * test_acc))
+
+save_checkpoint({'epoch': epoch + 1,
+                 'model_state_dict': model.state_dict(),
+                 'acc': test_acc,
+                 'opt_state_dict': opt.state_dict(),
+                 'state': state},
+                ckpt_path="vgg16_base_ckpt")
+
+
+
+
+
+
+
+
+
+
+Epoch: [    1 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 13.288
+Batch: [ 1000 |  1563] loss: 11.345
+Batch: [ 1500 |  1563] loss: 11.008
+Test Loss: 0.13388 Test Acc: 13.23%
+Epoch: [    2 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 10.742
+Batch: [ 1000 |  1563] loss: 10.311
+Batch: [ 1500 |  1563] loss: 10.141
+Test Loss: 0.11888 Test Acc: 23.96%
+Epoch: [    3 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 9.877
+Batch: [ 1000 |  1563] loss: 9.821
+Batch: [ 1500 |  1563] loss: 9.818
+Test Loss: 0.11879 Test Acc: 24.68%
+Epoch: [    4 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 9.677
+Batch: [ 1000 |  1563] loss: 9.613
+Batch: [ 1500 |  1563] loss: 9.504
+Test Loss: 0.11499 Test Acc: 23.68%
+Epoch: [    5 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 9.560
+Batch: [ 1000 |  1563] loss: 9.536
+Batch: [ 1500 |  1563] loss: 9.309
+Test Loss: 0.10990 Test Acc: 27.84%
+Epoch: [    6 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 9.254
+Batch: [ 1000 |  1563] loss: 9.234
+Batch: [ 1500 |  1563] loss: 9.188
+Test Loss: 0.11594 Test Acc: 23.29%
+Epoch: [    7 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 9.141
+Batch: [ 1000 |  1563] loss: 9.110
+Batch: [ 1500 |  1563] loss: 9.013
+Test Loss: 0.10732 Test Acc: 29.24%
+Epoch: [    8 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 9.120
+Batch: [ 1000 |  1563] loss: 9.086
+Batch: [ 1500 |  1563] loss: 8.948
+Test Loss: 0.10732 Test Acc: 27.24%
+Epoch: [    9 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 8.941
+Batch: [ 1000 |  1563] loss: 8.997
+Batch: [ 1500 |  1563] loss: 9.028
+Test Loss: 0.11299 Test Acc: 25.52%
+Epoch: [   10 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 8.927
+Batch: [ 1000 |  1563] loss: 8.837
+Batch: [ 1500 |  1563] loss: 8.860
+Test Loss: 0.10130 Test Acc: 34.61%
+Epoch: [   11 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 8.953
+Batch: [ 1000 |  1563] loss: 8.738
+Batch: [ 1500 |  1563] loss: 8.724
+Test Loss: 0.10018 Test Acc: 32.27%
+Epoch: [   12 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 8.721
+Batch: [ 1000 |  1563] loss: 8.716
+Batch: [ 1500 |  1563] loss: 8.701
+Test Loss: 0.10070 Test Acc: 29.57%
+Updating learning rate: 0.05
+Epoch: [   13 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 7.944
+Batch: [ 1000 |  1563] loss: 7.649
+Batch: [ 1500 |  1563] loss: 7.511
+Test Loss: 0.08555 Test Acc: 44.62%
+Epoch: [   14 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 7.057
+Batch: [ 1000 |  1563] loss: 6.944
+Batch: [ 1500 |  1563] loss: 6.687
+Test Loss: 0.08331 Test Acc: 52.27%
+Epoch: [   15 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 6.470
+Batch: [ 1000 |  1563] loss: 6.439
+Batch: [ 1500 |  1563] loss: 6.126
+Test Loss: 0.07266 Test Acc: 58.02%
+Epoch: [   16 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 5.834
+Batch: [ 1000 |  1563] loss: 5.801
+Batch: [ 1500 |  1563] loss: 5.622
+Test Loss: 0.06340 Test Acc: 65.17%
+Epoch: [   17 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 5.459
+Batch: [ 1000 |  1563] loss: 5.442
+Batch: [ 1500 |  1563] loss: 5.314
+Test Loss: 0.05945 Test Acc: 67.22%
+Epoch: [   18 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 5.071
+Batch: [ 1000 |  1563] loss: 5.145
+Batch: [ 1500 |  1563] loss: 5.063
+Test Loss: 0.06567 Test Acc: 64.46%
+Epoch: [   19 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 4.796
+Batch: [ 1000 |  1563] loss: 4.781
+Batch: [ 1500 |  1563] loss: 4.732
+Test Loss: 0.05374 Test Acc: 71.87%
+Epoch: [   20 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 4.568
+Batch: [ 1000 |  1563] loss: 4.564
+Batch: [ 1500 |  1563] loss: 4.484
+Test Loss: 0.05311 Test Acc: 71.12%
+Epoch: [   21 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 4.385
+Batch: [ 1000 |  1563] loss: 4.302
+Batch: [ 1500 |  1563] loss: 4.285
+Test Loss: 0.05080 Test Acc: 74.29%
+Epoch: [   22 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 4.069
+Batch: [ 1000 |  1563] loss: 4.105
+Batch: [ 1500 |  1563] loss: 4.096
+Test Loss: 0.04807 Test Acc: 75.20%
+Epoch: [   23 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 3.959
+Batch: [ 1000 |  1563] loss: 3.898
+Batch: [ 1500 |  1563] loss: 3.916
+Test Loss: 0.04743 Test Acc: 75.81%
+Epoch: [   24 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 3.738
+Batch: [ 1000 |  1563] loss: 3.847
+Batch: [ 1500 |  1563] loss: 3.797
+Test Loss: 0.04609 Test Acc: 76.42%
+Updating learning rate: 0.025
+Epoch: [   25 /    25] LR: 0.025000
+Batch: [  500 |  1563] loss: 2.952
+Batch: [ 1000 |  1563] loss: 2.906
+Batch: [ 1500 |  1563] loss: 2.735
+Test Loss: 0.03466 Test Acc: 82.00%
+Checkpoint saved
+
+
+
+
+

+ ## 4. Apply Quantization +

+

+ + + quant_modules.initialize() + + + will ensure quantized version of modules will be called instead of original modules. For example, when you define a model with convolution, linear, pooling layers, + + + QuantConv2d + + + , + + + QuantLinear + + + and + + + QuantPooling + + + will be called. + + + QuantConv2d + + + basically wraps quantizer nodes around inputs and weights of regular + + + Conv2d + + + . Please refer to all the quantized modules in pytorch-quantization toolkit for more information. A + + + QuantConv2d + + + is represented in + + + pytorch-quantization + + + toolkit as follows. +

+
+
+
def forward(self, input):
+        # the actual quantization happens in the next level of the class hierarchy
+        quant_input, quant_weight = self._quant(input)
+
+        if self.padding_mode == 'circular':
+            expanded_padding = ((self.padding[1] + 1) // 2, self.padding[1] // 2,
+                                (self.padding[0] + 1) // 2, self.padding[0] // 2)
+            output = F.conv2d(F.pad(quant_input, expanded_padding, mode='circular'),
+                              quant_weight, self.bias, self.stride,
+                              _pair(0), self.dilation, self.groups)
+        else:
+            output = F.conv2d(quant_input, quant_weight, self.bias, self.stride, self.padding, self.dilation,
+                              self.groups)
+
+        return output
+
+
+
+
+
+
+
[7]:
+
+
+
+
+
+
+quant_modules.initialize()
+
+
+
+
+
+
+
+
[8]:
+
+
+
+
+
+
+# All the regular conv, FC layers will be converted to their quantozed counterparts due to quant_modules.initialize()
+qat_model = vgg16(num_classes=len(classes), init_weights=False)
+qat_model = qat_model.cuda()
+
+
+
+
+
+
+
+
[9]:
+
+
+
+
+
+
+# vgg16_base_ckpt is the checkpoint generated from Step 3 : Training a baseline VGG16 model.
+ckpt = torch.load("./vgg16_base_ckpt")
+modified_state_dict={}
+for key, val in ckpt["model_state_dict"].items():
+    # Remove 'module.' from the key names
+    if key.startswith('module'):
+        modified_state_dict[key[7:]] = val
+    else:
+        modified_state_dict[key] = val
+
+# Load the pre-trained checkpoint
+qat_model.load_state_dict(modified_state_dict)
+opt.load_state_dict(ckpt["opt_state_dict"])
+
+
+
+
+

+ ## 5. Model Calibration +

+

+ The quantizer nodes introduced in the model around desired layers capture the dynamic range (min_value, max_value) that is observed by the layer. Calibration is the process of computing the dynamic range of these layers by passing calibration data, which is usually a subset of training or validation data. There are different ways of calibration: + + + max + + + , + + + histogram + + + and + + + entropy + + + . We use + + + max + + + calibration technique as it is simple and effective. +

+
+
+
+
[10]:
+
+
+
+
+
+
+def compute_amax(model, **kwargs):
+    # Load calib result
+    for name, module in model.named_modules():
+        if isinstance(module, quant_nn.TensorQuantizer):
+            if module._calibrator is not None:
+                if isinstance(module._calibrator, calib.MaxCalibrator):
+                    module.load_calib_amax()
+                else:
+                    module.load_calib_amax(**kwargs)
+            print(F"{name:40}: {module}")
+    model.cuda()
+
+def collect_stats(model, data_loader, num_batches):
+    """Feed data to the network and collect statistics"""
+    # Enable calibrators
+    for name, module in model.named_modules():
+        if isinstance(module, quant_nn.TensorQuantizer):
+            if module._calibrator is not None:
+                module.disable_quant()
+                module.enable_calib()
+            else:
+                module.disable()
+
+    # Feed data to the network for collecting stats
+    for i, (image, _) in tqdm(enumerate(data_loader), total=num_batches):
+        model(image.cuda())
+        if i >= num_batches:
+            break
+
+    # Disable calibrators
+    for name, module in model.named_modules():
+        if isinstance(module, quant_nn.TensorQuantizer):
+            if module._calibrator is not None:
+                module.enable_quant()
+                module.disable_calib()
+            else:
+                module.enable()
+
+def calibrate_model(model, model_name, data_loader, num_calib_batch, calibrator, hist_percentile, out_dir):
+    """
+        Feed data to the network and calibrate.
+        Arguments:
+            model: classification model
+            model_name: name to use when creating state files
+            data_loader: calibration data set
+            num_calib_batch: amount of calibration passes to perform
+            calibrator: type of calibration to use (max/histogram)
+            hist_percentile: percentiles to be used for historgram calibration
+            out_dir: dir to save state files in
+    """
+
+    if num_calib_batch > 0:
+        print("Calibrating model")
+        with torch.no_grad():
+            collect_stats(model, data_loader, num_calib_batch)
+
+        if not calibrator == "histogram":
+            compute_amax(model, method="max")
+            calib_output = os.path.join(
+                out_dir,
+                F"{model_name}-max-{num_calib_batch*data_loader.batch_size}.pth")
+            torch.save(model.state_dict(), calib_output)
+        else:
+            for percentile in hist_percentile:
+                print(F"{percentile} percentile calibration")
+                compute_amax(model, method="percentile")
+                calib_output = os.path.join(
+                    out_dir,
+                    F"{model_name}-percentile-{percentile}-{num_calib_batch*data_loader.batch_size}.pth")
+                torch.save(model.state_dict(), calib_output)
+
+            for method in ["mse", "entropy"]:
+                print(F"{method} calibration")
+                compute_amax(model, method=method)
+                calib_output = os.path.join(
+                    out_dir,
+                    F"{model_name}-{method}-{num_calib_batch*data_loader.batch_size}.pth")
+                torch.save(model.state_dict(), calib_output)
+
+
+
+
+
+
+
+
[11]:
+
+
+
+
+
+
+#Calibrate the model using max calibration technique.
+with torch.no_grad():
+    calibrate_model(
+        model=qat_model,
+        model_name="vgg16",
+        data_loader=training_dataloader,
+        num_calib_batch=32,
+        calibrator="max",
+        hist_percentile=[99.9, 99.99, 99.999, 99.9999],
+        out_dir="./")
+
+
+
+
+
+
+
+
+
+
+Calibrating model
+
+
+
+
+
+
+
+
+
+
+100%|███████████████████████████████████████████████████████| 32/32 [00:00<00:00, 96.04it/s]
+WARNING: Logging before flag parsing goes to stderr.
+W1109 04:01:43.512364 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.513354 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.514046 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.514638 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.515270 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.515859 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.516441 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.517009 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.517600 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.518167 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.518752 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.519333 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.519911 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.520473 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.521038 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.521596 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.522170 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.522742 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.523360 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.523957 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.524581 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.525059 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.525366 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.525675 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.525962 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.526257 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.526566 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.526885 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.527188 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.527489 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.527792 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.528097 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.528387 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.528834 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.529163 139704147265344 tensor_quantizer.py:238] Call .cuda() if running on GPU after loading calibrated amax.
+W1109 04:01:43.532748 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([64, 1, 1, 1]).
+W1109 04:01:43.533468 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.534033 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([64, 1, 1, 1]).
+W1109 04:01:43.534684 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.535320 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([128, 1, 1, 1]).
+W1109 04:01:43.535983 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.536569 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([128, 1, 1, 1]).
+W1109 04:01:43.537248 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.537833 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([256, 1, 1, 1]).
+W1109 04:01:43.538480 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.539074 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([256, 1, 1, 1]).
+W1109 04:01:43.539724 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.540307 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([256, 1, 1, 1]).
+W1109 04:01:43.540952 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.541534 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).
+W1109 04:01:43.542075 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.542596 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).
+W1109 04:01:43.543248 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.543719 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).
+W1109 04:01:43.544424 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.544952 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).
+W1109 04:01:43.545530 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.546114 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).
+W1109 04:01:43.546713 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.547292 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).
+W1109 04:01:43.547902 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.548453 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.549015 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([4096, 1]).
+W1109 04:01:43.549665 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.550436 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([4096, 1]).
+W1109 04:01:43.551925 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.553105 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([10, 1]).
+
+
+
+
+
+
+
+
+
+
+features.0._input_quantizer             : TensorQuantizer(8bit narrow fake per-tensor amax=2.7537 calibrator=MaxCalibrator scale=1.0 quant)
+features.0._weight_quantizer            : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0263, 2.7454](64) calibrator=MaxCalibrator scale=1.0 quant)
+features.3._input_quantizer             : TensorQuantizer(8bit narrow fake per-tensor amax=27.5676 calibrator=MaxCalibrator scale=1.0 quant)
+features.3._weight_quantizer            : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0169, 1.8204](64) calibrator=MaxCalibrator scale=1.0 quant)
+features.7._input_quantizer             : TensorQuantizer(8bit narrow fake per-tensor amax=15.2002 calibrator=MaxCalibrator scale=1.0 quant)
+features.7._weight_quantizer            : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0493, 1.3207](128) calibrator=MaxCalibrator scale=1.0 quant)
+features.10._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=7.7376 calibrator=MaxCalibrator scale=1.0 quant)
+features.10._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0163, 0.9624](128) calibrator=MaxCalibrator scale=1.0 quant)
+features.14._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=8.8351 calibrator=MaxCalibrator scale=1.0 quant)
+features.14._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0622, 0.8791](256) calibrator=MaxCalibrator scale=1.0 quant)
+features.17._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=12.5746 calibrator=MaxCalibrator scale=1.0 quant)
+features.17._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0505, 0.5117](256) calibrator=MaxCalibrator scale=1.0 quant)
+features.20._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=9.7203 calibrator=MaxCalibrator scale=1.0 quant)
+features.20._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0296, 0.5335](256) calibrator=MaxCalibrator scale=1.0 quant)
+features.24._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=8.9367 calibrator=MaxCalibrator scale=1.0 quant)
+features.24._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0220, 0.3763](512) calibrator=MaxCalibrator scale=1.0 quant)
+features.27._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=6.6539 calibrator=MaxCalibrator scale=1.0 quant)
+features.27._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0151, 0.1777](512) calibrator=MaxCalibrator scale=1.0 quant)
+features.30._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=3.7099 calibrator=MaxCalibrator scale=1.0 quant)
+features.30._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0087, 0.1906](512) calibrator=MaxCalibrator scale=1.0 quant)
+features.34._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=4.0491 calibrator=MaxCalibrator scale=1.0 quant)
+features.34._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0106, 0.1971](512) calibrator=MaxCalibrator scale=1.0 quant)
+features.37._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=2.1531 calibrator=MaxCalibrator scale=1.0 quant)
+features.37._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0070, 0.2305](512) calibrator=MaxCalibrator scale=1.0 quant)
+features.40._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=3.3631 calibrator=MaxCalibrator scale=1.0 quant)
+features.40._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0023, 0.4726](512) calibrator=MaxCalibrator scale=1.0 quant)
+avgpool._input_quantizer                : TensorQuantizer(8bit narrow fake per-tensor amax=5.3550 calibrator=MaxCalibrator scale=1.0 quant)
+classifier.0._input_quantizer           : TensorQuantizer(8bit narrow fake per-tensor amax=5.3550 calibrator=MaxCalibrator scale=1.0 quant)
+classifier.0._weight_quantizer          : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0026, 0.5320](4096) calibrator=MaxCalibrator scale=1.0 quant)
+classifier.3._input_quantizer           : TensorQuantizer(8bit narrow fake per-tensor amax=6.6733 calibrator=MaxCalibrator scale=1.0 quant)
+classifier.3._weight_quantizer          : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0018, 0.5172](4096) calibrator=MaxCalibrator scale=1.0 quant)
+classifier.6._input_quantizer           : TensorQuantizer(8bit narrow fake per-tensor amax=9.4352 calibrator=MaxCalibrator scale=1.0 quant)
+classifier.6._weight_quantizer          : TensorQuantizer(8bit narrow fake axis=0 amax=[0.3877, 0.5620](10) calibrator=MaxCalibrator scale=1.0 quant)
+
+
+
+
+

+ ## 6. Quantization Aware Training +

+

+ In this phase, we finetune the model weights and leave the quantizer node values frozen. The dynamic ranges for each layer obtained from the calibration are kept constant while the weights of the model are finetuned to be close to the accuracy of original FP32 model (model without quantizer nodes) is preserved. Usually the finetuning of QAT model should be quick compared to the full training of the original model. Use QAT to fine-tune for around 10% of the original training schedule with an +annealing learning-rate. Please refer to Achieving FP32 Accuracy for INT8 Inference Using Quantization Aware Training with NVIDIA TensorRT for detailed recommendations. For this VGG model, it is enough to finetune for 1 epoch to get acceptable accuracy. During finetuning with QAT, the quantization is applied as a composition of + + + max + + + , + + + clamp + + + , + + + round + + + and + + + mul + + + ops. +

+
+
+
# amax is absolute maximum value for an input
+# The upper bound for integer quantization (127 for int8)
+max_bound = torch.tensor((2.0**(num_bits - 1 + int(unsigned))) - 1.0, device=amax.device)
+scale = max_bound / amax
+outputs = torch.clamp((inputs * scale).round_(), min_bound, max_bound)
+
+
+
+

+ tensor_quant function in + + + pytorch_quantization + + + toolkit is responsible for the above tensor quantization. Usually, per channel quantization is recommended for weights, while per tensor quantization is recommended for activations in a network. During inference, we use + + + torch.fake_quantize_per_tensor_affine + + + and + + + torch.fake_quantize_per_channel_affine + + + to perform quantization as this is easier to convert into corresponding TensorRT operators. Please refer to next sections for more details on +how these operators are exported in torchscript and converted in Torch-TensorRT. +

+
+
+
+
[12]:
+
+
+
+
+
+
+# Finetune the QAT model for 1 epoch
+num_epochs=1
+for epoch in range(num_epochs):
+    adjust_lr(opt, epoch)
+    print('Epoch: [%5d / %5d] LR: %f' % (epoch + 1, num_epochs, state["lr"]))
+
+    train(qat_model, training_dataloader, crit, opt, epoch)
+    test_loss, test_acc = test(qat_model, testing_dataloader, crit, epoch)
+
+    print("Test Loss: {:.5f} Test Acc: {:.2f}%".format(test_loss, 100 * test_acc))
+
+save_checkpoint({'epoch': epoch + 1,
+                 'model_state_dict': qat_model.state_dict(),
+                 'acc': test_acc,
+                 'opt_state_dict': opt.state_dict(),
+                 'state': state},
+                ckpt_path="vgg16_qat_ckpt")
+
+
+
+
+
+
+
+
+
+
+Updating learning rate: 0.1
+Epoch: [    1 /     1] LR: 0.100000
+Batch: [  500 |  1563] loss: 2.635
+Batch: [ 1000 |  1563] loss: 2.655
+Batch: [ 1500 |  1563] loss: 2.646
+Test Loss: 0.03291 Test Acc: 82.98%
+Checkpoint saved
+
+
+
+
+

+ ## 7. Export to Torchscript Export the model to Torch script. Trace the model and convert it into torchscript for deployment. To learn more about Torchscript, please refer to + + https://pytorch.org/docs/stable/jit.html + + . Setting + + + quant_nn.TensorQuantizer.use_fb_fake_quant + + + = + + + True + + + enables the QAT model to use + + + torch.fake_quantize_per_tensor_affine + + + and + + + torch.fake_quantize_per_channel_affine + + + operators instead of + + + tensor_quant + + + function to export quantization operators. In torchscript, they +are represented as + + + aten::fake_quantize_per_tensor_affine + + + and + + + aten::fake_quantize_per_channel_affine + + + . +

+
+
+
+
[13]:
+
+
+
+
+
+
+quant_nn.TensorQuantizer.use_fb_fake_quant = True
+with torch.no_grad():
+    data = iter(testing_dataloader)
+    images, _ = data.next()
+    jit_model = torch.jit.trace(qat_model, images.to("cuda"))
+    torch.jit.save(jit_model, "trained_vgg16_qat.jit.pt")
+
+
+
+
+
+
+
+
+
+
+E1109 04:02:37.101168 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.102248 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.107194 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.107625 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.115269 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.115740 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.117969 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.118358 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.126382 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.126834 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.128674 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.129518 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.135453 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.135936 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.137858 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.138366 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.145539 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.146053 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.147871 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.148353 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.154252 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.154685 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.156558 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.157159 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.163197 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.163676 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.165549 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.165991 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.173305 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.173926 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.176034 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.176697 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.182843 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.183426 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.185377 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.185962 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.191966 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.192424 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.194325 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.194817 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.201988 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.202665 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.204763 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.205461 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.211393 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.211987 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.213899 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.214450 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.220892 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.221533 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.223519 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.224037 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.233809 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.234434 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.238212 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.239042 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.241022 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.241654 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.247820 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.248445 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.250366 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.250959 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.257248 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.257854 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.259968 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.260660 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+W1109 04:02:37.268160 139704147265344 tensor_quantizer.py:280] Use Pytorch's native experimental fake quantization.
+/opt/conda/lib/python3.8/site-packages/pytorch_quantization/nn/modules/tensor_quantizer.py:285: TracerWarning: Converting a tensor to a Python number might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!
+  inputs, amax.item() / bound, 0,
+/opt/conda/lib/python3.8/site-packages/pytorch_quantization/nn/modules/tensor_quantizer.py:291: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!
+  quant_dim = list(amax.shape).index(list(amax_sequeeze.shape)[0])
+E1109 04:02:37.329273 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.330212 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.332529 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.333365 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.339547 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.340248 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.342257 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.342890 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.350619 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.351372 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.353470 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.354121 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.360090 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.360806 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.362803 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.363274 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.370369 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.371057 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.373071 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.373766 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.379890 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.380538 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.382532 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.383128 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.389077 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.389760 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.391815 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.392399 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.399809 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.400472 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.402399 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.402939 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.408818 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.409424 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.411513 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.412097 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.418537 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.419128 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.421343 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.421946 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.429382 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.430156 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.432259 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.433079 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.439297 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.440027 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.442149 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.442826 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.449377 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.449968 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.452122 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.452754 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.462532 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.463295 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.466963 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.467725 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.469692 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.470336 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.476204 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.476738 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.478809 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.479375 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.485666 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.486219 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.488416 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.488986 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+
+
+
+
+

+ ## 8. Inference using Torch-TensorRT In this phase, we run the exported torchscript graph of VGG QAT using Torch-TensorRT. Torch-TensorRT is a Pytorch-TensorRT compiler which converts Torchscript graphs into TensorRT. TensorRT 8.0 supports inference of quantization aware trained models and introduces new APIs; + + + QuantizeLayer + + + and + + + DequantizeLayer + + + . We can observe the entire VGG QAT graph quantization nodes from the debug log of Torch-TensorRT. To enable debug logging, you can set + + + torch_tensorrt.logging.set_reportable_log_level(torch_tensorrt.logging.Level.Debug) + + + . For example, + + + QuantConv2d + + + layer from + + + pytorch_quantization + + + toolkit is represented as follows in Torchscript +

+
+
+
%quant_input : Tensor = aten::fake_quantize_per_tensor_affine(%x, %636, %637, %638, %639)
+%quant_weight : Tensor = aten::fake_quantize_per_channel_affine(%394, %640, %641, %637, %638, %639)
+%input.2 : Tensor = aten::_convolution(%quant_input, %quant_weight, %395, %687, %688, %689, %643, %690, %642, %643, %643, %644, %644)
+
+
+
+

+ + + aten::fake_quantize_per_*_affine + + + is converted into + + + QuantizeLayer + + + + + + + DequantizeLayer + + + in Torch-TensorRT internally. Please refer to quantization op converters in Torch-TensorRT. +

+
+
+
+
[14]:
+
+
+
+
+
+
+qat_model = torch.jit.load("trained_vgg16_qat.jit.pt").eval()
+
+compile_spec = {"inputs": [torch_tensorrt.Input([16, 3, 32, 32])],
+                "enabled_precisions": torch.int8,
+                }
+trt_mod = torch_tensorrt.compile(qat_model, **compile_spec)
+
+test_loss, test_acc = test(trt_mod, testing_dataloader, crit, 0)
+print("VGG QAT accuracy using TensorRT: {:.2f}%".format(100 * test_acc))
+
+
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - Cannot infer input type from calcuations in graph for input x.2. Assuming it is Float32. If not, specify input type explicity
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT TorchScript Conversion Context] - Detected invalid timing cache, setup a local cache instead
+
+
+
+
+
+
+
+
+
+
+VGG QAT accuracy using TensorRT: 82.97%
+
+
+
+
+

+ Performance benchmarking + + ¶ + +

+
+
+
+
[15]:
+
+
+
+
+
+
+import time
+import numpy as np
+
+import torch.backends.cudnn as cudnn
+cudnn.benchmark = True
+
+# Helper function to benchmark the model
+def benchmark(model, input_shape=(1024, 1, 32, 32), dtype='fp32', nwarmup=50, nruns=1000):
+    input_data = torch.randn(input_shape)
+    input_data = input_data.to("cuda")
+    if dtype=='fp16':
+        input_data = input_data.half()
+
+    print("Warm up ...")
+    with torch.no_grad():
+        for _ in range(nwarmup):
+            features = model(input_data)
+    torch.cuda.synchronize()
+    print("Start timing ...")
+    timings = []
+    with torch.no_grad():
+        for i in range(1, nruns+1):
+            start_time = time.time()
+            output = model(input_data)
+            torch.cuda.synchronize()
+            end_time = time.time()
+            timings.append(end_time - start_time)
+            if i%100==0:
+                print('Iteration %d/%d, avg batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))
+
+    print("Input shape:", input_data.size())
+    print("Output shape:", output.shape)
+    print('Average batch time: %.2f ms'%(np.mean(timings)*1000))
+
+
+
+
+
+
+
+
+
[16]:
+
+
+
+
+
+
+benchmark(jit_model, input_shape=(16, 3, 32, 32))
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 100/1000, avg batch time 4.83 ms
+Iteration 200/1000, avg batch time 4.83 ms
+Iteration 300/1000, avg batch time 4.83 ms
+Iteration 400/1000, avg batch time 4.83 ms
+Iteration 500/1000, avg batch time 4.83 ms
+Iteration 600/1000, avg batch time 4.83 ms
+Iteration 700/1000, avg batch time 4.83 ms
+Iteration 800/1000, avg batch time 4.83 ms
+Iteration 900/1000, avg batch time 4.83 ms
+Iteration 1000/1000, avg batch time 4.83 ms
+Input shape: torch.Size([16, 3, 32, 32])
+Output shape: torch.Size([16, 10])
+Average batch time: 4.83 ms
+
+
+
+
+
+
+
+
[17]:
+
+
+
+
+
+
+benchmark(trt_mod, input_shape=(16, 3, 32, 32))
+
+
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 100/1000, avg batch time 1.87 ms
+Iteration 200/1000, avg batch time 1.84 ms
+Iteration 300/1000, avg batch time 1.85 ms
+Iteration 400/1000, avg batch time 1.83 ms
+Iteration 500/1000, avg batch time 1.82 ms
+Iteration 600/1000, avg batch time 1.81 ms
+Iteration 700/1000, avg batch time 1.81 ms
+Iteration 800/1000, avg batch time 1.80 ms
+Iteration 900/1000, avg batch time 1.80 ms
+Iteration 1000/1000, avg batch time 1.79 ms
+Input shape: torch.Size([16, 3, 32, 32])
+Output shape: torch.Size([16, 10])
+Average batch time: 1.79 ms
+
+
+
+
+

+ ## 9. References * Very Deep Convolution Networks for large scale Image Recognition * Achieving FP32 Accuracy for INT8 Inference Using Quantization Aware Training with NVIDIA TensorRT * QAT workflow for VGG16 * Deploying VGG QAT model in C++ using Torch-TensorRT * Pytorch-quantization toolkit from NVIDIA * Pytorch quantization toolkit userguide * Quantization basics +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_notebooks/vgg-qat.ipynb b/docs/v1.1.1/_notebooks/vgg-qat.ipynb new file mode 100644 index 0000000000..cca771ad92 --- /dev/null +++ b/docs/v1.1.1/_notebooks/vgg-qat.ipynb @@ -0,0 +1,1200 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8033b2eb", + "metadata": {}, + "source": [ + "# Deploying Quantization Aware Trained models in INT8 using Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "id": "69ec3ca7", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "Quantization Aware training (QAT) simulates quantization during training by quantizing weights and activation layers. This will help to reduce the loss in accuracy when we convert the network trained in FP32 to INT8 for faster inference. QAT introduces additional nodes in the graph which will be used to learn the dynamic ranges of weights and activation layers. In this notebook, we illustrate the following steps from training to inference of a QAT model in Torch-TensorRT.\n", + "\n", + "1. [Requirements](#1)\n", + "2. [VGG16 Overview](#2)\n", + "3. [Training a baseline VGG16 model](#3)\n", + "4. [Apply Quantization](#4)\n", + "5. [Model calibration](#5)\n", + "6. [Quantization Aware training](#6)\n", + "7. [Export to Torchscript](#7)\n", + "8. [Inference using Torch-TensorRT](#8)\n", + "8. [References](#8)" + ] + }, + { + "cell_type": "markdown", + "id": "79655ea8", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "Please install the required dependencies and import these libraries accordingly" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14a72941", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "6493e915", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.1.0\n" + ] + } + ], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "import torch.optim as optim\n", + "import torch.utils.data as data\n", + "import torchvision.transforms as transforms\n", + "import torchvision.datasets as datasets\n", + "import torch_tensorrt\n", + "\n", + "from torch.utils.tensorboard import SummaryWriter\n", + "\n", + "import pytorch_quantization\n", + "from pytorch_quantization import nn as quant_nn\n", + "from pytorch_quantization import quant_modules\n", + "from pytorch_quantization.tensor_quant import QuantDescriptor\n", + "from pytorch_quantization import calib\n", + "from tqdm import tqdm\n", + "\n", + "print(pytorch_quantization.__version__)\n", + "\n", + "import os\n", + "import sys\n", + "sys.path.insert(0, \"../examples/int8/training/vgg16\")\n", + "from vgg16 import vgg16\n" + ] + }, + { + "cell_type": "markdown", + "id": "4de5060a", + "metadata": {}, + "source": [ + "\n", + "## 2. VGG16 Overview\n", + "### Very Deep Convolutional Networks for Large-Scale Image Recognition\n", + "VGG is one of the earliest family of image classification networks that first used small (3x3) convolution filters and achieved significant improvements on ImageNet recognition challenge. The network architecture looks as follows\n", + "\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "7a5afc49", + "metadata": {}, + "source": [ + "\n", + "## 3. Training a baseline VGG16 model\n", + "We train VGG16 on CIFAR10 dataset. Define training and testing datasets and dataloaders. This will download the CIFAR 10 data in your `data` directory. Data preprocessing is performed using `torchvision` transforms. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5d2c4c45", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Files already downloaded and verified\n", + "Files already downloaded and verified\n" + ] + } + ], + "source": [ + "classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')\n", + "\n", + "# ========== Define Training dataset and dataloaders =============#\n", + "training_dataset = datasets.CIFAR10(root='./data',\n", + " train=True,\n", + " download=True,\n", + " transform=transforms.Compose([\n", + " transforms.RandomCrop(32, padding=4),\n", + " transforms.RandomHorizontalFlip(),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),\n", + " ]))\n", + "\n", + "training_dataloader = torch.utils.data.DataLoader(training_dataset,\n", + " batch_size=32,\n", + " shuffle=True,\n", + " num_workers=2)\n", + "\n", + "# ========== Define Testing dataset and dataloaders =============#\n", + "testing_dataset = datasets.CIFAR10(root='./data',\n", + " train=False,\n", + " download=True,\n", + " transform=transforms.Compose([\n", + " transforms.ToTensor(),\n", + " transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),\n", + " ]))\n", + "\n", + "testing_dataloader = torch.utils.data.DataLoader(testing_dataset,\n", + " batch_size=16,\n", + " shuffle=False,\n", + " num_workers=2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2bd092b3", + "metadata": {}, + "outputs": [], + "source": [ + "def train(model, dataloader, crit, opt, epoch):\n", + "# global writer\n", + " model.train()\n", + " running_loss = 0.0\n", + " for batch, (data, labels) in enumerate(dataloader):\n", + " data, labels = data.cuda(), labels.cuda(non_blocking=True)\n", + " opt.zero_grad()\n", + " out = model(data)\n", + " loss = crit(out, labels)\n", + " loss.backward()\n", + " opt.step()\n", + "\n", + " running_loss += loss.item()\n", + " if batch % 500 == 499:\n", + " print(\"Batch: [%5d | %5d] loss: %.3f\" % (batch + 1, len(dataloader), running_loss / 100))\n", + " running_loss = 0.0\n", + " \n", + "def test(model, dataloader, crit, epoch):\n", + " global writer\n", + " global classes\n", + " total = 0\n", + " correct = 0\n", + " loss = 0.0\n", + " class_probs = []\n", + " class_preds = []\n", + " model.eval()\n", + " with torch.no_grad():\n", + " for data, labels in dataloader:\n", + " data, labels = data.cuda(), labels.cuda(non_blocking=True)\n", + " out = model(data)\n", + " loss += crit(out, labels)\n", + " preds = torch.max(out, 1)[1]\n", + " class_probs.append([F.softmax(i, dim=0) for i in out])\n", + " class_preds.append(preds)\n", + " total += labels.size(0)\n", + " correct += (preds == labels).sum().item()\n", + "\n", + " test_probs = torch.cat([torch.stack(batch) for batch in class_probs])\n", + " test_preds = torch.cat(class_preds)\n", + "\n", + " return loss / total, correct / total\n", + "\n", + "def save_checkpoint(state, ckpt_path=\"checkpoint.pth\"):\n", + " torch.save(state, ckpt_path)\n", + " print(\"Checkpoint saved\")" + ] + }, + { + "cell_type": "markdown", + "id": "c80a86cc", + "metadata": {}, + "source": [ + "*Define the VGG model that we are going to perfom QAT on.*" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "8c564b8f", + "metadata": {}, + "outputs": [], + "source": [ + "# CIFAR 10 has 10 classes\n", + "model = vgg16(num_classes=len(classes), init_weights=False)\n", + "model = model.cuda()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "abc00452", + "metadata": {}, + "outputs": [], + "source": [ + "# Declare Learning rate\n", + "lr = 0.1\n", + "state = {}\n", + "state[\"lr\"] = lr\n", + "\n", + "# Use cross entropy loss for classification and SGD optimizer\n", + "crit = nn.CrossEntropyLoss()\n", + "opt = optim.SGD(model.parameters(), lr=state[\"lr\"], momentum=0.9, weight_decay=1e-4)\n", + "\n", + "\n", + "# Adjust learning rate based on epoch number\n", + "def adjust_lr(optimizer, epoch):\n", + " global state\n", + " new_lr = lr * (0.5**(epoch // 12)) if state[\"lr\"] > 1e-7 else state[\"lr\"]\n", + " if new_lr != state[\"lr\"]:\n", + " state[\"lr\"] = new_lr\n", + " print(\"Updating learning rate: {}\".format(state[\"lr\"]))\n", + " for param_group in optimizer.param_groups:\n", + " param_group[\"lr\"] = state[\"lr\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d80865a2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: [ 1 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 13.288\n", + "Batch: [ 1000 | 1563] loss: 11.345\n", + "Batch: [ 1500 | 1563] loss: 11.008\n", + "Test Loss: 0.13388 Test Acc: 13.23%\n", + "Epoch: [ 2 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 10.742\n", + "Batch: [ 1000 | 1563] loss: 10.311\n", + "Batch: [ 1500 | 1563] loss: 10.141\n", + "Test Loss: 0.11888 Test Acc: 23.96%\n", + "Epoch: [ 3 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.877\n", + "Batch: [ 1000 | 1563] loss: 9.821\n", + "Batch: [ 1500 | 1563] loss: 9.818\n", + "Test Loss: 0.11879 Test Acc: 24.68%\n", + "Epoch: [ 4 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.677\n", + "Batch: [ 1000 | 1563] loss: 9.613\n", + "Batch: [ 1500 | 1563] loss: 9.504\n", + "Test Loss: 0.11499 Test Acc: 23.68%\n", + "Epoch: [ 5 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.560\n", + "Batch: [ 1000 | 1563] loss: 9.536\n", + "Batch: [ 1500 | 1563] loss: 9.309\n", + "Test Loss: 0.10990 Test Acc: 27.84%\n", + "Epoch: [ 6 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.254\n", + "Batch: [ 1000 | 1563] loss: 9.234\n", + "Batch: [ 1500 | 1563] loss: 9.188\n", + "Test Loss: 0.11594 Test Acc: 23.29%\n", + "Epoch: [ 7 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.141\n", + "Batch: [ 1000 | 1563] loss: 9.110\n", + "Batch: [ 1500 | 1563] loss: 9.013\n", + "Test Loss: 0.10732 Test Acc: 29.24%\n", + "Epoch: [ 8 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.120\n", + "Batch: [ 1000 | 1563] loss: 9.086\n", + "Batch: [ 1500 | 1563] loss: 8.948\n", + "Test Loss: 0.10732 Test Acc: 27.24%\n", + "Epoch: [ 9 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 8.941\n", + "Batch: [ 1000 | 1563] loss: 8.997\n", + "Batch: [ 1500 | 1563] loss: 9.028\n", + "Test Loss: 0.11299 Test Acc: 25.52%\n", + "Epoch: [ 10 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 8.927\n", + "Batch: [ 1000 | 1563] loss: 8.837\n", + "Batch: [ 1500 | 1563] loss: 8.860\n", + "Test Loss: 0.10130 Test Acc: 34.61%\n", + "Epoch: [ 11 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 8.953\n", + "Batch: [ 1000 | 1563] loss: 8.738\n", + "Batch: [ 1500 | 1563] loss: 8.724\n", + "Test Loss: 0.10018 Test Acc: 32.27%\n", + "Epoch: [ 12 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 8.721\n", + "Batch: [ 1000 | 1563] loss: 8.716\n", + "Batch: [ 1500 | 1563] loss: 8.701\n", + "Test Loss: 0.10070 Test Acc: 29.57%\n", + "Updating learning rate: 0.05\n", + "Epoch: [ 13 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 7.944\n", + "Batch: [ 1000 | 1563] loss: 7.649\n", + "Batch: [ 1500 | 1563] loss: 7.511\n", + "Test Loss: 0.08555 Test Acc: 44.62%\n", + "Epoch: [ 14 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 7.057\n", + "Batch: [ 1000 | 1563] loss: 6.944\n", + "Batch: [ 1500 | 1563] loss: 6.687\n", + "Test Loss: 0.08331 Test Acc: 52.27%\n", + "Epoch: [ 15 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 6.470\n", + "Batch: [ 1000 | 1563] loss: 6.439\n", + "Batch: [ 1500 | 1563] loss: 6.126\n", + "Test Loss: 0.07266 Test Acc: 58.02%\n", + "Epoch: [ 16 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 5.834\n", + "Batch: [ 1000 | 1563] loss: 5.801\n", + "Batch: [ 1500 | 1563] loss: 5.622\n", + "Test Loss: 0.06340 Test Acc: 65.17%\n", + "Epoch: [ 17 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 5.459\n", + "Batch: [ 1000 | 1563] loss: 5.442\n", + "Batch: [ 1500 | 1563] loss: 5.314\n", + "Test Loss: 0.05945 Test Acc: 67.22%\n", + "Epoch: [ 18 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 5.071\n", + "Batch: [ 1000 | 1563] loss: 5.145\n", + "Batch: [ 1500 | 1563] loss: 5.063\n", + "Test Loss: 0.06567 Test Acc: 64.46%\n", + "Epoch: [ 19 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 4.796\n", + "Batch: [ 1000 | 1563] loss: 4.781\n", + "Batch: [ 1500 | 1563] loss: 4.732\n", + "Test Loss: 0.05374 Test Acc: 71.87%\n", + "Epoch: [ 20 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 4.568\n", + "Batch: [ 1000 | 1563] loss: 4.564\n", + "Batch: [ 1500 | 1563] loss: 4.484\n", + "Test Loss: 0.05311 Test Acc: 71.12%\n", + "Epoch: [ 21 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 4.385\n", + "Batch: [ 1000 | 1563] loss: 4.302\n", + "Batch: [ 1500 | 1563] loss: 4.285\n", + "Test Loss: 0.05080 Test Acc: 74.29%\n", + "Epoch: [ 22 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 4.069\n", + "Batch: [ 1000 | 1563] loss: 4.105\n", + "Batch: [ 1500 | 1563] loss: 4.096\n", + "Test Loss: 0.04807 Test Acc: 75.20%\n", + "Epoch: [ 23 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 3.959\n", + "Batch: [ 1000 | 1563] loss: 3.898\n", + "Batch: [ 1500 | 1563] loss: 3.916\n", + "Test Loss: 0.04743 Test Acc: 75.81%\n", + "Epoch: [ 24 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 3.738\n", + "Batch: [ 1000 | 1563] loss: 3.847\n", + "Batch: [ 1500 | 1563] loss: 3.797\n", + "Test Loss: 0.04609 Test Acc: 76.42%\n", + "Updating learning rate: 0.025\n", + "Epoch: [ 25 / 25] LR: 0.025000\n", + "Batch: [ 500 | 1563] loss: 2.952\n", + "Batch: [ 1000 | 1563] loss: 2.906\n", + "Batch: [ 1500 | 1563] loss: 2.735\n", + "Test Loss: 0.03466 Test Acc: 82.00%\n", + "Checkpoint saved\n" + ] + } + ], + "source": [ + "# Train the model for 25 epochs to get ~80% accuracy.\n", + "num_epochs=25\n", + "for epoch in range(num_epochs):\n", + " adjust_lr(opt, epoch)\n", + " print('Epoch: [%5d / %5d] LR: %f' % (epoch + 1, num_epochs, state[\"lr\"]))\n", + "\n", + " train(model, training_dataloader, crit, opt, epoch)\n", + " test_loss, test_acc = test(model, testing_dataloader, crit, epoch)\n", + "\n", + " print(\"Test Loss: {:.5f} Test Acc: {:.2f}%\".format(test_loss, 100 * test_acc))\n", + " \n", + "save_checkpoint({'epoch': epoch + 1,\n", + " 'model_state_dict': model.state_dict(),\n", + " 'acc': test_acc,\n", + " 'opt_state_dict': opt.state_dict(),\n", + " 'state': state},\n", + " ckpt_path=\"vgg16_base_ckpt\")" + ] + }, + { + "cell_type": "markdown", + "id": "e1044537", + "metadata": {}, + "source": [ + "\n", + "## 4. Apply Quantization" + ] + }, + { + "cell_type": "markdown", + "id": "c33b7f4e", + "metadata": {}, + "source": [ + "`quant_modules.initialize()` will ensure quantized version of modules will be called instead of original modules. For example, when you define a model with convolution, linear, pooling layers, `QuantConv2d`, `QuantLinear` and `QuantPooling` will be called. `QuantConv2d` basically wraps quantizer nodes around inputs and weights of regular `Conv2d`. Please refer to all the quantized modules in pytorch-quantization toolkit for more information. A `QuantConv2d` is represented in `pytorch-quantization` toolkit as follows.\n", + "\n", + "```\n", + "def forward(self, input):\n", + " # the actual quantization happens in the next level of the class hierarchy\n", + " quant_input, quant_weight = self._quant(input)\n", + "\n", + " if self.padding_mode == 'circular':\n", + " expanded_padding = ((self.padding[1] + 1) // 2, self.padding[1] // 2,\n", + " (self.padding[0] + 1) // 2, self.padding[0] // 2)\n", + " output = F.conv2d(F.pad(quant_input, expanded_padding, mode='circular'),\n", + " quant_weight, self.bias, self.stride,\n", + " _pair(0), self.dilation, self.groups)\n", + " else:\n", + " output = F.conv2d(quant_input, quant_weight, self.bias, self.stride, self.padding, self.dilation,\n", + " self.groups)\n", + "\n", + " return output\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "985dc59e", + "metadata": {}, + "outputs": [], + "source": [ + "quant_modules.initialize()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "164ce8cb", + "metadata": {}, + "outputs": [], + "source": [ + "# All the regular conv, FC layers will be converted to their quantozed counterparts due to quant_modules.initialize()\n", + "qat_model = vgg16(num_classes=len(classes), init_weights=False)\n", + "qat_model = qat_model.cuda()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8e5f7fb5", + "metadata": {}, + "outputs": [], + "source": [ + "# vgg16_base_ckpt is the checkpoint generated from Step 3 : Training a baseline VGG16 model.\n", + "ckpt = torch.load(\"./vgg16_base_ckpt\")\n", + "modified_state_dict={}\n", + "for key, val in ckpt[\"model_state_dict\"].items():\n", + " # Remove 'module.' from the key names\n", + " if key.startswith('module'):\n", + " modified_state_dict[key[7:]] = val\n", + " else:\n", + " modified_state_dict[key] = val\n", + "\n", + "# Load the pre-trained checkpoint\n", + "qat_model.load_state_dict(modified_state_dict)\n", + "opt.load_state_dict(ckpt[\"opt_state_dict\"])" + ] + }, + { + "cell_type": "markdown", + "id": "8f8a74e8", + "metadata": {}, + "source": [ + "\n", + "## 5. Model Calibration" + ] + }, + { + "cell_type": "markdown", + "id": "d2a321f9", + "metadata": {}, + "source": [ + "The quantizer nodes introduced in the model around desired layers capture the dynamic range (min_value, max_value) that is observed by the layer. Calibration is the process of computing the dynamic range of these layers by passing calibration data, which is usually a subset of training or validation data. There are different ways of calibration: `max`, `histogram` and `entropy`. We use `max` calibration technique as it is simple and effective. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "039423dc", + "metadata": {}, + "outputs": [], + "source": [ + "def compute_amax(model, **kwargs):\n", + " # Load calib result\n", + " for name, module in model.named_modules():\n", + " if isinstance(module, quant_nn.TensorQuantizer):\n", + " if module._calibrator is not None:\n", + " if isinstance(module._calibrator, calib.MaxCalibrator):\n", + " module.load_calib_amax()\n", + " else:\n", + " module.load_calib_amax(**kwargs)\n", + " print(F\"{name:40}: {module}\")\n", + " model.cuda()\n", + "\n", + "def collect_stats(model, data_loader, num_batches):\n", + " \"\"\"Feed data to the network and collect statistics\"\"\"\n", + " # Enable calibrators\n", + " for name, module in model.named_modules():\n", + " if isinstance(module, quant_nn.TensorQuantizer):\n", + " if module._calibrator is not None:\n", + " module.disable_quant()\n", + " module.enable_calib()\n", + " else:\n", + " module.disable()\n", + "\n", + " # Feed data to the network for collecting stats\n", + " for i, (image, _) in tqdm(enumerate(data_loader), total=num_batches):\n", + " model(image.cuda())\n", + " if i >= num_batches:\n", + " break\n", + "\n", + " # Disable calibrators\n", + " for name, module in model.named_modules():\n", + " if isinstance(module, quant_nn.TensorQuantizer):\n", + " if module._calibrator is not None:\n", + " module.enable_quant()\n", + " module.disable_calib()\n", + " else:\n", + " module.enable()\n", + "\n", + "def calibrate_model(model, model_name, data_loader, num_calib_batch, calibrator, hist_percentile, out_dir):\n", + " \"\"\"\n", + " Feed data to the network and calibrate.\n", + " Arguments:\n", + " model: classification model\n", + " model_name: name to use when creating state files\n", + " data_loader: calibration data set\n", + " num_calib_batch: amount of calibration passes to perform\n", + " calibrator: type of calibration to use (max/histogram)\n", + " hist_percentile: percentiles to be used for historgram calibration\n", + " out_dir: dir to save state files in\n", + " \"\"\"\n", + "\n", + " if num_calib_batch > 0:\n", + " print(\"Calibrating model\")\n", + " with torch.no_grad():\n", + " collect_stats(model, data_loader, num_calib_batch)\n", + "\n", + " if not calibrator == \"histogram\":\n", + " compute_amax(model, method=\"max\")\n", + " calib_output = os.path.join(\n", + " out_dir,\n", + " F\"{model_name}-max-{num_calib_batch*data_loader.batch_size}.pth\")\n", + " torch.save(model.state_dict(), calib_output)\n", + " else:\n", + " for percentile in hist_percentile:\n", + " print(F\"{percentile} percentile calibration\")\n", + " compute_amax(model, method=\"percentile\")\n", + " calib_output = os.path.join(\n", + " out_dir,\n", + " F\"{model_name}-percentile-{percentile}-{num_calib_batch*data_loader.batch_size}.pth\")\n", + " torch.save(model.state_dict(), calib_output)\n", + "\n", + " for method in [\"mse\", \"entropy\"]:\n", + " print(F\"{method} calibration\")\n", + " compute_amax(model, method=method)\n", + " calib_output = os.path.join(\n", + " out_dir,\n", + " F\"{model_name}-{method}-{num_calib_batch*data_loader.batch_size}.pth\")\n", + " torch.save(model.state_dict(), calib_output)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "78504a6f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Calibrating model\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████████████████████| 32/32 [00:00<00:00, 96.04it/s]\n", + "WARNING: Logging before flag parsing goes to stderr.\n", + "W1109 04:01:43.512364 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.513354 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.514046 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.514638 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.515270 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.515859 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.516441 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.517009 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.517600 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.518167 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.518752 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.519333 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.519911 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.520473 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.521038 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.521596 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.522170 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.522742 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.523360 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.523957 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.524581 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.525059 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.525366 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.525675 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.525962 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.526257 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.526566 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.526885 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.527188 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.527489 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.527792 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.528097 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.528387 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.528834 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.529163 139704147265344 tensor_quantizer.py:238] Call .cuda() if running on GPU after loading calibrated amax.\n", + "W1109 04:01:43.532748 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([64, 1, 1, 1]).\n", + "W1109 04:01:43.533468 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.534033 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([64, 1, 1, 1]).\n", + "W1109 04:01:43.534684 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.535320 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([128, 1, 1, 1]).\n", + "W1109 04:01:43.535983 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.536569 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([128, 1, 1, 1]).\n", + "W1109 04:01:43.537248 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.537833 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([256, 1, 1, 1]).\n", + "W1109 04:01:43.538480 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.539074 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([256, 1, 1, 1]).\n", + "W1109 04:01:43.539724 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.540307 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([256, 1, 1, 1]).\n", + "W1109 04:01:43.540952 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.541534 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.542075 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.542596 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.543248 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.543719 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.544424 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.544952 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.545530 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.546114 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.546713 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.547292 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.547902 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.548453 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.549015 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([4096, 1]).\n", + "W1109 04:01:43.549665 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.550436 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([4096, 1]).\n", + "W1109 04:01:43.551925 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.553105 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([10, 1]).\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "features.0._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=2.7537 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.0._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0263, 2.7454](64) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.3._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=27.5676 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.3._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0169, 1.8204](64) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.7._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=15.2002 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.7._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0493, 1.3207](128) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.10._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=7.7376 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.10._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0163, 0.9624](128) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.14._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=8.8351 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.14._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0622, 0.8791](256) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.17._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=12.5746 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.17._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0505, 0.5117](256) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.20._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=9.7203 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.20._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0296, 0.5335](256) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.24._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=8.9367 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.24._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0220, 0.3763](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.27._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=6.6539 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.27._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0151, 0.1777](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.30._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=3.7099 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.30._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0087, 0.1906](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.34._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=4.0491 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.34._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0106, 0.1971](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.37._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=2.1531 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.37._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0070, 0.2305](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.40._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=3.3631 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.40._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0023, 0.4726](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "avgpool._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=5.3550 calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.0._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=5.3550 calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.0._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0026, 0.5320](4096) calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.3._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=6.6733 calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.3._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0018, 0.5172](4096) calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.6._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=9.4352 calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.6._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.3877, 0.5620](10) calibrator=MaxCalibrator scale=1.0 quant)\n" + ] + } + ], + "source": [ + "#Calibrate the model using max calibration technique.\n", + "with torch.no_grad():\n", + " calibrate_model(\n", + " model=qat_model,\n", + " model_name=\"vgg16\",\n", + " data_loader=training_dataloader,\n", + " num_calib_batch=32,\n", + " calibrator=\"max\",\n", + " hist_percentile=[99.9, 99.99, 99.999, 99.9999],\n", + " out_dir=\"./\")" + ] + }, + { + "cell_type": "markdown", + "id": "1aa0c109", + "metadata": {}, + "source": [ + "\n", + "## 6. Quantization Aware Training" + ] + }, + { + "cell_type": "markdown", + "id": "9fe8ec11", + "metadata": {}, + "source": [ + "In this phase, we finetune the model weights and leave the quantizer node values frozen. The dynamic ranges for each layer obtained from the calibration are kept constant while the weights of the model are finetuned to be close to the accuracy of original FP32 model (model without quantizer nodes) is preserved. Usually the finetuning of QAT model should be quick compared to the full training of the original model. Use QAT to fine-tune for around 10% of the original training schedule with an annealing learning-rate. Please refer to Achieving FP32 Accuracy for INT8 Inference Using Quantization Aware Training with NVIDIA TensorRT for detailed recommendations. For this VGG model, it is enough to finetune for 1 epoch to get acceptable accuracy. \n", + "During finetuning with QAT, the quantization is applied as a composition of `max`, `clamp`, `round` and `mul` ops. \n", + "```\n", + "# amax is absolute maximum value for an input\n", + "# The upper bound for integer quantization (127 for int8)\n", + "max_bound = torch.tensor((2.0**(num_bits - 1 + int(unsigned))) - 1.0, device=amax.device)\n", + "scale = max_bound / amax\n", + "outputs = torch.clamp((inputs * scale).round_(), min_bound, max_bound)\n", + "```\n", + "tensor_quant function in `pytorch_quantization` toolkit is responsible for the above tensor quantization. Usually, per channel quantization is recommended for weights, while per tensor quantization is recommended for activations in a network.\n", + "During inference, we use `torch.fake_quantize_per_tensor_affine` and `torch.fake_quantize_per_channel_affine` to perform quantization as this is easier to convert into corresponding TensorRT operators. Please refer to next sections for more details on how these operators are exported in torchscript and converted in Torch-TensorRT." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "1f28d228", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Updating learning rate: 0.1\n", + "Epoch: [ 1 / 1] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 2.635\n", + "Batch: [ 1000 | 1563] loss: 2.655\n", + "Batch: [ 1500 | 1563] loss: 2.646\n", + "Test Loss: 0.03291 Test Acc: 82.98%\n", + "Checkpoint saved\n" + ] + } + ], + "source": [ + "# Finetune the QAT model for 1 epoch\n", + "num_epochs=1\n", + "for epoch in range(num_epochs):\n", + " adjust_lr(opt, epoch)\n", + " print('Epoch: [%5d / %5d] LR: %f' % (epoch + 1, num_epochs, state[\"lr\"]))\n", + "\n", + " train(qat_model, training_dataloader, crit, opt, epoch)\n", + " test_loss, test_acc = test(qat_model, testing_dataloader, crit, epoch)\n", + "\n", + " print(\"Test Loss: {:.5f} Test Acc: {:.2f}%\".format(test_loss, 100 * test_acc))\n", + " \n", + "save_checkpoint({'epoch': epoch + 1,\n", + " 'model_state_dict': qat_model.state_dict(),\n", + " 'acc': test_acc,\n", + " 'opt_state_dict': opt.state_dict(),\n", + " 'state': state},\n", + " ckpt_path=\"vgg16_qat_ckpt\")" + ] + }, + { + "cell_type": "markdown", + "id": "7a4dcaa2", + "metadata": {}, + "source": [ + "\n", + "## 7. Export to Torchscript\n", + "Export the model to Torch script. Trace the model and convert it into torchscript for deployment. To learn more about Torchscript, please refer to https://pytorch.org/docs/stable/jit.html. Setting `quant_nn.TensorQuantizer.use_fb_fake_quant = True` enables the QAT model to use `torch.fake_quantize_per_tensor_affine` and `torch.fake_quantize_per_channel_affine` operators instead of `tensor_quant` function to export quantization operators. In torchscript, they are represented as `aten::fake_quantize_per_tensor_affine` and `aten::fake_quantize_per_channel_affine`. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "3d34f526", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "E1109 04:02:37.101168 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.102248 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.107194 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.107625 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.115269 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.115740 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.117969 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.118358 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.126382 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.126834 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.128674 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.129518 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.135453 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.135936 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.137858 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.138366 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.145539 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.146053 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.147871 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.148353 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.154252 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.154685 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.156558 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.157159 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.163197 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.163676 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.165549 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.165991 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.173305 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.173926 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.176034 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.176697 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.182843 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.183426 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.185377 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.185962 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.191966 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.192424 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.194325 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.194817 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.201988 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.202665 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.204763 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.205461 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.211393 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.211987 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.213899 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.214450 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.220892 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.221533 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.223519 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.224037 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.233809 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.234434 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.238212 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.239042 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.241022 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.241654 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.247820 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.248445 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.250366 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.250959 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.257248 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.257854 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.259968 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.260660 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "W1109 04:02:37.268160 139704147265344 tensor_quantizer.py:280] Use Pytorch's native experimental fake quantization.\n", + "/opt/conda/lib/python3.8/site-packages/pytorch_quantization/nn/modules/tensor_quantizer.py:285: TracerWarning: Converting a tensor to a Python number might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!\n", + " inputs, amax.item() / bound, 0,\n", + "/opt/conda/lib/python3.8/site-packages/pytorch_quantization/nn/modules/tensor_quantizer.py:291: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!\n", + " quant_dim = list(amax.shape).index(list(amax_sequeeze.shape)[0])\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "E1109 04:02:37.329273 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.330212 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.332529 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.333365 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.339547 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.340248 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.342257 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.342890 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.350619 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.351372 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.353470 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.354121 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.360090 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.360806 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.362803 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.363274 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.370369 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.371057 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.373071 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.373766 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.379890 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.380538 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.382532 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.383128 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.389077 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.389760 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.391815 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.392399 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.399809 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.400472 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.402399 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.402939 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.408818 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.409424 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.411513 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.412097 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.418537 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.419128 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.421343 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.421946 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.429382 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.430156 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.432259 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.433079 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.439297 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.440027 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.442149 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.442826 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.449377 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.449968 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.452122 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.452754 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.462532 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.463295 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.466963 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.467725 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.469692 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.470336 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.476204 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.476738 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.478809 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.479375 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.485666 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.486219 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.488416 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.488986 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n" + ] + } + ], + "source": [ + "quant_nn.TensorQuantizer.use_fb_fake_quant = True\n", + "with torch.no_grad():\n", + " data = iter(testing_dataloader)\n", + " images, _ = data.next()\n", + " jit_model = torch.jit.trace(qat_model, images.to(\"cuda\"))\n", + " torch.jit.save(jit_model, \"trained_vgg16_qat.jit.pt\")" + ] + }, + { + "cell_type": "markdown", + "id": "7341418a", + "metadata": {}, + "source": [ + "\n", + "## 8. Inference using Torch-TensorRT\n", + "In this phase, we run the exported torchscript graph of VGG QAT using Torch-TensorRT. Torch-TensorRT is a Pytorch-TensorRT compiler which converts Torchscript graphs into TensorRT. TensorRT 8.0 supports inference of quantization aware trained models and introduces new APIs; `QuantizeLayer` and `DequantizeLayer`. We can observe the entire VGG QAT graph quantization nodes from the debug log of Torch-TensorRT. To enable debug logging, you can set `torch_tensorrt.logging.set_reportable_log_level(torch_tensorrt.logging.Level.Debug)`. For example, `QuantConv2d` layer from `pytorch_quantization` toolkit is represented as follows in Torchscript\n", + "```\n", + "%quant_input : Tensor = aten::fake_quantize_per_tensor_affine(%x, %636, %637, %638, %639)\n", + "%quant_weight : Tensor = aten::fake_quantize_per_channel_affine(%394, %640, %641, %637, %638, %639)\n", + "%input.2 : Tensor = aten::_convolution(%quant_input, %quant_weight, %395, %687, %688, %689, %643, %690, %642, %643, %643, %644, %644)\n", + "```\n", + "`aten::fake_quantize_per_*_affine` is converted into `QuantizeLayer` + `DequantizeLayer` in Torch-TensorRT internally. Please refer to quantization op converters in Torch-TensorRT." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "aa7495e0", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Cannot infer input type from calcuations in graph for input x.2. Assuming it is Float32. If not, specify input type explicity\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Detected invalid timing cache, setup a local cache instead\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "VGG QAT accuracy using TensorRT: 82.97%\n" + ] + } + ], + "source": [ + "qat_model = torch.jit.load(\"trained_vgg16_qat.jit.pt\").eval()\n", + "\n", + "compile_spec = {\"inputs\": [torch_tensorrt.Input([16, 3, 32, 32])],\n", + " \"enabled_precisions\": torch.int8,\n", + " }\n", + "trt_mod = torch_tensorrt.compile(qat_model, **compile_spec)\n", + "\n", + "test_loss, test_acc = test(trt_mod, testing_dataloader, crit, 0)\n", + "print(\"VGG QAT accuracy using TensorRT: {:.2f}%\".format(100 * test_acc))" + ] + }, + { + "cell_type": "markdown", + "id": "9df5a90e", + "metadata": {}, + "source": [ + "### Performance benchmarking" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "9eb2cd2d", + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import numpy as np\n", + "\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "# Helper function to benchmark the model\n", + "def benchmark(model, input_shape=(1024, 1, 32, 32), dtype='fp32', nwarmup=50, nruns=1000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " output = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%100==0:\n", + " print('Iteration %d/%d, avg batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output shape:\", output.shape)\n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "5c2514ae", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, avg batch time 4.83 ms\n", + "Iteration 200/1000, avg batch time 4.83 ms\n", + "Iteration 300/1000, avg batch time 4.83 ms\n", + "Iteration 400/1000, avg batch time 4.83 ms\n", + "Iteration 500/1000, avg batch time 4.83 ms\n", + "Iteration 600/1000, avg batch time 4.83 ms\n", + "Iteration 700/1000, avg batch time 4.83 ms\n", + "Iteration 800/1000, avg batch time 4.83 ms\n", + "Iteration 900/1000, avg batch time 4.83 ms\n", + "Iteration 1000/1000, avg batch time 4.83 ms\n", + "Input shape: torch.Size([16, 3, 32, 32])\n", + "Output shape: torch.Size([16, 10])\n", + "Average batch time: 4.83 ms\n" + ] + } + ], + "source": [ + "benchmark(jit_model, input_shape=(16, 3, 32, 32))" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "c5378ed6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, avg batch time 1.87 ms\n", + "Iteration 200/1000, avg batch time 1.84 ms\n", + "Iteration 300/1000, avg batch time 1.85 ms\n", + "Iteration 400/1000, avg batch time 1.83 ms\n", + "Iteration 500/1000, avg batch time 1.82 ms\n", + "Iteration 600/1000, avg batch time 1.81 ms\n", + "Iteration 700/1000, avg batch time 1.81 ms\n", + "Iteration 800/1000, avg batch time 1.80 ms\n", + "Iteration 900/1000, avg batch time 1.80 ms\n", + "Iteration 1000/1000, avg batch time 1.79 ms\n", + "Input shape: torch.Size([16, 3, 32, 32])\n", + "Output shape: torch.Size([16, 10])\n", + "Average batch time: 1.79 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_mod, input_shape=(16, 3, 32, 32))" + ] + }, + { + "cell_type": "markdown", + "id": "d6a5ec1c", + "metadata": {}, + "source": [ + "\n", + "## 9. References\n", + "* Very Deep Convolution Networks for large scale Image Recognition\n", + "* Achieving FP32 Accuracy for INT8 Inference Using Quantization Aware Training with NVIDIA TensorRT\n", + "* QAT workflow for VGG16\n", + "* Deploying VGG QAT model in C++ using Torch-TensorRT\n", + "* Pytorch-quantization toolkit from NVIDIA\n", + "* Pytorch quantization toolkit userguide\n", + "* Quantization basics" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/v1.1.1/_sources/_cpp_api/class_view_hierarchy.rst.txt b/docs/v1.1.1/_sources/_cpp_api/class_view_hierarchy.rst.txt new file mode 100644 index 0000000000..a75671077c --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/class_view_hierarchy.rst.txt @@ -0,0 +1,18 @@ + +Class Hierarchy +--------------- + + +.. raw:: html + + + +.. end raw html for treeView + + diff --git a/docs/v1.1.1/_sources/_cpp_api/classtorch__tensorrt_1_1DataType.rst.txt b/docs/v1.1.1/_sources/_cpp_api/classtorch__tensorrt_1_1DataType.rst.txt new file mode 100644 index 0000000000..598f013466 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/classtorch__tensorrt_1_1DataType.rst.txt @@ -0,0 +1,16 @@ +.. _exhale_class_classtorch__tensorrt_1_1DataType: + +Class DataType +============== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Class Documentation +------------------- + + +.. doxygenclass:: torch_tensorrt::DataType + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/v1.1.1/_sources/_cpp_api/classtorch__tensorrt_1_1Device_1_1DeviceType.rst.txt b/docs/v1.1.1/_sources/_cpp_api/classtorch__tensorrt_1_1Device_1_1DeviceType.rst.txt new file mode 100644 index 0000000000..6801d4923d --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/classtorch__tensorrt_1_1Device_1_1DeviceType.rst.txt @@ -0,0 +1,22 @@ +.. _exhale_class_classtorch__tensorrt_1_1Device_1_1DeviceType: + +Class Device::DeviceType +======================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Nested Relationships +-------------------- + +This class is a nested type of :ref:`exhale_struct_structtorch__tensorrt_1_1Device`. + + +Class Documentation +------------------- + + +.. doxygenclass:: torch_tensorrt::Device::DeviceType + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/v1.1.1/_sources/_cpp_api/classtorch__tensorrt_1_1TensorFormat.rst.txt b/docs/v1.1.1/_sources/_cpp_api/classtorch__tensorrt_1_1TensorFormat.rst.txt new file mode 100644 index 0000000000..5766b4f2e3 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/classtorch__tensorrt_1_1TensorFormat.rst.txt @@ -0,0 +1,16 @@ +.. _exhale_class_classtorch__tensorrt_1_1TensorFormat: + +Class TensorFormat +================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Class Documentation +------------------- + + +.. doxygenclass:: torch_tensorrt::TensorFormat + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/v1.1.1/_sources/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator.rst.txt b/docs/v1.1.1/_sources/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator.rst.txt new file mode 100644 index 0000000000..26bf9d15e1 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator.rst.txt @@ -0,0 +1,25 @@ +.. _exhale_class_classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator: + +Template Class Int8CacheCalibrator +================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_ptq.h` + + +Inheritance Relationships +------------------------- + +Base Type +********* + +- ``private Algorithm`` + + +Class Documentation +------------------- + + +.. doxygenclass:: torch_tensorrt::ptq::Int8CacheCalibrator + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/v1.1.1/_sources/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8Calibrator.rst.txt b/docs/v1.1.1/_sources/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8Calibrator.rst.txt new file mode 100644 index 0000000000..83c48844dc --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8Calibrator.rst.txt @@ -0,0 +1,25 @@ +.. _exhale_class_classtorch__tensorrt_1_1ptq_1_1Int8Calibrator: + +Template Class Int8Calibrator +============================= + +- Defined in :ref:`file_cpp_include_torch_tensorrt_ptq.h` + + +Inheritance Relationships +------------------------- + +Base Type +********* + +- ``private Algorithm`` + + +Class Documentation +------------------- + + +.. doxygenclass:: torch_tensorrt::ptq::Int8Calibrator + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1a18d295a837ac71add5578860b55e5502.rst.txt b/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1a18d295a837ac71add5578860b55e5502.rst.txt new file mode 100644 index 0000000000..b082c992fc --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1a18d295a837ac71add5578860b55e5502.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_define_macros_8h_1a18d295a837ac71add5578860b55e5502: + +Define STR +========== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_macros.h` + + +Define Documentation +-------------------- + + +.. doxygendefine:: STR diff --git a/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268.rst.txt b/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268.rst.txt new file mode 100644 index 0000000000..61f83274e0 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268: + +Define TORCH_TENSORRT_PATCH_VERSION +=================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_macros.h` + + +Define Documentation +-------------------- + + +.. doxygendefine:: TORCH_TENSORRT_PATCH_VERSION diff --git a/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e.rst.txt b/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e.rst.txt new file mode 100644 index 0000000000..ae5c6d19a5 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e: + +Define TORCH_TENSORRT_MAJOR_VERSION +=================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_macros.h` + + +Define Documentation +-------------------- + + +.. doxygendefine:: TORCH_TENSORRT_MAJOR_VERSION diff --git a/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827.rst.txt b/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827.rst.txt new file mode 100644 index 0000000000..b484cc9995 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827: + +Define TORCH_TENSORRT_MINOR_VERSION +=================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_macros.h` + + +Define Documentation +-------------------- + + +.. doxygendefine:: TORCH_TENSORRT_MINOR_VERSION diff --git a/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b.rst.txt b/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b.rst.txt new file mode 100644 index 0000000000..8a9bb4df48 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b: + +Define TORCHTRT_API +=================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_macros.h` + + +Define Documentation +-------------------- + + +.. doxygendefine:: TORCHTRT_API diff --git a/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da.rst.txt b/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da.rst.txt new file mode 100644 index 0000000000..cf8b949284 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da: + +Define XSTR +=========== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_macros.h` + + +Define Documentation +-------------------- + + +.. doxygendefine:: XSTR diff --git a/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1ad19939408f7be171a74a89928b36eb59.rst.txt b/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1ad19939408f7be171a74a89928b36eb59.rst.txt new file mode 100644 index 0000000000..d2272d62b7 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1ad19939408f7be171a74a89928b36eb59.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_define_macros_8h_1ad19939408f7be171a74a89928b36eb59: + +Define TORCHTRT_HIDDEN +====================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_macros.h` + + +Define Documentation +-------------------- + + +.. doxygendefine:: TORCHTRT_HIDDEN diff --git a/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883.rst.txt b/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883.rst.txt new file mode 100644 index 0000000000..3e2aae2ad6 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883: + +Define TORCH_TENSORRT_VERSION +============================= + +- Defined in :ref:`file_cpp_include_torch_tensorrt_macros.h` + + +Define Documentation +-------------------- + + +.. doxygendefine:: TORCH_TENSORRT_VERSION diff --git a/docs/v1.1.1/_sources/_cpp_api/dir_cpp.rst.txt b/docs/v1.1.1/_sources/_cpp_api/dir_cpp.rst.txt new file mode 100644 index 0000000000..f09e39c518 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/dir_cpp.rst.txt @@ -0,0 +1,16 @@ +.. _dir_cpp: + + +Directory cpp +============= + + +*Directory path:* ``cpp`` + +Subdirectories +-------------- + +- :ref:`dir_cpp_include` + + + diff --git a/docs/v1.1.1/_sources/_cpp_api/dir_cpp_include.rst.txt b/docs/v1.1.1/_sources/_cpp_api/dir_cpp_include.rst.txt new file mode 100644 index 0000000000..e262b4a9af --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/dir_cpp_include.rst.txt @@ -0,0 +1,20 @@ +.. _dir_cpp_include: + + +Directory include +================= + + +|exhale_lsh| :ref:`Parent directory ` (``cpp``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +*Directory path:* ``cpp/include`` + +Subdirectories +-------------- + +- :ref:`dir_cpp_include_torch_tensorrt` + + + diff --git a/docs/v1.1.1/_sources/_cpp_api/dir_cpp_include_torch_tensorrt.rst.txt b/docs/v1.1.1/_sources/_cpp_api/dir_cpp_include_torch_tensorrt.rst.txt new file mode 100644 index 0000000000..e0b3e53106 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/dir_cpp_include_torch_tensorrt.rst.txt @@ -0,0 +1,23 @@ +.. _dir_cpp_include_torch_tensorrt: + + +Directory tensorrt +================== + + +|exhale_lsh| :ref:`Parent directory ` (``cpp/include``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +*Directory path:* ``cpp/include/torch_tensorrt`` + + +Files +----- + +- :ref:`file_cpp_include_torch_tensorrt_logging.h` +- :ref:`file_cpp_include_torch_tensorrt_macros.h` +- :ref:`file_cpp_include_torch_tensorrt_ptq.h` +- :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + diff --git a/docs/v1.1.1/_sources/_cpp_api/enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558.rst.txt b/docs/v1.1.1/_sources/_cpp_api/enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558.rst.txt new file mode 100644 index 0000000000..9b1b980055 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558: + +Enum Level +========== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_logging.h` + + +Enum Documentation +------------------ + + +.. doxygenenum:: torch_tensorrt::logging::Level diff --git a/docs/v1.1.1/_sources/_cpp_api/enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb.rst.txt b/docs/v1.1.1/_sources/_cpp_api/enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb.rst.txt new file mode 100644 index 0000000000..12c62bfb2c --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb: + +Enum EngineCapability +===================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Enum Documentation +------------------ + + +.. doxygenenum:: torch_tensorrt::EngineCapability diff --git a/docs/v1.1.1/_sources/_cpp_api/file_cpp_include_torch_tensorrt_logging.h.rst.txt b/docs/v1.1.1/_sources/_cpp_api/file_cpp_include_torch_tensorrt_logging.h.rst.txt new file mode 100644 index 0000000000..ea89d38038 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/file_cpp_include_torch_tensorrt_logging.h.rst.txt @@ -0,0 +1,80 @@ + +.. _file_cpp_include_torch_tensorrt_logging.h: + +File logging.h +============== + +|exhale_lsh| :ref:`Parent directory ` (``cpp/include/torch_tensorrt``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +.. contents:: Contents + :local: + :backlinks: none + +Definition (``cpp/include/torch_tensorrt/logging.h``) +----------------------------------------------------- + + +.. toctree:: + :maxdepth: 1 + + program_listing_file_cpp_include_torch_tensorrt_logging.h.rst + + + + + +Includes +-------- + + +- ``string`` + +- ``torch_tensorrt/macros.h`` (:ref:`file_cpp_include_torch_tensorrt_macros.h`) + + + +Included By +----------- + + +- :ref:`file_cpp_include_torch_tensorrt_ptq.h` + + + + +Namespaces +---------- + + +- :ref:`namespace_torch_tensorrt` + +- :ref:`namespace_torch_tensorrt__logging` + + +Enums +----- + + +- :ref:`exhale_enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558` + + +Functions +--------- + + +- :ref:`exhale_function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a` + +- :ref:`exhale_function_logging_8h_1a0593f776f469c20469e2f729fc7861a3` + +- :ref:`exhale_function_logging_8h_1a0c012cb374addd90eb1f42eaec570650` + +- :ref:`exhale_function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8` + +- :ref:`exhale_function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5` + +- :ref:`exhale_function_logging_8h_1af8f3443813315af7901903d25dd495cc` + +- :ref:`exhale_function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2` + diff --git a/docs/v1.1.1/_sources/_cpp_api/file_cpp_include_torch_tensorrt_macros.h.rst.txt b/docs/v1.1.1/_sources/_cpp_api/file_cpp_include_torch_tensorrt_macros.h.rst.txt new file mode 100644 index 0000000000..326995993e --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/file_cpp_include_torch_tensorrt_macros.h.rst.txt @@ -0,0 +1,69 @@ + +.. _file_cpp_include_torch_tensorrt_macros.h: + +File macros.h +============= + +|exhale_lsh| :ref:`Parent directory ` (``cpp/include/torch_tensorrt``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +.. contents:: Contents + :local: + :backlinks: none + +Definition (``cpp/include/torch_tensorrt/macros.h``) +---------------------------------------------------- + + +.. toctree:: + :maxdepth: 1 + + program_listing_file_cpp_include_torch_tensorrt_macros.h.rst + + + + + + + +Included By +----------- + + +- :ref:`file_cpp_include_torch_tensorrt_logging.h` + +- :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + + + +Namespaces +---------- + + +- :ref:`namespace_torch_tensorrt` + +- :ref:`namespace_torch_tensorrt__torchscript` + + +Defines +------- + + +- :ref:`exhale_define_macros_8h_1a18d295a837ac71add5578860b55e5502` + +- :ref:`exhale_define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e` + +- :ref:`exhale_define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827` + +- :ref:`exhale_define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268` + +- :ref:`exhale_define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883` + +- :ref:`exhale_define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b` + +- :ref:`exhale_define_macros_8h_1ad19939408f7be171a74a89928b36eb59` + +- :ref:`exhale_define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da` + diff --git a/docs/v1.1.1/_sources/_cpp_api/file_cpp_include_torch_tensorrt_ptq.h.rst.txt b/docs/v1.1.1/_sources/_cpp_api/file_cpp_include_torch_tensorrt_ptq.h.rst.txt new file mode 100644 index 0000000000..074de6eb5e --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/file_cpp_include_torch_tensorrt_ptq.h.rst.txt @@ -0,0 +1,82 @@ + +.. _file_cpp_include_torch_tensorrt_ptq.h: + +File ptq.h +========== + +|exhale_lsh| :ref:`Parent directory ` (``cpp/include/torch_tensorrt``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +.. contents:: Contents + :local: + :backlinks: none + +Definition (``cpp/include/torch_tensorrt/ptq.h``) +------------------------------------------------- + + +.. toctree:: + :maxdepth: 1 + + program_listing_file_cpp_include_torch_tensorrt_ptq.h.rst + + + + + +Includes +-------- + + +- ``NvInfer.h`` + +- ``fstream`` + +- ``iostream`` + +- ``iterator`` + +- ``memory`` + +- ``sstream`` + +- ``string`` + +- ``torch/torch.h`` + +- ``torch_tensorrt/logging.h`` (:ref:`file_cpp_include_torch_tensorrt_logging.h`) + +- ``vector`` + + + + + + +Namespaces +---------- + + +- :ref:`namespace_torch_tensorrt` + +- :ref:`namespace_torch_tensorrt__ptq` + + +Classes +------- + + +- :ref:`exhale_class_classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator` + +- :ref:`exhale_class_classtorch__tensorrt_1_1ptq_1_1Int8Calibrator` + + +Functions +--------- + + +- :ref:`exhale_function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa` + +- :ref:`exhale_function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039` + diff --git a/docs/v1.1.1/_sources/_cpp_api/file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst.txt b/docs/v1.1.1/_sources/_cpp_api/file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst.txt new file mode 100644 index 0000000000..a81343d773 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst.txt @@ -0,0 +1,101 @@ + +.. _file_cpp_include_torch_tensorrt_torch_tensorrt.h: + +File torch_tensorrt.h +===================== + +|exhale_lsh| :ref:`Parent directory ` (``cpp/include/torch_tensorrt``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +.. contents:: Contents + :local: + :backlinks: none + +Definition (``cpp/include/torch_tensorrt/torch_tensorrt.h``) +------------------------------------------------------------ + + +.. toctree:: + :maxdepth: 1 + + program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst + + + + + +Includes +-------- + + +- ``cuda_runtime.h`` + +- ``iostream`` + +- ``memory`` + +- ``set`` + +- ``string`` + +- ``torch_tensorrt/macros.h`` (:ref:`file_cpp_include_torch_tensorrt_macros.h`) + +- ``vector`` + + + + + + +Namespaces +---------- + + +- :ref:`namespace_torch_tensorrt` + +- :ref:`namespace_torch_tensorrt__torchscript` + + +Classes +------- + + +- :ref:`exhale_struct_structtorch__tensorrt_1_1Device` + +- :ref:`exhale_struct_structtorch__tensorrt_1_1Input` + +- :ref:`exhale_struct_structtorch__tensorrt_1_1torchscript_1_1CompileSpec` + +- :ref:`exhale_class_classtorch__tensorrt_1_1DataType` + +- :ref:`exhale_class_classtorch__tensorrt_1_1Device_1_1DeviceType` + +- :ref:`exhale_class_classtorch__tensorrt_1_1TensorFormat` + + +Enums +----- + + +- :ref:`exhale_enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb` + + +Functions +--------- + + +- :ref:`exhale_function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1` + +- :ref:`exhale_function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528` + +- :ref:`exhale_function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384` + +- :ref:`exhale_function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797` + +- :ref:`exhale_function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9` + +- :ref:`exhale_function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2` + +- :ref:`exhale_function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef` + diff --git a/docs/v1.1.1/_sources/_cpp_api/file_view_hierarchy.rst.txt b/docs/v1.1.1/_sources/_cpp_api/file_view_hierarchy.rst.txt new file mode 100644 index 0000000000..c47d5aa483 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/file_view_hierarchy.rst.txt @@ -0,0 +1,18 @@ + +File Hierarchy +-------------- + + +.. raw:: html + + + +.. end raw html for treeView + + diff --git a/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1a0593f776f469c20469e2f729fc7861a3.rst.txt b/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1a0593f776f469c20469e2f729fc7861a3.rst.txt new file mode 100644 index 0000000000..4ab7c0a286 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1a0593f776f469c20469e2f729fc7861a3.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_function_logging_8h_1a0593f776f469c20469e2f729fc7861a3: + +Function torch_tensorrt::logging::get_logging_prefix +==================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_logging.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::logging::get_logging_prefix() diff --git a/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1a0c012cb374addd90eb1f42eaec570650.rst.txt b/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1a0c012cb374addd90eb1f42eaec570650.rst.txt new file mode 100644 index 0000000000..42c0fbf1e8 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1a0c012cb374addd90eb1f42eaec570650.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_function_logging_8h_1a0c012cb374addd90eb1f42eaec570650: + +Function torch_tensorrt::logging::get_reportable_log_level +========================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_logging.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::logging::get_reportable_log_level() diff --git a/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a.rst.txt b/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a.rst.txt new file mode 100644 index 0000000000..df147251cb --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a: + +Function torch_tensorrt::logging::get_is_colored_output_on +========================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_logging.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::logging::get_is_colored_output_on() diff --git a/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2.rst.txt b/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2.rst.txt new file mode 100644 index 0000000000..c8488983b5 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2: + +Function torch_tensorrt::logging::set_reportable_log_level +========================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_logging.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::logging::set_reportable_log_level(Level) diff --git a/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8.rst.txt b/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8.rst.txt new file mode 100644 index 0000000000..95eeb31aad --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8: + +Function torch_tensorrt::logging::log +===================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_logging.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::logging::log(Level, std::string) diff --git a/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5.rst.txt b/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5.rst.txt new file mode 100644 index 0000000000..6057ee413a --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5: + +Function torch_tensorrt::logging::set_is_colored_output_on +========================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_logging.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::logging::set_is_colored_output_on(bool) diff --git a/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1af8f3443813315af7901903d25dd495cc.rst.txt b/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1af8f3443813315af7901903d25dd495cc.rst.txt new file mode 100644 index 0000000000..9c9efdd33c --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/function_logging_8h_1af8f3443813315af7901903d25dd495cc.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_function_logging_8h_1af8f3443813315af7901903d25dd495cc: + +Function torch_tensorrt::logging::set_logging_prefix +==================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_logging.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::logging::set_logging_prefix(std::string) diff --git a/docs/v1.1.1/_sources/_cpp_api/function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c.rst.txt b/docs/v1.1.1/_sources/_cpp_api/function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c.rst.txt new file mode 100644 index 0000000000..5d9188270f --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c: + +Template Function torch_tensorrt::ptq::make_int8_cache_calibrator +================================================================= + +- Defined in :ref:`file_cpp_include_torch_tensorrt_ptq.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::ptq::make_int8_cache_calibrator(const std::string&) + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.1.1/_sources/_cpp_api/function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178.rst.txt b/docs/v1.1.1/_sources/_cpp_api/function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178.rst.txt new file mode 100644 index 0000000000..9551f48bb6 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178: + +Template Function torch_tensorrt::ptq::make_int8_calibrator +=========================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_ptq.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::ptq::make_int8_calibrator(DataLoader, const std::string&, bool) + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.1.1/_sources/_cpp_api/function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039.rst.txt b/docs/v1.1.1/_sources/_cpp_api/function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039.rst.txt new file mode 100644 index 0000000000..caa9ad6226 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039: + +Template Function torch_tensorrt::ptq::make_int8_calibrator +=========================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_ptq.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::ptq::make_int8_calibrator(DataLoader, const std::string&, bool) diff --git a/docs/v1.1.1/_sources/_cpp_api/function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa.rst.txt b/docs/v1.1.1/_sources/_cpp_api/function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa.rst.txt new file mode 100644 index 0000000000..477c2655ae --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa: + +Template Function torch_tensorrt::ptq::make_int8_cache_calibrator +================================================================= + +- Defined in :ref:`file_cpp_include_torch_tensorrt_ptq.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::ptq::make_int8_cache_calibrator(const std::string&) diff --git a/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797.rst.txt b/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797.rst.txt new file mode 100644 index 0000000000..0fed46560f --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797: + +Function torch_tensorrt::torchscript::check_method_operator_support +=================================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::torchscript::check_method_operator_support(const torch::jit::Module&, std::string) diff --git a/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9.rst.txt b/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9.rst.txt new file mode 100644 index 0000000000..082a6e72f9 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9: + +Function torch_tensorrt::torchscript::compile +============================================= + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::torchscript::compile(const torch::jit::Module&, CompileSpec) diff --git a/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef.rst.txt b/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef.rst.txt new file mode 100644 index 0000000000..4bfdb2fec6 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef: + +Function torch_tensorrt::torchscript::embed_engine_in_new_module +================================================================ + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::torchscript::embed_engine_in_new_module(const std::string&, Device) diff --git a/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528.rst.txt b/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528.rst.txt new file mode 100644 index 0000000000..72191a3cb3 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528: + +Function torch_tensorrt::get_build_info +======================================= + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::get_build_info() diff --git a/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384.rst.txt b/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384.rst.txt new file mode 100644 index 0000000000..e37176bda0 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384: + +Function torch_tensorrt::set_device +=================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::set_device(const int) diff --git a/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1.rst.txt b/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1.rst.txt new file mode 100644 index 0000000000..bd396383cc --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1: + +Function torch_tensorrt::dump_build_info +======================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::dump_build_info() diff --git a/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2.rst.txt b/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2.rst.txt new file mode 100644 index 0000000000..656639b05d --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2: + +Function torch_tensorrt::torchscript::convert_method_to_trt_engine +================================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::torchscript::convert_method_to_trt_engine(const torch::jit::Module&, std::string, CompileSpec) diff --git a/docs/v1.1.1/_sources/_cpp_api/namespace_torch_tensorrt.rst.txt b/docs/v1.1.1/_sources/_cpp_api/namespace_torch_tensorrt.rst.txt new file mode 100644 index 0000000000..94e153b999 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/namespace_torch_tensorrt.rst.txt @@ -0,0 +1,57 @@ + +.. _namespace_torch_tensorrt: + +Namespace torch_tensorrt +======================== + + +.. contents:: Contents + :local: + :backlinks: none + + + + + +Namespaces +---------- + + +- :ref:`namespace_torch_tensorrt__logging` + +- :ref:`namespace_torch_tensorrt__ptq` + +- :ref:`namespace_torch_tensorrt__torchscript` + + +Classes +------- + + +- :ref:`exhale_struct_structtorch__tensorrt_1_1Device` + +- :ref:`exhale_struct_structtorch__tensorrt_1_1Input` + +- :ref:`exhale_class_classtorch__tensorrt_1_1DataType` + +- :ref:`exhale_class_classtorch__tensorrt_1_1Device_1_1DeviceType` + +- :ref:`exhale_class_classtorch__tensorrt_1_1TensorFormat` + + +Enums +----- + + +- :ref:`exhale_enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb` + + +Functions +--------- + + +- :ref:`exhale_function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1` + +- :ref:`exhale_function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528` + +- :ref:`exhale_function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384` diff --git a/docs/v1.1.1/_sources/_cpp_api/namespace_torch_tensorrt__logging.rst.txt b/docs/v1.1.1/_sources/_cpp_api/namespace_torch_tensorrt__logging.rst.txt new file mode 100644 index 0000000000..49f946f937 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/namespace_torch_tensorrt__logging.rst.txt @@ -0,0 +1,39 @@ + +.. _namespace_torch_tensorrt__logging: + +Namespace torch_tensorrt::logging +================================= + + +.. contents:: Contents + :local: + :backlinks: none + + + + + +Enums +----- + + +- :ref:`exhale_enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558` + + +Functions +--------- + + +- :ref:`exhale_function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a` + +- :ref:`exhale_function_logging_8h_1a0593f776f469c20469e2f729fc7861a3` + +- :ref:`exhale_function_logging_8h_1a0c012cb374addd90eb1f42eaec570650` + +- :ref:`exhale_function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8` + +- :ref:`exhale_function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5` + +- :ref:`exhale_function_logging_8h_1af8f3443813315af7901903d25dd495cc` + +- :ref:`exhale_function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2` diff --git a/docs/v1.1.1/_sources/_cpp_api/namespace_torch_tensorrt__ptq.rst.txt b/docs/v1.1.1/_sources/_cpp_api/namespace_torch_tensorrt__ptq.rst.txt new file mode 100644 index 0000000000..b20546a725 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/namespace_torch_tensorrt__ptq.rst.txt @@ -0,0 +1,31 @@ + +.. _namespace_torch_tensorrt__ptq: + +Namespace torch_tensorrt::ptq +============================= + + +.. contents:: Contents + :local: + :backlinks: none + + + + + +Classes +------- + + +- :ref:`exhale_class_classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator` + +- :ref:`exhale_class_classtorch__tensorrt_1_1ptq_1_1Int8Calibrator` + + +Functions +--------- + + +- :ref:`exhale_function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa` + +- :ref:`exhale_function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039` diff --git a/docs/v1.1.1/_sources/_cpp_api/namespace_torch_tensorrt__torchscript.rst.txt b/docs/v1.1.1/_sources/_cpp_api/namespace_torch_tensorrt__torchscript.rst.txt new file mode 100644 index 0000000000..b56b3f738e --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/namespace_torch_tensorrt__torchscript.rst.txt @@ -0,0 +1,33 @@ + +.. _namespace_torch_tensorrt__torchscript: + +Namespace torch_tensorrt::torchscript +===================================== + + +.. contents:: Contents + :local: + :backlinks: none + + + + + +Classes +------- + + +- :ref:`exhale_struct_structtorch__tensorrt_1_1torchscript_1_1CompileSpec` + + +Functions +--------- + + +- :ref:`exhale_function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797` + +- :ref:`exhale_function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9` + +- :ref:`exhale_function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2` + +- :ref:`exhale_function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef` diff --git a/docs/v1.1.1/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_logging.h.rst.txt b/docs/v1.1.1/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_logging.h.rst.txt new file mode 100644 index 0000000000..af68cbb678 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_logging.h.rst.txt @@ -0,0 +1,51 @@ + +.. _program_listing_file_cpp_include_torch_tensorrt_logging.h: + +Program Listing for File logging.h +================================== + +|exhale_lsh| :ref:`Return to documentation for file ` (``cpp/include/torch_tensorrt/logging.h``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +.. code-block:: cpp + + /* + * Copyright (c) NVIDIA Corporation. + * All rights reserved. + * + * This library is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + #pragma once + + #include + #include "torch_tensorrt/macros.h" + + namespace torch_tensorrt { + namespace logging { + enum Level { + kINTERNAL_ERROR, + kERROR, + kWARNING, + kINFO, + kDEBUG, + kGRAPH, + }; + + // Are these ones necessary for the user? + TORCHTRT_API std::string get_logging_prefix(); + TORCHTRT_API void set_logging_prefix(std::string prefix); + + TORCHTRT_API void set_reportable_log_level(Level lvl); + + TORCHTRT_API void set_is_colored_output_on(bool colored_output_on); + + TORCHTRT_API Level get_reportable_log_level(); + + TORCHTRT_API bool get_is_colored_output_on(); + + // Dont know if we want this? + TORCHTRT_API void log(Level lvl, std::string msg); + } // namespace logging + } // namespace torch_tensorrt diff --git a/docs/v1.1.1/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_macros.h.rst.txt b/docs/v1.1.1/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_macros.h.rst.txt new file mode 100644 index 0000000000..e64ddc299b --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_macros.h.rst.txt @@ -0,0 +1,46 @@ + +.. _program_listing_file_cpp_include_torch_tensorrt_macros.h: + +Program Listing for File macros.h +================================= + +|exhale_lsh| :ref:`Return to documentation for file ` (``cpp/include/torch_tensorrt/macros.h``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +.. code-block:: cpp + + /* + * Copyright (c) NVIDIA Corporation. + * All rights reserved. + * + * This library is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + #pragma once + + #if defined(__GNUC__) + #define TORCHTRT_API __attribute__((__visibility__("default"))) + #define TORCHTRT_HIDDEN __attribute__((__visibility__("hidden"))) + #else + #define TORCHTRT_API + #define TORCHTRT_HIDDEN + #endif // defined(__GNUC__) + + // Does this need to be gaurded or something? + #define XSTR(x) #x + #define STR(x) XSTR(x) + + #define TORCH_TENSORRT_MAJOR_VERSION 1 + #define TORCH_TENSORRT_MINOR_VERSION 1 + #define TORCH_TENSORRT_PATCH_VERSION 0 + #define TORCH_TENSORRT_VERSION \ + STR(TORCH_TENSORRT_MAJOR_VERSION) \ + "." STR(TORCH_TENSORRT_MINOR_VERSION) "." STR(TORCH_TENSORRT_PATCH_VERSION) + + // Setup namespace aliases for ease of use + namespace torch_tensorrt { + namespace torchscript {} + namespace ts = torchscript; + } // namespace torch_tensorrt + namespace torchtrt = torch_tensorrt; diff --git a/docs/v1.1.1/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_ptq.h.rst.txt b/docs/v1.1.1/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_ptq.h.rst.txt new file mode 100644 index 0000000000..12c51674f3 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_ptq.h.rst.txt @@ -0,0 +1,189 @@ + +.. _program_listing_file_cpp_include_torch_tensorrt_ptq.h: + +Program Listing for File ptq.h +============================== + +|exhale_lsh| :ref:`Return to documentation for file ` (``cpp/include/torch_tensorrt/ptq.h``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +.. code-block:: cpp + + /* + * Copyright (c) NVIDIA Corporation. + * All rights reserved. + * + * This library is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + #pragma once + + #include + #include + #include + #include + #include + #include + #include + + #include "NvInfer.h" + #include "torch/torch.h" + #include "torch_tensorrt/logging.h" + + #ifndef DOXYGEN_SHOULD_SKIP_THIS + namespace nvinfer1 { + class IInt8Calibrator; + class IInt8EntropyCalibrator2; + } // namespace nvinfer1 + + namespace torch_tensorrt { + namespace ptq { + bool get_batch_impl(void* bindings[], const char* names[], int nbBindings, torch::Tensor& data); + } + } // namespace torch_tensorrt + #endif // DOXYGEN_SHOULD_SKIP_THIS + + namespace torch_tensorrt { + namespace ptq { + + template + class Int8Calibrator : Algorithm { + using DataLoader = typename DataLoaderUniquePtr::element_type; + using Batch = typename DataLoader::super::BatchType; + + public: + Int8Calibrator(DataLoaderUniquePtr dataloader, const std::string& cache_file_path, bool use_cache) + : dataloader_(dataloader.get()), cache_file_path_(cache_file_path), use_cache_(use_cache) { + for (auto batch : *dataloader_) { + batched_data_.push_back(batch.data); + } + it_ = batched_data_.begin(); + } + + int getBatchSize() const noexcept override { + // HACK: Torch-TensorRT only uses explict batch sizing, INT8 Calibrator does not + // work when reporting the batch size here and having explicity batching. + // So we just report batch size 1 (warnings will still be printed out). + return 1; + // return static_cast(dataloader_->options().batch_size); + } + + bool getBatch(void* bindings[], const char* names[], int nbBindings) noexcept override { + if (it_ != batched_data_.end()) { + auto status = get_batch_impl(bindings, names, nbBindings, *it_); + it_ = ++it_; + return status; + } else { + // Reset iterator if incase calibrator is going to be used again + it_ = batched_data_.begin(); + return false; + } + } + + const void* readCalibrationCache(size_t& length) noexcept override { + if (use_cache_) { + std::stringstream ss; + ss << "Reading Calibration Cache from " << cache_file_path_; + logging::log(logging::Level::kINFO, ss.str()); + + cache_.clear(); + std::ifstream input(cache_file_path_, std::ios::binary); + input >> std::noskipws; + if (input.good()) { + std::copy(std::istream_iterator(input), std::istream_iterator(), std::back_inserter(cache_)); + logging::log(logging::Level::kDEBUG, "Cache read"); + } + length = cache_.size(); + return length ? cache_.data() : nullptr; + } + return nullptr; + } + + void writeCalibrationCache(const void* cache, size_t length) noexcept override { + std::ofstream cache_file(cache_file_path_, std::ios::binary); + cache_file.write(reinterpret_cast(cache), length); + std::stringstream ss; + ss << "Saved Calibration Cache to " << cache_file_path_; + logging::log(logging::Level::kINFO, ss.str()); + } + + operator nvinfer1::IInt8Calibrator*() { + return reinterpret_cast(this); + } + + private: + DataLoader* dataloader_; + const std::string& cache_file_path_; + size_t cache_size_ = 0; + bool use_cache_; + std::vector cache_; + std::vector batched_data_; + std::vector::iterator it_; + }; + + template + class Int8CacheCalibrator : Algorithm { + public: + Int8CacheCalibrator(const std::string& cache_file_path) : cache_file_path_(cache_file_path) {} + + int getBatchSize() const noexcept override { + // HACK: Torch-TensorRT only uses explict batch sizing, INT8 Calibrator does not + // work when reporting the batch size here and having explicity batching. + // So we just report batch size 1 (warnings will still be printed out). + return 1; + } + + bool getBatch(void* bindings[], const char* names[], int nbBindings) noexcept override { + return false; + } + + const void* readCalibrationCache(size_t& length) noexcept override { + std::stringstream ss; + ss << "Reading Calibration Cache from " << cache_file_path_; + logging::log(logging::Level::kINFO, ss.str()); + + cache_.clear(); + std::ifstream input(cache_file_path_, std::ios::binary); + input >> std::noskipws; + if (input.good()) { + std::copy(std::istream_iterator(input), std::istream_iterator(), std::back_inserter(cache_)); + logging::log(logging::Level::kDEBUG, "Cache read"); + } + length = cache_.size(); + return length ? cache_.data() : nullptr; + } + + void writeCalibrationCache(const void* cache, size_t length) noexcept override { + std::ofstream cache_file(cache_file_path_, std::ios::binary); + cache_file.write(reinterpret_cast(cache), length); + std::stringstream ss; + ss << "Saved Calibration Cache to " << cache_file_path_; + logging::log(logging::Level::kINFO, ss.str()); + } + + operator nvinfer1::IInt8Calibrator*() { + return reinterpret_cast(this); + } + + private: + const std::string& cache_file_path_; + size_t cache_size_ = 0; + std::vector cache_; + }; + + template + TORCHTRT_API inline Int8Calibrator make_int8_calibrator( + DataLoader dataloader, + const std::string& cache_file_path, + bool use_cache) { + return Int8Calibrator(std::move(dataloader), cache_file_path, use_cache); + } + + template + TORCHTRT_API inline Int8CacheCalibrator make_int8_cache_calibrator(const std::string& cache_file_path) { + return Int8CacheCalibrator(cache_file_path); + } + + } // namespace ptq + } // namespace torch_tensorrt diff --git a/docs/v1.1.1/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst.txt b/docs/v1.1.1/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst.txt new file mode 100644 index 0000000000..500f4fb2e4 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst.txt @@ -0,0 +1,281 @@ + +.. _program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h: + +Program Listing for File torch_tensorrt.h +========================================= + +|exhale_lsh| :ref:`Return to documentation for file ` (``cpp/include/torch_tensorrt/torch_tensorrt.h``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +.. code-block:: cpp + + /* + * Copyright (c) NVIDIA Corporation. + * All rights reserved. + * + * This library is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + + #pragma once + + #include + #include + #include + #include + #include + #include + + // Just include the .h? + #ifndef DOXYGEN_SHOULD_SKIP_THIS + namespace torch { + namespace jit { + struct Graph; + struct Module; + } // namespace jit + } // namespace torch + + namespace c10 { + enum class DeviceType : int8_t; + enum class ScalarType : int8_t; + template + class ArrayRef; + } // namespace c10 + + namespace nvinfer1 { + class IInt8Calibrator; + } + #endif // DOXYGEN_SHOULD_SKIP_THIS + + #include "torch_tensorrt/macros.h" + namespace torch_tensorrt { + class TORCHTRT_API DataType { + public: + enum Value : int8_t { + kFloat, + kHalf, + kChar, + kInt, + kBool, + kUnknown + }; + + DataType() = default; + constexpr DataType(Value t) : value(t) {} + DataType(c10::ScalarType t); + operator Value() const { + return value; + } + explicit operator bool() = delete; + constexpr bool operator==(DataType other) const { + return value == other.value; + } + constexpr bool operator==(DataType::Value other) const { + return value == other; + } + constexpr bool operator!=(DataType other) const { + return value != other.value; + } + constexpr bool operator!=(DataType::Value other) const { + return value != other; + } + + private: + friend std::ostream& operator<<(std::ostream& os, const DataType& dtype); + Value value; + }; + + struct Device { + class DeviceType { + public: + enum Value : int8_t { + kGPU, + kDLA, + }; + + DeviceType() = default; + constexpr DeviceType(Value t) : value(t) {} + DeviceType(c10::DeviceType t); + operator Value() const { + return value; + } + explicit operator bool() = delete; + constexpr bool operator==(DeviceType other) const { + return value == other.value; + } + constexpr bool operator!=(DeviceType other) const { + return value != other.value; + } + + private: + Value value; + }; + + DeviceType device_type; + + /* + * Target gpu id + */ + int64_t gpu_id; + + /* + * When using DLA core on NVIDIA AGX platforms gpu_id should be set as Xavier device + */ + int64_t dla_core; + + bool allow_gpu_fallback; + + Device() : device_type(DeviceType::kGPU), gpu_id(0), dla_core(0), allow_gpu_fallback(false) {} + }; + + enum class EngineCapability : int8_t { + kSTANDARD, + kSAFETY, + kDLA_STANDALONE, + }; + + class TORCHTRT_API TensorFormat { + public: + enum Value : int8_t { + kContiguous, + kChannelsLast, + kUnknown, + }; + + TensorFormat() = default; + constexpr TensorFormat(Value t) : value(t) {} + TensorFormat(at::MemoryFormat t); + operator Value() const { + return value; + } + explicit operator bool() = delete; + constexpr bool operator==(TensorFormat other) const { + return value == other.value; + } + constexpr bool operator==(TensorFormat::Value other) const { + return value == other; + } + constexpr bool operator!=(TensorFormat other) const { + return value != other.value; + } + constexpr bool operator!=(TensorFormat::Value other) const { + return value != other; + } + + private: + friend std::ostream& operator<<(std::ostream& os, const TensorFormat& format); + Value value; + }; + + struct TORCHTRT_API Input { + std::vector min_shape; + std::vector opt_shape; + std::vector max_shape; + std::vector shape; + DataType dtype; + TensorFormat format; + + Input(std::vector shape, TensorFormat format = TensorFormat::kContiguous); + + Input(std::vector shape, DataType dtype, TensorFormat format = TensorFormat::kContiguous); + + Input(c10::ArrayRef shape, TensorFormat format = TensorFormat::kContiguous); + + Input(c10::ArrayRef shape, DataType dtype, TensorFormat format = TensorFormat::kContiguous); + + Input( + std::vector min_shape, + std::vector opt_shape, + std::vector max_shape, + TensorFormat format = TensorFormat::kContiguous); + + Input( + std::vector min_shape, + std::vector opt_shape, + std::vector max_shape, + DataType dtype, + TensorFormat format = TensorFormat::kContiguous); + + Input( + c10::ArrayRef min_shape, + c10::ArrayRef opt_shape, + c10::ArrayRef max_shape, + TensorFormat format = TensorFormat::kContiguous); + + Input( + c10::ArrayRef min_shape, + c10::ArrayRef opt_shape, + c10::ArrayRef max_shape, + DataType dtype, + TensorFormat format = TensorFormat::kContiguous); + + Input(at::Tensor tensor); + + private: + friend std::ostream& operator<<(std::ostream& os, const Input& input); + bool input_is_dynamic; + }; + + TORCHTRT_API std::string get_build_info(); + + TORCHTRT_API void dump_build_info(); + + TORCHTRT_API void set_device(const int gpu_id); + + namespace torchscript { + struct TORCHTRT_API CompileSpec { + CompileSpec(std::vector> fixed_sizes); + + CompileSpec(std::vector> fixed_sizes); + + CompileSpec(std::vector inputs) : inputs(std::move(inputs)) {} + + // Defaults should reflect TensorRT defaults for BuilderConfig + + std::vector inputs; + + std::set enabled_precisions = {DataType::kFloat}; + + bool disable_tf32 = false; + + bool sparse_weights = false; + + bool refit = false; + + bool debug = false; + + bool truncate_long_and_double = false; + + Device device; + + EngineCapability capability = EngineCapability::kSTANDARD; + + uint64_t num_min_timing_iters = 2; + uint64_t num_avg_timing_iters = 1; + + uint64_t workspace_size = 0; + + nvinfer1::IInt8Calibrator* ptq_calibrator = nullptr; + + bool require_full_compilation = false; + + uint64_t min_block_size = 3; + + std::vector torch_executed_ops; + + std::vector torch_executed_modules; + }; + + TORCHTRT_API bool check_method_operator_support(const torch::jit::Module& module, std::string method_name); + + TORCHTRT_API torch::jit::Module compile(const torch::jit::Module& module, CompileSpec info); + + TORCHTRT_API std::string convert_method_to_trt_engine( + const torch::jit::Module& module, + std::string method_name, + CompileSpec info); + + TORCHTRT_API torch::jit::Module embed_engine_in_new_module(const std::string& engine, Device device); + } // namespace torchscript + } // namespace torch_tensorrt diff --git a/docs/v1.1.1/_sources/_cpp_api/structtorch__tensorrt_1_1Device.rst.txt b/docs/v1.1.1/_sources/_cpp_api/structtorch__tensorrt_1_1Device.rst.txt new file mode 100644 index 0000000000..78faa598ea --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/structtorch__tensorrt_1_1Device.rst.txt @@ -0,0 +1,26 @@ +.. _exhale_struct_structtorch__tensorrt_1_1Device: + +Struct Device +============= + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Nested Relationships +-------------------- + + +Nested Types +************ + +- :ref:`exhale_class_classtorch__tensorrt_1_1Device_1_1DeviceType` + + +Struct Documentation +-------------------- + + +.. doxygenstruct:: torch_tensorrt::Device + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/v1.1.1/_sources/_cpp_api/structtorch__tensorrt_1_1GraphInputs.rst.txt b/docs/v1.1.1/_sources/_cpp_api/structtorch__tensorrt_1_1GraphInputs.rst.txt new file mode 100644 index 0000000000..60bc3285c6 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/structtorch__tensorrt_1_1GraphInputs.rst.txt @@ -0,0 +1,17 @@ +.. _exhale_struct_structtorch__tensorrt_1_1GraphInputs: + +Struct GraphInputs +================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Struct Documentation +-------------------- + + +.. doxygenstruct:: torch_tensorrt::GraphInputs + :project: Torch-TensorRT + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/v1.1.1/_sources/_cpp_api/structtorch__tensorrt_1_1Input.rst.txt b/docs/v1.1.1/_sources/_cpp_api/structtorch__tensorrt_1_1Input.rst.txt new file mode 100644 index 0000000000..9e7d6b81ed --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/structtorch__tensorrt_1_1Input.rst.txt @@ -0,0 +1,16 @@ +.. _exhale_struct_structtorch__tensorrt_1_1Input: + +Struct Input +============ + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Struct Documentation +-------------------- + + +.. doxygenstruct:: torch_tensorrt::Input + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/v1.1.1/_sources/_cpp_api/structtorch__tensorrt_1_1torchscript_1_1CompileSpec.rst.txt b/docs/v1.1.1/_sources/_cpp_api/structtorch__tensorrt_1_1torchscript_1_1CompileSpec.rst.txt new file mode 100644 index 0000000000..64b2e06341 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/structtorch__tensorrt_1_1torchscript_1_1CompileSpec.rst.txt @@ -0,0 +1,16 @@ +.. _exhale_struct_structtorch__tensorrt_1_1torchscript_1_1CompileSpec: + +Struct CompileSpec +================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Struct Documentation +-------------------- + + +.. doxygenstruct:: torch_tensorrt::torchscript::CompileSpec + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/v1.1.1/_sources/_cpp_api/torch_tensort_cpp.rst.txt b/docs/v1.1.1/_sources/_cpp_api/torch_tensort_cpp.rst.txt new file mode 100644 index 0000000000..3ca004b7a2 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/torch_tensort_cpp.rst.txt @@ -0,0 +1,10 @@ + +Torch-TensorRT C++ API +====================== + +.. include:: class_view_hierarchy.rst + +.. include:: file_view_hierarchy.rst + +.. include:: unabridged_api.rst + diff --git a/docs/v1.1.1/_sources/_cpp_api/unabridged_api.rst.txt b/docs/v1.1.1/_sources/_cpp_api/unabridged_api.rst.txt new file mode 100644 index 0000000000..29689c465f --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/unabridged_api.rst.txt @@ -0,0 +1,213 @@ + +Full API +-------- + +Namespaces +********** + + +.. toctree:: + :maxdepth: 5 + + namespace_torch_tensorrt.rst + +.. toctree:: + :maxdepth: 5 + + namespace_torch_tensorrt__logging.rst + +.. toctree:: + :maxdepth: 5 + + namespace_torch_tensorrt__ptq.rst + +.. toctree:: + :maxdepth: 5 + + namespace_torch_tensorrt__torchscript.rst + +Classes and Structs +******************* + + +.. toctree:: + :maxdepth: 5 + + structtorch__tensorrt_1_1Device.rst + +.. toctree:: + :maxdepth: 5 + + structtorch__tensorrt_1_1Input.rst + +.. toctree:: + :maxdepth: 5 + + structtorch__tensorrt_1_1torchscript_1_1CompileSpec.rst + +.. toctree:: + :maxdepth: 5 + + classtorch__tensorrt_1_1DataType.rst + +.. toctree:: + :maxdepth: 5 + + classtorch__tensorrt_1_1Device_1_1DeviceType.rst + +.. toctree:: + :maxdepth: 5 + + classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator.rst + +.. toctree:: + :maxdepth: 5 + + classtorch__tensorrt_1_1ptq_1_1Int8Calibrator.rst + +.. toctree:: + :maxdepth: 5 + + classtorch__tensorrt_1_1TensorFormat.rst + +Enums +***** + + +.. toctree:: + :maxdepth: 5 + + enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb.rst + +.. toctree:: + :maxdepth: 5 + + enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558.rst + +Functions +********* + + +.. toctree:: + :maxdepth: 5 + + function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1.rst + +.. toctree:: + :maxdepth: 5 + + function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528.rst + +.. toctree:: + :maxdepth: 5 + + function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a.rst + +.. toctree:: + :maxdepth: 5 + + function_logging_8h_1a0593f776f469c20469e2f729fc7861a3.rst + +.. toctree:: + :maxdepth: 5 + + function_logging_8h_1a0c012cb374addd90eb1f42eaec570650.rst + +.. toctree:: + :maxdepth: 5 + + function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8.rst + +.. toctree:: + :maxdepth: 5 + + function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5.rst + +.. toctree:: + :maxdepth: 5 + + function_logging_8h_1af8f3443813315af7901903d25dd495cc.rst + +.. toctree:: + :maxdepth: 5 + + function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2.rst + +.. toctree:: + :maxdepth: 5 + + function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa.rst + +.. toctree:: + :maxdepth: 5 + + function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039.rst + +.. toctree:: + :maxdepth: 5 + + function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384.rst + +.. toctree:: + :maxdepth: 5 + + function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797.rst + +.. toctree:: + :maxdepth: 5 + + function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9.rst + +.. toctree:: + :maxdepth: 5 + + function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2.rst + +.. toctree:: + :maxdepth: 5 + + function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef.rst + +Defines +******* + + +.. toctree:: + :maxdepth: 5 + + define_macros_8h_1a18d295a837ac71add5578860b55e5502.rst + +.. toctree:: + :maxdepth: 5 + + define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e.rst + +.. toctree:: + :maxdepth: 5 + + define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827.rst + +.. toctree:: + :maxdepth: 5 + + define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268.rst + +.. toctree:: + :maxdepth: 5 + + define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883.rst + +.. toctree:: + :maxdepth: 5 + + define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b.rst + +.. toctree:: + :maxdepth: 5 + + define_macros_8h_1ad19939408f7be171a74a89928b36eb59.rst + +.. toctree:: + :maxdepth: 5 + + define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da.rst diff --git a/docs/v1.1.1/_sources/_cpp_api/unabridged_orphan.rst.txt b/docs/v1.1.1/_sources/_cpp_api/unabridged_orphan.rst.txt new file mode 100644 index 0000000000..5789e581e8 --- /dev/null +++ b/docs/v1.1.1/_sources/_cpp_api/unabridged_orphan.rst.txt @@ -0,0 +1,48 @@ +:orphan: + + +Full API +======== + +Directories +*********** + + +.. toctree:: + :maxdepth: 5 + + dir_cpp.rst + +.. toctree:: + :maxdepth: 5 + + dir_cpp_include.rst + +.. toctree:: + :maxdepth: 5 + + dir_cpp_include_torch_tensorrt.rst + +Files +***** + + +.. toctree:: + :maxdepth: 5 + + file_cpp_include_torch_tensorrt_logging.h.rst + +.. toctree:: + :maxdepth: 5 + + file_cpp_include_torch_tensorrt_macros.h.rst + +.. toctree:: + :maxdepth: 5 + + file_cpp_include_torch_tensorrt_ptq.h.rst + +.. toctree:: + :maxdepth: 5 + + file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst diff --git a/docs/v1.1.1/_sources/_notebooks/CitriNet-example.ipynb.txt b/docs/v1.1.1/_sources/_notebooks/CitriNet-example.ipynb.txt new file mode 100644 index 0000000000..0573af0176 --- /dev/null +++ b/docs/v1.1.1/_sources/_notebooks/CitriNet-example.ipynb.txt @@ -0,0 +1,964 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Torch-TensorRT Getting Started - CitriNet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "[Citrinet](https://docs.nvidia.com/deeplearning/nemo/user-guide/docs/en/main/asr/models.html#citrinet) is an acoustic model used for the speech to text recognition task. It is a version of [QuartzNet](https://arxiv.org/pdf/1910.10261.pdf) that extends [ContextNet](https://arxiv.org/pdf/2005.03191.pdf), utilizing subword encoding (via Word Piece tokenization) and Squeeze-and-Excitation(SE) mechanism and are therefore smaller than QuartzNet models.\n", + "\n", + "CitriNet models take in audio segments and transcribe them to letter, byte pair, or word piece sequences. \n", + "\n", + "\"alt\"\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for optimizing a pretrained CitriNet model with Torch-TensorRT, and running it to test the speedup obtained.\n", + "\n", + "## Content\n", + "1. [Requirements](#1)\n", + "1. [Download Citrinet model](#2)\n", + "1. [Create Torch-TensorRT modules](#3)\n", + "1. [Benchmark Torch-TensorRT models](#4)\n", + "1. [Conclusion](#5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "Follow the steps in [README](README.md) to prepare a Docker container, within which you can run this notebook. \n", + "This notebook assumes that you are within a Jupyter environment in a docker container with Torch-TensorRT installed, such as an NGC monthly release of `nvcr.io/nvidia/pytorch:-py3` (where `yy` indicates the last two numbers of a calendar year, and `mm` indicates the month in two-digit numerical form)\n", + "\n", + "Now that you are in the docker, the next step is to install the required dependencies." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: wget in /opt/conda/lib/python3.8/site-packages (3.2)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Hit:1 http://security.ubuntu.com/ubuntu focal-security InRelease\n", + "Hit:2 http://archive.ubuntu.com/ubuntu focal InRelease\n", + "Hit:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease\n", + "Hit:4 http://archive.ubuntu.com/ubuntu focal-backports InRelease\n", + "Reading package lists... Done\n", + "Reading package lists... Done\n", + "Building dependency tree \n", + "Reading state information... Done\n", + "libsndfile1 is already the newest version (1.0.28-7ubuntu0.1).\n", + "ffmpeg is already the newest version (7:4.2.4-1ubuntu0.1).\n", + "0 upgraded, 0 newly installed, 0 to remove and 22 not upgraded.\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: Cython in /opt/conda/lib/python3.8/site-packages (0.29.28)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: nemo_toolkit[all]==1.5.1 in /opt/conda/lib/python3.8/site-packages (1.5.1)\n", + "Requirement already satisfied: numpy>=1.18.2 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.22.3)\n", + "Requirement already satisfied: onnx>=1.7.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.10.1)\n", + "Requirement already satisfied: python-dateutil in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.8.2)\n", + "Requirement already satisfied: tqdm>=4.41.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.63.0)\n", + "Requirement already satisfied: sentencepiece<1.0.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.96)\n", + "Requirement already satisfied: wget in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.2)\n", + "Requirement already satisfied: numba in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.53.1)\n", + "Requirement already satisfied: torch in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.12.0a0+2c916ef)\n", + "Requirement already satisfied: unidecode in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.3.4)\n", + "Requirement already satisfied: frozendict in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.3.2)\n", + "Requirement already satisfied: wrapt in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.14.0)\n", + "Requirement already satisfied: scikit-learn in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.24.2)\n", + "Requirement already satisfied: ruamel.yaml in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.17.21)\n", + "Requirement already satisfied: pesq in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.0.3)\n", + "Requirement already satisfied: torchvision in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.13.0a0)\n", + "Requirement already satisfied: gdown in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.4.0)\n", + "Requirement already satisfied: editdistance in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.6.0)\n", + "Requirement already satisfied: boto3 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.21.45)\n", + "Requirement already satisfied: isort[requirements]<5 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.3.21)\n", + "Requirement already satisfied: hydra-core>=1.1.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.1.2)\n", + "Requirement already satisfied: youtokentome>=1.0.5 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.0.6)\n", + "Requirement already satisfied: pytorch-lightning>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.6.1)\n", + "Requirement already satisfied: jieba in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.42.1)\n", + "Requirement already satisfied: fasttext in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.9.2)\n", + "Requirement already satisfied: soundfile in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.10.3.post1)\n", + "Requirement already satisfied: kaldiio in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.17.2)\n", + "Requirement already satisfied: pangu in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.0.6.1)\n", + "Requirement already satisfied: kaldi-python-io in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.2.2)\n", + "Requirement already satisfied: parameterized in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.8.1)\n", + "Requirement already satisfied: h5py in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.6.0)\n", + "Requirement already satisfied: rapidfuzz in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.10)\n", + "Requirement already satisfied: marshmallow in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.15.0)\n", + "Requirement already satisfied: opencc in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.1.3)\n", + "Requirement already satisfied: braceexpand in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.7)\n", + "Requirement already satisfied: omegaconf>=2.1.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.1.2)\n", + "Requirement already satisfied: sphinx in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.4.0)\n", + "Requirement already satisfied: pillow in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (9.0.0)\n", + "Requirement already satisfied: wordninja==2.0.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.0)\n", + "Requirement already satisfied: torch-stft in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.4)\n", + "Requirement already satisfied: sox in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.4.1)\n", + "Requirement already satisfied: librosa in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.9.1)\n", + "Requirement already satisfied: regex in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2022.3.15)\n", + "Requirement already satisfied: sacrebleu[ja] in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.0)\n", + "Requirement already satisfied: black==19.10b0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (19.10b0)\n", + "Requirement already satisfied: pydub in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.25.1)\n", + "Requirement already satisfied: sphinxcontrib-bibtex in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.4.2)\n", + "Requirement already satisfied: inflect in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (5.5.2)\n", + "Requirement already satisfied: pyannote.core in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.4)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (21.3)\n", + "Requirement already satisfied: kaldi-io in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.9.4)\n", + "Requirement already satisfied: pyannote.metrics in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.2)\n", + "Requirement already satisfied: g2p-en in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.1.0)\n", + "Requirement already satisfied: matplotlib in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.5.1)\n", + "Requirement already satisfied: torchmetrics>=0.4.1rc0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.8.0)\n", + "Requirement already satisfied: nltk>=3.6.5 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.7)\n", + "Requirement already satisfied: pyyaml<6 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (5.4.1)\n", + "Requirement already satisfied: scipy in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.6.3)\n", + "Requirement already satisfied: ipywidgets in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (7.7.0)\n", + "Requirement already satisfied: pytest in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (6.2.5)\n", + "Requirement already satisfied: pandas in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.3.5)\n", + "Requirement already satisfied: pytest-runner in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (6.0.0)\n", + "Requirement already satisfied: transformers>=4.0.1 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.18.0)\n", + "Requirement already satisfied: sacremoses>=0.0.43 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.0.49)\n", + "Requirement already satisfied: pystoi in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.3.3)\n", + "Requirement already satisfied: attrdict in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.1)\n", + "Requirement already satisfied: webdataset<=0.1.62,>=0.1.48 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.62)\n", + "Requirement already satisfied: wandb in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.12.15)\n", + "Requirement already satisfied: pypinyin in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.46.0)\n", + "Requirement already satisfied: attrs>=18.1.0 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (21.4.0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: appdirs in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (1.4.4)\n", + "Requirement already satisfied: typed-ast>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (1.5.3)\n", + "Requirement already satisfied: pathspec<1,>=0.6 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (0.9.0)\n", + "Requirement already satisfied: click>=6.5 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (8.0.4)\n", + "Requirement already satisfied: toml>=0.9.4 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (0.10.2)\n", + "Requirement already satisfied: antlr4-python3-runtime==4.8 in /opt/conda/lib/python3.8/site-packages (from hydra-core>=1.1.0->nemo_toolkit[all]==1.5.1) (4.8)\n", + "Requirement already satisfied: importlib-resources<5.3 in /opt/conda/lib/python3.8/site-packages (from hydra-core>=1.1.0->nemo_toolkit[all]==1.5.1) (5.2.3)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources<5.3->hydra-core>=1.1.0->nemo_toolkit[all]==1.5.1) (3.7.0)\n", + "Requirement already satisfied: pip-api in /opt/conda/lib/python3.8/site-packages (from isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.0.29)\n", + "Requirement already satisfied: pipreqs in /opt/conda/lib/python3.8/site-packages (from isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.4.11)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (4.31.2)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (1.4.0)\n", + "Requirement already satisfied: pyparsing>=2.2.1 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (3.0.7)\n", + "Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (0.11.0)\n", + "Requirement already satisfied: joblib in /opt/conda/lib/python3.8/site-packages (from nltk>=3.6.5->nemo_toolkit[all]==1.5.1) (1.1.0)\n", + "Requirement already satisfied: typing-extensions>=3.6.2.1 in /opt/conda/lib/python3.8/site-packages (from onnx>=1.7.0->nemo_toolkit[all]==1.5.1) (4.1.1)\n", + "Requirement already satisfied: six in /opt/conda/lib/python3.8/site-packages (from onnx>=1.7.0->nemo_toolkit[all]==1.5.1) (1.16.0)\n", + "Requirement already satisfied: protobuf>=3.12.2 in /opt/conda/lib/python3.8/site-packages (from onnx>=1.7.0->nemo_toolkit[all]==1.5.1) (3.19.4)\n", + "Requirement already satisfied: pyDeprecate<0.4.0,>=0.3.1 in /opt/conda/lib/python3.8/site-packages (from pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.3.2)\n", + "Requirement already satisfied: tensorboard>=2.2.0 in /opt/conda/lib/python3.8/site-packages (from pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.8.0)\n", + "Requirement already satisfied: fsspec[http]!=2021.06.0,>=2021.05.0 in /opt/conda/lib/python3.8/site-packages (from pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2022.2.0)\n", + "Requirement already satisfied: requests in /opt/conda/lib/python3.8/site-packages (from fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.27.1)\n", + "Requirement already satisfied: aiohttp in /opt/conda/lib/python3.8/site-packages (from fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.8.1)\n", + "Requirement already satisfied: werkzeug>=0.11.15 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.0.3)\n", + "Requirement already satisfied: markdown>=2.6.8 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.3.6)\n", + "Requirement already satisfied: setuptools>=41.0.0 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (59.5.0)\n", + "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.4.6)\n", + "Requirement already satisfied: google-auth<3,>=1.6.3 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.6.2)\n", + "Requirement already satisfied: wheel>=0.26 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.37.1)\n", + "Requirement already satisfied: grpcio>=1.24.3 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.44.0)\n", + "Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.6.1)\n", + "Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.8.1)\n", + "Requirement already satisfied: absl-py>=0.4 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.0.0)\n", + "Requirement already satisfied: cachetools<6.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (5.0.0)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in /opt/conda/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.2.8)\n", + "Requirement already satisfied: rsa<5,>=3.1.4 in /opt/conda/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (4.8)\n", + "Requirement already satisfied: requests-oauthlib>=0.7.0 in /opt/conda/lib/python3.8/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.3.1)\n", + "Requirement already satisfied: importlib-metadata>=4.4 in /opt/conda/lib/python3.8/site-packages (from markdown>=2.6.8->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (4.11.3)\n", + "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /opt/conda/lib/python3.8/site-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.4.8)\n", + "Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.0.12)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2021.10.8)\n", + "Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.3)\n", + "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.26.8)\n", + "Requirement already satisfied: oauthlib>=3.0.0 in /opt/conda/lib/python3.8/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.2.0)\n", + "Requirement already satisfied: huggingface-hub<1.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from transformers>=4.0.1->nemo_toolkit[all]==1.5.1) (0.5.1)\n", + "Requirement already satisfied: tokenizers!=0.11.3,<0.13,>=0.11.1 in /opt/conda/lib/python3.8/site-packages (from transformers>=4.0.1->nemo_toolkit[all]==1.5.1) (0.12.1)\n", + "Requirement already satisfied: filelock in /opt/conda/lib/python3.8/site-packages (from transformers>=4.0.1->nemo_toolkit[all]==1.5.1) (3.6.0)\n", + "Requirement already satisfied: frozenlist>=1.1.1 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.3.0)\n", + "Requirement already satisfied: yarl<2.0,>=1.0 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.7.2)\n", + "Requirement already satisfied: async-timeout<5.0,>=4.0.0a3 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (4.0.2)\n", + "Requirement already satisfied: multidict<7.0,>=4.5 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (6.0.2)\n", + "Requirement already satisfied: aiosignal>=1.1.2 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.2.0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: s3transfer<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from boto3->nemo_toolkit[all]==1.5.1) (0.5.2)\n", + "Requirement already satisfied: botocore<1.25.0,>=1.24.45 in /opt/conda/lib/python3.8/site-packages (from boto3->nemo_toolkit[all]==1.5.1) (1.24.45)\n", + "Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /opt/conda/lib/python3.8/site-packages (from boto3->nemo_toolkit[all]==1.5.1) (1.0.0)\n", + "Requirement already satisfied: pybind11>=2.2 in /opt/conda/lib/python3.8/site-packages (from fasttext->nemo_toolkit[all]==1.5.1) (2.9.1)\n", + "Requirement already satisfied: distance>=0.1.3 in /opt/conda/lib/python3.8/site-packages (from g2p-en->nemo_toolkit[all]==1.5.1) (0.1.3)\n", + "Requirement already satisfied: beautifulsoup4 in /opt/conda/lib/python3.8/site-packages (from gdown->nemo_toolkit[all]==1.5.1) (4.10.0)\n", + "Requirement already satisfied: soupsieve>1.2 in /opt/conda/lib/python3.8/site-packages (from beautifulsoup4->gdown->nemo_toolkit[all]==1.5.1) (2.3.1)\n", + "Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.0)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (8.1.1)\n", + "Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (6.9.2)\n", + "Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (1.1.0)\n", + "Requirement already satisfied: widgetsnbextension~=3.6.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (3.6.0)\n", + "Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (5.1.1)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (5.2.0)\n", + "Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (7.1.2)\n", + "Requirement already satisfied: psutil in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (5.9.0)\n", + "Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (6.1)\n", + "Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (1.5.1)\n", + "Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (1.5.4)\n", + "Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (0.1.3)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.7.5)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (5.1.1)\n", + "Requirement already satisfied: pygments>=2.4.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.11.2)\n", + "Requirement already satisfied: stack-data in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.0)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (3.0.27)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.0)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.18.1)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (4.8.0)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.8.3)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (0.4)\n", + "Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (22.3.0)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (4.9.2)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets->nemo_toolkit[all]==1.5.1) (4.4.0)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.18.1)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.5)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (6.4.1)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (1.8.0)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.13.1)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.13.3)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (3.0.3)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (6.4.4)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (21.3.0)\n", + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.21)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.1.1)\n", + "Requirement already satisfied: resampy>=0.2.2 in /opt/conda/lib/python3.8/site-packages (from librosa->nemo_toolkit[all]==1.5.1) (0.2.2)\n", + "Requirement already satisfied: pooch>=1.0 in /opt/conda/lib/python3.8/site-packages (from librosa->nemo_toolkit[all]==1.5.1) (1.6.0)\n", + "Requirement already satisfied: audioread>=2.1.5 in /opt/conda/lib/python3.8/site-packages (from librosa->nemo_toolkit[all]==1.5.1) (2.1.9)\n", + "Requirement already satisfied: llvmlite<0.37,>=0.36.0rc1 in /opt/conda/lib/python3.8/site-packages (from numba->nemo_toolkit[all]==1.5.1) (0.36.0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: threadpoolctl>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from scikit-learn->nemo_toolkit[all]==1.5.1) (3.1.0)\n", + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.7.1)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.5.13)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (4.1.0)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.8.4)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (1.5.0)\n", + "Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.6.0)\n", + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.1.2)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.5.1)\n", + "Requirement already satisfied: pytz>=2017.3 in /opt/conda/lib/python3.8/site-packages (from pandas->nemo_toolkit[all]==1.5.1) (2021.3)\n", + "Requirement already satisfied: pip in /opt/conda/lib/python3.8/site-packages (from pip-api->isort[requirements]<5->nemo_toolkit[all]==1.5.1) (21.2.4)\n", + "Requirement already satisfied: yarg in /opt/conda/lib/python3.8/site-packages (from pipreqs->isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.1.9)\n", + "Requirement already satisfied: docopt in /opt/conda/lib/python3.8/site-packages (from pipreqs->isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.6.2)\n", + "Requirement already satisfied: simplejson>=3.8.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.core->nemo_toolkit[all]==1.5.1) (3.17.6)\n", + "Requirement already satisfied: sortedcontainers>=2.0.4 in /opt/conda/lib/python3.8/site-packages (from pyannote.core->nemo_toolkit[all]==1.5.1) (2.4.0)\n", + "Requirement already satisfied: tabulate>=0.7.7 in /opt/conda/lib/python3.8/site-packages (from pyannote.metrics->nemo_toolkit[all]==1.5.1) (0.8.9)\n", + "Requirement already satisfied: pyannote.database>=4.0.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.metrics->nemo_toolkit[all]==1.5.1) (4.1.3)\n", + "Requirement already satisfied: sympy>=1.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.metrics->nemo_toolkit[all]==1.5.1) (1.10.1)\n", + "Requirement already satisfied: typer[all]>=0.2.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (0.4.0)\n", + "Requirement already satisfied: mpmath>=0.19 in /opt/conda/lib/python3.8/site-packages (from sympy>=1.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (1.2.1)\n", + "Requirement already satisfied: colorama<0.5.0,>=0.4.3 in /opt/conda/lib/python3.8/site-packages (from typer[all]>=0.2.1->pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (0.4.4)\n", + "Requirement already satisfied: shellingham<2.0.0,>=1.3.0 in /opt/conda/lib/python3.8/site-packages (from typer[all]>=0.2.1->pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (1.4.0)\n", + "Requirement already satisfied: py>=1.8.2 in /opt/conda/lib/python3.8/site-packages (from pytest->nemo_toolkit[all]==1.5.1) (1.11.0)\n", + "Requirement already satisfied: iniconfig in /opt/conda/lib/python3.8/site-packages (from pytest->nemo_toolkit[all]==1.5.1) (1.1.1)\n", + "Requirement already satisfied: pluggy<2.0,>=0.12 in /opt/conda/lib/python3.8/site-packages (from pytest->nemo_toolkit[all]==1.5.1) (1.0.0)\n", + "Requirement already satisfied: jarowinkler<1.1.0,>=1.0.2 in /opt/conda/lib/python3.8/site-packages (from rapidfuzz->nemo_toolkit[all]==1.5.1) (1.0.2)\n", + "Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.7.1)\n", + "Requirement already satisfied: ruamel.yaml.clib>=0.2.6 in /opt/conda/lib/python3.8/site-packages (from ruamel.yaml->nemo_toolkit[all]==1.5.1) (0.2.6)\n", + "Requirement already satisfied: portalocker in /opt/conda/lib/python3.8/site-packages (from sacrebleu[ja]->nemo_toolkit[all]==1.5.1) (2.4.0)\n", + "Requirement already satisfied: ipadic<2.0,>=1.0 in /opt/conda/lib/python3.8/site-packages (from sacrebleu[ja]->nemo_toolkit[all]==1.5.1) (1.0.0)\n", + "Requirement already satisfied: mecab-python3==1.0.3 in /opt/conda/lib/python3.8/site-packages (from sacrebleu[ja]->nemo_toolkit[all]==1.5.1) (1.0.3)\n", + "Requirement already satisfied: sphinxcontrib-htmlhelp>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (2.0.0)\n", + "Requirement already satisfied: alabaster<0.8,>=0.7 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (0.7.12)\n", + "Requirement already satisfied: babel>=1.3 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (2.9.1)\n", + "Requirement already satisfied: sphinxcontrib-serializinghtml>=1.1.5 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.1.5)\n", + "Requirement already satisfied: sphinxcontrib-devhelp in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.2)\n", + "Requirement already satisfied: sphinxcontrib-jsmath in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.1)\n", + "Requirement already satisfied: sphinxcontrib-qthelp in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.3)\n", + "Requirement already satisfied: snowballstemmer>=1.1 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (2.2.0)\n", + "Requirement already satisfied: imagesize in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.3.0)\n", + "Requirement already satisfied: sphinxcontrib-applehelp in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.2)\n", + "Requirement already satisfied: docutils<0.18,>=0.14 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (0.17.1)\n", + "Requirement already satisfied: pybtex-docutils>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from sphinxcontrib-bibtex->nemo_toolkit[all]==1.5.1) (1.0.1)\n", + "Requirement already satisfied: pybtex>=0.24 in /opt/conda/lib/python3.8/site-packages (from sphinxcontrib-bibtex->nemo_toolkit[all]==1.5.1) (0.24.0)\n", + "Requirement already satisfied: latexcodec>=1.0.4 in /opt/conda/lib/python3.8/site-packages (from pybtex>=0.24->sphinxcontrib-bibtex->nemo_toolkit[all]==1.5.1) (2.0.1)\n", + "Requirement already satisfied: pure-eval in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.2)\n", + "Requirement already satisfied: asttokens in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.0.5)\n", + "Requirement already satisfied: executing in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.8.3)\n", + "Requirement already satisfied: pathtools in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (0.1.2)\n", + "Requirement already satisfied: setproctitle in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (1.2.3)\n", + "Requirement already satisfied: GitPython>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (3.1.27)\n", + "Requirement already satisfied: sentry-sdk>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (1.5.10)\n", + "Requirement already satisfied: shortuuid>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (1.0.8)\n", + "Requirement already satisfied: docker-pycreds>=0.4.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (0.4.0)\n", + "Requirement already satisfied: promise<3,>=2.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (2.3)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: gitdb<5,>=4.0.1 in /opt/conda/lib/python3.8/site-packages (from GitPython>=1.0.0->wandb->nemo_toolkit[all]==1.5.1) (4.0.9)\n", + "Requirement already satisfied: smmap<6,>=3.0.1 in /opt/conda/lib/python3.8/site-packages (from gitdb<5,>=4.0.1->GitPython>=1.0.0->wandb->nemo_toolkit[all]==1.5.1) (5.0.0)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "# Install dependencies\n", + "!pip install wget\n", + "!apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y libsndfile1 ffmpeg\n", + "!pip install Cython\n", + "\n", + "## Install NeMo\n", + "!pip install nemo_toolkit[all]==1.5.1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 2. Download Citrinet model\n", + "\n", + "Next, we download a pretrained Nemo Citrinet model and convert it to a Torchscript module:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import nemo\n", + "import torch\n", + "\n", + "import nemo.collections.asr as nemo_asr\n", + "from nemo.core import typecheck\n", + "typecheck.set_typecheck_enabled(False) " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading and saving stt_en_citrinet_256...\n", + "[NeMo I 2022-04-21 23:12:45 cloud:56] Found existing object /root/.cache/torch/NeMo/NeMo_1.5.1/stt_en_citrinet_256/91a9cc5850784b2065e8a0aa3d526fd9/stt_en_citrinet_256.nemo.\n", + "[NeMo I 2022-04-21 23:12:45 cloud:62] Re-using file from: /root/.cache/torch/NeMo/NeMo_1.5.1/stt_en_citrinet_256/91a9cc5850784b2065e8a0aa3d526fd9/stt_en_citrinet_256.nemo\n", + "[NeMo I 2022-04-21 23:12:45 common:728] Instantiating model from pre-trained checkpoint\n", + "[NeMo I 2022-04-21 23:12:46 mixins:146] Tokenizer SentencePieceTokenizer initialized with 1024 tokens\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[NeMo W 2022-04-21 23:12:47 modelPT:130] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.\n", + " Train config : \n", + " manifest_filepath: null\n", + " sample_rate: 16000\n", + " batch_size: 32\n", + " trim_silence: true\n", + " max_duration: 16.7\n", + " shuffle: true\n", + " is_tarred: false\n", + " tarred_audio_filepaths: null\n", + " use_start_end_token: false\n", + " \n", + "[NeMo W 2022-04-21 23:12:47 modelPT:137] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s). \n", + " Validation config : \n", + " manifest_filepath: null\n", + " sample_rate: 16000\n", + " batch_size: 32\n", + " shuffle: false\n", + " use_start_end_token: false\n", + " \n", + "[NeMo W 2022-04-21 23:12:47 modelPT:143] Please call the ModelPT.setup_test_data() or ModelPT.setup_multiple_test_data() method and provide a valid configuration file to setup the test data loader(s).\n", + " Test config : \n", + " manifest_filepath: null\n", + " sample_rate: 16000\n", + " batch_size: 32\n", + " shuffle: false\n", + " use_start_end_token: false\n", + " \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[NeMo I 2022-04-21 23:12:47 features:265] PADDING: 16\n", + "[NeMo I 2022-04-21 23:12:47 features:282] STFT using torch\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[NeMo W 2022-04-21 23:12:47 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/nemo/collections/asr/parts/preprocessing/features.py:315: FutureWarning: Pass sr=16000, n_fft=512 as keyword args. From version 0.10 passing these as positional arguments will result in an error\n", + " librosa.filters.mel(sample_rate, self.n_fft, n_mels=nfilt, fmin=lowfreq, fmax=highfreq), dtype=torch.float\n", + " \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[NeMo I 2022-04-21 23:12:49 save_restore_connector:149] Model EncDecCTCModelBPE was successfully restored from /root/.cache/torch/NeMo/NeMo_1.5.1/stt_en_citrinet_256/91a9cc5850784b2065e8a0aa3d526fd9/stt_en_citrinet_256.nemo.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[NeMo W 2022-04-21 23:12:49 export_utils:198] Swapped 0 modules\n", + "[NeMo W 2022-04-21 23:12:49 conv_asr:73] Turned off 235 masked convolutions\n", + "[NeMo W 2022-04-21 23:12:49 export_utils:198] Swapped 0 modules\n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/jit/_trace.py:916: UserWarning: `optimize` is deprecated and has no effect. Use `with torch.jit.optimized_execution() instead\n", + " warnings.warn(\n", + " \n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:668: LightningDeprecationWarning: The `LightningModule.model_size` property was deprecated in v1.5 and will be removed in v1.7. Please use the `pytorch_lightning.utilities.memory.get_model_size_mb`.\n", + " if hasattr(mod, name):\n", + " \n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:669: LightningDeprecationWarning: The `LightningModule.model_size` property was deprecated in v1.5 and will be removed in v1.7. Please use the `pytorch_lightning.utilities.memory.get_model_size_mb`.\n", + " item = getattr(mod, name)\n", + " \n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:668: LightningDeprecationWarning: `LightningModule.use_amp` was deprecated in v1.6 and will be removed in v1.8. Please use `Trainer.amp_backend`.\n", + " if hasattr(mod, name):\n", + " \n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:669: LightningDeprecationWarning: `LightningModule.use_amp` was deprecated in v1.6 and will be removed in v1.8. Please use `Trainer.amp_backend`.\n", + " item = getattr(mod, name)\n", + " \n" + ] + }, + { + "data": { + "text/plain": [ + "(['stt_en_citrinet_256.ts'],\n", + " ['nemo.collections.asr.models.ctc_bpe_models.EncDecCTCModelBPE exported to ONNX'])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "variant = 'stt_en_citrinet_256'\n", + "\n", + "print(f\"Downloading and saving {variant}...\")\n", + "asr_model = nemo_asr.models.EncDecCTCModelBPE.from_pretrained(model_name=variant)\n", + "asr_model.export(f\"{variant}.ts\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Benchmark utility\n", + "\n", + "Let us define a helper benchmarking function, then benchmark the original Pytorch model." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading model: stt_en_citrinet_256.ts\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256.ts =================================\n", + "batch size=1, num iterations=50\n", + " Median samples/s: 102.0, mean: 102.0\n", + " Median latency (s): 0.009802, mean: 0.009803, 99th_p: 0.009836, std_dev: 0.000014\n", + "\n", + "Loading model: stt_en_citrinet_256.ts\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256.ts =================================\n", + "batch size=8, num iterations=50\n", + " Median samples/s: 429.1, mean: 429.1\n", + " Median latency (s): 0.018642, mean: 0.018643, 99th_p: 0.018670, std_dev: 0.000014\n", + "\n", + "Loading model: stt_en_citrinet_256.ts\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256.ts =================================\n", + "batch size=32, num iterations=50\n", + " Median samples/s: 551.3, mean: 551.2\n", + " Median latency (s): 0.058047, mean: 0.058053, 99th_p: 0.058375, std_dev: 0.000106\n", + "\n", + "Loading model: stt_en_citrinet_256.ts\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256.ts =================================\n", + "batch size=128, num iterations=50\n", + " Median samples/s: 594.1, mean: 594.1\n", + " Median latency (s): 0.215434, mean: 0.215446, 99th_p: 0.215806, std_dev: 0.000116\n", + "\n" + ] + } + ], + "source": [ + "from __future__ import print_function\n", + "from __future__ import absolute_import\n", + "from __future__ import division\n", + "\n", + "import argparse\n", + "import timeit\n", + "import numpy as np\n", + "import torch\n", + "import torch_tensorrt as trtorch\n", + "import torch.backends.cudnn as cudnn\n", + "\n", + "def benchmark(model, input_tensor, num_loops, model_name, batch_size):\n", + " def timeGraph(model, input_tensor, num_loops):\n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(20):\n", + " features = model(input_tensor)\n", + "\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(num_loops):\n", + " start_time = timeit.default_timer()\n", + " features = model(input_tensor)\n", + " torch.cuda.synchronize()\n", + " end_time = timeit.default_timer()\n", + " timings.append(end_time - start_time)\n", + " # print(\"Iteration {}: {:.6f} s\".format(i, end_time - start_time))\n", + " return timings\n", + " def printStats(graphName, timings, batch_size):\n", + " times = np.array(timings)\n", + " steps = len(times)\n", + " speeds = batch_size / times\n", + " time_mean = np.mean(times)\n", + " time_med = np.median(times)\n", + " time_99th = np.percentile(times, 99)\n", + " time_std = np.std(times, ddof=0)\n", + " speed_mean = np.mean(speeds)\n", + " speed_med = np.median(speeds)\n", + " msg = (\"\\n%s =================================\\n\"\n", + " \"batch size=%d, num iterations=%d\\n\"\n", + " \" Median samples/s: %.1f, mean: %.1f\\n\"\n", + " \" Median latency (s): %.6f, mean: %.6f, 99th_p: %.6f, std_dev: %.6f\\n\"\n", + " ) % (graphName,\n", + " batch_size, steps,\n", + " speed_med, speed_mean,\n", + " time_med, time_mean, time_99th, time_std)\n", + " print(msg)\n", + " timings = timeGraph(model, input_tensor, num_loops)\n", + " printStats(model_name, timings, batch_size)\n", + "\n", + "precisions_str = 'fp32' # Precision (default=fp32, fp16)\n", + "variant = 'stt_en_citrinet_256' # Nemo Citrinet variant\n", + "batch_sizes = [1, 8, 32, 128] # Batch sizes (default=1,8,32,128)\n", + "trt = False # If True, infer with Torch-TensorRT engine. Else, infer with Pytorch model.\n", + "precision = torch.float32 if precisions_str =='fp32' else torch.float16\n", + "\n", + "for batch_size in batch_sizes:\n", + " if trt:\n", + " model_name = f\"{variant}_bs{batch_size}_{precision}.torch-tensorrt\"\n", + " else:\n", + " model_name = f\"{variant}.ts\"\n", + "\n", + " print(f\"Loading model: {model_name}\") \n", + " # Load traced model to CPU first\n", + " model = torch.jit.load(model_name).cuda()\n", + " cudnn.benchmark = True\n", + " # Create random input tensor of certain size\n", + " torch.manual_seed(12345)\n", + " input_shape=(batch_size, 80, 1488)\n", + " input_tensor = torch.randn(input_shape).cuda()\n", + "\n", + " # Timing graph inference\n", + " benchmark(model, input_tensor, 50, model_name, batch_size)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Confirming the GPU we are using here:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Thu Apr 21 23:13:32 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 510.47.03 Driver Version: 510.47.03 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA TITAN V On | 00000000:17:00.0 Off | N/A |\n", + "| 38% 55C P2 42W / 250W | 2462MiB / 12288MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + "| 1 NVIDIA TITAN V On | 00000000:65:00.0 Off | N/A |\n", + "| 28% 39C P8 26W / 250W | 112MiB / 12288MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| 0 N/A N/A 3909 G 4MiB |\n", + "| 0 N/A N/A 6047 C 2453MiB |\n", + "| 1 N/A N/A 3909 G 39MiB |\n", + "| 1 N/A N/A 4161 G 67MiB |\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 3. Create Torch-TensorRT modules\n", + "\n", + "In this step, we optimize the Citrinet Torchscript module with Torch-TensorRT with various precisions and batch sizes." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating Torchscript-TensorRT module for batchsize 1 precision torch.float32\n", + "Generating Torchscript-TensorRT module for batchsize 8 precision torch.float32\n", + "Generating Torchscript-TensorRT module for batchsize 32 precision torch.float32\n", + "Generating Torchscript-TensorRT module for batchsize 128 precision torch.float32\n", + "Generating Torchscript-TensorRT module for batchsize 1 precision torch.float16\n", + "Generating Torchscript-TensorRT module for batchsize 8 precision torch.float16\n", + "Generating Torchscript-TensorRT module for batchsize 32 precision torch.float16\n", + "Generating Torchscript-TensorRT module for batchsize 128 precision torch.float16\n" + ] + } + ], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "import torch_tensorrt as torchtrt\n", + "import argparse\n", + "\n", + "variant = \"stt_en_citrinet_256\"\n", + "precisions = [torch.float, torch.half]\n", + "batch_sizes = [1,8,32,128]\n", + "\n", + "model = torch.jit.load(f\"{variant}.ts\")\n", + "\n", + "for precision in precisions:\n", + " for batch_size in batch_sizes:\n", + " compile_settings = {\n", + " \"inputs\": [torchtrt.Input(shape=[batch_size, 80, 1488])],\n", + " \"enabled_precisions\": {precision},\n", + " \"workspace_size\": 2000000000,\n", + " \"truncate_long_and_double\": True,\n", + " }\n", + " print(f\"Generating Torchscript-TensorRT module for batchsize {batch_size} precision {precision}\")\n", + " trt_ts_module = torchtrt.compile(model, **compile_settings)\n", + " torch.jit.save(trt_ts_module, f\"{variant}_bs{batch_size}_{precision}.torch-tensorrt\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 4. Benchmark Torch-TensorRT models\n", + "\n", + "Finally, we are ready to benchmark the Torch-TensorRT optimized Citrinet models." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP32 (single precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading model: stt_en_citrinet_256_bs1_torch.float32.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs1_torch.float32.torch-tensorrt =================================\n", + "batch size=1, num iterations=50\n", + " Median samples/s: 242.2, mean: 218.0\n", + " Median latency (s): 0.004128, mean: 0.004825, 99th_p: 0.008071, std_dev: 0.001270\n", + "\n", + "Loading model: stt_en_citrinet_256_bs8_torch.float32.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs8_torch.float32.torch-tensorrt =================================\n", + "batch size=8, num iterations=50\n", + " Median samples/s: 729.9, mean: 709.0\n", + " Median latency (s): 0.010961, mean: 0.011388, 99th_p: 0.016114, std_dev: 0.001256\n", + "\n", + "Loading model: stt_en_citrinet_256_bs32_torch.float32.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs32_torch.float32.torch-tensorrt =================================\n", + "batch size=32, num iterations=50\n", + " Median samples/s: 955.6, mean: 953.4\n", + " Median latency (s): 0.033488, mean: 0.033572, 99th_p: 0.035722, std_dev: 0.000545\n", + "\n", + "Loading model: stt_en_citrinet_256_bs128_torch.float32.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs128_torch.float32.torch-tensorrt =================================\n", + "batch size=128, num iterations=50\n", + " Median samples/s: 1065.8, mean: 1069.4\n", + " Median latency (s): 0.120097, mean: 0.119708, 99th_p: 0.121618, std_dev: 0.001260\n", + "\n" + ] + } + ], + "source": [ + "precisions_str = 'fp32' # Precision (default=fp32, fp16)\n", + "batch_sizes = [1, 8, 32, 128] # Batch sizes (default=1,8,32,128)\n", + "precision = torch.float32 if precisions_str =='fp32' else torch.float16\n", + "trt = True\n", + "\n", + "for batch_size in batch_sizes:\n", + " if trt:\n", + " model_name = f\"{variant}_bs{batch_size}_{precision}.torch-tensorrt\"\n", + " else:\n", + " model_name = f\"{variant}.ts\"\n", + "\n", + " print(f\"Loading model: {model_name}\") \n", + " # Load traced model to CPU first\n", + " model = torch.jit.load(model_name).cuda()\n", + " cudnn.benchmark = True\n", + " # Create random input tensor of certain size\n", + " torch.manual_seed(12345)\n", + " input_shape=(batch_size, 80, 1488)\n", + " input_tensor = torch.randn(input_shape).cuda()\n", + "\n", + " # Timing graph inference\n", + " benchmark(model, input_tensor, 50, model_name, batch_size)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP16 (half precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading model: stt_en_citrinet_256_bs1_torch.float16.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs1_torch.float16.torch-tensorrt =================================\n", + "batch size=1, num iterations=50\n", + " Median samples/s: 288.9, mean: 272.9\n", + " Median latency (s): 0.003462, mean: 0.003774, 99th_p: 0.006846, std_dev: 0.000820\n", + "\n", + "Loading model: stt_en_citrinet_256_bs8_torch.float16.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs8_torch.float16.torch-tensorrt =================================\n", + "batch size=8, num iterations=50\n", + " Median samples/s: 1201.0, mean: 1190.9\n", + " Median latency (s): 0.006661, mean: 0.006733, 99th_p: 0.008453, std_dev: 0.000368\n", + "\n", + "Loading model: stt_en_citrinet_256_bs32_torch.float16.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs32_torch.float16.torch-tensorrt =================================\n", + "batch size=32, num iterations=50\n", + " Median samples/s: 1538.2, mean: 1516.4\n", + " Median latency (s): 0.020804, mean: 0.021143, 99th_p: 0.024492, std_dev: 0.000973\n", + "\n", + "Loading model: stt_en_citrinet_256_bs128_torch.float16.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs128_torch.float16.torch-tensorrt =================================\n", + "batch size=128, num iterations=50\n", + " Median samples/s: 1792.0, mean: 1777.0\n", + " Median latency (s): 0.071428, mean: 0.072057, 99th_p: 0.076796, std_dev: 0.001351\n", + "\n" + ] + } + ], + "source": [ + "precisions_str = 'fp16' # Precision (default=fp32, fp16)\n", + "batch_sizes = [1, 8, 32, 128] # Batch sizes (default=1,8,32,128)\n", + "precision = torch.float32 if precisions_str =='fp32' else torch.float16\n", + "\n", + "for batch_size in batch_sizes:\n", + " if trt:\n", + " model_name = f\"{variant}_bs{batch_size}_{precision}.torch-tensorrt\"\n", + " else:\n", + " model_name = f\"{variant}.ts\"\n", + "\n", + " print(f\"Loading model: {model_name}\") \n", + " # Load traced model to CPU first\n", + " model = torch.jit.load(model_name).cuda()\n", + " cudnn.benchmark = True\n", + " # Create random input tensor of certain size\n", + " torch.manual_seed(12345)\n", + " input_shape=(batch_size, 80, 1488)\n", + " input_tensor = torch.randn(input_shape).cuda()\n", + "\n", + " # Timing graph inference\n", + " benchmark(model, input_tensor, 50, model_name, batch_size)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 5. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of optimizing the Citrinet model with Torch-TensorRT. On an A100 GPU, with Torch-TensorRT, we observe a speedup of ~**2.4X** with FP32, and ~**2.9X** with FP16 at batchsize of 128.\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. Fill out issues at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.1.1/_sources/_notebooks/EfficientNet-example.ipynb.txt b/docs/v1.1.1/_sources/_notebooks/EfficientNet-example.ipynb.txt new file mode 100644 index 0000000000..31a3dad874 --- /dev/null +++ b/docs/v1.1.1/_sources/_notebooks/EfficientNet-example.ipynb.txt @@ -0,0 +1,693 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Torch-TensorRT Getting Started - EfficientNet-B0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch's JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.\n", + "\n", + "When deploying on NVIDIA GPUs TensorRT, NVIDIA's Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA's Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.\n", + "\n", + "Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained EfficientNet network, and running it to test the speedup obtained.\n", + "\n", + "## Content\n", + "1. [Requirements](#1)\n", + "1. [EfficientNet Overview](#2)\n", + "1. [Running the model without optimizations](#3)\n", + "1. [Accelerating with Torch-TensorRT](#4)\n", + "1. [Conclusion](#5)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting timm==0.4.12\n", + " Downloading timm-0.4.12-py3-none-any.whl (376 kB)\n", + "\u001b[K |████████████████████████████████| 376 kB 11.9 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: torch>=1.4 in /opt/conda/lib/python3.8/site-packages (from timm==0.4.12) (1.11.0a0+bfe5ad2)\n", + "Requirement already satisfied: torchvision in /opt/conda/lib/python3.8/site-packages (from timm==0.4.12) (0.12.0a0)\n", + "Requirement already satisfied: typing_extensions in /opt/conda/lib/python3.8/site-packages (from torch>=1.4->timm==0.4.12) (4.0.1)\n", + "Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in /opt/conda/lib/python3.8/site-packages (from torchvision->timm==0.4.12) (8.2.0)\n", + "Requirement already satisfied: numpy in /opt/conda/lib/python3.8/site-packages (from torchvision->timm==0.4.12) (1.22.0)\n", + "Installing collected packages: timm\n", + "Successfully installed timm-0.4.12\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Fri Feb 4 21:29:36 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 510.39.01 Driver Version: 510.39.01 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA GeForce ... On | 00000000:65:00.0 Off | N/A |\n", + "| 30% 28C P8 11W / 350W | 0MiB / 24576MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!pip install timm==0.4.12\n", + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "NVIDIA's NGC provides PyTorch Docker Container which contains PyTorch and Torch-TensorRT. We can make use of [latest pytorch](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch) container to run this notebook.\n", + "\n", + "Otherwise, you can follow the steps in `notebooks/README` to prepare a Docker container yourself, within which you can run this demo notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 2. EfficientNet Overview\n", + "\n", + "\n", + "PyTorch has a model repository called `timm`, which is a source for high quality implementations of computer vision models. We can get our EfficientNet model from there pretrained on ImageNet.\n", + "\n", + "### Model Description\n", + "\n", + "This model is based on the [EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks](https://arxiv.org/abs/1905.11946) paper.\n", + "\n", + "\"alt\"\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 3. Running the model without optimizations\n", + "\n", + "\n", + "PyTorch has a model repository called `timm`, which is a source for high quality implementations of computer vision models. We can get our EfficientNet model from there pretrained on ImageNet." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "import torch\n", + "import torch_tensorrt\n", + "import timm\n", + "import time\n", + "import numpy as np\n", + "import torch.backends.cudnn as cudnn\n", + "from timm.data import resolve_data_config\n", + "from timm.data.transforms_factory import create_transform\n", + "import json \n", + "\n", + "efficientnet_b0_model = timm.create_model('efficientnet_b0',pretrained=True)\n", + "model = efficientnet_b0_model.eval().to(\"cuda\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our model loaded, let's proceed to downloading some images!" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2022-02-04 21:30:07-- https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\n", + "Resolving d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)... 18.65.227.127, 18.65.227.37, 18.65.227.99, ...\n", + "Connecting to d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)|18.65.227.127|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 24112 (24K) [image/jpeg]\n", + "Saving to: ‘./data/img0.JPG’\n", + "\n", + "./data/img0.JPG 100%[===================>] 23.55K --.-KB/s in 0.004s \n", + "\n", + "2022-02-04 21:30:07 (6.40 MB/s) - ‘./data/img0.JPG’ saved [24112/24112]\n", + "\n", + "--2022-02-04 21:30:07-- https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\n", + "Resolving www.hakaimagazine.com (www.hakaimagazine.com)... 164.92.73.117\n", + "Connecting to www.hakaimagazine.com (www.hakaimagazine.com)|164.92.73.117|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 452718 (442K) [image/jpeg]\n", + "Saving to: ‘./data/img1.JPG’\n", + "\n", + "./data/img1.JPG 100%[===================>] 442.11K --.-KB/s in 0.06s \n", + "\n", + "2022-02-04 21:30:07 (6.83 MB/s) - ‘./data/img1.JPG’ saved [452718/452718]\n", + "\n", + "--2022-02-04 21:30:08-- https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\n", + "Resolving www.artis.nl (www.artis.nl)... 94.75.225.20\n", + "Connecting to www.artis.nl (www.artis.nl)|94.75.225.20|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 361413 (353K) [image/jpeg]\n", + "Saving to: ‘./data/img2.JPG’\n", + "\n", + "./data/img2.JPG 100%[===================>] 352.94K 246KB/s in 1.4s \n", + "\n", + "2022-02-04 21:30:10 (246 KB/s) - ‘./data/img2.JPG’ saved [361413/361413]\n", + "\n", + "--2022-02-04 21:30:10-- https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\n", + "Resolving www.familyhandyman.com (www.familyhandyman.com)... 104.18.202.107, 104.18.201.107, 2606:4700::6812:ca6b, ...\n", + "Connecting to www.familyhandyman.com (www.familyhandyman.com)|104.18.202.107|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 90994 (89K) [image/jpeg]\n", + "Saving to: ‘./data/img3.JPG’\n", + "\n", + "./data/img3.JPG 100%[===================>] 88.86K --.-KB/s in 0.006s \n", + "\n", + "2022-02-04 21:30:10 (14.4 MB/s) - ‘./data/img3.JPG’ saved [90994/90994]\n", + "\n", + "--2022-02-04 21:30:11-- https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\n", + "Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.216.133.45\n", + "Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.216.133.45|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 35363 (35K) [application/octet-stream]\n", + "Saving to: ‘./data/imagenet_class_index.json’\n", + "\n", + "./data/imagenet_cla 100%[===================>] 34.53K --.-KB/s in 0.07s \n", + "\n", + "2022-02-04 21:30:11 (474 KB/s) - ‘./data/imagenet_class_index.json’ saved [35363/35363]\n", + "\n" + ] + } + ], + "source": [ + "!mkdir -p ./data\n", + "!wget -O ./data/img0.JPG \"https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\"\n", + "!wget -O ./data/img1.JPG \"https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\"\n", + "!wget -O ./data/img2.JPG \"https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\"\n", + "!wget -O ./data/img3.JPG \"https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\"\n", + "\n", + "!wget -O ./data/imagenet_class_index.json \"https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All pre-trained models expect input images normalized in the same way,\n", + "i.e. mini-batches of 3-channel RGB images of shape `(3 x H x W)`, where `H` and `W` are expected to be at least `224`.\n", + "The images have to be loaded in to a range of `[0, 1]` and then normalized using `mean = [0.485, 0.456, 0.406]`\n", + "and `std = [0.229, 0.224, 0.225]`.\n", + "\n", + "Here's a sample execution." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from PIL import Image\n", + "from torchvision import transforms\n", + "import matplotlib.pyplot as plt\n", + "\n", + "fig, axes = plt.subplots(nrows=2, ncols=2)\n", + "\n", + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " input_tensor = preprocess(img) \n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img)\n", + " plt.axis('off')\n", + "\n", + "# loading labels\n", + "with open(\"./data/imagenet_class_index.json\") as json_file: \n", + " d = json.load(json_file)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Throughout this tutorial, we will be making use of some utility functions; `efficientnet_preprocess` for preprocessing input images, `predict` to use the model for prediction and `benchmark` to benchmark the inference. You do not need to understand/go through these utilities to make use of Torch TensorRT, but are welecomed to do so if you choose." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "cudnn.benchmark = True\n", + "\n", + "def efficientnet_preprocess():\n", + " config = resolve_data_config({}, model=model)\n", + " transform = create_transform(**config)\n", + " return transform\n", + "\n", + "# decode the results into ([predicted class, description], probability)\n", + "def predict(img_path, model):\n", + " img = Image.open(img_path)\n", + " preprocess = efficientnet_preprocess()\n", + " input_tensor = preprocess(img)\n", + " input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model\n", + " \n", + " # move the input and model to GPU for speed if available\n", + " if torch.cuda.is_available():\n", + " input_batch = input_batch.to('cuda')\n", + " model.to('cuda')\n", + "\n", + " with torch.no_grad():\n", + " output = model(input_batch)\n", + " # Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes\n", + " sm_output = torch.nn.functional.softmax(output[0], dim=0)\n", + " \n", + " ind = torch.argmax(sm_output)\n", + " return d[str(ind.item())], sm_output[ind] #([predicted class, description], probability)\n", + "\n", + "def benchmark(model, input_shape=(1024, 1, 224, 224), dtype='fp32', nwarmup=50, nruns=10000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%10==0:\n", + " print('Iteration %d/%d, avg batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output features size:\", features.size())\n", + " print('Average throughput: %.2f images/second'%(input_shape[0]/np.mean(timings)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the model downloaded and the util functions written, let's just quickly see some predictions, and benchmark the model in its current un-optimized state." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/lib/python3.8/site-packages/torchvision/transforms/transforms.py:321: UserWarning: Argument interpolation should be of type InterpolationMode instead of int. Please, use InterpolationMode enum.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "./data/img0.JPG - Predicted: ['n02109961', 'Eskimo_dog'], Probablility: 0.3987298309803009\n", + "./data/img1.JPG - Predicted: ['n01537544', 'indigo_bunting'], Probablility: 0.23344755172729492\n", + "./data/img2.JPG - Predicted: ['n02481823', 'chimpanzee'], Probablility: 0.9695423245429993\n", + "./data/img3.JPG - Predicted: ['n01739381', 'vine_snake'], Probablility: 0.227739155292511\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " \n", + " pred, prob = predict(img_path, efficientnet_b0_model)\n", + " print('{} - Predicted: {}, Probablility: {}'.format(img_path, pred, prob))\n", + "\n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img);\n", + " plt.axis('off');\n", + " plt.title(pred[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 37.62 ms\n", + "Iteration 20/100, avg batch time 37.66 ms\n", + "Iteration 30/100, avg batch time 37.65 ms\n", + "Iteration 40/100, avg batch time 37.66 ms\n", + "Iteration 50/100, avg batch time 37.70 ms\n", + "Iteration 60/100, avg batch time 37.70 ms\n", + "Iteration 70/100, avg batch time 37.70 ms\n", + "Iteration 80/100, avg batch time 37.71 ms\n", + "Iteration 90/100, avg batch time 37.72 ms\n", + "Iteration 100/100, avg batch time 37.72 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average throughput: 3393.46 images/second\n" + ] + } + ], + "source": [ + "# Model benchmark without Torch-TensorRT\n", + "benchmark(model, input_shape=(128, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 4. Accelerating with Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Onwards to the next step, accelerating with Torch TensorRT. In these examples we showcase the results for FP32 (single precision) and FP16 (half precision). We do not demonstrat specific tuning, just showcase the simplicity of usage. If you want to learn more about the possible customizations, visit our [documentation](https://nvidia.github.io/Torch-TensorRT/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP32 (single precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n" + ] + } + ], + "source": [ + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP32 precision.\n", + "trt_model_fp32 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.float32)],\n", + " enabled_precisions = torch.float32, # Run with FP32\n", + " workspace_size = 1 << 22\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 27.86 ms\n", + "Iteration 20/100, avg batch time 27.71 ms\n", + "Iteration 30/100, avg batch time 27.99 ms\n", + "Iteration 40/100, avg batch time 27.95 ms\n", + "Iteration 50/100, avg batch time 27.89 ms\n", + "Iteration 60/100, avg batch time 27.85 ms\n", + "Iteration 70/100, avg batch time 28.00 ms\n", + "Iteration 80/100, avg batch time 27.97 ms\n", + "Iteration 90/100, avg batch time 27.95 ms\n", + "Iteration 100/100, avg batch time 27.92 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average throughput: 4584.06 images/second\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input\n", + "benchmark(trt_model_fp32, input_shape=(128, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP16 (half precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x.1\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Tensor DataType is determined at build time for tensors not marked as input or output.\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Tensor DataType is determined at build time for tensors not marked as input or output.\n" + ] + } + ], + "source": [ + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP16 precision.\n", + "trt_model_fp16 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.half)],\n", + " enabled_precisions = {torch.half}, # Run with FP32\n", + " workspace_size = 1 << 22\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 12.05 ms\n", + "Iteration 20/100, avg batch time 12.56 ms\n", + "Iteration 30/100, avg batch time 12.39 ms\n", + "Iteration 40/100, avg batch time 12.34 ms\n", + "Iteration 50/100, avg batch time 12.33 ms\n", + "Iteration 60/100, avg batch time 12.32 ms\n", + "Iteration 70/100, avg batch time 12.30 ms\n", + "Iteration 80/100, avg batch time 12.28 ms\n", + "Iteration 90/100, avg batch time 12.35 ms\n", + "Iteration 100/100, avg batch time 12.35 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average throughput: 10362.23 images/second\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input\n", + "benchmark(trt_model_fp16, input_shape=(128, 3, 224, 224), dtype='fp16', nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 5. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT for EfficientNet-B0 model and test the performance impact of the optimization. With Torch-TensorRT, we observe a speedup of **1.35x** with FP32, and **3.13x** with FP16 on an NVIDIA 3090 GPU. These acceleration numbers will vary from GPU to GPU(as well as implementation to implementation based on the ops used) and we encorage you to try out latest generation of Data center compute cards for maximum acceleration.\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. If you run into any issues, you can fill them at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.1.1/_sources/_notebooks/Hugging-Face-BERT.ipynb.txt b/docs/v1.1.1/_sources/_notebooks/Hugging-Face-BERT.ipynb.txt new file mode 100644 index 0000000000..9b027b473e --- /dev/null +++ b/docs/v1.1.1/_sources/_notebooks/Hugging-Face-BERT.ipynb.txt @@ -0,0 +1,714 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "9369b63c", + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2022 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "id": "d0a97ac5", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Masked Language Modeling (MLM) with Hugging Face BERT Transformer" + ] + }, + { + "cell_type": "markdown", + "id": "83f47edb", + "metadata": {}, + "source": [ + "## Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained BERT transformer from Hugging Face, and running it to test the speedup obtained.\n", + "\n", + "## Contents\n", + "1. [Requirements](#1)\n", + "2. [BERT Overview](#2)\n", + "3. [Creating TorchScript modules](#3)\n", + "4. [Compiling with Torch-TensorRT](#4)\n", + "5. [Benchmarking](#5)\n", + "6. [Conclusion](#6)" + ] + }, + { + "cell_type": "markdown", + "id": "596fa151", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "NVIDIA's NGC provides a PyTorch Docker Container which contains PyTorch and Torch-TensorRT. Starting with version `22.05-py3`, we can make use of [latest pytorch](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch) container to run this notebook.\n", + "\n", + "Otherwise, you can follow the steps in `notebooks/README` to prepare a Docker container yourself, within which you can run this demo notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "58e687d1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: transformers in /opt/conda/lib/python3.8/site-packages (4.18.0)\n", + "Requirement already satisfied: tqdm>=4.27 in /opt/conda/lib/python3.8/site-packages (from transformers) (4.63.0)\n", + "Requirement already satisfied: regex!=2019.12.17 in /opt/conda/lib/python3.8/site-packages (from transformers) (2022.3.15)\n", + "Requirement already satisfied: huggingface-hub<1.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from transformers) (0.5.1)\n", + "Requirement already satisfied: tokenizers!=0.11.3,<0.13,>=0.11.1 in /opt/conda/lib/python3.8/site-packages (from transformers) (0.12.1)\n", + "Requirement already satisfied: numpy>=1.17 in /opt/conda/lib/python3.8/site-packages (from transformers) (1.22.3)\n", + "Requirement already satisfied: sacremoses in /opt/conda/lib/python3.8/site-packages (from transformers) (0.0.49)\n", + "Requirement already satisfied: requests in /opt/conda/lib/python3.8/site-packages (from transformers) (2.27.1)\n", + "Requirement already satisfied: pyyaml>=5.1 in /opt/conda/lib/python3.8/site-packages (from transformers) (6.0)\n", + "Requirement already satisfied: filelock in /opt/conda/lib/python3.8/site-packages (from transformers) (3.6.0)\n", + "Requirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.8/site-packages (from transformers) (21.3)\n", + "Requirement already satisfied: typing-extensions>=3.7.4.3 in /opt/conda/lib/python3.8/site-packages (from huggingface-hub<1.0,>=0.1.0->transformers) (4.1.1)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging>=20.0->transformers) (3.0.7)\n", + "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (1.26.8)\n", + "Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (2.0.12)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (2021.10.8)\n", + "Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (3.3)\n", + "Requirement already satisfied: six in /opt/conda/lib/python3.8/site-packages (from sacremoses->transformers) (1.16.0)\n", + "Requirement already satisfied: click in /opt/conda/lib/python3.8/site-packages (from sacremoses->transformers) (8.0.4)\n", + "Requirement already satisfied: joblib in /opt/conda/lib/python3.8/site-packages (from sacremoses->transformers) (1.1.0)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install transformers" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "1104c4f1", + "metadata": {}, + "outputs": [], + "source": [ + "from transformers import BertTokenizer, BertForMaskedLM\n", + "import torch\n", + "import timeit\n", + "import numpy as np\n", + "import torch_tensorrt\n", + "import torch.backends.cudnn as cudnn" + ] + }, + { + "cell_type": "markdown", + "id": "acf67a5e", + "metadata": {}, + "source": [ + "\n", + "## 2. BERT Overview\n", + "\n", + "Transformers comprise a class of deep learning algorithms employing self-attention; broadly speaking, the models learn large matrices of numbers, each element of which denotes how important one component of input data is to another. Since their introduction in 2017, transformers have enjoyed widespread adoption, particularly in natural language processing, but also in computer vision problems. This is largely because they are easier to parallelize than the sequence models which attention mechanisms were originally designed to augment. \n", + "\n", + "Hugging Face is a company that maintains a huge respository of pre-trained transformer models. The company also provides tools for integrating those models into PyTorch code and running inference with them. \n", + "\n", + "One of the most popular transformer models is BERT (Bidirectional Encoder Representations from Transformers). First developed at Google and released in 2018, it has become the backbone of Google's search engine and a standard benchmark for NLP experiments. BERT was originally trained for next sentence prediction and masked language modeling (MLM), which aims to predict hidden words in sentences. In this notebook, we will use Hugging Face's `bert-base-uncased` model (BERT's smallest and simplest form, which does not employ text capitalization) for MLM." + ] + }, + { + "cell_type": "markdown", + "id": "19e711c0", + "metadata": {}, + "source": [ + "\n", + "## 3. Creating TorchScript modules " + ] + }, + { + "cell_type": "markdown", + "id": "81d4c6f6", + "metadata": {}, + "source": [ + "First, create a pretrained BERT tokenizer from the `bert-base-uncased` model" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c7c8721e", + "metadata": {}, + "outputs": [], + "source": [ + "enc = BertTokenizer.from_pretrained('bert-base-uncased')" + ] + }, + { + "cell_type": "markdown", + "id": "b7c1c679", + "metadata": {}, + "source": [ + "Create dummy inputs to generate a traced TorchScript model later" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c3827087", + "metadata": {}, + "outputs": [], + "source": [ + "batch_size = 4\n", + "\n", + "batched_indexed_tokens = [[101, 64]*64]*batch_size\n", + "batched_segment_ids = [[0, 1]*64]*batch_size\n", + "batched_attention_masks = [[1, 1]*64]*batch_size\n", + "\n", + "tokens_tensor = torch.tensor(batched_indexed_tokens)\n", + "segments_tensor = torch.tensor(batched_segment_ids)\n", + "attention_masks_tensor = torch.tensor(batched_attention_masks)" + ] + }, + { + "cell_type": "markdown", + "id": "7e31b27f", + "metadata": {}, + "source": [ + "Obtain a BERT masked language model from Hugging Face in the (scripted) TorchScript, then use the dummy inputs to trace it" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "a3cd5a35", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Some weights of the model checkpoint at bert-base-uncased were not used when initializing BertForMaskedLM: ['cls.seq_relationship.bias', 'cls.seq_relationship.weight']\n", + "- This IS expected if you are initializing BertForMaskedLM from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n", + "- This IS NOT expected if you are initializing BertForMaskedLM from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n" + ] + } + ], + "source": [ + "mlm_model_ts = BertForMaskedLM.from_pretrained('bert-base-uncased', torchscript=True)\n", + "traced_mlm_model = torch.jit.trace(mlm_model_ts, [tokens_tensor, segments_tensor, attention_masks_tensor])" + ] + }, + { + "cell_type": "markdown", + "id": "d8d2217a", + "metadata": {}, + "source": [ + "Define 4 masked sentences, with 1 word in each sentence hidden from the model. Fluent English speakers will probably be able to guess the masked words, but just in case, they are `'capital'`, `'language'`, `'innings'`, and `'mathematics'`.\n", + "\n", + "Also create a list containing the position of the masked word within each sentence. Given Python's 0-based indexing convention, the numbers are each higher by 1 than might be expected. This is because the token at index 0 in each sentence is a beginning-of-sentence token, denoted `[CLS]` when entered explicitly. " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "4d1af982", + "metadata": {}, + "outputs": [], + "source": [ + "masked_sentences = ['Paris is the [MASK] of France.', \n", + " 'The primary [MASK] of the United States is English.', \n", + " 'A baseball game consists of at least nine [MASK].', \n", + " 'Topology is a branch of [MASK] concerned with the properties of geometric objects that remain unchanged under continuous transformations.']\n", + "pos_masks = [4, 3, 9, 6]" + ] + }, + { + "cell_type": "markdown", + "id": "4d89b4c8", + "metadata": {}, + "source": [ + "Pass the masked sentences into the (scripted) TorchScript MLM model and verify that the unmasked sentences yield the expected results. \n", + "\n", + "Because the sentences are of different lengths, we must specify the `padding` argument in calling our encoder/tokenizer. There are several possible padding strategies, but we'll use `'max_length'` padding with `max_length=128`. Later, when we compile an optimized version of the model with Torch-TensorRT, the optimized model will expect inputs of length 128, hence our choice of padding strategy and length here. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "d2d7546b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Paris is the capital of France.\n", + "The primary language of the United States is English.\n", + "A baseball game consists of at least nine innings.\n", + "Topology is a branch of mathematics concerned with the properties of geometric objects that remain unchanged under continuous transformations.\n" + ] + } + ], + "source": [ + "encoded_inputs = enc(masked_sentences, return_tensors='pt', padding='max_length', max_length=128)\n", + "outputs = mlm_model_ts(**encoded_inputs)\n", + "most_likely_token_ids = [torch.argmax(outputs[0][i, pos, :]) for i, pos in enumerate(pos_masks)]\n", + "unmasked_tokens = enc.decode(most_likely_token_ids).split(' ')\n", + "unmasked_sentences = [masked_sentences[i].replace('[MASK]', token) for i, token in enumerate(unmasked_tokens)]\n", + "for sentence in unmasked_sentences:\n", + " print(sentence)" + ] + }, + { + "cell_type": "markdown", + "id": "b0b423ff", + "metadata": {}, + "source": [ + "Pass the masked sentences into the traced MLM model and verify that the unmasked sentences yield the expected results. \n", + "\n", + "Note the difference in how the `encoded_inputs` are passed into the model in the following cell compared to the previous one. If you examine `encoded_inputs`, you'll find that it's a dictionary with 3 keys, `'input_ids'`, `'token_type_ids'`, and `'attention_mask'`, each with a PyTorch tensor as an associated value. The traced model will accept `**encoded_inputs` as an input, but the Torch-TensorRT-optimized model (to be defined later) will not. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "683a4a73", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Paris is the capital of France.\n", + "The primary language of the United States is English.\n", + "A baseball game consists of at least nine innings.\n", + "Topology is a branch of mathematics concerned with the properties of geometric objects that remain unchanged under continuous transformations.\n" + ] + } + ], + "source": [ + "encoded_inputs = enc(masked_sentences, return_tensors='pt', padding='max_length', max_length=128)\n", + "outputs = traced_mlm_model(encoded_inputs['input_ids'], encoded_inputs['token_type_ids'], encoded_inputs['attention_mask'])\n", + "most_likely_token_ids = [torch.argmax(outputs[0][i, pos, :]) for i, pos in enumerate(pos_masks)]\n", + "unmasked_tokens = enc.decode(most_likely_token_ids).split(' ')\n", + "unmasked_sentences = [masked_sentences[i].replace('[MASK]', token) for i, token in enumerate(unmasked_tokens)]\n", + "for sentence in unmasked_sentences:\n", + " print(sentence)" + ] + }, + { + "cell_type": "markdown", + "id": "7a31b545", + "metadata": {}, + "source": [ + "\n", + "## 4. Compiling with Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "id": "413d8b4f", + "metadata": {}, + "source": [ + "Change the logging level to avoid long printouts" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "42862893", + "metadata": {}, + "outputs": [], + "source": [ + "new_level = torch_tensorrt.logging.Level.Error\n", + "torch_tensorrt.logging.set_reportable_log_level(new_level)" + ] + }, + { + "cell_type": "markdown", + "id": "121d6d59", + "metadata": {}, + "source": [ + "Compile the model" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "eab90150", + "metadata": {}, + "outputs": [], + "source": [ + "trt_model = torch_tensorrt.compile(traced_mlm_model, \n", + " inputs= [torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32), # input_ids\n", + " torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32), # token_type_ids\n", + " torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32)], # attention_mask\n", + " enabled_precisions= {torch.float32}, # Run with 32-bit precision\n", + " workspace_size=2000000000,\n", + " truncate_long_and_double=True\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a96751ce", + "metadata": {}, + "source": [ + "Pass the masked sentences into the compiled model and verify that the unmasked sentences yield the expected results." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "097ea381", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Paris is the capital of France.\n", + "The primary language of the United States is English.\n", + "A baseball game consists of at least nine innings.\n", + "Topology is a branch of mathematics concerned with the properties of geometric objects that remain unchanged under continuous transformations.\n" + ] + } + ], + "source": [ + "enc_inputs = enc(masked_sentences, return_tensors='pt', padding='max_length', max_length=128)\n", + "enc_inputs = {k: v.type(torch.int32).cuda() for k, v in enc_inputs.items()}\n", + "output_trt = trt_model(enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "most_likely_token_ids_trt = [torch.argmax(output_trt[i, pos, :]) for i, pos in enumerate(pos_masks)] \n", + "unmasked_tokens_trt = enc.decode(most_likely_token_ids_trt).split(' ')\n", + "unmasked_sentences_trt = [masked_sentences[i].replace('[MASK]', token) for i, token in enumerate(unmasked_tokens_trt)]\n", + "for sentence in unmasked_sentences_trt:\n", + " print(sentence)" + ] + }, + { + "cell_type": "markdown", + "id": "a398271d", + "metadata": {}, + "source": [ + "Compile the model again, this time with 16-bit precision" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "a063dee2", + "metadata": {}, + "outputs": [], + "source": [ + "trt_model_fp16 = torch_tensorrt.compile(traced_mlm_model, \n", + " inputs= [torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32), # input_ids\n", + " torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32), # token_type_ids\n", + " torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32)], # attention_mask\n", + " enabled_precisions= {torch.half}, # Run with 16-bit precision\n", + " workspace_size=2000000000,\n", + " truncate_long_and_double=True\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a926334a", + "metadata": {}, + "source": [ + "\n", + "## 5. Benchmarking\n", + "\n", + "In developing this notebook, we conducted our benchmarking on a single NVIDIA A100 GPU. Your results may differ from those shown, particularly on a different GPU." + ] + }, + { + "cell_type": "markdown", + "id": "976c6fb9", + "metadata": {}, + "source": [ + "This function passes the inputs into the model and runs inference `num_loops` times, then returns a list of length containing the amount of time in seconds that each instance of inference took." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "b72a091e", + "metadata": {}, + "outputs": [], + "source": [ + "def timeGraph(model, input_tensor1, input_tensor2, input_tensor3, num_loops=50):\n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(20):\n", + " features = model(input_tensor1, input_tensor2, input_tensor3)\n", + "\n", + " torch.cuda.synchronize()\n", + "\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(num_loops):\n", + " start_time = timeit.default_timer()\n", + " features = model(input_tensor1, input_tensor2, input_tensor3)\n", + " torch.cuda.synchronize()\n", + " end_time = timeit.default_timer()\n", + " timings.append(end_time - start_time)\n", + " # print(\"Iteration {}: {:.6f} s\".format(i, end_time - start_time))\n", + "\n", + " return timings" + ] + }, + { + "cell_type": "markdown", + "id": "0b44dcf8", + "metadata": {}, + "source": [ + "This function prints the number of input batches the model is able to process each second and summary statistics of the model's latency." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "2ef71ab7", + "metadata": {}, + "outputs": [], + "source": [ + "def printStats(graphName, timings, batch_size):\n", + " times = np.array(timings)\n", + " steps = len(times)\n", + " speeds = batch_size / times\n", + " time_mean = np.mean(times)\n", + " time_med = np.median(times)\n", + " time_99th = np.percentile(times, 99)\n", + " time_std = np.std(times, ddof=0)\n", + " speed_mean = np.mean(speeds)\n", + " speed_med = np.median(speeds)\n", + "\n", + " msg = (\"\\n%s =================================\\n\"\n", + " \"batch size=%d, num iterations=%d\\n\"\n", + " \" Median text batches/second: %.1f, mean: %.1f\\n\"\n", + " \" Median latency: %.6f, mean: %.6f, 99th_p: %.6f, std_dev: %.6f\\n\"\n", + " ) % (graphName,\n", + " batch_size, steps,\n", + " speed_med, speed_mean,\n", + " time_med, time_mean, time_99th, time_std)\n", + " print(msg)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "afe97b9b", + "metadata": {}, + "outputs": [], + "source": [ + "cudnn.benchmark = True" + ] + }, + { + "cell_type": "markdown", + "id": "eba98b24", + "metadata": {}, + "source": [ + "Benchmark the (scripted) TorchScript model on GPU" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "bab5fa8f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "\n", + "BERT =================================\n", + "batch size=4, num iterations=50\n", + " Median text batches/second: 599.1, mean: 597.6\n", + " Median latency: 0.006677, mean: 0.006693, 99th_p: 0.006943, std_dev: 0.000059\n", + "\n" + ] + } + ], + "source": [ + "timings = timeGraph(mlm_model_ts.cuda(), enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "\n", + "printStats(\"BERT\", timings, batch_size)" + ] + }, + { + "cell_type": "markdown", + "id": "bc79c452", + "metadata": {}, + "source": [ + "Benchmark the traced model on GPU" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "5c0bd8e9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "\n", + "BERT =================================\n", + "batch size=4, num iterations=50\n", + " Median text batches/second: 951.2, mean: 951.0\n", + " Median latency: 0.004205, mean: 0.004206, 99th_p: 0.004256, std_dev: 0.000015\n", + "\n" + ] + } + ], + "source": [ + "timings = timeGraph(traced_mlm_model.cuda(), enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "\n", + "printStats(\"BERT\", timings, batch_size)" + ] + }, + { + "cell_type": "markdown", + "id": "41db22a1", + "metadata": {}, + "source": [ + "Benchmark the compiled FP32 model on GPU" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "ade7b508", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "\n", + "BERT =================================\n", + "batch size=4, num iterations=50\n", + " Median text batches/second: 1216.9, mean: 1216.4\n", + " Median latency: 0.003287, mean: 0.003289, 99th_p: 0.003317, std_dev: 0.000007\n", + "\n" + ] + } + ], + "source": [ + "timings = timeGraph(trt_model, enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "\n", + "printStats(\"BERT\", timings, batch_size)" + ] + }, + { + "cell_type": "markdown", + "id": "57b696de", + "metadata": {}, + "source": [ + "Benchmark the compiled FP16 model on GPU" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "f61b83fd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "\n", + "BERT =================================\n", + "batch size=4, num iterations=50\n", + " Median text batches/second: 1776.7, mean: 1771.1\n", + " Median latency: 0.002251, mean: 0.002259, 99th_p: 0.002305, std_dev: 0.000015\n", + "\n" + ] + } + ], + "source": [ + "timings = timeGraph(trt_model_fp16, enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "\n", + "printStats(\"BERT\", timings, batch_size)" + ] + }, + { + "cell_type": "markdown", + "id": "43f67ba3", + "metadata": {}, + "source": [ + "\n", + "## 6. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT for Masked Language Modeling with Hugging Face's `bert-base-uncased` transformer and testing the performance impact of the optimization. With Torch-TensorRT on an NVIDIA A100 GPU, we observe the speedups indicated below. These acceleration numbers will vary from GPU to GPU (as well as implementation to implementation based on the ops used) and we encorage you to try out latest generation of Data center compute cards for maximum acceleration.\n", + "\n", + "Scripted (GPU): 1.0x\n", + "Traced (GPU): 1.62x\n", + "Torch-TensorRT (FP32): 2.14x\n", + "Torch-TensorRT (FP16): 3.15x\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. If you run into any issues, you can fill them at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4ebd152d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/v1.1.1/_sources/_notebooks/Resnet50-example.ipynb.txt b/docs/v1.1.1/_sources/_notebooks/Resnet50-example.ipynb.txt new file mode 100644 index 0000000000..f020662c73 --- /dev/null +++ b/docs/v1.1.1/_sources/_notebooks/Resnet50-example.ipynb.txt @@ -0,0 +1,925 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Torch-TensorRT Getting Started - ResNet 50" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch's JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.\n", + "\n", + "When deploying on NVIDIA GPUs TensorRT, NVIDIA's Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA's Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.\n", + "\n", + "Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained ResNet-50 network, and running it to test the speedup obtained.\n", + "\n", + "## Content\n", + "1. [Requirements](#1)\n", + "1. [ResNet-50 Overview](#2)\n", + "1. [Running the model without optimizations](#3)\n", + "1. [Accelerating with Torch-TensorRT](#4)\n", + "1. [Conclusion](#5)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tue Feb 8 19:16:53 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 510.39.01 Driver Version: 510.39.01 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA GeForce ... On | 00000000:65:00.0 Off | N/A |\n", + "| 30% 29C P8 15W / 350W | 0MiB / 24576MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting ipywidgets\n", + " Downloading ipywidgets-7.6.5-py2.py3-none-any.whl (121 kB)\n", + "\u001b[K |████████████████████████████████| 121 kB 5.3 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)\n", + "Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.7.0)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.3)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (7.31.0)\n", + "Collecting jupyterlab-widgets>=1.0.0\n", + " Downloading jupyterlab_widgets-1.0.2-py3-none-any.whl (243 kB)\n", + "\u001b[K |████████████████████████████████| 243 kB 2.6 MB/s eta 0:00:01\n", + "\u001b[?25hCollecting widgetsnbextension~=3.5.0\n", + " Downloading widgetsnbextension-3.5.2-py2.py3-none-any.whl (1.6 MB)\n", + "\u001b[K |████████████████████████████████| 1.6 MB 3.5 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)\n", + "Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.1.2)\n", + "Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)\n", + "Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.4)\n", + "Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.1)\n", + "Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)\n", + "Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.0)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.24)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)\n", + "Requirement already satisfied: pygments in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.1)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (0.3)\n", + "Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (22.3.0)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (2.8.2)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (4.9.1)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)\n", + "Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.4.0)\n", + "Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (5.4.0)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.7.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (1.16.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.5.0->ipywidgets) (6.4.1)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.8.0)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.3)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3.0)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.13.0)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.12.1)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (6.4.0)\n", + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.21)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.0.1)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.1.2)\n", + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.7.1)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (4.1.0)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.10)\n", + "Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.0)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.5.0)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.8.4)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.1)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.6)\n", + "Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets\n", + "Successfully installed ipywidgets-7.6.5 jupyterlab-widgets-1.0.2 widgetsnbextension-3.5.2\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "!nvidia-smi\n", + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "NVIDIA's NGC provides PyTorch Docker Container which contains PyTorch and Torch-TensorRT. We can make use of [latest pytorch](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch) container to run this notebook.\n", + "\n", + "Otherwise, you can follow the steps in `notebooks/README` to prepare a Docker container yourself, within which you can run this demo notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 2. ResNet-50 Overview\n", + "\n", + "\n", + "PyTorch has a model repository called the PyTorch Hub, which is a source for high quality implementations of common models. We can get our ResNet-50 model from there pretrained on ImageNet.\n", + "\n", + "### Model Description\n", + "\n", + "This ResNet-50 model is based on the [Deep Residual Learning for Image Recognition](https://arxiv.org/pdf/1512.03385.pdf) paper, which describes ResNet as “a method for detecting objects in images using a single deep neural network\". The input size is fixed to 32x32.\n", + "\n", + "\"alt\"\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 3. Running the model without optimizations\n", + "\n", + "\n", + "PyTorch has a model repository called `timm`, which is a source for high quality implementations of computer vision models. We can get our EfficientNet model from there pretrained on ImageNet." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Downloading: \"https://github.com/pytorch/vision/archive/v0.10.0.zip\" to /root/.cache/torch/hub/v0.10.0.zip\n", + "Downloading: \"https://download.pytorch.org/models/resnet50-0676ba61.pth\" to /root/.cache/torch/hub/checkpoints/resnet50-0676ba61.pth\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a7036a6122874340b14aaef7b8319260", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0.00/97.8M [00:00] 23.55K --.-KB/s in 0.002s \n", + "\n", + "2022-02-08 19:17:19 (14.6 MB/s) - ‘./data/img0.JPG’ saved [24112/24112]\n", + "\n", + "--2022-02-08 19:17:19-- https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\n", + "Resolving www.hakaimagazine.com (www.hakaimagazine.com)... 164.92.73.117\n", + "Connecting to www.hakaimagazine.com (www.hakaimagazine.com)|164.92.73.117|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 452718 (442K) [image/jpeg]\n", + "Saving to: ‘./data/img1.JPG’\n", + "\n", + "./data/img1.JPG 100%[===================>] 442.11K 2.40MB/s in 0.2s \n", + "\n", + "2022-02-08 19:17:19 (2.40 MB/s) - ‘./data/img1.JPG’ saved [452718/452718]\n", + "\n", + "--2022-02-08 19:17:20-- https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\n", + "Resolving www.artis.nl (www.artis.nl)... 94.75.225.20\n", + "Connecting to www.artis.nl (www.artis.nl)|94.75.225.20|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 361413 (353K) [image/jpeg]\n", + "Saving to: ‘./data/img2.JPG’\n", + "\n", + "./data/img2.JPG 100%[===================>] 352.94K 366KB/s in 1.0s \n", + "\n", + "2022-02-08 19:17:24 (366 KB/s) - ‘./data/img2.JPG’ saved [361413/361413]\n", + "\n", + "--2022-02-08 19:17:24-- https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\n", + "Resolving www.familyhandyman.com (www.familyhandyman.com)... 104.18.201.107, 104.18.202.107, 2606:4700::6812:ca6b, ...\n", + "Connecting to www.familyhandyman.com (www.familyhandyman.com)|104.18.201.107|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 94328 (92K) [image/jpeg]\n", + "Saving to: ‘./data/img3.JPG’\n", + "\n", + "./data/img3.JPG 100%[===================>] 92.12K --.-KB/s in 0.005s \n", + "\n", + "2022-02-08 19:17:25 (16.8 MB/s) - ‘./data/img3.JPG’ saved [94328/94328]\n", + "\n", + "--2022-02-08 19:17:25-- https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\n", + "Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.217.41.222\n", + "Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.217.41.222|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 35363 (35K) [application/octet-stream]\n", + "Saving to: ‘./data/imagenet_class_index.json’\n", + "\n", + "./data/imagenet_cla 100%[===================>] 34.53K --.-KB/s in 0.07s \n", + "\n", + "2022-02-08 19:17:26 (481 KB/s) - ‘./data/imagenet_class_index.json’ saved [35363/35363]\n", + "\n" + ] + } + ], + "source": [ + "!mkdir -p ./data\n", + "!wget -O ./data/img0.JPG \"https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\"\n", + "!wget -O ./data/img1.JPG \"https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\"\n", + "!wget -O ./data/img2.JPG \"https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\"\n", + "!wget -O ./data/img3.JPG \"https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\"\n", + "\n", + "!wget -O ./data/imagenet_class_index.json \"https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All pre-trained models expect input images normalized in the same way,\n", + "i.e. mini-batches of 3-channel RGB images of shape `(3 x H x W)`, where `H` and `W` are expected to be at least `224`.\n", + "The images have to be loaded in to a range of `[0, 1]` and then normalized using `mean = [0.485, 0.456, 0.406]`\n", + "and `std = [0.229, 0.224, 0.225]`.\n", + "\n", + "Here's a sample execution." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from PIL import Image\n", + "from torchvision import transforms\n", + "import matplotlib.pyplot as plt\n", + "import json \n", + "\n", + "fig, axes = plt.subplots(nrows=2, ncols=2)\n", + "\n", + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " input_tensor = preprocess(img) \n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img)\n", + " plt.axis('off')\n", + "\n", + "# loading labels \n", + "with open(\"./data/imagenet_class_index.json\") as json_file: \n", + " d = json.load(json_file)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Throughout this tutorial, we will be making use of some utility functions; `rn50_preprocess` for preprocessing input images, `predict` to use the model for prediction and `benchmark` to benchmark the inference. You do not need to understand/go through these utilities to make use of Torch TensorRT, but are welecomed to do so if you choose." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import time\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "def rn50_preprocess():\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " return preprocess\n", + "\n", + "# decode the results into ([predicted class, description], probability)\n", + "def predict(img_path, model):\n", + " img = Image.open(img_path)\n", + " preprocess = rn50_preprocess()\n", + " input_tensor = preprocess(img)\n", + " input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model\n", + " \n", + " # move the input and model to GPU for speed if available\n", + " if torch.cuda.is_available():\n", + " input_batch = input_batch.to('cuda')\n", + " model.to('cuda')\n", + "\n", + " with torch.no_grad():\n", + " output = model(input_batch)\n", + " # Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes\n", + " sm_output = torch.nn.functional.softmax(output[0], dim=0)\n", + " \n", + " ind = torch.argmax(sm_output)\n", + " return d[str(ind.item())], sm_output[ind] #([predicted class, description], probability)\n", + "\n", + "def benchmark(model, input_shape=(1024, 1, 224, 224), dtype='fp32', nwarmup=50, nruns=10000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%10==0:\n", + " print('Iteration %d/%d, ave batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output features size:\", features.size())\n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the model downloaded and the util functions written, let's just quickly see some predictions, and benchmark the model in its current un-optimized state." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "./data/img0.JPG - Predicted: ['n02110185', 'Siberian_husky'], Probablility: 0.49785590171813965\n", + "./data/img1.JPG - Predicted: ['n01820546', 'lorikeet'], Probablility: 0.6445754766464233\n", + "./data/img2.JPG - Predicted: ['n02481823', 'chimpanzee'], Probablility: 0.9899807572364807\n", + "./data/img3.JPG - Predicted: ['n01749939', 'green_mamba'], Probablility: 0.39485082030296326\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " \n", + " pred, prob = predict(img_path, resnet50_model)\n", + " print('{} - Predicted: {}, Probablility: {}'.format(img_path, pred, prob))\n", + "\n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img);\n", + " plt.axis('off');\n", + " plt.title(pred[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 75.34 ms\n", + "Iteration 20/100, ave batch time 75.33 ms\n", + "Iteration 30/100, ave batch time 75.35 ms\n", + "Iteration 40/100, ave batch time 75.37 ms\n", + "Iteration 50/100, ave batch time 75.38 ms\n", + "Iteration 60/100, ave batch time 75.38 ms\n", + "Iteration 70/100, ave batch time 75.39 ms\n", + "Iteration 80/100, ave batch time 75.39 ms\n", + "Iteration 90/100, ave batch time 75.40 ms\n", + "Iteration 100/100, ave batch time 75.41 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average batch time: 75.41 ms\n" + ] + } + ], + "source": [ + "# Model benchmark without Torch-TensorRT\n", + "model = resnet50_model.eval().to(\"cuda\")\n", + "benchmark(model, input_shape=(128, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 4. Accelerating with Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Onwards to the next step, accelerating with Torch TensorRT. In these examples we showcase the results for FP32 (single precision) and FP16 (half precision). We do not demonstrat specific tuning, just showcase the simplicity of usage. If you want to learn more about the possible customizations, visit our [documentation](https://nvidia.github.io/Torch-TensorRT/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP32 (single precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP32 precision.\n", + "trt_model_fp32 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.float32)],\n", + " enabled_precisions = torch.float32, # Run with FP32\n", + " workspace_size = 1 << 22\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 41.02 ms\n", + "Iteration 20/100, ave batch time 41.12 ms\n", + "Iteration 30/100, ave batch time 41.22 ms\n", + "Iteration 40/100, ave batch time 41.14 ms\n", + "Iteration 50/100, ave batch time 41.20 ms\n", + "Iteration 60/100, ave batch time 41.20 ms\n", + "Iteration 70/100, ave batch time 41.19 ms\n", + "Iteration 80/100, ave batch time 41.23 ms\n", + "Iteration 90/100, ave batch time 41.20 ms\n", + "Iteration 100/100, ave batch time 41.21 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average batch time: 41.21 ms\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input\n", + "benchmark(trt_model_fp32, input_shape=(128, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP16 (half precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x.1\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP16 precision.\n", + "trt_model_fp16 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.half)],\n", + " enabled_precisions = {torch.half}, # Run with FP32\n", + " workspace_size = 1 << 22\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 14.48 ms\n", + "Iteration 20/100, ave batch time 14.58 ms\n", + "Iteration 30/100, ave batch time 14.72 ms\n", + "Iteration 40/100, ave batch time 14.73 ms\n", + "Iteration 50/100, ave batch time 14.70 ms\n", + "Iteration 60/100, ave batch time 14.79 ms\n", + "Iteration 70/100, ave batch time 14.73 ms\n", + "Iteration 80/100, ave batch time 14.69 ms\n", + "Iteration 90/100, ave batch time 14.68 ms\n", + "Iteration 100/100, ave batch time 14.69 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average batch time: 14.69 ms\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input\n", + "benchmark(trt_model_fp16, input_shape=(128, 3, 224, 224), dtype='fp16', nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 5. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT for EfficientNet-B0 model and test the performance impact of the optimization. With Torch-TensorRT, we observe a speedup of **1.84x** with FP32, and **5.2x** with FP16 on an NVIDIA 3090 GPU. These acceleration numbers will vary from GPU to GPU(as well as implementation to implementation based on the ops used) and we encorage you to try out latest generation of Data center compute cards for maximum acceleration.\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. If you run into any issues, you can fill them at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.1.1/_sources/_notebooks/dynamic-shapes.ipynb.txt b/docs/v1.1.1/_sources/_notebooks/dynamic-shapes.ipynb.txt new file mode 100644 index 0000000000..a0ceaab576 --- /dev/null +++ b/docs/v1.1.1/_sources/_notebooks/dynamic-shapes.ipynb.txt @@ -0,0 +1,1023 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "332a2ed8", + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2020 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "id": "18ee9d62", + "metadata": {}, + "source": [ + "# Torch-TensorRT - Using Dynamic Shapes" + ] + }, + { + "cell_type": "markdown", + "id": "73703695", + "metadata": {}, + "source": [ + "Torch-TensorRT is a compiler for PyTorch/TorchScript, targeting NVIDIA GPUs via NVIDIA's TensorRT Deep Learning Optimizer and Runtime. Unlike PyTorch's Just-In-Time (JIT) compiler, Torch-TensorRT is an Ahead-of-Time (AOT) compiler, meaning that before you deploy your TorchScript code, you go through an explicit compile step to convert a standard TorchScript program into an module targeting a TensorRT engine. Torch-TensorRT operates as a PyTorch extention and compiles modules that integrate into the JIT runtime seamlessly. After compilation using the optimized graph should feel no different than running a TorchScript module. You also have access to TensorRT's suite of configurations at compile time, so you are able to specify operating precision (FP32/FP16/INT8) and other settings for your module.\n", + "\n", + "We highly encorage users to use our NVIDIA's [PyTorch container](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch) to run this notebook. It comes packaged with a host of NVIDIA libraries and optimizations to widely used third party libraries. This container is tested and updated on a monthly cadence!\n", + "\n", + "This notebook has the following sections:\n", + "1. [TL;DR Explanation](#1)\n", + "1. [Setting up the model](#2)\n", + "1. [Working with Dynamic shapes in Torch TRT](#3)" + ] + }, + { + "cell_type": "markdown", + "id": "1603028d", + "metadata": {}, + "source": [ + "---\n", + "## TL;DR Explanation\n", + "\n", + "Making use of Dynamic Shaped Tensors in Torch TensorRT is quite simple. Let's say you are using the `torch_tensorrt.compile(...)` function to compile a torchscript module.\n", + "\n", + "One of the `args` in this function in this function is `input`: which defines an input to a module in terms of expected shape, data type and tensor format: `torch_tensorrt.Input`. \n", + "\n", + "For the purposes of this walkthrough we just need three `kwargs`: `min_shape`, `opt_shape` and `max_shape`. \n", + "```\n", + "...\n", + "torch_tensorrt.Input(\n", + " min_shape=(1, 224, 224, 3),\n", + " opt_shape=(1, 512, 512, 3),\n", + " max_shape=(1, 1024, 1024, 3),\n", + " dtype=torch.int32\n", + " format=torch.channel_last\n", + " )\n", + "...\n", + "```\n", + "In this example, we are going to use a simple ResNet model to demonstrate the use of the API. We will be using different batch sizes in the example, but you can use the same method to alter any of the dimensions of the tensor." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "db3493d2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mon May 2 20:40:30 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA Graphics... On | 00000000:01:00.0 Off | 0 |\n", + "| 41% 51C P0 62W / 200W | 0MiB / 47681MiB | 0% Default |\n", + "| | | Disabled |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: ipywidgets in /opt/conda/lib/python3.8/site-packages (7.7.0)\n", + "Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.3.0)\n", + "Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.13.0)\n", + "Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)\n", + "Requirement already satisfied: widgetsnbextension~=3.6.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (3.6.0)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (8.2.0)\n", + "Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (1.1.0)\n", + "Requirement already satisfied: psutil in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (5.9.0)\n", + "Requirement already satisfied: tornado>=6.1 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (21.3)\n", + "Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.5)\n", + "Requirement already satisfied: matplotlib-inline>=0.1 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)\n", + "Requirement already satisfied: jupyter-client>=6.1.12 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.2.2)\n", + "Requirement already satisfied: debugpy>=1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.6.0)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.1)\n", + "Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: stack-data in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.29)\n", + "Requirement already satisfied: pygments>=2.4.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.2)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "Requirement already satisfied: pyzmq>=22.3 in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (22.3.0)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (0.4)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (2.8.2)\n", + "Requirement already satisfied: jupyter-core>=4.9.2 in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (4.9.2)\n", + "Requirement already satisfied: jsonschema>=2.6 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)\n", + "Requirement already satisfied: fastjsonschema in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (2.15.3)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (21.4.0)\n", + "Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (5.7.0)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (3.8.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.8.2->jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (1.16.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.6.0->ipywidgets) (6.4.1)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.1.1)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.14.1)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.8.0)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3.0)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (6.5.0)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.3)\n", + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.21)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.1.1)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.7.1)\n", + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.2.2)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.8.4)\n", + "Requirement already satisfied: nbclient>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.6.0)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (5.0.0)\n", + "Requirement already satisfied: tinycss2 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.1.1)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.5.0)\n", + "Requirement already satisfied: beautifulsoup4 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (4.11.1)\n", + "Requirement already satisfied: soupsieve>1.2 in /opt/conda/lib/python3.8/site-packages (from beautifulsoup4->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.3.1)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.1)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->ipykernel>=4.5.1->ipywidgets) (3.0.8)\n", + "Requirement already satisfied: asttokens in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (2.0.5)\n", + "Requirement already satisfied: pure-eval in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.2.2)\n", + "Requirement already satisfied: executing in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "!nvidia-smi\n", + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org" + ] + }, + { + "cell_type": "markdown", + "id": "0ed1b4f7", + "metadata": {}, + "source": [ + "---\n", + "## Setting up the model\n", + "\n", + "In this section, we will:\n", + "* Get sample data.\n", + "* Download model from torch hub.\n", + "* Build simple utility functions" + ] + }, + { + "cell_type": "markdown", + "id": "5934504f", + "metadata": {}, + "source": [ + "### Getting sample data" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e46814cc", + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2022-05-02 20:40:33-- https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\n", + "Resolving d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)... 18.65.227.37, 18.65.227.99, 18.65.227.223, ...\n", + "Connecting to d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)|18.65.227.37|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 24112 (24K) [image/jpeg]\n", + "Saving to: ‘./data/img0.JPG’\n", + "\n", + "./data/img0.JPG 100%[===================>] 23.55K --.-KB/s in 0.005s \n", + "\n", + "2022-05-02 20:40:33 (4.69 MB/s) - ‘./data/img0.JPG’ saved [24112/24112]\n", + "\n", + "--2022-05-02 20:40:34-- https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\n", + "Resolving www.hakaimagazine.com (www.hakaimagazine.com)... 164.92.73.117\n", + "Connecting to www.hakaimagazine.com (www.hakaimagazine.com)|164.92.73.117|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 452718 (442K) [image/jpeg]\n", + "Saving to: ‘./data/img1.JPG’\n", + "\n", + "./data/img1.JPG 100%[===================>] 442.11K --.-KB/s in 0.02s \n", + "\n", + "2022-05-02 20:40:34 (26.2 MB/s) - ‘./data/img1.JPG’ saved [452718/452718]\n", + "\n", + "--2022-05-02 20:40:34-- https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\n", + "Resolving www.artis.nl (www.artis.nl)... 94.75.225.20\n", + "Connecting to www.artis.nl (www.artis.nl)|94.75.225.20|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 361413 (353K) [image/jpeg]\n", + "Saving to: ‘./data/img2.JPG’\n", + "\n", + "./data/img2.JPG 100%[===================>] 352.94K 608KB/s in 0.6s \n", + "\n", + "2022-05-02 20:40:36 (608 KB/s) - ‘./data/img2.JPG’ saved [361413/361413]\n", + "\n", + "--2022-05-02 20:40:37-- https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\n", + "Resolving www.familyhandyman.com (www.familyhandyman.com)... 104.18.201.107, 104.18.202.107, 2606:4700::6812:c96b, ...\n", + "Connecting to www.familyhandyman.com (www.familyhandyman.com)|104.18.201.107|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 90994 (89K) [image/jpeg]\n", + "Saving to: ‘./data/img3.JPG’\n", + "\n", + "./data/img3.JPG 100%[===================>] 88.86K --.-KB/s in 0.006s \n", + "\n", + "2022-05-02 20:40:37 (15.4 MB/s) - ‘./data/img3.JPG’ saved [90994/90994]\n", + "\n", + "--2022-05-02 20:40:37-- https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\n", + "Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.217.33.238\n", + "Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.217.33.238|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 35363 (35K) [application/octet-stream]\n", + "Saving to: ‘./data/imagenet_class_index.json’\n", + "\n", + "./data/imagenet_cla 100%[===================>] 34.53K --.-KB/s in 0.07s \n", + "\n", + "2022-05-02 20:40:38 (489 KB/s) - ‘./data/imagenet_class_index.json’ saved [35363/35363]\n", + "\n" + ] + } + ], + "source": [ + "!mkdir -p ./data\n", + "!wget -O ./data/img0.JPG \"https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\"\n", + "!wget -O ./data/img1.JPG \"https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\"\n", + "!wget -O ./data/img2.JPG \"https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\"\n", + "!wget -O ./data/img3.JPG \"https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\"\n", + "\n", + "!wget -O ./data/imagenet_class_index.json \"https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7392a8ec", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# visualizing the downloaded images\n", + "\n", + "from PIL import Image\n", + "from torchvision import transforms\n", + "import matplotlib.pyplot as plt\n", + "import json \n", + "\n", + "fig, axes = plt.subplots(nrows=2, ncols=2)\n", + "\n", + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " input_tensor = preprocess(img) \n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img)\n", + " plt.axis('off')\n", + "\n", + "# loading labels \n", + "with open(\"./data/imagenet_class_index.json\") as json_file: \n", + " d = json.load(json_file)" + ] + }, + { + "cell_type": "markdown", + "id": "1374edab", + "metadata": {}, + "source": [ + "### Download model from torch hub." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "659fa798", + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using cache found in /root/.cache/torch/hub/pytorch_vision_v0.10.0\n" + ] + }, + { + "data": { + "text/plain": [ + "ResNet(\n", + " (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n", + " (layer1): Sequential(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (layer2): Sequential(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (3): Bottleneck(\n", + " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (layer3): Sequential(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (3): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (4): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (5): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (layer4): Sequential(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n", + " (fc): Linear(in_features=2048, out_features=1000, bias=True)\n", + ")" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import torch\n", + "\n", + "torch.hub._validate_not_a_forked_repo=lambda a,b,c: True\n", + "\n", + "resnet50_model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)\n", + "resnet50_model.eval()" + ] + }, + { + "cell_type": "markdown", + "id": "0a67e8db", + "metadata": {}, + "source": [ + "### Build simple utility functions" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "60286396", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import time\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "def rn50_preprocess():\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " return preprocess\n", + "\n", + "# decode the results into ([predicted class, description], probability)\n", + "def predict(img_path, model):\n", + " img = Image.open(img_path)\n", + " preprocess = rn50_preprocess()\n", + " input_tensor = preprocess(img)\n", + " input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model\n", + " \n", + " # move the input and model to GPU for speed if available\n", + " if torch.cuda.is_available():\n", + " input_batch = input_batch.to('cuda')\n", + " model.to('cuda')\n", + "\n", + " with torch.no_grad():\n", + " output = model(input_batch)\n", + " # Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes\n", + " sm_output = torch.nn.functional.softmax(output[0], dim=0)\n", + " \n", + " ind = torch.argmax(sm_output)\n", + " return d[str(ind.item())], sm_output[ind] #([predicted class, description], probability)\n", + "\n", + "# benchmarking models\n", + "def benchmark(model, input_shape=(1024, 1, 224, 224), dtype='fp32', nwarmup=50, nruns=10000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%10==0:\n", + " print('Iteration %d/%d, ave batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + " print('Images processed per second=', int(1000*input_shape[0]/(np.mean(timings)*1000)))\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output features size:\", features.size())\n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))" + ] + }, + { + "cell_type": "markdown", + "id": "21402d53", + "metadata": {}, + "source": [ + "Let's test our util functions on the model we have set up, starting with simple predictions" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "bb3e4a0d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "./data/img0.JPG - Predicted: ['n02110185', 'Siberian_husky'], Probablility: 0.49788108468055725\n", + "./data/img1.JPG - Predicted: ['n01820546', 'lorikeet'], Probablility: 0.6442285180091858\n", + "./data/img2.JPG - Predicted: ['n02481823', 'chimpanzee'], Probablility: 0.9899841547012329\n", + "./data/img3.JPG - Predicted: ['n01749939', 'green_mamba'], Probablility: 0.45675724744796753\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " \n", + " pred, prob = predict(img_path, resnet50_model)\n", + " print('{} - Predicted: {}, Probablility: {}'.format(img_path, pred, prob))\n", + "\n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img);\n", + " plt.axis('off');\n", + " plt.title(pred[1])" + ] + }, + { + "cell_type": "markdown", + "id": "2fc7f347", + "metadata": {}, + "source": [ + "Onwards, to benchmarking." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "f182b433", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 10.01 ms\n", + "Images processed per second= 1598\n", + "Iteration 20/100, ave batch time 10.01 ms\n", + "Images processed per second= 1598\n", + "Iteration 30/100, ave batch time 10.21 ms\n", + "Images processed per second= 1566\n", + "Iteration 40/100, ave batch time 10.33 ms\n", + "Images processed per second= 1549\n", + "Iteration 50/100, ave batch time 10.31 ms\n", + "Images processed per second= 1552\n", + "Iteration 60/100, ave batch time 10.25 ms\n", + "Images processed per second= 1560\n", + "Iteration 70/100, ave batch time 10.20 ms\n", + "Images processed per second= 1568\n", + "Iteration 80/100, ave batch time 10.18 ms\n", + "Images processed per second= 1572\n", + "Iteration 90/100, ave batch time 10.16 ms\n", + "Images processed per second= 1574\n", + "Iteration 100/100, ave batch time 10.15 ms\n", + "Images processed per second= 1575\n", + "Input shape: torch.Size([16, 3, 224, 224])\n", + "Output features size: torch.Size([16, 1000])\n", + "Average batch time: 10.15 ms\n" + ] + } + ], + "source": [ + "# Model benchmark without Torch-TensorRT\n", + "model = resnet50_model.eval().to(\"cuda\")\n", + "benchmark(model, input_shape=(16, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "id": "21e56cdf", + "metadata": {}, + "source": [ + "---\n", + "## Benchmarking with Torch-TRT (without dynamic shapes)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8c9ed780", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "trt_model_without_ds = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((32, 3, 224, 224), dtype=torch.float32)],\n", + " enabled_precisions = torch.float32, # Run with FP32\n", + " workspace_size = 1 << 33\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "58a4ba94", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 6.10 ms\n", + "Images processed per second= 5242\n", + "Iteration 20/100, ave batch time 6.12 ms\n", + "Images processed per second= 5231\n", + "Iteration 30/100, ave batch time 6.14 ms\n", + "Images processed per second= 5215\n", + "Iteration 40/100, ave batch time 6.14 ms\n", + "Images processed per second= 5207\n", + "Iteration 50/100, ave batch time 6.15 ms\n", + "Images processed per second= 5202\n", + "Iteration 60/100, ave batch time 6.28 ms\n", + "Images processed per second= 5094\n", + "Iteration 70/100, ave batch time 6.26 ms\n", + "Images processed per second= 5110\n", + "Iteration 80/100, ave batch time 6.25 ms\n", + "Images processed per second= 5118\n", + "Iteration 90/100, ave batch time 6.25 ms\n", + "Images processed per second= 5115\n", + "Iteration 100/100, ave batch time 6.40 ms\n", + "Images processed per second= 5002\n", + "Input shape: torch.Size([32, 3, 224, 224])\n", + "Output features size: torch.Size([32, 1000])\n", + "Average batch time: 6.40 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_model_without_ds, input_shape=(32, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "id": "cd233b85", + "metadata": {}, + "source": [ + "With the baseline ready, we can proceed to the section working discussing dynamic shapes!" + ] + }, + { + "cell_type": "markdown", + "id": "bd5746da", + "metadata": {}, + "source": [ + "---\n", + "## Working with Dynamic shapes in Torch TRT\n", + "\n", + "Enabling \"Dynamic Shaped\" tensors to be used is essentially enabling the ability to defer defining the shape of tensors until runetime. Torch TensorRT simply leverages TensorRT's Dynamic shape support. You can read more about TensorRT's implementation in the [TensorRT Documentation](https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#work_dynamic_shapes).\n", + "\n", + "#### How can you use this feature?\n", + "\n", + "To make use of dynamic shapes, you need to provide three shapes:\n", + "* `min_shape`: The minimum size of the tensor considered for optimizations.\n", + "* `opt_shape`: The optimizations will be done with an effort to maximize performance for this shape.\n", + "* `min_shape`: The maximum size of the tensor considered for optimizations.\n", + "\n", + "Generally, users can expect best performance within the specified ranges. Performance for other shapes may be be lower for other shapes (depending on the model ops and GPU used)\n", + "\n", + "In the following example, we will showcase varing batch size, which is the zeroth dimension of our input tensors. As Convolution operations require that the channel dimension be a build-time constant, we won't be changing sizes of other channels in this example, but for models which contain ops conducive to changes in other channels, this functionality can be freely used." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "9a04007d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n" + ] + } + ], + "source": [ + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP32 precision.\n", + "trt_model_with_ds = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input(\n", + " min_shape=(16, 3, 224, 224),\n", + " opt_shape=(32, 3, 224, 224),\n", + " max_shape=(64, 3, 224, 224),\n", + " dtype=torch.float32)],\n", + " enabled_precisions = torch.float32, # Run with FP32\n", + " workspace_size = 1 << 33\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "f0babc85", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 3.88 ms\n", + "Images processed per second= 4122\n", + "Iteration 20/100, ave batch time 3.89 ms\n", + "Images processed per second= 4116\n", + "Iteration 30/100, ave batch time 3.88 ms\n", + "Images processed per second= 4123\n", + "Iteration 40/100, ave batch time 3.86 ms\n", + "Images processed per second= 4142\n", + "Iteration 50/100, ave batch time 3.85 ms\n", + "Images processed per second= 4156\n", + "Iteration 60/100, ave batch time 3.84 ms\n", + "Images processed per second= 4166\n", + "Iteration 70/100, ave batch time 3.84 ms\n", + "Images processed per second= 4170\n", + "Iteration 80/100, ave batch time 3.83 ms\n", + "Images processed per second= 4172\n", + "Iteration 90/100, ave batch time 3.83 ms\n", + "Images processed per second= 4176\n", + "Iteration 100/100, ave batch time 3.83 ms\n", + "Images processed per second= 4178\n", + "Input shape: torch.Size([16, 3, 224, 224])\n", + "Output features size: torch.Size([16, 1000])\n", + "Average batch time: 3.83 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_model_with_ds, input_shape=(16, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "e86a3541", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 6.71 ms\n", + "Images processed per second= 4767\n", + "Iteration 20/100, ave batch time 6.48 ms\n", + "Images processed per second= 4935\n", + "Iteration 30/100, ave batch time 6.39 ms\n", + "Images processed per second= 5005\n", + "Iteration 40/100, ave batch time 6.38 ms\n", + "Images processed per second= 5014\n", + "Iteration 50/100, ave batch time 6.38 ms\n", + "Images processed per second= 5016\n", + "Iteration 60/100, ave batch time 6.37 ms\n", + "Images processed per second= 5020\n", + "Iteration 70/100, ave batch time 6.37 ms\n", + "Images processed per second= 5024\n", + "Iteration 80/100, ave batch time 6.37 ms\n", + "Images processed per second= 5027\n", + "Iteration 90/100, ave batch time 6.37 ms\n", + "Images processed per second= 5026\n", + "Iteration 100/100, ave batch time 6.38 ms\n", + "Images processed per second= 5018\n", + "Input shape: torch.Size([32, 3, 224, 224])\n", + "Output features size: torch.Size([32, 1000])\n", + "Average batch time: 6.38 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_model_with_ds, input_shape=(32, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "35800f63", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 12.31 ms\n", + "Images processed per second= 5197\n", + "Iteration 20/100, ave batch time 12.42 ms\n", + "Images processed per second= 5153\n", + "Iteration 30/100, ave batch time 12.85 ms\n", + "Images processed per second= 4980\n", + "Iteration 40/100, ave batch time 12.71 ms\n", + "Images processed per second= 5033\n", + "Iteration 50/100, ave batch time 12.67 ms\n", + "Images processed per second= 5052\n", + "Iteration 60/100, ave batch time 12.63 ms\n", + "Images processed per second= 5067\n", + "Iteration 70/100, ave batch time 12.58 ms\n", + "Images processed per second= 5088\n", + "Iteration 80/100, ave batch time 12.56 ms\n", + "Images processed per second= 5096\n", + "Iteration 90/100, ave batch time 12.55 ms\n", + "Images processed per second= 5100\n", + "Iteration 100/100, ave batch time 12.57 ms\n", + "Images processed per second= 5091\n", + "Input shape: torch.Size([64, 3, 224, 224])\n", + "Output features size: torch.Size([64, 1000])\n", + "Average batch time: 12.57 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_model_with_ds, input_shape=(64, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "id": "f87a75bd", + "metadata": {}, + "source": [ + "## What's Next?\n", + "\n", + "Check out the [TensorRT Getting started page](https://developer.nvidia.com/tensorrt-getting-started) for more tutorials, or visit the Torch-TensorRT [documentation](https://nvidia.github.io/Torch-TensorRT/) for more information!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/v1.1.1/_sources/_notebooks/lenet-getting-started.ipynb.txt b/docs/v1.1.1/_sources/_notebooks/lenet-getting-started.ipynb.txt new file mode 100644 index 0000000000..2db954946d --- /dev/null +++ b/docs/v1.1.1/_sources/_notebooks/lenet-getting-started.ipynb.txt @@ -0,0 +1,718 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Torch-TensorRT Getting Started - LeNet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch's JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.\n", + "\n", + "When deploying on NVIDIA GPUs TensorRT, NVIDIA's Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA's Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.\n", + "\n", + "Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a simple LeNet network. \n", + "\n", + "## Content\n", + "1. [Requirements](#1)\n", + "1. [Creating TorchScript modules](#2)\n", + "1. [Compiling with Torch-TensorRT](#3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "Follow the steps in `notebooks/README` to prepare a Docker container, within which you can run this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting ipywidgets\n", + " Downloading ipywidgets-7.6.5-py2.py3-none-any.whl (121 kB)\n", + "\u001b[K |████████████████████████████████| 121 kB 12.7 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)\n", + "Collecting jupyterlab-widgets>=1.0.0\n", + " Downloading jupyterlab_widgets-1.0.2-py3-none-any.whl (243 kB)\n", + "\u001b[K |████████████████████████████████| 243 kB 115.0 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.3)\n", + "Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.7.0)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (7.31.0)\n", + "Collecting widgetsnbextension~=3.5.0\n", + " Downloading widgetsnbextension-3.5.2-py2.py3-none-any.whl (1.6 MB)\n", + "\u001b[K |████████████████████████████████| 1.6 MB 122.5 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)\n", + "Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.1)\n", + "Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.1.2)\n", + "Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.4)\n", + "Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)\n", + "Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.24)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.0)\n", + "Requirement already satisfied: pygments in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.1)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (22.3.0)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (0.3)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (4.9.1)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (2.8.2)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)\n", + "Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.4.0)\n", + "Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (5.4.0)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.7.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (1.16.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.5.0->ipywidgets) (6.4.1)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.12.1)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.13.0)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.3)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3.0)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (6.4.0)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.8.0)\n", + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.21)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.0.1)\n", + "Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.0)\n", + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.7.1)\n", + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.1.2)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.10)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (4.1.0)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.5.0)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.8.4)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.1)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.6)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets\n", + "Successfully installed ipywidgets-7.6.5 jupyterlab-widgets-1.0.2 widgetsnbextension-3.5.2\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Thu Feb 10 22:01:27 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 510.39.01 Driver Version: 510.39.01 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA GeForce ... On | 00000000:09:00.0 Off | N/A |\n", + "| 0% 42C P8 20W / 320W | 0MiB / 10240MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org\n", + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 2. Creating TorchScript modules\n", + "\n", + "Here we create two submodules for a feature extractor and a classifier and stitch them together in a single LeNet module. In this case this is overkill but modules give us granular control over our program including where we decide to optimize and where we don't. It is also the unit that the TorchScript compiler operates on. So you can decide to only convert/optimize the feature extractor and leave the classifier in standard PyTorch or you can convert the whole thing. When compiling your module to TorchScript, there are two paths: Tracing and Scripting. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import torch \n", + "from torch import nn\n", + "import torch.nn.functional as F\n", + "\n", + "class LeNetFeatExtractor(nn.Module):\n", + " def __init__(self):\n", + " super(LeNetFeatExtractor, self).__init__()\n", + " self.conv1 = nn.Conv2d(1, 128, 3)\n", + " self.conv2 = nn.Conv2d(128, 16, 3)\n", + "\n", + " def forward(self, x):\n", + " x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))\n", + " x = F.max_pool2d(F.relu(self.conv2(x)), 2)\n", + " return x\n", + "\n", + "class LeNetClassifier(nn.Module):\n", + " def __init__(self):\n", + " super(LeNetClassifier, self).__init__()\n", + " self.fc1 = nn.Linear(16 * 6 * 6, 120)\n", + " self.fc2 = nn.Linear(120, 84)\n", + " self.fc3 = nn.Linear(84, 10)\n", + "\n", + " def forward(self, x):\n", + " x = torch.flatten(x,1)\n", + " x = F.relu(self.fc1(x))\n", + " x = F.relu(self.fc2(x))\n", + " x = self.fc3(x)\n", + " return x\n", + "\n", + "class LeNet(nn.Module):\n", + " def __init__(self):\n", + " super(LeNet, self).__init__()\n", + " self.feat = LeNetFeatExtractor()\n", + " self.classifer = LeNetClassifier()\n", + "\n", + " def forward(self, x):\n", + " x = self.feat(x)\n", + " x = self.classifer(x)\n", + " return x\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let us define a helper function to benchmark a model." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import numpy as np\n", + "\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "def benchmark(model, input_shape=(1024, 1, 32, 32), dtype='fp32', nwarmup=50, nruns=1000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%100==0:\n", + " print('Iteration %d/%d, ave batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output features size:\", features.size())\n", + " \n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### PyTorch model" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LeNet(\n", + " (feat): LeNetFeatExtractor(\n", + " (conv1): Conv2d(1, 128, kernel_size=(3, 3), stride=(1, 1))\n", + " (conv2): Conv2d(128, 16, kernel_size=(3, 3), stride=(1, 1))\n", + " )\n", + " (classifer): LeNetClassifier(\n", + " (fc1): Linear(in_features=576, out_features=120, bias=True)\n", + " (fc2): Linear(in_features=120, out_features=84, bias=True)\n", + " (fc3): Linear(in_features=84, out_features=10, bias=True)\n", + " )\n", + ")" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = LeNet()\n", + "model.to(\"cuda\").eval()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 5.56 ms\n", + "Iteration 200/1000, ave batch time 5.56 ms\n", + "Iteration 300/1000, ave batch time 5.56 ms\n", + "Iteration 400/1000, ave batch time 5.56 ms\n", + "Iteration 500/1000, ave batch time 5.56 ms\n", + "Iteration 600/1000, ave batch time 5.56 ms\n", + "Iteration 700/1000, ave batch time 5.56 ms\n", + "Iteration 800/1000, ave batch time 5.56 ms\n", + "Iteration 900/1000, ave batch time 5.56 ms\n", + "Iteration 1000/1000, ave batch time 5.56 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 5.56 ms\n" + ] + } + ], + "source": [ + "benchmark(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When compiling your module to TorchScript, there are two paths: Tracing and Scripting. \n", + " \n", + "### Tracing\n", + "\n", + "Tracing follows the path of execution when the module is called and records what happens. This recording is what the TorchScript IR will describe. To trace an instance of our LeNet module, we can call torch.jit.trace with an example input. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LeNet(\n", + " original_name=LeNet\n", + " (feat): LeNetFeatExtractor(\n", + " original_name=LeNetFeatExtractor\n", + " (conv1): Conv2d(original_name=Conv2d)\n", + " (conv2): Conv2d(original_name=Conv2d)\n", + " )\n", + " (classifer): LeNetClassifier(\n", + " original_name=LeNetClassifier\n", + " (fc1): Linear(original_name=Linear)\n", + " (fc2): Linear(original_name=Linear)\n", + " (fc3): Linear(original_name=Linear)\n", + " )\n", + ")" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "traced_model = torch.jit.trace(model, torch.empty([1,1,32,32]).to(\"cuda\"))\n", + "traced_model" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 5.56 ms\n", + "Iteration 200/1000, ave batch time 5.56 ms\n", + "Iteration 300/1000, ave batch time 5.56 ms\n", + "Iteration 400/1000, ave batch time 5.56 ms\n", + "Iteration 500/1000, ave batch time 5.56 ms\n", + "Iteration 600/1000, ave batch time 5.56 ms\n", + "Iteration 700/1000, ave batch time 5.56 ms\n", + "Iteration 800/1000, ave batch time 5.56 ms\n", + "Iteration 900/1000, ave batch time 5.56 ms\n", + "Iteration 1000/1000, ave batch time 5.56 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 5.56 ms\n" + ] + } + ], + "source": [ + "benchmark(traced_model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Scripting\n", + "\n", + "Scripting actually inspects your code with a compiler and generates an equivalent TorchScript program. The difference is that since tracing simply follows the execution of your module, it cannot pick up control flow for instance, it will only follow the code path that a particular input triggers. By working from the Python code, the compiler can include these components. We can run the script compiler on our LeNet module by calling torch.jit.script.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "model = LeNet().to(\"cuda\").eval()\n", + "script_model = torch.jit.script(model)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "RecursiveScriptModule(\n", + " original_name=LeNet\n", + " (feat): RecursiveScriptModule(\n", + " original_name=LeNetFeatExtractor\n", + " (conv1): RecursiveScriptModule(original_name=Conv2d)\n", + " (conv2): RecursiveScriptModule(original_name=Conv2d)\n", + " )\n", + " (classifer): RecursiveScriptModule(\n", + " original_name=LeNetClassifier\n", + " (fc1): RecursiveScriptModule(original_name=Linear)\n", + " (fc2): RecursiveScriptModule(original_name=Linear)\n", + " (fc3): RecursiveScriptModule(original_name=Linear)\n", + " )\n", + ")" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "script_model" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 5.56 ms\n", + "Iteration 200/1000, ave batch time 5.56 ms\n", + "Iteration 300/1000, ave batch time 5.56 ms\n", + "Iteration 400/1000, ave batch time 5.56 ms\n", + "Iteration 500/1000, ave batch time 5.56 ms\n", + "Iteration 600/1000, ave batch time 5.56 ms\n", + "Iteration 700/1000, ave batch time 5.56 ms\n", + "Iteration 800/1000, ave batch time 5.56 ms\n", + "Iteration 900/1000, ave batch time 5.56 ms\n", + "Iteration 1000/1000, ave batch time 5.56 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 5.56 ms\n" + ] + } + ], + "source": [ + "benchmark(script_model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 3. Compiling with Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### TorchScript traced model\n", + "\n", + "First, we compile the TorchScript traced model with Torch-TensorRT. Notice the performance impact." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x.1\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Max value of this profile is not valid\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "# We use a batch-size of 1024, and half precision\n", + "trt_ts_module = torch_tensorrt.compile(traced_model, inputs=[torch_tensorrt.Input(\n", + " min_shape=[1024, 1, 32, 32],\n", + " opt_shape=[1024, 1, 33, 33],\n", + " max_shape=[1024, 1, 34, 34],\n", + " dtype=torch.half\n", + " )], \n", + " enabled_precisions = {torch.half})\n", + "\n", + "input_data = torch.randn((1024, 1, 32, 32))\n", + "input_data = input_data.half().to(\"cuda\")\n", + "\n", + "input_data = input_data.half()\n", + "result = trt_ts_module(input_data)\n", + "torch.jit.save(trt_ts_module, \"trt_ts_module.ts\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 1.41 ms\n", + "Iteration 200/1000, ave batch time 1.40 ms\n", + "Iteration 300/1000, ave batch time 1.40 ms\n", + "Iteration 400/1000, ave batch time 1.39 ms\n", + "Iteration 500/1000, ave batch time 1.40 ms\n", + "Iteration 600/1000, ave batch time 1.40 ms\n", + "Iteration 700/1000, ave batch time 1.40 ms\n", + "Iteration 800/1000, ave batch time 1.40 ms\n", + "Iteration 900/1000, ave batch time 1.40 ms\n", + "Iteration 1000/1000, ave batch time 1.40 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 1.40 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_ts_module, input_shape=(1024, 1, 32, 32), dtype=\"fp16\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### TorchScript script model\n", + "\n", + "Next, we compile the TorchScript script model with Torch-TensorRT. Notice the performance impact." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x.1\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Max value of this profile is not valid\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "trt_script_module = torch_tensorrt.compile(script_model, inputs = [torch_tensorrt.Input(\n", + " min_shape=[1024, 1, 32, 32],\n", + " opt_shape=[1024, 1, 33, 33],\n", + " max_shape=[1024, 1, 34, 34],\n", + " dtype=torch.half\n", + " )],\n", + " enabled_precisions={torch.half})\n", + "\n", + "input_data = torch.randn((1024, 1, 32, 32))\n", + "input_data = input_data.half().to(\"cuda\")\n", + "\n", + "input_data = input_data.half()\n", + "result = trt_script_module(input_data)\n", + "torch.jit.save(trt_script_module, \"trt_script_module.ts\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 1.43 ms\n", + "Iteration 200/1000, ave batch time 1.41 ms\n", + "Iteration 300/1000, ave batch time 1.40 ms\n", + "Iteration 400/1000, ave batch time 1.42 ms\n", + "Iteration 500/1000, ave batch time 1.42 ms\n", + "Iteration 600/1000, ave batch time 1.41 ms\n", + "Iteration 700/1000, ave batch time 1.41 ms\n", + "Iteration 800/1000, ave batch time 1.40 ms\n", + "Iteration 900/1000, ave batch time 1.40 ms\n", + "Iteration 1000/1000, ave batch time 1.40 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 1.40 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_script_module, input_shape=(1024, 1, 32, 32), dtype=\"fp16\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT and test the performance impact of the optimization.\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. Fill out issues at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.1.1/_sources/_notebooks/ssd-object-detection-demo.ipynb.txt b/docs/v1.1.1/_sources/_notebooks/ssd-object-detection-demo.ipynb.txt new file mode 100644 index 0000000000..f2a0bd8063 --- /dev/null +++ b/docs/v1.1.1/_sources/_notebooks/ssd-object-detection-demo.ipynb.txt @@ -0,0 +1,943 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2020 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Object Detection with Torch-TensorRT (SSD)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Overview\n", + "\n", + "In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch's JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.\n", + "\n", + "When deploying on NVIDIA GPUs TensorRT, NVIDIA's Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA's Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.\n", + "\n", + "Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained SSD network, and running it to test the speedup obtained.\n", + "\n", + "## Contents\n", + "1. [Requirements](#1)\n", + "2. [SSD Overview](#2)\n", + "3. [Creating TorchScript modules](#3)\n", + "4. [Compiling with Torch-TensorRT](#4)\n", + "5. [Running Inference](#5)\n", + "6. [Measuring Speedup](#6)\n", + "7. [Conclusion](#7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 1. Requirements\n", + "\n", + "Follow the steps in `notebooks/README` to prepare a Docker container, within which you can run this demo notebook.\n", + "\n", + "In addition to that, run the following cell to obtain additional libraries specific to this demo." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting scikit-image==0.19.1\n", + " Downloading scikit_image-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.8 MB)\n", + "\u001b[K |████████████████████████████████| 13.8 MB 8.8 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: networkx>=2.2 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (2.6.3)\n", + "Collecting tifffile>=2019.7.26\n", + " Downloading tifffile-2022.3.16-py3-none-any.whl (179 kB)\n", + "\u001b[K |████████████████████████████████| 179 kB 110.1 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (21.3)\n", + "Requirement already satisfied: scipy>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (1.6.3)\n", + "Requirement already satisfied: numpy>=1.17.0 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (1.22.2)\n", + "Collecting imageio>=2.4.1\n", + " Downloading imageio-2.16.1-py3-none-any.whl (3.3 MB)\n", + "\u001b[K |████████████████████████████████| 3.3 MB 42.3 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: pillow!=7.1.0,!=7.1.1,!=8.3.0,>=6.1.0 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (9.0.0)\n", + "Collecting PyWavelets>=1.1.1\n", + " Downloading PyWavelets-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.9 MB)\n", + "\u001b[K |████████████████████████████████| 6.9 MB 61.3 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging>=20.0->scikit-image==0.19.1) (3.0.7)\n", + "Installing collected packages: tifffile, PyWavelets, imageio, scikit-image\n", + "Successfully installed PyWavelets-1.3.0 imageio-2.16.1 scikit-image-0.19.1 tifffile-2022.3.16\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting ipywidgets\n", + " Downloading ipywidgets-7.7.0-py2.py3-none-any.whl (123 kB)\n", + "\u001b[K |████████████████████████████████| 123 kB 12.1 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.9.0)\n", + "Collecting jupyterlab-widgets>=1.0.0\n", + " Downloading jupyterlab_widgets-1.1.0-py3-none-any.whl (245 kB)\n", + "\u001b[K |████████████████████████████████| 245 kB 60.6 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.3)\n", + "Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (8.0.1)\n", + "Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)\n", + "Collecting widgetsnbextension~=3.6.0\n", + " Downloading widgetsnbextension-3.6.0-py2.py3-none-any.whl (1.6 MB)\n", + "\u001b[K |████████████████████████████████| 1.6 MB 35.2 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.4)\n", + "Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.1.2)\n", + "Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)\n", + "Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)\n", + "Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.1)\n", + "Requirement already satisfied: stack-data in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.1.4)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.26)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)\n", + "Requirement already satisfied: pygments in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.2)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.1)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: black in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (22.1.0)\n", + "Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (0.3)\n", + "Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (22.3.0)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (4.9.1)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (2.8.2)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)\n", + "Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.4.0)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (5.4.0)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.7.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (1.16.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.6.0->ipywidgets) (6.4.1)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.1)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.8.0)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.1)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.0.3)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (6.4.2)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3.0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.21)\n", + "Requirement already satisfied: pathspec>=0.9.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (0.9.0)\n", + "Requirement already satisfied: tomli>=1.1.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (2.0.1)\n", + "Requirement already satisfied: mypy-extensions>=0.4.3 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (0.4.3)\n", + "Requirement already satisfied: click>=8.0.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (8.0.3)\n", + "Requirement already satisfied: platformdirs>=2 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (2.4.1)\n", + "Requirement already satisfied: typing-extensions>=3.10.0.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (4.0.1)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.0.1)\n", + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.7.1)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.8.4)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.11)\n", + "Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.0)\n", + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.1.2)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (4.1.0)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.5.0)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.1)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.0.7)\n", + "Requirement already satisfied: executing in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.8.2)\n", + "Requirement already satisfied: pure-eval in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.2.2)\n", + "Requirement already satisfied: asttokens in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (2.0.5)\n", + "Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets\n", + "Successfully installed ipywidgets-7.7.0 jupyterlab-widgets-1.1.0 widgetsnbextension-3.6.0\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install scikit-image==0.19.1\n", + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 2. SSD\n", + "\n", + "### Single Shot MultiBox Detector model for object detection\n", + "\n", + "_ | _\n", + "- | -\n", + "![alt](https://pytorch.org/assets/images/ssd_diagram.png) | ![alt](https://pytorch.org/assets/images/ssd.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "PyTorch has a model repository called the PyTorch Hub, which is a source for high quality implementations of common models. We can get our SSD model pretrained on [COCO](https://cocodataset.org/#home) from there.\n", + "\n", + "### Model Description\n", + "\n", + "This SSD300 model is based on the\n", + "[SSD: Single Shot MultiBox Detector](https://arxiv.org/abs/1512.02325) paper, which\n", + "describes SSD as “a method for detecting objects in images using a single deep neural network\".\n", + "The input size is fixed to 300x300.\n", + "\n", + "The main difference between this model and the one described in the paper is in the backbone.\n", + "Specifically, the VGG model is obsolete and is replaced by the ResNet-50 model.\n", + "\n", + "From the\n", + "[Speed/accuracy trade-offs for modern convolutional object detectors](https://arxiv.org/abs/1611.10012)\n", + "paper, the following enhancements were made to the backbone:\n", + "* The conv5_x, avgpool, fc and softmax layers were removed from the original classification model.\n", + "* All strides in conv4_x are set to 1x1.\n", + "\n", + "The backbone is followed by 5 additional convolutional layers.\n", + "In addition to the convolutional layers, we attached 6 detection heads:\n", + "* The first detection head is attached to the last conv4_x layer.\n", + "* The other five detection heads are attached to the corresponding 5 additional layers.\n", + "\n", + "Detector heads are similar to the ones referenced in the paper, however,\n", + "they are enhanced by additional BatchNorm layers after each convolution.\n", + "\n", + "More information about this SSD model is available at Nvidia's \"DeepLearningExamples\" Github [here](https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/Detection/SSD)." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "torch.hub._validate_not_a_forked_repo=lambda a,b,c: True" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Downloading: \"https://github.com/NVIDIA/DeepLearningExamples/archive/torchhub.zip\" to /root/.cache/torch/hub/torchhub.zip\n", + "/root/.cache/torch/hub/NVIDIA_DeepLearningExamples_torchhub/PyTorch/Classification/ConvNets/image_classification/models/efficientnet.py:17: UserWarning: pytorch_quantization module not found, quantization will not be available\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/plain": [ + "['nvidia_convnets_processing_utils',\n", + " 'nvidia_efficientnet',\n", + " 'nvidia_efficientnet_b0',\n", + " 'nvidia_efficientnet_b4',\n", + " 'nvidia_efficientnet_widese_b0',\n", + " 'nvidia_efficientnet_widese_b4',\n", + " 'nvidia_resneXt',\n", + " 'nvidia_resnet50',\n", + " 'nvidia_resnext101_32x4d',\n", + " 'nvidia_se_resnext101_32x4d',\n", + " 'nvidia_ssd',\n", + " 'nvidia_ssd_processing_utils',\n", + " 'nvidia_tacotron2',\n", + " 'nvidia_tts_utils',\n", + " 'nvidia_waveglow']" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# List of available models in PyTorch Hub from Nvidia/DeepLearningExamples\n", + "torch.hub.list('NVIDIA/DeepLearningExamples:torchhub')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using cache found in /root/.cache/torch/hub/NVIDIA_DeepLearningExamples_torchhub\n", + "Downloading: \"https://download.pytorch.org/models/resnet50-0676ba61.pth\" to /root/.cache/torch/hub/checkpoints/resnet50-0676ba61.pth\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1c7cf3e1635d4a2b9c8731b7fc9ce724", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0.00/97.8M [00:0040%) in a more comprehensive format.\n", + "results_per_input = utils.decode_results(detections_batch)\n", + "best_results_per_input = [utils.pick_best(results, 0.40) for results in results_per_input]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualize results" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "import matplotlib.patches as patches\n", + "\n", + "# The utility plots the images and predicted bounding boxes (with confidence scores).\n", + "def plot_results(best_results):\n", + " for image_idx in range(len(best_results)):\n", + " fig, ax = plt.subplots(1)\n", + " # Show original, denormalized image...\n", + " image = inputs[image_idx] / 2 + 0.5\n", + " ax.imshow(image)\n", + " # ...with detections\n", + " bboxes, classes, confidences = best_results[image_idx]\n", + " for idx in range(len(bboxes)):\n", + " left, bot, right, top = bboxes[idx]\n", + " x, y, w, h = [val * 300 for val in [left, bot, right - left, top - bot]]\n", + " rect = patches.Rectangle((x, y), w, h, linewidth=1, edgecolor='r', facecolor='none')\n", + " ax.add_patch(rect)\n", + " ax.text(x, y, \"{} {:.0f}%\".format(classes_to_labels[classes[idx] - 1], confidences[idx]*100), bbox=dict(facecolor='white', alpha=0.5))\n", + " plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Visualize results without Torch-TensorRT\n", + "plot_results(best_results_per_input)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Benchmark utility" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import numpy as np\n", + "\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "# Helper function to benchmark the model\n", + "def benchmark(model, input_shape=(1024, 1, 32, 32), dtype='fp32', nwarmup=50, nruns=1000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " pred_loc, pred_label = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%10==0:\n", + " print('Iteration %d/%d, avg batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output location prediction size:\", pred_loc.size())\n", + " print(\"Output label prediction size:\", pred_label.size())\n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We check how well the model performs **before** we use Torch-TensorRT" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 165.38 ms\n", + "Iteration 20/100, avg batch time 165.99 ms\n", + "Iteration 30/100, avg batch time 166.04 ms\n", + "Iteration 40/100, avg batch time 166.32 ms\n", + "Iteration 50/100, avg batch time 166.49 ms\n", + "Iteration 60/100, avg batch time 166.74 ms\n", + "Iteration 70/100, avg batch time 166.88 ms\n", + "Iteration 80/100, avg batch time 167.05 ms\n", + "Iteration 90/100, avg batch time 167.18 ms\n", + "Iteration 100/100, avg batch time 167.31 ms\n", + "Input shape: torch.Size([128, 3, 300, 300])\n", + "Output location prediction size: torch.Size([128, 4, 8732])\n", + "Output label prediction size: torch.Size([128, 81, 8732])\n", + "Average batch time: 167.31 ms\n" + ] + } + ], + "source": [ + "# Model benchmark without Torch-TensorRT\n", + "model = ssd300.eval().to(\"cuda\")\n", + "benchmark(model, input_shape=(128, 3, 300, 300), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 3. Creating TorchScript modules " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To compile with Torch-TensorRT, the model must first be in **TorchScript**. TorchScript is a programming language included in PyTorch which removes the Python dependency normal PyTorch models have. This conversion is done via a JIT compiler which given a PyTorch Module will generate an equivalent TorchScript Module. There are two paths that can be used to generate TorchScript: **Tracing** and **Scripting**.
\n", + "- Tracing follows execution of PyTorch generating ops in TorchScript corresponding to what it sees.
\n", + "- Scripting does an analysis of the Python code and generates TorchScript, this allows the resulting graph to include control flow which tracing cannot do. \n", + "\n", + "Tracing however due to its simplicity is more likely to compile successfully with Torch-TensorRT (though both systems are supported)." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "model = ssd300.eval().to(\"cuda\")\n", + "traced_model = torch.jit.trace(model, [torch.randn((1,3,300,300)).to(\"cuda\")])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If required, we can also save this model and use it independently of Python." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# This is just an example, and not required for the purposes of this demo\n", + "torch.jit.save(traced_model, \"ssd_300_traced.jit.pt\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 165.53 ms\n", + "Iteration 20/100, avg batch time 166.19 ms\n", + "Iteration 30/100, avg batch time 166.12 ms\n", + "Iteration 40/100, avg batch time 166.16 ms\n", + "Iteration 50/100, avg batch time 166.24 ms\n", + "Iteration 60/100, avg batch time 166.33 ms\n", + "Iteration 70/100, avg batch time 166.43 ms\n", + "Iteration 80/100, avg batch time 166.44 ms\n", + "Iteration 90/100, avg batch time 166.53 ms\n", + "Iteration 100/100, avg batch time 166.59 ms\n", + "Input shape: torch.Size([128, 3, 300, 300])\n", + "Output location prediction size: torch.Size([128, 4, 8732])\n", + "Output label prediction size: torch.Size([128, 81, 8732])\n", + "Average batch time: 166.59 ms\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input with Torchscript compiled modules\n", + "benchmark(traced_model, input_shape=(128, 3, 300, 300), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 4. Compiling with Torch-TensorRT\n", + "TorchScript modules behave just like normal PyTorch modules and are intercompatible. From TorchScript we can now compile a TensorRT based module. This module will still be implemented in TorchScript but all the computation will be done in TensorRT." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP16 precision.\n", + "trt_model = torch_tensorrt.compile(traced_model, \n", + " inputs= [torch_tensorrt.Input((3, 3, 300, 300), dtype=torch.half)],\n", + " enabled_precisions= {torch.half}, # Run with FP16\n", + " workspace_size= 1 << 20\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 5. Running Inference" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we run object detection" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# using a Torch-TensorRT module is exactly the same as how we usually do inference in PyTorch i.e. model(inputs)\n", + "detections_batch = trt_model(tensor.to(torch.half)) # convert the input to half precision\n", + "\n", + "# By default, raw output from SSD network per input image contains 8732 boxes with \n", + "# localization and class probability distribution. \n", + "# Let’s filter this output to only get reasonable detections (confidence>40%) in a more comprehensive format.\n", + "results_per_input = utils.decode_results(detections_batch)\n", + "best_results_per_input_trt = [utils.pick_best(results, 0.40) for results in results_per_input]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, let's visualize our predictions!\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQEAAAD8CAYAAAB3lxGOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOz9d7glyV3YjX++VdV90s33Tk47G7V5tatdSasshBJIIHI0GAzGgN/XwM+A4QVjDFjgyPvDgIUlgsGAsMBkBIgVynG1Oe9O2Mnh5hM6VNX7R1X36XNnZiWDZY8ftua5c87pUF1dVd+cxHvP8+359nz7u9vU/+4BPN+eb8+3/73teSTwfHu+/R1vzyOB59vz7e94ex4JPN+eb3/H2/NI4Pn2fPs73p5HAs+359vf8fZ5QwIi8kYReVxEnhKRH/x8Pef59nx7vv3tmnw+/ARERANPAF8IHAM+CXyt9/6R/+kPe749355vf6v2+eIE7gKe8t4/473Pgd8CvuTz9Kzn2/Pt+fa3aObz1O8e4NnG72PAiy91sSRtT6v3eRrK59I8baOZm+qQ5SXWOVpGkbba9Lpt0jQFIMsL1lZWGWUDCgfDUsCVkLYAARpc1efdE7PZvzSOxXFUX+tzn0NzDrTack+z78/WZPKWz7VdtOv6BS7eX3XPJc9tWQvf6K/u97neqfHe3oPNwDm0SRCl8NUc4zEmAQTrHUoEJSB4ytKhvGWq06XdaZOmCUVecnp9QOEcCbBrYY5et8XK+gan14Z4NfnqHfHMT3Xp9XqkaYIglLbk6NHjDEajCycw7rvEaDqdNt1uj16vS2lLjjzzzDnv/batb/r5QgKftYnItwPfDkCrB7d98Zb99j8KRP4S927dxJPAKoDyjnZiWJjrIaWh01FctdTirjtu5fZbbmLfvr2IKJ4+epQ//t0/4fCh+znat9x3TiGjZfyeA3gSwAIKnAfvwl+9WS49ZpEwxko0ExGQsNHE+Qv7kPG7eny8XhAL4kuc6YCAiAXnEDzOW5RKwCu8d3jxzb2G9w7pj2BmGiQFcXiBINmB97beYGEGwzPHY5J4RuqfvrkWWxGSZ3y/r96x+mv0qcZ9Tl5fdzLuu3k8roF4B0UB1uKViddt6a9qFf6T0KeyHq88vsjg/CH0aIPe0k6S7hTOWbAFgmduYQmvDcPSkgJTiSal4PTKgF62wd0338zNt9zMgQN7OXz0OP/hzx/gVDagm5d851e8gde/4kX80u/9Kb/0oUewerwP0MI1uuDrXvMi7rjjRezevURiUtbXVvnu//uf8/EHH8QrO95r3oOzKA97d8xz8w3XctuLXswtt97M6vp5/sHXfM0RLtI+X0jgOLCv8XtvPFY37/07gHcAyPSSRxqSycTauAuparXDpLnwqnHvxaDuYtQNPA6nDGuFZf3sOgoDKyVapniZUXjr4iMlAquA8yjxiHhMK8UpofQSx6BAHIgKw3DuwvHUmy8Cv0TEJBJgodr8XsL7E76ORy1b5ggQxVKieNXNe9jcLHEoNkYjNoYFg7xkZC2jwpN7j/UK7wTnPFYEF+fQ4xHtgRJB1cCA9ROoM4y3mu8GtY7jn0AEE8DZRBoXm4+LLdFFALZe98a5ar59mC+UhK0jYe28NMa7Zf4nnlm9swgoN4FgqrdwY8xZ3+pj3857rAcnqn6Odw7vPaMsw9kKKSoKFJvDESKafqHxSuPjehP3hNYaF+/3zsUufdiX1Vhr5DvmBNM0JW216HTaiJKwnpdony8k8EngGhE5SAD+rwG+7jnvqCYeJmGmSTEmrt+6ORoTMYE0trDKW7vyGqwBpXBKEOtQpCAJ4LBax8V1oXfnKG2JEUG8J9WGXCmUEzwKj4oAHIFf6fHGvOhLN79KgK0akCZodaS+W26P1Fa0ZzZRvPTqeVZXhyzt3I7gEe8RFFYUReHpD0f0I3JY3Rix1i/ojwpGZclozZB1p8gKIcNReId3YHGMnKPwQkmDwovEYUuDuMZ1mMB74T1EGu/iQeL7+Gquqjm4AMFVn1v2Rw2wzfMqUH8BrwJX5uOzfRORV+8hcRyMGYRGh+PxOzdxjccH1r/uy9cU3DmH10SgFayzlGVJWZSU1oY9IuBR9Dc3ycocpdM4joCkwngDofGxfxHBORueJSogvoqA+OZEgFIKEUGpgMCstVyqfV6QgPe+FJHvBt4LaOBd3vuHn/OmiyGAcGLLprgAirccj1Rh6+mJ3dJ4iAC6jF/DRimxWEqc1DAGgHMe7zzeFojTiE/xIhRoanZY4s5y8Q9PTTV9WNStow6bVDU2YcUSV0Cy5f2aPURq61FYNJlvkbQSNtdGGG0QJWgtiDhSbejMzLJ9bhalwjMRwTqHtWGTFl7IcsvQlpSlx3lFXlhyX7LRzxgUnuXVDY4vb7CaF6yMcpyk+NIH5KcAJfjEhRlVCd7rwJ7Ht/VNxO0UQgLi8M4i3qPF47wLG11pvAelAO/GgFuJTN5T0+iK8tbEIB5TcS1Ex3OTUzneItUaxvVWID7eLwAK58E6h477yRM4Ki8O7y1eNAqH83HVlaCVIlGaJElwPgCjeIVXlnyYkbuSuakuOEFMtU/DwgtBDAuSkiB4bFniXEVYGsStYhe9p7RlpKsG0Qat/9dzAnjv/wT4k8/5hia1nyDk6kK4n7zxczx2qfN+vGkqauRVIDIeVENOFwnABoLGglaMTAdQAYibm7FiUSs2nyCj1tS8EutFxvqpCk5kfI1XVBJBg/uJ/23heJQSEqUxqQkyfpSnlYpjUQHROATnKsAKnEKatEmT+AzvI1CGr2VZBsqiBG0USiu6AoMyZ5jlGJWwOSo4t9pnuV+wsjFiZeTY6A/ICkvpPAMcIzy5hdK6gEwRrEBeFlhfBo7AC1ZUIB3YAGYqiaujguKypro+7g8dhh31H0Gf4oJk5lWDOZSLc5W+4mqknqMAxdJgD+I+UApRCqwNYpQETZDDR45GoSSMT5SgvUZU4AZUtZeVwovCeUd/c4AWxTV7dqC8ppwQccM+0FqhVHhv51xNmcJVNes43ndRT6SURilFYpKgWrlE+9+mGJxsYzZoDIiNU1W7pILtOa6TrQcvxmtOst2TQxpf732Q2DxCogIdKCWwn15UQ+5s/NVIgADMF4xnK7MSAbYmnH5yTE3OyDd6UILWGmMMaI2zJUQ2WKmwEStEVrGKzSnw4iN7HjkVrxHxgbinSS0He6+wBQyVx5PS7XTAwXzime31uD419PsbTE9PkecFpXOU1mJLyErHqLAM8xJbOgoHm7lldZDRHwwZDHNW+wUrw5zN3JKVltx5kBInglMS1CxKRzwZxuuVj9MsBOwRFIP1NIkgWuMvCglSr7MnIuQ4N2G6I+BGka7us6EjqPQB4VYJCErCc5XzGG3QSQA16yIhiMhpMCooC8vB7QsoUVGP4sNmUSpwefH5Wgmiwu+gx4kiAZPipgBJYlBaYaI1w7pLiaSXDRKgQeW27vAL2bfP3lfzh9+CPBrsef17jHUCKEQZljGVlgoheIfHoUyKAJ0ERoQFH4shvoGVqUhug6zHczXl9zU1opL1muNTTW6i8X4RaYj3eAVKK7QxeCuIGLz3Ddlw/KmUqmXMqqNKto07Lm7mOFQPirC5FUJRlKhWEjmlINOriKvyrCBttckzj3OCFkOapPgEppTCRGSkBLTW+Mi6ApSFJStKhqUlL0qKwjEsLaPMMigcG3nJxjBnIysYxr/NzLJZwsgJI1/irMUTOY0IML4y6V1Kt+QjooiyeuAIqrWrEMJ4f9ScSJxfrYKuREUE4KPY5/CYuJZKa9I0RRuDeGihMKIYDjNG2Yjti7MYYxhRBECP4/WAEo0SQSuNi0TSQ7yuIjwNmV8gSdPACejAcTyXyfryQwIwBohma77EBaaii9w/PhGBrLrmIpzABZyD4H2F0T0ei3iDx1HisYXBS2A7jdF4nTDGyjDmPysqU/2MlOoC/FaxCALRJEdzqH7LGLeOlaAI0iKkxoATcuXx4km94LRGiY6sP4gohCDXOpHA3UQcY0SBdZQCqmI1NdQKEvEoHcVs7ymsiwjDhk/ncUXUfTTwltbhvZQKG1qUiuz0mJ1VWmgrTbtF5FouJgoGRKa1wiiFj/qD0nk2ByP6g4zllXXOrK1xdGPAh57YYCiACu968TWXepor5SJRhBJfRs5MIUrjxGMqhCDUQO+sr02K1boIGucdKjFY68E6nPeITnn11VPcfdX1XLN/HxvLy+zZtcRSN2VYBMWfdioanEvECw6LRTC6mr/IIVQii6+sIzaO16OVYIxCPLj/1YrB/+Em9X8TksDFr7kE4E9ceymMX7HWW1jqBnKQiGnHmzBQRK8CABXO0x/lwZogXUZO14BbaZ490USoiEhk/NjqXaSxu/3WCya4oS3fL8rRhoMqAkhhwIiAAyeCBhQWSUzYKw4SlVJ4h1JgrEOhyJWnEB+USN4FRVSUpZUI6KD5VqIRUSjla24DJeGcUo25GAPJxLEaCAO3tZUzqeaxNss2jlev76xnaG3oTXmM0ixMTzPT6bBzYY7962vciPDJpz7GyIG3EvUMEcilmtOt8ygXflaKOcYcoY9jqcUt7y7YdyKCNgZrXYBPY1BGg3McOrlOa3PI8Sef5YZrr+Hgvh3MpAYyj8NFHVPkxnz4LPISrVO8V+D15IaiMeaasRzP4XNJ0pcHEiCywX6s7rjoNXVrAMRFL996sAKei9xwAcKQKGLLBbpK8UIhilI0qQSWzemk3ixeIlaudQMT/PSYovstb9mkUBUlqp/qx/08RxOCFlrrwDLq0kFiKMoCJGj5pbCIF7TR+MTTwlCWJWiFA1IJ7HkYroo2doWgolbbj8WieugS2fqw2ay19XnnIrusdQCUml12QVk5sYnDsypRpDk3sgUJVEo3E9eokpSsDUozBXQ7Hc4ub+C8Aico56J4UPlyCBeYbut1U/WaVmvRBHhg/B4+IhTXADoVDrhqlZ0L+hovKA/WlzyVezaOneCGluVVr3wJ27ZNMT/dhs3NcEuFfJXG49FKo5SZQIzBohT3R0VIBJQXkiRBaYXSQR/0XDFClwkSgEtSORiz95UcXQMLXBQLbJWpJxRrFzOVjFU8tWgeD0caFjXXYMVQOugIGAmabpSqeMnGGBrALBUwx0e5rTJadZ+afLfqet94de+3zFO4SASM0hhtcN6TtDTH732Ao7/7J/TEImmKmZlGzU6RTPVQ8wvsfOGtpNsWEW8BQbQwPLPM4MQ5cNBanKK3YwnaGiMJWinKaJ7yLlB4rXXUlRC05gQAKUsbgV/VCKCi+IHqqwuQiduivKqAfpJDqPB5cw8EC4h1FqWjEkwFsUb5YBZ0iWqIYQ37evN5KoiBk/srIHYhckf4BkBVSCgApvO+vs3ZaM70HqM1HrBSksW1906C/iLf4PFHH+PAgUW8s1QUvaLeWgvGBHcT68ogpmIRiY5MFeIkSAQiCnwZfBii6OUrq8Il2uWFBGhAYCVTb9UPXEoEuMQ5ibbkpqvtBdhmAuIrqh7ukQZb5SP2FZeDahNiozqI6LFznxApf0Vx/Bjgo1OMXGScldppQhdQiwcNDqkhQzdvtlpHD1uNVh6MQhUOdfw42bAfbvUGxCI4RkmH0ZFjXP1t30iqE8r1DQ6/932sf/IBypPnKJ0jWegxvX8/2770jZwYDFg9t0yaKpLE0JmaZXFhjqUd2xAFZRlY2Pf/5V9SjEY472tqX7Px0oDDSiCKwFhPUS06bJmDC45V3FGDeERxz0eOcmOQsbi+wox1+Ob1jXm9aKt1TvFJNkPSEnDo4Vo01wVgFhHSsxltfO1QlKqAEOYtaFdw6PGHWD1zgoe6bVbWN5g/t0nXOVrFJhuq5KMf/mtWV44xeuYo+0ZZvdbiIXN93r95ggc++RE0ioXtS7z1bV8xZg4jMvTB9hud08LerUQCZ6MH6CXa5YMEtrLrTUz8Od0/phJNEPHNvqSi6w32qH4ujGV1NXHMR1u6RGVRXhYILRKtKKIni3jw4kLfyKTnX4UI4t/EmPCIr5AMW7iYLfNQv9hWrsnjRWO0xujg6SgKsBbxFu09vpNidu0mHw4wyysk+YiNez5I8bY3YpOUJ/7Tb5Df+wDKjcB7Whr86RVGZ1cZvfgWPvnEE3z0/R/BaB9Z1Q7ttmFx2zxvedtbuOW2W1BaU+Y53/dPv782SapKXxHFJ7yKcxT9GCKlquel5hQmqT+VKFC/ciNmorHWdV/ec3ZjyMeeOU1RlpGmNIOjmnttYsIn94uXMCfr58BZTLcXORobcL0o2p0OpXdxTwltJVgXfCLmKdmxbYnt23cwNTXF2voaDx86isIjo016LU2nPc9L7n4R9zxwmEfPrkSOIxCwXX6TG/btZNee3Ux3e/zkv/qXrG2sko0KlBislI3xhv0pWmMSMzFXzv2fIA5MUMexh91FFTgXvS98XvzKCm26mrkYs4MVQEnA7pG1l6hJrzdOjTSCc4qW4CtQcy9U1B8EXW/G0Brsf6WgbJDG2oGoXszq/Ztjr8jSFs6o6lMURmu0Dl5tIhZsiXIWBbSuuYI7fvrH2Dh5mqf+33dhH3wYWw7YeOJxhkfPkH36fowd4YwmvfZK5q+/EltahkfOhxiDIiMvckZZASJoNaLINetrK/znX3gnb3rLm/jiL3lzkF+1ipt4LM97gu/7Iw89wvL5Zaamp7juhuuYmp6OnNp4jpv3Ve/XVApOHG/sga2w7KLYMeaethCWiXlscKKN3wLB9biygtRnw3mHx3ofnfXUhbJ33L/WWkQ5siJHdEpuLe2o6QdHXlh67ZTKe7TeeyIooxCtUEajTcLc/CzKEM2FzZiIJpcZRDWtg5nwuUjp5YME6naR4U64AT8HQqiv3ypGVADfVLg1n1V59lUyOWMlFL6BaIOipXSBSBgBnB33GB/jLwD4yBm4i4xrYoxSb3ioRICKNW3oArYggUhr0RJ9G0ShxIFzweNRKVwrwas2M3v30dm9neyhx/DO4mzO4GP3krgCr4T5l97Fnm/7Wtrd6dpzrhhl+EcfAkLg1E233Mz2ndt58N4HWFldpT9Y5k//6I+45bab0NEPoZJBK6peadeHwyFnz55lOBxwzbXX4Alig2+q34GtIpNMHBvHA9Tvv3XNo0jgJXJml1SuNrmqretS6QJ8rf0XYsyAKLwLx4zWuKgoRAUR0BEQkHeVoOdxKLxKWbaGUemZzx3TqSFJNFlh6bVbKC+1/lgA8Z4yy9lYXYcCNjf6rC2vhhiCJuHw4+cgIA6wvl6Loiwu8u7EnXM5NJEweUpdsME/6++t55qs0eRJJhRvtfZXJs57wsRrFWzrYdkb4ChC5hUKT0s5xAZZMVCNSYAOmuKG0lAa79iIMhuLqhL87oWxDXjifWTy2koelLBZlTYoFTaoFgWlRXtBnKdlUjbPn+STP/ZvWf7wJ9GuwMzPYkvH8PjxwILOzbL9bW9memYbOumQqjaddo+p2TlcGZ2ktOa2227jO//Jd/EjP/lj7Nm/D6XaDPpD/vj3/yg4pkRAcWXJ2uoav/2bv1krDWsrgwKlBC1qQhnnx9oC3vunf8Zb3/RG/v7f+0YQ4fu+55/wti/+In71l3+Zn/vZn+WjH/7wWCRoiAbV9LgITatnz/DzP/CdiIcTzzzJn/7azzfWaSwSVBzI6rnT/Pw//bYAxIraB0IreOCjH2K0vkZiDIlJaCctpjodZrtdVk6d5P/90R/k7T/wffz7/+cHePbpJ2pEdd+9n+bLv/hNfMvXvI1f+NHvxSFsrK/xwz/8w3zHd3wbf/LHf0ivnWBE8Zv/+v9hY/k8glDkBdY6Wu02UzNT9Hpdtu/YgWlNR6KlQMx4P0kQTY3RJKmJooClLC6NBC4jTmCM5Z8T0OGzn/+sz2kAX7NVykhcA5zVxJ2IpiC4dyYGfGlr5DBmBS+h16h/NzXVW4ZWXyeT1P+CG/yW7wS/diSGjgq+dHU4Lc5y6Jd+g/xjn0SkQFopO97yBWTLQ4wvgzPR9BwL114bOAgErwLLaaOvP0JgfYG8cOzYtYs777qTY8/+Hkrg9InT7N+3k7XVdY4ePsrmxgZr6+v8l1/5Fb7sy78SY8bvpBUMB308kCQJrU4bEcGWJSoJrr+/+5538y9+8ie568Uv4ezZszz8wIO8933vq+c6xtchldnONVn2gFB8ZZmJU7fnymvZc/U1DRduGUtdDQ4AiCoBCf4WMT/Bx//6HhaWtmG0iQFTitKVeO/5rf/8i7zuLV/KrbffwaMP3scf/9Z/4eYf+lHW1lb512//SX7pXb+K7vW458FnAcUnPvphXvsFr+VVX/BF/Ou3/wSv+II38vinP8rOK65mZmFb4DJaLdJ2G210ND2CdTY4PilBdPAnCFPhalFXR9NglmVY2yEvci7VLiMkEJtUcnXFpvmGBFDJ2Z+jSAAXFx+aSGS8A6hke0HQEhbdb80+oxQZgb01AqLcxGhESYg8gwvlwyYyEGqkE6IXq/NN7mQ8yJrx9eOw3XGfARyUljGL6Akx594hXjAjBzs6gEWLQi0usvM1r+DZP/wYEozXKNPCJynkw2io9jgX18JViMkF+7goslHG1VdfDc4i2pCPRqytrHHvJ+9lfX0DEeG3fvO/cPz4cb70i9/Ma1/3BSwtbePdv/3bzExPc+7cOf7p9/8Iv/5f3sloNGR9fZ1XvuoNvPXLv5wPf+Av+Myn7+VH/tkP8eKXvJSPf/xjnD59ire99S388I/+c97zO+/mta97HW988xdx32c+w0/9yx9nNBiSpAm//Gu/Rq/XCwlVGtFzInD4kfv48B/9N77u+/8l/fVV3vNzb2dj5Tx7r72BZx68l3/4k/8RCBGNf/COf8fRJx9hemaGr/26r+epJ5/ixJHDvPud7yBJUr7z+3+YztQUSmlGwyHeQzYYIs6zfOYcU7NzeO/5wD1/xSte9Rp27dnNufVNpmbnGZQ5SRIyEq1nHlGBu/zwn/wOX/0DP1lvzcqUWv2r9kDg+oN+qmZoGsFOKgYd5UVOv9//P8REuIW6V5riIOPGbV75tv6P9HUxseCCYw3FXfzQOmiAfUV1Kk5caUY2RNYZSalccSsl1Njy4C+CBGjA93gMPgLtmKWL71mFIvvmPVuixqrPSoEU3Ui992OKjqAWF7j2276RB+97iuHRI5Qrm6w+9CSt/Tux3oTw3cE65ZlzJHPTNTUN7r9x00XZXhqsc7vTBiVYPKN8xLFnj7K6tkorTbnx5hvZsft7+KEf+AG+7du/kxfd+ULef8/7OXniON/6Iz/KNVdfwzOHj/D13/AN7Nl7BcfPneE//MxP8YVf/qW85i1fwT3vfz9f963fwZ69+7n5RS/jP/67f8VP/MzPsWvXdjY2Bjz44FN0pz7Oj/7g9/C93/9DHLzyKnbu2o4yCdFvCO0sHRW4NQ1oPEYpjHj++j2/zpU33sorv/RrefK+T/KZe/4MkZAVYvnUcb7iu3+QL/2W7+C3/sNP8Mgjj3Dby17BJz72Yd78NV/P3gMHUIAV0AJJt8OXfvO38ks//S/5g9/+Dbx3fNc//ykATp48iTaGb/76r2VtY4MXvu5t3PDyV3Hn3S/nd975C/zJe9/H933/D/Hu//qr3PnqN5C023VMkGesyJ5Uto5FwXq/RIShdPDo1DqIs3leIZyLt8sTCTSA5wIwqgDmguNbvjc17Bew3hWXISAusoYVghG8aFINFo3Gh+guCOyXEoSE0uV0xJEg5Eoj1teso685FiYtAc1BOD85xoZsW1svIrcg8bqAJxrvX11D3ByJDkhLgXcKcQUh5MfhUWBTei+5leLEcfJhzsYnHmD/3/96Trc6kA1pr/Y5/Zn72PvKV6DEUCqH9uAoApKrOBetIyuqOXv2fPB9Esf6xjpTvRQR6HRa7Ny9E53EgCXgqScfx5Y5e/buY2lpe73B/+Iv/oInn3icLC9YXj7H+bNnmZlbREToddssLc5T5rtotVvM71ikENBpwrY92xm5ktnFRa666Vac85zZKGAtB28ZlAVz2qE7CYkSlkzOeVWgsczLiONPPMgbv+cHmfV97rjlet7Tm2LKbjAqByxs285VuxaQfJ29e/exuro8scU8IeZCvNTKx4++78/5km/4Ju586cv45Ec+zLt/6ef5gX/2wzjnePrxx3jnr/w6J8+f59u+6RvZceVV7Nje48d+4sd5Zj1hby/ht379nXzZd/8L/usv/mtGmxvc/ZavZs+1+1Ex7sJVHo4VsVANoiEafBlG5lV0Idd0e23A4opLxw5cHopBuDgXfIFSMP5XZ1VRE4Bw8U4bfdcTVp2P0KSklu9EB+VdIjFTkBuHkFawV6LJihwjHlPJZA1FnUR5rX54fa4x7uYCNr9Xg2uoF4LiPJzzjfE2w4NFQGuDCBjRWDTeWXR8bdVLMNqw7QtehezZQ0rJyqc/jV07y8xdN4NSFPkmy+/5E1YffRSVOjpacDjKwTAqxwA0WiUkoknQfOLjn4iegcLs7AxJkoIHbRQ6sruVoq8/yMlLXydudR6eefopnn7qSX7zPb/DD/3zn2LX7n088ejjHDn0LFlW8MyRZ3nosSd44qlDDEcZDzz4OPc/+BiraxucPrPMmbPL5HnB8to6m4MB6xtrbA43GORDlCuZMRqKLIhF2QCXjXBlSb65jreWYrBOsbFGubGO9568v0HR76OVothcJe9vhLE6Xys3650V9RKVF+SnPvB+brrzJQiK215yN88+/RQisLR9O3e/7OXMzs4wMzvPlTfcypmjhzAE5WW/cPzKf/4F/vE/+R4e+PD72H/dLXzZd/0z7vntd1UScT2H9daockRU+yqOyss4DsM5R5omOOcon0MncPkggbpdxM46AcDSOMaFwNW0CzfZ8eo+JVv6usj9CEapLZMzBmqbpDjnoqbbXWJsl/p9sWdTIzxP49po7plk+8fjqf2PAO+CfV4hKO+xlBSuJBeLUyF6rxDHtmuuZeE1r8SoFDOyPPOu32PHF70evWsPohzF0Wd5/Ed/lsM//6s887t/xMPvejfLp07jJPjrK6U5fuwE933iXt7xC+/ggfvuxzqLx3P7nS+i1W4BAWhsWTLdmybLMqZnp5ldWqLV7ZEkCZ2paZQJdvGp6WmStE1/fYWjh59Gyox2S1DKoymx68v4jVW8Ldk8c5y1U8coRkPWz52GImPl3Fke/MRHWTl1mpPPPMXJQ4c5efgYxw4d5fDhw5w9cZIiyzl99Cgby8sUecb68nn27NvPpz70AYara9z/qU8wHPQZbfbJBgOcc+TDnCIrQ8ajqGBsdToUWYaOiFsRrDGJUszOL3D48cdQSnjy4YdY2rkLQXjJS1/G/ffdi3WOLM84+uSjLO3chXKO0sPJkyc4f/4cr3jZy/FlHrIZi1AU8bt3tTmyQjrOV6JA09qkoi5NKIoCJTGGQCkGg8ElIe7yEQeqtpWyNxV39bFLkv7xvd4T/SgbwNgArvriLX35wEAntWvoOKS4nmyT4gqL7ng0lefauMsqU1HtBdhQ5AcOvwHUE2OWeLhpaZDJYdaixZZJimbNKq+cMSl7Xv5iuttnWT+zTLprL6lKyLKcpS+8m5N/+Vf4cysUx46AaK76J9/CI//+XbTOnEFkwKk//XO077DtK7+YxWuuwNugoHXO8sEP/jUf//gn2Nzo470jSQ27du3ky77yK3jnL/w8CAyHOdlgSK83w9UvuJ5/8zNv57Y77uC2O15Eq92ht7AEwKvf/EXcd/9neMsb38juPXu55roXsGPPTrYtLaCVYnFhgYNXXsXZmSnSVsrBa68kLwq6vS6Li/McuGIvP/72n+bf/8zbKYuS6ekpfu4//SJp2uLY6WWeOnqKwpaIEjrTU1Sr09bC2972pfyXX/kVfuH+f8MV11zL1Ow8rf3Xk6+uQJLi910FRYE3Sfh0jhe+9OW855d/iSRN+Y5/9qN0Op3A9HnPV3/7P+J3f/Wd/HdrMUnKV/2D70REOHDgCu5+2Sv5kje/Aec9d77uLezcewCx63gUf/HuX+Yffft3oY3iC9/0Vn7o+/4RH/rvv8FrvvpbcBWnV+c1iJyj0ogKUaGIijqE4D4sCGma0mqlgGCMeU73ms9LBaL/0SazOzwv+3ou5ALkQu1+Rfrq31s7a1xXmRubf5/ldQVI8HzFlYYXv/CF3HLzzezZvROjNEdOneZX//Dj/NYHP8HNxZMkUz2O2ZRjS9fHJBZExLF1nA3lGnEbVvJ1xe/BBHIbexxehJth8j0EECV89Qv28DWveEFMEJqi7ADTbqFbKR5PmWUoHxJslPmI0coao3yIkDK3ewf98+c48b4Pkj/9LGyugulw5f/99/Bmmnf/5m/z+COPYG3BIOuTDUsGA0uSam686Uq+8mu+jquvuY5f/sX/yCtf+Wo2NwZ0Oy2+rb/GzHPEsn++WjE1xXtf8hruO9vHr5ykV2yQpgnDwRBfZPgYCJV2ukxNdXnq6Al+/Zd/me/4mf8cBZiYzNNbWDmG76+h0gSSBO8IzkMIaatF2m4Fc2xcy5bWWO8pJWVeCnbt2MmuPbvotNscO7vMJ59dx+Ub7PWbTC0u8uB5xcGe5nV338DDh1f46OHAeSGwW/rcuGc7O3ZsZ3pmhrf/1E/yld/w9/j27/sPPHzq2Zi/QMK+K3Okv8G0z3jNS27hpptv4rY7bse7kocffIh/8UM/+Gnv/Yu2ztVlxAlcBAFccMlzadsb99WeY1sorvdbbriQCwhWAIdJVAwF9WNAlUillaHwQkcrWj4uQNXflpx0Yz1GGFftIttg/1VEEMHKIxPjec7xQq0T8ECqFYIGybEjz5OPHaYsO5RFQduUWJPQTg3ttkHahlarRTLXo23aeGuZXdzBzNe+jTyzSJlhCkM5naKt8JVf/WUMsy8OzivFiGE2YHN9SKvdYd+V+5npzWLLkrn5Oe540Qu57zP3MdgYMGMtP3fFdaRa0WmlJFqHFNwEDzvrffC6dJV8Hd7LxWuc8zEiL8i44XicHje+FjxKDCQJC9u28Q33fzQq7BxetxhmI4rNYZCZZ7dTnD3B+RMn+J13vzuY50yLt/zD7yUEnDWWQAlIyAGASMzc5Op4D2U0onU47X3IHCRQlCWuot61Rn+8hhJzQBaRU82cwxWWbjtBS+WpElLISuRipdoS3gdFr6iQ2qmxzz2gjCJNEnQSck0mSUL5f4SJcGtrAkvTDXd8ARcARfNnFTDR9EKsKauavH6Ltl2hSCoWSpp5BSJvrxTOaBKtGeZho1Ra4rE5QsZ9b+VKtr5qZVGoFIbN9ydsLj/xftLoXoKSsIR2EnzRE59gOprrb72GwuYsn1ll+eQaO/cv0krBF57SavL+KnnfsMEIcTl5CUVZ0Cthw2u8zmi5BCdCOxHKRJGkHaY7U0zNtbniCoNWLgKKhyTEu+/YtZNXz78aXxTwu78XsuvohE63U4dmee+CsdOHyHvxus7UU83VJd2m/dj86iXoH8qipCws64OMzX6Qf13UkJetDjbtUtocEY0YIWmtsGf/Ab7/n/84SWeK9fYshaQoN6LlS7pa8ElKVpYMpcQlCWiDmAR0tJTEdRGlIA2emV4EdNAT2ChKiqjJmH6J6dWUULiwf/p5SEveSoIXZeEbCSkbhqZ6GwpjUYDKjD6+vizLgKSions4HF6w76p2+SCBWk5uHov/baWOTeo6cW31JQLjBaLCc+gSqkuIKaJNEtNeV88ad++VZuQc4koKWoRojmqBGyvVRF6VxUCgNmKPH0qdnqw5xopbqJFXQxzY+l5eocWT2wLvBElKvNK40vDAg89w+x038NBDR3jlq2/H25JDR47z9ANH6bYWuOHOHczOL6FbhvMnN1i6Ygb6fRa2LbLR15R+iO07zp1fRXvDaGWTQ6dWGS2fCvkDuzPMtDXeCJvLfforfUjatKNt2vnoIqwUacwrmCbB8qJzj0lDwtGQQFNqiiaNZaw187WuNGzu4LMPeVLQFs/Ajimei2m3qtTlQkkyWKWrLL3t26gzQXlYsBnWj/DeYvMcWxbMb1/EJ5qTrmBUzboEIMUFN2oIKcelfqanipR0MWNx5cEZhx/3hkMrRe40KBgWQpGXdFONUQqpOZ5G0JKMx+Cb1oGKQsR9JkowUSFY1T2oLDIXa5cJEpCGSa3Rar7vImLAxSSDWtT21OWrqkm6JAJoPDsyCUp5dAwPbqLfYG4Lk2/RKGeZNsLZ2otvnC9gknJXmyEmvFRqYvxjv4C4sE1E5hq6gVrEqZybquvDta7IKFxJIoK1RBOnJ0nb7NqzxONPPAGqRJTizKlN7nrdC9i/7wo+9Nf3Mr99ESmHPP3oEY4+ZZjuptx8xwyjwZBjR0+QD0bsObiThe3zlHvnmNq9wdmjliuu3I+eFlLT5Y9+/376/RGlC3EVVHkFgUQpxCkKLDjL7u403bZhOu3CYJ2niz7tToszgwLnHTpJqhkI7+bHeDRJErTS9AdD0sRQFAUtYyhtiaJRBITg5iwidItN/Po5KDKk00ZJm1a7jUlaKKPQKGwUScq8oN/vk7Y6KFH0Oj2yrIDo7xAA3Y25tZgOPLgyV9EmlTKv4gAkpl4Lm0z5kE698IEDLEXI8pyknaIM+FzV4O+cHXv8SYhwnQiLFlVvJwVx7zqUShAxOHfpuAG4XJBAtbd980CT/WteK5OsYaP56nyT5W+o1SssGq7wDeTQBNqqsoAQMsqMZfXaL1+EMmL7ljFR9qROxln3PTG4ppggk+OvzJbVe8WkoHUJsyYyEXVh34REn500weOx1uC9IR/2EUr27F3k93/7Hm5/0QvY3BygcVx11TaeeewMTz96mn0H57FliZgWew7uoL+xyfnVPkWicZ2c2R09jj6ecd99R3nt6xeC/F5Cph2+k4BzTPUM4oXZ+Rlsqeh2WqTt6A8gAlTJTT1dpdmfGtKspDVl2dxw3Do/Q95K6GerbNiYyUmqFGe6RsDtdhoy8viYVjvK29YFOd0T2Oww5YJg6RabTNkhy/11CmvJi5zhaBT8KmLqMx3rCaiYPaksS/rDIV4gL/KxxyjBizLk/xtHSrooHgQ332qfUtvsfSxcExB9cELTWlEGNgdHwWhUMDs3TaIbXqHEqMUqKxM+ioeCKB0Ug/WeUngV9BQ6himnpkXpAlG7VLs8kABwAWA0NeBbAf6iYgCMC/Y1KwJd+AxfXzuWOSUiDyHIcyZSMUHq4JmARMKiFj6wqCOSUO6qYvHrsbnJ5xI25QUIDQKrWiGS2vjf1INs0WHUolDFPYTrkrjwTjnKYsRws4+1JWna4pYXXkmWj1g7bBEypLS0bRuVDFk5XnLmxCmmkpzStWhPb2dnssb5E5to7SFXzM232Ll7AYXGGEV7OmF2MEuqDWIceUhPjG4l/Lv/8NNMz3ZITMKuP/5j/tuOvcx02sy0Wky3U1qlZ/t8Gz8q6S5OMTqzRjrdJhtZzlvHycEAEV1zR1Uy02D6NGFNvMO6UIzTeyErSpx1rG72UTrl5LNP8r77nuDUyjpzdoNiNGJjYwMLGGNigI2i8s2vvBpFgo0dAkvt8WRF4E4kaaHTNABhrA+ojQnKQgjcAYqOFkZOKB3MScn2pSXm5+dJ04Qza5s8fm5Ea3CWbR3Fssyw5jRS5ty/Y5bduxf5yBOnOZ8VCLBEnwNLcywsLNDptJmamQvIpSEu1IQhchpaQpKZSqnovX/OUOLLBwnIZNII36T2E5Rvqzzc+NL8TowFv1T56YvJ1pGVM6JoJWmt+AlUbMyqCJpSgutsLrHSrUhM7STgbeAixkwIzQy7UcgNj69YRhgjAufqDTWhKKRhhWiM3+MRFzLuhnx/GpVodhzYhStzSiGEFBOcU1xZ4L1Q5h7HCFtqrLWo0lNaQyk5SStlOBihxaK8I0k7OD/k8UeOkOeO1OaMSHnioaP0jJCrNgf3zjB3yxeRW8e2mRa9+Rne9PM/z2/sv55tO/dww/ZZ/v6LrmZ2Cooc7KkB0zfvYv3BY0zv28WZs0MeXlvl/cdPQjqFFYcoxczUNN1em7W1dTrtDu1WQlGUbA6GeDeitI6VtQFFAWcPH6XbXeDHPvSXfOqbfoAH730Qc/YxRrlw/NwaXiu609MkiWCUBhNCmRNtkCRQ8Y3hiKTVwqgU62E1yykRdLtLuzeL9uCLAmcLWt0p0l4vpBW1JQpDp6NZKRIyp9klm9x8x4u46tqr2bVrOx986Agf/tRJth3/MPv3TnGMa3i2SBHb5ytv3Mc3fuXLePSdn+S+U2egLNmpj/OSO27i1hfexp5d2/GiWVs5W8NMU4RUIphiRLfXQrTBaIMxhrwEW17uKcdjG7PzWw5uhdUJJWIEtiifBRVNBbTNUNKGvNG0OPhaGKgfpwQSY2KVlxCRVaXCCl5ZBk/AtCQ6jiEAtfeVlngrNY8DrmvbNT4jB+GrpJEqso4+cih10g0ZWwoqBybGXZuqvgCC1pa8zMFqSj/AkiKE+ndGzeDJ0T0HJIhPg4LNlHgraKux4nBecHZIJ+lhKUiSNibxpK0WJgWjU5zPsYWlGFrK1SGD4YDz656TT55guXiCNwHoFJUo0iJDn9okH2ScL8HlOb3tu2BoKI+dJVuaxfY1RrpkrgSl2LljO2vLq/SdpchLnB2SZUMWFhdZ2xiQmISizOJ8Okrr64zASdIisyPOHHuWqalO0MsYEwJsCAozbJg8K8HTUgieejo1WDxlpPghxbqOEqOvw7gq5yxbxr1TbSDReFEkCtI0ZXpmhiqEXKSkoxRJq00+ilYMrTm3uko2HDLTTmuxUlfVrr3DegmiQqUOqkSCqCeQwQaLLdg+O13Dg1JSh1hfqv2tkICIHAY2CFNZeu9fJCILwG8DVwCHga/y3q98lp7GcvAWvYBEQL/Ag47qQwGhGKRWaZA6J7juOIkVohgPPk5mI/13nDgjQa6sqtg65xCp/QCDTKgU4iyJDpxAs8hm5TRU14dsAKsI42vre5qYrooJ1w3RpeKKYsUZCddFtoFKDxLi6qMc7Q1aKZxyKJuOxR2vQILba+GIbHDIThvMdB5JqryH4JMOIh7tNc4V5Bl4JxRDgBznylg+26NnO8wtdJjb60FtJ0k0/AgkvpJPZ0mntjF9W5vBuT756hrPnjlN25ek87vQ5zewqxlXz7Tpzbc50xeG2ZDFxUU2N1fpdLsMByOyLGeYn6Gdmui+DUYnFMUQUSHVNgBao9IZFBaPBaVQxgTxTSnExGKnhGzAoQCrxRUlOE+WF3VNhbAEEqMyQ2GP2gfKeZQPnKApFdYTwqudoH0oxTYcjYJVwZZgNOXGOs7NkrvwfJEum3lBN20z0wUkjW4AIfOS0g4vGu9tGJMB0Y19NFhjh9mkm7To5wWp1rSShDIbsXLuPGX++c0n8Brv/bnG7x8E3ue9f7uI/GD8/QOftZe6kgrUIDwRO7+VqjZlewVGRbXT5DUT7blMhBV2FUHrcYmsZtLLmmX3jtIriqCCH2uJxw+qLQ4eqfFN3YdvAHd1ffNvq6WkYmYmsJ+m0mnU1GmL8qdZ+IM49irYCAHlBYlJR2KcYX1fBdgqBqSoRrCSsxalNS6mVgvVhVxEmJWbtWCLMvYYsi/10oJ0u4ZBTnl6SG9plt78LNnyGn6pTW/Ks6cNty+1mHKK95/a5Jm1AZtFRquV0h8WpIlm985dnF9dY6rbYzjcwHnI88oUqeoKvKUF6aVsW1oiK/NYk9BgkjSIAjoi+Jj2zfmg+Xdxr3jng+cegSpXJregCHQT0l3FBVREqy0FuhjRdyPOnj1L2mqxsLhAf3ONucEJem3BGE0hCcY7vNZsWkuRZWyb6WCsi+XTgsOTIyGRgMjCmhqUSvHiSAZrbGfI0s5Fjhw5R5ZZzp8/z+GnnkbjGGQj8ux/bVKRLwFeHb//KvB+PhckUNWBkyZsRBm8YYIZm8kaTQCvt1D/5rkt1yIN6hqXsLpOgmxVlc1q3lZlzkVprBiKcoT29kJxxbnxMRkjD4jMjjReVKBW/kV7/4WtyQXJeNxbFKdam8b56HXXQGLN3sQLiUqwPkcLKEli4IqnKAPQelzszlMne4kmMe89xhiMifoEVZnAJBYd0WTZKEyXApEUo4TNtSGtlke6CanPyTfWGPT7tAqHSwxXZ8Kn7j/CngMH6DtPu93h1Onz7Nm5yDDv0223GWUjZudmoXT0ej1MUZLlg+Bd6D2JCWtnRUisJ01CDgiMRiVJSMMWkadSOiYKDcSkrhewhXusEWg1Bw2OtUYGnoibhVbepzccMrd9ns2NNZ56akDr5AzLZ05w8/A051xOamb5kmt3MCwh9yMWN0o2BiU37JrlC/entFsJ9lkT0tz5IF4oJSiTcvu1V3JgMIf3BaycoCPzPPT0EfZsW+QFVx9gaX4OnQaxzjpHu9O6yL4K7W+LBDzw5xJCrP6T9/4dwA7v/cl4/hSw47P2UgNCVKDVXHI101VByep6maS8E3qDKCs3g4zqSkAXGf3WcaDQmpqqel+Z6ca2WJTgEKwrmaUgFMKusIibeJ8KcCuVYl1ssgbo6rpGNGFN+ScG1pirSiKNYyO8r54wisgFCKCZqNNaz32feZDde7dhC8f68jpXXLOP48fPs//KneA0pSuxRY6z0O22AthoT9I2ITuRUpFp0bXcHOYrZB4qIicg3uEp8EVCtunJsoJiMKTVnWG5n9FSGl+ATVaZ29fhajXDoCg5tz5ko7Ck7ZRRDIVtd9qMhgP8yKIEZmd7eIQ0CcDsnMVUSAChnQ8IVXk9ohOUDj4GeF8jgdKVNSdaT72ukHbQz3gJtQSqmP5qPet9ErVRVYIYXeZMk+NcTssYdJpQZCNOH36Knh/RSbvML23ny197G+KhoM9jn3ictZU+N+9fYmf3BlpTKb/334/gvEX5sk5zZoziK954J4kZMRwEc+fq6jLPPP1ONk8f45QpSNRBWlMddJIyt9hjY2ONS7W/LRJ4uff+uIhsB/5CRB5rnvTe+4ggLmgi8u3AtwPQmY2adagDcBoAMuFPjzSAoPpdP7ABL025ewtU1cilSis+qXOQuk5AQO8+8u8hiQQ4VyBoCleyiyEtHENUrbQbOwsJ4/RPka2sORGY9BCsSEnFFTQsAY2P+nstNsVnOk2SEsuQOarciM2IRN9AqkosM9NtHrj/CDfcuBvVEQo/4sThZY48eRiH44qr9nDy+BnKkeeK63Yz3MjI84K9VxxkaVuX0SinHfPftVtp/TytNaIVlRjqrcfmJTsXu6RX7CJvAavrnPZCutjl6YcPsWk22C7z5CsbZAPPyhUtzh0dQKnQLY3LC7pph421dbq9DhtrI1qdhPOrG0xN9yiKHIvDOUtSlQFHSMv1qAQExATERVCYBeYm1EawUPuABLFBITHxi0QORxqWGh89FSsRoWbOXCj1RnuKDI02mizP8LbE2ZJhYdnwij09YbB2ht//wz/GuJxhmUHh2bN7gc0V4U9/58+QtmV9vY/Zf5AMT+4sHaUoreUzH/sIo+Eaoywjy3IGwxF5nlOI4ujx0yzt2EOiEpI6kvDSovDfCgl474/HzzMi8nvAXcBpEdnlvT8pIruAM5e49x3AOwBkfvcYeiu2U0lQrlVycgU8VRM1qeiDSVEhAt5YGmjKBTIuDCQVta/GFY/hx2whUuMXiQjBqpSRU6i8T9JzZChwwRrhqzJjlRlwKwTL+F0l2nbre6pH+kvcM9HXGIl470hMErIgNQp8jsWQRkEPpbBlTpIa7n7FzXhXorRhenqGa67fgZediIOlnQssLGwjG+XsO7jEsUNnWD63zslnT/CZj52nN9vmymv3c+XVB/C+RCs9oYPIIxYIqc4sWMW5kyeYKQqOn8/YMZXy1AOH2H/1TmaMIh2M6KkesmA48vQpvNLB9TgVShuoYGJSOu0u6+t9slJw1jHKVikKi7ch7r5ykS2dRbJRqL7sAa1Cwk7va9HJ+uDZKFEnoKoVF4UjVloOfBWVtaYW7+KWqvaGVwqDA3EsS5dcDHObm+zaPcW1199EKo7W4l4++tjTSHGcIyPNB54dUvgSj2KPWG7fzOjNjvi1kw7TUdzRCUlXWxB8MsRTFpb773uQE88+zWC4GQqdlJYszyldSafdYTAasbG+ydraJoPBkMPPnOBS7W+MBESkByjv/Ub8/nrgx4E/AL4JeHv8/P3PoTfqzd0oVKlsgVMmcgJVopBwfbU49Spc0KJlwceqQGNOOCCHCc189TWw2JVyqeIfKpO91NyJB+/InQoOJT4G0Sgh2pyiIDzp2knzkTKOER+XGJN6bH5SOcIk8Mdrm3USlCM1SawRGIFdxp9bxYLCGtbXLSdPP8O2hQ7rKwNsZplf7OFbmoXpOTyO6fmZyJyNuPK6Axy4usQkgisDkhsMByAlqpHdJkyT1EhAJCjBTq4WXLPTsNoV5qZnKbJNbrjmBlaePcGq85wbjHjhdVcyaxzHj53AuGBpUTqh399g2+ICK6trbG5skrY0ttKfeCExCVXtgtSEmAVvS1SRIXjKCKjGJEgDqfoowoRqSQERJNH5x6MQbUBy1MXEyYn1qBZWgRZym+K7PbqpsG3bDrYtbmN+pstJO4U8c5ZUr9GXFqvteUodxt3JV1lePsO1111BMbWHjbZm6J/EKRNKyKswt0oJyyvnOP7sIWa6SYjBcI6lTgetWxRKs33ndg5efZAbbngBa2trnD/17CWH/rfhBHYAvxc3lwH+q/f+z0Tkk8C7ReRbgSPAV33WnoSwiYQ6MkqsqwMwKrnL2VDvrqLk8VaqbCu1vkYIAR6Vv3X0DAsY24O3hBScALGwhA9mP7xgVLDbWl+x0JXYELrTIriYZnpkm9xF5d+tQ2Rh7M/bMqQtq8QEVzE+DTGkjifw9TPrVmMwqeX9SgoVqmASITEaqYEx3npRBBlMZtMzM1xz415GmwWiVzl18jzPHj7DNTcdIJk3YZgVZ+QMXmu0TkAJWgfdR8+Y4NMQEZpSKqotJPjbV8eMwfSArKQ7O8P6+gqoFJ/nnN4ccWDHIttaHco85/jJDVaKMiA5pUm90Ot2QFm63TZZVjA9M8XK6mbt5psXOa4M7sStKnDJlnRLhxVP6aos0nGfVaqXSN0D/AZ9TavVCtWAbTl21orvVH36yjxYA7+AL3AkVGZcUQanNKlpoTwkSYoyFpOvk3QNqxa80mE9vGNEwgP33setN13Ljl7CYQetWMlYRKO8C35o3nL+7Bn6gz7OGhSQJorNfoFzwvb9VyGiSU2bdtJlU2+SlyWXan9jJOC9fwa49SLHzwNf8D/cn3O17IX3IdFuu4vE8ta1mSrm9PPWRYwOSLTfNopEhkWUMTKwIXS1o0EZSz8vw06IIdnelRCYOVIXFtpZW6v8KjEg+L87chFcXmDzgvKhj6B7O/DTC2Fjq2Cy9FqHEt8IJAkojTJJKJGtqCv8SO1THnanRO5m7MFQWUbiL6mofEXpAeXQJogCQdQZizgXOooIqJxOL3i5zW/vMrPQZmmpw/TsDBYJlMc5yszSagmJThAlJKlEX4PASpeeaMaSiAciDRXI8gApToI+5Ux/DWNm6VpBtztYErQWFmZnOL82JPOOA+0WD66vITrF2pKkZcii6LK2PqDb7lAUA1ypKPISSyj7XUUgeq9Io2Kw9CWdUU5mfEDocbKUUrXIp0RwNuYyiOKVcy5WGfIgGnFg9bj2YeAyXcgJIFU2H1AEdl07Cd6OXgEpRTHCVxWFbahT2DYJm6R4sWH+tKHIHZ2pHtNThn1zLY4sD6N4GgiOUIJrI3hmp+bIFuZBqloLMfOTV6g06GkCIQvBR8vnzl8S9i4Pj0ERfJKMN3q9wavEE1LxcmNXAgmOHpUQXxXzFOeDg4UoRGmsjiWh4nNyb4Off7eLL4OTUXDmMUQ0S9Iap2euMg266E0WHIkcXqtoCfS0jnyKqd1Xsb7rDeQSzE8uArHzIEWBH2XRHg2hWpBGTFCG2lThEw3R2w/tI/EPyEFcjB6Ix0K+OTWOJYocTpIExVcofTUpClT+9xBMh+urIz7wV5/BqDZJK+HFL7+Bh+49zPyCZnUl5467bmQ07HP40HFmphfI85zNtRHzC9OUVtB4Dl67n8VdM2jjQvhyNWmxbHkeq954B5SWzVaPfKpL8dSDDM0cSavLk0+s0ZrtoXo9DsxqjuQ5z25kIU5At0jTlGGWMxxmFEURRBMHw9EQpQh+CdEg473D+XEiU8qACLwNmXpFmTi8BgFhjCSVCCPnaKUpiVakpVBqQ7D4qDHH4Mf3VQAIwahaBZN5Qui0MQlaa9K0FTwWPagyx5iEUgxlzd2B1Qlueol2Z4qds238+cH4OcQCKBK4BieCNglKbB2qPMpyhqMcJIipiUmQCCdNorC1XR5IYELOB2KFH+9DhlejFEoryrKoQyqloj5a4Z2N14LXYH3IBz8h/0dtrhODT9v4skTRyBfgAxB6V6JFwNlYVyCy1DHteEsFLzAnnsw6SiUcnJ4iTwyreXBLdTETjRDFGZPiE8HruGEqhxQiu+0FyUDEBnFo5JCYbaeiPr7KRSBhI1ViQFCgeiQLpihjDLa0E1VoqwCZChmIKBYWZ3jDm1/McJhhXcr8wjS3vehasuGInbss/cGI6ekZtm/3zM53aLc1Tz16nI31PpJoEpeyurLO9j0LWJfVcwyEwhcS4uOh2ryGQbHJg8fO8/Kd2zC2x7nNDeYO7kGKjNZwgzKb5eFTZ9AmZTTaZH5mhqzIUVphiyCjJ2mLJGnRbieUtsCXfqLuIUC73QbAZBlaFZQ2Kv0qW3/FScl4J1WEx+NRxmCUxiQJRdKOOQsCoFUBvhK5pWr7hiQjDoml6yqZw5YWoxOsdSg8ykPqSrxOKRxANFeKwqqEc6OS3MKebW04NNYjBdMyoIK78/LKGoePnQJvsTYQr3a3w/YdO9EmDUlNXPD3sLbk6acPXRL8Lg8kAKBVxOhjpY3ETV8GNI9ojS/DgnkZs3RV3T4vBMuaG7PMdV2/KGe7KOh6ERwJYAMHEN1HqsirUZbRanWYYLnxtJTQchZlHWUWSl4vZyWDUYnXKj5PRSeb4FVmKzm9fr/oQ+59GGssYlnrM4yA0yGxhB1T9cp1tSqGgiOKE5bEExJ2VEiy3vBjpWDlPAQlaQvOnCy4+roDrK+vYsSza+8C1uaUOSGuXRQL27qIJHivuP2uWURZhplFrCbp6LjRmo5VkWp5X/sJaB3mNneWM8MRfuYgpt9namaWY0dOsGP7InNL2/jgs6d4dlBixNJOWmhtSNMWWV5QFEH5OByOmJubpT/YwKQJhbM46+JeCO/aipyAHg0QcdjSTlhLao7FR+t+45j3RLfjcK5UUTdCQGzVVvKRM2xGH1YcWVjbiLy9p93pBGuEc4hzqDKj8G0KJyivQvCReKxoBlYxGuX0ksouNtYHSXRfjnQjWDycR6IOoszL6KgVfmut8VictZSXfQBRJQKoSgXXfPFqQSKTZZJqFcbAoMf3+OA+H75vfU7kBprJf0DHhJLxnBhW+wNOn7YcPDCDFRsNFtG2TEGRj3CjIQU5IkI/L9m0UdMswYXWK1dzEOO88JVLCZFQSBxrY8A1f1+lqhpzA9J0XKrkA+fxymBaPuS7cwETVpvnQgQAYFhfXuae997D2RP7eOKRs4xGli/72tdz/ORpPv3xR3jp3TfywP1HKYoRe/ft4lWvu4OHHz7E+uoG3V6P3XumaRUdls+vMr+0RG8qwbtgc3dRRIuMAEmSIGlCWqb084L1kUcry8xsC46OmJ7rMPCKZwYjxHly7Zhu99BaMRrmDEZZCIySoNIsygJrPWUsieZcKLpRWkWB0I0+C8qNKEkpyHE4Uq1rpSUuhCDXmpc4vxpQJgTmaFdgdaDUipAXIbqO4CsXMQnBO2EZE0Sq2I9QAcjaklOnz7Jr5/4Yt2DpiQPdIY8p1ap977ViPRtx7vwys20hkSoXY+ACrHWkdZUpX+c9rMURH8qn1YQizALOeXrdmUuC3+WBBKCu3xdxac0N+HiM+lhAAKalsWVZb7hasKoun9CKR+21Byqf7y0Zvio2GyWc7pcMswC8dTKHCEQD68glwecFdjRklA+Z6U2TmSQkjaw1xdVg1MQwJl+68W5I44IxoqBpLoxj9E1/iGhSTZTDRDOlqjwsY6sSdNaxBd6ilKbV7nDnXXdx6uT7yM6ucPLkeR598CiHnjpFr2s5/PRppqdnKXb0OH9qnWNHDnP0mTU2h0P27hY6U3OcPDlgx+7dfN03v448d7XuxQNljLBJ0gSdJphOmzVxfPDIIUxL2J52WdWGXmbJE01mDEaExFuyPENFu36v12U0GgWZ21mM1pgY5ZmVBc6WQXdkAxatHJdsllP6ktK6sSt4JRrWCxLnvdpvrjI8+2ANUSYEZkmw1wdz4sWWM+ad0OPjAUk4rC0QHf1ObEnSSihVQoaEyqx1f5qN3DHKcoxztFKNyip3+gr7jN3ng/VpTOFnZmdIWu3g7KQUJjE458nynLd82dv42Ifex8XaZYIEqo1e/7wQQCLrX10TSl9FNAr1IgIV39y4H+qonRo4Q364sOABI3gJooBT05gECmuxZRAhNIAoSpVSSAeVtGGUoa0L5gUdOIoaCGrkFAZb6ThCqzajTAxxvLsqDgImJ8VNXl8jPqFtUoxWoFXQZsfNMbasNJJnKM3C4ja+6hveSHtqli/84tdR2hGLi9u57oYruPWu7Vyx9zqePXqew88cZzQasbA4z/LKBq2ZgvbsNK2uo9Xqsrl5jqXCo3WCd8OgsNIa59xEDLtF6BcF1pesZyUm0Wi3hlOGTz3yZM2xeKXQzuOMYpgVKB2y5Git6ZgkZMixllaa4kXTbnewpWVjcxPPMkAtDuSDYaDMNix/NQdhOwREoKriHhCyEwkk0c9AtEL7wDm4OlgrlB/banqtUHhFMEJMsSdNEgb9PnmRY52DogysO5q8EqMqHl88617x7LPHWLzyIC0j+CyYz30M5qp0VNMzM2zfuQOtwNog7pjE1MlVlVI4a1lbXcVozfU33MCl2uWBBETAmMjiQBSuCP81qCsSVlNCuWxRYyCYAHqRmJorfveN59RUVMbdVo/0HhFP0urRSgu0CDpqlL2PNQtNGzW3hPIb+NOafFQgicFJtPlFbmJi3JdKbEJ1yQRkjxWkE4jMU/m2TzohAV6YTkPWnYJxOqqqVRGRVXPegihMOsOozGlPT+Ncj7x0pJ0eN9/6Emzhuf6WOW676wWIgmxU8A++62tw3jDKSowqMAnc/ZoNFhbnyLJsQgGJjFODF0XO+nqfVish0QmlUhhCBBwCJIbCerR3OAdKDJkNWYOy/pBupxM1+g7lXPThJ2q+XWS7Hc4GBVu7HYA4WIjC8WqruBhbH5jFoMyrUpkJxAxRAZCrvIN1kphqbSpqHLnSioDgPFpUyJHoPZQlTiyLC4t0O93aM1Fpj8MEq5cLGKoqYDJSKWfPrZL3juGtDRnr4rYd9vtMT6cYbdi7fy+djtDfXA+u0q0W8wuL7N9/BZv9AVO9GTY3+xiTsLi0WCd9vVi7PJBABfwqpIOuWZ4Jbq3hWCNNzkAYl2JizAVEOVzVnIMnWB0aATwwBqp4ryBMKcXiwiLiNfgqIUPYMAkJTrdB9xj1M/J8iJGQ531UWzcm2foaxKt3UtEFEbkAAVR31+9bk5jqrJpAXhI1RPPt4EilKuem2hJwYf9KgvNU1V8oNV4pzjy29HF4mjy39XVBz1dijEdo4ZxncWmROLOIGpshjUpYWpwCYDjoc/78eTwlrVZKp92Gdqya60Mcvy0iFW4Fc2niNUVpsfjg7isGyhKtfCwGVek8woy5skTpAi0GnYQx5EVJnmdx7aNVQI2VehWwSqSu2FBmVIixAz4l70yhnMfWeQvD84RoCaj2xnjlQuCvt2gszoecBInRYUodIAWlaGxRgCsQLSEdmMBAt/j0409xa8eRlfNBeawAXDA/SoESjdZS0492u8X8tu1s276X+dkFrrv2IKOhIx8NWDlbMDs7xZGTVUzfhe3yQAJVc5VShSDz6HEkX7B9VxxCA8iaAlrgx2osP2YCxmz3uLq5NMSO0IEXhS9LXnfjAWaSLPguSBYyuHqD1/CyG3cwO9XiT9+/zGf66yyvJwxWl9EL+1BGgVeB7WtKJzSeCWOEdalWjXtigzXvpyHbhk083euiqCoA2wbyqh45pmAqJtS0diwyNM1sYy6iAh5pfFZzG91tVVN/3RipV7z87lsByDczzq0dY+30ydrpy9PCe0HpEP0Y1Cgha5GKpkC0RHFAoUWR6GB6dTHhS6IVvakeShmy0ZB8lDHbazE7FZDPqCwZIXhX1haEsDdcVOJKdAUL/iAFZSzrHXIp+FabqhaE+OCX4ZyNdqRxyjnnLMoLZSx7ZxFst4tWU4jdwCStwLI7hy9zDDrUJIguzFUWKZRilCScb81SkjJyYVzGK2xRkrRShMD1JImi02kzPd1l27ZtzC9tI88tnakORhueeuwBBpvrbKyu8dJXvowPfPCDl9xulxcSAIQxF+C9Q7QZWwgqTxE/VuSMobt5rMIIMpbPZXITV0AU7O1qTKV9wrPHj3Lk0Qd5/Ze8Fl/qeG8AluXzK0j/NPumMu6zI9bO9hmNBqTWBoudqMj+N4G3EZteH57AQJOczlYMsVW/Ub1jhQzEkSY66D5r4B+LA1W/lY28+l0hgzojbjx+cQ6iiQgqrmHsdx+GOL7HiyWRDgDf8ve+nl9/128wWFnHOU+32+Vlr3oxpRNsWbK6tkyn0+KJJx7h7JlDOG9JTApOsbi0i+mZBZzyrGUbCIrBaIDzlpXls5Q2Q4mi3Zpl146dvOGNr2PX9gUANnWbvNSgC3pospV1bDpAkpBl2IhCpQlKBG8txod0Ys5arAhF2g2BRUoHtY93sQRZtd9AOQdlGR3aPGIVGo1B4Y1g0BgTZPTClZTFiJZpMfTBEck1alYEB1bN+XSRqc4MxqR4a5Ak6EKUJ1qoQsqy2bk5pqan6E5Nk7RanF8+zaA/4vH+Ohur51lbPs8VBw5w9uxpDh48yF/fw0Xb5YME4qTWOQF9nGxrY2hnyA7ry6KR2VePZbtqAzZYch9DQysOodaY+zGCqIEzHvda+OCxDa4phjhVYEXj8TjlkAKeOJXxa/eep3/qLM4Z1vIRqU9JW73JsWxRHFVsSVNFccl2EXgfz5E0Mg9V4oJjbnY6KJorsWeik8knKiWENGZ+AkE855AatvRamebHLt1NDiJwPilegsfbS+++jX37tyPiyLICJYprr7sG7xXOerKsz6ljZ/i3P/1pVk4/GzzrJCHRKf/4u76Na2+4ntKXgU0XjXjHvZ98gJ/72XeRF5soUdx453V87/f+I6a2LWFiENcyLRbUFAtXb2fWpJw7c4anHn08yPsmAZPQnu6RJCmbm5ukrQ55WTBoGcSkjNDYrIgWCUVpC8ro66GNYEToJAkdkzAiiKdeLHmWYVyJtzlaHFqCXkYnBo9FqQDY3umQ2kwEL4GrSkooVI/5TpftGF77wpewMNcFrWi3W4Eb8Z75+cVQZ0EbrIeNzU1mZ6dYWV7j45/8JAcP7OHgdddy403Xc/rUGQ7s3XPJtb1skIBUMj5B4UMjU7CIBMCPSiNvKiWHr7Hy2PMvlm+qbf+BdaspZGRlK0SDh5ZXdBODNh6jHbaYRuaWMJIg8RnehVTekmg6pkM5ux/9pn9A2e5ReM2KJLjoey7OI0Yh1ocqQPgIlDbSUxVSR0VXzsqxhGi/Dv4AVRpyGwYZ2VIqhZRSeFfJxSFyDfHoJObfd2MZtvJ2s/F5zpVRjRLiACSQtDpgSlfmMCpXaRWUiRPadXA4rNPh0UIoXy4hr4L4AkgY7drNF7z0rs9pD3zTxQ5+3z++6LVfBvxE88D7DsP73lP/XN++g2J2npW+w6wMGXShNz1Pt9tl7fx5yqxAa8Uw69OPTkMl6+ikxdCGJKss7CPNwQ/W8Z0Z3PqAcjBEyhKnNUz12EhS8o0h4sGkiu7UFIPRgKwLKk2xJSCCxdMRoSzDellJcWJiKrPAWWnnmfZrXK83uXpuHz/1ygWuvWEfxaiP1Yajjx5naf8Sf33PJ7j6wJVccWA3q6sbrG1u4HAogXanxbYdO7niyqu5+cYb2LNnD9t37OT0ycs8dsCIYl51AwWoFGYENldERxgIslNTTJYqCWSVDRjw1kb7YehCiaBV+DMCWhQtZehomG0lbJ+d4qrds2ybKVHFkGJQcm5tlUOH1wM98R7rfZC3BW7Y0+P/2XszZVbSz3PO9jc5duw8JzZGnMpTVkcqJNHQYJ0NSMBZPFDGUFXxsdBmreBz0ewExMSpIDgfCoyqWHGoUmJ6QuIKFTkZpx0ffPgZrpjpMDvbpZNAN01IjcFohfaOmek2aNBGBauHDZlwfQK5tbW8HXBMkHstgA4bGIJmW6JYVmLQQpRnQ/CX8iEYyqOxKuhmPv2nfxmSbkb/dhfNn6qWp+HjH/4EP/GTP8VguALeBmTlPVJaxCtanS7tdivk1CNF6xbd3gy92SX2XnElu/fuodVpo9MEpTWJ9myMRtxw6BlaN19NtrnM7OI8xiiKYsj8xs4QRxA3k6sUzBbE6LhOniLv099YZ5CkmJbCzM2gp7pBQYkgSUJrZpq028NZR6Icvc4UmfJ4kxAdxynLkuFoxFSvRVkWeFcwqrMAR4WIeLQdsfvUY9w0NeIDHzjNnmvv4Pqb9nLi+DInzy1TFo6HnnmS0XCdZx4+wR0vvo6zwwEf+/CH2HdwP3Nz8xw5coylbTvYte8Aizv3YAl1EY4cfubS8Pc/D5T/5u3K7TP8p//r9TTrzSGgdFRmOV8DeRXX7V0VLRjk2ureik0N4nJwtTQxP4COSCF+wShIjaCxnDm7xvm1dU6cOkWZZSwkCbr05MWIc+fOMTc/gxJhptNiaWmGXqtDmmiybJPh+RXyfEhrcQ+WhNXzfZLpOYoiRNnlDkpbUjhP4Vz0PYCisOTWkpeQl45RUVAUBaPcYgFrPXlhKa1QlI68KMjynMKOKBFGhZB7RW4hLyy/+ZkNhI3gmiqNQCpvaaWaBE9HKxI8LXF0RUjEU7qSqY4h6aSkLUMrTZjutuh2E+amEmZ6mk7b0Om0SFKFSRXaZbS14AuFE4UxmtJ7bGmxRYj6C6KZ4GNQVR3pE1tQSFqUVrTSFEc7ZDb0Dmujia7IQSkG2RClc1zMJdm3awzVEE57NvJNkrSFThKSThrKyIllZ6tAtWcYJI5sc8C5/oBCtdDzbUTraP4LoeG1Rck7Uht0Ty4fghuASUhVLDJjkpjzryIMCkkMPgHnYzLTVgufpIgotNJY63HWk2cjlC1oKxi6Kiv2WDdUmDaPb7+VUxsnuO7Rj3H0bMYLb7mSJ48e4tTJMyzs3Mn55eM8fO+DbF9MeMd/+hWOHT9FgeXAgStZmFnkYyc/wRVXXUur06M3Pcfy2fMoKbn//vsuCX+XBRIQPG2KMVURhbNQjgoglgUTCSWWo0a7kkNdSAhIle7Je09pG15dzhEyTFfyqsW6gm7ao9vuUWhDJo6scEy1W1y5dy898Zw7e45COY6dOMnhR5e59c4r6XRStDIkph1YPa3IsxbLpWXXtgV6nTbFcMSpU0/xgitfTNrqBn9zrWK5qzACoxSmpgBjLiaCDOKCmUnpWB25Vio6stGIrN9nenqapD0VQpJ9HiLqMkdeKgZF8CP31pHnBXmRk5U5o1JRWENeCmtZyUZR0i8dg9yS5yVZ4SgLz2iY8+wwIz/jcUdLfFFSlOAkx0mJaFiShF67pNsVkrZj+4zGtDsorZhOHNNL02jlaRkwqsQ5Q0DhlRVCKK0jSVJ279nFLTe8iLPnzzMsRngszuVkoxyDsHvXdoo8o7ChGlDhCqwIjpTRoE85egZnLcO8JLeOvPC43EKZM1o5h9clvV4X6bSiVr/StQql8zEhTPTCVSqE31qLswXWpGglKJXEUGWPdR4jgTstnQ35JbwPLs1FgVMK6z0mpHFGS3iqdQ6dGFq9Fqu5gjTKUZHr9b4k7ySc7+zn0+Lwrsf7/+FP8cJrFvmWb/tats3Po9s3Mtpc449+98949uQxPAVzi4uYGEhXupKyyGlpw8ljx9ixfQdnziwzHI4uCX+XBRI4d26Fd/3K7wbK4SzWekQ0xkRXz5ALGtNKo/urZjAc0ul0albfeR/Z42DDVUoFxUkloypFNhrh0ZSFkCQaZQJV23tgB1ddtYdOO2V9fcDaYEBRWFzpmOn0yLxnfn6aLC+C6K4drVYIKLHKc+ixQ3zi2HFGwzwU7ShHfPyhx2l354J5UQxJopjqJLSUICbBJAm4kMDC6hD7HYqehBBUJwLK0O1OIcqjY6RzYtqgEzqdNcRCloMyhumpLsZoElNtrGBW897hCOG1U70EL5C2W2gfGKLEmGDaTBWpSRDrwJZIIvjofmytDR52XnBO4TyUrsAVhGSkZdj0NiZL0eJxVVL+ulCMQykfvBojh6Yjpt6+OMf1P3OQbJQzyDLysiAvCkaDEucLdu5eClxTVpLnlqKwWFeSZwNyG+LxnfVkowJrHf3BgGeePsmRw2sUoyFZNqDMCzbzgs3RIHj95wWF87Tmpxkkmlw8tmXQKTiVYqVAzj2LLJ/FesF5G8WhgKqLwoaCn16R2wLrwnpZI5hccL0ErzRatSiVZW3tLP31EsEzvWuJ82e76DTkmyhtzH9RKMgtLtEMt9+ESWH32Xu55sq9zE51mV+YBa155atfwQfe/wHay0LhDc6G2g+lC9GjWmA0WGfbtgU63bH151LtskAC8wszfMlXvRLvfUgIEXPVGa1QOgxRJGJSJRhtyLOMJOYgGL/gpC28DFqYWJHGs7y8ghLPzPQUznlsWTIcFqyvDDl/dhnvPdkop3BDuu0OeVYyPTPFtdftIE0Vo8yzsTlkcCgj1Qa8w1pL0plhfk/KxmjEejZilEFWKuwggFHuhmTWkzmFdSpUiXU2sO0exFp05AKUeMSVMXMRJCJ1IRDrLKjgnVjoBJN4EhvMKLrVItGaRMcswCoUvfS2RFXzWgZRKWm3SNMWxkMCdJI0OO4ImG6LdKoLymO0JlEmJKhQwdSVJiGTjTY6hNw6haSeRKk67XiSJCEARwcnGa2CTV75oOZMjMEbjVUh048ox/TcDDPeY/MMrYPOQBKDbpngFagS8KoW8SrnpvDMEF1nyxBwIzrkHrRZUBh75/A26F0sJaV3YKGwwsg6hllOkRU8duIsf/TRhzm3sUaPIceLnKyjGBUFXlqUUXmtk1C+bLrXZW6qi/WesgxxAloZkhbcvrSTa3ftYmm0k6lWl3xDc/L8Buv9WZKF7dzKbqRjMAqmEo/KN9nRS5ntao6dX+apo4c4/fQZDvQUS7sXaXfbDF3OQm+WpW1LtNMWBw/s45ljx9GxqlKwREtMpApz87OkrSQg3uewSV0WSEBE0KYFeJI0DZNqLcokGKXrBB2JDhvCOTBpu76/8pwKUYUBYJz3EYFEhZRzzM8vYG1wFEF5TLvNdMsxuzgX+xBwCmM8h546wdNPPYXWmna7hUlSYESv12Jx21QEhoB89l+zA1eGkNbSWrQ2rK9v0O10aLdSSkIKM4mKTUul5Pd469kcDELSiah08zbkRBgWJTb2WdqSLC8ZZJaMgl/5wAke38wCZTIFkiVRK185VLkoWkSjgoT8BOFFhyg20c6hbYl4G7z1KoSrhJSgRNVIUKFEJGVUKHvd9RlqeA7p7sJ1ILXU4o5Wmq6kaAVG+YCYvEOVFnE2zJ0CrTRJYjDKYZxDfElZjminhm6rixiNbrUxpofWkXswKdoY2u0WWgutdhedJBR5RidJkZgHoJW2Qgp2Y0ICVOfQ2mNUEEtCLYTAwivvaWu4Zf88BxdvYWNzjfW1NT7T7fPhj69xbDDAJo58OMSVFuVDIdLcw4YIw1FGYgxt0fhEc9XenXz9a2/jpbdehW4JiUnxLlh2nANlHIU3VK7VWoTNjU0eevhRJDGcmcm4ioR7T5yh09FMz3bZ3NhkRgxqOiQTycucqak2L7j2Ko6fPI9WmtKWVMVuOq2UbqtFp9WJ++xyDyUGTMz+qmJRz7IEqkQOInWdeSH4ZteJLaWR2bfiCiqfg2gDt9aCCFrpWEGwDgOJwBiM977StntXgRAhaadGGMcoOy+AwXmpPDpBNE5KPIEiTfWmsM6Sly76kYV7g6UhBix5waFI292Q3FTpqCgO4+8RNoiHmCbKYp0n1SXv+dh50Bne62hbiKbVyg9BKp+CiNwEvKoyLAULjHgHNociC4gzbQVqi8ZrPUE7glqiSpTiSfIhvVPPsHHFldiyhZQKqZ4JiKvs+j5QJjzK2pDIBYdyMckHJcbbkN7NlSQSQoA1GarcRJUZSlrRWlCibYFxJamE3I1GqZCQNstJlUKLJU1Cim2tNCbtoLTBFxaVpJilXXR7PRiukSQGa12sUhySimZFhrM5GxtrDPrrnF5bJy9GtHrzeGUYDQZkWU5KiEPI8pLRKMdKjiQJU2mLI4+f4MPzH2Lt1FFmZmZJ0g5eoNNu0zIGQaFTRavbRZmQGGc4zMkLmJ3uMjszx9LiNhaWZrGFJdWKx588RFvPMPvqBVIcd9+0h1Mnj7LOPHkx6VoiArYs+ciHPsiLX3o3tiyx9vOQY/B/ZhMJZaArdxQt0G2ldTCKszYGAVabveEbVIXNemp/+OjsClGedS4sdKWDoa4rzxYf+wrRBH2EeB02caRwlfLRqIpihsFIxLRS6yWqvqpkIg6JFY2UD2NWOspq3jdSdUe/9aoAKVDE+HAhJKAY5lkwx+kqWaojFKajkTylqXAKY6xcfav5wduIKyUoVnXQAVB7Z/pYkYgt5sn4Sh4KLyAGbzoBwUhAbHjAjCveiFRhtg20IvG/yo24LMM6SrAiiHWIy/B2iO7O4lUay4w1vBOjAxl4xFokZthxzuKzIebEIfziQexwgPE5dpDhhynzWrHx8DO4YR8/ykkKi7EOk2haPU061UJMgtVdhomitC1azqJ7HWZ6C0E5aB2602V6bpb5dHtA3MMBaZJiTcYH77uPh+7/JFOqy8KObczMzGKHfc6dPU1PpZzxmkL3mJ7uMj/VYte2efbu3QkdGFpFkgjTC7P0l9dAEpamEgrfptU1jDYL8jzEVRx66kmuv+mFdNodnA0Zp3Wi0SZlx44Zur02Fg1y2XMCErX6ZWBJpRGNhmwBVOIiWJpZcy6WXx9CLfraHfciYlHTXbbyiqtq1k/27WvXYUEuOF95zlXNucm0V83xTow1dDB+/pb3qTgIAVAhtXYr0bHUVuVQFYG9AqIJusDYi7F+1zHF9jH4SqoaCDEr8xjgGxi3er/qXm3qhCzhtIwxdFU9l8kkqXWrKzIHRx1fl08i+CtU1xiDxcRspcHUVrmVSRWRU727ja7lCJJ2YHoBmVrEtaYptI6RiJpl55EbXhlcffHRDwJUYcEXuLJAWY9XnsXNVfToFMNsiOQ+IK3IbLJgyHWfkd0Mpd9F8K2CNprT3VlG2Tq3LXa5/tYXcNU1V1GMhvzVX9zDQ48d5dHtN7M5vy2YbweO3rOOXavLbP/E40jSZb2n2LC7uV5ZlHMsHtjPrp37QGCUFzz65BGWV0+xc8/VZOJIex1G/RWu3DVNR2u0aXH9zbegjcFozY3XXc9jDz96IQBwmSCBCrjqdNWMgaQqhBmQgq+Pb21bi22Efpthn1yASKrWDLutEQJVNeI6R88YYTQ2dA2sMQin+cwKCWwtFLr13q3ft17THJMxhnZqYjLN4dar48c41Fhq8UDq7Ma112FFjaPoM45srPqoB1HNznjOIIgM2kQurYEAqmxKtfemUIWA192oGPlZZTxSuv4NKgRLeoOIGdvSpTGWyku05u6qfRPrBrvAEVDG6DsXg55USC2vLISUbgHZKRFsaoAU2iFewKew+sAa6eYGnR07GJWefDTEWxsSl+igrN7Y3MSXjpk0mEVPnz7L5tUvokuLgpxRXpIVOe2pHt2D1/J4f4G1gcJLD6+g0LApwukhmGN92DWN7S6gZtvs6J8BZ5luTzOVmuB7kKSc3ywZlW1ufeGLWRuscObYUWa6hrmpFq1WClGEbhkFzrJn966L7i+4TJCA98TEiHa8LyPQVVlxxi3Efys1DoetM/A3KF3wGQibsOnfbl2oJBwsBpHiRA++qoZdtXE9sdb9Fuo9Hre/qPmlOtYM0Nla4LTJfXxO/vs+OEwpBBEXagzEFFcBCGSMPOs5rICTmuoiUs9vIKc2fK8RlUwA1sT1jSYITlQQYAIUjRFAPObZijhrGa6BT6LgpgBr62CaChHV3Ih3DWRUzUlz/iTk8I9iDj44KaEDB4H1eJ2EefJBUaqkShoadT1Kxi7cIui8CHUDetOoNCHttkinuzEJrMWJ0J7uIa1WdKNWdLSnvW2JTUlwuotKV+mmHbpJStt0oDNP3vX40TJiyzBmFUvYCTgVEJDOfQh2yjLyIohKpWhSEUQZrO6xnA147wc/zsHd0zz10EMgcOedd3H3S+5imFtsXnJuY5O/et9HuGr/ZY4EyqLg3KnTzC/N8dGP3M/+fbvYd8U+EM8jDz7Frj1LTM/2SJRh+dwm3hVMz83gcRSZJWkLSSsJRTJxeFWiaOPJSXSXvNwMzh4uSN1GgSs1hRuRJilZniFakSQGbwPgh2zgFutDzvdgnoqKROdQGLyUIAk0kFClE3BMcgkXEwVgvIkvxRVUeohwPHpMakVLR4onoXhFrRMIV46pbtzmk60yGbmqU6qkrJU+YwL4awmjYiuCW22wHThCpuYK4MP5qjZBAHIfEog0xJBA8cdchzB+z3rYVaBU80Q9VzKuUelpXBefKZ4UT64c2JBxydfm5ipJJzXiCnEUjio3hRNApUAonKKNAaVjotrxHBRldQ94a7GiMCgK1SIRHxPfhozHIh7lBHEFHo03Cu/HhEsAphdR/Yxe/xTd/CyJH5K02iQqxHCI1yhRJNsP0JqdIyszVlbXQ4RibsnzEP/y9BNP8tSTT7O6sszZUycoh+tcql0WSCDPC44/e471jXU+8BcPsf/KJ/nWf/gtPPb4Yf7gv32YG27dx1u//HV02p4/+++f5tz5k7z5y17JmZPn+O1f+z1e+soX8dXf9Bbwmo9/7CGyYcaHP3gvK8sjRsOSr/i623nq8WW275hjMArZbBcWOtx42w08cO8hbr3jSk6fWsN7z+6dXfrrAzY2+ySqjSFW4437zWiDLfuQmJDRpuHSbHR0nY3yvzHj6d2KBJrtUuJCdZ+us9/G7MMidcrEMS8cgW5ryrLQSfxsBE5VQK1UTE6qxn3Ulpex3D7uY3wfOgn3q8oFthpOMOlW2fpqKG2++wSyEbx1476pbolxFH4SkfkKEH2Fk/zkOCtOEkBcQJQ66E9ExvELFcdXP050vZYQ+ETlHUqHvNFlRFw+ZhBSOiIFFfUNEogMWnBpC7EFZQH3P/AQOZoX33kbkiZBva3MeAy1trXAt+dJcvD2NDNnn6A918LbAqeE3DvaIlgFvtUmH61igNVhyYErrqGN5dSJ49x374PMLu7kuhtfwNNPHuHRBx/hwL65S+6xywIJlEXO+WPLbK45XvWaF7D7wDZG+ZD+5iZZdpbNzV5w4bRw5MhjnDl1hnb7lZR5zvXX7eX226+h0xGK3DHsb/Br73w3i9sMo0HCvv37WFyc4pf+8t30phJe/NIXcv70On/y2BPs3nsVe3cv8ZEPfYTp6TZPPH6YL3zDS/nExx7g1jtewOzCNgpfRGpcUhQlDz/wNI899AzXXr+PL/nyV5EXjioTslIKtA4Wic+Bxb+UMrPZxrkK/RgYpN7iURKoNnOQicOJCvgq4G3y+NX5mJudyjKgqZKruorVZtxFU4EZrKQJKNOI4KyuiZmSq5xeE/JJg92vFbYReJVuBH9FRBM5i8akTf5u9tGcNwm+Flvvn9An1Qhj/G71UKv3cA6VEF3TJeoiJGZvjkOPa+M90QAakJSzBaaruOnmG7jxlhtJTAB8hyBKxwCyxhz5FCGnyFconvwwRzbXuWp2H5K0EYKXsXYW7WC66LMw2uD8uWXWdcLy+gbF8mm6JqGwnq/75m+mNzPLrbffzDNP3MdMJ+VS7dIk6H9hc87xyU9/jG3be3zso/fyzNMnKW1JPrJoWhw/eh5rS0Q8O3cfZP8V+/jUhx/g4UeeYnnF8uCDh/nIB58MCSs6XWamOyhV0u0m7NjdY35uGzfcvB+tNddeczV54bj7VXfR6c6xY8cu8rxESQYObrn1Rl5w49W89BV3kGU5zhcEqHO1Puvrvv7V3HD9QbwvortyZfOO4gAXV15u1f5vtQRcrF2Ue5gg5lEX4BWRr9+CECrKXu/2yLpXlD8Cv1Ig0Vszhi2PkUv13LjZ6xqPBq/0GHAaBVJqEaIC5uqvmYsxUu/JtHFqfE/9WX2XxvvRuGfLsWqOJJaAq6DV+4ZilM/eB8EFXcdzKr6f1MQ7JmOJFZcU1KnPggOcQZuETq9bW6lEGvOAbHm2w5V9/NMP4U8doxiNgr4iFjQx2tTJRRbcgDnbxxRDsixnLReKdA4xKfuu2E+n2yYfWbq9Dvv376fVusxzDM4tzPN9P/aPSJMu19x0M4JBaccLX3Q1N964H5RFoRhmnm/4ltdinae0I2xZ0t+wIQ9A2kNUyXW3XMUP/svv4tzZFdbXh4wGI2bn5vjab/wynnnqLAevvZbW1Cw33XwNDz/0NPf8+cf4mm94K/3hBjPzJ9jsW+YXFonSNwqF8yXemVCmapTxCz/3p7z29bdw1fX7IoAWeB9DfsWijMKVCk9BlVlYSSX3BarnPIgqQ5GRiqrL2CIBY0TivY3fA5VOlYTqNSIgFj9R/GMsF0/I4BfgmYgkFODN2CcA8P5CgKo4kIqoeifYaLkJ1ZGqCNAIZKraWio+2zHJBVSQtAUglTSVG6HpaGloKhhrhNF85cpcGQ46ceO5aIofYyXHBOBXw6p+SVSa6pg4tloP50Jdy/DOrraMiLcIGnzUP5QFRmuUNyE2gJCbQrlgEm36YYhzMOrDySeR5UP44TrJ7A5QJaHcvWBdHvJpKJidTlnP2kxvttjINEhK4QrUVIt0qo0gtNttTNJidm6RvL+6dQPU7bMiARF5F/DFwBnv/U3x2ALw28AVwGHgq7z3KxJ2788CbwYGwDd77+/9bM8oi5JPf/Rpls+dZWrO4H3KwSunOXV8yMkTm2SjjLm5aYpywE23XMf+q3dz/0cOMdVpMb+wxNNPHmJubpr+6gy7du/g+NmcMtcc2LeX7TsX0KpLtzfizpfswPmSvQd2YJKUm2+5ittfdDXWW/JCuOPOF2F0wa23X82ZMytoZYKfP6HuoDaK62+6gmuu285NN1+PEk+3oyhKg9JQjASlu6SSo5Wvq/JCyCgTgBwgASmxZQo4jI4Vi0QmOIgLLQdSw0FZFTGt9AH1TROrV3V0ESRQnR9T29CbTN47IY+PHZk8gqgknFYNmbx6HoyBfKtusgLEib6bbLq/ADdM9FsDfgO4qz5ExQIo0nh92fJeDSQw+bYTz/GurIOGQoFSNVHJx8drJ7M4VcgpuLsHb72YzCWKDL5eOwJnUhaQD5GV07B8Gr+0Ew5eg91/NUV5htRqnPK1NcHj6XRatJLWOIeUgU7LsX22S6pDxOP80hzeW0yShByLl2ifCyfwK8DPAb/WOPaDwPu8928XkR+Mv38AeBNwTfx7MfAL8fM5W56V/OovvpuDVy0xNTNLnhd8+iOabrvFK157Ow8/fJQbb93BL/679/Lmt74EJQkf+ssH2b2nxcx8l0NPn+INb7ybe/78I9z+4iv4nf/6Afbu2cWOfS127bmWq67dw8//+9/D6IKDV+7gz/7kHr7xm97CYHOV02fW6E0t8MG//hQ33nQN+w9uZ2NjgyOHhtx617ZQittXJsWQIfpTH3uSVjLN8vnz5FnBbbce5Jmnz3DTbQc4/NQyS0sLbGyuM784TVF6ur0SZwVlCrRuBfu1txilKFyQu7270FS41a+h1n0pRWkdvk5AElsT2Gvq2GDR69ZU2hEuVBp/MQBpUsqmKKMkhkfroEmvKW4DEVRcQT2ecE11eUjTXZ1sfsJYUvURKQTgGpscx0rFpu6xervqeSKMRYuxwB/GsRUPNZpUykrnUKLHtSOR8azJeLJ9fJWqpJhHhcCvyjIU7/NIWH9UEKtKi+QjGK5Dvg5Y2HstescBioUlypNrYIIn6WiU0UvbKBHSxNBrKbYvtllZU2yYaRY7hmt3L9BLW9Fvpaz3TZZlF75kbJ8VCXjvPyAiV2w5/CXAq+P3XwXeT0ACXwL8mg+7+WMiMiciu7z3l853TFiIHbuX6Pb2cPMLd3Pi2Gne+8cPcNXVs+AK5udnmZlbQulpFue3sbq+AVYxMzXH+spZnnnyGP6NipW1TT7414+gVIpSlsX5PYz6Q9bObvLWL76bj37oIdZWzjI7M0ueb3LPPR8hGylefPetLM5N87YvezH/6id/jd5Uhy//6rdw+sxK9DUIy+es5+GHnqGdtnnPb/8pSko+9pEH+KZveTN/8ocf5c67buSJR07z8ldfx397z3v5pm/9Sg4fOoFG8eTjJ9i+Ywcey/GTp/nyr3gx/+037+H1b34Tr33zreSlY6seoWk+bJoKERXyKjRl6KiMqs0GwvhYJU9vlYUbiMLXvHDF2jfs8pVYsoWaK2WwognxG/WJsWkvXrf1ob66rjpfA2dTybeF6qvG3dK4v+qjuq6ep4rqulgstIngVBxWhT0uyiYhtqQqMhq4sHGeygq4BBhXlldj7iDeU+NfAe8d4kOeA3EaX+ZQFPh8iPjgBp60e7ilXUh3Hq1TUlEUAF6TdNP4bIfCMd9p0TUzHM8tG7aFdyNskcfkq0Kqk2A6LO0FfirN9jfVCexoAPYpYEf8vgd4tnHdsXjsAiQgIt8OfDvAtu07+bpveSujoWbHzh6zcwssLe2m12vRm51hf3cRpdvceuc1ZGUJHtpt2NzIWNi2l6Xt6/QHm+zfvxfrNknTGbLBkFOnz/PskeOsnjvIuXPnKV1ON53nzW+9nhfefoC//IuPctW1uyktrKzlnDyzSa83TZKM2Ld/G6dOrYEL/gFCTBfmPbv3bOPY0ZOUZcgB3+606HRnSVo9rrrmSlQr5DHAlmSDTU4dXecL3/BSVtc3+MiH7mffnn08/eRh7vvMp3j5a+5CYjgtLpbBvigv3OAgxeEKFwFDIj9wMXLWVAjCBOmTeN5JtOFX11TIJ/6odQvNjkNQEEbHsU7mhLxgwBd9meq/ymfBNyj6VhFBLrwWwu/6kc1rI80V1UAaDRY8IojmeAPeGOtTvIAuQup2VEwIY2NV4tiP8z7kZcQHPUCFc4lKVUJehUrXo/FYXyJlgdcCtgBbBH2ACJK2UdLCp1182sIrwaoE4zWiQvBZyLQFRRGSp6xtluReg3isFjJLFNlczMvpGGUjys9nAJH33otsXf3P6b53AO8AuP7GG/2Bg7tQKiSuWNo+T/sllmwAaUewNtTX+8qvvYOy8KRpj3/8A1+FJwVleP2bXoKYhBfepRFnyO0axchhDGRZSbtjGAxGaG3waNrdkBT6+3/kn5KkHlcKL7prmR27pvkn/79voSyHJGkPbTzOhVx/SEhTdmD/Tt7/54/wkrtvZnUlp9fbRq83wz/+3q+m3W3z//83f8iNd9zItS+4mdX1Ie32NMN8wMYgY3ahzd7923n6icPceferuPaGmzCJCcrBuMB1SrWaq26w4BJYSe89wyJSpZjqaoLlr5Vf1XfPBHWFSWATopxRUTl3YR/VOGho8+vcjuPzF3AbjdYUQCZPVMjpImc9jK0elZ+D24IsmhdXIkn8PvHaW/tviC8XO2fLGMdQKWyjC7Mfr0elTaxqGIaeIgcXEZFEfYuKTlHG+qBHiZyGVwpUG2U0brSJO3qEtHsG3W6h7To+KYMOt9BIEqtLKc2p1XWeOXmSFbMD3+2xPsg4vgY7pYUySfDotJZRNqQo80uuy98UCZyu2HwR2QWcicePA/sa1+2Nx56zaa35yD2HeOD+BxF9jr27r+HAFdu499NP8PV//w286xfuYf/BLscOrzM967j1thv49Cee5MBVu8iGGRvLA667bT93vuxm7v/Ukzz68FPccvN1PHvkKNrA7Xddx9OPrTAzH0KUi7wgz4dce/1VzMzNgy8prWJzc4Vt25bQuscTj53AJNTJPbwPkYj79i/xYz/9VZw/s8n0TI9e7xWcO7dBq9MDUfzbn/8OimLES+++i9JlGJ0wGPQR7TG6zUvuvp3N/jpL26fYf9UBup1O8AAzmlE+wjlVs7NVawYoiQgaYaP0NcVxNWVvAn6zSYOXr5BKcFMVXRW/2Ertt7QI3HNP/hUzkiNljjiLO/vIhex5df3ngBgaN1wCQzR0DBdcewkkgAdvkWyI3+wQLDTVNTJ5aX1Yxs+PcylZH9olU2Uf2x/R9RJjHRziQa8N0ZumMcwQ69L2MLtZwq4XAMSELRJEC+ehtDGi0kenKw0mwZsEO7cDlJCXHimGuFyBBWdLxATTrsMzzEvWByPy0uOUQpUWOxzg5tsYhODa4FHG0G61aaUtLtX+pkjgDwgZot8eP3+/cfy7ReS3CArBtc+mDwBA4LqbF/jN//pxrF1mcT7l99/zAFdft5unHn2SW27ewZvechf/7Pt+lUOHnuBL3/py3vnzT7CycoKsn3B+5Rg2GXLn3Tdx9sQy2eaQP/i932W47nGMWFho8eSjJzl1+gwzMz3yzPL6L76ZNO0gkjAa9vnrv/wUn/r4o+zbt8gdd9zAn//F+3n162+lThggRGVcwrNHTvLjP/Rb3HHnAbqtJe69/zN89/d8Lfuv3MHRQ+f467/4NAtLC7zuzbfS73t+7t+8jy/9ijv58/few5d++d08+MDTzMy28DZlatoyNb3KoWee5RWveXGMCo6mp9pEOJnfH+fZtIREnD5UTpqYzIlPfwFSkIoC+piy3Tl8w7uxpvoRuJu6ihkp+Ob/65+i8kHwn29Px0ep5hM/ZyQw5g4iIvJbTk5AZtUudoyJe8UXqMEmrjsd/PMnOx1/b0zXuOJzeHkZriLHH2NuqkOhQ+3AUA0r6BmSdgtt0vodFSG1V+EVP/uu36JPlfXIjf1JdKz2JFI7Z6F0QATKgOngVYk2beh0cfY4HkXpSkSCebJ0lo3hgKJ0/H/M/XeYZEd23gn/IuKa9OWr2vtGG6DR8BgMBna8tyRFiqIXZWhWXEpLSZREilxqVyIlLrkUvVYUzXCGw6HGe8sZzGDgPdBo78vbdNdExPdHxM3Mqm7M8BO1+/TF06iqzJs3r4k4cc57znlfkxsILeQZJaEZKpVQSrj0qPBVj0KwtLD4is/gb5Ii/HMcCDguhLgA/AJu8v+FEOJHgbPAd/vdP4VLD57ApQh/+Dsd399BduzawfU3HmW4YRkeHUHbZS6dX+H6I4Ynn3qZTpLRzbqMTWzj2ecvUB+NOHT9Hh791kUaow0C5bThV1tN2s0FlIxJ0gXSVBPHMQdu2M7XH3qMe++9jcvLa3z6Y1/ngTeV2HdoN2srHZSt8fd+4HU8+fjLfOgDnyTJm/76vVtnLVKGtNY6fOqzT/OqV+8lDhIefvgR3v2+13P58jQ7dk+RJwkz02dwPASWkyeOo/MLfPNrOa1lzde/+nUuXpxFUWPv3q186iPHGZ0IqNSq3PfaO327q+h1JQ7mpsGFNytZm9QYl88v0mkbV7orBvvgdLPFvHX6e8a35lrhEPureQQb8+n0y6B70m6ityCuNzyD6cMrnnz//+u+4Kp/DHzRhoOIwtnpn8DA31ccFBDrFv+rOiID1PWDHoToXZNg8CvEunsMxmRoLwlvrUUopwgtrHYCvCrwhVrOGFinHgNSYEyKDSS5dM1KgXVhn7aGPMsdbZxXuzI2R5gcVOx4DwPHb4hQWJOg85xS6ZUrBv8m2YHvfYW3XnuVfS3wE9/pmBs3YyCM4Kd/9vuxOkFryQOvv4+AMqqkGJnYzNhojb3XXcfQKHQ7Ge/+rjegTcIb3raDTZsjui2LNSFTW0dYW6nz+rc9wMzlGTrthCCI2Lp9lAdefxe333mEb3z1ZVaXBZ/52BO8LWqwe/cEqVnmkx87x94DVd76zgf42kNfRYjQoc3ODGBMzvzcMuOTEY8+fpzQJKhIcPylc2zbM8y5s7PkucNjThw/z8L8CiqQdNqC1eUWURgQKIHVgtOnT3PTTTsJQ4kxKe2WIApDOlkXIQzG9LGBfiMS1Go1KqHjTjS++E4YP3mLDji/wq1rROoNVVs8rJ5hsEWBknVewvr04cb96VW+FV2arN/TbRu9gFc0BK9kAMSV83b9DuuOt26u2+IarmYQ+y9dcTbrDKk/34ECpwJMtGZQr3HAKGw4lsASBEGfG8M6WhxhjSsmkv1SbVRRpQmgsNICQQ9vMNalHxWO9i0Q0Ol2QPnko5TooEQuXElyKfTyasaSpRnlUvlqNxO4RioGlxdbzE+v8eTjx7nr7htQSjA/12LfwSqXL61w6MadYEps2u5EHRGC/YckUgYYq7FGuzw7lrtecyN33X0TUlp27tvBIAHIu77nDQRBiamtkySdFU6faLJl6xClSpn3fd+D5JkgLkVIKzh44w5efPE8UJCIuLTSyHiDW27bxaGbdzNUq6IxrC40abVgfrrFrr0N3vKO+7l8sYmUJfZft50H33Qn+/Zv5blnTnDkpt1s2TGDfo3D81/9wCGq1RLT03OkWYaSkR97Ds2VHnhz16DJ8g65clLeLv+NrzzzRSwCXy0sWDdFBsG+wnkwxQcEBZmIWBdaQLFi+qMMbH3mXeENhL1yWv2NNzd3xTpjMxheXC0YGET7B44yEGNc7XxeybhsOBcPgLoiIe9mCNujSOjV/Q+el3V9Az2I0Prj4OtMhH8GQnovIBgoiy5Kq/371ngwEQe+CscPEEnXKRuFCo1BRRHCBqBCrArRWIRShEHoFLktdJOULLvGmYXSrMWH/uQLLCyfpxxZlhaW+Pxnn+Sf/vz382v//g/517/8U4xMBAgT4CSxu25hMV5mTEZgM4zOAcdya6whiAK0BqkyTK4II0dNXSmXqJarbL4XktTxFVTLE9hqx7HkSsHw2BjWXAShMVb3aMoqtZAwHOfAgbJTCLKK7TtyFuaXqNeGCSPJ0FCd62+M0cZ99oE33YrOJXsP7qLbzdi5dxe5zRAiAm0JQ4MSEa1u6vkTvDtr+7wExpNthGFEN81INVgPLvUmXw/Fv9rKV7zmDQcOpFII8p4hEFdMwGIr+BcLD0P5342AfpNT8V0D8/BqHsBVXvtO5uMKHHAAA7xaduGRT3yQhz/6ZyzNXOKfvf/LVIZGnFdnLZ/5vf/A8ce+ThiXeNfP/BKb9x0C4KkvfIyvfeAPAbj37/w4R+98FXmW8tu/9lssLi5y12vfwF0Pvg5j4b//tz/k7te/mZ37r1t3WsanFPuXKvqPpAjtgKKcvGcEZPG79wygd03FfZQqcHiOyYmjEKsNYRiCDSAIUCYiDGOECrzylbveJM034Ebrt2uigcgayfTMGY7csItHH3mWT3zyK8xMn+fjf/UFpi+u0lxrIYXBkGNJe2kpi3GD2WbO9VKu19r4eLkQHnHNNU6NRyln2XOT0mxnvf5woVICFTuyTwKUDNBmfQGPKBpSZJNAxYQRhKEEQiYmJwhjV9KJCMlN7lcTic4DsNBuZwgkWWbJUkXSTUnzjKQraLUzjHZEF4X7WMSSxvg2YkAgSVPtViLrHXfZG2W9ibp+K14coE0TAisk2hEn9Lr+io5ApxwknGZir8VY9N5zzkZ/gG5cr+3Vvr53bv3zNCYfWPKL4N7H1Rtddiv6/xj4uf7gAGw/dCM/8PO/xtDk5nUndOKxr7N46Rw//Qcf4+0/9a/55H/+FQA6ayt89f2/x4/9+p/yY7/+fr7y/t+hs7LEiZdeYM91B/iZ//3f88RDXwMLl8+dw2jD9t171o9j4Z5Przy4SLmCywpIXzVoDUIVk97dV3dHi8IvwHue2MKgWIRVIF1jUiUuEQSSUlhGBK6Jy+aarNslkq6SU4UuK5JlXS9Ue/XtmvAEpFLc//q7eObJ49x9/80cPHwdTz1+kvtfezPTM0uUSmUECilDrMm9Z+tZfXD5VyNML2Yr8rLGWKzR3lU1WKtc6CAcE622jhhC4IptZM+R67MWG+28jWITRcGKAIHCeuCwiN2FUP68ioYTz9Dr3UopXfOQLEpL/QQSwjUrFVDTxj4CwBOmOiPQA6WMcLU6RcfgK24DE9Sv3ALr2XTwLij+n103QNd9vMAF/O9LMxf503/1D9my7zCXT77IxI69vPuf/gphqcyl4y/wud//VdJum0pjhHf+7C9THx3nj/63H2XTngOce+FJbrjvTQxNbOar7/9dpJDE1Ro//B/+K3ma8Mn//CtcOv4CUine8GP/lN1H7+Cpz3+UY9/6ClnSZWn6AgfvepDX/8jPrI8dsGzZcx2ys7b+2oXgpW99hRsffBtCCLYfvJFua421xTnOPPsYe2++i3J9GATsufkuTjz1KBWlyNLUi6k4o/f5j/wl7/57P3oV78X27+9ADGU8tlBkdywD99f3OPSjl/5zMp6/wHWJuvLlooirkOYLVIQwhUq0Idc5uXGNT9YfI027BPZv1zvw//o2OTnKa990Nw++8VWuICaTvOntdxKGIfuvv54o9tbQ5hTAzEZGnt4K50kqe8h18SXCx67gH8T6bZAqbF37bs/d5YpJ+TfZBlf0wdd65+fPRcC6/a68Ni9bhqWdeCk2QPg2UyPYECNfLSSAgoqtnwXQG3Yt3H4xMPGvPI7jS3AGceHCGd7xT36JHdffzEf/07/m0U98kDvf9f18+nf+D/7Ov/lNqsOjPPfVz/ClP/q/eef/+ksA6Dzjx3/jA2Atv/OP38v3/9Jv0xibpNtyE/eRT3wQhOAf/c6HmT9/mj/5V/+Qn/r9jwEwfeoY/+D//iBBGPFbP/5O7nj79zI0sckZY/9kBU4JSQycM8DawixDE5t6l9IYn2JtYZa1hVka45t6+zXGp1hbnOfGO2/npaef4Ld+6d9w71vexvNPPs7mHbuojwxfxenqBUE9Z8cY3/0oC8/V79Jr3/bNW6KoMhzYpA/2CsJavLKT90iFkKhAgXbeXJ5naFHqhWzF0bIsI/5/oWz4f+rmdOkShC2B0M5VQpBrQVTqj0md5wipesis9NxsxdabRIOobvHehsk9aAh6tGADf/f+Kp6pX+nX9b4P7F8cs/h70KAMtgezwXj1PieKBpOBcyiMRO9YEshZ62aeuMKiLAQ2JxOelbc4Z7HREGzwra0HC41re+n3DVwlnhjE3fA+hBRg3HNoTGxix/U3g4AbH3wb3/rYn7Hvttcwe+YEf/LzP+4OYTS1kYneIa+/9429Z7T98E189Nf/DYdf8wYO3e2STudfeJI73u4SU+PbdjM8uZmFi2cB2H3TnZSqdQAmduxhZfbSwMT2nhSOebh/P+EKy79uu7oXFSjFj/30P2E10+RZzh/+6r/jB37qZ/jEB/6MteUl7rjvQY7cdsf6W+sNqbUQeL4FU2AWHnwVQejj9CI0G/S63LMSUnlvNHeaE1a7ZibrukgtBcWC9E8FIqkGnDbhPYEUG75y5H+NGAHL6lKXctmSphnGSOKyJlCKJMkol5yLHccxnW5GGAmstghpPUmt0++zxmvdIbDWdWo50R2HDRjtpLIsBqNdYYfx3y+F6klbAb243BbuMcVEhEGLL2DdhL/a1hdDpWekxAYjMlgluHHyu+9xAyg3AqkTaiohlDl7woTNoeZYUuW8rmGs6zf/zpvwq491g61n4K6M7686P2zf+PXKZ/tHBiyTO/fyY7/+Zx5YHzw2RHGlF/6/7Sf/DRdeeorjj36N3/9fvpcf/433bzzTdX8HYZ8gQ0jl3eaBcubijg12PHlD2xifZHV+uncqq/Mz1McnaYxNcubZxyju9tr8DLt27fLYnQQ0D3/p89xy9z2cP3WScrnMe37gh/ntX/m33HDbHX0cw9reGBECp4JlHagcBqJHFms9R0EvW3BF2AVI4bOHorcwSYTXHez5dBSYQikMiJQiQDnAEIHOc/I8x6hrnFRE5ym/9kt/wp59W1hbzWl3F9mzex8j43WeeeIljhzdTaPRYM+BUU4cX+Te+27iEx/7MuPjZS5caPP6N9/BX3/lJe65bz+PfvMkcWw4cnQ3M9MZW3Y0CMKc0ycXOLB/M5emZwnLMaWwQhBYyo0aWmukcJLhQRCDMH368N7qiK8UK1ZKH69JyxUkGKz3GorJYmwfSFvvCRSTY32Y06M8d34lUkpSIxi1be6tXeAckh8cn6XZaTApmnyoUyY17pHadRNn/flZv9K41cfLshUpxMLtsld+bvDzg673yuxlzr/wFNsP38SzX/kUO264hVfv3cxH1xZoH3+E6w/dRKJTXjxzkVcd2kIkDFvDFkcraxxvx1y8PM2tRw5y+PAhzj7xdbrzFzlw5Eae+/In2XP0TuYvnmFldpqxbbu4fOLq3Pm9MMYbS4e4+JdEkbYTXHfnfTz68Q9yw31v5uJLz1Kq1hgaHWffbXfwxf/2m3RWlxBCcfKJb/D6t74dgVNGbrdavPDUE/zIz/4cLz3xOAW/Q5am67zOXhuzj8kzA8JqL+XmrHNQ7Cc24i4b73+/NUy6gYKwhix3WTBQYFJnLJCUIkUUq95i43gQIE8zuNaZhTrdDq+57zBDjSlmFy+wMAvPP3OKIGxxz7038cLzLyCV5dOfmuG6Qwe5//4jfPGzX0OFbS6dhev2T/Kxv/oM23dG/O5v/TlhtMbP/Yuf5E//+BN83/e/ieefOcexl1/m/gdu4Iuf+wa3v+pmnn3qAguLl/nuv/tOjt58gMZow6PgHkApkHBre5V7boJu7Ne7MiwABva3V3m/73IXAGf/9fXeiPFVa85EaOJYMStiDpVaBJmkIQL+qFXlxlAQ6oREuYak/leI/s/BUxaix7YrZEHDNRAOXG3+D3o61gW9P/L8V/jM2BjJf/0PfPDyZQ5PTPAntx6k8tBnueFtb+Onf+3f8pkkITeGf3LnnXz35Vv57ZUF3vrUt7ht1jWcvueDH+SLi04Q9p27d/N/zb1MMlHjHz1ylr/84dcTSMl/f/MbeODJT/BHp5/isZlL/OIjfwXAY8uX+aEX/5r7O+fWneq/f+wJ/t03v8na8hK/8xPfzf7bXsM7/skvsP/2ezj+6Nf5zR99G2Fc4t0/84vsUBk7N4csf/8P8cc/831o4Pt+8Ec4NBJxYSlFK8sXPvJhHnj7uxBCsv+GI3zzy5/nP/zcz3D369/kjGJh8KX3QCReONXfX2sx2pUPO/xmgF5s470tnpbPMmRZ5hYq5RYEp6YlPQ6Q9/qqVOAYjGTBfuyB7zRNgWu8WEipgGeePsbOXQlbd25CiTpnTnYoVw3NVpsgKlGpBVx66mkOHTmMNlCuVFlcngPKnD09zcgwnDt1lsX5C1ixwOzlOcIwY/rSJV54+ixjUw0uXZhlbmaFerXKxfOLtNtLXDo7TdLRvOldr4ZcImwOSALf9OGkvQtvUvYFf7wL3+ON4+rAodg4ca7cow8kXwWALEKJwvdwK7ZmuiW4odGlY0ukVjAUJggCpFXoK8ISsYFnwJ2L8JLv/WBfXDEYBy5k4xGxUtBIuyzVRtj3H9/PPk/E+Z+s5cH6CrnI+eW/+70s5iEpiiRL+WRseNedb+NxkXJWJryc1Hj1HW/mF0aWaWWSFS35gImQNuQ1976D3XkZKyxfBb6KgDvfyzjwi/48brvzvXwF+Grvvrl+iF8A8u//SfLquCvRxYOiQvLWn/h5PLJBACjR5GIb3vfO1/KOd76FlVQzFeScOX3BSb5pxdu/7wccaYgxqDDiR372XxCXSkiv2WiFcPdTFDkEZ0yNLYA997s2lvyKuoqrGOriLVkoLxc0dH5xcvQlYC3KCnI/4a0FIaVjqPYpyiu1O9Zv14QRKJdLvObeV3Hw+m1oY8hSwcSmYcYmQl585hL3vm4fcRhz5OiNeAo3Xvemu4hKd3D+ZItqo8Sdd91MFEve/V2vo9VaIcna7N9/kPm5JnfefZDPfeFLiGA7YSlibmGNUjVgaGQzWhsaI/WeG2cLWioBReOHx2idFzAgelK46leb21djB+pF9wP7b5z4BaYpeobGYwgy6JFkTkjJiioxHq+QiwqvipooEaJF7AQ3bIpzF/vXMnAC/leBxfXLu3z8VQzAK15ccb7+Gnv/K65bgJWkRJxNQxoix2BYMjHByiK15jydJONynlCSIWEc8HI3YGq4hhWSlhWMCO8l9bgZ+zqIV9us90xcuGbWvVbc13Uejp+swuOjmyqwkIUk1lIVAeezkIxCx0L0MIT+jVzv9fW/xPaMrcXH89IXr/XA3sJjGLhxV7n/Bd7RZyayvbGhvHeRGSgoJo21zmhJ6QV73XjRee4xsqtv14QRyDLNgcPbmZja7Dj7VZcwqjK5qczUxHaqjQBhNd32GEHJiYQ+8IZXI2UO9xVy5Ya4FJNnmtAXT3TbGUEIKtB81w/eDwLyTKNUxHu/r0meJUAIMsRqEISO9EEUBbHWc1n2H956gP3KbMDV3iu2YoIIMTBwGAwd6AGCg5urcchRQhHHAZcJeDkfZnMe8tJCg731Ob6aTJAKi9XdfsXaYEjQPwlnVPCKO8J5Cb1CqL4FWre/P9Hea8UE2jU8zE/8wUfA2J4xsdaSWsulLGbVhEyGBikMC6szLCzNo40j4DTWYpMuQses2DKt7iLVkVGGIwgEaMoIBEYWoUvvhqzfBib74GTtdUuum8GFVXBhnbYBQgacbga0hWUszCirnPOpIrVOQTgQLlRyCstXfr3Y8EufY8GRxfRL14tqDn9/e2In6x5W7/4WWYZu0kVrTZomiMBJjBVGrZ1k2MjzT0jpFLCV5zDwx8myb28EromKwQvnpvm3P/9bLCzOIhXEccyv/conaa6t8F9+70t0O8t84+vH+PBffpVP/PdvYDSeLin0KdeAIAxJkozcaLpZRpKnyAi0sGR5TJIqugkYIrLcEJWqVOpj1IeGqVZjtLYgUoRyN0sI0dMOKFbjAh9w24Z6gg3ble+tXz2+3Wek7GMC7l+AksqBPN2UE0mZE91RfndxG1/Oh/l/lo7yQnscIwRCyQ1fVXgDov9P+skh8PTiivV04Vc5z0FsAxwJSvEWBcjo/rJCcElXWDUhLULmcsVaN6GzMI/WGeSCNNdgXDOMMRqTZejUsNrOQJTIpGBZe2/GDp5ScR0Dt1T0L7ifs8H5DrYA4Tbc/l69viFH0JGKhJCaMJSUYERKhkWCsEVbrleZusqTXGcU/OQsDH5RuluYIQE9CnNXzrqxUrD/U+AK4cIw6oeF/u08z929lv3jZlmGRXj+Amdu2q02xuS0O38LjsH/LzZrNeWSQoHTFyAgTVeRCLrdZUIRcuHcPO94x33Mzc56V0hjrWvKKFZOpQqJb+tVrlzaD2m8LkCAk30SSAnaGrS1SBECTtdAmMiPMbEOEARXF14YgSINNAjkfftiog0r0StsrtYBoF9bYIyrfhTWaRpORRkPNGZ5xkxwKS8hSDE26OnoBRZyOTBR3HAamOT0KASLCdL3dF/5/AaNmgLyDTQGhdNgBZxMSiByjJBcMFXU8gqlNEFLSyQDAhUTBRGlUsjK2gq5ydAixOQZs90SVgpyPE130SHZu4/FhW1wzYrXiuex8cR6K23xugUDsyYmR6KxnMxqBBl0rAFdIpAtLwEvvvMT3OAt9sq/VX9VttapF627aT0wVlx5POiVkktfZWh8pqiftdJgJO1Wm1zj1KWLJjK/eOWvDAlcG0agWqtx9OhNPPX4i2zesZ2Dh3YQhmv8wW//JQsLS/zmf3g/W3Zu57d+/aPcedcuDtywE2sFxjfBuJ72QidAY61ECeO0Aq3qlej2xodygZQSjpvNZccirE39+Ar7N9DQNwZXPP5BNxM24gC9ON8zURapm6ttGz/rWnXdwFXSXav0eeNt5TI/MXacv2p3+dPl/WRSYY3ygHOOEWFx0PUDrLdag8VRgwnrKa6KyXU1l3tgUq3ZiD/6jV9FdlYxYYw99k3+6NHTGz5XTBmfEhM5YmkGsTrNSG0YKRVDo8MIC512m5W1VbRxdSFWBbQbm8mlo8eyVg4YKXulLb3a7bQW+9LX+NPtj5BXR1y3Xi+U2fgEXRoOXApPyhxhXVbGzJ8n1h3qw0OsdhMoFgZj3AodR6yrSrUeR5IBq41dhEJ6VW03YV1BmmtDFlKC7ROT9gzbAN26eyKeUAYQQnqKMsiNQQjbU7uygNUGISRBqHrjz312AxC5YbsmjMDmLWN8/w+9jtm5jKgiCQP4l7/w90EkWJPTXOkyMTnG2fPT7Nm3G4FAyYiwlJN0csKgRI7G5F5LzkZYEoQPFyzWu/YGJQKs9fGoTZ1ltQIlAiSRi5eFm5TGGN87UACDTqzU9RU49FV6gOdqdQFQhBLuARcVbBtDiMHP9YA1947/4QpMip+ZWePPZnfxqBjHyBBDjlDGZZRtWPjr/eMUIUDxu7WAxgiFyl0TlumtmFd5QAVaKSVLB1/PkpJULr1Ed2QLv/i5D/Bvv+vtFBV6wrckKxFgMUiTsn/pabKVeRaXOoyObKZcHWX73v3MXL5ERgnbycm7CamQjDTqbN62lXZjE7PRGCezBpkxLq1mN5xTH43sYRkCC9ryi5/9U371xvfS2XkYG5RRFvSgFoE3qMYUz0cyKg2vqa6ypdTksdmYpdUlVjuW0S07WZxdQQjXjKNzjRQBw6Mjzvv0z1AYgbGaRMYsHXgDEzPHsSYjL/pIrHQdqUJhpcDmrJ+bhYdSAA/+mk2usd4YSCmRBoySuOkdYAwIpVxXaOBDSm9whHJBTPa3oRz//2JbXenwsz/1RwxNSH7+3/4g58/O8pEPPcrRW7bz5GOn+P4fvpfFpXlOHV/h8JEca0PW1pb5648+x133HuDiyTOUq4bte/cAGiE7CKtIE4sKc4IgIkus60EQThUolAKtFUqFWDIsCVJU0Eajc69fiaHb6fTiOrAYDUk3IahJsq4giDVKuuqsjXUBfZCvmHhXbsYYtL46JfRgXUFR/COEoJ1oXjc2Q96xnF+pkYVgi9oAtzv9P67WWCR6zDMGhRCv4Cu+QmbAGRSPml/xpv9O339fbp4nOHuMtdnL5Ebz3MsvU640OHHuDIF0XZ1CCZQEtKGiYhqiw+7JiLQrUbkhY90CufEm9X/2jJjbU/YyFWJ9/78Y4D4Q0jkCUhCrjIbKqBjB9lKbNG/TUZAL3cMWCo4B/EKBN9y5znuAb4EB9B6f9efivQgbqP64eIVN4HCWYgEqFh8L0AszFFZrChYDhPVdsP2FxWqNspCY7BW/65owAkIItu2q8No33kG5XOPRh5/k7MkLZOkMly+v8MXPxDz/7FlefPECQdzidW+4k699+Xne/8d/xejY23nkq2dpJR1+8p9tpVIpYXTII994hg998ONsmhrjhhv38KEPfpl/8BM/wKvuOUi5ovjjP/w0p0+eYmpynMWFJaq1SX7sH7+JLIfPfPwhtm6te1esGF/OfT535iKPPfw8t96+ny997hne+3fuYWrL2CuG0kKIXmnyxnBgY9PSxs8V+xReelEGO5NLHl4eYX8j8yBiRF+MY/AoV8F9/WTopaiE5IphsHFCWdzxfSGMkAKTe41G9wE/CEXPvTUiR3TabGvNUNZrtIRGCEm1XnF6esKVfAdhn01nuArDVUGytEjStRxfq5Dp1KU9N15L4RkU2Yzi2gZCNFGkV1FFyV3/+gbuZ2EnUy1JbcaNQynPzWbkgURmisAatMjASlcLYH0mxD8/XXh4tgBb3bPW2pCnGVYbTO6qBrGgQ8cLYNdZioHrEkXgWYQf/joGAFFjHQArZYBUypGJSNErUCrCgDRJ0MbS7b6yJ3BNZAeSbk6lPMmWHRNom7Fnz3YqcZlSpOistcEExHFMFFRoNbt0uwmbtjTYvHmcl569xI03Hea2V92GUgF5ZtHGxWYnjh1nevochw9fx8TkGLfeuQ1rHUg4c2mVL33xCySdJiYLaTZnXUeWFRw/Ns2F83Osra46odyC4lrAxNQQD3/tGEvzy3TbLZbmFtdN7KtlCwrHtefoD2AGRZfh+vxj3zA4cAmK/nIpBZsjeN3QLBfzmAyDYGP6R6z/d8U5WT9B/Aq3sXy1OEbBcjOILRT/13nPO3GH7K+6blFy3kY763D5/EW6SUJULlMqlSiFIbVyxFC9QmOoRrVaoVKusmt0iC0lRbubc7JpWdUZCNXvhR+osRcFuj7gLQ3+gGJwD4ZYA9eDzw70PuNCjsUs5vGViB2VDjLP/cRTyIIFWojez6L6zxbPtDiUl0JXSqFUgBMwKTAmgxGerWrdc1r/7ApjKqV0xyjsnO1jCq7ngx4ehnDguFSuyc4aetWDJrvGPYGxiRpvffetjI42kIRs2jrK2955DzbM2bZ7gRuObqedp4xNbOHQoZ1EUZlSZQhtQvYduB5jLDExH/nQ19m2q87uPfuJ4oh3vOeNpJlmaLTB/a+9mzMnVzl18jTf/XdvQueS6647TK3e4PZXHWRmfpYkkYyNlzh4cDelimZm/pLLJhQSYdYSRZJyOeTShWWqjZB+nxpXhAODW/9xu46xwdXfMQk5IxCErlYBCpDQjVljBV7UmqfXyvzZ3M1cUlW0EFgtrzTnA/Fv3wQVf3rQTnqXseDLG6wHsHpgwqwfqML6+nfvejo3tQhki2OGyLJgubKJ8thWbCsh6i4j0jaBsQQ6JdYRcV4h15bDO7awa9zSsVWSdpNn8wgtFNpKb4hhwEr2wf7CYxE+RHFwOuBZvWWIFboHMK67J736AmcUUiHRoeGmccP754YRMkJZS5ZbRwArlWOHEALZ8+zoGT0hwGiNUa6+wGlZ4oRqgwCrc4QFLZ1Yiy1GRm+F75+go23zYC+uIa7gqCjGmBQhAo2xigCLVGGvRsRYi0SitSEIA8y1niLMM0upHPD0Yxc5ctNOlpeXuOG2SVQYc+lSjV17NnPwyF4wBp25tuPrj27jt//rz2FMlzwNcKnCPZw5ucxQvc6m24e46bYDaNOhFFe598FDpN2QLItIUsF3f98baLXuoFyOKFcjJrYOE0QRaQ5HbtlBqaRYXFrFaO3SkWiM0Vw8v8jd9x/m0OGdfO2rbTZt3rTOdb/SCAicTo9w2vV+gS0qwYyxLCx3GB6OCJXoK8WoQaPicWLvLaQi43TeIJMWK0PH8cUrxPVXC1NEfxL1XNLB/da5Ld6HLfbx15dpg1Drh88gUm6NRkvF2vB+2jc1kM0VGk9+hkZzGqk0UaowbcP2XTtoNduUkzU2lzbx8Owax8f2sRJsx9oUYVIsnnKrB3bKwipsOE+xzpnRHsy0g/v13hdexNj2jEhi4bnWEL9xvsTZ3KDzEuNx6oBl760VBV1QsE+6zzo8oK9QTMEwLL1AywCmIJQamPhy3Tmtf0aD/Bb0ZM/B4QVFybIQwvEMWOtCLVVkH5znUatXuby6cPXxwTViBObnlnnkayexskl7dYFPfvwpSnHOrXce4ZvffIrv/Xtv5pY7r0fnAkGCsRq0opO1EcLVEQuvHLxt5yRCZgSqhNaWUCowIUMjw2gNI+Ml8gx27BnH2CpCROQ6Z1yMIIQg0zl7r9tJu7WGVJIsM55j0CHfk5uH2LdvF7VqjR27t1EuCxB9D+AKMhBAF5TeFPOobyiMMQQqIAwibJ75z/aPBQNsNNZlOUzi3XktAE2P8O9vtNn+/y2+FBlfuFJMeAZ+ckU44QyYQoqBykToUZO5eerAQRPXsVEV2UjJLzxHqTXNVKmGQrO42mTbSIORrdvotLok7Q6RsLx6+whfmm/SVTFpWAaZIXODRfXwlSs9H3eeFov0LDpF3O5ibNk3eAXGUZy8n2hawIoos5yV0foiVkjGhSDLixV/vYEvynmLUMAWWSBPGmqhB9Rpo8EYhHKT1BmIYH0Dqjdaxe/FONLaqU5p7URsjU/pqjDoQzbFOcl+GCmFRGiNNJosucbDATBcvHSMmek1Nm8Z5VX37uWTH/0mB7stvud7H+DCuUXuusfQSrOBKisDhBgjKXTkhSxqAkLHxS5xN1NlGK0Qwn3eWIO1LkvQQ3utUwqWgcBa6ceKJS6FGO34Ca0RBEGICCDVCaWKwxAGAb6eMaC/2mv6K4dzmn2Zp7AoJUjbXZayjNExpxJjxcBgG/i1MCrNTJMriSk4D17JC3ilzfamO9IYJ7O2bqkccJN7rnZxDiCUdBWWhevqHQU7aPysxQqDla4Iq5EvMk6L5TwlSmFubYWJ2iiVSoNFYXni7Bm25GMElQZ3xm3e+6ZxmlpxftlyoWU538w4v9rlbMvQEcrXgBRRv0PGrZf5Ej4cENJPUqkcS3BxPcVtsJbBbj4hBcaX3hK4ZjIpBNrfn35k1Dcc9O6CS08q4c5HYDHC9kqO8erTTuRQ9fgGezd18GdxVOGOWhiBwugU7EJBEPSvR7jKWSUlymcSjHB5r1zrb7tEXBNGII4Ddu3ahRQXue7Abh771gluuXU/jUaVhx46xmvfeAtppl2Rj42A3D+3vhvs5p4v+hiIrfpAjgWUv8/91VZ4F9PiXSvjkGuEi9sEzppLKVyRSI8JsM8AjO3z0A8aA2M9/FOslBTupyeEEII01cwvtcAq0twwNbU+xYOg191svCua5YqCT9oIg7Cqn/K6OiTR37yn4RBzizIGI/xqJiUFt4F7aRBUK7jxwCpJrvursUCh0Lio1dFkSSxWGWKTMNWdZuvCcXI6XNKa82urYC1L7TW+8NTTDG8aozI1zFI3Y3IkIoxjhgLNSAQHRmPqtRphEHNmucXj59b478e7PLuS+W8MfIGYRcsQa7o9wFIpkGHk8YA+l0NvwBS/S4uVrgTXSFdKKT2UL1UIaDd8pHt2kn4TmMX2SFOs0CgDRgTOQxWKOJBOPsxY9z0GbBQjRNDHNa54Rv7YXnIskLKnDWGQaAyd1JHS2swiKn0CWSVAycDhAdbQTVKeeOIpKuVXnurXhBEYGRvitW+6i27SpV6vc+urricuBWBjmmsLjI5tRmfCW3hXrbWReWdjA8/GrT/5+xPsamm5Iq51/dpFjtb3g/uuwr4ykOiZk6K4qDhO8dAGw4Te9xboP5LWmmWtaVFBRrk+4o0P9EMCdy7WCIRvONFF+68YmJwbR5O4yh/rkHR3fNMjEykQ6eIM6TsCPRNTGBAcrXV/KcNIhdSpwyiQRCpnTz7NkeQiDd1lOVmgVY9ZHa2TJF3QMDk6TKNaAauYmVthYmKCxugYlXoNIVyxbqfTYXl5lc2TU4xXYt5xY53bd1m++4NP0lQCjHKpPK2BovpmoLW7uHTEevtYhF2D90l6iyvALSg5UgVOj3JdLYUdGCsD4ZsQSCFp6JSRpWOkKxc4Zg2cOkN9eIKJRow0KWEQ0LGurblfr9AbSP3nb12VapZnvh1YuxZhCydePsn5c+fR5TpyLMZ0HQu3UoEfd66gKVCCQwcPcuH8aV5puyaMgJSKUqVCuVrCWkVjeJQgsJgcSqVNSGVBaLSJEDJx1MuwzhB8OwOwcbuys6//uyhWRe/2ebPhrOwAn7yS0oW9Beuv7TcXFUai6Ki78tyKIpCU4bGAQ+EYWddSiZ0/YqTt4V4FFmARWKMxhGTaqSUPeu/9WBd4JYPQm7VFh5rEaBBSrdPgu+Kzxcd8JtPlw8OBRdUitasDEAg2s8KbywvsDxPmljIunjlL2u2SWQNBRAnF2Ogw2zdPUY1jVltdto6MgrDIOCIuxWRJF1WqUCpVaHdSlltrlCtlyuUyuyYlP3HTBP/x2SZaSiDv4RvravwH7knfIIj11zZ4gYXl8wsAxuf2wWEKPhdkraWYvj3OIiFQVqKVZiRKef14zqePz/Clc3N8+bHn+exfP89P/sA7fDTrtQc3KDhdEY31rqNIARahAWS5pdvNEfXQLRzWE5tI6clHLKCpVcrs2b2L6cvneaXtmqgTsL0HCBR8gCZFIghkDDg3VQYJWEfOBPTd7gF9gEGD0EdWrzQQ/Rz81fcRvh/bHduPCTvQ1FMgxL6UUwjXvdWXp3Iy4kU8V+zbu0YRIkXkhE4aZcbH66ggQPeosPoeiyvEcZTSnU5Ku530V24Gzn1wkF8tLPArfs9gAAxc05X7+W8vmImL0MAC0uWji/2NFGAVNd3kXeNd9kcpMhJUwog4LhEIqMUxjUqZ+kidyS2TyDCiawSqWmZsapQdu3YwPjFeaKUSl0pEUcTI8DAra00sISGaJE05OlVmUzlCiMz5Yyp0eXP6HR6D/RcDN6h/jRs9JNvv6rNWOOVhqXzpuMs2FCXovXFDP8wTNkRpQagidABaWmRUQlTLLLWX+NxDXwepXFWHgHUFXuLK0yyKg5RXmsI6Ah5niA0YjRYGI139iMRpEigl0XlGICVRGHDy5AlardZVBoTbvqMREEL8P0KIWSHEcwOv/aIQ4qIQ4in/7y0D7/0LIcQJIcQxIcQbv9PxAdZWW8zPLPHSc2e4fG6W88cvcealiywuL5PLlNWVNWYuLWAzQ7edovOctJsiRH8CFjet+L2YkFeb7IMhRG/VtgOrgQBrTU8jQAiL0xNw7ZtYemwxjv7c1c0X52A9wanw4M26FCI4y13Ihvm4WyqXh3aAoo8dDW4AGrw2oSCOAiIVgiy666Q/nrj6xC+uqUC3fUrMaXi4jIcpVr++y9Cf9D1abEEBZQuTO6/E96gX4U0sNG8cbnLTqEQKQygd/0G9WiYMQlrNVRr1MrVyiTzNaHXbqHJAY6hBOY6plGKqpQrDQyNgBWEYoo0mLpeoxGXaqy2MCEk6CfVQcv1wyVfJ2X6tUigQsqCIU1jlKuus6Htx/clW1EH0J6MDNf0ioYvaAPe2Ku5h71kW/7mOVCs0uZAoBKEMsEagrEYJgxaG5dU2khwZxGA0/dTnlcVaVgivieHHkvdxjHWVmlo76TmRhc6js5YgClEegxK468hyw8unzjIxOv6K8+9vEg78EfBbwB9veP3XrbW/NviCEOIw8HeA64EtwBeEENfZb8doAHTaXT78gc/y6GPfYmrzdrIsBdvlTW97M/c+eDOf/shTvPD8C7zzPXfz0NefZ2KywtSmSV73ltvJsquX3G6s4rtaXf/GzbmMnkzEu5COlcXtG0VRvyJLqV7I4MIFSZ7lqCB0bu0GDYHi53qvw2746f/yvQqDxskKSRgEBCpYTxVlbT+bMHgfeis5V4k3Wb/Ke8PWP5fBuLS31vnDut56lHCAIoAwSBsyrjrc2TBE5RLVqpcsr8Ho2BiddptOu8ns3DxLS2tMTk4wOjxEiCAQlnIcMTU5wdjEGKVqhWZzDa01YVwiyzRjY2PMzCyQZTl5llEONLdtjvn6jKTTt0/0HXScEbDOSNFTadqw9erC+96f80wNRZquUKJyR/CTrMBjinBPCLRjpqHV7dLsdBxnQpF9EoI4DFCCAXrxwisrFqD140BI6epKAjWAQQw8X79P8VocRQgsSoVIpYjimDiOmRgdZnX1byFNbq39ayHEru+0n9/eCXzAWpsAp4UQJ4A7gG9+uw8NjzRYXe4yPzNP0mmzZ89+Rib2MLV1gjhWHL1pD/Ozl5BSkSU5WVc7+mZC5w5exd0fxAvW8f6z3mMoJlTPjbf9mWOt698vdAgd35tEScdBiK/g6ztU/dV4cPUvCEMHlWy/7ebnXXHeSimskARSYHpKNMJNRueWcIVrC/35vNHe+ZXCWoNfZvwxBq5fDBgoO2hk3P1UgSQvaNawIHJGJVSVIFYh4cgIxgparTW0zlhZWiQINhOEEZ3OWU4eO8VCrc78pQVUHLL/0H4OXX8D1XqdKI4ZDkKCIELKiDCSjI2PsbjUJojK0GrS6SS86fBm/uT5Fc7nuaNOt3h6MX9eQdj3cAT951RMvJ4Ai8eYsAjrOIFdJsjde2O0xwGKW9Jr53JpRVO0mTt+ChUGdLOMTDv1q6KOP1QBUoi+aGnB+UBxPuufVYFpWH/ORdixbgHrAzPO4PjXgjDCGgilwqa5l8u7+va3AQZ/UgjxA8BjwM9aa5eArcDDA/tc8K9dsQkhfhz4cYBKpcGhG65jbLKGsU2ybkQcKsLEkSU8/K0nQMG27VNMTmxl05Yy5WqZvOdg+JQXtjd4e4AdnkeOAqATvr9/8GT8P+tqCNwC7yaYCyd8aIFXfPExmLWyl5M22iCl6qXY7ODTtP34ThTvDyDXg58ZRNyFAKm8dJm/ykC69JyAV04xwZWDauMA866t0D48GLQYg8ccBMsQCAxW0+trLw6uteBAdYkwcOkspULiqIQxgigKSJOUPEsZGhtjcvNmzp4+x+LcAlrCvgP7uffB1zI2PkagAgIZEcSKcrmKCsogArQRDI2M0+3mSBnQaiccqAXcu7PB+08t+NhJOPDSn5m2LgPTj7u/nRH2Bry4Lm9flZSYXPeIWt1hnHFQ0oeD/kb5shSf1ej2KreFcKXGcRS5r1Jivfvfc7yKMeJeM8JVgGijXamB72GxPrOAVy2ygLSWpNslzzPvaUjSLOPc2QtMT88xNlp5xSv/HzUCvwP8sr9Vvwz8R+BH/v85gLX294HfBzh0+Eb7lnffSprdQq4hz3I6TcPwmMJgec/7HqCbpoxO1Hjru28jLBvXpWYFrmCo6wutDMJKB1phPcYjezF8Yb37/dre7SdHiBhjJMZ2kCLAWo0SCp0psix3x8YJPRapSuFz4hiBUhat/VT1D9PVjTvARuOMBLoA+RSWFFf3UIiO+rIfPymNsQSBWzkkYHyc2M39uaB7BX/9gWQHXMwBt36dtyQcDuAzHMbmIFRvoPc+M+AV9dxarGseEgJsIYfmVsLraxYdBFRrVebmVyhrSb02RJoqhodHKZVCWu0OYRSz/7rr0Llh67btTE5totYYot1sAi4NNju9zJbtJaw0xLEiyzVBGJDnWS8NNj/f4e69Q3zo5SWMMoTCkksQXhmpwDos9CbYwC3gCkisMOjW+jHgLIG2/VYfvAclhTOE0qdYDR4/yDTW5LS7Ca7GUVKY8DgKsVZiQomyAt2P0/rPzBZGzAAagSKQjvBECOkMQhGaWMcrIIxxQz2OepoSWZYRSYW1msbEGOONCsfOXbrqXPwfyg5Ya2estdo6NOwPcC4/wEVg+8Cu2/xr33ZbWVnj9KkLfPOhk1TKAWeOX+LkiZcJlOLkSxc5d/IiI8NVHv3mcdqdhHp9hOH6FAuzq6SdjMW5FUymaa4kYAStlQRru2RpQp5lpN0MISx57ioFTWbAageiGIkkQticMLBEQRlJgJQRKohQyqJU4BtIJIECjMAQYqUhLIS9hW/lVClI9/CkCFy2SXiDYQBh0FZgiSiozowtUk84wk6PCgZBAAS+N8ANEm1z2nmGEUWK6ir+/uCf1l7l7+KfAZuDyXsxMBbH1mQHDInwy5OvqhQmxaqgt+JKa5kQLSaHqgSqRK0xwvDImOMbkJJcG9aaLUbHxhkZnWRychu79xxm73WH2bZjByOjkw71RpNnGZ1uhxePvcjXH3qEJ598gcWlNeI4JstSQs8lqaSgmyUcmqiyqxwgyJFSI20/UyQLvsXiplg7cHOu5kI5b8etD/1waF09ivfWnIcoei67i9+gSC+3k4QszwiEIypVFspx7G7xQBx/BU6zwUMQPi9r/CImKIrh/Hd6a2ARxOUypXIZIYQLV4WgXCrxmlffhQz+J4cDQojN1trL/s93A0Xm4GPA+4UQ/wkHDO4HHvlOx8uznBeefYGHH57mnnv388XPP0WSLvHic6d4+dg0Y/UhnnryJV58+TTX7T/E9//YfQRByAf+5AuMjFR46KGH+F/+yQ/yu7/1Id71ngf58Ie+yO2vPsTlS4scPnSAr33xBd79vrv52tce5uD1e/nGQ8e46ZbtTF9osmvPENV6lYnJUZqrOUnWplwe4ejtWxDSoIISYRwRRRFJ0iFNDWiDECnTl5ZYuNRl98ERzp6aY9v2KaYvzTK1dYxKucLFC9N0OzmNkZi11Rajo6PMzS8xNFTi8qUF9h/ehQpyjC4sfzE0FUJ5jUCRoYTqqSenuSXVPjPhV32x0QYUPNqDK4z2Mai1jjGliIkp8AHbm/S2F1uzzoW2WGyeE+gcKwsySxBCcqDq2m7DKCIsVakNh0RJF6OhMTLG4sISQRhSa0jK5RiDJApjEIo07bC6ssL0xcvoNGd6dob60AhnL8wzv5CQJHDffbc5bGE1od1cI9eGrrVsLUW8++h2fvWbL2Fi6Twt31rd81x6QE3xv4FJ5C5gYOK5ldW1Srv7qweMtFi3v8MEhLY9eMEYiy4KxYzt32YDofQ4TA9m2WCgi2P3fvUVnP6n9RyS6+y6NxxSQqkU94rUpOcZrJTKNBcXWVj8WwCDQog/B+4HxoUQF3C6DvcLIW7yd/EM8A8ArLXPCyH+AngBV771E98pMwAOAOu0uySdFvMzM4yOxezdf4Qvf/4RRsbG2bF1iKFGxGtfd4CF+Q7CCqSICALLJz72l+zes5uTxy9Qq9X56hcfp9tZ5fOf/xxHbzzIpz/1RXKd8NgTIxC0GR2vMjyquPX23fzhw3/N3r2jfO4Tj3LXPft49okZnnz2a9z1mns4euv3IpVE03HgIgalFAuLTWqVkEqzwcc/9Agz86u8sX2YD/zZF3nbO+/iEx99hL//k29kqDbKX/zXb1EbzdmydYJjLx5jcmqCk8cX2bNnktOnL/J9P1ph+96dIFPXf29tb4XJc4MxsLjQpBQp6qNVlFUsL63RaXd7uXSwDuOQvsCpAJl6YOHASmOlFyDtxxAW5Uk7KA5ID9PwKjd42EuIACG0mySyzyZgEGyrhiRZl3JZooKIxlCNixcvUIoqgGBsYgyLpbnWpd0UdNMWSpZYW2mxZ+9mzl+Y4cL5BdrNDnEc0c1aGB3Q6UCaKVqtLnEUcnn6IhgIQoVNUhCG1+wb5gPP1DmTJgibI4RvlvEMwX38xeJBA//++tvj9nDhm7DGudvWTWrX/j0weRnEUdy9Mx70C5RCeUDa+GBACkGjUXPnIhVXUEBA3wDYvlGyuL6VIttUYFBuf9m7HoWlGvW5MYUQJEnK6dNneebxJyB6JfDob5Yd+N6rvPxfvs3+vwL8ync67uBmrGFqyyZGRlf48Ie+RKfd5fL5Wb7re97OJz/5KE89d4EjR6d44fmU4RH4s//yDb7nh+5i195NHD+2l1fffTMnj8/Qaq+iUNx440G0WKVcKfOWNx/ks595itmF88xOr3HwYJP9u3eza88ORsZ2IGWdheVVLlxYIs066NwShSCFcmquxrWtesyYsbEq549dYOGiISgZnn3qOQ4cKDMzO8Mzzz7PpUvzPPv0SVaWzhNXNc8/c4rbb99Lc3UryCZnTp/g8OFNpHmXTZvHMVr4blJJlmd02i26a23KpRgZKKTIiMqlHq4wVC8RqQhoo3IwUmGCFKUFRvruQuFBUcfN7lxUYzFCIq1fLa2EPMNGrjfeDWbXg2AD61t1fR8Efn9hIIwgN4igTNHUECnNcCXC5itADSsF5UgxObmZCxcuI02bixcWePTcGkmSMjo5hskVpdiJkORZg0vnV1nttsmFZf5ch4XlVcrlOkHQxeiYndvLbNo0SjmQLCysMjZWJk1T1/U5VuO2HTGXT0Aq0l5NwHiU09SGVAmXl7chPbr1waW0AA4tCLT3pDTY1Idg+KYcTQGFFDoNGu0AaiEI/F2MVEAUehJSowGnFBwqSSIkQqh+x6WbNfSBKrz3Jt1nPSN27nUdJMohMMJVMCIcPqGsJJKBw6B8bYcUAYvLM9yyfzsYy4kLhfO+frsmyoa3bZ/kTW+9nwdf/2qX9zSCPBHUR0IOH91bNF2xMLdIuVoHqYlLinvvv4mbjh6hUs+47U4YHX8nFy/MEEaScrnOWrNJo1Jl687tlCqKQEYYrYnLdaDC695ykFod/v4/fhdhKOi0cx54882UKzWE1EgknVYLo4uqQctaJ+PG+45QVoLPf/4p7r37Zo7ceAMXz3e494HryfOIo7ceYPvOKb7+5RcYHS/x0suLNLttbjx6Pe943yQmz9mzbzfdrqFWyjFWECrL6efmOHfyLLlNmJleRMkKO3ePcvjIdZRKXnQCkNZJUmnlCSiNRghLJTd0hQAkSjhwNEiXqZo2MSFL1OlSBqkwViNNhhECaVznnAk9l0HB6mn7RVAUde4WyHMCpcitGz4lKRgJLEJLZFAmDBRCKEZG68zOLLG6NMfs9CKXL64xuXmIMDCEpTKt1ZRzl1osrJ1kcX6Z+YUMoSJK5ZwwriIkpEmX1dUFTr6Ycvolze7919FsLjM8EmM0pElCXIq5b/MEnzh5EoQikG6Z1QJMLJBWYYWr3yjceJeQsX0DQJE2LrI0BoH3AgCM9RT1BZ+fwwKKUKywo0VruPDhm/JydkoowiAkKayNpG+MBmsF3M12/y/qD4qaBf9e/6drW9bG9ZQUbENRGJLnOY1yxPX7j3JLe5HJdI2/+OZjV51/14QRuHxpkf/4f3yI173xNprNFKzh0PVb+dT7n+ae1xzlU5/4Eps3T3Lfa29lZTXjGw89yaFDOwhlxMhomccfOc2+67YSRcPs3bed0y9Ps9hcZs91kxx7YYbDN+1gcaGDEhGbtwwhBMzPrXDoyCT1eoUkbVMqlbA2wNocQUirvUwYQbkce95497watRiRC6wKuPe+W7jnnqOoKGL77s1UKhX2XreHqBwhhOHV918PxsVFCEMYRtx4214naGEUKnQNLxIJVlIdCWhMDaEzTbVad1WJxhGkGqMRystNS42wFmkEWkkCm7M9W2Rb2GQpU8yqIVRnmU3ZIrbTolqtMTY+wppokeqAlVwwS50EQctojHD6izJ3A1Yr6NUNDPjLtsiI5Bljcc5F4YxGRQiq0qVzlQpRKvDcd4JGo87CdIdaLeKd77mXvddtJYwMS4srLMyv8PDvrqKWLWnbsHvPEHOzbQJZZmJzzPhYCcEQpaDEoYPb+MsPfYIzF6aZ2jRJ0h1Ca03e6SCHGlRKAcokSBUSujvOYh4gjcYKf1299LGfxAWtmxB9N1vgwVkXzxegrRSiVwXaa+v00KiSsj9RhRch9QZCSccKjIVAudVdSAG5uWo4MvhCkVY2Huw0Wvf4A4W/DqmcloZEI8ld1am1BEoyMjKMWcsod9qElWtckLTbzsnSFmfPP0PeGiIIFM92U/78jz7DtqlhLp1psTA7zS23NTl+bJaFmQU+8sxx1tYy7rxrJ1/83NNs3ryVH/mHb2BlOeevPvgYwxMJzz03xUNffo4Dhya4dKlLsznPL/67v48KFb/6Sx/iwvlp3vr2e/na1x7nbe++m507R/jC5x/lwQdfw+/+9h+z68Aw23be4R6A6fdzWyxaWlQkMbjYPa6UyKymVKuQ5hmYyGnTKwisezhO+irCSosKLMZICtpzZRXVMGbvtilGJkLCOAIdYrSglay5lcmvFsIYRztNRi1bZGvnHJtsh/FSjVEJE4uXybRBRpZovEyWdGnEESVhCYShk6RcTwcpNAuEnM4zlk2FFVkhRaKMxtjIdc55shFlXRgrlLt+Iy0ic8NnXEFZOhrtUCqsFohIYbSmVo9J0y61WkC1VmJoqEqns0YprLJv/zDX37DMyXPTGJlw3z23s7CwSq46NFcqrC1qTp1ssWPPCPXJLbzn+3+QP/rj91OurrK8ski9FDF/5gR/+eFP8RccoBNVQGcoP9krgaCDJLcBxjqviXUFW/1lvKByK1Z5V0hlfFTk0qOFAExv7nrvsNda4Q1JFARUyyWHC0iJlK4eIwwEgbaQO4O5rk5AwDqGEdE7u/7bVy0McbUbsdQ04qAvSmKd4ZpfbXN+dpFbtzRecf5dE0Ygy1OeeOwpDh1+M9/65jF27hnm0596gky3uHj+HPOzcwyNjqCCkMmpGp//1AJ3v+YwnXbA1CbF5FSVW27bQ3N5lYtnF6iPpjSbbZLsNBNTkrXVJQ4cmuKZZxY5d/4ycVznR//RAzz92DlOn5rlzW99FceeO80XPvUQm7aUqdUk27ftIs8XEYF03O3S5YWNtVgpHZmJBadhYLAGtM19d59FSYvWqeMisCHGFwRVIpci0hiyXJFrgda4+nKrWVvrkGhFEHfRpkvSNjSGFZVKjEaQZzlauhbWkWyefXKFemyplIcgiChXqpRrI5w49jJbxsZZXlxheKRON0tQKiQIoRwFrvc/KDHU7nAknyMPQuaIWc7qLAR15gNfM28tWlnHiuPpuZXRbFUpsz7DXFaGsjLoPPQNVQKlIEssShmaqx3qZcXnP/txTp7dy87JKUrVGpeXNI3GGpsmJHJqlNNnZtG5IkkMOl9hanKI3fu2c/zlOaxQjIwO0dh5mNxcYnV1jXMvnaHRadOoTJGTgi1hhKLlzyuKAtKiulIqP8982tBo7473l2Nhi6ZpX/BkgSKFa22fqcjtva5yr5e+k5I4joijEG0sqjA+IkIGgUs/C9XzLNdtRTLDew6ucxTfPWpASd/z4X0Q6fpURJqQJ10yY11a2RuxtWaHpdVFTs/OMWRfuYHomjACW7aO896/8y5e9ZqbmZ7tcviGfdTqW9m5536WpleZmCpx8IYdRFGZ2dmzLC2vsbzaZMfOHZw6cZ7jJ6bZtmOJV99zC6XSCN/61jHyTLBv704+8s2HuP2Og8RxjUZ9mN17dlCrKb74mcvs2D1BO8k5ceplwlKMsZrZ2SZf+fKjjIyVWWymGB31lInBu4O49I/xllmbxNUEWOXiyExjSJBKoE0OyhJoWFxr87mXprm4klIu1RgfKVOrlGnliau7yTXD5QpTFQVSM1wuEY0oRJSD6LoqSCHdfskM+/V5hkoBWKdXp+IyeaapVaps2baF1kqTwMLZE+fYc3Af9aEq1hpKoSuE0Wikgi6ayAp2i5S1bJojQZWvL0hWhq+nKyUi0xhVwhrhaMKtpqsU4MgrhyMoCUVHBcSVkDTrEHQsmVJoY1leWaPSqPHEy2f58NefY3QoRqoqNqqyc3gbuzaXmBobJYwqLK4uMdyokSYp0sBNRzZxx+2bKZcdTjR23R5OPzVLePYiZ489z/6pYXYMNdiTdlmiSmBxExx8Z6p/drZw3qEHBvby7AUqX7ztAD3psYICI+gp/RiHCxTdhD2eQuny+UoFVMolp3Dlv1tYlz7Nus67Er1u0cH1nvULvc8wZEnaq+Po9ZTgvZYsxXbbdNptllfbhEHgi6lgenaGi9MnqQEnL8y84vy7JoxAFEe84S13AoIf/8fvIsty7r7PIkRIEAjex+vQNifLLPc9eAuvff1tpFkGaF59z37e+70PYoSrLKsOl/mJf/pdWGOJYskdr76RqS1VLpxf4r7X30xcisgyzY037UdFigM37OHMqXPs2buTOC4xM3eRctzg8Uefo74SYkndhDfGrwgOJDR+ZXTCJDFJO+XFF0+wZcc4k5NDZKkmCsvoPMNklrNzy3zkL7/Gwd1D3LVnG2G1hA4jFtuaE09e4olvPUSlbKmOTaBqI1TrdW4/vINt42WybpfAdBgardFe7TIqZziUnsHkTYLKOCoMyDJNs7vGyMgoUbnM0GiD6YvTTI5UWFqG5flFhuo1kjShXCohjNN9bDebjgJLa2S5Spxb2s0Oh9Akyw8zs5oxb0NaW4+iY9cPgIWTcnOPbXhXWVOpRMxdXOULn/kcyhgmR4e5/tAhRrfvoL26xvnnLyOlZjVrs9ZMiaqKXUNw/XZFs22dgTE5jZpiYgqicJTGcJU4UugsoWsE5XLE1Mgof94psfqtR4iCJu2hMrFK2CNWeByXhow8npGqwIm0ejBwHTnpYOyNn4qeYt2pGOX99KD18h4bGnzcIQcYi6xnHdKeyt0aRwYjvQclFLk1rpQB+pmXV9gKTCCKIsdlUeCa9NuYBQabdsiTrutkEf3jGqGpmoTxaolLq/Ov+D3XhBFYXlzmz/7Lx8n0Gq++7zaOPX+Zubkl9u7bwezcElu2jbO63GVhdpU77zrM17/6DK+57zouXejS7bZ4/Vtvoz5c4vKlZV567hTj40Po3JLrLkZLZi6XmdxUYXF+ifnZFbpJzg037OHM6cuoIODwjYeRKmP24jJD9Qkq9YgH33gTn/jYI57F1edsvREQwnhFmOJBGc4en+bf//LvMjRe5/D1+1heXmHfnt1s3zbB8NgwJy+sstw8SSU+wLYR2LKpilCSVioYr+0iClt87s8/wfzMN1GB4HVve4A3/uBdBFLxB3/yKU6feom4XCJE0IgtnUCyutZlunWeTTv2gIChhmNM1mhKpWE2b9vMhTOn2b13F+fPXcRYjUE7jkCTo/Mc5UOMPNeM1KqsJivEYcza0hLd5irB3AI7alNMbT1AeUtEN6pydq7MS0GM8G63bjY59tICLx07xZc/8ylqQcrRPXu4+MRD7LnhJtK1ORYXpjlUj9l/3TjdapXHLi9TMxLVWWXfnr2MjDcYagxRroSUKhAEAVFcxZiUTqtDtVYmLgfUoxKdoW3Ml0fZlrUphSVAMkETJQJyNCV/Xk1RxsgYpV3KTwjV9wYKw4DoewPCudjCGp8iNAPVnL6Yd131YGEEnEchvSHQWvsyddPTBggkxFEIIvXH6/NB0Dva4N+41d9Yp9qMXaf41OszMW48Cp0RKOnbEpwHoa1mUobEyjii01fYrgkj0O2mLC+usLRymUe+UiWQZYbiOsefe4FAdZGTZX7/t95PFHcZH/+73HbbdtK24cXnn+PCpUXe930PYmwHLPzeb32I3bvqjE+MsrTQ5eL0LP/y536IP/y9D9Dq5EQm5LkXzvCe9z3I2TPzdBLBv/ql76G1Br/y8x/mLe88ypveeRudTsjCwhqjmyI/+d1DW1vt8NSjz/Olz3ydhfk1du3bwZbNY0xPrzAzd5pLiy2OHX+IbrNDrdFAhjE2y5AyJqpWOf38i1y/fwc//Y/+PiPDNerliJu3ldn11lt49e0HefzlS7z08klUYHnh+QscPbqL2csX0TZlfnGFWmOYWn2I2ugQ3azL7MWLbE4TGsNDiMAQKEGeOpafsYkJ5mZmmV9aoTE2xOzlORpDdXKT0026Ln4tRQSqwqVz51hbEuRJQrfTor08S4SkpSz/+Cd/in3X7WR+vsv8UotzN29l9lvPs7xpDwAfnhVMnD7N0Op5RjYNMSlhZKiCSdZ46VtfIVOS6YtzLC03aUjFyMg4B0dGWEks52amOfLqmxgdGyYIBXmW0FrLqdTqKJm7wigRENVKxDiAL6fE3LaD7Lq4TKkUEYuQHUHLpQKlpuQ9gVyEgHFEr55pB6Eo9BJB9gxAQRUmAKsihNYuRZlrAummifbpQ2kdPsQAmCiM+6kkKJODdB2DVmQYEzIx1GBsaAQxP09ocpKiQOuK9CD4vCFWKbS13pBIpO2T6AhjXNGclNg8gTztFQkp4QRLTK6phZpmkjhv7xW2a8IIhGFIpVKlVNlFpV7j1MnzPPv0k+y/bgutVkJleJJao0yuE3RuOHVijlffcyP7D+zltW+6k+nLMzQaNYaGysRRhedfOMZtt96GNQFxLBCR4OL5iywsznLz9Xdx6PBOzp1ssf/6Bgvzrix3eWkFG15mdn6CPNdcuDDL6VOn2HtgGK0zdO4q81qtZT7/ia+QtBfptg1nT2qW58/w1Ycepq0XwLpW46gS0WwuI1RAUIrQnQ66tczcrGH20mUynfNTP/ljbClvIlaCiYqhtllx3eRO9D37Sboply4sk+eabquNyVrE0lJShigIiEfGUTIi6aSkeU6Sduk012g0NEEYE0Qu3Tk+OsyJYy+zbetm4rIky1LMmiAKFGEQIKMIi2VkfITzp85QKkUkrTbdtTZBOWTz1BZsppkaG2HzhCDTllZzK3RzfvuxZwBYDUJWb3yAsfY8Y09/g/ljX6MkUobrQ+jMay3ajJGJBvVKmdFynW1bt9AZGufA/u1IDEanpNo6aXqhaK2uoYYkudZs3rqFII5odxKWOl26VhLWx8hUiTTP6HS7NGRAlDbJ4lJvUZUFI09vBS3qAIpf/YpehAwFnwCA0f14X/hjFTww/vNFhkDgqjxt7tiuO0nO7NISSWopy4gje6/j9XffRr0WOe0Jn9dflx0A1vU2eM9E+GxGj6GqyG6qfp+DRWBl0Cst722+07CV5GT2GjcCY+NDfN8Pv5EgCshNwuL8YUz+RvIkZa1lqI9UOXrbLSzNz7B3326+9Y2XmNhc57p8B1NTw7z83Bo791u2bR/lvd/9Bp58cpwjR25jdmaF0c4ID3/zFO95z/v42l9/HUPCmTMX+Gf//I188qPfYHVtDilhbraJDCpMTzfJdU61XqFWjzFa9Nq+pYBOOyVQVeJGRLmk+N6/90b+91/4TVbbM67asCQJowrdThcVBGRJF2MySnGFIJRMjUzQabf50pceQVLih37gnWzaupl6vYFShrK0KJWymkvickC31SUSKZnNCIKA1flZZFiia6DbSdEaGsPDhJFrHe02VylXKpTCCghBrVp2LQO5ZWJihNVWghUBEksUOImsUydOMnfxInEgqVZjLs9Ms3PTFJs3j5HqBnEpJDeGUIaUS5JyKeDBB2/loScdTUTwsd9F3/pGFvcdItl5A5tfepTZmTXaazlRICnHEcoolBXs2zRGpazopl26nVWm52bZM1wjS1OsLajYcoyF5UXD6OQmJ8iSuMq9xWaTrrVE1QZZVCHNcow1DIWSTc15TkY76YG4vg6g1+1ZzN6iNqAXk3vCUGsRsgASXfuu9lWXAlce4OZhf+WWRfWetajApYs379hPJOHOmxRBbnjdPTexf99OX3+AZyryZKjFgTYUCwk/2wV9zosCz7S9Ii4fosgAQqfx2G+ecu3va802S80mzWtdhiwIA+rjDYTRYOs0GiNIFRIEhb66a7pQ4iDapOw/tAWdw+GRUbCWA0dhaKhGbhRv/67beMd778WwijERINA6JZBl7n/DEbJcIqwmLMVs3bGZMJQYBTfeup2fGvoeymVHWTUyVmbfvj1gc+ckWqdAMTE5yvf8wDvoph2UjGiMDXHywjRprrF5SrJiyeKUMK6QpzlhEJOmHZK8SVirsNpcZWp8gk6+wGe+9CVeevFp3vK6u9mydRO33XE7Q8NDiLBGqRxQLYe89PwJpMoJlUv9DI0Mo6SmEkTEQQmd1qmUY7qdjlOoVYZWcwmtU+JyhbhSZsfOHawur2BVSFyWtFpdmt2Exfk5VhfmWV5YdCXEQiJswh03H2FiYpRumrNz/AhHbz3M4kK7RxUWhwHbxifYvd01jOazLxB+4iXyV72X1h2vZ/qWtzB57K9Br1JO22gvlbWyvIKUkqn6CLPdNhP7yhwcatBudsjbHQdalkuu5VoGhMNlhJToPCfPEpSNybVD7Y2IyMISlsTF30qwn2WOi90UzVimt3IKXwpcoPnFyPOzagBs8wl5X+4L2hhkWNDM94G5gqlIQK/HAKkoRwHHz57mzW+6n53795J02lQaDQIZkpschBxoF+cqaf+BTIVx9QkFo1CfyFbjgxCEsK40PCwhpXTEJT3vwVktGYUE+hrHBBDOaqdpipIdR86BJcsCgsABcwJFjmPYybVAGgEyx5iA0fEhPBs3xigEGVpHYL1goxRkxqBURCBcf3euBfXhOpBjUFhh2bVvEmscUUiepQS+PtvagnlIU63W2LRlnKgckeeGz37iIVqdaYwwWHKEVeRJhjVtVBCQa00Ql8jThLzVJOt2WJqfI4wCVBhw8sJF/viDH+WGQ/uZW1jk9jvuYNuO3QRxhfGxEZaXl7EY0jxDhRHKGLKkg1QaawWhtAiMo+PKU2QpBGtJOm2wllK5zOYtU6yurNBpdpxUXZ5i84y0tYbOEmqNKp21JjOXLxIrxU0Hb8SSYwnZvW8nI8MVhutVFmab6CynmXUp12LGxz1v3egwZmYB8dRnMFM7Wbvl9WR7b6Z6/ikmnvk0VZ3TGGqwe+tWDuzYQSYMNs/ZtqWBTru0sjarmSbTOSOjYxhtKFVrhIEi6Xaw2oIUSGsYiiQlJchVQCIVaWbIbA4SRnDUZwVzhIv/vSZDrx5gEFzrrbn9cYh1zVF55jwBa1A+ndif9p5URfTbwLFgdIpBcOz0GdKPfxEVhQQq5tUHNjM5dJMTrlFOucmK9QAjG2J2W/xfSVTg8YXiCoTspS/B9SI4msmCU1P0vAUpoRTFBJUqnL6GewekEDRKMYutnCAuAYY8z1yRTuZZf22GIUFYi7IBAkWaaXJpIHfFPIHGuVzSYIVL70h880cAxkZuJ6tRhK5wBOU0TcANGhUirCUWBkceoP2Cobw3AInpcu74ebKu4MMf/BiCFJM5zTqUA450lmB0RhCGmCyjVCohhKXTXAM0Jg/IM+duzrUV33xkhedfeJGHH32aWq3B7j0Huf1Vr0EoQTmOabW9vhyWPOmCzNA5JJ0uWZKStFtYnRGImDAMCaTBpB0Sk5FLxdYtmzh98iQ7dm6BPKW95KjcxqcmqA2Nsjw7R6QEBw5ez/DYBEmW0VCK1lqX5mJOqaxoDEesNdsIGdHJc/Z7T0A0qqj5NVRnheyrH8IMjZOM70BURhBxTCc3kCWEtsKFdpNarcbwUIM8y+imCVmaumy8kGityTLNSKnkCGWTLlIGJO2cer3BaDkilorlUpXpaIRWdw1HDxZSCXIC0yb3w9r6Jp9epWVRLVhkddxe/jXRe91IkJnzAItKQlef3/t4r4LPrequmErb3PVj2DUunn0BJSAM68wOBXTyhKEo9A2CEjA4UZQ+Y3Fvs4PnBbnPNmR5ThB4XgoKbsOCqNS4sRv0WaCNp8WrjQwjwvAV5981YQTOTTf56d9+hKgUARlKJIRCo2xIqAIiJSmHgkqoiKSgJRXTSYcD4xPu2QWCIBDEQhCCS8lEMYtLq8RxSK2sCK0mkAJUSCvJCFVAVUpqgSBSGqkUKlBeLDJHW0GSZ4ypClIWbqMl7bYR3RHGh2p88ZGvcur0k+Q69Y1PxrMQ+xXGGHSWEwrI2jkiUESlCsbkaJ2jlCIIPLMQAcutjL9+6GF0miLFpxn/8z9jfGKc4Ylh4rhM3BghiELCQNLptMkyy/SFyzSqVSqlgMW5JaIAbJaRUrSdSrLckBvB6MgoNkvpri6iTMLwcIOR0VGarTbDw3VuuuH1jA036LS71Cslcgw6tFyYX2SkXiVPDeVqGSkzWksZR44cAOCoSLlt+yaiqU083hriicUlktEpwigkCmNKlYhAOSe9myTOxTeaIIxotdpEUYCUIaVKlWpjmDRJsQiarRZDwyXSNKVSbRCGEbUKBDSxMuDytptZeukMZDlGJ1irmRQaY1z8KwcmfbEN6g/0VuBeY1GfMMTkGVK4qkmn9eKERfr1RIWylPWHEJiupitC7Moa3XYbISXjjYxGEBHgujlVoJycuaVneNYVDRXLvf/TFBkIW2hhFLv1wxuEEydVXqC098+4zwXVEja/xsMBFcBX15qsrUqECLE6xymo5G61tq4oIgACKxyBpJXY0+ddr7aUnu6poMDy6RoV+husCdBeQkxirSFEEGUp5VwTGPeAlXSNJFIEiDBjbz7L+KYdGCvQgJSW5VbOf/+rb7F66SLPPfJF2mkTYzNU4R56VNm1kRqMtmTWEiqFMq57LVABMi6RZTnGQKgEaZb24tAwDtBpwszl08xMn+bo7bfSWYvZ1BglzXKUzui2244aQGfMXL7Epslh0Bk2S1laaxGEIeVqiTwztDs57a6Lq7eNVykHgmioASoka66yuV5n5/atCCBWAlUKCIVltZOSq4yVpRZx6O7P8ZcvMjk5ThwGRH70/MvNdboty5cyxdkshYkJtzrJkFK5TiAThhplojDAAqvNNWqNGlEpwgqJCmKklJSrNYRUNIaGKZcrhHEZFcYEYYkgLqOikCjuoWO0hjcxU5lAS/dsQiNJVEDJbADBPBDYaxyCfpl+r0agmHfSud65du3bflIKRE9rYp3rXhQLWYNUglwYgp1HsKLEpOrwqq0j3HbzDSwuLVGOp8i07/xUsle71DvmgAcwSITb1yJ05+aYrvteRM8Y+GIl6RcgjCHXlkolxuj0FeffNWEEttQDfvHuEf7wuTW+vqrphCWsyL1Ig0QYjREBubKO0EIIhKEnFy39EzQFYYQHd4TRvVpxUcSEhRU2BggRQUgRRYoiD2xywk7GhEwRXvJZ4tI1XSE4PneOs3NzLKoIjHGobJ7SYxQ0BuvabZBKEQQOrDHWoHVOKCVJOwFrCJRTU5bSorE9oYvMM9hKa2ivrNFoRHRaq1RkjSTpknY6xHGJoaEac7PTTI5WMXlGp5OQpDnVWoOkm3Lm1Fl0bhkZG2Xb+Ai6u0pHQKlWpRyFmESze/suiGNGxkbIM0vSbEI5ZrW9gO2mHKgFXL68wmijQmwlC+cWiEoRnW6XW4FPTycca2Y8trxC+sZ/gByaRFmB1Jrq8BCSFKFcAVCepYyNT9AYHkEGIaVSiSCMQCrqjWHKcRmhJEFcptYYppvkVGoNhJXE1Qqd6UUSk6NkiBGSubG9GHMKKUsIm7FqFHGhiSL9JBGecFQyoLQEPYTOL70OhHbPWemuY3bWBmltjwYerGMHsEVY4LMKQmJsRJ6ntG59kHxkE9UzjxJVu2ibs2nzNlQoCGRAgCTt5yl7nonrTrRuHFmLMRmi0KAAQiGQQhFIiaN+F+RuGfTZDuPe89etjUYgiIOIju6+4vy7JoyA0Zrbt1hu2TTMHz/X4qOXDc+vgrUZRlUcmYLSmMwjveRYKRFGYnHc7G4bqLoqLKu33ragyRrsxLJFgqjvPTiYzWKFcSQc0OstB0kARHlCpg2MTmAvVTHdtvu80V7U07uiUiGUJ5+wljzPkYHEKkWoQvIsJ8m6SAthGKCERGddx19vHZgllEIFAeV6BWMS8lSwurhIpVp1rbS5IekkLMwtOGZcr1OYJglZlrB3zy6EMcShpL22QK1WJc8NJJpcGI7e9iqicoUcSTO1tFspW7ftZm7+PM8//iQ3Hr2LY4+8QJZqFuplKlVNHNeYns1JcndvP3l2BVUpE990J/mOPVjjDFqpXKJUqVEpBQidECnB2FhEpVJx7DtKUWu47rawVKYxPML87BxjExNMbtrE6mqTcrmCEIJQRkRxSDNzHQvaaoSVdMMSJsmwxhCgibGs+SVWF2NAWigAPHwMDf0wQNDrLiyac4ROe2570TkofWZBiMI170vQWXBiIAjyQJIj6WZO/MP44qLcaoqR1AcjBwFBScExUKhdGdMnoVUeHNTaZQecIrY/DylQQV+Mx+kluNbjIAz6vBBX2a4JI6DTlLMvnqHcCPi7B8Z43d4SXz7Z5YPnQi60c1IyrAnRymKUQKQlLLnrbrNF5dZAHbaf59+mPsJtAvriGhs3t6oHKnS4jwdZpASZ5xiTAyEmGkLkFzAyRNrcNQL5wg1rDdK6NI6b6CF5npG0mghjUVGMCmMkgkznWGuo1hsooVlZWkIqhbUGLRXlap122sXqHN3tYOIYLSFJEzrtFrOz0xw6dIDcStJsmaTToVwKyJM1bJ6TtzRRGDgNBaE4NzPLa+59gPLQOEsrK1QqZVQYMTRSY621ysNffpyLJ05TLQfYYIRyeYwH7r+d5mJOTsaWXVOEoXMxZWOYudlLVOcvMaqXWLATEIYYI9i7/zBKZMTKkCdt8rSNsZpWq0W3mzAyOkalWmXLtm0IC1u2b2N0fIIkzYiiElEU0mq3mRirE0nFcmLIjMEG7mkbocBKQhWyd0QyJHJS4/gEjFI9WjA3MVSPots/4v4kFAUVvQsb8lyjrCNsUUUtQQES6oFCIv9ZYa3PGjq1I9uTMytcezceMmHRg6HIxgFpBQhHcS5UgFB92b3iWtxE91oJxiCVa2eWvqDF4VOuKCnLUoQsu07KV9iuCSOw3En41nNPU1WSsbERtm+b4gf3b+ZHDoS0k5y5rMGJlYRHViK+ejHhZXIyA4F1N7Tn4g04Au6nn+CDOaAB1HWjlbBFTGZtz2PQ2pdpes1BhON8s2kHm2oEGhGEyKgByQpC51htkIHsrRxgXbowSRHaYPLENRalHUcUEkbu+ELRbrcZG6lSKsd0OimqFDM8OkK300apgKybEpdCKtUSIioTxyWStWXXsy4FcRjR7bapRBEYTWtlBSUEga8w0xjiWoN7XncPe/bsp9XOHEOtVCgV0u2mSJWzY+dWVLZIsxnwuve8gaeeOsuFuSX27d7KyZen6SQnmdo0BkDazQgFtI89zo179xLd+C4udnN0rrl8eZqD1+2iHEkW5xLqQ2NUyiWCQJGmCSoIGB5ukHbalMsVRsfGe4M4jsskScLExDgqDtG55cJCE43xbMiGNNcsrzUZazYZqo4wtNqk7Y2AUkV3g/St3H3XuT9ebP/hF3iBNY7AwxZEIqJA2Rzg6+PyYus9Z6PdpFXKIf9W9LhZtBc3tRIwTkDGrBt+/g/pz8MojHAZrH75gvchiu/zbELWaMIoRhrT04Mw1pBnOUKFhHHJS61ffbsmjMC8LfMH81PsWHiRqexFxmsVXn3L7ezasQXSlOGxER4Yr3JL3OEdm2L+5FSbD85ZrAlYR/Z4te1qqaCeBbf9d4oYrXjPWKzy8Z4sePYcY6wyGeQaqzMsBoIIGmPYpsS2VxFobJ77IpbQ0W53HQZgbI4y2hF2GJeuNGikDNwA07CyuIiIQkQ5ZvP+69iyaw9xnpPmGe12GxnHGKMJhSFUhqFamVazzTNPPM22nTupxIpYCZYXlsjThDgKETLAZJY9u7Zz9JbbfLydoa0hLpWQQpBklkxrlIkYmdzEhZePcfHMMb75lc9xz4NvZHWlTZpLbrnzIF/67MMst10Y1O10CIMIhCJbmGNzmDLbhZIwBErx0vPHePVr7uCm7dspxSFh5CoVlxfnKIWSOHDUaY1GgzzPyLpdyuU6UkpK5XJvArY7HS6vrnm9PUkuFbrd5dLMDKPDMWQlIjRzulBTckbbInsoem/BgH5oWLAwF7CRNQid+7BQ9O2EsOTWeOLPjVJ3TiXAuftOIwCpsCbr6V0KP3FtUcG4brMDxskZKiklVgqCICAMgl6KuPdP+DHs+RJciCX6dQtZjgpj5/3IazxFqGXAiamjnBvZx+aZF9h16mEuXfg4E8OjhFrTNRn7Jrez+8hRWvPz/PBdt/DluRKXVe6yBOtW/sGtB+2u9/gHPYTee4NuhOnFfIHyMZYUSK9yZLLMVWMZA0I5EEcEiMoQaE2QtDBSQyyQRa4mzxDCCWQYpVBWoU2OBKomJ5CSeOdudJ6ShwZVrdIIytz5ujeRr6yQryyA106olGto46i1TK59ua1heWERk+fcdNMR5253mkSh1z5AsGP3Hg7feCMj42MYI+l0UuJSCXBqtrMLy4yMVDEZRKWIjJRjLz/F7HKbW267hfOnm4yPlqmXJrjjzkP80R9+AIDKiKLTrBFHkkZ9mExFBDphKF8mMQlTU6M89cTTVCsxR244yLYdW1lZXkJJyNKEQArGJqcQUpIkCdVaHWsN3W5GuVolzzKsNSSZQYkChBMIJZlonadRismbKSpYQJX3oLPi6Su38grVj/8Hx0GR+i3GhHCgoDC5y1DhPluAi45DwLndUngq8qIE2eLIQAtmH7zxKYC+wnAAeEqwKwdmMf78+XsjYzyXgGMt7hsCC77jUZJq/7fsZxasMVjlvZYgeoXZd40YAbAYYciCmIs77mB1eCvXnfxr0nyVik2oJZaXT53g0cceZdu+/dQPbCVUWwjzEl11FcDjaiH+uhUA+g9gEKaxvcxCsZsBFyv6jzh2IQcCWqN77Z1uH4mNXKMTaQ6ZQQWWQEKXHGUMMgwIpEDqnEQKtlVK3DI1zMjIJszb3sfDj3yN6dmLCCuZmNzK1ORmHj/2ArWszfjYFNqskRvnrubdDJOlZN2EXDul4FIYkHQ6zM/NYk2OFAFZlrFlyw5uuOlmrAxptroIGRCGfoVRknY7IQwdWp/JLq3VhJW1FZJMc+D6PdTqFcIwZXHBGbjh0SH23n4r/CVs2X4rWZ5i85CJWx/k621DRs5IfYiouYA1hu07tkOekHa7zM1MUy4FrLXWqFUrTGyawlhot1sEQYTJNVmWMTI27opfDAiZYYi4YarBZ2YW0EHA8PwZbmyeYnw4ZKhRpTFUYrvJueRdX+1luopJvHEobGi38TbCYm2ONU6Buu84uk5BSTFNByXj+sPH9r7AC8jIoIcfXLH/xnG57kT649IWZKd+EF6hro1xuBNeMs8bIW1zRCAJwoC4/D9fhux/8iYQtoSWGdYKloa28fiN38XQ2iKNvEOcz7B3+gWmSgG7t01iuoZmGmBkjig8gSITsPGmXu21De8XdltQTGbfoCF8e6n/vCz03waUZpDCx23WFWRog9SAMYQYNg3VCHLLkoYs1UgjiaIypq6QXcN4uQRGcX5pEU6dIs8ESZoiMkF9dJjTx49x6ulnOLhzM61omcZQzfe8W5rLy6ysLLO6usLy8hppmjAyNsTy8hJLi8vEkWMlbrU6jI6PkxrjWmSTlHI5IggkUkGuc9ZWW1QrEWm3jdaWNM1YW1vFZIYXn3mWS3ffzaEbdoAwvPzCRSbGGkwfOw3A4dffT6ebcOHiAl9rxiwpg0Zw7PwcR3aNcXD/Xk6fOUHebTEyVMbkIUvzyyTdDjdcfz25AWtzarUaAsn0pYts2brDUWVJ93SMAbKcXZWUeiRoZR0OT79Iw3Ypxw3CIGNIBhzpXuLZxK16VnjJuGJy9nDjdcXCA0PBT1RrQed9Y+FB3l7l4cCx+kO4IPoosg+erVhnYDVKOnB5YMj3PdKBY/R/HWxwGliIeieABzO1+07fZyB9q3RBRhr6moJy4xrnGHSPpY0QfV67XErmRiZYlBbynZwZO8L9c89x9/Yyf9kZY01CFtATx8Qz/oD1pZm+1rrwutxb9DwA0f9baov1/HLS2l66VhapI+k/LJzSi5UOZUZbhIqwMnBiQSZDZF2sSTEioZTBdc0mmbKILKUURaQWFpNVbq1v5vl8DpVDO5U8szDPlvkZ4koFqS2BDBGdhIe+9HFa89NcEJo4jBkar1IfG6G5ssbq8grdTpfR0VGkR4vDMODixcsOCFSS1lqTpeVlnn3sUaJqjZHxTa7XvN1CyjI6T9G+6Mhog7BljLYYm/fYm2YunuL/+j//E9/3gz+CUJIsaxEEAc8990UAPv2ff5NcSfKD95NNBRgpEblitBHz+ONPs7JwgbGxIer1CmGkCALF5PbtrC4u0mq1kUFEtVZ2ZbgmZ3Jqklq95tmbHGGpFQHWJmyvSzaXA87Pr1BuzXNmcZlbdm2iGoWEoeK2Ws5n55x32EsLX3UrxERsLxTwrzqRVm0KsWIPFA/87I2tvkahsAYprAsnKI5liaKQyytdmnqWw3s3eXWiYhyyHqOi/32OqCRAGnxxUJFhsH4o+vAlz1wDkXCq17JoIBKOnRgpXTpbvvJCeE0YAYFAGS/WYAfmrAYlBUbkGFnjmxO38PLcMpcrNaSGGAlW9XO8nhLb1RP1H2oRmTl4wK2iFpC5IVaKnY2YQ2MR1TIsLy0ibUorydmaORJRJUHiUnVqMF2jAnRYQgRlJxiaNhHpKuQJQgXkKCZUihUGGytmrSUQguvLVV5cmuH+iSpnmgk5EfdMjPHouUuMHDyItYqwFJOnKTaCeGKY+bUW27oJWZKwML9ILF3P/dj4GNV6tZcSWlpYJvSdd1YLAqsZ7nbJjr3I7OQY6ohzF8MwQokcKZyCbpLlqLBOqVSmUg5ZlgIhS8gg6FWr3fPgPZw5f5E//4sP01m9wOW5aQBGdk3Rqk2xdMNdrhlLGyKT0bAJ+/dsZm1pDmNySlti72XkrLWaVKoVjNGUohAlFXmW0u12GRodpdluUi43XN+Hcq3PeSgZrlTYX+1wYqXKpY6iMr9ESxumoiorOXzruWOs5ZsB0L5mY130XbjQvTCBnhHoqf26PiQvOW4plIyMFxkpvIqeAcC1m/dEcIVTrAZBx2iyJCNViZvrUvYWqys81OKEBhYzZV2dAMawtrLiRnnupEyREmkytAzdiq9cWbPxXoPRBhNGBJU68xcuvOL8uyaMwJZ6mX947wHAuoon/7q1zsVRVmNIsSIgEIFfjSWIHCUcDfiALlcv3ysAJQOn6Kr6rpcUgkgaKoFgrF5mrCIwWYtcJzQXFJ2kzfSlS1y84Ixs1mnTWQuJKlVXo10AM0K6isOgis262M4KRidIGSJV7IAkZakrhU4MU1FMy2S0jOH60Ron2prdE2PMLbU4bdqMmhjp1YujKELGitJInTwN6S6s0NU5SZoSKkWSZdRq9Z6rGoYBrWbTEV1KSWoMoVZUKzETcYlQgn3yWS4sr7C2/3pqo2O0ajXK1RppnhGGESbPaa058c9SHDIxOYUMY7CGSnmMXbt2Uh0aIv7IF0kq0xA746tKFaJdhzEq9mGUIkBTSlu0RYtyOUYJ4fUIBJVKBawmz1O0LSGUK27qdlqAJU8SKrVhlxPvAXYC02kjpeLIsOHj01UWth6kceExTl5cJDSChcRyupnQrbpwQEtwoWY/EQD0Zm/PuS9eL/Adq51I6+DqaelL3OMX8KLAb0DT0cmF+6Y3IamEhuu2jhCUY4zxzWxy3QkMghT+3NyyZX3iQuucXGdgcgccp8k67KqHE/TwAgcm5lpjpKDV7rK0cI1zDI5VFT98xyhBENIDQ2zh+li0MNgErMyQgWMFVlpglUTj2Gicy+TBPOvaKbEOVDHGIehSOnkxbQRZlqNTjZI5mbG0U0u3k5GS0ek00XkTLXNMpjl36jwzwSyHbznsegwEjn/fCIQIoFTFrk5D3sXKEiKsI4RGktIIIraUQs6YDjozbKuVuNDRDEchXatQOmJoW5XV6SXGJLTWWozXhgniGK0NKghJ84SoViHJUiRQiWMWZmdJkg5ChrSbhtWVZYQQlEol2u0O1VqFoVqZUSTbbtxCUIpIzp9i6cSLnF1ZpLptN5Nbt1MdHiGuVKiVHU9Amue0VjrUShFRqUQYlei0miQdg9WS8dFx6nFMt+t72YF22qa0Nk844no9DAYpNLXAQmapVGpIacmyjCRJmZ+fp1oKkCanVHJcCKGQKGEoxTFSQJ6lIALwlOEiDqk16gRK8qqtq5SeX2bp+tsxpsmeM1/gr0+scGDf9VwaGSGxDgTrawjgO4kHswH0XHs8ttNbiI123BYipEjVuQo+wFoCX39gcD0AUkhM5lLASOXFTlz5eNdmGBEzOraFJG17enpnKPuzHvoFb37me1Voay1Wa3SWEUURXWtAZj2soKhpKeTHHDGqMwLdbgek4OSZc1Sjv4X4iBBiO/DHwJQ/69+31v6GEGIU+CCwCydK+t3W2iXh/PDfAN4CtIEfstY+8e2+Y25ukT/4vb9w5Y0of13O3zKpxsiEPBNgXPGMRKCEpZPn6CQjyzJKpTIuJ+yFJDzLSpammFx7QVGJKoo8rCZWkmqlxIHD+9h33U4qFU1XQGmsgdFdLsyuEVrLzNwC42Pj9LTucbCPwFWUGVEQkIYIFYMw5NYSCMv+bWOEq8scyMss1xWtTPGmnRX+4uQsr9syydjuScTIdu4ZXualbRO8dH6R2sgE3bU1Go1hhIEgjMhTN2Eipbh49izT05eRFqKoztpahyxLKZcqpElCmiVYGWO6XUZLIwxv2k4sNMunnkUFbViZY7ZaYblSodntMDk+zoJPNcqoTBCGnLtwhmeeeZxyuUKW5qT5IqsrS2zbtplGucrFmY5T0QFkoIjIyIxEK+HU8oQgT9o0Gg2qtQojwzUq5Sr1egPIMTonLkVUanUatTpp0iGOqmANndYalaCElAGBcrX2SihynRPGIft3jXH/VIdPz6d0hrahbYVarFla0ZzbfANmZcbPc1+s4yd6ZC2p8JJdeCmyYiK65A5SWKzJKIAhJYTjExCFDXFuvrGuaEwbiyVHCUkuXKrV2Rs3fkMadLotdNahFAWujlDgak96aKX1HoRvezbWf19IGAhfDp5iRE6tMY4Wsx6kNFiPXWitSbtdl+A2GmsDumlKKgOOvXyGTaPD/+NGAKei9bPW2ieEEHXgcSHE54EfAr5orf0/hRD/HPjnwM8Bb8ZJku8H7gR+x/98xW0mhf84rRyoKnxdNHgLF2CpgAVtXWVdD1UVjoXGWoPMpc/jCgoySSftXqT7LGiBMO6BS6tdj/tCxtSZk9z6zBJVs0RncYbmWpfVTpfJyQm2bNXsObiXTVObUEHYr94SjryEbhOTJYQKbFTCRFW0ThBWokyItgFTITzRanOovolGnPGSgX909DpOD48hW00mAkn8wJ0ceeIZTq8toeox7VYbYyyBUORCEcQhyyurlFBcunCRVmuNKAwBh2IHKiDPc9IsoRSEmHaL0SRiz4HrqdQUlTNnqLaXmCsFiKzD6uVLrAYx9dEJFkPBsBBgJgikYmFhhuc/93kWz56mMTnJcEnQ7qbkOqMUKoYbkwTakK42/XOCWPVLtw2KysoaOxo1RBwQhSUgJghq6DykVq8hsjZCWLpdTSDdsddWOzTqdZSKCYQkwBVktZOUXOe0VjJmFhZ47rmnOWXGEeE4SaXON4JNiKm96MkR5qubmFw6C7gJ6+S8i7nmAORBXG5w6xWe5XkvnBSAMNbF+z1sybndDjNwkzoQihRBoDxGJUDIwGkfFFWAwnmmFHqG3n13IZT7WwmBVNKpWFlnkNbW2ggbcvlyi507RpGEzmu20jEm4YxKwSpUPAdhDUtzcwzFEdFG/fqB7W+iSnwZuOx/XxNCvAhsBd4J3O93+2/AV3BG4J3AH1s3+x4WQgwLITb741x1MyqkNbTJ/+EBvZ7rZnrIrDUuUVu4eaJX7FGIgxW/iT6A0ztMPzC0OIoxSk7Tb1lbjjUN1kTI0hZMZIltwr3hEkYZGsMjNIaGoMgTe+FHKzNMp4UIJUOViKaukKgSAoPMBRkdzPIysgyvmhpnRlvGhyqMq4gzKmKHzTjZTEhnzrAz7fLEWhOztICsuhVRolBRjOwkWKVYWFqhFkYOZPNVgzp3HoKx0E27hIGik6WUFuYJjWH20YRNcYTIW6SRIssC1vKErN1i+eIFasMj1KpD5EnOSy++QLPZZGK4gT7//2Puz2Mty7L0Puy3hzPd8Y0xR2REZuVcU9bUXT25J5It0rZEwzRlQSRBCaRlyDAEyDYgAgYMCBIMDzT8jy3QkCVLoGxOTZOWOTabPVaxuqq6hqysnDMjYx7efKcz7MF/rH3ue5GVWd00KSEPEJkR9757373nnL32Wt/6vm/dYavIuHp1m4N7nof7OXlRkJvI088+yz/6B8eEuQSBdrXEzecoPCYKQWfha954902ee/F5Ll2+wHgyYTQaMxwOqIqMW2//gNzCaJAzGOUs54ZlG3j7nbvcf/SQe3cfc/f2Hvcen1BHT9ssWTWBWAa64xWPf/KPwae20OWUuz//Z8m1JlDjQ3ZmvkC/IKRdt6EVBwRQOW7dITqTVgMhaug6VNRnWoqkO0ut0+/TnqM8HmNkY1AyM2k+QJpipI3MkYzIXMIngo9KtmfrmzSVs0SUkbZzCJG8FBeqX/vHv8f/4E9NsbYHMVNw0QptNVluTgegagM+snfnAcMiw3X/klSESqnrwCvAN4DzZxb2A6RcAAkQt8+87E567GODAKhTgYPy65Mh/9HrjKkHefr2X0xAzFrrrTjDxOIMJJz+0T8cU7CIaeY7oKImaKGJag0uZqiU5mklAzaDc2cGV1qCyaUWcw0nRwe4bIKyhXQDfIeymu3z24xmh6jpOZ6uMm4/fox2cy48PeaDO7cYlGPefHDCe2/e46SwrOYnNPtDdDkkotm8cIn65hyUok3UWa3A08uQPcvFgtYFBoMh2kf0aokKloMB7BQti90p+03B8VGNHw94/94jHoU5J/tH5Hfv4lVOXlWMpxtcu3iO+uiAg8UJVDmT8YDZzjXObUwhSox++plLLBZIKw1YnJyQba4gjWkjwmze8I3f/jo/+N53+dqlcwwGY4q8YjQaMh4OOdk/IEYHOqPzjsWi5vDggIPDfearJcVojGs9G+cu0hrDKLMsa5jkOW2h0LffJz71Cl7LRhFjC+QYFTHJ2CWugUGF1pEyikuU1+qMjPjM0WMEviES0KFXFqo0zej0vowxSN2uZBJR9IFF11AbJ7gAIa3t3og0rHv9pxOR1wuLdPMmcpq09MRWPIC22Czy5//Cv0aRFxwe7mGtUOZV6hwY1RMg1dqL0OYZ2XDIo9s3KQvDxx1/6CCglBoBfwv492KMJ6f2TBBjjEr9mHzjo9/vLwJ/EYDJ7ukJifZD10baND2iGmPvDt8H77MOMT1kG9YnXwZRwnr8ex8slLyvmHMKlTdGAx6Cipi+XeQEaQ5eorqPgRgcSmdgIiqviEd7eFsSiqFE52SewbLjjcMVFy5f46u/8CfpQqT8p3+XV09mbB4v2KsKjo5O2NSOf3K4z59++hr/eLbByfEKZ3KWixWXn36GR3fewwVHULCqV2vagrGy23TeMxqPiD7i5wuujUaEyTkePb7FV4YTrr/yOU7euUen52x84ctU3/gud197FRs7Dt98h0cHh7z0+S+yUVmGuuXWBzeJbaCtAlU1xg+GvPKln+TurTs89dQFXnjxCq4RizeQUx4nW7gQUTbVz3Q47Tmez5m/VaMUYhaqhZorC0E8F9DgQxTFJhofNKoYEt2CqCN5VmBLi/LSbhsqRb54zMOupcvHaN0w9DOukPPQRrZDv+updSswRsMdNBEjAh6BLzlz4yV0H7RvED8ImzaYgOnnDMA6I/Bp5Bgxoo2hc5rQb1AqorXCOYe1hsVsTjadpE91uuhPI0syyYRTTgABbQIh5EQK8qwfXxYIvpMA4TyoBquinFslalVjDHXXsnNll71bb2Ns8bFr8cexKc4u2AwJAH81xvir6eGHSqmL6fmLwKP0+F3g6pmXX0mPPXHEGP9KjPFLMcYvMZimE8t6EZ/+SZLRPkquHznTZ03tG2JMc970em482iQk1qSva+XvQRODlh09CAtQhYixqg/VuAhey8UU/5KAQTEwYLXUfurcJdTu04SNq6i8RGU5KmZECsgML0xz7LymfuM16jv3uPyFL/DL58/z2tZlNr0lcy16Ffk3n7rAP20if/yLn+eXL10gp+X48R6b0w3yrEL5SGg7urphNBwLgOy7FC8NbdtS+o5P7+zw/Be/yI2tMTemO/zWnX3uff2bHLoTQhYx792m2Z7y/IUdNscVJ8pgj+Z899vfQn/zG0zufEC4fx9rFKXJ6NoWl+cMjWRd9+7ss7FhKTeuERPivHn1WY7G1wkqS7baLaGsUFHMQoLW6HxARDKF1nfEmJyflEbrgsyIe5DNcjAKa8SKy7UeYd4pBqUlRLBFiSkrlFsSjSYqg9djHhjLype4ZK+te/BMSQYTUKKzAII6xZZ6JqCwBR26bSCaFBaUWIOlgNITxogBrUJyg5JAobzcbyYEiDKFWsaXBWYHB3R1vbZBl4Ul/xHGH3LuUj0fk3kOPgnYjCJ2p0tWqw7jZujVCXZ+D7U8QgHGCDYWibjWMV82HFnNM1/5yY9d339gEEho/38KvB5j/Mtnnvq7wJ9Lf/9zwN858/ifVXL8JHD84/CA/lgvbDhzktSTf574+ZTe90F1/YGRmU+JTvwjjOF1dDjzRNJhR5WEGKq3eGZdLqxTOyAzWnwNbEbICvxgg1iNIS+JJhk9Go3WFaNLVygGBeraDTbKCn20wtw4x3/vucs055+mGA8gC7y6V/Ov/+QXuPTSMzz34g3O+UjbLvBtx2hzS9pkTcN8tcCHjiuXL6KUwShNnhlU7chWNXvO0d57SFlOmV66zJV8yt946z6vv7uPW0YeZTCul9ybzdFkXBmMUZMpF3XG54/fo2lbEUgp2CpyGqeJ001WJyJGMoXC+MBXfumLPPP5zwAQzr/ManIZnGhA8BE9rIjDIRgjizE3mMEAbJYs3hIIrnQi0ERslmHzQoI4goo3TQ0xUC/nlJnsup3riKFD+xadxFMzXbFnxnQmx52t5dc3xpmNQ3H6f9I1PvNv78SMw2iFNvLnw4muUkr4J+JrlW6hmOp8BcgYs+gjWhvOX7qELQphxCYq9Clx6SPudS3itQwlqsmYNjcFSsk9pkJHHlZot8KELondUsvSi4nN3tEhHzx8RByNPnbt/WHKgZ8G/gzwqlLqu+mxvwT8b4G/rpT6t4EPgP9Reu7vIe3Bd5AW4Z//Q/yOj1it8HG8//jEhVSnQaOPqtFTqEDT7/iqH96gPnxnyGuiEYKIIsk/4/q9e/wBkrGkUtRK01gL3khL0MxESGTzRG+tUWpFcIZ7P3yfbGjZzjo+cBmTbMju+at84xvf5ec+92Xenm5y9+3XeWrTc/z4MZXVLI5P0L4ltDV7R0eMN7a4/eYPmGYav2g4OTzk4OCIuumwVnNxa0JsWia2ZJQZ7LDgmfNX2G8WsL3NcG+Pw/09Op2TL5Y0XcPTkzH35jNc1jHNKybO8fRWwXfKAUUEMmhWc5besDPaYWdzwus/eIOnnrlM07Rce+EzvOpK+Ge/yf7WU8QIhgYfc8CAGcJ0C/YbwIGKlOMx9UL871KZjUoCm84HmrbD5rlkWEg513UtMTratqbrGsoyx/lAaBuicxB8uh8iKEetPDPv+ksrpkKkTYPT69qDeqe3WkyofiQ6J7eCRlqEWrpKvbOPUaIiDKnzoFSqNtfIPBAdIfoU0DQuQJ5eB0hJ1G9kMf6oojHtbsEn6bJRGKPXZfHGxiZXn7rK8dEJIXiMzYnKrJ2lQoiMJhNOVivazvP4wSM+7vjDdAd+54mz9eTxSx/x8xH4d/+g9/2RQ63/07/R6f9/hF55JgicPZEKQYKd4+k88q6LNNjT6332fdaz6TlFcxOY05M1zlJO06VLNaIm2oKIx9sM8qG8V1ejaIjBoLzwBa5UDcPgeP8b38BMzvH+eIr5+19n8tXP8eiDD9gxHXzmZZrXvkfcqdh/cJc7Hzygm59QYjm6dZ/x5oh80XIuqxhODI99YBkVVVFiTceGVWTGcbias2ta6nqD4DuyRQtPXeMLu7u8evNdZkcnjE+OOMw020PL5nTK2/szNnLFptHE4YTa5/iupTAaX1Ts64zr4wkXLmzz+N4eh48PGRc508tXeXxrBYBDo5TF2wyFRelAoEBvXiA+vkdM/WxTFWRVpOtarNE4L7iL62SKr+sEVBPsB0yW4buGGMTVablaMiwrog90q5rgOvoOgApC67Uqg+703umtv+i7AR9a/Gfvp6QeQXnBlPrbQYBkcQ6KoTezPdUgagUqRjKjUgs7Jnm5+Bb2bbu+bI1e0vY+Y3ly8fefERwRh+ALMXrBGdI9P5lMuXH9Ou/fvMne432KPBMBkdZrUlMIgcxatnd2uXf/LFb/5PGJYAwCp5uz+ojH1qtRcTq+6cwJU6w1nqL9r8AuiD6nn0bzRM1wNiBE0nQaqXnX90p/s8Rwagqh1KlIRMvAB7KSmHfgvexKQdRmURlUCBxQUWjFP353j0494qfOj/mOj3zu269SPXOFI+VZvvZN7gwzvvDgMfWlczy7NaH4zk2+bjzzw4dkZYFuO8ZVzYtf+RJ7r9/jONc8Wi447zLmB8dUkwk/u7PD3lQzPjzi+HlLU025cPMWb22VVDqwW3reG074tPP83v0P2N7Y4PpGwauPZvzE+chBdR7vGwpricuI0hknjCizkgsXdzGUNE2L92Kz5tNwPpc8F4ThKVRVZTIYi/OQUeJ0Q1BkWUnIC4Jz6NyifEypbgQf8F1Hn3VpKzbdKgQ0Clc3tAgG0ETJArQxopPQCoLGmbhG4RUy0VcCS/yRRfakcEehuoAxDpplkqMojLbp80haLt0jQ0CLc1HqGmltcMYRMetpRVoJCBmJ5GUuBqBKo6wV/8Ozx5p63H+sSPQyjs0aK4ajSSgnXoIZB/sndMHjgsKHIC7W1qyDnVaGX/mVX2EwHuNWM37zd373I5feJycI/MjRp2xn/y1pm05tIcIpWPPEdVWRt+sMRzwNFh+Zy/Qp4tkfSG+kpbUkXaNTg0mxJjcpBzQomxNtDrlkBihJ9XznQHc0TcdSLXl2nHF3rvnB/jGfvXqVX9/z/MLjfRb1IYeF5qcuXeQk00zyAXHZ8MNBzeZ+ZE8dU4we86nBgHxY0T54jBrAYrHkenBMn36Kjbrm4GTJYTXkcq24mzWM9vcoj5e8bWo23z7h7dmcerniJy5Ehp95iZ/O4d29e5yoghcmOc/YQx7uXiDemWGaOTFAyAtqNeDQrRgMB5QljMZjVJZJK773zlpr35P6DXFJjp1HxYCPEbynXS2oJmP0YMT8cB+TZwK8aNBWrYUyKllkWaXBR3zTUmQFTSO+CSa3GJMBYgprDKCC9P5jEN5/f4XFc+NMvX3mMoeeOJS6TkaDUYQ2JCKQlCKSUShQ4ohkdUaRFTgnz1lt0EQqVXCsLEEFgotoD9EHnBMw0vdS4n4ewvreXO92Zyrb5A2Qsk+VSgMyQ4wRFyJZPuTchYqd7YAeDNbEIcl+FE3bcffWXWyeURUfv9Q/wUGA03r/bG2ermORWVovuvX1kW5GjaMjQ+FZj6H+kSwg8uQTZ37naf2wdn3t8QCt1PrCoIzsMlkB0SFgkNS6OoDKKs6NItt14GGj2d2aMPclt+8f81PXzvOt2484F1tilvMb336TV168wu/cfJt2vqCJmqbtID/H/u13cMsZo5hxuzuiigozqykv7DDRBcWo4rndXR4tDqiXkQ09YHGyZBhrzqnASXBc3yq4m+WozR026Xi7U/hiwqCdkw8U54cF74w28Y/fT4FPowcjap3xcL5A5xWTTViuGrTWrFZ1snHvz31/euW8xeihbSQoBLHudn6Fnk4F2VcQvQfEI09r4dpLr1x2T2NESOO82I6v6jrxEALG2rQBaAgdhQ6Sl0SFToM2TmnBZ+6l/gY6k0sqpYgaquPbTOvHDMoF4eoVOt9RTibYvBD+fh7pmo5BUWEx5Lkl0+I8ZK3G1R27A0MVT9hDhsqoRG4LAYJ3IglYZ6Fn7r0f2fNUCjjgQ0fwHV27IssHaGA2X/Fg7xBsREfFpJBZhKdZq2a5WHDrvZt0viUvPvHOQqRrc9bBlSdOSjzzX6UUznUyLUCd6fWmaB+jTil570H44SjQ/2x84uE+oegfCjGKHDOdWI1YSymtTuXLwYLNIBZS7AV5r6gV3gdeW5Q8r5fcuHGN+x1sHTzgzuaY8r0P2Lm4yYHX7K5qDnPLt1+9w0nXcm8559nJLros2ChgcafGWMXF8ZTDxYpF57l6fgc1naDbmt0Ll2hN4IWuhmsTBmYTM9nlnfffe4RcogAAc4NJREFU5eTWm0wvT8EZfvJcSbt7gXffeod8e4vDd48oGo1VC2wGDYbw6IBFgG5YMD1/iUhk/3DBnXuPeOXlT7GcN8KtUFYWOv1plAUsu1FERS8iq5SGqxCIymC0wthSDFG7DmMzoelmlvXJw6y7BdoY2UGVSr14h0npsRiIerSKWCVd/RAVNg1xOQ3n8cyttEYKU56oCUqyj/j9b6Pmt1jGFqUNmdHUqxUja7mwu4PSGUoprM0IpIEySpNlGY1rmKkVY3fMxhtfozQldeOhlIBqrKXrmvW9FtcBqce30j/7WzK1oxUuBYEWu54wJExCHyImjVrT2qKUJbOZmLEkoVIPZtof0wj8xAQBRVyn36dACeuSXp2JoJLsnflSZyNqTKNEekQnJkOFeOZ9z2AMZ164ZnKpGACp+3RiLPbBSRFxShNtJr1cCwQDIUOZHJVFtAoELCaHZ4aa8wvL6mjO3vyIrx8s+LkLlq+Hli9vVbyyscU7G1t89fvf4zde+wBd5Pz8p57n4fY2Lx/W7C9P6C5scim7SPbZ53junfs0yvJ44Dn/+JAHAw1373Euh0cjy+X377PzR76EnlYs3/whvzpb8MV7kXPXX2BvkqO/+wNW5zdZ3rxJfTjnbtfxb11T2EHJ7HBBbFpmGlRR0Q13qBtPbGtef+Mttqqc3OYUWvH+nUcp+0GGvBipVxOKJjMUdESFZK2lZIBMjKBNTjacUO8/RGdKJuxYjY79yK+IjoE8y2S8V5C2oM1yuq7DSlsBrUV6HTG0rmbqNYdYjJfFZmJY3wsqBiKnmI/8Go9RBsknLUU9ZzQ0qFAJABcjLgTapuNw0RJCJ7MSvReWoBICmYqRnY0JmdVEo1HeY7qGgROLuTYA3tP5gA7ikXEKRrM+Z318ogclVaRrVhDGMt8SsD6d56SO1T75GgaPyQxEhfMBMbuV8Xja6B/LBfjkBIEYExPPrOtwYB3Dz3QBz7zoIwv909c+kW599M8+iQvIz0UlbaxezhzpR1on2zEAbVkPrLdicRSjJeKJJhc0t9Asq012po5Cz9jwS65MNHcfPuTntybcfOdd3o3v84Wnn+IfvH+fy0PDjRvPMD9/kafuPuaDKmcr38YWkcN8yLP39rlzfsiwtewu9ogvPsPL9x7xxuP7nJyf8OXVirvVismrv88HyyXu3Ih/rXiB1xcL4uqY7NEx7xrFZ1vH37r7mHMbY25Mc0Lc42FxmeNHBwxzxdGqZaOqOA7gXSAax9def59poejmHdeffZpZU6P72rsPtuuODnhjiLY8c30B0o2rFcVowuLRPfCF6OYJKJ2lm73FRys26MnV17UtxmZ0Ufr43geUzdFR4ZXYzwdTY1zEJqfRTIvFuihTT/GAuP48Gqec8BbaFZPQMB5UOB/F+yAKq7ANmtFkyqkWQQ4XA8vlkkGRMxmV5DajaVq0DRR1S9Ms0ZnMSwjBk2kl4LGXbCauM4Iz+ee6bNFkRv4oJZ2EfjoSSmFN6nqFiA8uVTjSjSDdp67rcE2NUoH2k+4sBBBSeq5UX1eyHu4pR1+np+PH8Aq0FgzBpTTy7HNPIsL9W/UX9smgIcPETvGB3vfNWiNuI7GPyhaMh5hBDGgfUSZQmyH/8cEm10LJjlpw0W6xnbXcuFCi/Yqfzkts1zF77w3+3KUNusND4tFNFvP7xNmCwbUb6KOGpq7Z2XIsH+3xVHcOTM7xKqBv3uQHTcvz1y7zaO+IbyrPK5s53779HpdfeoqJs8yH8BM3XsC1gaNuTrj5iFcPH/LcpV3mdcesbricwyM7oXnwCGU0NZpGGw7mTUKzVxx4+Htf+32+fOUSb+1vcfP48BTQimfqqCgYQDQaspJe0RYTCzN4kRHnmSUbVHSqFROWC0/TPboJPmAi0vOOEWssrRf3X5PlGGvIbM68jcSyRNEABatgWZAxsS154oU0AaLWkkyaXhAUz5SCGkxAB09x8zVGFTIYNdM4IiYYDJaNyRbPPP88XY+DetkgOudp2w4jY6gxuiXTGnTEFpbD2YKQhtegBeXvQcizrkUk3OSJKIVi1TpWIYIyQqRKitmza0IplQaPaKy1cr+mTMI5T/BimHpUNx+98PgEBQEVELT/7K589vioTODJd1g/F84Gjw+pxD7q6L0L1r6E/c3SPx9C4o8bjNHkeYbSRtqCuu9NylSYqC0BT7QZ2jseDofstSWRDXS3wnQOczCj6mDgHBMaRioyfHzEJRPYXs7I9AHbOqN6900GBorKku8f4ssBs4N7DHYqrHI8Opjx7O42zckjbOw4LgYc3Dsk39zm/Q8esb2YUz73Avff+T7bF57h8vPPcf/br6IoaFcnNFHz6OCEfFvzyIzYn93k2Cl8VmFNyZELqCyQh5ZF2KDNI6tM8e037/C4RQBRQEReZy6M9LUwxWDdoI0pE/De47qWPC+wg03a+X30uevoX/mzqL/5f4H5IZFa1mwEk1ncfEVbt+gsJ0QxkfFFCXnBOaU58IpWa6y3jP2c2HbpPkiLZn0pz6DwOqapQYbYnbD54D3yUUGIGhUi3ogLUOzg4vY5PvfC83gvIqAYAjptMspa2q7l9q0PqN0szUiMFK6DyZDQd5JURFuZKNSPTF9jAD19Uku00On5YHK8LUEbXOcxURH8GQar1sl/MbUw9WmrNnhH23Y0rWBnh81px+TDxycjCESk56sM/sOPw4/u4E9kAR+OCop/ntLhtD0YIa6bMesnVSoHxKFIWkpGCU8AgrANjQYkM1BRixDJBgIBVEHEQQy46MFrlM1ZOPm+MWiZWNQGsuiwNLBaUMSOUgUKrSiMpsgMgzwndx3b7xsuDkY8Owzk9+csY06MsOVrqtJQhRWrkyXHdY19/XVGqqV5dMTs3bfxdGx2jndjRrM64enCogYVj1TFQkWe3j3Hc/mEd4pcxptHWKpMZkIbyz+9tccin9ANJmt8XVRvWjCCYHvXDLj+EupbI9RJi0c0+S6IRVrUBltm6OMcNdwkbl0nbF1AnTxG65IYpEdelCVHhweoEuquRnnL0jXEczuEqmLPOZlIBHQq8KAzTNL16wfNxijmsfHMPaGTAlD5wOhkj43K4XzAxYCJspO2eLQuuHzhKhc2JzgX1yVmDOEMESiyf7DP8d4CrwSh99FQTMYELzJfFTVYs6aoK8AqmalIaokqktEuyfBEp/aj0pDnwjuQfiijoRi1ZCbiMGRZRtTSVhTxdGTpPLOmpcYyi6el2YePT0YQIIrCI/twu69/ro9+H5og0x8fW+/Dj7QZPuopBUT1oWRDpcw2rD9K/3hAbMbRBkwUYDD6M4MndOKcSqCIOt2BNhOLciujqgKJ2OI9QWmaqGiigQIW9SHatamNHtcOxhrAwPZJx//0cxd45vw2333/Ln/9nQP2g+cL166RnTxAqY7zwzE79oir4wpGFeqo5rlqk7snj3k509wlUlAxm26gleZnrj7PTHl+69338NevM9SRuQm0akA0Fq3gqPNgayKnPvYxdAnY14iKRhF9B9tX4fO/CL/9q8LxRxxwg/ciyy4yFBm+GslcyYufQr3/TXQc0+mAD4GsKASg8wEVHJnSBJ8TP/0KKiq63n8CiMoBYY1VKNUvJr3O9kh1tYpanKpCzYWDd8lVxzLNGHTJqFbFyCCf8PSNy5R5jlOnu2kIAWNFlJZZw3Q44YP79/FBhsl2PkBW4CvhEESjCZ2X1D1tapO8ZFUHVkSiDkiBoPGpLW2UIlMapZOU3QgwHZJq0dqMPIsYZcmyjMxmCe9WGGPQxlKOJ9RNwHzSg4DqudhKUPkP909VPLVa7kc0PXl8CC+As/yhs4/+6GvUmX/HD/2oOp05IExESbdEzZi4C2sSSvpcSqVuhJEFoQxKOfn8RlSLmEym0IReSmtF39B/N1PI6PXlHopW/FCS+USIGh1yTrqWv/1owOYv/wX+y3/yv2bhc6KKLKcTHi0WHOzNifs1lc6Ju1fIr16j8J582VIONjChRY8bpkXHP2q3MYXia03kgcp5/tPP8Naxx1gtWvWgiLGFUDD2SxwFTQjrTEBao1K7ogrQERUtsZ4Tn/85eO0bqMe3JQCGIAHTOVRmsNWALs+JIaKe+wL87t+V6ULep7hpwWqcayniAFVY2LxMvPEsdC41eiRb075DBy+uUXDaFdLyPXr3nrSUUAauPnif6fKIY9/Q+0tI5aIYlIYyG3D1yha51lh1ulxCiOvrb1VkZzoieIXvoSclE6sWzrOqWx7ducv53XNpYpCAlSerBh8VURthWJ4lX0WooqcgoJJRSBM6SiMlWNN1LFYrnIu4qClHE9kgVC+djtRNzUnd0MScfPgvJiD6b/4Qb+Un2jfyuIAmMvjhzI+fXfP9hT2jPJSaSoZWxvULf7RsOEVkP+Lz9C1BJYSh3vRUAEMZaxXP9JzXLZ8+Q4gBghawQyspFWBN5IgJQ0BHok8AkT2VQetsl5DnhPkjdFev1XLyVVu8UsxDwdazT7Pw27T+LVCwPFkSKeiQ1tBs9zLmxqeZ60LadVoWrI6gF55Lk8jzW5t8/3HDN+0A7aA8duRFySwqPBkRyWgMgdZpFAGrHF26aXX0kg3oTK5ViGKGaXLU0BI/999B/fpfo/fEizESYkA3kWw8YOXSEJmLzxC/8Iv47/2myGqJsptVFUopvAsUZQ7TDYw3+NAlL0nhCuh+XkA8Ledi37n4ENYUdWBz/oArR+/wIC7IsHQqrH0D0RprDTsbW+xMCppVwGub7gVAS9oul9Bz7cIWIQTxE4hevAeVJ2rLu3sH/OSz18kKu74HtE00ZC/+ADgZeht7J2JgkimGOPAOkyYq93wCMT8VT4N+9HkIcY0LgAQqFxVBGbL848lCfyg/gf82Dhn8mJ8COemPTtNdxSo4ESMQDEUTnywb0lEpsZNSRJQKp8+f7cbEjw4AQtYw4jsfk3vrmRvIak1rc1RXozuHOnNhzvxF3isxDddjqrVJHyN9F61lcIk1qVTIBBU3GpflMNxET85DPiZo0d5HbZNaLHBwfJff/vo/wNj9tLsoVHQMBwWqLNCXnyU+9TJeV4KSWyNzAZTGq0BXRB7MIsdN5GSlUdEQspwPFo4pns3eVSl1bSBShYZMBcZxhVVNOoWO3NdkKqBjQOPRwacgqIjb14jFcN0Skx67DPBEW4rgsRGUtcTP/zxmvCXnysvwkTxRsstyQHAOmw+JoSV6uRu0lvZy1JUQmYIAgzFlViquETjo623vyd5/k8ODh4RVR1RRxsMRyVQk15GmieycG7JYrEQz0TUE72SitJMuB8nau8oNl3Y2gYjRliKzaWF6bh0cMfMpawxenIojuChWYiSG5DpzSfdr51wad+9puxYdUss6eLx34vXgOjon92GWSRAOUQJL13X4zuO6TtyQP+b4ZGQCaWXGte5zvbXKzqIQY4UewQ8BpRU2s7StY932AVQMXLYN7zUF3pwBCfvf8+HKYf3vs5lBT1NOApSkHeh5A0EraIWwHMvT8mSdGaTMZF3C9O+XYoQyadFHcTZ64kMGuSlQmqAsutqArEAtT4iLQ2yu8a0nuo62WfDwwU3yDGpl0Gha5ykHI8z1F3GTp2RhxZaIpJFi3qIhGhQeVGS6eYmfuzLmztdfY06k3TrHg8URP/vylN850DzqxGBDh46BqnFGC9IdxVnIaId1GTVWdrf0vWN0BGXhwhXi5euom98jEsT9WbVok+NVQHVBtBaVRV+8Trz+CuGDb9B1DePxmHIwoDms6UJgYEvazS1C50BbxNcw4NEMrSL6BhVa+a462db1gTr2BYzQkQ8ePqTbf4zKJLgHpQTwVVK3B6945/33+C//5oyoc4yyVFWJSeQbqw25zaRssRlt3XBysC+7tOtE8pwSk99qv8Of/uM/je0ziKDwWp1OPVbJGzMxLxWA72jbFV1o0Vpsw3yiRIu/pMeb5HytxKB0fRv5SF3XtG3D4WLGVjn52NX3iQgCESRa6+TbdqatE0MnBKK+/g4hBQIxTQDOYAQRQ2Tkl+iYJbZYf3LhdKF/BFB4tg6Jpw9K5BVL8ZAGQ7bGEqZT8A7tOrw6AwgqfSaopDfrY0O/2LUWcHBNk02Ph1QW9O02nUnpYTJMPgRb4pUDdYwKLZ3vUJllNB4yX86IxYilGjCotlCDcwi+AlEPeip6Ordp5wkQTMlhPeIv/Ilf4bd++Ig3TvYJBO7mIx4/mPGLT1/h/31zxSo2GGMwNITouRMyIUwBIeY02QATLNZ4MlpWyuCVmICoaoN45TnU7Vc5Ld1kqKqPHayW0MxRepOoS/Kd69i3fxPXFXSJWuyVpUq++tlgIFbv2hC8THZWEVbGMe48KhbpzJ+tL3uvPzkHyrcQW7EJD44uof3Be3xqMRul+eDuB+wd7tMBBN87zWC0xvmw3rO8j5QWilG17ihppQhBgv/xyZC2q1O9rzBGrQFA8TJQacNTCTeIDBQo3+BcQ27FbJSItCpjxHuP95JF9+Y3RonVCQGRsnSOKquYH88/dv19QsoB2Y5VD+jEHpdT6xv2dLM83a2f4APIg1ilccGI9tp/eLF/BD7wkY2F01YQJHVb7NN7TR1BeSNdAW3Swj8dh0YKPlKbyV34ZPLRdxaMZAX9TtUbS6wtqPpdQRNURpycI44uwPYzgryPdlnUjktPv4i/+lnC01+imV4hyy2+TYaXJg3ITmmISoGUKINTOtXyT37wA37jd9/jFz79VWgq2Q2Liu+uImPf8NVLI6zOUWQMfcuObQhxiOtHOCiLV3CJFS/qu/yceo/N2KRhsRGiR0+2CNoSO8F4glJYa8lMgOUJ+uCxlIJW080e0ClDcJ62bRlUQ2xRkqmIHVo2tIKwEroy4KJGB5iGjs+YAyq1nk2eNoH+QgsbHxXJlGNEi3YeHaT/77wjxoDVCqPABUfUHh8dWrUoE8gzw9bGBmVZkuUZWW7JCkNeaGyZoYzYjykVk8+gTir3nj6twWoCDq18GrUuVmU98BWDlLNlCOiuZX5yzHI+E7wr+QXofq5G1603Q601+wf7PH68Byg6HwlZDmVF82PmMn5CggDEKLZVayANBUG05RrT2w3KRU0rSiWwjRCljZjoko91JRJWbU4Bvf7oedoJ/ZfH+p1XnZGdGpySnbkXaYQIPjiwhVxIo/DKSFqq08LWp+8Zka8DvbFmOP3dUhcIx8CmlmIfDPryJgGRkrsowQNMDuWIuP0UXHqWvdby1NXLMD0HZUU04vunVvPkb5AR+1kOKhIU4oATQyq/NMcs+a9+89f47DNX+OzFz6DICApmdsA/ffMBz1Wel8cDVFSsYo7qVuKln2Jw0AUqBjI/ZxQ6ct/RelHXqQDarYi714TJGQMOJ6aoeKnjadHf/i3oOmIXiO2RBDAFi8UCpRV5NAQVach4nI3ITcZQZRS0vKxn/HeLR/wbw3tsqiWhX0wEdAhpSKgRCbqRwFq+8zqXC7h4cYvt7W22tzbY2thgMhxRliVFUVIWI0pbMRkMmVQTNqspw2KAd54yLxhUFVVeUGUFZZZT2AKLAHNWWfJo0LGBNpAZyKxdZ4wmGZ6uMbAAJioy5SmNwXpH3i3wGlYnj5gf7QuXKESMKQheYZRBk6N1RmYF6xkORpw7v0tTL3DNCuc1bRvZ3T73sWvvE1EOABC9UIc5C46AzuxpXbeerpoyB61ZT25PKXeD5lGnZddJI6Ll+R436NPR9D7rUuJsPdDHjdMMICTARX61SXe3iEdij+oaexoIYuIJZCEhQIL8k2ilMSajiyQGScnDaY0IZz4b6fkUEEIgmgwXI48Pj/nyc9fRap8QA4333Lt1i5htoUYbMivxya/G+pelr0hU3Gke8df+zm/wJ3/qZ3nwWx/wyB0SNXygd7j1wQP+1Bde4f/xw3s8jmOc3ULRQTyd5oR1nDSeoqsY2yWtzokInqMBP71AzCfobp/oIVqpuyMKbRX+8Vvw+AO4+CxmNsdoRWYzfPA0TUtejanrGWZc0hRDgh3S+iVXVceL+YztuOLEl7y7HDDov6yPrOdUENGp+gpK0zx+wIPH+wwnJSE4bPJrtHlOZSU7y/OCq9eusbm5KVmg92jUWj1oc0sIyf5LKU7qloePH+J8l5pWhmjAKsvSd7z+9l3GGxfYyDV7bSCQpg2r00zXBU0Za5Sq0UaBgZ3REDU/gSgU6UjAFhnKGIxV6EyGjmilMLl0xmIIDIqCqrAsneLenVsfu/Q+EUHgdB2mWqbv1aa+uzjF9PthshJP9fkT5X56I68sYvGUUGJ19qaX1NwqIWWEdXB4snRQSthXxpg0Ils+R18SrDkBKuEAWhRcmFxqx7Sri2us6ObhTGraB6S1FPojcIoPnaAPj9FGaeZ1BxG2tWdYRfYXS3YvXuCkzuiyHNDCljujVHsiDtLDGIZv7r/BS4c3+LmrP8Gvvv/bxLCiqxyv+5KN117lS9sX+NV3InNVEoKCTIKAjpGdrmNlDY8Ys60WBGMFQFURHyMxL1HXPk34wa+jQurHR2EaahUxfkX3+u+hLr+I8wuqKI5B2hhc2zCaTGmXx5i8hCxDEzkXO66pmnud4qru+Ef1eVbumEuqD05RcBAt905QWuZUmkhWH5FnGSZKPJf0PeCCCG88cDJvOK5vgr4lZWlUa2vRzEiNbozFai2DRXSf2oPShkBNkRcoGtrac3/vkMn2FemcJIyr11SIVD2ilKENYG1JbRtcEzg8mqNHA9xsQTnJACEqZUXef/h1+ayS+1Agsuw8cwfD7fOMbMm9Dz7aWeiTUQ6kqClDRPuebjgNAB+q23vizrqOXps0nqn5Y2oS9tx+OC0LotRoH3rX04/Tqwdj75TTvyz9W2kiWkZmGyt1vUm+AlkOWSnBQGegc5SxYPTpZ+kDljpTAsSzOMTHnKN1aaPSedC0ASbDnP/+V15h5UrmW9uE8ZiiENRaWdaBZu133xOa1i7LFqVgUQT+P9/6Bn/8Zy7x8viSzBAIBbday/2gePTetxngUbogw6OSU04ZV2QsIU5xWcuJHpHbKMM7vMyWxNeoz/wMygwS0OolR/MBGyPRWLI3fw9190101+IQXkTwjq7tyHLFcFgRBxuoaoJxDefVCuWlXXenM9xVFT50xD7760uzVC722aM+PmKw3Ac6GTwak3dEAv16V+kQGlzsiEahM4XJFNEEnPG0qqHpFtT1MSezfY6OHzObnxCjLNCoogjNfKSrWzoXOV4cUgM1WpyBYyrzejBZy9A9pzKCj4x8i4ow2d1hsr3N+++9x/HeHtE5yiKnrApG4yGj0SjNQFRYbQk+0vlIGzXVdIfGpa7HxxyfjCAAoGRoqOoBLE5L5ycXaE/lPVvnn11YnAYHya9/5FdFoIuiCV+/qfrwTyiUMqchoC/nVT+gUiK573+vFiowNpdAoEUsoqxw7qVUSIHiifpfrXfn06zmdIGe4gd6/ZxKNwwYvNK8+vY9fvv9WzyMGTpmrE4OOb85QQWFcggm0GMS9CXVWb2DMN2id9xvjvhP/uY/5l/98pfI6vPkyqKHA763MFRZha0U1msGJgpWAzhleejGNDpnK3pOvKKN4n+vQiJ7uY64vYMeTOV0Jj/GiNhu+dDgj48w3/8nZN0CrwIu9b+1BrdaYcuCdrRBpywhtLythwy0xzq4E8cQHNZ1ZL0HBTKqSzYMKQ2jVWSP72G9mJ2maggfRRQkUExMhhwmkW/k37514AM6iqZCG+H6ByWmoELWEWo0IeA6j3OdEIei5+BkQRc76m6F0pDrwMgqCmCoNTo6hH4uMSvWSyLynqvVgudefJbN3e0ksYYyzykyQ5aLnkBFyPIcZWSKcpYL3bieLzna/xdwG/5v69AgHmr0tXJKf58IU33q9KHHftwOyoeCRf+Ss//+qCOlaiHtDM452UWUWFCf/vY+27Dgu4T6p0VPqvdj1m/28nl6M9K1fFQWuVhRebmrnigR+tJDnQaQtLNHY3h8dIIvM2GV6ciknHLQCS02qkjmHdqHZPbpUb18NaYpTCTUOohK8oPZfRb79/mlGzf4wYN32MgNDw5ew29ZvNPUqsP5QqiugIsFZJqgS276iYCX62GZcd3tQSl0OSAsY5LO9tcigtcQl6gffh2vIrnJ6UdqdV1Lt1oRhmPa6RZRR5wviUS+48Y4Y9FofDQQmiT/Po2pAg5LOo9XMM3wAfIzrlR9W6/HluScRCIOFQUDMCm69B89JlXhaWYZcUFwA6XlzLqIWNRpxaP9Yyb3HnK9eIEDrTg2HSGsOK8rZr4hV4rV+pYw+M6T6ZzQedrlivnshFJZYgyMq5LtyQSbRbrA2vFKJf8FnCPXipgXbF3c4uCTHgQiUkZj9Bl6Lqep78eVzE8AZ2cL3TMF7z/PcTZIJGprj9Z77zHeY7ROfgXy8+LqYoXjEFLQihay/LSLQW94mnCNnjXUmxHq3pSk1w9wBshMR29p1rcke4mqMTTOMYjS2pvUMwal5935iklYMXQzJixRVYU2FkOkMJpMZ2SFLOLOtWg0JisYbw55+fmnuPnmt3j2wiW+eOU69fKQv/uD23SjHYIfYqPGqoA3q/VnC9qilCNYAU3lK/ZAqpaMA0PXf6fgUaH3CpQ2mvOR9mTOaDCiUx2o1HXxnqaNDMeaYjClQ3PDnuCDZaYtrbKsghUGYujSzQSKkARnEaPl9OsYaepjYYIqhY8yfjw+0d4FhQzwyGMmyk8tQqEQ4loQFhNo3Hv7KaVPh+bGmHCG/m6MTPIBm9MJRiv80jEKlrkKHIaWZfCMVZaytECuNNo5lNUEY6mGI7IyqSvbFZNhwcZkiMZRd0FkzwibkAjROQZlxfHtB2zsDrly8Rpvffejb/tPRBAAqW+D7khTJNN67lP6D/3whxcI9Fs7fKi99rHHxz3fZ8ooYpKOipONmGHS39x9G/Ns3WmSZkBb1ndJjETvZLGbLO00fWALp39Ceo8fSQLS+/cprZKxar31elBpIMXqiM2jGVN3zNHMcS5UjJSDcpOZHdPGjOBkQeml1M1Ke/muNgOjJRN7cMzX3/1dXrq8iV9E/so336QrWtRglwvBkvkVeXAUwZGl7oDsmjkqOlA5YoR1inXQ6+ejQmWWXu8eg1/vpB4vA06VS24/leygabF23RLf5NzggAdcpPBLLhSeH7ZTFkHhVACVoZwmJkP/6D0Yi2jz5PkuOqq9fUnUOC3xBAfog7U8bpTCag0ZlJWlOXEURS6ef2mc2RP4UdKFnEJQYT0gGSKruMK1HUckvwM8m9pSR1hpxTLIzMNApAkBq6AsMopqQMRisgJX1yjfMqhyJtMxRnv0ohbC2noZqGRoGmmamvu3b1GW449dCp+YIBAJKK8gRU/l+x6qWEuvF1VfHyTm1dqRpV+MMY2D9inlxnxosZ/5+9pyKr231uvFF5UwyKwuUCoSfEuMJT5CplL7LyRaVgJdRLCUgM0oHQoRjYsTsQ4Z0SiUjsRYo60lugBWEVwKdlpSV9V/loh0KJQmGPE8NMoRKNHAeHXAZ597jnt37uCpuXLpOlevPMP1556lKku8C9RNhzYZbeNouw4XAkErutZzeHjEe/fe4+aDu7ijObku+aVf/AkO792DgaXdHBOyDG2HBHeTYZgDkYFrOJ9IOSoY0E3qXmiiFm/AmK5nf25VZ9HlAEdHcBbvI6bvVqhIxAv7zmjyTHbifu5D23mOj/d5+vb7THavktkZ10LGTQOlb3gYNSvV0bqOuo/LdBIYQPgHxZLcK4rHj7BK5iFAD7+cdp18KgG3N6Z8/kufRX8qZ+fCkL23HvL1X3uP2EGMFmVaSDMHepm0dwGT9epQ0fbHGHA+4lRkvlxwpAyd7ahs5LzxvKVKqqWm1XNi21CaQIg5g3ZFVJF2ucD5OuFPsHQebTLKvCCEVrCrKCWBTEZqsLmmcR0bm1t0tqDIC44/Zu19YoIAaU2rj9yhzwJ38cy/Y0o15WYR8EcTvGznKmUT8cPvBaev7/9xNuOIwtjSRq2ZWcak2e8xYqNLJo6iJ+9nyfXaddlTVApSER0sESNIvdeoUEhJ4I9RRssNpcK6xMAgLrqksoSASnx17SOhadkYRK4Mc65fO8/1K5s8f/UKqwYetS03Zw0//Par8pqYALL0epNEMkp5AQ5ROFUzGYKdjCizAcvFvohVgnRnQgLX2rrDBBHGXMlnjLUo07SaQyyEm4GT7+BrTFbgo0KFDBMi0OBMhnI52nhiV9NpIWGpTjIDlVsIgdB0BHqn5yCGM8dzXv3h19mcbvKp515i5jsuqQMWscQz5K6t0HRUmXyuTBWJlamI1siQ1NkMVR9B1mdTp3dHjBFrZZjI7u4O53Z3OdmfM2LAWz94jDs+4LNf3uHt371NowKtJ83AOL23jBEpfH8vF5kVNyUibYC869gZe+pOfA9fWwQmlafNGq6ajIfKY21ObAN5NyO2Hd1KYYKnPpkxKHKm0w3ysqKsKop8iIua42VLZnPZx4IhoGhdBsrj50cc7R1+7NL7xASB3hb6R0r/sxpiBafUwfRA/6KUhqkIhECuZShFHSCe3fE/fKwfOpODKxJyLVRSSLuxl7pdBw/eobR90uQkReonOhcxEpVBByXqNu8YxpbdqeLWI/DKII52UhJFpVEhk+iuZNJtFjUjDFVsKQ1cu77LjcvblIUMRX1w2PL+3iEfnKzY6xRNNsClgKLWAS5C9NC1EBxKCailMQJGso0mI3aKN253/PROTutS2wyxtQqxTXmyI3eaRZ4AOC/0Z0NPzVJElRFRKBNRqsX4iPYOU+bEQSV+eF1Lc3wgmVbnUn9d49uO4BtCEBqvuDpHdDA0zYrm1/5rTo4O+eKlHYiaUePJM8/CD+nuf8DeSnjy9vv/XyxgvSd2HS40xFWHWs2gOHsfSUlw9u8bkylKW+oQGCwD+3tzZgdH/OyL57l/KfLwm/fYuPIUPniZKRACxvSqUdnRjEnD7WIgMwYV4Hi25OpWxBUR38LEKFZYdBO4et7zaD9j0TnG0XF5bMmGQ0yZobIMpTRZXtDULUVRMhqPIDjyPEetOuGyxECZl6zqyCzmNLM9VL1kfPkyi4+ZRPYHBgGl1FXgvwDOp7P2V2KM/2el1P8G+AvA4/SjfynG+PfSa/4D4N9GisP/eYzxH/5Bv+f0eiQwaZ2Xn8kCepxgXXRBr7iT153+3Wip20P4qIXfI9N9SyjNnkNOIvSGp+C9GIJYY5JIQ2OzAm37wSfx9LNHhNXovbSSvAPXwuoB26tj1PEhOXBhc8C2DjTzR9y4dI2Xrz/Psm44Oj4UkC4EhFwbCK1ia2OH6cYAoxZMKkswmnfvH/D+o8C9JjAL0IUSTClep8neq89IYqqtBS4RL4SQ3HdiT61WBocGo1lhsCaj6XqIxAMd6A7T1DRvf5fvx0CZnHb0d/4hVinwDZGU2fgWryJoIcEYLeCcv3UPZ3Oa5YzQ1RL8jZHP7BylzRhv77CYryToIiPIVNfiQiAScCoS797h/faErJkxySu0czydw2Gcc6+TTMB97dcISou3gtYU1qAKQzEcoVRBP1ouhJhwVrV+TFsrArQQ6PAs5wsWy5Z3337I5Z/4FHfe2MMCXTgFoVU6r5kx+CAtw8Y5wWxiBBUx8wXXmyWv5QWrrmPUtbxUzPhnesjN/SVj7zDacL455opueIgmmByd5VTVlKABOiajIaFryKzh8Hi2xllU1HSu5q2373H/uCE7d1EwjfDxPIE/TCbggH8/xvj7Sqkx8G2l1D9Oz/2fYoz/h7M/rJR6CfjXgZeBS8CvKaWei/2kio85ZD2HdX0taf7Z4RasMb8EwUvEDSpVBDGh0hodFa2PeB9PA4Rs7+m3ye6m+rFXpp9Vh/xc4iHIWCzffzpBgDVkyqO9x1nStFpOOwkRMIYMz7Q5onlwC7v/gK+8/BTXPnONH777Hnv7D1kUY164sY3Wir/zO98Grem8w+Apleby9oTnn77ExQu7LJc1KMP9w5rfu3PAvaOaI29oixJ0KSYqVlhiCgMk1SWwbp8qLVqCKINA+o8q/XqPyfSZc6QYaEsTpY+uZ0ecn9/l6lPX2dkK1HfusT+9wDIUwO/C7jW0yTDaYLMcbQq8rfDG4K34IxRlhq1nzG/+3+mWh5ioyMcTfCcee0LyUdSrFepwn4CmGE4YjCYYY5gdHVEf7jOoBtjnXqH8o/9DzOZ5lPesNCznJ8y9pzmZEY4W8J/9+8Rf+Yu4LCNmGViLyi1m7wPia7/F1Mo05JAYpDGmYZ9K6uq8KHBBnCBCG9AOTGh5+/Uf8tzzX2T3j75A/raj3Z/jfSqBYgq86ZzHIGzJXFu8c1gCvt3jxfZ1vrJ1hdsuMtXH7A40z+cVdjWnDhGnIMsd56oRJ0WBxVLYRG82BShFllmKPCPPFLktZDKWtRzsH/Pq99/h13/z27RRk5cVShnxt/yY4w8zlfg+cD/9faaUeh24/GNe8q8C/68YYwO8r5R6B/gK8PUf81sQVXQg9t2BtIMbL6CRNkbsx1RauDpFcZ9srkK/ABLZgpSWkWiVqtduR3lSq+TiQkqV00dRfQNAds7gz7DIEnHFmJgAPlGmZ7HAZRrfLtDGgzEMH7/PM9zm0jMVV7/4Ba5fvc79WzW7WcVw+hw7ky1CbDHlhHvjN6gLR2cVUxX5uc9c4OlrW7z1zjt847Uf8MFBy2EwzF3A6YKgC2KZdApEvEoZUI+d+oiOVpxxY5CdGC/6BxVQuqPqWoIWRaSOEDsPeUAFg/IaFWpWS48KHt01DFxHZTUh77g4qIiZoz73KQDaG6/QKo3NcvHDM5bO9jZdEfKcYX3I7Df/ESrOyMoBUJKNRnBySGGh7UISHQWaxQJlLF3nqZcrds9fwBjN1uWr5CFy9Pgxg5N9NquWw0XD4aomdtCuHK5uyFsx0MjuvAu1Q9cOEyPKNmi1ovIBtEMpGRV2Gv9PFzAptVZJo68zTZlZymKDbbvJwcYRq6rFmowQIoPKChCa7ieVNipFmp2ZZNBlljMe5qiDx1x0HSYztA08bRp8CS4PFNZgbEGWldypSmYnC5qmwWYy7Uhp4a2EJlB3SzocykgG8J//7X/Ia999j4Y5XhlGq2tML11B5dXHrr5/LkxAKXUdeAX4BvDTwP9MKfVngW8h2cIhEiD+2ZmX3eHHB410yJTZ3tQhJqAs9K42ypNFMX9oiFhZyXgji9OnWkypkNZ52u1Tqhb7f0exrFJK9NwY2f36NDCGuNZzxxBQyVeuBwdVovtGZUUhGAMvbXU8XCgetjXR1wSvWbjAo4MO04DujumWb7C1c4FPf2GL1WxJvZgznQ7IspZL2xdo2wW+sOwdHvLDmzf521//Nnt1ECPNwsqCMgNQveZc2oURCZjKStaiozj3KBOISohB/QBLFUF3DSUN0+YEypx5sJiosFZh9FIYgli6bsDqZAaPDona41gQome1mrE5sRy/9y7jxYlcuq/9DVR0uPS7ASoDhIDROT5olsd7qPkxphhSpc5KvTxh49wF9h8/pF3VGDxZlgnrMnkV4DpmBwdMplMa72mdZ7toWP39v8roxnnGxmJLg44aqzW5tRSlmGr+2acjmS0o7ViMOI3ltTv3+dobcyy5XOMoAF4QKqosijzHOfEvTDpVrLXMVMFi/xC7DLy8fZ5vuUf4ThZ817YYLaPZY0r9QWjKznuheRiDtbnoDYwmi5IhtJ2jTpbgMQZawHXHaOWZzxdkeYa1hnq5IM8LDBprFNZ6CpNhnaMj8A+++S6PmDJ48TnMTEoEQ2CxOMFm/xJmESqlRsDfAv69GOOJUur/CvyHyB76HwL/R+Df+ud4v78I/EUAJjtp8Yo1FTG5DBHRSG/daDDek2clnW/ZHg5ZrRqWRgtXu20JocVoTYg6mU0H2eWUTvV8qvlT2q+IYrITSZ52pHpZLprIbiWtds6RZUXabaUNRgwEo3jjsKXzEJwn8442elwx5tb0KvdODlHv3+TTW4o/+osbbFzcZOmWfO/7b/Lc89f41HNP8erbr3L8aI/7s4639pa4YkC0BjRoNKoWwDCaGjonvgtGyUlBpTRfKKcqBlTnZHcLQXrlvkOHlhgiBZ7PPHWOzWGDUp6gpAWrlCLTmq7ThGLCp5//aZ6aLVjd+fvcfOsHLKqChxslARhVA5btjMmJpJiXDt/BGkNelhRlQZZl2CynKAo+uHWXo1krXZ8yokIGyrGYn9C1kWw4pRiNCK6BdoW1Bh+hHA4pioxMW4zJZbfVGmclA8O3NJ3iy59/iaoairuuzWibFpNIANeu3KBv0miriTqnufcArEfhCDGVir0AB/Hl0yr5VMaw7g553zv5lLz9ndtUOxUcyKC6QMBHcSsIMWIUiXeg1l2jgASbumk5ns0YZrlsQj5S100yDJFULkQZw2a0zCDQRmZqdm0LxLQhKfYPDrhwbgdtM/ZPlrzxwQNaFRlkGbvTXQ67Dtc1dMvZmkD1UccfKggopTIkAPzVGOOvAsQYH555/v8G/Nfpn3eBq2defiU99sQRY/wrwF8BKMZb8eo3/wZ12zAYjEHDsnNoY8nygcBS3lGVGbNVI1bLwxHNoubSeISLsGpabOiYDCs8mqysCF3HztYmg0HFbLng6GSGHW9xf+kIxtIpRdDJ8DMmaavzhNCRZ4oiq8m73QSqhSRFsBSLx5S338b5hjiPOBpyIiyPMMGh5zOoZ3jXEJoO3a1472HG+zd2KQdDCBHXPOK1757QNS3z+YpZu2RzVLFx+z7ueJ7SUg1KOhR9iRISbz2E5E+XPOsjCrQluI7oZSh7r5vpKx1jLArH9Kkxk1yGZ3QhMl91eB/IbEEToLAVVi2oTMcv//xP862NIWVlefOH3+Pi+QtEbdABmqXcWF/+6lfJjcVmGSGEpMcvyKzmqaee4ve++W3uP9ijXTaEzmOtIS8G6Fz0FYUNtEj93HYtNq/Y2pyyWsyJ0VFVQ5rOg/coAs51aG15++YdXv7M8yidkRkDdQ0oXCoHlGGdmRig6RpWixWZUkSE0GWUJO6pmlqXmFopPGmwLZ7ovbRWURw8OiY8nmG0IUSXMlDJPvv3EAKVTB0KCW8wBFxwjHJDlluWqxprM4ajXqMi+ETXtsQYyXINGlyQjaeqhhibY1TN4cExDx7s8/DwhKPa895r77E6mVFUI37huS0+9/wx//mv3+SdQ4ctK4rBqUX8h48/THdAAf8p8HqM8S+fefxiwgsA/iTwg/T3vwv8V0qpv4wAg88Cv/djf8dqhvre36dUgRDFMzD3+syA0kihNZjIRlRkaV6h6YIk/EHcYFQU80qvoENq//tKFK8RLaYgMbLpA8bYZBIiri7iACOlgbIaT4l/4UXql/+UGG0S8b7DaKgevc347/0XqDinMwZrPGVZcnFng/HmLt+69SbNYolW8vlMNWS6c5FXv/8Dnn3mU9SLAwZFwWSywfd+/zto1bCzO+Vwb4YJNVZ1rN2UokKHQF6WhCgec0rJdyGN2NJKFI3TjW1c29LUC2wmU5K0sUlhBhiDb2v2l47jlfDZXQgEMhn55TVZnrNqOg737tJ2nrywVKplYzDlqaee5YObNxnNVtSrFRvnh3LrxpzWiVbBGOHlr5qOptMMh1N+6Rd/ifde/x4f3LzJrA1U013pVNoMM6hwXYtvGk72lgxHQy5evMQbb7xF8J6yqsiyXKS5Sq5fcJ42dOxub7G1sUFuDS65SPkQZMoxcHR4IOmzsdQrjwdWqxprbAKYRQxmkkeFDxHXOSbTqbSEk8uQTnR2IXQGvHdok0xxlVr71BCfHHcO4J2TMhJwIfLo8JDHjweMJ1Mmk3FiTYrTU+cCTdeRW0tdtyjn5Xej0b3KFk9E8cPX3+ONdz5gd2eL/YMjQj3n+obm09uOf/OPv8LWhV2+9dYJJ4u7HB4f0Mw/fqn/YTKBnwb+DPCqUuq76bG/BPyPlVKfRwLoTeB/IuchvqaU+uvAD5HOwr/7B3UGrIadzVyELXEAStG0HTbLhKwSRPHnY8RFj82NaNCd0FX7FlTTRpyDYS43tdYix+p9AKKH1nvRqiTjRpWaYCpZNmssXbKasjFj0Izouo6ua7FFQdSKfFiyc2HCZDwl15rd8ZTp5oTxIGPZKd54y2Kcpe4aQggMhhOuXb8E0fLt3/sug0HG3dsPeOqnL2F1YDodM6rGvPHgPVarmqi8LF6dYW1OXor9dZ7nwmHPcspqgDGGqhpyfHJCllnKaogiYrRKg12FxrparVBKdpTVcokpS7SxaC2ERqUNCi1EIq25+f49Hjx6yNbuNk0z59LuBrPljOnGBpvb29x693XOX9ylqqYAOFeT5xnOe9quQ2sBsMDyve+/Tudazk8sn3n5BfaOl+zPVhyuOi7fuMHhcg4BRhvb1IsZbdPx7NOf4v133qNJ2v4H9+9TloUsPMQHcDQY8LnPvISOHU1d42MvNurIrGgiqrIU8g6KIi9Z1A3zxeI0KNJTfU1SUnqUQqjBzkEAi0n+AUKrjiFgbSHDUBJRTVqLafHLIkgMRAkGOnFUMmsotcF4T1gtmZzfIirLar5guapxQcqRxWKBMZq26SQryUQYJGWLDDL1KtDVc65d+xSczPl3vppRriLHxZTxqGCSL/h3/uQrfOb7u/zg7fv88J17fP//3yAQY/yd/rt96Ph7P+Y1/xHwH/1B790fmbVs72wnqq8Qh7xzKUVL0l3AR422OZm1GKOZzRd0XuyXQwgMczlBmLiWG/cU0L5LOFRGbJmspfNO2Fw+KQW7LmUfkboLuFjTKLlpsizH6IwutJyfbvCTn3mBjWnBILcMRxN0JgvqnTt7DMYTsqykCh6jLbYaMhpsMBhZvvvt14kx8tLLN9DGAjnaDHnr7dtMNze4eOkcNpfUWtxiJG3tmWlrnnvPawjidGuMJi9yWezJjKMnX1ZVBShC8KjNDVkYiYQVvFsvFEWkbh2bWzs8uvcA5WUC0KIJxNBRZDnnd3bYnPwEddNRt7LjDqsySQR04lZ4Vq7l/Q/u8ejxAdduXIeNbW6fnHB4Mmc2a6mXM26/9zYmzzh8eA/XNmgFX/nSlzl3focXXnyO1157E+c8bbOirZdk5ZBzl66wu7vNYDDgaH5CCBfJM4vWaVR8Wa3PVZlZ6kamGYd0j7SdI+bC/BRtUSAGIfYoL6Dw/OSEyXQKPvDWm68TFVTTiQDFPX7kZZOJinVrESU1vDVqPR8QokiWo2xGBM9yMaerl/zgO3sQYdU0jDa3iCZjrXgMgeBbVoslo80hPnopj3p3pOA4mdVYG6kmcGc2ZKvQPP3yc6jFI4gtz+5MeelPPEvgJY4ODnnxz7z2kevvE8EYrH3gnSOIISMIkicmniGirVn392MSy2gdZdiEHooluIaoFE3rKfI8uXulKitFZSL4IIw/HxzKKcpySlbmmNQGykNcyz4zFzl/7hK5tiilUTpirRaXHJsx2NiWcWGuo607tBPwbqlKnnvpZYJLlNcQWbU1t+/c5Utf+Qx/7Fd+jqZtmW5Oee3Vd5iOK1TsuHL5HHlu0dYm1LpntCkRLyWyErAWD1lrAcWIQUI34/q7aG3wQUoHndpT1trkdJSIf0aCqdTYQoterhpmJ47tac7td98noPExY3d3QFZaMhuoypJxgI3NCr77NTanU7TROCdOvYvlkuOTJavlEmLgYH+Pk5MTQlsTuxbjO0JbgyuYjEcstZCRBuWItnO8+e4HlKNNNrd22dt7TCRg84JqOGK8MWG8uUFd1xwfnzCoSsbVQEZ9I+i6TsDg7vYmnfP4GMispX54QN125FWRvAN6MlmSsKfa/eTokLZe0S1XKOeoveficEiRZ7hO3H6NlS6WxFK1DrgqdQGgb1GfAotKKboQqb1PHJQgMwyI3L17l+1z56mqijwv5dpGx97BAhUD9XLB8OIuxgRq5wkOUJat8QY7Lw/oHtzjKy8OubBVkXdH2DJHKUvwLb6bY2g/dv19IoJAORjz+Z/5ZXKl16QGuaeFH9AjtGctvzSsb2ih6iraxqG1wrmGLJFBIhHXdRhjyIxGa1jNFuRFxnRzE6Mty+WCGCNFluOjp6oKRJGpMdrSNCt++OoRz73wLFE7yuEQu7HDqluJ7bfXdKsGbRQNhnIwpG0avPPUqxV17Whbz2/8+u9z6dwOqMjJYsFwWHJ+e0BZSNqvjUhnnfPrOrJvMfnkB6CVpqwKTllqJHdamaKrjXgegHrivIk5hZQIWuk1eu29J8Qs+THCaDTgvXc/oNq4iHn0iKO7h1y6tMWlS7vcetjwwgs3GFUZOshnA9icDNOEG5VqW0fb7DIwGQ8ePUQpTVGUXL5wnSKTeQrBe+qmIc8Lss/cIPhAvWqEMNQ5Do9OuHxul81Rxd7+YxqniJ3n6OEe9WxBWeS89OwNcqPwTrKIIheeQi8my4yhLAvqpkEpmC8WaedO7TsSQagnm9KfJ8VqdkJzeEy9WmE3N6i9J89sahvr9U4vk4CSiDQBh/0IcR/jGrxFJT8HrWi6juilxb2Yz3Des7mzzerkhKPHjxgOh4zHY3Z2txkMKhGPBY8PjhBafFA8ff0Sqq4pfeCzN7Y494JmEGryQU5bT9HGEtCCj0SYbu9+7Pr7RAQBow3L1lDrFq1yUCmFV0BURCe98CwXdVpoJcXyPhKSR5vRKunSFaYY0viwjvaUJV0QZHacFwxHhjwzRBfo6KiqIQpoG1Fk1auOPBMiiYqR4By3b3/AM5+6jsqUCGtQlGVFVVT44PFFjtaayWQiyzNNMQ7O0bY1QYXkaZejtQHjUdpjlaHrfLqRIs4F7NBiraVtW7q2pcpLbJZRpOGcvcoiyzKcc1hjyKxFawGzALSW3rVK3YPgPXmeyzhtpfDI7uRcFL9AND6N8/rSlz7DD19/n+c+80X2d28RXMd7t47Z2BmxszFMNTQorTje2OA//t//7/7bu1kOzvz9u/8M/sb/8yN/bLa1RdN0LI9nhBgoq5LH+4dYW6CQOt0aJQxvH+m8T6ItORdRKeywlG4PEFvHYDrGOenQ2OQt4JxjMByxaprUWlQyKMQJYBuTRFwjHPq2c4wnW2Rtw+bmFsOhdIvmqyXWGjJraJoGpRSr2TGu7bCDksGgInpHUVqakyO+cLXkT//EFzi/scn8wR3cKpCVu9TukGgGBGNpfYdyEa0H+Kb4yPMEn5AgMKpymtmKrlKobrWu6foUc+0pWLcynhlRw/WTZnvgTxud2r59qifEIecjSkNpFL5ZUGSaycaUrm1kd4xibmGtpSgKQvBpuISUD0WR8wu/8JNMNipm8warpaeOcuRFJpN4lCazlphwBq20LNoQ6dpAnptE8JOenfMOYyxexgPgg6NzHuc9IQSyzOKKHGsMbStgm/dCppFdwWMiVNWAGCN5lmGtuM7WdS3nz2br86CtZbVaCeqNpKq+c2LmqWSIR/AdrYfOrRjlllu3HlDkQ2I0TMeGp6/uopzDlrmkvBH+s//gfyUALIo8z7HWojS4tqNtWwghgYSy45Zlj6oL0FYvFnTeYa18fpRMmLIm4QvO0fMYvPc0bYtJhLKAdCNQ8ruVtXRthzICTGbasDXYFIBUa07mizWV2igjKnAAI10F1Y/5kpuPVmmatsOw5Kkrl7j01FN849u/T+fEB0FrQwjgnSfLcpkBEHrzWlEY9tIVndSlFsVkY4NhFDxlsZiRWUvb1ihdsDiepwxX0XUNrmnJB2CUo54dEeoKoyNbuWPk93AzRbAFerRD7VqaZSAqBzoSXIfCY4rsdKbHRxyfiCAwrHIubUx4fzHDpPq+Z+/1Fzymxa31qXmCpMwx2UqndC7ZN5+CZ1LLh2T6gIIiz2hbIRbF4LE2I3pZ7EoFse9LDMEQIsEnliEaozRlWTAaDjA2SGmSePrBpdFYWb62gI46it8oolW3NgMViQ4BIq3YmGmtyawSb/r0DfMEDpaF7F4hBtbc9FQG9DuSzPgIdJ0T51ulMLr3yJPzURXFmhsvBDnxLQhBvrNYqVmyTPPSsz59zoDRDhcNwVuMibiAtPUSAcXoVLpUFS0igw5dpCwLnIssmyWDwYCmaanncwmiZZEWYyQrc8EujAReZYTD0Ae/qiyo64Y2BYSiKBiNhvQKTR882hppi44GQM/2lAEi1lqU0azqWrgSSha6T6zQHn8xiVQmQ9TFtPPKlSvsXDjPsm34/vdeTYNcInmeS+BQ0DkHRmOT3FywwyBzNBGcwvuA0QrnI4dHM/JRIVwPH3EhkOUlzgVQJt2rwjlwoaVezZkdHnFv7yHTnXM8/eynRNp9ckyrRYi1WjXUq5rFagUKbFkxqMZMti4xGA4+ympzfXwigoCxhleeOc/jN1qcb9Y2egFxUH1Ss51aJSkwoJAbnVQ9kG5uhYy4Rq2R8tIoCgLTsaT/WoHJcxTSghN3GLemkzapnooC/GKt7OYxpY0xRNH6+R6akF0vOC+ehMiCU1oRoqeXesbUthRgTqjIzjmMOeWur52Dwiml2Vqb3pd1UNCIL2DPCJKdOCFUUYJolgkA2GME0inoR2snD7yo1gNDlRYANnhPcOJrYEMg5EllF6JMEEJ89733ZHlO23XyGTt53XzerbOTnoBjy4K2rSmNTl4FKVglTrxJP6+1kUwCyLIMbSx5KmWUEtwhT/ReZSR9d04AwJiwE4jrz+edY1k3GKvRWupzH3tWqtiCrT0RU8FlMsOqWfHu2+9QTbeYbm5hixyTRpWFkExbE36V9hx6t2K5+5IvYYwQlMwnxFINhrRdJ90tF8nynNi25LlBFTJbIAaPPZxjjCIvh3zuK18lKzNaB4tFi5/NWNZLYmY4PDhk/9ERdStZlAsZBKimH7Czs8X58+c/dv19MoKANvyRr36a77x7jz09Aloh7WgBAPthjD1vH07JGHLENAQijWlKSLohtW+iEDyUUgwHJZmVVNYYg01AWu8bqNCJGRjpTuYoBJQTCa605PKsxEfZ/ULT0nQNVhsxG/Kyq/QDKXyqCYuiSK04aaGdLvbTcWpn/2+MWS/6LGUEzkmbK9MyfNTabC1xtnmWxqVFbJHL99caayx5np3OTkgBpZ+nIMi2LJSolPAjMiNBQCt0nuG6jkwJucr5QKYkzRX+wel7aa3PPKbwPuC8o121jNWYLM/Q1lDlGSbL8D5Q2L4FKp9VgqEAl2VZrDkHTSsdjP662yyjcx2D0ZAmdTcEWxFE3q1nRUA0MFsu6Xwgt0JD9zEm0VnKGJUSFWZawIZk0601RoMKMjasyA1dEAiw98PsO1DrLDX0gVYAW59k3CF6lNYsViuybBttNcY5YpBSz2aWrm3QSBDsgl+DvK0LZFWF9wEfA3cPFfmqIs9zMnKq85fY3GiYz2Ysm4hrOiYFTMqKAMxXH58KfCKCAEpx+alL/Bu/9GX+2u9+l/2ZosViYlwPHOqR3N5IqI8BsvP3nQNZwEar9U6arjXbm1N2RhWZkEEJ3lOVOXlusTrKLqQ1d27f59ath2zsbHDx0mXKYkxmNFWRYXWkLBRZoRhsjBkMB8z2HlMOyjQ3b4UPHmvETcanWj3EKOWHEcKPfK5TZaJSkuJqrSnLkn7GXAiBqqrWwWE0Gq1vUuG2+/XCDmkuX59ZaK0F70iLszfDBOERuDNMthACbduuF8N8Nlt/B2Ikz3Ja5zCZkHB8EEPLPPkFeu8xNmM8Fh+7EALz2Yyqsum7bRGBoihomybt0on74aUT0jQtqtRoY5Kpp8UYJeO1fRDkX2m6lG0IlqHxzsvoL5I+QKk0Tt4SfSAvCuqmpm4cLoJzHZmxZFqchG0KYCHRwnvXYEwacJPwiVxDbiJFblk0DTGmDkvilYQgrkTSItQyrq6nJKXMUjI9TecDW9vbLBYLopcSz0Uxb3BdRdO0LJdLjo5nPN7b58KVATLnoiLXmqDmfOv1d/nuN77O5d0ttsuSkFW8s3dIFw2h05Rxyc9+/gZhc0D0nrsPHnzs8vtEBIEItAq+8JOvcPlTV/nB6+/z97/xffYWDl1atOvExUcLlZgzwItSyTs+SMAIfVqWDmtEkLJaLOlMYDQZpboQ2WlUpMw1s9mc/eM5e3v7lGXGaDCkXtTsP9jn8OEJ7712C9e1NE3Du++8x2A0ZLJRcX5nJJRW4yhyizVC7+wXYQhBatYzH6qsKrSSefJSQ8pn7lt3wUuU69N355yIpGJKb52TtDe1SEUi3PMhIioEmtUKlboH0QuF2Adht4cQsErTNY0YWwZRTfbTmMq8ILd52p2ECWjznJjAvwg430k6HwXnCP1nCZIJDVPwiiHi2k5281UNJH1AkUsAco7oHEWeoWJYlwGRCJ2UN8YY6qYBpUSXn6XBKmkXFmwn0nYNzom/n9IqpexS3ixXtWRKWvAQrQ151gvKBBPxXjASqenlXChtMEHsJ5vWERZLVAo+axKX9B3xzhNtKk0TP6PrOqwxdMmYVBE5aVYsV0sUQUBeH9BWpaCs152n7a1dGhcQI27hMZg8J48Fr3z281zZ3RQDWyxZVvKc0ajoCSpitSVXCmM1bd2wuzH92PX3iQgCIXiic1gduLQ74tLO5/jCi8/ye99/j1ffvcP7R3vECFZFgkbq4Mwm9D4mICyeAQ3PpApEXOvJDexujqmKDOcDtsixWrNazHjm+vM8fvyYrvNMN6Y8frzP7Vu3yWyBNTmrxYKyKtAK5rNjLlzYZWd3yPbOFovZEcPxkKD6GlCCU5Zlqb5WhC6s+Q467XL9Atda44KYVep049hMUukss3RdR24kdTbGCNJeFGtMJATpJjgvmQMhUmUZlTXSpUg3qkq1a55lKK0psgLnHJ1zlEWxrnGNlT57lhW0bUteSDCIaadD9dyCAq30ExNxxfK6Jy1ZXNet0fgQAnme4b1MGvZBdBA6AZxdK8HEeUfddAmaS7V1yjbKsqQqCiJQFkVS1clO2zQNwaWhH86l4CHSYglAK5H0ZjmRSOecdJW0ZJI9mNzPnOyvjTYa37asmgZvaipboItCsKEzeI1CrYN+TOXcKS2dU7wgBhZtR9sFqkI2DZc6NE29Eh5Msh0vq4LpZMDB4Vzs3VTieXearXNbTEcFWS7DbLQSIZQxEmhiyvqa1rFcLlOH5qOPT0QQUChWi5pVVAzKkk53lBPDL/zsy/ziVz/F73zjDb7++m32mqW4ACdhkURc8QiAZK+klKDEaZUEIISWssopM0NmhImlfCD4wIO79zk+POK9D26SFQUnJ3NslpPlGfPlETaztKGlXsyYTqdsntvk/NVLaBOo2xM2N6dgDF3TkNmM4H3q8Ten1GXfE6DEkbbfeSHhEnmGcwGdiS1VPwjDOb8mTXnXiRWY1rStEJO8k90lM4bYtxaNkbZqWkbaZGS5BKQizzHp+ZBAtuFoJBwCIzhAXhQykitGIU0FCSR5macFr7BWY7WUAir6M+WZSt0OWVw6Pw12wTvBeQyYUvwCmqYl+E5KDttnLQFrFKvZHI3CZZlgIkrhVzVdaud2iQDVdW0iglkcgSLPCNbgvQCHMULsPPV8QURUiFGd+kxYY+iSP2AIMbEsTzEnbQ06sz0rC+868sGAumnpCVlKSSvbWkuWn5ZeWmmikUxEJzaijoq6bnn11df5wisv0TUtMTg2p1MGRSGBVCmOFwuKsqJbtDx4/xbLF1/Ctx06kwnQi2XDZDAhHxgxaA1AVATXpgBmUvcoYzKe9LjxRx6fiCBwcjLn1s1HXLy4QasCOstlQIZrUabgl3/yZZ49v8Hf+K3v8MCJE7APQg/tATabvrRKaXZP0wwhEDLNhXNbFGVJ10oNGpWSej1Ebr73AYu2ZZIPsLbAGg30Y5wU2p769WVFRtsusTbDt4FhoTBG6t2+lee9oyyFnOG9p0uMxVPjkrAOEM6JDXiMkVnniCFQJgCozxqKIie3GVmWuAzWrLEEa60ozZSi7TqZ35SAqM4lS3Clcd6xajsKpftqSoJL20EM6Ex27sY7WbhBWqS+aciyjG65lN9pUo8+yPfJjXQInHNUVUXXdZJGR2l/+baRHTVC3bTrbK0L8nOu7VCIE2/PjyiyglwbMmPoUteksFbaoQgt16eOhoE1iGqMtESNtetgGyLpXJ7iL337WafPqWIUJzvVswDTvAFAeTGBza1NZUdYk8GUOV0+ZTIyAQECrTHJ2SmuA77YkAn4+fxzz5AZjS1ytCmp247RaEyMHXfu7PHbv/stfupnv8jmhS1+4sJPkI80B7OHdLERVuOg4NHJMWZpuLi7QZZZcWR2MiDVe5fuM8kEu6772PX3iQgCy9WSf/Y7v8anLlzGLmdcuHSZeduycW6H3EC7Urz3eEEwGtV1oPQ6rV27tqieiiE7RJbq/hgD4+mIQW6EPpzlFLmmqCpiCOye22H/8CHL4zk2z6hX0kteLBboREgaDEa4zoFfoqPBrTTD4Zjd3QnVMBe2WSL6kC5623ZkmV0DbutuRpTdJ6SFZtMgSennS0uxrMrE55ddVNpsKomYFL4sxBo7EVN8EC77sCgkAASpaW1KSwWMlAAk2UOkbRqsFeafa1tUPMM5UAqsputatJbMoT8XKiH+KCNtrZi8GJVisUz1cvAMqird+4bFaiVuPYJC4ryT1qOS7220Xrs9WWsSEJejYiTLcmyWiS7fC3hn84zSGOpVg9Fa+Pfeo9A4AtGLCtRkhqap8QGWy6V0mtK1CMm4MsaAMTqBiSIZJyIdJFTyPoTVfIEdpmnWqWPTOnmt8Fk0bdsRUGRVse7U6IRZKSXtzxjkPigLyyC3wlgk8k9+47f5I3/0j7GxOWH+1i1ef/1dojbsXj6PD5b6nX2q4V2aGGnbQLeYMTvYozKaP/Gv/Awvv3CD5WIGWFarmrauKYo8dS/VWmr9UccnIghgM253BQ/u7qFDwD9+G20yeOehOAVpQ+MjXlmssZLeJs9QbUjAmkoLilOgKniqwnBhZ4K1PUkmoLHoGHHec//+vkT6bIC1ltF4JMwua0UwFDqIlkE1YGM6YXNzjFHJRWcorSsfkzgngXuESFlKDTYaFcTk7KuUIjc2sRGDOAfZRLQ5Q97RWmGs6AOyzKZp7RFlDHXbkFsrQYkkWEHsxrzvDVLDurXWsx6D63BOspKyqijKAu+E3ZiXpXjdte36dcvFksJYATW1ofNuXdPnlGQmXwe4zEp7res68kI0BMYYskqC2HC6kWjeEoB6tDykzoCoHiV49KQnRUwWXwGHYrWqKcsq7aqa1apJ7WBNnuVobSEivfdkVU4nLV9rFNcuX0a/9h71bE4xFKWhyaTV1DiPUwHjkuw3RlzbghH//tPlEwldh2sassEQ5xtUCgCFtmACZZ5kymsJvF/L2kNAplAROT5ZMNAabcVZ6K0fvsVv/NY3eOGF5/nCKy/xv/hf/nmWxx3WZAnsBAjklcVmlqywtE3NdDJi59w2JoeRqjg5nq8p4kppskIy0rNZy48sv38JS/hf+FDKYAYbhDTNx3ce14/tNnrdn8eHtQEoCBhFjElcI/ZL1oqaTNLOyMHhHs89c5XgmtSTBpUQ/CI37Gxt0nYzHu+taGrHZDIWwKytGVQDBsMNFvOGsiwoioKmcVjraeYNXbdiePEC4+Fw7WFXZLnQjs3pqDDvW9lVE3dAodIIMC0WUyGux5xF74FTELGrhUeO1rQu0LRCLx4MytR7Tig2kuL3nILlcknjJLVfLJZAIhIZ6XF7H4lRrW/0xWzJcrlgMBhgu0BWlGQ2E0FSn3ElrkLfIcgTb0EbIwFASVkmPXbZ4fuyJ4JoJRJiHmLEFCXHR0ci2+XUn9B1HdpoTJTWpfceW1q6tMOvOpeyq/TeLuLcEu+dtDa7bk3WEuVoZDLI+Ve++lke7s/43W98i1m9xGYGkxVSflYFnRfBmouCG+goClYVpD2gE5IQQsAoKHOT+BWe2q/Ecdmq5I+poEulQJSJxpnWxM5jfKSockxmMLFjnBsKE4mh4f1336a0hpee/xR2I1KWpbSbU8AUe/QkNGsTYa0LnKyWBCfEtaIS/oD3jrwoaJoWHT/pmYBSKCtTejCGLFdJJosIbJxHpd3Gd9J2Eh+7HhOQPnwIAWusyDyjp1227GxuMChzYtBEHynzgqZtCc6RlQVdUzOoRKChjUn0TsN4PCbLc+q6Eb+CKIHD2owYIctyXNsxrEaMBhWZzc7U/SRQKuJch9Ka8WRC27QCHBoLWSYkEu/pumbd7zcpo2i7TroeIQjxJakLQ4wUWcn88Jiu6xiPx8JHKEpCCKzaFpP66G3bpi6FdBGWiyXD4YCu7WQ3yXNIGVQ5GLC1tbUuXcKZjEIphVEyk9G1ndTRCZfQCYC1xqwnMRFPKc6BiLEmkVyEDhuUWvs5VOMRjetkHBmkLopJmQLkthB/iITY51G6FXUj16XPfrqukxJK9aQq8ZnoXODx4z3yMiPQomgIria6Duc7mlULEWa+oa2bJIeWYalBCYV9WA3Z3N1BFQU2t8IJWZxw6403CE0j4KE25FmRJMbSnsx1zoWLl5lsbjA/nnPv3l1+/me+wnM3LjEqMx7vHbL58Dbb9Yqn8px3ncErBbGjWS7Z29tnujGlqRtW9YrhYIjSMJufkBUZzaplOt7mZC7io9B58sxw7vwO2miGk00W8wXVcLBeTx91fCKCgCD6RTLSOBX/GK2xmSVHTqpzDhOlt5pbQ57b1Nry6LzvuUPb1Fit0cExmY6YHR8l1lxkOV+ilaJzLXW9YjiqKEeWvBxzPF/StC3j0YiyqlguhYddr+aMRkOm0ymLxZLp5ga+c2xvbpHl4rXvvRBwXOdwzjOZSpovJhCKpu7W4qe6bcmsXe98NhGIFosFeb9rKnFW1sZQWEuIgTwBZ95H7Ggs4KgWX0SfwEVpQ0lGUBYyvtt7j7Ul3gfKokAb0VIoLfVt150yFDvXifVav4NHCbgooV/36b7v3Lr1BwKAzldLBsMhRgli3uGSK1NHWRZrr4GiLLA2o2u7dSuuDYI71PM5g6H44Qnec8qXIP3sarVKYJdYc3kv3AmlNHv7B2szmtWyYbFa8fDhPnXruH3vHsZY5ouGzQvnGE43MUVFkRdoAgd7++zv77GYHeMWM7R3dK6l61Z0waPqlqAtuc1RQRHbmuXhATrdn0UxxJY5O+fOMd3aZWN7hwtPXUFZy1a3y+aVi8ycJ/hImVu2n7pId+08B13HL3/xK9x49yZHRydUgwFtB9YUNKuWPC9QaKpyQFEWlOWQGKDLvbgPOVg1NVVZMBqNGQ5Ha55JTzAL/6JGo/9NH1obkeCm/ro2mnop9FNB+aEqCsxgkHwE5IaxWeqFa5N2BamF2rbi3q3bDErDxuaYalChFNR1Q1SRhw8fce/+fZklZxSZNTzz7A3MvQPuP9oDhFn2eG+PuglsjEZ0ueb4eIXzHfrkhPl8hlZiSqrYxyjF5sYG0QeyLGc+X3JycsxwOBDwKEbyXHrzVZmnzy0ZUE8xLYqSzAo3oBoMhPkYxftOK0s0kaPjE8lG0kV2rbDefOfSYpUFYPM8AZON4BMRCtMHprjuoAwGAyHIJLdlawWcW9NeU0A+O5NRATHLBFNIQaAoS9B6be1lEi/CGkOeOBPOOyajEc57XNOtX18WRSL1GKqiJHQixjg8OGAymVCWJSFGCWBnSozhYHjmHhJgbjwco63m8OiYqnTY2SHNqubgeM54PEShmEwmjKopXTB0bWBW12gUNhsw2dhmNBhifEuZKQwZs0XNMjSo6Ci05vqlLUK0bH7xpxhnitiuhMwVNNu7WzgFi5WjdZblUUvdzMnyjK3xmDK2dKsFV6+8mAJuse4gbW1uslqtGG8MCSissmKdlq5TP5exF5E5H/j9b/8+z79wI50FAaT3Hu+LRBlSadt+iGb/5PGJCALGaCbTyVrcslqtmE4nKCQ110qvb8SubSgKUYq1bUuMHh0irpPsQIfI4uSIC+e2KQrF9vYmmc04Pj4WWm2eYcqcYAq+9rXfY3d7i1/8+Ve4enGH3e0NircK9g+OWLVLBmXJaCCClNnsiKKQ9LlrO4KP7O3NWMwazp3fZrqzyWy5ZGtzQ7gIwM65ncRAFXwiyzLaVtBmncg0PjhGw6F0E/IcbQ1FlklWpETPUC+WFOUAo2GabxET8OaTpNUaUdLluU2tSb1uMea5BFVjRQPgnV+78GpjE/IvHYb1rtx26wDclwN9RrBcLokhiEyapIMgod9azC/kOgacOx3Z3bVdastprBEAtSxFeqyVXpd1WWrbhhDY3NxcE6h6UlSWCT3ZJml0/5nr1YqyLEWUlRmmkylt01FWzxBjYFU3LOuaxWzOqnY83Dsgyw2di7TOczKbsbUprLqubbFa0awW3L/3kMXKc+/xMaNxxtUL2zxz6TIXr19hPluwMagY5oosU+hoGQ4r8Vt0gcGwZFUvE9CcJcswKQcPD+aJZCTZUFmWaB2pplPBMYIiatGptLGlXrUpcIu1WN+xeeWVz1OvlhhtJVNLWZtLLcG+NdhnbB91fEKCgMEaQ1HkuETcKAtph8XUc+26jjzPaYy02EDRNM2aKz8cjxJQFshshncdl5+6RmlziIrJQG6ck5Njdra2cM7zlS9/juADeVbw/nt3KauM7Y0pVTVgNjtmVddsb29KqyVq5rOa27fvMN4ccO2pyxR5Tl2vsFYzGFR0bSNlS7dkMp6sySo9gGmMTpRbL8o/rdgYjaT1lbwM1io+BD0v8pxyUEm9nUBAHwTk69qOrmlQkaQ9SBLcpubx431u3LhOLw7yaWEFHyjLgt6UU2tD27UihyWeCnaads1m6+nNi8VirSeo63oN+DnnyJNSUZiOgoBba6nrmpCCifcdmZWFp5NcWyy7HP1wGNd16+xjtWzXZUofTPqg1CZb7t47oalXjMYTBoMKZRQhuOQ9qGm7msmoYjosUVtT8qJksWyom5rDg0M2t3fYOzxge3siIibvk12Z4vad+zx4eMDu3Qd84bMv0MxrLl0+z/bFXfTlHaLz6KhQKiZL95jKVZ2sw4XanmcFs8VSlI5eKOY9xqO1lvNthU8h4GYrKlGtxQAHOV+Z1YQg2auYwjiqapBau6Rr4BI/QohcfbD8uOMTEQQABgMZk2SSuwp9/1sp5ssFmc1o2lZ01Ek1Vg6qtIOKP0BZlrRtx8lsQRY79h48olkuKYsSpRSDQUWR52yMRgwHGbs7Y7K8ZDGb8ejBMefOb6Ftzqru2NqsmG6MWSzmbG3sEqIYlLz4/LUk/VSMJ0NihKPjGdF7tre3UEQyW9E1Ld759c4Pcc3cU1qzrGupzReLNYOv2z8Qem1yKfKdOC7L+o94F1guaxrXMJmOxcPfyLnK0mISEYt4HsxmM1arFS546rphUFXUq9V6x+hNV7TR688Wuk7ISz7gejac92tUvPdO6HwacIJIrIWC3CW8JciEpCAU76jAe1ncy6UYe1RlKXVqDHjfJVq0fPaeTy9qTAkMPRZwcnwMwHAkrVxphfVy8yBZTCoVm3bF5sa28CsS6BuDA62phprxZMjWxpThaMylyxcAMVrJs4LWtRRlTpVnfOlzn2G5WDAeDzCZkd6+a+lahy1GMscNBz6pAxJJqCjFEaprOrq2ZWM8pHMOrS0xQD8UqK5rCbZ5QYgK30acFxXsrdu3ham6uYnNhBDVtW3SJNi1fkPs0Q1t0+ASW9IkynRRFmt690cdn4ggIIKNnmeTyCxti3MdeW7JShm6GZJpBhiUli5AaQtCDFTDHBQ0iyXWaC7tnmNre4MQNqiqcl3TeudomxbnFcZUBK+wtmRzV7GsPYNSMo2yKJkd1axqR1U0hBgYjkfMFgs2pxvMFwuOjhZJKJTRdS2+k568Tch5jF0yHZEbcFXLjpsndltXd7jGreXRxliK/NTaGhTLZQLB2o6iKJhujCjLXbxzxOpUieicaAdC8AyqHLAyGktpjk+OiRFMWTIZj4nIpGDnZUH7EJMgRi5GHxz6LkGMXuTEmcUFQeqddxh16vgT0iL2TrIcpdU6a1AabJGTKelS9LLtGOPa7ahuasq8TJ2BcOZ7OZSCznmMNbLbJe2FSXZqPvg12FlWpQSmzGK1lbZhZkWVqBXLRUz+CorM5uhc1JIqgZDKWKKGQSZZ2aXz52RBVxYbDdZm/7/2ziXGkjS7678vvnjHvfmoR5db/fJ0z4zHI7B7mhGyxMjIFsJ4LDGw8wovkNiABAsWg7zxFiRYICEkEJYMQljiYeEN4mEhsbDaQ2PGPT3j6fFMP6u6qrIy8z4j4ntExMfifJldHroK3Jqum1Lfv3SVN+Om8p773YgT5zvnf/4HhyPolCwbyLKcrjNkWcmgwDsrY8iVqGhba8jynLKec/fefaZp5Mb1Y8ZJIoRpHLlx8xrDMDCGiQSwvUNnKXVZ8PnPvkgISgRVlDgfHUbQAZ3JZ9r0hrOzc5q6ptu0tJ3h4GiG94FhGnjq5o2rnxgE4pz36ZI0MzhpqlFTgTMjTJaqLAiJUGCdH8nJCFPsiw8Tm82Gs5N7vPTcLa4fz5nUiJrUZfvpBcEgz3NypUiMkTvnwUz42sslN27dvGy1nc1rES0JOopyaKa6RhO4fngoJ/80MoQJrTIpiU2jJPWiTr21lrqU8V1D/CIvUzTxLgZAJBw556QZSQlhaK4bplHWQyVyl7F9T5pl4jmVkIicsbJv1ymm6+LsASVc90wxhUQuTuIAk0RINs57ylx0HYX/Lhp3WZ5ftL4QwkSeJjKoIxf1nPGi8zDyBEKiYsNRdhmNoCQkzdKMIVKYCckldTh/6PMfHR8LJ8APHF+7xrbdEGIOIE1TnPfkhTAlg07YtC25SgE5Z5IkoTeSF5BmpfySLxEAPzgmpTg6PhRSlIJp9Ix2pO87BjfQ1DMg0Bwfsl4uUdOIGUeckW2nixGbNFJBmmu8Ttmst7G1YGTwgwxw6frLXEdV1ehUc352Ttd3FHlOCIqmbjh7cMrgxR7nvEzfajuCSthutmSpyM9vtlsSrbl16ym8sYQY9ayWHfdPz0W1qe/oe8MXfuInGMOAdSPeTbzzg/dZLhePvPauhBNw1nL77XeFCjsOVKXQZo+vHXFQK8qiQjFxcDAXiaYL9eDYGTVNE227RT87R3/xOTbLtXzpjCRKCy03SnFPjIxeqgizphF2VVFAojg+OJAQO5bYiK2e6lLBd2JWVbEGPqETSHWGmgbqspC9PcIdz3SKHS1lkZNmWk7i/KHljozFVCfCppvkwqyyGh3rzAQYI8NvzCUBN44jk5JJOnmaxsz6xOH8UML4uK/XiXxm7z2TtSy3Lce5dE4m6YRWsgvPVEqihcBUFBnGGJpZxRR7B4BIvR0vL9gQQDhNCZuupYqlyGEYGcdAnoudrekjczM2/QyeLJU8iXOiALxcLjk6OmJwgyTEgPKDuzjrIqVXoqr8ohoxjuRlQe/c5czAvu+jCtIg6kUxh5Bq6Yh0g5QpGSaapkKpBBudZppJ9DINAyPQNA0h03hjxdmmKXVVMThP23UcHByQpRnG9IxhQuuMvjfMZg3OdDGCSjDWMXhHM6uxkYmZ6JSubRmNZ9u1LFdr5rMZWie02y1N07DtW7a9ENXyTBrSnB+EYQos1hvqsiRRiuVqyWbbMk6KpqkJOMZJc3Z+wvVbL9Jay2K9wlvLdNUlx7VOuPXUEQBDpEKenS558YUbHMxn1HXN6L3sSwOopBb+dp5J5940cXBQEwislisG5EJJdS6c+zQTtRwVRSomS6Kl/yCNzL4sy3DWEpQwri56/EUwI46R8nKSdb29ZANmqaKMmfKLiCNNdFTnkQs0xHmCYSTy92OyLZU7qumtjF4PozTIRGnwcRhwxsB2S6IuhFMDKk2xzjE4J++l08sEmY7RhLWWPM8xxtH2HUMYWS7OSZRk/3Xc6+dliY0X3IVY6UUyST10QU1Ihn8K02UyShqJZJ4fYcI7d8nzyHJJ8lrnSJVimEb8MMaGFo2PF2aiFPrOPRglkRhi845OErq+B6Q5J9HJpYZCWZUYa8iznHGccG7AeUsat3zGGA4PDiSBOA4EJfvuDMUxR0zjxGbTkmgRcbHWoFWCHzydMag0iapDCWYYIMvou47BDoyrDVmqJdmpFePkaNuOznSUsbyNUgxhZGBiAHo/YKyR3hLAA5vtlm67obdGZk0mCRtjsN5DmrJZLGkqEasRtqVG6xTXGk4enFHkMhDXDANpluOnEUmvBtpty3vv3WHSmjTP6UyHzq84WSjLMg4PDsizlKrM2K7XLB9YDg8art+4zjCMbHqD6S3z+THbdsPBYc04KvrekuUpxnr8MLDadMJA0xqVJljnWLdbqrJmigKZ0yjjoAfvqZv6w4466+mNwTihreZFQd/3cgIl0i6cpinD9GFSRinF/OAQ6xybdkuSCm31x27eoOs6tr25VBaSUDKn37Qkqfx/Y3pM11PWNWVd42LZ7+JOmecZ27ZlGAOzphEmWpGhVUrfdiRaUzcN67UkzJxzkeefS7Vl8GJ/mjJ5S5bKhF9vLWlR0o8dxsmchlXbxZkHKd5b6YzMM6L+Ln0vgz4JE4vVElAUZYnpDUmiqasSovMqy5K+78nznM57WtuTZoWUzqpKZL6HQBKnK6+3a1ItzhMCs2ZGUdcMw4gdJ5yxQnrSmrBa44eBMUr5Ns1M2sgvKjBa03lROxbCl5RUQ55z/3QhDn3wVFVN2xsWi3O50Uyw3LQ0dU2aJoQhkGQJvfOYtocQlYmyjCxJJNeRFzw4O6eaVWSJxjpDPWvYbg1lkYPOWLc9Z4slSQJNXbNYn5DnBaNSdNay2cr3OEyiQF1EqrDpLU1d473Dek/dNLRdiyaJ/I8C5x3DCF3npJtUp4Q0Y9N7tt0qNndNsaL20bgSToAQKIoMxcTp6RlhdHz2809z69ZNlotWuroymcP37vvv8Pbbd1mvWl767LPMDxuMtbTbluViQdd2WOfpu15GgEUJ7HGUfaJ0m4VL/vqsaej6rYh6JKIYoxCJK4KIT1RVzmAdxhgSLWF2lkmjiE5T7p8vZf8dm2OcsZydLyQplqaA3MWmaWQYjYwu7y12uaAqyni38Pi+x8cEXRJD4N55dJqDmggo1usN9UwuIoW04q5bGcZxIcwZYiPNFNmVUwhst1ua8jpn50uGQaTBlB8IiYwv2267GD2IYEbbdRhjUEcHsVITojPzdN0GjSIvcrIsJ0mlw29C2piHaWSz3Qj1N0yxHfjDzL+PYb2NfQGBQF4UBKXwUZno/umZZLaLIpYvo6pQmuKtjU5mK2uVRNKYTsiVlCdt2zL6kbKqWW3WTMayWbdUZclqvWI+b/CjDPccg2LTSRnNOXcpVhOQcl2iU9wwotTAaAf8esP86BDXd6KjOE20K0dZFPSmZ9F1JEnKettz594JeZlLOVtJj+sUhGNSRHGYsqwIYSRTqVDkp6ivMEmbd4ht7X3fotR0OTBlGId4vjiquiGEkaousc4yuR6lJUpt+5b0j4n1/nFcCScwTRJKplrhnOfdt97j+educef2CR/cfsDt2+9TViU/+cUvEEJgNs9J08B6c4YfjWjkWcvxwRzb9XSbTqi6g8N5h06TqL4jF4lO5C58dnaGH2ToIwqMtZHhN1CmJcYYirKgtxbTdZIEC1ruAkHR9X3srJM97zAOOOfJ04xxdBSF3PkCgApsN1sRwUhlWIixA2OwoBNyrckSzWq5EFLINJKmCW3bMp/NSZKUYexFrTaWfK2zeD/SNDXGinxWlmW4vicQolCnkt73ENC5JuhAGCfcJINRirrEOglplVIY02Ot4WL4S9/3XL92jeV6gzGe09NTDg4a2s0G6xxBJRJVRc3C2azGWEuRSxSCSi+5/XgJ3ZVSUVo8YYiiIBdbD2stfW9iZt3RGyPlLp3gvGW1XpLpFB+Tt1VV0fc9ZSXluG3bUpYFeVaQZTKDQeucaXQkaWBi5OBoJvMSrcN7mRkwjhOoEaU1nXUURSn9GiGQjROu3ZDmIjCLht50MvjggjKcl3SdwRkvJbnRCEkorximwPxgzmA7FCNHh3PqusT2nizT5HlGWVS0XY+LEczoJbJRYaTKs0hJl5Z1KsgrieiqPGeYZKiv9wPjEKjKkt4YlEpw1sgkrKteItRxfw4yhPHsdMFmdcJzzz+D9S1PP3MTpRQPHtyL+27ICykzpWrCesPRvCFNNcdHc5aLrVyU08AUBnSaYDvPFBIICjtatm1HUQgdNSjZ7+exOcg4j/Nj1PEX/X0/fdg957zHOodxjvPlEh1bj7NMTk6Ljd2OCj+MItgxOIyV+q4eJsxk6Y1l6HqOjuaMfc9msyVLRcFnGkcyXVCXNYvFkqZpotJQYLVcita/UqRJhrOOzXYjTqsoyFIRtDBG9tl1WvLgZIHSS5JUobKCCzXnoihYLVdRr0CUiZ139L0jUxmb9ZrFYskYYNYccO36dSl7xYSk5BMgKwoG79hst5SFMPemEGQAaJBcRm8s3gtJKagQBUYtKknwTshgfW8IAYosJ8tT2q7FDwO9seR5RtPUOOtZLJboNCOgKArR7HeuZxwn2k2PSYWo451HZxlJksWt0igDZoIQisYAy9MFaZpS1Tk60Xg3MAw9ISh623OtqXhq1pCXOa71rFY95ZCTpRqlArOjG7x17x6rUSTLJhKqMifTM55//qeYHx3yzjvf5ezBm6R65N79c+YHx3gv+aaJnmYGd++dROZnEdu0pcdAtjqKz7/4OX7s5g3e++A2b713B51JJ+J226J1R1mWLM/OuHbzBsvVKo7iE1FXY/pHXn9XwgkMw8CdOx+wXJ7h2h5vDUf1EYPrWC0W6EwLIai3TATyIsV6T5VnFKlCZdIslATRgwuh4oUXP8fJ/TNOT9/HDx3jlPGlP/Nlvv369zD9A/ISrBO6ZV7KCeecdN4J+UKB3BwoG0ngLVdbqiojIcWYjt44dAhx3t1E36+lFTfLabsW+l6EMZQiaJgfygCOIWZ760YaQ3KdYKynM5ajgwKNiI1u2zby7kcCnmEcWa23HM4bbHDMZwfcOL7Bet0yDkshHDkptW5WLXlRcuvajK+8/DI/uPY8r77xDbJCkRcVo/cY4zg9XaF1QpFn9Naz3TxgGAaapsTYNd57VBA2Z9+fU1SVnLxKCD2ds6zXG/K84HCWMY1w//6GqkhROiYwvWHWlCyXGw6Pb2CcSIo536MShfNGKjZZRllVGGfZtIambuh6hx+3JEHyL1lZsFquOTw8ZtluWW49SdLzpZf/FHWd8to3fh/vRJi1iOXCZn4NpomzxZaXXvpxUq159933SLXQ0AkykOT0ZINKEuo6lXJfSPAjrGzL4WxG6RL+XH7IzReOCVVFk2W0pyvudyOqPuIbqxVJptBFxab3TJPlmZBzdHgodltFnqe4qWTcWMq6YrHcMpvPOb19n8PDOdu2Zb2R2Rs3b14jSeJcCKX5wZ373H2wYdUuqQ4OGYZAmqccXRe9R0XC/DBQVRVlVQuvwzu0zkiu+nag73teffU1FIFXvvTT/Pwv/BxvvPpdXn/tu6BkT9v2LV235eZT1+m7jlUnsszHtUiRNXXJK19+mfPTE5579if5pb/8F/id//wq3/nO60zB8Pzzf5qf/qlXeOHZz/Dv/u1v8eZ332A+rxiGgaPjA9nDrba0bUuWZSiV8fM/9+d5+3sf8PwLN/nd332VRGe0nSFMCms6DuYzrs8rvvD55/jWm7d55845p8uOsqoZR1GZTQDjlgRGDg7mnJ8vo/hJoCwkkTb4EXRKbwybrSdBSDXDIFyJssgZJxGnbLuJcTB0fY/WW/RnZ5ydrVi1hjLXkGQ8WK5Jk5wETWsc//uNb3F34Wj7gdAOJKmUJsOkJMM9epSSbYxx4D2EZGKcMmbzQ0wr5TBUgh8VvR8JXogyUwA3KBINaVYRtEK7QFZUkGisV6A0Y8gpm4KgSiH7KEVnNsyaGfVcY3sjY9bzAh0UeZHgh0BRlDRpTZgGmSuA4sbNmyLvFgJFLmPRTx4sSBJF1RyBakkzTVMXHB8f0tkAE1xLjhmGgc16Q9M05HmK6VOYFM0sjzTfwNHxDOdGWjORlwWj6TnvB24by/1ioJgy9HJkpgJ5pTlJR3woOL52XdSch4GyyJgmxVvvfJs7916nbipefOFZilJzcnImn6spuHnjBnkh+/hEK55NnwY0168dsVwuyHIZJlM3c5aLNbNmxuL8jGEYOD4+lkhkVhMCeDfIeRWVnvNCVJmFVPVo2rB6HKf4SUEp9QBogdNd2/IQbrC353G4avbA1bPpqtnzQgjh/xpPfCWcAIBS6rUQwpd3bccF9vY8HlfNHrh6Nl01ex6FZNcG7LHHHrvF3gnsscenHFfJCfyzXRvwQ9jb83hcNXvg6tl01ez5SFyZnMAee+yxG1ylSGCPPfbYAXbuBJRSf0kp9aZS6vtKqa/vyIZ3lFLfUkp9Uyn1Wjx2TSn1X5VSfxR/Hn/CNvy6UupEKfXGQ8c+0gYl+MdxzV5XSr3yhOz5NaXUnbhO31RKffWh1/5etOdNpdQvfAL2PKeU+u9Kqe8opb6tlPrb8fhO1ugx9uxsjT42LrTbdvEANPAD4EUgB/4A+OIO7HgHuPFDx/4B8PX4/OvA3/+EbfhZ4BXgjf+XDcBXgf+E6JP8DPB7T8ieXwP+7kf87Rfjd1cAn4nfqf4R2/M08Ep8Pge+F993J2v0GHt2tkYf97HrSODPAt8PIbwVQnDAbwJf27FNF/ga8Bvx+W8Af+WTfLMQwv8Azv8/bfga8C+D4FXgSCn19BOw51H4GvCbIQQbQngb+D7y3f4o7bkbQvj9+HwD/CHwDDtao8fY8yh84mv0cbFrJ/AM8P5Dv9/m8Qv5SSEA/0Up9b+UUn8jHrsVQrgbn98Dbu3ArkfZsMt1+1sxvP71h7ZIT9QepdSPA18Cfo8rsEY/ZA9cgTX6k2DXTuCq4CshhFeAXwT+plLqZx9+MUg8t9MyylWwAfinwEvAy8Bd4B8+aQOUUjPg3wN/J4Swfvi1XazRR9iz8zX6k2LXTuAO8NxDvz8bjz1RhBDuxJ8nwG8hYdr9i/Ax/jx50nY9xoadrFsI4X4IYQwhTMA/58Nw9onYo5TKkAvuX4cQ/kM8vLM1+ih7dr1GHwe7dgL/E/icUuozSqkc+GXgt5+kAUqpRik1v3gO/EXgjWjHr8Q/+xXgPz5JuyIeZcNvA38tZsB/Blg9FBJ/YvihPfVfRdbpwp5fVkoVSqnPAJ8DvvEjfm8F/AvgD0MI/+ihl3ayRo+yZ5dr9LGx68wkksX9HpIt/dUdvP+LSNb2D4BvX9gAXAd+B/gj4L8B1z5hO/4NEj56ZL/41x9lA5Lx/idxzb4FfPkJ2fOv4vu9jpzUTz/0978a7XkT+MVPwJ6vIKH+68A34+Oru1qjx9izszX6uI89Y3CPPT7l2PV2YI899tgx9k5gjz0+5dg7gT32+JRj7wT22ONTjr0T2GOPTzn2TmCPPT7l2DuBPfb4lGPvBPbY41OO/wNuJyFtV0lNWQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Visualize results with Torch-TensorRT\n", + "plot_results(best_results_per_input_trt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We get similar results as before!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 6. Measuring Speedup\n", + "We can run the benchmark function again to see the speedup gained! Compare this result with the same batch-size of input in the case without Torch-TensorRT above." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 45.88 ms\n", + "Iteration 20/100, avg batch time 46.20 ms\n", + "Iteration 30/100, avg batch time 46.10 ms\n", + "Iteration 40/100, avg batch time 46.19 ms\n", + "Iteration 50/100, avg batch time 46.15 ms\n", + "Iteration 60/100, avg batch time 46.17 ms\n", + "Iteration 70/100, avg batch time 46.19 ms\n", + "Iteration 80/100, avg batch time 46.20 ms\n", + "Iteration 90/100, avg batch time 46.22 ms\n", + "Iteration 100/100, avg batch time 46.21 ms\n", + "Input shape: torch.Size([128, 3, 300, 300])\n", + "Output location prediction size: torch.Size([128, 4, 8732])\n", + "Output label prediction size: torch.Size([128, 81, 8732])\n", + "Average batch time: 46.21 ms\n" + ] + } + ], + "source": [ + "batch_size = 128\n", + "\n", + "# Recompiling with batch_size we use for evaluating performance\n", + "trt_model = torch_tensorrt.compile(traced_model,\n", + " inputs = [torch_tensorrt.Input((batch_size, 3, 300, 300), dtype=torch.half)],\n", + " enabled_precisions= {torch.half}, # Run with FP16\n", + " workspace_size= 1 << 20\n", + ")\n", + "\n", + "benchmark(trt_model, input_shape=(batch_size, 3, 300, 300), dtype='fp16', nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 7. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling a TorchScript SSD300 model with Torch-TensorRT, and tested the performance impact of the optimization. We find that using the Torch-TensorRT compiled model, we gain significant speedup in inference without any noticeable drop in performance!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Details\n", + "For detailed information on model input and output,\n", + "training recipies, inference and performance visit:\n", + "[github](https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/Detection/SSD)\n", + "and/or [NGC](https://ngc.nvidia.com/catalog/model-scripts/nvidia:ssd_for_pytorch)\n", + "\n", + "### References\n", + "\n", + " - [SSD: Single Shot MultiBox Detector](https://arxiv.org/abs/1512.02325) paper\n", + " - [Speed/accuracy trade-offs for modern convolutional object detectors](https://arxiv.org/abs/1611.10012) paper\n", + " - [SSD on NGC](https://ngc.nvidia.com/catalog/model-scripts/nvidia:ssd_for_pytorch)\n", + " - [SSD on github](https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/Detection/SSD)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.1.1/_sources/_notebooks/vgg-qat.ipynb.txt b/docs/v1.1.1/_sources/_notebooks/vgg-qat.ipynb.txt new file mode 100644 index 0000000000..cca771ad92 --- /dev/null +++ b/docs/v1.1.1/_sources/_notebooks/vgg-qat.ipynb.txt @@ -0,0 +1,1200 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8033b2eb", + "metadata": {}, + "source": [ + "# Deploying Quantization Aware Trained models in INT8 using Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "id": "69ec3ca7", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "Quantization Aware training (QAT) simulates quantization during training by quantizing weights and activation layers. This will help to reduce the loss in accuracy when we convert the network trained in FP32 to INT8 for faster inference. QAT introduces additional nodes in the graph which will be used to learn the dynamic ranges of weights and activation layers. In this notebook, we illustrate the following steps from training to inference of a QAT model in Torch-TensorRT.\n", + "\n", + "1. [Requirements](#1)\n", + "2. [VGG16 Overview](#2)\n", + "3. [Training a baseline VGG16 model](#3)\n", + "4. [Apply Quantization](#4)\n", + "5. [Model calibration](#5)\n", + "6. [Quantization Aware training](#6)\n", + "7. [Export to Torchscript](#7)\n", + "8. [Inference using Torch-TensorRT](#8)\n", + "8. [References](#8)" + ] + }, + { + "cell_type": "markdown", + "id": "79655ea8", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "Please install the required dependencies and import these libraries accordingly" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14a72941", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "6493e915", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.1.0\n" + ] + } + ], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "import torch.optim as optim\n", + "import torch.utils.data as data\n", + "import torchvision.transforms as transforms\n", + "import torchvision.datasets as datasets\n", + "import torch_tensorrt\n", + "\n", + "from torch.utils.tensorboard import SummaryWriter\n", + "\n", + "import pytorch_quantization\n", + "from pytorch_quantization import nn as quant_nn\n", + "from pytorch_quantization import quant_modules\n", + "from pytorch_quantization.tensor_quant import QuantDescriptor\n", + "from pytorch_quantization import calib\n", + "from tqdm import tqdm\n", + "\n", + "print(pytorch_quantization.__version__)\n", + "\n", + "import os\n", + "import sys\n", + "sys.path.insert(0, \"../examples/int8/training/vgg16\")\n", + "from vgg16 import vgg16\n" + ] + }, + { + "cell_type": "markdown", + "id": "4de5060a", + "metadata": {}, + "source": [ + "\n", + "## 2. VGG16 Overview\n", + "### Very Deep Convolutional Networks for Large-Scale Image Recognition\n", + "VGG is one of the earliest family of image classification networks that first used small (3x3) convolution filters and achieved significant improvements on ImageNet recognition challenge. The network architecture looks as follows\n", + "\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "7a5afc49", + "metadata": {}, + "source": [ + "\n", + "## 3. Training a baseline VGG16 model\n", + "We train VGG16 on CIFAR10 dataset. Define training and testing datasets and dataloaders. This will download the CIFAR 10 data in your `data` directory. Data preprocessing is performed using `torchvision` transforms. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5d2c4c45", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Files already downloaded and verified\n", + "Files already downloaded and verified\n" + ] + } + ], + "source": [ + "classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')\n", + "\n", + "# ========== Define Training dataset and dataloaders =============#\n", + "training_dataset = datasets.CIFAR10(root='./data',\n", + " train=True,\n", + " download=True,\n", + " transform=transforms.Compose([\n", + " transforms.RandomCrop(32, padding=4),\n", + " transforms.RandomHorizontalFlip(),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),\n", + " ]))\n", + "\n", + "training_dataloader = torch.utils.data.DataLoader(training_dataset,\n", + " batch_size=32,\n", + " shuffle=True,\n", + " num_workers=2)\n", + "\n", + "# ========== Define Testing dataset and dataloaders =============#\n", + "testing_dataset = datasets.CIFAR10(root='./data',\n", + " train=False,\n", + " download=True,\n", + " transform=transforms.Compose([\n", + " transforms.ToTensor(),\n", + " transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),\n", + " ]))\n", + "\n", + "testing_dataloader = torch.utils.data.DataLoader(testing_dataset,\n", + " batch_size=16,\n", + " shuffle=False,\n", + " num_workers=2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2bd092b3", + "metadata": {}, + "outputs": [], + "source": [ + "def train(model, dataloader, crit, opt, epoch):\n", + "# global writer\n", + " model.train()\n", + " running_loss = 0.0\n", + " for batch, (data, labels) in enumerate(dataloader):\n", + " data, labels = data.cuda(), labels.cuda(non_blocking=True)\n", + " opt.zero_grad()\n", + " out = model(data)\n", + " loss = crit(out, labels)\n", + " loss.backward()\n", + " opt.step()\n", + "\n", + " running_loss += loss.item()\n", + " if batch % 500 == 499:\n", + " print(\"Batch: [%5d | %5d] loss: %.3f\" % (batch + 1, len(dataloader), running_loss / 100))\n", + " running_loss = 0.0\n", + " \n", + "def test(model, dataloader, crit, epoch):\n", + " global writer\n", + " global classes\n", + " total = 0\n", + " correct = 0\n", + " loss = 0.0\n", + " class_probs = []\n", + " class_preds = []\n", + " model.eval()\n", + " with torch.no_grad():\n", + " for data, labels in dataloader:\n", + " data, labels = data.cuda(), labels.cuda(non_blocking=True)\n", + " out = model(data)\n", + " loss += crit(out, labels)\n", + " preds = torch.max(out, 1)[1]\n", + " class_probs.append([F.softmax(i, dim=0) for i in out])\n", + " class_preds.append(preds)\n", + " total += labels.size(0)\n", + " correct += (preds == labels).sum().item()\n", + "\n", + " test_probs = torch.cat([torch.stack(batch) for batch in class_probs])\n", + " test_preds = torch.cat(class_preds)\n", + "\n", + " return loss / total, correct / total\n", + "\n", + "def save_checkpoint(state, ckpt_path=\"checkpoint.pth\"):\n", + " torch.save(state, ckpt_path)\n", + " print(\"Checkpoint saved\")" + ] + }, + { + "cell_type": "markdown", + "id": "c80a86cc", + "metadata": {}, + "source": [ + "*Define the VGG model that we are going to perfom QAT on.*" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "8c564b8f", + "metadata": {}, + "outputs": [], + "source": [ + "# CIFAR 10 has 10 classes\n", + "model = vgg16(num_classes=len(classes), init_weights=False)\n", + "model = model.cuda()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "abc00452", + "metadata": {}, + "outputs": [], + "source": [ + "# Declare Learning rate\n", + "lr = 0.1\n", + "state = {}\n", + "state[\"lr\"] = lr\n", + "\n", + "# Use cross entropy loss for classification and SGD optimizer\n", + "crit = nn.CrossEntropyLoss()\n", + "opt = optim.SGD(model.parameters(), lr=state[\"lr\"], momentum=0.9, weight_decay=1e-4)\n", + "\n", + "\n", + "# Adjust learning rate based on epoch number\n", + "def adjust_lr(optimizer, epoch):\n", + " global state\n", + " new_lr = lr * (0.5**(epoch // 12)) if state[\"lr\"] > 1e-7 else state[\"lr\"]\n", + " if new_lr != state[\"lr\"]:\n", + " state[\"lr\"] = new_lr\n", + " print(\"Updating learning rate: {}\".format(state[\"lr\"]))\n", + " for param_group in optimizer.param_groups:\n", + " param_group[\"lr\"] = state[\"lr\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d80865a2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: [ 1 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 13.288\n", + "Batch: [ 1000 | 1563] loss: 11.345\n", + "Batch: [ 1500 | 1563] loss: 11.008\n", + "Test Loss: 0.13388 Test Acc: 13.23%\n", + "Epoch: [ 2 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 10.742\n", + "Batch: [ 1000 | 1563] loss: 10.311\n", + "Batch: [ 1500 | 1563] loss: 10.141\n", + "Test Loss: 0.11888 Test Acc: 23.96%\n", + "Epoch: [ 3 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.877\n", + "Batch: [ 1000 | 1563] loss: 9.821\n", + "Batch: [ 1500 | 1563] loss: 9.818\n", + "Test Loss: 0.11879 Test Acc: 24.68%\n", + "Epoch: [ 4 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.677\n", + "Batch: [ 1000 | 1563] loss: 9.613\n", + "Batch: [ 1500 | 1563] loss: 9.504\n", + "Test Loss: 0.11499 Test Acc: 23.68%\n", + "Epoch: [ 5 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.560\n", + "Batch: [ 1000 | 1563] loss: 9.536\n", + "Batch: [ 1500 | 1563] loss: 9.309\n", + "Test Loss: 0.10990 Test Acc: 27.84%\n", + "Epoch: [ 6 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.254\n", + "Batch: [ 1000 | 1563] loss: 9.234\n", + "Batch: [ 1500 | 1563] loss: 9.188\n", + "Test Loss: 0.11594 Test Acc: 23.29%\n", + "Epoch: [ 7 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.141\n", + "Batch: [ 1000 | 1563] loss: 9.110\n", + "Batch: [ 1500 | 1563] loss: 9.013\n", + "Test Loss: 0.10732 Test Acc: 29.24%\n", + "Epoch: [ 8 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.120\n", + "Batch: [ 1000 | 1563] loss: 9.086\n", + "Batch: [ 1500 | 1563] loss: 8.948\n", + "Test Loss: 0.10732 Test Acc: 27.24%\n", + "Epoch: [ 9 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 8.941\n", + "Batch: [ 1000 | 1563] loss: 8.997\n", + "Batch: [ 1500 | 1563] loss: 9.028\n", + "Test Loss: 0.11299 Test Acc: 25.52%\n", + "Epoch: [ 10 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 8.927\n", + "Batch: [ 1000 | 1563] loss: 8.837\n", + "Batch: [ 1500 | 1563] loss: 8.860\n", + "Test Loss: 0.10130 Test Acc: 34.61%\n", + "Epoch: [ 11 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 8.953\n", + "Batch: [ 1000 | 1563] loss: 8.738\n", + "Batch: [ 1500 | 1563] loss: 8.724\n", + "Test Loss: 0.10018 Test Acc: 32.27%\n", + "Epoch: [ 12 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 8.721\n", + "Batch: [ 1000 | 1563] loss: 8.716\n", + "Batch: [ 1500 | 1563] loss: 8.701\n", + "Test Loss: 0.10070 Test Acc: 29.57%\n", + "Updating learning rate: 0.05\n", + "Epoch: [ 13 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 7.944\n", + "Batch: [ 1000 | 1563] loss: 7.649\n", + "Batch: [ 1500 | 1563] loss: 7.511\n", + "Test Loss: 0.08555 Test Acc: 44.62%\n", + "Epoch: [ 14 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 7.057\n", + "Batch: [ 1000 | 1563] loss: 6.944\n", + "Batch: [ 1500 | 1563] loss: 6.687\n", + "Test Loss: 0.08331 Test Acc: 52.27%\n", + "Epoch: [ 15 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 6.470\n", + "Batch: [ 1000 | 1563] loss: 6.439\n", + "Batch: [ 1500 | 1563] loss: 6.126\n", + "Test Loss: 0.07266 Test Acc: 58.02%\n", + "Epoch: [ 16 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 5.834\n", + "Batch: [ 1000 | 1563] loss: 5.801\n", + "Batch: [ 1500 | 1563] loss: 5.622\n", + "Test Loss: 0.06340 Test Acc: 65.17%\n", + "Epoch: [ 17 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 5.459\n", + "Batch: [ 1000 | 1563] loss: 5.442\n", + "Batch: [ 1500 | 1563] loss: 5.314\n", + "Test Loss: 0.05945 Test Acc: 67.22%\n", + "Epoch: [ 18 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 5.071\n", + "Batch: [ 1000 | 1563] loss: 5.145\n", + "Batch: [ 1500 | 1563] loss: 5.063\n", + "Test Loss: 0.06567 Test Acc: 64.46%\n", + "Epoch: [ 19 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 4.796\n", + "Batch: [ 1000 | 1563] loss: 4.781\n", + "Batch: [ 1500 | 1563] loss: 4.732\n", + "Test Loss: 0.05374 Test Acc: 71.87%\n", + "Epoch: [ 20 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 4.568\n", + "Batch: [ 1000 | 1563] loss: 4.564\n", + "Batch: [ 1500 | 1563] loss: 4.484\n", + "Test Loss: 0.05311 Test Acc: 71.12%\n", + "Epoch: [ 21 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 4.385\n", + "Batch: [ 1000 | 1563] loss: 4.302\n", + "Batch: [ 1500 | 1563] loss: 4.285\n", + "Test Loss: 0.05080 Test Acc: 74.29%\n", + "Epoch: [ 22 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 4.069\n", + "Batch: [ 1000 | 1563] loss: 4.105\n", + "Batch: [ 1500 | 1563] loss: 4.096\n", + "Test Loss: 0.04807 Test Acc: 75.20%\n", + "Epoch: [ 23 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 3.959\n", + "Batch: [ 1000 | 1563] loss: 3.898\n", + "Batch: [ 1500 | 1563] loss: 3.916\n", + "Test Loss: 0.04743 Test Acc: 75.81%\n", + "Epoch: [ 24 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 3.738\n", + "Batch: [ 1000 | 1563] loss: 3.847\n", + "Batch: [ 1500 | 1563] loss: 3.797\n", + "Test Loss: 0.04609 Test Acc: 76.42%\n", + "Updating learning rate: 0.025\n", + "Epoch: [ 25 / 25] LR: 0.025000\n", + "Batch: [ 500 | 1563] loss: 2.952\n", + "Batch: [ 1000 | 1563] loss: 2.906\n", + "Batch: [ 1500 | 1563] loss: 2.735\n", + "Test Loss: 0.03466 Test Acc: 82.00%\n", + "Checkpoint saved\n" + ] + } + ], + "source": [ + "# Train the model for 25 epochs to get ~80% accuracy.\n", + "num_epochs=25\n", + "for epoch in range(num_epochs):\n", + " adjust_lr(opt, epoch)\n", + " print('Epoch: [%5d / %5d] LR: %f' % (epoch + 1, num_epochs, state[\"lr\"]))\n", + "\n", + " train(model, training_dataloader, crit, opt, epoch)\n", + " test_loss, test_acc = test(model, testing_dataloader, crit, epoch)\n", + "\n", + " print(\"Test Loss: {:.5f} Test Acc: {:.2f}%\".format(test_loss, 100 * test_acc))\n", + " \n", + "save_checkpoint({'epoch': epoch + 1,\n", + " 'model_state_dict': model.state_dict(),\n", + " 'acc': test_acc,\n", + " 'opt_state_dict': opt.state_dict(),\n", + " 'state': state},\n", + " ckpt_path=\"vgg16_base_ckpt\")" + ] + }, + { + "cell_type": "markdown", + "id": "e1044537", + "metadata": {}, + "source": [ + "\n", + "## 4. Apply Quantization" + ] + }, + { + "cell_type": "markdown", + "id": "c33b7f4e", + "metadata": {}, + "source": [ + "`quant_modules.initialize()` will ensure quantized version of modules will be called instead of original modules. For example, when you define a model with convolution, linear, pooling layers, `QuantConv2d`, `QuantLinear` and `QuantPooling` will be called. `QuantConv2d` basically wraps quantizer nodes around inputs and weights of regular `Conv2d`. Please refer to all the quantized modules in pytorch-quantization toolkit for more information. A `QuantConv2d` is represented in `pytorch-quantization` toolkit as follows.\n", + "\n", + "```\n", + "def forward(self, input):\n", + " # the actual quantization happens in the next level of the class hierarchy\n", + " quant_input, quant_weight = self._quant(input)\n", + "\n", + " if self.padding_mode == 'circular':\n", + " expanded_padding = ((self.padding[1] + 1) // 2, self.padding[1] // 2,\n", + " (self.padding[0] + 1) // 2, self.padding[0] // 2)\n", + " output = F.conv2d(F.pad(quant_input, expanded_padding, mode='circular'),\n", + " quant_weight, self.bias, self.stride,\n", + " _pair(0), self.dilation, self.groups)\n", + " else:\n", + " output = F.conv2d(quant_input, quant_weight, self.bias, self.stride, self.padding, self.dilation,\n", + " self.groups)\n", + "\n", + " return output\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "985dc59e", + "metadata": {}, + "outputs": [], + "source": [ + "quant_modules.initialize()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "164ce8cb", + "metadata": {}, + "outputs": [], + "source": [ + "# All the regular conv, FC layers will be converted to their quantozed counterparts due to quant_modules.initialize()\n", + "qat_model = vgg16(num_classes=len(classes), init_weights=False)\n", + "qat_model = qat_model.cuda()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8e5f7fb5", + "metadata": {}, + "outputs": [], + "source": [ + "# vgg16_base_ckpt is the checkpoint generated from Step 3 : Training a baseline VGG16 model.\n", + "ckpt = torch.load(\"./vgg16_base_ckpt\")\n", + "modified_state_dict={}\n", + "for key, val in ckpt[\"model_state_dict\"].items():\n", + " # Remove 'module.' from the key names\n", + " if key.startswith('module'):\n", + " modified_state_dict[key[7:]] = val\n", + " else:\n", + " modified_state_dict[key] = val\n", + "\n", + "# Load the pre-trained checkpoint\n", + "qat_model.load_state_dict(modified_state_dict)\n", + "opt.load_state_dict(ckpt[\"opt_state_dict\"])" + ] + }, + { + "cell_type": "markdown", + "id": "8f8a74e8", + "metadata": {}, + "source": [ + "\n", + "## 5. Model Calibration" + ] + }, + { + "cell_type": "markdown", + "id": "d2a321f9", + "metadata": {}, + "source": [ + "The quantizer nodes introduced in the model around desired layers capture the dynamic range (min_value, max_value) that is observed by the layer. Calibration is the process of computing the dynamic range of these layers by passing calibration data, which is usually a subset of training or validation data. There are different ways of calibration: `max`, `histogram` and `entropy`. We use `max` calibration technique as it is simple and effective. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "039423dc", + "metadata": {}, + "outputs": [], + "source": [ + "def compute_amax(model, **kwargs):\n", + " # Load calib result\n", + " for name, module in model.named_modules():\n", + " if isinstance(module, quant_nn.TensorQuantizer):\n", + " if module._calibrator is not None:\n", + " if isinstance(module._calibrator, calib.MaxCalibrator):\n", + " module.load_calib_amax()\n", + " else:\n", + " module.load_calib_amax(**kwargs)\n", + " print(F\"{name:40}: {module}\")\n", + " model.cuda()\n", + "\n", + "def collect_stats(model, data_loader, num_batches):\n", + " \"\"\"Feed data to the network and collect statistics\"\"\"\n", + " # Enable calibrators\n", + " for name, module in model.named_modules():\n", + " if isinstance(module, quant_nn.TensorQuantizer):\n", + " if module._calibrator is not None:\n", + " module.disable_quant()\n", + " module.enable_calib()\n", + " else:\n", + " module.disable()\n", + "\n", + " # Feed data to the network for collecting stats\n", + " for i, (image, _) in tqdm(enumerate(data_loader), total=num_batches):\n", + " model(image.cuda())\n", + " if i >= num_batches:\n", + " break\n", + "\n", + " # Disable calibrators\n", + " for name, module in model.named_modules():\n", + " if isinstance(module, quant_nn.TensorQuantizer):\n", + " if module._calibrator is not None:\n", + " module.enable_quant()\n", + " module.disable_calib()\n", + " else:\n", + " module.enable()\n", + "\n", + "def calibrate_model(model, model_name, data_loader, num_calib_batch, calibrator, hist_percentile, out_dir):\n", + " \"\"\"\n", + " Feed data to the network and calibrate.\n", + " Arguments:\n", + " model: classification model\n", + " model_name: name to use when creating state files\n", + " data_loader: calibration data set\n", + " num_calib_batch: amount of calibration passes to perform\n", + " calibrator: type of calibration to use (max/histogram)\n", + " hist_percentile: percentiles to be used for historgram calibration\n", + " out_dir: dir to save state files in\n", + " \"\"\"\n", + "\n", + " if num_calib_batch > 0:\n", + " print(\"Calibrating model\")\n", + " with torch.no_grad():\n", + " collect_stats(model, data_loader, num_calib_batch)\n", + "\n", + " if not calibrator == \"histogram\":\n", + " compute_amax(model, method=\"max\")\n", + " calib_output = os.path.join(\n", + " out_dir,\n", + " F\"{model_name}-max-{num_calib_batch*data_loader.batch_size}.pth\")\n", + " torch.save(model.state_dict(), calib_output)\n", + " else:\n", + " for percentile in hist_percentile:\n", + " print(F\"{percentile} percentile calibration\")\n", + " compute_amax(model, method=\"percentile\")\n", + " calib_output = os.path.join(\n", + " out_dir,\n", + " F\"{model_name}-percentile-{percentile}-{num_calib_batch*data_loader.batch_size}.pth\")\n", + " torch.save(model.state_dict(), calib_output)\n", + "\n", + " for method in [\"mse\", \"entropy\"]:\n", + " print(F\"{method} calibration\")\n", + " compute_amax(model, method=method)\n", + " calib_output = os.path.join(\n", + " out_dir,\n", + " F\"{model_name}-{method}-{num_calib_batch*data_loader.batch_size}.pth\")\n", + " torch.save(model.state_dict(), calib_output)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "78504a6f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Calibrating model\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████████████████████| 32/32 [00:00<00:00, 96.04it/s]\n", + "WARNING: Logging before flag parsing goes to stderr.\n", + "W1109 04:01:43.512364 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.513354 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.514046 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.514638 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.515270 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.515859 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.516441 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.517009 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.517600 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.518167 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.518752 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.519333 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.519911 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.520473 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.521038 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.521596 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.522170 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.522742 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.523360 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.523957 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.524581 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.525059 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.525366 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.525675 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.525962 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.526257 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.526566 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.526885 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.527188 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.527489 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.527792 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.528097 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.528387 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.528834 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.529163 139704147265344 tensor_quantizer.py:238] Call .cuda() if running on GPU after loading calibrated amax.\n", + "W1109 04:01:43.532748 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([64, 1, 1, 1]).\n", + "W1109 04:01:43.533468 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.534033 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([64, 1, 1, 1]).\n", + "W1109 04:01:43.534684 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.535320 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([128, 1, 1, 1]).\n", + "W1109 04:01:43.535983 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.536569 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([128, 1, 1, 1]).\n", + "W1109 04:01:43.537248 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.537833 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([256, 1, 1, 1]).\n", + "W1109 04:01:43.538480 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.539074 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([256, 1, 1, 1]).\n", + "W1109 04:01:43.539724 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.540307 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([256, 1, 1, 1]).\n", + "W1109 04:01:43.540952 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.541534 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.542075 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.542596 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.543248 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.543719 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.544424 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.544952 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.545530 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.546114 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.546713 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.547292 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.547902 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.548453 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.549015 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([4096, 1]).\n", + "W1109 04:01:43.549665 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.550436 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([4096, 1]).\n", + "W1109 04:01:43.551925 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.553105 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([10, 1]).\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "features.0._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=2.7537 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.0._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0263, 2.7454](64) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.3._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=27.5676 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.3._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0169, 1.8204](64) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.7._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=15.2002 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.7._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0493, 1.3207](128) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.10._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=7.7376 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.10._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0163, 0.9624](128) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.14._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=8.8351 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.14._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0622, 0.8791](256) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.17._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=12.5746 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.17._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0505, 0.5117](256) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.20._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=9.7203 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.20._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0296, 0.5335](256) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.24._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=8.9367 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.24._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0220, 0.3763](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.27._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=6.6539 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.27._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0151, 0.1777](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.30._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=3.7099 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.30._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0087, 0.1906](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.34._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=4.0491 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.34._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0106, 0.1971](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.37._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=2.1531 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.37._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0070, 0.2305](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.40._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=3.3631 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.40._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0023, 0.4726](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "avgpool._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=5.3550 calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.0._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=5.3550 calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.0._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0026, 0.5320](4096) calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.3._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=6.6733 calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.3._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0018, 0.5172](4096) calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.6._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=9.4352 calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.6._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.3877, 0.5620](10) calibrator=MaxCalibrator scale=1.0 quant)\n" + ] + } + ], + "source": [ + "#Calibrate the model using max calibration technique.\n", + "with torch.no_grad():\n", + " calibrate_model(\n", + " model=qat_model,\n", + " model_name=\"vgg16\",\n", + " data_loader=training_dataloader,\n", + " num_calib_batch=32,\n", + " calibrator=\"max\",\n", + " hist_percentile=[99.9, 99.99, 99.999, 99.9999],\n", + " out_dir=\"./\")" + ] + }, + { + "cell_type": "markdown", + "id": "1aa0c109", + "metadata": {}, + "source": [ + "\n", + "## 6. Quantization Aware Training" + ] + }, + { + "cell_type": "markdown", + "id": "9fe8ec11", + "metadata": {}, + "source": [ + "In this phase, we finetune the model weights and leave the quantizer node values frozen. The dynamic ranges for each layer obtained from the calibration are kept constant while the weights of the model are finetuned to be close to the accuracy of original FP32 model (model without quantizer nodes) is preserved. Usually the finetuning of QAT model should be quick compared to the full training of the original model. Use QAT to fine-tune for around 10% of the original training schedule with an annealing learning-rate. Please refer to Achieving FP32 Accuracy for INT8 Inference Using Quantization Aware Training with NVIDIA TensorRT for detailed recommendations. For this VGG model, it is enough to finetune for 1 epoch to get acceptable accuracy. \n", + "During finetuning with QAT, the quantization is applied as a composition of `max`, `clamp`, `round` and `mul` ops. \n", + "```\n", + "# amax is absolute maximum value for an input\n", + "# The upper bound for integer quantization (127 for int8)\n", + "max_bound = torch.tensor((2.0**(num_bits - 1 + int(unsigned))) - 1.0, device=amax.device)\n", + "scale = max_bound / amax\n", + "outputs = torch.clamp((inputs * scale).round_(), min_bound, max_bound)\n", + "```\n", + "tensor_quant function in `pytorch_quantization` toolkit is responsible for the above tensor quantization. Usually, per channel quantization is recommended for weights, while per tensor quantization is recommended for activations in a network.\n", + "During inference, we use `torch.fake_quantize_per_tensor_affine` and `torch.fake_quantize_per_channel_affine` to perform quantization as this is easier to convert into corresponding TensorRT operators. Please refer to next sections for more details on how these operators are exported in torchscript and converted in Torch-TensorRT." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "1f28d228", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Updating learning rate: 0.1\n", + "Epoch: [ 1 / 1] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 2.635\n", + "Batch: [ 1000 | 1563] loss: 2.655\n", + "Batch: [ 1500 | 1563] loss: 2.646\n", + "Test Loss: 0.03291 Test Acc: 82.98%\n", + "Checkpoint saved\n" + ] + } + ], + "source": [ + "# Finetune the QAT model for 1 epoch\n", + "num_epochs=1\n", + "for epoch in range(num_epochs):\n", + " adjust_lr(opt, epoch)\n", + " print('Epoch: [%5d / %5d] LR: %f' % (epoch + 1, num_epochs, state[\"lr\"]))\n", + "\n", + " train(qat_model, training_dataloader, crit, opt, epoch)\n", + " test_loss, test_acc = test(qat_model, testing_dataloader, crit, epoch)\n", + "\n", + " print(\"Test Loss: {:.5f} Test Acc: {:.2f}%\".format(test_loss, 100 * test_acc))\n", + " \n", + "save_checkpoint({'epoch': epoch + 1,\n", + " 'model_state_dict': qat_model.state_dict(),\n", + " 'acc': test_acc,\n", + " 'opt_state_dict': opt.state_dict(),\n", + " 'state': state},\n", + " ckpt_path=\"vgg16_qat_ckpt\")" + ] + }, + { + "cell_type": "markdown", + "id": "7a4dcaa2", + "metadata": {}, + "source": [ + "\n", + "## 7. Export to Torchscript\n", + "Export the model to Torch script. Trace the model and convert it into torchscript for deployment. To learn more about Torchscript, please refer to https://pytorch.org/docs/stable/jit.html. Setting `quant_nn.TensorQuantizer.use_fb_fake_quant = True` enables the QAT model to use `torch.fake_quantize_per_tensor_affine` and `torch.fake_quantize_per_channel_affine` operators instead of `tensor_quant` function to export quantization operators. In torchscript, they are represented as `aten::fake_quantize_per_tensor_affine` and `aten::fake_quantize_per_channel_affine`. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "3d34f526", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "E1109 04:02:37.101168 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.102248 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.107194 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.107625 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.115269 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.115740 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.117969 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.118358 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.126382 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.126834 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.128674 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.129518 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.135453 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.135936 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.137858 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.138366 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.145539 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.146053 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.147871 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.148353 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.154252 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.154685 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.156558 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.157159 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.163197 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.163676 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.165549 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.165991 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.173305 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.173926 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.176034 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.176697 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.182843 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.183426 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.185377 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.185962 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.191966 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.192424 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.194325 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.194817 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.201988 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.202665 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.204763 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.205461 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.211393 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.211987 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.213899 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.214450 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.220892 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.221533 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.223519 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.224037 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.233809 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.234434 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.238212 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.239042 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.241022 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.241654 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.247820 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.248445 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.250366 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.250959 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.257248 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.257854 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.259968 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.260660 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "W1109 04:02:37.268160 139704147265344 tensor_quantizer.py:280] Use Pytorch's native experimental fake quantization.\n", + "/opt/conda/lib/python3.8/site-packages/pytorch_quantization/nn/modules/tensor_quantizer.py:285: TracerWarning: Converting a tensor to a Python number might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!\n", + " inputs, amax.item() / bound, 0,\n", + "/opt/conda/lib/python3.8/site-packages/pytorch_quantization/nn/modules/tensor_quantizer.py:291: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!\n", + " quant_dim = list(amax.shape).index(list(amax_sequeeze.shape)[0])\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "E1109 04:02:37.329273 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.330212 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.332529 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.333365 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.339547 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.340248 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.342257 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.342890 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.350619 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.351372 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.353470 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.354121 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.360090 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.360806 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.362803 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.363274 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.370369 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.371057 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.373071 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.373766 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.379890 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.380538 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.382532 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.383128 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.389077 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.389760 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.391815 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.392399 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.399809 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.400472 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.402399 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.402939 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.408818 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.409424 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.411513 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.412097 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.418537 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.419128 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.421343 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.421946 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.429382 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.430156 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.432259 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.433079 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.439297 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.440027 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.442149 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.442826 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.449377 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.449968 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.452122 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.452754 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.462532 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.463295 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.466963 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.467725 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.469692 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.470336 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.476204 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.476738 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.478809 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.479375 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.485666 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.486219 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.488416 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.488986 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n" + ] + } + ], + "source": [ + "quant_nn.TensorQuantizer.use_fb_fake_quant = True\n", + "with torch.no_grad():\n", + " data = iter(testing_dataloader)\n", + " images, _ = data.next()\n", + " jit_model = torch.jit.trace(qat_model, images.to(\"cuda\"))\n", + " torch.jit.save(jit_model, \"trained_vgg16_qat.jit.pt\")" + ] + }, + { + "cell_type": "markdown", + "id": "7341418a", + "metadata": {}, + "source": [ + "\n", + "## 8. Inference using Torch-TensorRT\n", + "In this phase, we run the exported torchscript graph of VGG QAT using Torch-TensorRT. Torch-TensorRT is a Pytorch-TensorRT compiler which converts Torchscript graphs into TensorRT. TensorRT 8.0 supports inference of quantization aware trained models and introduces new APIs; `QuantizeLayer` and `DequantizeLayer`. We can observe the entire VGG QAT graph quantization nodes from the debug log of Torch-TensorRT. To enable debug logging, you can set `torch_tensorrt.logging.set_reportable_log_level(torch_tensorrt.logging.Level.Debug)`. For example, `QuantConv2d` layer from `pytorch_quantization` toolkit is represented as follows in Torchscript\n", + "```\n", + "%quant_input : Tensor = aten::fake_quantize_per_tensor_affine(%x, %636, %637, %638, %639)\n", + "%quant_weight : Tensor = aten::fake_quantize_per_channel_affine(%394, %640, %641, %637, %638, %639)\n", + "%input.2 : Tensor = aten::_convolution(%quant_input, %quant_weight, %395, %687, %688, %689, %643, %690, %642, %643, %643, %644, %644)\n", + "```\n", + "`aten::fake_quantize_per_*_affine` is converted into `QuantizeLayer` + `DequantizeLayer` in Torch-TensorRT internally. Please refer to quantization op converters in Torch-TensorRT." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "aa7495e0", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Cannot infer input type from calcuations in graph for input x.2. Assuming it is Float32. If not, specify input type explicity\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Detected invalid timing cache, setup a local cache instead\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "VGG QAT accuracy using TensorRT: 82.97%\n" + ] + } + ], + "source": [ + "qat_model = torch.jit.load(\"trained_vgg16_qat.jit.pt\").eval()\n", + "\n", + "compile_spec = {\"inputs\": [torch_tensorrt.Input([16, 3, 32, 32])],\n", + " \"enabled_precisions\": torch.int8,\n", + " }\n", + "trt_mod = torch_tensorrt.compile(qat_model, **compile_spec)\n", + "\n", + "test_loss, test_acc = test(trt_mod, testing_dataloader, crit, 0)\n", + "print(\"VGG QAT accuracy using TensorRT: {:.2f}%\".format(100 * test_acc))" + ] + }, + { + "cell_type": "markdown", + "id": "9df5a90e", + "metadata": {}, + "source": [ + "### Performance benchmarking" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "9eb2cd2d", + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import numpy as np\n", + "\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "# Helper function to benchmark the model\n", + "def benchmark(model, input_shape=(1024, 1, 32, 32), dtype='fp32', nwarmup=50, nruns=1000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " output = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%100==0:\n", + " print('Iteration %d/%d, avg batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output shape:\", output.shape)\n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "5c2514ae", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, avg batch time 4.83 ms\n", + "Iteration 200/1000, avg batch time 4.83 ms\n", + "Iteration 300/1000, avg batch time 4.83 ms\n", + "Iteration 400/1000, avg batch time 4.83 ms\n", + "Iteration 500/1000, avg batch time 4.83 ms\n", + "Iteration 600/1000, avg batch time 4.83 ms\n", + "Iteration 700/1000, avg batch time 4.83 ms\n", + "Iteration 800/1000, avg batch time 4.83 ms\n", + "Iteration 900/1000, avg batch time 4.83 ms\n", + "Iteration 1000/1000, avg batch time 4.83 ms\n", + "Input shape: torch.Size([16, 3, 32, 32])\n", + "Output shape: torch.Size([16, 10])\n", + "Average batch time: 4.83 ms\n" + ] + } + ], + "source": [ + "benchmark(jit_model, input_shape=(16, 3, 32, 32))" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "c5378ed6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, avg batch time 1.87 ms\n", + "Iteration 200/1000, avg batch time 1.84 ms\n", + "Iteration 300/1000, avg batch time 1.85 ms\n", + "Iteration 400/1000, avg batch time 1.83 ms\n", + "Iteration 500/1000, avg batch time 1.82 ms\n", + "Iteration 600/1000, avg batch time 1.81 ms\n", + "Iteration 700/1000, avg batch time 1.81 ms\n", + "Iteration 800/1000, avg batch time 1.80 ms\n", + "Iteration 900/1000, avg batch time 1.80 ms\n", + "Iteration 1000/1000, avg batch time 1.79 ms\n", + "Input shape: torch.Size([16, 3, 32, 32])\n", + "Output shape: torch.Size([16, 10])\n", + "Average batch time: 1.79 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_mod, input_shape=(16, 3, 32, 32))" + ] + }, + { + "cell_type": "markdown", + "id": "d6a5ec1c", + "metadata": {}, + "source": [ + "\n", + "## 9. References\n", + "* Very Deep Convolution Networks for large scale Image Recognition\n", + "* Achieving FP32 Accuracy for INT8 Inference Using Quantization Aware Training with NVIDIA TensorRT\n", + "* QAT workflow for VGG16\n", + "* Deploying VGG QAT model in C++ using Torch-TensorRT\n", + "* Pytorch-quantization toolkit from NVIDIA\n", + "* Pytorch quantization toolkit userguide\n", + "* Quantization basics" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/v1.1.1/_sources/cli/torchtrtc.rst.txt b/docs/v1.1.1/_sources/cli/torchtrtc.rst.txt new file mode 100644 index 0000000000..68f599a5cd --- /dev/null +++ b/docs/v1.1.1/_sources/cli/torchtrtc.rst.txt @@ -0,0 +1,146 @@ +.. _torchtrtc: + +torchtrtc +================================= + +``torchtrtc`` is a CLI application for using the Torch-TensorRT compiler. It serves as an easy way to compile a +TorchScript Module with Torch-TensorRT from the command-line to quickly check support or as part of +a deployment pipeline. All basic features of the compiler are supported including post training +quantization (though you must already have a calibration cache file to use the PTQ feature). The compiler can +output two formats, either a TorchScript program with the TensorRT engine embedded or +the TensorRT engine itself as a PLAN file. + +All that is required to run the program after compilation is for C++ linking against ``libtorchtrt.so`` +or in Python importing the torch_tensorrt package. All other aspects of using compiled modules are identical +to standard TorchScript. Load with ``torch.jit.load()`` and run like you would run any other module. + +.. code-block:: txt + + torchtrtc [input_file_path] [output_file_path] + [input_specs...] {OPTIONS} + + torchtrtc is a compiler for TorchScript, it will compile and optimize + TorchScript programs to run on NVIDIA GPUs using TensorRT + + OPTIONS: + + -h, --help Display this help menu + Verbiosity of the compiler + -v, --verbose Dumps debugging information about the + compilation process onto the console + -w, --warnings Disables warnings generated during + compilation onto the console (warnings + are on by default) + --i, --info Dumps info messages generated during + compilation onto the console + --build-debuggable-engine Creates a debuggable engine + --allow-gpu-fallback (Only used when targeting DLA + (device-type)) Lets engine run layers on + GPU if they are not supported on DLA + --require-full-compilation Require that the model should be fully + compiled to TensorRT or throw an error + --check-method-support=[method_name] + Check the support for end to end + compilation of a specified method in the + TorchScript module + --disable-tf32 Prevent Float32 layers from using the + TF32 data format + --sparse-weights Enable sparsity for weights of conv and + FC layers + -p[precision...], + --enable-precision=[precision...] (Repeatable) Enabling an operating + precision for kernels to use when + building the engine (Int8 requires a + calibration-cache argument) [ float | + float32 | f32 | fp32 | half | float16 | + f16 | fp16 | int8 | i8 | char ] + (default: float) + -d[type], --device-type=[type] The type of device the engine should be + built for [ gpu | dla ] (default: gpu) + --gpu-id=[gpu_id] GPU id if running on multi-GPU platform + (defaults to 0) + --dla-core=[dla_core] DLACore id if running on available DLA + (defaults to 0) + --engine-capability=[capability] The type of device the engine should be + built for [ standard | safety | + dla_standalone ] + --calibration-cache-file=[file_path] + Path to calibration cache file to use + for post training quantization + --teo=[op_name...], + --torch-executed-op=[op_name...] (Repeatable) Operator in the graph that + should always be run in PyTorch for + execution (partial compilation must be + enabled) + --tem=[module_name...], + --torch-executed-mod=[module_name...] + (Repeatable) Module that should always + be run in Pytorch for execution (partial + compilation must be enabled) + --mbs=[num_ops], + --min-block-size=[num_ops] Minimum number of contiguous TensorRT + supported ops to compile a subgraph to + TensorRT + --embed-engine Whether to treat input file as a + serialized TensorRT engine and embed it + into a TorchScript module (device spec + must be provided) + --num-avg-timing-iters=[num_iters] + Number of averaging timing iterations + used to select kernels + --workspace-size=[workspace_size] Maximum size of workspace given to + TensorRT + --dla-sram-size=[dla_sram_size] Fast software managed RAM used by DLA + to communicate within a layer. + --dla-local-dram-size=[dla_local_dram_size] Host RAM used by DLA to share + intermediate tensor data across operations. + --dla-global-dram-size=[dla_global_dram_size] Host RAM used by DLA to store + weights and metadata for execution + --atol=[atol] Absolute tolerance threshold for acceptable + numerical deviation from standard torchscript + output (default 1e-8) + --rtol=[rtol] Relative tolerance threshold for acceptable + numerical deviation from standard torchscript + output (default 1e-5) + --no-threshold-check Skip checking threshold compliance + --truncate-long-double, + --truncate, --truncate-64bit Truncate weights that are provided in + 64bit to 32bit (Long, Double to Int, + Float) + --save-engine Instead of compiling a full a + TorchScript program, save the created + engine to the path specified as the + output path + --custom-torch-ops (repeatable) Shared object/DLL containing custom torch operators + --custom-converters (repeatable) Shared object/DLL containing custom converters + input_file_path Path to input TorchScript file + output_file_path Path for compiled TorchScript (or + TensorRT engine) file + input_specs... Specs for inputs to engine, can either + be a single size or a range defined by + Min, Optimal, Max sizes, e.g. + "(N,..,C,H,W)" + "[(MIN_N,..,MIN_C,MIN_H,MIN_W);(OPT_N,..,OPT_C,OPT_H,OPT_W);(MAX_N,..,MAX_C,MAX_H,MAX_W)]". + Data Type and format can be specified by + adding an "@" followed by dtype and "%" + followed by format to the end of the + shape spec. e.g. "(3, 3, 32, + 32)@f16%NHWC" + "--" can be used to terminate flag options and force all following + arguments to be treated as positional options + +e.g. + +.. code-block:: shell + + torchtrtc tests/modules/ssd_traced.jit.pt ssd_trt.ts "[(1,3,300,300); (1,3,512,512); (1, 3, 1024, 1024)]@f16%contiguous" -p f16 + + +To run with custom torch operators +.. code-block:: shell +torchtrtc tests/modules/ssd_traced.jit.pt ssd_trt.ts --custom-torch-ops= "[(1,3,300,300); (1,3,512,512); (1, 3, 1024, 1024)]@fp16%contiguous" -p f16 + + +To run with custom converters +.. code-block:: shell +torchtrtc tests/modules/ssd_traced.jit.pt ssd_trt.ts --custom-converters= "[(1,3,300,300); (1,3,512,512); (1, 3, 1024, 1024)]@fp16%contiguous" -p f16 diff --git a/docs/v1.1.1/_sources/contributors/conversion.rst.txt b/docs/v1.1.1/_sources/contributors/conversion.rst.txt new file mode 100644 index 0000000000..f19fc5eba8 --- /dev/null +++ b/docs/v1.1.1/_sources/contributors/conversion.rst.txt @@ -0,0 +1,53 @@ +.. _conversion: + +Conversion Phase +================== + +Once the graph has be simplified to a form thats easy to convert, we then set up a conversion context +to manage the construction of a TensorRT ``INetworkDefinition`` from the blocks nodes. The conversion context +records the set of converted nodes, block inputs and outputs and other information about the conversion +of the graph. This data is then used to help converters link together layers and also hold build time +information like weights required to construct the engine. After the context is created, the block +converter starts iterating through the list of nodes, for each node, the converter will look at its +inputs and assemble an array of resources to pass to the converter. Inputs can be in a couple of states: + +* The input is a block parameter + + * In this case the input should have already been stored in as an IValue in the + conversion context ``evaluated_value_map``. The conversion stage will add the IValue to the list of args for the + converter + +* The input is an output of a node that has already been converted + + * In this case the ITensor of the output has added to the ``value_tensor_map``, + The conversion stage will add the ITensor to the list of args for the converter + +* The input is from a node that produces a static value + + * There are nodes that produce static values, typically used to store parameters for operators, we need to + evaluate these nodes at conversion time to be able to convert a op. The conversion system will look for a node + evaluator in the evaluator registry and run it on the node. The IValue produced will be entered in the + conversion context ``evaluated_value_map`` and added to the list of args for the converter. If the node + to be evaluated takes inputs, the conversion stage will recursively resolve dependencies until the final + static value has been evaluated + +* The input is from a node that has not been converted + + * Torch-TensorRT will error out here + +Node Evaluation +----------------- +There are some nodes that contain static data and are resources for operations. These can be evaluated at +conversion time so that you can use those values when doing node conversion. In theory any node kind can have +a conversion time evaluator as long as it produces a static IValue, This IValue will be stored in the conversion +context so it can be consumed by any node that takes the evaluated node as an input. Common node types are +``prim::Constant`` which emits a constant and ``prim::ListConstruct`` which makes lists. + +Node Converters +---------------- + +Node converters map JIT nodes to layers or subgraphs of layers. They then associate outputs from the JIT graph +and the TRT graph together in the conversion context. This allows the conversion stage to assemble the inputs +for the next node. There are some cases where a node produces an output that is not a Tensor but a static result +from a calculation done on inputs which need to be converted first. In this case the converter may associate the outputs in +the ``evaluated_value_map`` instead of the ``value_tensor_map``. For more information take a look at: :ref:`writing_converters` diff --git a/docs/v1.1.1/_sources/contributors/lowering.rst.txt b/docs/v1.1.1/_sources/contributors/lowering.rst.txt new file mode 100644 index 0000000000..38c4491295 --- /dev/null +++ b/docs/v1.1.1/_sources/contributors/lowering.rst.txt @@ -0,0 +1,207 @@ +.. _lowering: + +Lowering Phase +=============== + +The lowering phase is made up out of passes which are operations which map a graph from a high level representation +to a lower level one. Each pass does something specific for instance inlining method calls. The idea is to +significantly reduce what the conversion phase needs to be able to handle when actually mapping to TensorRT. +We aim for closer to 1->1 op conversion vs looking for applicable subgraphs, limiting the number of converters and +reduce the scope of each converter. + +You can see the effects of each pass by setting the log level to ``Level::kGraph`` + +Passes Used +------------- + +EliminateCommonSubexpression +*********************************** + + `torch/csrc/jit/passes/common_subexpression_elimination.h `_ + +Removes common subexpressions in the graph + + + +Eliminate Dead Code +************************** + + `torch/csrc/jit/passes/dead_code_elimination.h `_ + +Dead code elimination will check if a node has side effects and not delete it if it does. + +Eliminate Exeception Or Pass Pattern +*************************************** + + `Torch-TensorRT/core/lowering/passes/exception_elimination.cpp `_ + +A common pattern in scripted modules are dimension gaurds which will throw execptions if +the input dimension is not what was expected. + +.. code-block:: none + + %1013 : bool = aten::ne(%1012, %24) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/batchnorm.py:248:11 + = prim::If(%1013) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/batchnorm.py:248:8 + block0(): + = prim::RaiseException(%23) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/batchnorm.py:249:12 + -> () + block1(): + -> () + +Since we are resolving all of this at compile time and there are no execptions in the TensorRT graph, we just remove it. + +Eliminate Redundant Gaurds +*************************************** + + `torch/csrc/jit/passes/guard_elimination.h `_ + +Eliminate redundant guards for ops whose outputs are fully determined by their inputs i.e. if inputs to such ops are +guarded we are allowed to remove a guard on ops' outputs + +Freeze Module +*************************************** + + `torch/csrc/jit/passes/freeze_module.h `_ + +Freeze attributes and inline constants and modules. Propogates constants in the graph. + +Fuse AddMM Branches +*************************************** + + `Torch-TensorRT/core/lowering/passes/fuse_addmm_branches.cpp `_ + +A common pattern in scripted modules is tensors of different dimensions use different constructions for implementing linear layers. We fuse these +different varients into a single one that will get caught by the Unpack AddMM pass. + +.. code-block:: none + + %ret : Tensor = prim::If(%622) + block0(): + %ret.1 : Tensor = aten::addmm(%self.fc.bias, %x9.1, %3677, %3, %3) + -> (%ret.1) + block1(): + %output.1 : Tensor = aten::matmul(%x9.1, %3677) + %output0.1 : Tensor = aten::add_(%output.1, %self.fc.bias, %3) + -> (%output0.1) + +We fuse this set of blocks into a graph like this: + +.. code-block:: none + + %ret : Tensor = aten::addmm(%self.fc.bias, %x9.1, %3677, %3, %3) + +Fuse Linear +*************************************** + + `torch/csrc/jit/passes/fuse_linear.h `_ + +Match the ``aten::linear`` pattern and fuse it into a single ``aten::linear`` +This pass fuse the addmm or matmul + add generated by JIT back to linear + +Fuse Flatten Linear +*************************************** + + `Torch-TensorRT/core/lowering/passes/fuse_flatten_linear.cpp `_ + +TensorRT implicity flattens input layers into fully connected layers when they are higher than 1D. So when there is a +``aten::flatten`` -> ``aten::linear`` pattern we remove the ``aten::flatten``. + +Lower Graph +*************************************** + + `torch/csrc/jit/passes/lower_graph.h `_ + +Given a graph with of a method which first argument is %self, lower it to a graph where +all attributes accesses are replaced with explicit inputs of the graph +(rather than results of prim::GetAttr executed on %self). Returns a tuple +(graph, parameters) where the last module.parameters.size() inputs to the +graph are the trainable parameters used in this method. The remaining inputs +are the true inputs to the function. + +Lower Tuples +*************************************** + + `torch/csrc/jit/passes/lower_tuples.h `_ + +* ``LowerSimpleTuples``: + +Removes tuples where TupleConstruct and TupleUnpack are matched but leaves tuples in place across if statements, loops, and as inputs/outputs + +* ``LowerAllTuples``: + +Removes _all_ tuples and raises an error if some cannot be removed, this is used by ONNX to ensure there are not tuples before conversion, but will not work on graphs whose inputs contain tuples. + +Module Fallback +***************** + + `Torch-TensorRT/core/lowering/passes/module_fallback.cpp `_ + +Module fallback consists of two lowering passes that must be run as a pair. The first pass is run before freezing to place delimiters in the graph around modules +that should run in PyTorch. The second pass marks nodes between these delimiters after freezing to signify they should run in PyTorch. + +* ``NotateModuleForFallback`` + +Places delimiting nodes around module calls pre freezing to signify where in the graph nodes should run in PyTorch + +* ``MarkNodesForFallback`` + +Looks for delimiters then marks all nodes between the delimiters to tell partitioning to run them in PyTorch + +Peephole Optimze +*************************************** + + `torch/csrc/jit/passes/peephole_optimze.h `_ + +The intent for this optimization pass is to catch all of the small, easy to catch peephole optimizations you might be interested in doing. + +Right now, it does: + - Eliminate no-op 'expand' nodes + - Simply x.t().t() to x + + +Remove Contiguous +*************************************** + + `Torch-TensorRT/core/lowering/passes/remove_contiguous.cpp `_ + +Removes contiguous operators since we are doing TensorRT memory is already contiguous. + + +Remove Dropout +*************************************** + + `Torch-TensorRT/core/lowering/passes/remove_dropout.cpp `_ + +Removes dropout operators since we are doing inference. + +Remove To +*************************************** + + `Torch-TensorRT/core/lowering/passes/remove_to.cpp `_ + +Removes ``aten::to`` operators that do casting, since TensorRT mangages it itself. It is important that this is one of the last passes run so that +other passes have a change to move required cast operators out of the main namespace. + +Unpack AddMM +*************************************** + + `Torch-TensorRT/core/lowering/passes/unpack_addmm.cpp `_ + +Unpacks ``aten::addmm`` into ``aten::matmul`` and ``aten::add_`` (with an additional ``trt::const`` +op to freeze the bias in the TensorRT graph). This lets us reuse the ``aten::matmul`` and ``aten::add_`` +converters instead of needing a dedicated converter. + +Unpack LogSoftmax +*************************************** + + `Torch-TensorRT/core/lowering/passes/unpack_log_softmax.cpp `_ + +Unpacks ``aten::logsoftmax`` into ``aten::softmax`` and ``aten::log``. This lets us reuse the +``aten::softmax`` and ``aten::log`` converters instead of needing a dedicated converter. + +Unroll Loops +*************************************** + + `torch/csrc/jit/passes/loop_unrolling.h `_ + +Unrolls the operations of compatable loops (e.g. sufficently short) so that you only have to go through the loop once. diff --git a/docs/v1.1.1/_sources/contributors/partitioning.rst.txt b/docs/v1.1.1/_sources/contributors/partitioning.rst.txt new file mode 100644 index 0000000000..fb294c827b --- /dev/null +++ b/docs/v1.1.1/_sources/contributors/partitioning.rst.txt @@ -0,0 +1,8 @@ +.. _partitioning: + +Partitioning Phase +==================== + +The phase is optional and enabled by the user. It instructs the compiler to separate nodes into ones that should run in PyTorch and ones that should run in TensorRT. +Criteria for separation include: Lack of a converter, operator is explicitly set to run in PyTorch by the user or the node has a flag which tells partitioning to +run in PyTorch by the module fallback passes. diff --git a/docs/v1.1.1/_sources/contributors/phases.rst.txt b/docs/v1.1.1/_sources/contributors/phases.rst.txt new file mode 100644 index 0000000000..e99af77faa --- /dev/null +++ b/docs/v1.1.1/_sources/contributors/phases.rst.txt @@ -0,0 +1,46 @@ +Compiler Phases +---------------- + +.. toctree:: + :caption: Compiler Phases + :maxdepth: 1 + :hidden: + + lowering + partitioning + conversion + runtime + +Lowering +^^^^^^^^^^^ +:ref:`lowering` + +The lowering is made up of a set of passes (some from PyTorch and some specific to Torch-TensorRT) +run over the graph IR to map the large PyTorch opset to a reduced opset that is easier to convert to +TensorRT. + +Partitioning +^^^^^^^^^^^^^ +:ref:`partitioning` + +The phase is optional and enabled by the user. It instructs the compiler to separate nodes into ones that should run in PyTorch and ones that should run in TensorRT. +Criteria for separation include: Lack of a converter, operator is explicitly set to run in PyTorch by the user or the node has a flag which tells partitioning to +run in PyTorch by the module fallback passes. + +Conversion +^^^^^^^^^^^ +:ref:`conversion` + +In the conversion phase we traverse the lowered graph and construct an equivalent TensorRT graph. +The conversion phase is made up of three main components, a context to manage compile time data, +a evaluator library which will execute operations that can be resolved at compile time and a converter +library which maps an op from JIT to TensorRT. + +Compilation and Runtime +^^^^^^^^^^^^^^^^^^^^^^^^ +:ref:`runtime` + +The final compilation phase constructs a TorchScript program to run the converted TensorRT engine. It +takes a serialized engine and instantiates it within a engine manager, then the compiler will +build out a JIT graph that references this engine and wraps it in a module to return to the user. +When the user executes the module, the JIT program run in the JIT runtime extended by Torch-TensorRT with the data providied from the user. diff --git a/docs/v1.1.1/_sources/contributors/runtime.rst.txt b/docs/v1.1.1/_sources/contributors/runtime.rst.txt new file mode 100644 index 0000000000..23d83b6db2 --- /dev/null +++ b/docs/v1.1.1/_sources/contributors/runtime.rst.txt @@ -0,0 +1,85 @@ +.. _execution: + +Runtime Phase +================ + +The Runtime phase is responsible for constructing self standing TorchScript graphs with embedded TensorRT engines and serving as the runtime +when these engines are called. The main interface accepts a serialized TensorRT engine. The execution phase +will deserialize and wrap this engine in a class which maintains a execution context for each engine +and some metadata about its inputs and outputs and is compatable with the TorchScript interpreter so that +it can be moved around and used like other TorchScript IValues. The engine is run by providing it and inputs +to the ``tensorrt::execute_engine`` operator which will take the engine and its inputs and return the results of engine exeuction. + + +Background +------------ +PyTorch JIT's runtime is based around a stack machine, all operators pop off arguments from the stack, pass them to +some implementation of the operator then push results back onto the stack. The actual elements of the stack +are ``torch::jit::IValues``, the same type we evaluate in the conversion phase (the realization of the abstract +torch::jit::Value type). + +TensorRT Engine Executor Op +---------------------------- + +When the Torch-TensorRT is loaded, it registers an operator in the PyTorch JIT operator library called +``trt::execute_engine(Tensor[] inputs, __torch__.torch.classes.tensorrt.Engine engine) -> Tensor[]`` which takes an +instantiated engine and list of inputs. Compiled graphs store this engine in an attribute so that it is portable and serializable. +When the op is called, an instnantiated engine and input tensors are popped off the runtime stack. These inputs are passed into a generic engine execution function which +will run the tensors through the TensorRT engine and return new tensors as results. These tensors are pushed on to the +stack so that the next op whatever it is can use it. + +Constructing the Resulting Graph +----------------------------------- + +Once the engine is deserialized and instantiated, the compiler will construct a graph that will execute the engine when the module is called. +Here is an example: + +.. code-block:: + + graph(%self_1 : __torch__.torchvision.models.resnet.___torch_mangle_4847.ResNet_trt, + %input_0 : Tensor): + %1 : __torch__.torch.classes.tensorrt.Engine = prim::GetAttr[name="__torch___torchvision_models_resnet____torch_mangle_4847_ResNet_trt_engine"](%self_1) + %3 : Tensor[] = prim::ListConstruct(%input_0) + %4 : Tensor[] = trt::execute_engine(%3, %1) + %5 : Tensor = prim::ListUnpack(%4) + return (%5) + +You can see the engine attribute in the graph and the ``trt::execute_engine`` op taking a list of input tensors and an engine in +and produces a list of output tensors which is returned. When ``forward`` is called on the module this graph is executed, thereby +running the TensorRT engine. + +In the case of multiple outputs, the compiled graph may repack output tensors into a Tuple to return back to the user. + +.. code-block:: + + graph(%self_1 : __torch__.PyTorch.Detection.SSD.src.model.SSD300_trt, + %input_0 : Tensor): + %1 : __torch__.torch.classes.tensorrt.Engine = prim::GetAttr[name="__torch___PyTorch_Detection_SSD_src_model_SSD300_trt_engine"](%self_1) + %3 : Tensor[] = prim::ListConstruct(%input_0) + %4 : Tensor[] = trt::execute_engine(%3, %1) + %5 : Tensor, %6 : Tensor = prim::ListUnpack(%4) + %7 : (Tensor, Tensor) = prim::TupleConstruct(%5, %6) + return (%7) + +Serialization and Deserialization +---------------------------------- + +Serialization and deserialization of TensorRT engines embedded in TorchScript graphs are handled by the holder class for the engine and TorchBind. +When a TorchScript module is saved, the pickler will run serilization on the cuda engine and store the serialized engine in the zip file created. +When deserializing, the depickler will call a constructor for the engine holder class with the serialized engine so that it can be set up again for +execution. + +ABI Versioning and Serialization Format +========================================= + +Torch-TensorRT programs are standard TorchScript with TensorRT engines as objects embedded in the graph. Therefore there is a serialization format +for the TensorRT engines. The format for Torch-TensorRT serialized programs are versioned with an "ABI" version which tells the runtime about runtime compatibility. + +> Current ABI version is 3 + +The format is a vector of serialized strings. They encode the following information + +* ABI Version for the program +* Name of the TRT engine +* Device information: Includes the target device the engine was built on, SM capability and other device information. This information is used at deserialization time to select the correct device to run the engine +* Serialized TensorRT engine diff --git a/docs/v1.1.1/_sources/contributors/system_overview.rst.txt b/docs/v1.1.1/_sources/contributors/system_overview.rst.txt new file mode 100644 index 0000000000..d16697e3a3 --- /dev/null +++ b/docs/v1.1.1/_sources/contributors/system_overview.rst.txt @@ -0,0 +1,29 @@ +.. _system_overview: + +System Overview +================ + +Torch-TensorRT is primarily a C++ Library with a Python API planned. We use Bazel as our build system and target Linux x86_64 and +Linux aarch64 (only natively) right now. The compiler we use is GCC 7.5.0 and the library is untested with compilers before that +version so there may be compilation errors if you try to use an older compiler. + +The repository is structured into: + +* core: Main compiler source code +* cpp: C++ API +* tests: tests of the C++ API, the core and converters +* py: Python API +* notebooks: Example applications built with Torch-TensorRT +* docs: Documentation +* docsrc: Documentation Source +* third_party: BUILD files for dependency libraries +* toolchains: Toolchains for different platforms + + +The C++ API is unstable and subject to change until the library matures, though most work is done under the hood in the core. + +The core has a couple major parts: The top level compiler interface which coordinates ingesting a module, lowering, +converting and generating a new module and returning it back to the user. There are the three main phases of the +compiler, the lowering phase, the conversion phase, and the execution phase. + +.. include:: phases.rst diff --git a/docs/v1.1.1/_sources/contributors/useful_links.rst.txt b/docs/v1.1.1/_sources/contributors/useful_links.rst.txt new file mode 100644 index 0000000000..d5903a16b0 --- /dev/null +++ b/docs/v1.1.1/_sources/contributors/useful_links.rst.txt @@ -0,0 +1,34 @@ +.. _useful_links: + +Useful Links for Torch-TensorRT Development +============================================== + +TensorRT Available Layers and Expected Dimensions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* https://docs.nvidia.com/deeplearning/sdk/tensorrt-support-matrix/index.html#layers-matrix + +TensorRT C++ Documentation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* https://docs.nvidia.com/deeplearning/tensorrt/api/c_api/index.html + +TensorRT Python Documentation (Sometimes easier to read) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/python_api/index.html + +PyTorch Functional API +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* https://pytorch.org/docs/stable/nn.functional.html + +PyTorch native_ops +^^^^^^^^^^^^^^^^^^^^^ + +* https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/native/native_functions.yaml + +PyTorch IR Documentation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* https://github.com/pytorch/pytorch/blob/master/torch/csrc/jit/OVERVIEW.md diff --git a/docs/v1.1.1/_sources/contributors/writing_converters.rst.txt b/docs/v1.1.1/_sources/contributors/writing_converters.rst.txt new file mode 100644 index 0000000000..990c4dc77d --- /dev/null +++ b/docs/v1.1.1/_sources/contributors/writing_converters.rst.txt @@ -0,0 +1,129 @@ +.. _writing_converters: + +Writing Converters +=================== + +Background +------------ + +In the JIT IR, operations are represented as nodes in a graph. A node has inputs and outputs, represented by ``torch::jit::Values`` +which are typed abstract representation of data flowing into and out of a node. TensorRT represents its graph though the +use of ``nvinfer1::ILayers`` and ``nvinfer1::ITensors`` which are its analogues to nodes and values. The goal of +converters create new ILayers and subgraphs that do operation specified by the node and associate produced ITensors +and Values together. + +Converters +------------ + +Converters should be functions which will use a list of inputs (either ``nvinfer1::ITensors`` or ``torch::jit::IValues``) to +construct an equivalent layer to the LibTorch op. + +Converters can be registered using the ``RegisterNodeConversionPatterns`` helper class where you instantiate a +RegisterNodeConversionPatterns object and call the pattern function on it (like below) which takes a string +which describes the function schema of the op that will cause the converter to be run and a lambda or function +which will do the actual conversion: + + Note the pattern function can be chained + +.. code-block:: c++ + + auto acthardtanh TORCHTRT_UNUSED = RegisterNodeConversionPatterns() + .pattern({ + "aten::hardtanh(Tensor self, Scalar min_val=-1, Scalar max_val=1) -> (Tensor)", + [](ConversionCtx* ctx, const torch::jit::Node* n, args& args) -> bool { + auto in = args[0].ITensor(); + auto min = args[1].unwrapToDouble(); + auto max = args[2].unwrapToDouble(); + + auto new_layer = ctx->net->addActivation(*in, nvinfer1::ActivationType::kCLIP); + TORCHTRT_CHECK(new_layer, "Unable to create layer for aten::hardtanh"); + + new_layer->setAlpha(min); + new_layer->setBeta(max); + + new_layer->setName(util::node_info(n).c_str()); + auto out_tensor = ctx->AssociateValueAndTensor(n->outputs()[0], new_layer->getOutput(0)); + + LOG_DEBUG("Output shape: " << out_tensor->getDimensions()); + return true; + } + }); + + +Converter Contract +---------------------- + +What is guaranteed to converters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +1. In the args there will be an entry for each node input value, either a ITensor or IValue +2. Inputs will be provided in order according to the function schema + +Responsibilities of a converter +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +1. Args must be guaranteed to be a type to unwrap the Arg union without checking, typically input tensor arguments can be expected to be ITensors +2. Any weights or static values must guaranteed to be valid until the end of conversion time + + a. A helpful tool is the Weights helper class described below + +3. Converters are expected to produce an IValue or ITensor for each output of a node. The compiler will check this and produce warnings if there are Values that don't have associated ITensors or IValues. +4. Outputs must be annotated + + a. There must be an association between a JIT nodes output values and the new TRT layers output tensors in the ``value_tensor_map`` in the conversion context + +5. Name your layers + + a. Its much easier to debug when we can track which layers and nodes correspond with each other. The system we are currently using is to use the "node info" of the node as the name of the layer + +6. Name your tensors + + a. Use the output value debug name as the name for the new ITensor (again for debugging) + +Conversion Context +-------------------- + +The conversion context maintains the state of conversion, it manages the Network Definition, two maps +one that stores associations between Values and IValues (the evaluated_value_map) and one that stores +associations between Values and ITensors, and any sort of memory that needs to live until the end of +conversion. The main apis that you will interface with in converters is directly accessing the network +definition to add layers ``ctx->net`` and data association functions ``ctx->AssociateValueAndTensor()`` +and ``ctx->AssociateValueAndIValue()``, which you will use to add layers to the TRT layers and log +pairs of node outputs and static values or TensorRT layer outputs. + +Args +------- + +Arguments provided to the converter are inspectable unions of ``nvinfer1::ITensors`` and ``torch::jit::IValues`` (i.e. +abstract dataflow in the TensorRT graph and static values). You are guaranteed that you will have some +argument for each input value for the node. They are provided in the order of the function schema. +It can be expected that inputs (meaning the parameters that would be passed into the forward +function of a module in PyTorch) will be ITensors but the Arg class also has mechanisms to inspect arguments safely +before unwrapping if you are unsure. Args also have deep unwrap methods that let you get straight to the +underlying data in an IValue if you know it's safe. You can also pass in a fallback value if there is a +chance the IValue is None. IValues have been extended to be able to hold a wrapper around ITensors only in the case of TensorLists. +You can get an ITensor from an IValue by a pattern similar to this: ``ivalue.toCustomClass()->tensor()``. +You can tell if an IValue contains a Tensor or an ITensor by using ``ivalue.isTensor()`` or ``ivalue.isCustomClass()``. + + +Weights +-------------- + +Weights are used during build time, so any weights need to be guaranteed to live until the end of the conversion phase. +TensorRT also uses its own weights structure to hold the weights. There is a wrapper around this class available +to converts which abstracts a lot of this. + +The weights wrapper class can accept either ``at::Tensors`` or singular values (right now). You also need to pass the +conversion context when constructing these weights because internally the weights class will allocate memory managed +by the conversion context to store a copy of the tensor data. This data gets freed when the conversion context +destructor gets destroyed so converters don't really need to think about it. + +There is metadata generated from the shape of the input data which becomes useful in interfacing with TensorRT, such +as number of input maps, number of output maps and kernel shape. + +Other advice +-------------- + +You have the benefit of the full aten library when dealing with weights and other static values. This means that you +can do quite a bit of work during conversion time to produce efficient conversion. A good example is batch_norm +converter where the converter does fusion of operations with PyTorch before creating the TensorRT layer. diff --git a/docs/v1.1.1/_sources/getting_started/getting_started_with_cpp_api.rst.txt b/docs/v1.1.1/_sources/getting_started/getting_started_with_cpp_api.rst.txt new file mode 100644 index 0000000000..7f7f60a669 --- /dev/null +++ b/docs/v1.1.1/_sources/getting_started/getting_started_with_cpp_api.rst.txt @@ -0,0 +1,338 @@ +.. _getting_started_cpp: + +Using Torch-TensorRT in C++ +============================== + +If you haven't already, acquire a tarball of the library by following the instructions in :ref:`Installation` + +Using Torch-TensorRT in C++ +*************************** +Torch-TensorRT C++ API accepts TorchScript modules (generated either from ``torch.jit.script`` or ``torch.jit.trace``) as an input and returns +a Torchscript module (optimized using TensorRT). This requires users to use Pytorch (in python) to generate torchscript modules beforehand. +Please refer to `Creating TorchScript modules in Python `_ section to generate torchscript graphs. + + +.. _torch_tensorrt_quickstart: + +[Torch-TensorRT Quickstart] Compiling TorchScript Modules with ``torchtrtc`` +--------------------------------------------------------------------------------- + +An easy way to get started with Torch-TensorRT and to check if your model can be supported without extra work is to run it through +``torchtrtc``, which supports almost all features of the compiler from the command line including post training quantization +(given a previously created calibration cache). For example we can compile our lenet model by setting our preferred operating +precision and input size. This new TorchScript file can be loaded into Python (note: you need to ``import torch_tensorrt`` before loading +these compiled modules because the compiler extends the PyTorch the deserializer and runtime to execute compiled modules). + +.. code-block:: shell + + ❯ torchtrtc -p f16 lenet_scripted.ts trt_lenet_scripted.ts "(1,1,32,32)" + + ❯ python3 + Python 3.6.9 (default, Apr 18 2020, 01:56:04) + [GCC 8.4.0] on linux + Type "help", "copyright", "credits" or "license" for more information. + >>> import torch + >>> import torch_tensorrt + >>> ts_model = torch.jit.load(“trt_lenet_scripted.ts”) + >>> ts_model(torch.randn((1,1,32,32)).to(“cuda”).half()) + +You can learn more about ``torchtrtc`` usage here: :ref:`torchtrtc` + +.. _ts_in_cc: + +Working with TorchScript in C++ +-------------------------------- + +If we are developing an application to deploy with C++, we can save either our traced or scripted module using ``torch.jit.save`` +which will serialize the TorchScript code, weights and other information into a package. This is also where our dependency on Python ends. + +.. code-block:: python + + torch_script_module.save("lenet.jit.pt") + +From here we can now load our TorchScript module in C++ + +.. code-block:: c++ + + #include // One-stop header. + + #include + #include + + int main(int argc, const char* argv[]) { + torch::jit::Module module; + try { + // Deserialize the ScriptModule from a file using torch::jit::load(). + module = torch::jit::load(""); + } + catch (const c10::Error& e) { + std::cerr << "error loading the model\n"; + return -1; + } + + std::cout << "ok\n"; + + +You can do full training and inference in C++ with PyTorch / LibTorch if you would like, you can even define your modules in C++ and +have access to the same powerful tensor library that backs PyTorch. (For more information: https://pytorch.org/cppdocs/). +For instance we can do inference with our LeNet module like this: + +.. code-block:: c++ + + mod.eval(); + torch::Tensor in = torch::randn({1, 1, 32, 32}); + auto out = mod.forward(in); + +and to run on the GPU: + +.. code-block:: c++ + + mod.eval(); + mod.to(torch::kCUDA); + torch::Tensor in = torch::randn({1, 1, 32, 32}, torch::kCUDA); + auto out = mod.forward(in); + +As you can see it is pretty similar to the Python API. When you call the ``forward`` method, you invoke the PyTorch JIT compiler, which will optimize and run your TorchScript code. + +.. _compile_cpp: + +Compiling with Torch-TensorRT in C++ +------------------------------------- +We are also at the point were we can compile and optimize our module with Torch-TensorRT, but instead of in a JIT fashion we must do it ahead-of-time (AOT) i.e. before we start doing actual inference work +since it takes a bit of time to optimize the module, it would not make sense to do this every time you run the module or even the first time you run it. + +With our module loaded, we can feed it into the Torch-TensorRT compiler. When we do so we must provide some information on the expected input size and also configure any additional settings. + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + ... + + mod.to(at::kCUDA); + mod.eval(); + + auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}); + auto trt_mod = torch_tensorrt::CompileGraph(mod, std::vector{{in.sizes()}}); + auto out = trt_mod.forward({in}); + +Thats it! Now the graph runs primarily not with the JIT compiler but using TensorRT (though we execute the graph using the JIT runtime). + +We can also set settings like operating precision to run in FP16. + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + ... + + mod.to(at::kCUDA); + mod.eval(); + + auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}).to(torch::kHALF); + auto input_sizes = std::vector({in.sizes()}); + torch_tensorrt::CompileSpec info(input_sizes); + info.enable_precisions.insert(torch::kHALF); + auto trt_mod = torch_tensorrt::CompileGraph(mod, info); + auto out = trt_mod.forward({in}); + +And now we are running the module in FP16 precision. You can then save the module to load later. + +.. code-block:: c++ + + trt_mod.save("") + +Torch-TensorRT compiled TorchScript modules are loaded in the same way as normal TorchScript module. Make sure your deployment application is linked against ``libtorchtrt.so`` + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + + int main(int argc, const char* argv[]) { + torch::jit::Module module; + try { + // Deserialize the ScriptModule from a file using torch::jit::load(). + module = torch::jit::load(""); + } + catch (const c10::Error& e) { + std::cerr << "error loading the model\n"; + return -1; + } + + torch::Tensor in = torch::randn({1, 1, 32, 32}, torch::kCUDA); + auto out = mod.forward(in); + + std::cout << "ok\n"; + } + +If you want to save the engine produced by Torch-TensorRT to use in a TensorRT application you can use the ``ConvertGraphToTRTEngine`` API. + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + ... + + mod.to(at::kCUDA); + mod.eval(); + + auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}).to(torch::kHALF); + auto input_sizes = std::vector({in.sizes()}); + torch_tensorrt::CompileSpec info(input_sizes); + info.enabled_precisions.insert(torch::kHALF); + auto trt_mod = torch_tensorrt::ConvertGraphToTRTEngine(mod, "forward", info); + std::ofstream out("/tmp/engine_converted_from_jit.trt"); + out << engine; + out.close(); + +.. _under_the_hood: + +Under The Hood +--------------- + +When a module is provided to Torch-TensorRT, the compiler starts by mapping a graph like you saw above to a graph like this: + +.. code-block:: none + + graph(%input.2 : Tensor): + %2 : Float(84, 10) = prim::Constant[value=]() + %3 : Float(120, 84) = prim::Constant[value=]() + %4 : Float(576, 120) = prim::Constant[value=]() + %5 : int = prim::Constant[value=-1]() # x.py:25:0 + %6 : int[] = prim::Constant[value=annotate(List[int], [])]() + %7 : int[] = prim::Constant[value=[2, 2]]() + %8 : int[] = prim::Constant[value=[0, 0]]() + %9 : int[] = prim::Constant[value=[1, 1]]() + %10 : bool = prim::Constant[value=1]() # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0 + %11 : int = prim::Constant[value=1]() # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0 + %12 : bool = prim::Constant[value=0]() # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0 + %self.classifer.fc3.bias : Float(10) = prim::Constant[value= 0.0464 0.0383 0.0678 0.0932 0.1045 -0.0805 -0.0435 -0.0818 0.0208 -0.0358 [ CUDAFloatType{10} ]]() + %self.classifer.fc2.bias : Float(84) = prim::Constant[value=]() + %self.classifer.fc1.bias : Float(120) = prim::Constant[value=]() + %self.feat.conv2.weight : Float(16, 6, 3, 3) = prim::Constant[value=]() + %self.feat.conv2.bias : Float(16) = prim::Constant[value=]() + %self.feat.conv1.weight : Float(6, 1, 3, 3) = prim::Constant[value=]() + %self.feat.conv1.bias : Float(6) = prim::Constant[value= 0.0530 -0.1691 0.2802 0.1502 0.1056 -0.1549 [ CUDAFloatType{6} ]]() + %input0.4 : Tensor = aten::_convolution(%input.2, %self.feat.conv1.weight, %self.feat.conv1.bias, %9, %8, %9, %12, %8, %11, %12, %12, %10) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0 + %input0.5 : Tensor = aten::relu(%input0.4) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0 + %input1.2 : Tensor = aten::max_pool2d(%input0.5, %7, %6, %8, %9, %12) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0 + %input0.6 : Tensor = aten::_convolution(%input1.2, %self.feat.conv2.weight, %self.feat.conv2.bias, %9, %8, %9, %12, %8, %11, %12, %12, %10) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0 + %input2.1 : Tensor = aten::relu(%input0.6) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0 + %x.1 : Tensor = aten::max_pool2d(%input2.1, %7, %6, %8, %9, %12) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0 + %input.1 : Tensor = aten::flatten(%x.1, %11, %5) # x.py:25:0 + %27 : Tensor = aten::matmul(%input.1, %4) + %28 : Tensor = trt::const(%self.classifer.fc1.bias) + %29 : Tensor = aten::add_(%28, %27, %11) + %input0.2 : Tensor = aten::relu(%29) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0 + %31 : Tensor = aten::matmul(%input0.2, %3) + %32 : Tensor = trt::const(%self.classifer.fc2.bias) + %33 : Tensor = aten::add_(%32, %31, %11) + %input1.1 : Tensor = aten::relu(%33) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0 + %35 : Tensor = aten::matmul(%input1.1, %2) + %36 : Tensor = trt::const(%self.classifer.fc3.bias) + %37 : Tensor = aten::add_(%36, %35, %11) + return (%37) + (CompileGraph) + +The graph has now been transformed from a collection of modules, each managing their own parameters into a single graph with the parameters inlined +into the graph and all of the operations laid out. Torch-TensorRT has also executed a number of optimizations and mappings to make the graph easier to translate to TensorRT. +From here the compiler can assemble the TensorRT engine by following the dataflow through the graph. + +When the graph construction phase is complete, Torch-TensorRT produces a serialized TensorRT engine. From here depending on the API, this engine is returned +to the user or moves into the graph construction phase. Here Torch-TensorRT creates a JIT Module to execute the TensorRT engine which will be instantiated and managed +by the Torch-TensorRT runtime. + +Here is the graph that you get back after compilation is complete: + +.. code-block:: none + + graph(%self_1 : __torch__.lenet, %input_0 : Tensor): + %1 : ...trt.Engine = prim::GetAttr[name="lenet"](%self_1) + %3 : Tensor[] = prim::ListConstruct(%input_0) + %4 : Tensor[] = trt::execute_engine(%3, %1) + %5 : Tensor = prim::ListUnpack(%4) + return (%5) + + +You can see the call where the engine is executed, after extracting the attribute containing the engine and constructing a list of inputs, then returns the tensors back to the user. + +.. _unsupported_ops: + +Working with Unsupported Operators +----------------------------------- + +Torch-TensorRT is a new library and the PyTorch operator library is quite large, so there will be ops that aren't supported natively by the compiler. You can either use the composition techinques +shown above to make modules are fully Torch-TensorRT supported and ones that are not and stitch the modules together in the deployment application or you can register converters for missing ops. + + You can check support without going through the full compilation pipleine using the ``torch_tensorrt::CheckMethodOperatorSupport(const torch::jit::Module& module, std::string method_name)`` api + to see what operators are not supported. ``torchtrtc`` automatically checks modules with this method before starting compilation and will print out a list of operators that are not supported. + +.. _custom_converters: + +Registering Custom Converters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Operations are mapped to TensorRT through the use of modular converters, a function that takes a node from a the JIT graph and produces an equivalent layer or subgraph in TensorRT. +Torch-TensorRT ships with a library of these converters stored in a registry, that will be executed depending on the node being parsed. For instance a ``aten::relu(%input0.4)`` instruction will trigger +the relu converter to be run on it, producing an activation layer in the TensorRT graph. But since this library is not exhaustive you may need to write your own to get Torch-TensorRT +to support your module. + +Shipped with the Torch-TensorRT distribution are the internal core API headers. You can therefore access the converter registry and add a converter for the op you need. + +For example, if we try to compile a graph with a build of Torch-TensorRT that doesn't support the flatten operation (``aten::flatten``) you may see this error: + +.. code-block:: none + + terminate called after throwing an instance of 'torch_tensorrt::Error' + what(): [enforce fail at core/conversion/conversion.cpp:109] Expected converter to be true but got false + Unable to convert node: %input.1 : Tensor = aten::flatten(%x.1, %11, %5) # x.py:25:0 (conversion.AddLayer) + Schema: aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor) + Converter for aten::flatten requested, but no such converter was found. + If you need a converter for this operator, you can try implementing one yourself + or request a converter: https://www.github.com/NVIDIA/Torch-TensorRT/issues + +We can register a converter for this operator in our application. All of the tools required to build a converter can be imported by including ``torch_tensorrt/core/conversion/converters/converters.h``. +We start by creating an instance of the self-registering class ``torch_tensorrt::core::conversion::converters::RegisterNodeConversionPatterns()`` which will register converters +in the global converter registry, associating a function schema like ``aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor)`` with a lambda that +will take the state of the conversion, the node/operation in question to convert and all of the inputs to the node and produces as a side effect a new layer in the TensorRT network. +Arguments are passed as a vector of inspectable unions of TensorRT ``ITensors`` and Torch ``IValues`` in the order arguments are listed in the schema. + +Below is a implementation of a ``aten::flatten`` converter that we can use in our application. You have full access to the Torch and TensorRT libraries in the converter implementation. So +for example we can quickly get the output size by just running the operation in PyTorch instead of implementing the full calculation outself like we do below for this flatten converter. + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + #include "torch_tensorrt/core/conversion/converters/converters.h" + + static auto flatten_converter = torch_tensorrt::core::conversion::converters::RegisterNodeConversionPatterns() + .pattern({ + "aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor)", + [](torch_tensorrt::core::conversion::ConversionCtx* ctx, + const torch::jit::Node* n, + torch_tensorrt::core::conversion::converters::args& args) -> bool { + auto in = args[0].ITensor(); + auto start_dim = args[1].unwrapToInt(); + auto end_dim = args[2].unwrapToInt(); + auto in_shape = torch_tensorrt::core::util::toVec(in->getDimensions()); + auto out_shape = torch::flatten(torch::rand(in_shape), start_dim, end_dim).sizes(); + + auto shuffle = ctx->net->addShuffle(*in); + shuffle->setReshapeDimensions(torch_tensorrt::core::util::toDims(out_shape)); + shuffle->setName(torch_tensorrt::core::util::node_info(n).c_str()); + + auto out_tensor = ctx->AssociateValueAndTensor(n->outputs()[0], shuffle->getOutput(0)); + return true; + } + }); + + int main() { + ... + +To use this converter in Python, it is recommended to use PyTorch's `C++ / CUDA Extention `_ +template to wrap your library of converters into a ``.so`` that you can load with ``ctypes.CDLL()`` in your Python application. + +You can find more information on all the details of writing converters in the contributors documentation (:ref:`writing_converters`). +If you find yourself with a large library of converter implementations, do consider upstreaming them, PRs are welcome and it would be great for the community to benefit as well. diff --git a/docs/v1.1.1/_sources/getting_started/getting_started_with_python_api.rst.txt b/docs/v1.1.1/_sources/getting_started/getting_started_with_python_api.rst.txt new file mode 100644 index 0000000000..fece176156 --- /dev/null +++ b/docs/v1.1.1/_sources/getting_started/getting_started_with_python_api.rst.txt @@ -0,0 +1,58 @@ +.. _getting_started_with_python_api: + +Using Torch-TensorRT in Python +******************************* + +The Torch-TensorRT Python API supports a number of unique usecases compared to the CLI and C++ APIs which solely support TorchScript compilation. + +Torch-TensorRT Python API can accept a ``torch.nn.Module``, ``torch.jit.ScriptModule``, or ``torch.fx.GraphModule`` as an input. +Depending on what is provided one of the two frontends (TorchScript or FX) will be selected to compile the module. Provided the +module type is supported, users may explicitly set which frontend they would like to use using the ``ir`` flag for ``compile``. +If given a ``torch.nn.Module`` and the ``ir`` flag is set to either ``default`` or ``torchscript`` the module will be run through +``torch.jit.script`` to convert the input module into a TorchScript module. + + +To compile your input ``torch.nn.Module`` with Torch-TensorRT, all you need to do is provide the module and inputs +to Torch-TensorRT and you will be returned an optimized TorchScript module to run or add into another PyTorch module. Inputs +is a list of ``torch_tensorrt.Input`` classes which define input's shape, datatype and memory format. You can also specify settings such as +operating precision for the engine or target device. After compilation you can save the module just like any other module +to load in a deployment application. In order to load a TensorRT/TorchScript module, make sure you first import ``torch_tensorrt``. + +.. code-block:: python + + import torch_tensorrt + + ... + + model = MyModel().eval() # torch module needs to be in eval (not training) mode + + inputs = [ + torch_tensorrt.Input( + min_shape=[1, 1, 16, 16], + opt_shape=[1, 1, 32, 32], + max_shape=[1, 1, 64, 64], + dtype=torch.half, + ) + ] + enabled_precisions = {torch.float, torch.half} # Run with fp16 + + trt_ts_module = torch_tensorrt.compile( + model, inputs=inputs, enabled_precisions=enabled_precisions + ) + + input_data = input_data.to("cuda").half() + result = trt_ts_module(input_data) + torch.jit.save(trt_ts_module, "trt_ts_module.ts") + +.. code-block:: python + + # Deployment application + import torch + import torch_tensorrt + + trt_ts_module = torch.jit.load("trt_ts_module.ts") + input_data = input_data.to("cuda").half() + result = trt_ts_module(input_data) + +Torch-TensorRT Python API also provides ``torch_tensorrt.ts.compile`` which accepts a TorchScript module as input and ``torch_tensorrt.fx.compile`` which accepts a FX GraphModule as input. + diff --git a/docs/v1.1.1/_sources/getting_started/installation.rst.txt b/docs/v1.1.1/_sources/getting_started/installation.rst.txt new file mode 100644 index 0000000000..937dd1dde9 --- /dev/null +++ b/docs/v1.1.1/_sources/getting_started/installation.rst.txt @@ -0,0 +1,362 @@ +.. _installation: + +Installation +============= + +Precompiled Binaries +********************* + +Dependencies +--------------- + +You need to have either PyTorch or LibTorch installed based on if you are using Python or C++ +and you must have CUDA, cuDNN and TensorRT installed. + + * https://www.pytorch.org + * https://developer.nvidia.com/cuda + * https://developer.nvidia.com/cudnn + * https://developer.nvidia.com/tensorrt + + +Python Package +--------------- + +You can install the python package using + +.. code-block:: sh + + pip3 install torch-tensorrt -f https://github.com/pytorch/TensorRT/releases + +.. _bin-dist: + +C++ Binary Distribution +------------------------ + +Precompiled tarballs for releases are provided here: https://github.com/pytorch/TensorRT/releases + +.. _compile-from-source: + +Compiling From Source +****************************************** + +.. _installing-deps: + +Dependencies for Compilation +------------------------------- + +Torch-TensorRT is built with Bazel, so begin by installing it. + + * The easiest way is to install bazelisk using the method of your choosing https://github.com/bazelbuild/bazelisk + * Otherwise you can use the following instructions to install binaries https://docs.bazel.build/versions/master/install.html + * Finally if you need to compile from source (e.g. aarch64 until bazel distributes binaries for the architecture) you can use these instructions + + .. code-block:: shell + + export BAZEL_VERSION=$(cat /.bazelversion) + mkdir bazel + cd bazel + curl -fSsL -O https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-dist.zip + unzip bazel-$BAZEL_VERSION-dist.zip + bash ./compile.sh + cp output/bazel /usr/local/bin/ + + +You will also need to have CUDA installed on the system (or if running in a container, the system must have +the CUDA driver installed and the container must have CUDA) + +The correct LibTorch version will be pulled down for you by bazel. + + NOTE: For best compatability with official PyTorch, use torch==1.10.0+cuda113, TensorRT 8.0 and cuDNN 8.2 for CUDA 11.3 however Torch-TensorRT itself supports + TensorRT and cuDNN for other CUDA versions for usecases such as using NVIDIA compiled distributions of PyTorch that use other versions of CUDA + e.g. aarch64 or custom compiled version of PyTorch. + +.. _abis: + +Choosing the Right ABI +^^^^^^^^^^^^^^^^^^^^^^^^ + +Likely the most complicated thing about compiling Torch-TensorRT is selecting the correct ABI. There are two options +which are incompatible with each other, pre-cxx11-abi and the cxx11-abi. The complexity comes from the fact that while +the most popular distribution of PyTorch (wheels downloaded from pytorch.org/pypi directly) use the pre-cxx11-abi, most +other distributions you might encounter (e.g. ones from NVIDIA - NGC containers, and builds for Jetson as well as certain +libtorch builds and likely if you build PyTorch from source) use the cxx11-abi. It is important you compile Torch-TensorRT +using the correct ABI to function properly. Below is a table with general pairings of PyTorch distribution sources and the +recommended commands: + ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| PyTorch Source | Recommended C++ Compilation Command | Recommended Python Compilation Command | ++=============================================================+==========================================================+====================================================================+ +| PyTorch whl file from PyTorch.org | bazel build //:libtorchtrt -c opt --config pre_cxx11_abi | python3 setup.py bdist_wheel | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| libtorch-shared-with-deps-*.zip from PyTorch.org | bazel build //:libtorchtrt -c opt --config pre_cxx11_abi | python3 setup.py bdist_wheel | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| libtorch-cxx11-abi-shared-with-deps-*.zip from PyTorch.org | bazel build //:libtorchtrt -c opt | python3 setup.py bdist_wheel --use-cxx11-abi | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| PyTorch preinstalled in an NGC container | bazel build //:libtorchtrt -c opt | python3 setup.py bdist_wheel --use-cxx11-abi | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| PyTorch from the NVIDIA Forums for Jetson | bazel build //:libtorchtrt -c opt | python3 setup.py bdist_wheel --jetpack-version 4.6 --use-cxx11-abi | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| PyTorch built from Source | bazel build //:libtorchtrt -c opt | python3 setup.py bdist_wheel --use-cxx11-abi | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ + + NOTE: For all of the above cases you must correctly declare the source of PyTorch you intend to use in your WORKSPACE file for both Python and C++ builds. See below for more information + +You then have two compilation options: + +.. _build-from-archive: + +**Building using cuDNN & TensorRT tarball distributions** +-------------------------------------------------------------- + + This is recommended so as to build Torch-TensorRT hermetically and insures any compilation errors are not caused by version issues + + Make sure when running Torch-TensorRT that these versions of the libraries are prioritized in your ``$LD_LIBRARY_PATH`` + +You need to download the tarball distributions of TensorRT and cuDNN from the NVIDIA website. + * https://developer.nvidia.com/cudnn + * https://developer.nvidia.com/tensorrt + +Place these files in a directory (the directories ``third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu]`` exist for this purpose) + +Then compile referencing the directory with the tarballs + + If you get errors regarding the packages, check their sha256 hashes and make sure they match the ones listed in ``WORKSPACE`` + +Release Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: shell + + bazel build //:libtorchtrt -c opt --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu] + +A tarball with the include files and library can then be found in ``bazel-bin`` + +.. _build-from-archive-debug: + +Debug Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +To build with debug symbols use the following command + +.. code-block:: shell + + bazel build //:libtorchtrt -c dbg --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu] + +A tarball with the include files and library can then be found in ``bazel-bin`` + +Pre CXX11 ABI Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +To build using the pre-CXX11 ABI use the ``pre_cxx11_abi`` config + +.. code-block:: shell + + bazel build //:libtorchtrt --config pre_cxx11_abi -c [dbg/opt] --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu] + +A tarball with the include files and library can then be found in ``bazel-bin`` + +.. _build-from-local: + +**Building using locally installed cuDNN & TensorRT** +-------------------------------------------------------------- + + If you encounter bugs and you compiled using this method please disclose that you used local sources in the issue (an ldd dump would be nice too) + +Install TensorRT, CUDA and cuDNN on the system before starting to compile. + +In WORKSPACE comment out: + +.. code-block:: python + + # Downloaded distributions to use with --distdir + http_archive( + name="cudnn", + urls=[ + "", + ], + build_file="@//third_party/cudnn/archive:BUILD", + sha256="", + strip_prefix="cuda", + ) + + http_archive( + name="tensorrt", + urls=[ + "", + ], + build_file="@//third_party/tensorrt/archive:BUILD", + sha256="", + strip_prefix="TensorRT-", + ) + +and uncomment + +.. code-block:: python + + # Locally installed dependencies + new_local_repository( + name="cudnn", path="/usr/", build_file="@//third_party/cudnn/local:BUILD" + ) + + new_local_repository( + name="tensorrt", path="/usr/", build_file="@//third_party/tensorrt/local:BUILD" + ) + +Release Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +Compile using: + +.. code-block:: shell + + bazel build //:libtorchtrt -c opt + +A tarball with the include files and library can then be found in ``bazel-bin`` + +.. _build-from-local-debug: + +Debug Build +^^^^^^^^^^^^ + +To build with debug symbols use the following command + +.. code-block:: shell + + bazel build //:libtorchtrt -c dbg + + +A tarball with the include files and library can then be found in ``bazel-bin`` + +Pre CXX11 ABI Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +To build using the pre-CXX11 ABI use the ``pre_cxx11_abi`` config + +.. code-block:: shell + + bazel build //:libtorchtrt --config pre_cxx11_abi -c [dbg/opt] + +**Building with CMake** +----------------------- + +It is possible to build the API libraries (in cpp/) and the torchtrtc executable using CMake instead of Bazel. +Currently, the python API and the tests cannot be built with CMake. +Begin by installing CMake. + + * Latest releases of CMake and instructions on how to install are available for different platforms + [on their website](https://cmake.org/download/). + +A few useful CMake options include: + + * CMake finders for TensorRT and cuDNN are provided in `cmake/Modules`. In order for CMake to use them, pass + `-DCMAKE_MODULE_PATH=cmake/Modules` when configuring the project with CMake. + * Libtorch provides its own CMake finder. In case CMake doesn't find it, pass the path to your install of + libtorch with `-DTorch_DIR=/share/cmake/Torch` + * If TensorRT is not found with the provided cmake finder, specify `-DTensorRT_ROOT=` + * Finally, configure and build the project in a build directory of your choice with the following command + from the root of Torch-TensorRT project: + + .. code-block:: shell + + cmake -S. -B \ + [-DCMAKE_MODULE_PATH=cmake/Module] \ + [-DTorch_DIR=/share/cmake/Torch] \ + [-DTensorRT_ROOT=] \ + [-DCMAKE_BUILD_TYPE=Debug|Release] + cmake --build + +**Building the Python package** +-------------------------------- + +Begin by installing ``ninja`` + +You can build the Python package using ``setup.py`` (this will also build the correct version of ``libtorchtrt.so``) + +.. code-block:: shell + + python3 setup.py [install/bdist_wheel] + +Debug Build +^^^^^^^^^^^^ + +.. code-block:: shell + + python3 setup.py develop [--user] + +This also compiles a debug build of ``libtorchtrt.so`` + +**Building Natively on aarch64 (Jetson)** +------------------------------------------- + +Prerequisites +^^^^^^^^^^^^^^ + +Install or compile a build of PyTorch/LibTorch for aarch64 + +NVIDIA hosts builds the latest release branch for Jetson here: + + https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-10-now-available/72048 + + +Enviorment Setup +^^^^^^^^^^^^^^^^^ + +To build natively on aarch64-linux-gnu platform, configure the ``WORKSPACE`` with local available dependencies. + +1. Replace ``WORKSPACE`` with the corresponding WORKSPACE file in ``//toolchains/jp_workspaces`` + +2. Configure the correct paths to directory roots containing local dependencies in the ``new_local_repository`` rules: + + NOTE: If you installed PyTorch using a pip package, the correct path is the path to the root of the python torch package. + In the case that you installed with ``sudo pip install`` this will be ``/usr/local/lib/python3.8/dist-packages/torch``. + In the case you installed with ``pip install --user`` this will be ``$HOME/.local/lib/python3.8/site-packages/torch``. + +In the case you are using NVIDIA compiled pip packages, set the path for both libtorch sources to the same path. This is because unlike +PyTorch on x86_64, NVIDIA aarch64 PyTorch uses the CXX11-ABI. If you compiled for source using the pre_cxx11_abi and only would like to +use that library, set the paths to the same path but when you compile make sure to add the flag ``--config=pre_cxx11_abi`` + +.. code-block:: shell + + new_local_repository( + name = "libtorch", + path = "/usr/local/lib/python3.8/dist-packages/torch", + build_file = "third_party/libtorch/BUILD" + ) + + new_local_repository( + name = "libtorch_pre_cxx11_abi", + path = "/usr/local/lib/python3.8/dist-packages/torch", + build_file = "third_party/libtorch/BUILD" + ) + + +Compile C++ Library and Compiler CLI +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + NOTE: Due to shifting dependency locations between Jetpack 4.5 and 4.6 there is a now a flag to inform bazel of the Jetpack version + + .. code-block:: shell + + --platforms //toolchains:jetpack_x.x + + +Compile Torch-TensorRT library using bazel command: + +.. code-block:: shell + + bazel build //:libtorchtrt --platforms //toolchains:jetpack_5.0 + +Compile Python API +^^^^^^^^^^^^^^^^^^^^ + + NOTE: Due to shifting dependencies locations between Jetpack 4.5 and newer Jetpack verisons there is now a flag for ``setup.py`` which sets the jetpack version (default: 5.0) + +Compile the Python API using the following command from the ``//py`` directory: + +.. code-block:: shell + + python3 setup.py install --use-cxx11-abi + +If you have a build of PyTorch that uses Pre-CXX11 ABI drop the ``--use-cxx11-abi`` flag + +If you are building for Jetpack 4.5 add the ``--jetpack-version 5.0`` flag diff --git a/docs/v1.1.1/_sources/index.rst.txt b/docs/v1.1.1/_sources/index.rst.txt new file mode 100644 index 0000000000..30b0beddc6 --- /dev/null +++ b/docs/v1.1.1/_sources/index.rst.txt @@ -0,0 +1,124 @@ +.. Torch-TensorRT documentation master file, created by + sphinx-quickstart on Mon May 4 13:43:16 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Torch-TensorRT +============== +Ahead-of-time compilation of TorchScript / PyTorch JIT for NVIDIA GPUs +----------------------------------------------------------------------- +Torch-TensorRT is a compiler for PyTorch/TorchScript, targeting NVIDIA GPUs via NVIDIA's TensorRT Deep Learning Optimizer and Runtime. +Unlike PyTorch's Just-In-Time (JIT) compiler, Torch-TensorRT is an Ahead-of-Time (AOT) compiler, meaning that before you deploy your +TorchScript code, you go through an explicit compile step to convert a standard TorchScript program into an module targeting +a TensorRT engine. Torch-TensorRT operates as a PyTorch extention and compiles modules that integrate into the JIT runtime seamlessly. +After compilation using the optimized graph should feel no different than running a TorchScript module. +You also have access to TensorRT's suite of configurations at compile time, so you are able to specify +operating precision (FP32/FP16/INT8) and other settings for your module. + +More Information / System Architecture: + +* `GTC 2020 Talk `_ + +Getting Started +---------------- +* :ref:`installation` +* :ref:`getting_started` +* :ref:`ptq` +* :ref:`torchtrtc` +* :ref:`use_from_pytorch` +* :ref:`runtime` +* :ref:`using_dla` + +.. toctree:: + :caption: Getting Started + :maxdepth: 1 + :hidden: + + tutorials/installation + tutorials/getting_started_with_cpp_api + tutorials/getting_started_with_python_api + tutorials/creating_torchscript_module_in_python + tutorials/ptq + tutorials/torchtrtc + tutorials/use_from_pytorch + tutorials/runtime + tutorials/using_dla + +.. toctree:: + :caption: Notebooks + :maxdepth: 1 + :hidden: + + _notebooks/CitriNet-example + _notebooks/dynamic-shapes + _notebooks/EfficientNet-example + _notebooks/Hugging-Face-BERT + _notebooks/lenet-getting-started + _notebooks/Resnet50-example + _notebooks/ssd-object-detection-demo + _notebooks/vgg-qat + + +Python API Documenation +------------------------ +* :ref:`torch_tensorrt_py` +* :ref:`torch_tensorrt_logging_py` +* :ref:`torch_tensorrt_ptq_py` +* :ref:`torch_tensorrt_ts_py` + +.. toctree:: + :caption: Python API Documenation + :maxdepth: 0 + :hidden: + + py_api/torch_tensorrt + py_api/logging + py_api/ptq + py_api/ts + +C++ API Documenation +---------------------- +* :ref:`namespace_torch_tensorrt` +* :ref:`namespace_torch_tensorrt__logging` +* :ref:`namespace_torch_tensorrt__ptq` +* :ref:`namespace_torch_tensorrt__torchscript` + + +.. toctree:: + :caption: C++ API Documenation + :maxdepth: 1 + :hidden: + + _cpp_api/torch_tensort_cpp + _cpp_api/namespace_torch_tensorrt + _cpp_api/namespace_torch_tensorrt__logging + _cpp_api/namespace_torch_tensorrt__torchscript + _cpp_api/namespace_torch_tensorrt__ptq + +Contributor Documentation +-------------------------------- +* :ref:`system_overview` +* :ref:`writing_converters` +* :ref:`useful_links` + +.. toctree:: + :caption: Contributor Documentation + :maxdepth: 1 + :hidden: + + contributors/system_overview + contributors/writing_converters + contributors/useful_links + +Indices +---------------- +* :ref:`supported_ops` +* :ref:`genindex` +* :ref:`search` + +.. toctree:: + :caption: Indices + :maxdepth: 1 + :hidden: + + indices/supported_ops diff --git a/docs/v1.1.1/_sources/indices/supported_ops.rst.txt b/docs/v1.1.1/_sources/indices/supported_ops.rst.txt new file mode 100644 index 0000000000..2ce7b34ae7 --- /dev/null +++ b/docs/v1.1.1/_sources/indices/supported_ops.rst.txt @@ -0,0 +1,274 @@ + +.. _supported_ops: + +================================= +Operators Supported +================================= + + +Operators Currently Supported Through Converters +------------------------------------------------- + +- aten::_convolution(Tensor input, Tensor weight, Tensor? bias, int[] stride, int[] padding, int[] dilation, bool transposed, int[] output_padding, int groups, bool benchmark, bool deterministic, bool cudnn_enabled, bool allow_tf32) -> (Tensor) +- aten::_convolution.deprecated(Tensor input, Tensor weight, Tensor? bias, int[] stride, int[] padding, int[] dilation, bool transposed, int[] output_padding, int groups, bool benchmark, bool deterministic, bool cudnn_enabled) -> (Tensor) +- aten::abs(Tensor self) -> (Tensor) +- aten::acos(Tensor self) -> (Tensor) +- aten::acosh(Tensor self) -> (Tensor) +- aten::adaptive_avg_pool1d(Tensor self, int[1] output_size) -> (Tensor) +- aten::adaptive_avg_pool2d(Tensor self, int[2] output_size) -> (Tensor) +- aten::adaptive_avg_pool3d(Tensor self, int[3] output_size) -> (Tensor) +- aten::adaptive_max_pool1d(Tensor self, int[2] output_size) -> (Tensor, Tensor) +- aten::adaptive_max_pool2d(Tensor self, int[2] output_size) -> (Tensor, Tensor) +- aten::adaptive_max_pool3d(Tensor self, int[3] output_size) -> (Tensor, Tensor) +- aten::add.Scalar(Tensor self, Scalar other, Scalar alpha=1) -> (Tensor) +- aten::add.Tensor(Tensor self, Tensor other, Scalar alpha=1) -> (Tensor) +- aten::add_.Tensor(Tensor(a!) self, Tensor other, *, Scalar alpha=1) -> (Tensor(a!)) +- aten::asin(Tensor self) -> (Tensor) +- aten::asinh(Tensor self) -> (Tensor) +- aten::atan(Tensor self) -> (Tensor) +- aten::atanh(Tensor self) -> (Tensor) +- aten::avg_pool1d(Tensor self, int[1] kernel_size, int[1] stride=[], int[1] padding=[0], bool ceil_mode=False, bool count_include_pad=True) -> (Tensor) +- aten::avg_pool2d(Tensor self, int[2] kernel_size, int[2] stride=[], int[2] padding=[0, 0], bool ceil_mode=False, bool count_include_pad=True, int? divisor_override=None) -> (Tensor) +- aten::avg_pool3d(Tensor self, int[3] kernel_size, int[3] stride=[], int[3] padding=[], bool ceil_mode=False, bool count_include_pad=True, int? divisor_override=None) -> (Tensor) +- aten::batch_norm(Tensor input, Tensor? gamma, Tensor? beta, Tensor? mean, Tensor? var, bool training, float momentum, float eps, bool cudnn_enabled) -> (Tensor) +- aten::bmm(Tensor self, Tensor mat2) -> (Tensor) +- aten::cat(Tensor[] tensors, int dim=0) -> (Tensor) +- aten::ceil(Tensor self) -> (Tensor) +- aten::clamp(Tensor self, Scalar? min=None, Scalar? max=None) -> (Tensor) +- aten::clamp_max(Tensor self, Scalar max) -> (Tensor) +- aten::clamp_min(Tensor self, Scalar min) -> (Tensor) +- aten::constant_pad_nd(Tensor self, int[] pad, Scalar value=0) -> (Tensor) +- aten::cos(Tensor self) -> (Tensor) +- aten::cosh(Tensor self) -> (Tensor) +- aten::cumsum(Tensor self, int dim, *, int? dtype=None) -> (Tensor) +- aten::div.Scalar(Tensor self, Scalar other) -> (Tensor) +- aten::div.Tensor(Tensor self, Tensor other) -> (Tensor) +- aten::div.Tensor_mode(Tensor self, Tensor other, *, str? rounding_mode) -> (Tensor) +- aten::div_.Scalar(Tensor(a!) self, Scalar other) -> (Tensor(a!)) +- aten::div_.Tensor(Tensor(a!) self, Tensor other) -> (Tensor(a!)) +- aten::elu(Tensor self, Scalar alpha=1, Scalar scale=1, Scalar input_scale=1) -> (Tensor) +- aten::embedding(Tensor weight, Tensor indices, int padding_idx=-1, bool scale_grad_by_freq=False, bool sparse=False) -> (Tensor) +- aten::eq.Scalar(Tensor self, Scalar other) -> (Tensor) +- aten::eq.Tensor(Tensor self, Tensor other) -> (Tensor) +- aten::erf(Tensor self) -> (Tensor) +- aten::exp(Tensor self) -> (Tensor) +- aten::expand(Tensor(a) self, int[] size, *, bool implicit=False) -> (Tensor(a)) +- aten::expand_as(Tensor(a) self, Tensor other) -> (Tensor(a)) +- aten::fake_quantize_per_channel_affine(Tensor self, Tensor scale, Tensor zero_point, int axis, int quant_min, int quant_max) -> (Tensor) +- aten::fake_quantize_per_tensor_affine(Tensor self, float scale, int zero_point, int quant_min, int quant_max) -> (Tensor) +- aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor) +- aten::floor(Tensor self) -> (Tensor) +- aten::floor_divide(Tensor self, Tensor other) -> (Tensor) +- aten::floor_divide.Scalar(Tensor self, Scalar other) -> (Tensor) +- aten::ge.Scalar(Tensor self, Scalar other) -> (Tensor) +- aten::ge.Tensor(Tensor self, Tensor other) -> (Tensor) +- aten::gru_cell(Tensor input, Tensor hx, Tensor w_ih, Tensor w_hh, Tensor? b_ih=None, Tensor? b_hh=None) -> (Tensor) +- aten::gt.Scalar(Tensor self, Scalar other) -> (Tensor) +- aten::gt.Tensor(Tensor self, Tensor other) -> (Tensor) +- aten::hardtanh(Tensor self, Scalar min_val=-1, Scalar max_val=1) -> (Tensor) +- aten::hardtanh_(Tensor(a!) self, Scalar min_val=-1, Scalar max_val=1) -> (Tensor(a!)) +- aten::index.Tensor(Tensor self, Tensor?[] indices) -> (Tensor) +- aten::instance_norm(Tensor input, Tensor? weight, Tensor? bias, Tensor? running_mean, Tensor? running_var, bool use_input_stats, float momentum, float eps, bool cudnn_enabled) -> (Tensor) +- aten::layer_norm(Tensor input, int[] normalized_shape, Tensor? gamma, Tensor? beta, float eps, bool cudnn_enabled) -> (Tensor) +- aten::le.Scalar(Tensor self, Scalar other) -> (Tensor) +- aten::le.Tensor(Tensor self, Tensor other) -> (Tensor) +- aten::leaky_relu(Tensor self, Scalar negative_slope=0.01) -> (Tensor) +- aten::leaky_relu_(Tensor(a!) self, Scalar negative_slope=0.01) -> (Tensor(a!)) +- aten::linear(Tensor input, Tensor weight, Tensor? bias=None) -> (Tensor) +- aten::log(Tensor self) -> (Tensor) +- aten::lstm_cell(Tensor input, Tensor[] hx, Tensor w_ih, Tensor w_hh, Tensor? b_ih=None, Tensor? b_hh=None) -> (Tensor, Tensor) +- aten::lt.Scalar(Tensor self, Scalar other) -> (Tensor) +- aten::lt.Tensor(Tensor self, Tensor other) -> (Tensor) +- aten::masked_fill.Scalar(Tensor self, Tensor mask, Scalar value) -> (Tensor) +- aten::matmul(Tensor self, Tensor other) -> (Tensor) +- aten::max(Tensor self) -> (Tensor) +- aten::max.dim(Tensor self, int dim, bool keepdim=False) -> (Tensor values, Tensor indices) +- aten::max.other(Tensor self, Tensor other) -> (Tensor) +- aten::max_pool1d(Tensor self, int[1] kernel_size, int[1] stride=[], int[1] padding=[], int[1] dilation=[], bool ceil_mode=False) -> (Tensor) +- aten::max_pool2d(Tensor self, int[2] kernel_size, int[2] stride=[], int[2] padding=[0, 0], int[2] dilation=[1, 1], bool ceil_mode=False) -> (Tensor) +- aten::max_pool3d(Tensor self, int[3] kernel_size, int[3] stride=[], int[3] padding=[], int[3] dilation=[], bool ceil_mode=False) -> (Tensor) +- aten::mean(Tensor self, *, int? dtype=None) -> (Tensor) +- aten::mean.dim(Tensor self, int[] dim, bool keepdim=False, *, int? dtype=None) -> (Tensor) +- aten::min(Tensor self) -> (Tensor) +- aten::min.other(Tensor self, Tensor other) -> (Tensor) +- aten::mul.Scalar(Tensor self, Scalar other) -> (Tensor) +- aten::mul.Tensor(Tensor self, Tensor other) -> (Tensor) +- aten::mul_.Tensor(Tensor(a!) self, Tensor other) -> (Tensor(a!)) +- aten::narrow(Tensor(a) self, int dim, int start, int length) -> (Tensor(a)) +- aten::narrow.Tensor(Tensor(a) self, int dim, Tensor start, int length) -> (Tensor(a)) +- aten::ne.Scalar(Tensor self, Scalar other) -> (Tensor) +- aten::ne.Tensor(Tensor self, Tensor other) -> (Tensor) +- aten::neg(Tensor self) -> (Tensor) +- aten::norm.ScalarOpt_dim(Tensor self, Scalar? p, int[1] dim, bool keepdim=False) -> (Tensor) +- aten::permute(Tensor(a) self, int[] dims) -> (Tensor(a)) +- aten::pixel_shuffle(Tensor self, int upscale_factor) -> (Tensor) +- aten::pow.Tensor_Scalar(Tensor self, Scalar exponent) -> (Tensor) +- aten::pow.Tensor_Tensor(Tensor self, Tensor exponent) -> (Tensor) +- aten::prelu(Tensor self, Tensor weight) -> (Tensor) +- aten::prod(Tensor self, *, int? dtype=None) -> (Tensor) +- aten::prod.dim_int(Tensor self, int dim, bool keepdim=False, *, int? dtype=None) -> (Tensor) +- aten::reciprocal(Tensor self) -> (Tensor) +- aten::reflection_pad1d(Tensor self, int[2] padding) -> (Tensor) +- aten::reflection_pad2d(Tensor self, int[4] padding) -> (Tensor) +- aten::relu(Tensor input) -> (Tensor) +- aten::relu_(Tensor(a!) self) -> (Tensor(a!)) +- aten::repeat(Tensor self, int[] repeats) -> (Tensor) +- aten::replication_pad1d(Tensor self, int[2] padding) -> (Tensor) +- aten::replication_pad2d(Tensor self, int[4] padding) -> (Tensor) +- aten::replication_pad3d(Tensor self, int[6] padding) -> (Tensor) +- aten::reshape(Tensor self, int[] shape) -> (Tensor) +- aten::roll(Tensor self, int[1] shifts, int[1] dims=[]) -> (Tensor) +- aten::rsub.Scalar(Tensor self, Scalar other, Scalar alpha=1) -> (Tensor) +- aten::rsub.Tensor(Tensor self, Tensor other, Scalar alpha=1) -> (Tensor) +- aten::select.int(Tensor(a) self, int dim, int index) -> (Tensor(a)) +- aten::sigmoid(Tensor input) -> (Tensor) +- aten::sigmoid_(Tensor(a!) self) -> (Tensor(a!)) +- aten::sin(Tensor self) -> (Tensor) +- aten::sinh(Tensor self) -> (Tensor) +- aten::slice.Tensor(Tensor(a) self, int dim=0, int? start=None, int? end=None, int step=1) -> (Tensor(a)) +- aten::softmax.int(Tensor self, int dim, int? dtype=None) -> (Tensor) +- aten::split(Tensor self, int[] split_sizes, int dim=0) -> (Tensor[]) +- aten::split.Tensor(Tensor(a) self, int split_size, int dim=0) -> (Tensor[]) +- aten::split_with_sizes(Tensor(a) self, int[] split_sizes, int dim=0) -> (Tensor[]) +- aten::sqrt(Tensor self) -> (Tensor) +- aten::squeeze.dim(Tensor(a) self, int dim) -> (Tensor(a)) +- aten::stack(Tensor[] tensors, int dim=0) -> (Tensor) +- aten::sub.Scalar(Tensor self, Scalar other, Scalar alpha=1) -> (Tensor) +- aten::sub.Tensor(Tensor self, Tensor other, Scalar alpha=1) -> (Tensor) +- aten::sub_.Tensor(Tensor(a!) self, Tensor other, *, Scalar alpha=1) -> (Tensor(a!)) +- aten::sum(Tensor self, *, int? dtype=None) -> (Tensor) +- aten::sum.dim_IntList(Tensor self, int[1] dim, bool keepdim=False, *, int? dtype=None) -> (Tensor) +- aten::t(Tensor self) -> (Tensor) +- aten::tan(Tensor self) -> (Tensor) +- aten::tanh(Tensor input) -> (Tensor) +- aten::tanh_(Tensor(a!) self) -> (Tensor(a!)) +- aten::to.device(Tensor(a) self, Device device, int dtype, bool non_blocking=False, bool copy=False, int? memory_format=None) -> (Tensor(a)) +- aten::to.dtype(Tensor self, int dtype, bool non_blocking=False, bool copy=False, int? memory_format=None) -> (Tensor) +- aten::to.other(Tensor self, Tensor other, bool non_blocking=False, bool copy=False, int? memory_format=None) -> (Tensor) +- aten::to.prim_Device(Tensor(a) self, Device? device, int? dtype=None, bool non_blocking=False, bool copy=False) -> (Tensor(a|b)) +- aten::topk(Tensor self, int k, int dim=-1, bool largest=True, bool sorted=True) -> (Tensor values, Tensor indices) +- aten::transpose.int(Tensor(a) self, int dim0, int dim1) -> (Tensor(a)) +- aten::unbind.int(Tensor(a -> *) self, int dim=0) -> (Tensor[]) +- aten::unsqueeze(Tensor(a) self, int dim) -> (Tensor(a)) +- aten::upsample_bilinear2d(Tensor self, int[2] output_size, bool align_corners, float? scales_h=None, float? scales_w=None) -> (Tensor) +- aten::upsample_bilinear2d.vec(Tensor input, int[]? output_size, bool align_corners, float[]? scale_factors) -> (Tensor) +- aten::upsample_linear1d(Tensor self, int[1] output_size, bool align_corners, float? scales=None) -> (Tensor) +- aten::upsample_linear1d.vec(Tensor input, int[]? output_size, bool align_corners, float[]? scale_factors) -> (Tensor) +- aten::upsample_nearest1d(Tensor self, int[1] output_size, float? scales=None) -> (Tensor) +- aten::upsample_nearest1d.vec(Tensor input, int[]? output_size, float[]? scale_factors) -> (Tensor) +- aten::upsample_nearest2d(Tensor self, int[2] output_size, float? scales_h=None, float? scales_w=None) -> (Tensor) +- aten::upsample_nearest2d.vec(Tensor input, int[]? output_size, float[]? scale_factors) -> (Tensor) +- aten::upsample_nearest3d(Tensor self, int[3] output_size, float? scales_d=None, float? scales_h=None, float? scales_w=None) -> (Tensor) +- aten::upsample_nearest3d.vec(Tensor input, int[]? output_size, float[]? scale_factors) -> (Tensor) +- aten::upsample_trilinear3d(Tensor self, int[3] output_size, bool align_corners, float? scales_d=None, float? scales_h=None, float? scales_w=None) -> (Tensor) +- aten::upsample_trilinear3d.vec(Tensor input, int[]? output_size, bool align_corners, float[]? scale_factors) -> (Tensor) +- aten::view(Tensor(a) self, int[] size) -> (Tensor(a)) +- trt::const(Tensor self) -> (Tensor) + +Operators Currently Supported Through Evaluators +------------------------------------------------- + +- aten::Bool.float(float b) -> (bool) +- aten::Bool.int(int a) -> (bool) +- aten::Float.Scalar(Scalar a) -> float +- aten::Float.bool(bool a) -> float +- aten::Float.int(int a) -> float +- aten::Int.Scalar(Scalar a) -> int +- aten::Int.bool(bool a) -> int +- aten::Int.float(float a) -> int +- aten::Int.int(int a) -> int +- aten::__and__(int a, int b) -> (bool) +- aten::__and__.bool(bool a, bool b) -> (bool) +- aten::__getitem__.t(t[](a) list, int idx) -> (t(*)) +- aten::__is__(t1 self, t2 obj) -> bool +- aten::__isnot__(t1 self, t2 obj) -> bool +- aten::__not__(bool self) -> bool +- aten::__or__(int a, int b) -> (bool) +- aten::__range_length(int lo, int hi, int step) -> int +- aten::__round_to_zero_floordiv(int a, int b) -> (int) +- aten::__xor__(int a, int b) -> (bool) +- aten::add.float(float a, float b) -> (float) +- aten::add.int(int a, int b) -> (int) +- aten::add.str(str a, str b) -> (str) +- aten::add_.t(t[](a!) self, t[] b) -> (t[]) +- aten::append.t(t[](a!) self, t(c -> *) el) -> (t[](a!)) +- aten::arange(Scalar end, *, int? dtype=None, int? layout=None, + Device? device=None, bool? pin_memory=None) -> (Tensor) +- aten::arange.start(Scalar start, Scalar end, *, ScalarType? dtype=None, + Layout? layout=None, Device? device=None, bool? pin_memory=None) -> (Tensor) +- aten::arange.start_step(Scalar start, Scalar end, Scalar step, *, ScalarType? dtype=None, + Layout? layout=None, Device? device=None, bool? pin_memory=None) -> (Tensor) +- aten::clone(Tensor self, *, int? memory_format=None) -> (Tensor) +- aten::copy_(Tensor(a!) self, Tensor src, bool non_blocking=False) -> (Tensor(a!)) +- aten::dim(Tensor self) -> int +- aten::div.float(float a, float b) -> (float) +- aten::div.int(int a, int b) -> (float) +- aten::eq.bool(bool a, bool b) -> (bool) +- aten::eq.float(float a, float b) -> (bool) +- aten::eq.float_int(float a, int b) -> (bool) +- aten::eq.int(int a, int b) -> (bool) +- aten::eq.int_float(int a, float b) -> (bool) +- aten::eq.str(str a, str b) -> (bool) +- aten::extend.t(t[](a!) self, t[] other) -> () +- aten::floor.float(float a) -> (int) +- aten::floor.int(int a) -> (int) +- aten::floordiv.float(float a, float b) -> (int) +- aten::floordiv.int(int a, int b) -> (int) +- aten::format(str self, ...) -> (str) +- aten::ge.bool(bool a, bool b) -> (bool) +- aten::ge.float(float a, float b) -> (bool) +- aten::ge.float_int(float a, int b) -> (bool) +- aten::ge.int(int a, int b) -> (bool) +- aten::ge.int_float(int a, float b) -> (bool) +- aten::gt.bool(bool a, bool b) -> (bool) +- aten::gt.float(float a, float b) -> (bool) +- aten::gt.float_int(float a, int b) -> (bool) +- aten::gt.int(int a, int b) -> (bool) +- aten::gt.int_float(int a, float b) -> (bool) +- aten::is_floating_point(Tensor self) -> (bool) +- aten::le.bool(bool a, bool b) -> (bool) +- aten::le.float(float a, float b) -> (bool) +- aten::le.float_int(float a, int b) -> (bool) +- aten::le.int(int a, int b) -> (bool) +- aten::le.int_float(int a, float b) -> (bool) +- aten::len.t(t[] a) -> (int) +- aten::lt.bool(bool a, bool b) -> (bool) +- aten::lt.float(float a, float b) -> (bool) +- aten::lt.float_int(float a, int b) -> (bool) +- aten::lt.int(int a, int b) -> (bool) +- aten::lt.int_float(int a, float b) -> (bool) +- aten::mul.float(float a, float b) -> (float) +- aten::mul.int(int a, int b) -> (int) +- aten::ne.bool(bool a, bool b) -> (bool) +- aten::ne.float(float a, float b) -> (bool) +- aten::ne.float_int(float a, int b) -> (bool) +- aten::ne.int(int a, int b) -> (bool) +- aten::ne.int_float(int a, float b) -> (bool) +- aten::neg.int(int a) -> (int) +- aten::numel(Tensor self) -> int +- aten::pow.float(float a, float b) -> (float) +- aten::pow.float_int(float a, int b) -> (float) +- aten::pow.int(int a, int b) -> (float) +- aten::pow.int_float(int a, float b) -> (float) +- aten::size(Tensor self) -> (int[]) +- aten::size.int(Tensor self, int dim) -> (int) +- aten::slice.t(t[] l, int start, int end=9223372036854775807, int step=1) -> (t[]) +- aten::sqrt.float(float a) -> (float) +- aten::sqrt.int(int a) -> (float) +- aten::sub.float(float a, float b) -> (float) +- aten::sub.int(int a, int b) -> (int) +- aten::tensor(t[] data, *, int? dtype=None, Device? device=None, bool requires_grad=False) -> (Tensor) +- prim::dtype(Tensor a) -> (int) +- prim::max.bool(bool a, bool b) -> (bool) +- prim::max.float(float a, float b) -> (bool) +- prim::max.float_int(float a, int b) -> (bool) +- prim::max.int(int a, int b) -> (bool) +- prim::max.int_float(int a, float b) -> (bool) +- prim::max.self_int(int[] self) -> (int) +- prim::min.bool(bool a, bool b) -> (bool) +- prim::min.float(float a, float b) -> (bool) +- prim::min.float_int(float a, int b) -> (bool) +- prim::min.int(int a, int b) -> (bool) +- prim::min.int_float(int a, float b) -> (bool) +- prim::min.self_int(int[] self) -> (int) +- prim::shape(Tensor a) -> (int[]) diff --git a/docs/v1.1.1/_sources/py_api/fx.rst.txt b/docs/v1.1.1/_sources/py_api/fx.rst.txt new file mode 100644 index 0000000000..8ce591f5ee --- /dev/null +++ b/docs/v1.1.1/_sources/py_api/fx.rst.txt @@ -0,0 +1,31 @@ +.. _torch_tensorrt_fx_py: + +torch_tensorrt.fx +=================== + +.. currentmodule:: torch_tensorrt.fx + +.. automodule torch_tensorrt.ts + :undoc-members: + +.. automodule:: torch_tensorrt.fx + :members: + :undoc-members: + :show-inheritance: + +Functions +------------ + +.. autofunction:: compile + + +Classes +-------- + +.. autoclass:: TRTModule + +.. autoclass:: InputTensorSpec + +.. autoclass:: TRTInterpreter + +.. autoclass:: TRTInterpreterResult \ No newline at end of file diff --git a/docs/v1.1.1/_sources/py_api/logging.rst.txt b/docs/v1.1.1/_sources/py_api/logging.rst.txt new file mode 100644 index 0000000000..7918fe7f86 --- /dev/null +++ b/docs/v1.1.1/_sources/py_api/logging.rst.txt @@ -0,0 +1,13 @@ +.. _torch_tensorrt_logging_py: + +torch_tensorrt.logging +---------------------- + +.. currentmodule:: torch_tensorrt.logging + +.. automodule:: torch_tensorrt.logging + :members: + :undoc-members: + :show-inheritance: + +.. autoclass:: py torch_tensorrt.logging.Level diff --git a/docs/v1.1.1/_sources/py_api/ptq.rst.txt b/docs/v1.1.1/_sources/py_api/ptq.rst.txt new file mode 100644 index 0000000000..7686209cd9 --- /dev/null +++ b/docs/v1.1.1/_sources/py_api/ptq.rst.txt @@ -0,0 +1,27 @@ +.. _torch_tensorrt_ptq_py: + +torch_tensorrt.ptq +=================== + +.. currentmodule:: torch_tensorrt.ptq + +.. automodule:: torch_tensorrt.ptq + :members: + :undoc-members: + :show-inheritance: + +Classes +--------- + +.. autoclass:: DataLoaderCalibrator + :members: + :special-members: __init__ + +.. autoclass:: CacheCalibrator + :members: + :special-members: __init__ + +Enums +------- + +.. autoclass:: CalibrationAlgo \ No newline at end of file diff --git a/docs/v1.1.1/_sources/py_api/torch_tensorrt.rst.txt b/docs/v1.1.1/_sources/py_api/torch_tensorrt.rst.txt new file mode 100644 index 0000000000..199621a663 --- /dev/null +++ b/docs/v1.1.1/_sources/py_api/torch_tensorrt.rst.txt @@ -0,0 +1,60 @@ +.. _torch_tensorrt_py: + +torch_tensorrt +=============== + +.. automodule torch_tensorrt + :undoc-members: + + + +.. automodule:: torch_tensorrt + :members: + :undoc-members: + :show-inheritance: + +Functions +------------ + +.. autofunction:: set_device + +.. autofunction:: compile + +.. autofunction:: convert_method_to_trt_engine + +.. autofunction:: get_build_info + +.. autofunction:: dump_build_info + +Classes +--------- + +.. autoclass:: Input + :members: + :special-members: __init__ + +.. autoclass:: Device + :members: + :special-members: __init__ + +Enums +------- + +.. autoclass:: dtype + +.. autoclass:: DeviceType + +.. autoclass:: EngineCapability + +.. autoclass:: TensorFormat + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + logging + ptq + ts + diff --git a/docs/v1.1.1/_sources/py_api/ts.rst.txt b/docs/v1.1.1/_sources/py_api/ts.rst.txt new file mode 100644 index 0000000000..45f6418eb7 --- /dev/null +++ b/docs/v1.1.1/_sources/py_api/ts.rst.txt @@ -0,0 +1,27 @@ +.. _torch_tensorrt_ts_py: + +torch_tensorrt.ts +=================== + +.. currentmodule:: torch_tensorrt.ts + +.. automodule torch_tensorrt.ts + :undoc-members: + +.. automodule:: torch_tensorrt.ts + :members: + :undoc-members: + :show-inheritance: + +Functions +------------ + +.. autofunction:: compile + +.. autofunction:: convert_method_to_trt_engine + +.. autofunction:: check_method_op_support + +.. autofunction:: embed_engine_in_new_module + +.. autofunction:: TensorRTCompileSpec diff --git a/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/changelog.rst.txt b/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/changelog.rst.txt new file mode 100644 index 0000000000..d1ad81a0df --- /dev/null +++ b/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/changelog.rst.txt @@ -0,0 +1,6 @@ + +********* +Changelog +********* + +v0.0.1 diff --git a/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/configuring.rst.txt b/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/configuring.rst.txt new file mode 100644 index 0000000000..3afcb7bc62 --- /dev/null +++ b/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/configuring.rst.txt @@ -0,0 +1,108 @@ + +************* +Configuration +************* + +You can configure different parts of the theme. + +Project-wide Configuration +========================== + +HTML Theme Options +------------------ + +The theme's project-wide options are defined in the ``pytorch_sphinx_theme/theme.conf`` +file of this repository, and can be defined in your project's ``conf.py`` via +``html_theme_options``. For example: + +.. code:: python + + html_theme_options = { + 'canonical_url': '', + 'analytics_id': '', + 'logo_only': False, + 'display_version': True, + 'prev_next_buttons_location': 'bottom', + 'style_external_links': False, + 'vcs_pageview_mode': '', + # Toc options + 'collapse_navigation': True, + 'sticky_navigation': True, + 'navigation_depth': 4, + 'includehidden': True, + 'titles_only': False + } + +The following options are available: + +Base options +~~~~~~~~~~~~ + +* ``canonical_url`` String. This will specify a `canonical url `__ + to let search engines know they should give higher ranking to latest version of the docs. + The url points to the root of the documentation and requires a trailing slash. +* ``analytics_id`` String. Change the Google Analytics ID that is included on pages. +* ``display_version`` Bool. With this disabled, the version number isn't shown at the top of the sidebar. +* ``prev_next_buttons_location`` String. can take the value ``bottom``, ``top``, ``both`` , or ``None`` + and will display the "Next" and "Previous" buttons accordingly. +* ``style_external_links`` Bool. Add an icon next to external links. Defaults to ``False``. +* ``vcs_pageview_mode`` String. Changes how to view files when using `display_github`, `display_gitlab`, etc. + When using Github or Gitlab this can be: `blob` (default), `edit`, or `raw`, + on Bitbucket, this can be either: `view` (default) or `edit`. + +TOC Options +~~~~~~~~~~~ + +These effect how we display the Table of Contents in the side bar. You can read more about them here: http://www.sphinx-doc.org/en/stable/templating.html#toctree + +* ``collapse_navigation`` Bool. With this enabled, you will lose the ``[+]`` drop downs next to each section in the sidebar. +* ``sticky_navigation`` Bool. This causes the sidebar to scroll with the main page content as you scroll the page. +* ``navigation_depth`` Int. Indicate the max depth of the tree; by default, 4 levels are included; + set it to -1 to allow unlimited depth. +* ``includehidden`` Bool. Specifies if the sidebar includes toctrees marked with the ``:hidden:`` option +* ``titles_only`` Bool. If True, removes headers within a page from the sidebar. + +.. note:: + + Setting ``collapse_navigation`` to False and using a high ``navigation_depth`` + can cause projects with many files and a deep file structure to generate HTML files + that are significantly larger in file size and much longer compilation times. + + +HTML Context Options +-------------------- + +TODO. + + +Page-level Configuration +======================== + +Pages support metadata that changes how the theme renders. +You can currently add the following: + +* ``:github_url:`` This will force the "Edit on GitHub" to the configured URL +* ``:bitbucket_url:`` This will force the "Edit on Bitbucket" to the configured URL +* ``:gitlab_url:`` This will force the "Edit on GitLab" to the configured URL + + +How the Table of Contents builds +================================ + +Currently the left menu will build based upon any ``toctree(s)`` defined in your ``index.rst`` file. +It outputs 2 levels of depth, which should give your visitors a high level of access to your +docs. If no toctrees are set the theme reverts to sphinx's usual local toctree. + +It's important to note that if you don't follow the same styling for your rST headers across +your documents, the toctree will misbuild, and the resulting menu might not show the correct +depth when it renders. + +Also note that by default the table of contents is set with ``includehidden=True``. This allows you +to set a hidden toc in your index file with the `:hidden: `_ property that will allow you +to build a toc without it rendering in your index. + +By default, the navigation will "stick" to the screen as you scroll. However if your toc +is vertically too large, it will revert to static positioning. To disable the sticky nav +altogether change the setting in ``conf.py``. + +.. _hidden: http://sphinx-doc.org/markup/toctree.html diff --git a/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/demo/api.rst.txt b/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/demo/api.rst.txt new file mode 100644 index 0000000000..b49bc248ac --- /dev/null +++ b/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/demo/api.rst.txt @@ -0,0 +1,53 @@ + +********************* +:mod:`test_py_module` +********************* + +.. contents:: Table of Contents + +.. automodule:: test_py_module.test + :members: + :private-members: + :special-members: + +Generated Index +=============== + +Part of the sphinx build process in generate and index file: :ref:`genindex`. + + +Optional parameter args +======================= + +At this point optional parameters `cannot be generated from code`_. +However, some projects will manually do it, like so: + +This example comes from `django-payments module docs`_. + +.. class:: payments.dotpay.DotpayProvider(seller_id, pin[, channel=0[, lock=False], lang='pl']) + + This backend implements payments using a popular Polish gateway, `Dotpay.pl `_. + + Due to API limitations there is no support for transferring purchased items. + + + :param seller_id: Seller ID assigned by Dotpay + :param pin: PIN assigned by Dotpay + :param channel: Default payment channel (consult reference guide) + :param lang: UI language + :param lock: Whether to disable channels other than the default selected above + +.. _cannot be generated from code: https://groups.google.com/forum/#!topic/sphinx-users/_qfsVT5Vxpw +.. _django-payments module docs: http://django-payments.readthedocs.org/en/latest/modules.html#payments.authorizenet.AuthorizeNetProvide + + +Data +==== + +.. data:: Data_item_1 + Data_item_2 + Data_item_3 + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce congue elit eu hendrerit mattis. + +Some data link :data:`Data_item_1`. diff --git a/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/demo/demo.rst.txt b/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/demo/demo.rst.txt new file mode 100644 index 0000000000..66f19cc899 --- /dev/null +++ b/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/demo/demo.rst.txt @@ -0,0 +1,475 @@ +.. This is a comment. Note how any initial comments are moved by + transforms to after the document title, subtitle, and docinfo. + +.. demo.rst from: http://docutils.sourceforge.net/docs/user/rst/demo.txt + +.. |EXAMPLE| image:: static/yi_jing_01_chien.jpg + :width: 1em + +********************** +Paragraph Level Markup +********************** + +.. contents:: Table of Contents + +Inline Markup +============= + +Paragraphs contain text and may contain inline markup: *emphasis*, **strong emphasis**, ``inline literals``, +standalone hyperlinks (http://www.python.org), external hyperlinks (Python_), internal cross-references (example_), +external hyperlinks with embedded URIs (`Python web site `__), footnote references +(manually numbered [1]_, anonymous auto-numbered [#]_, labeled auto-numbered [#label]_, or symbolic [*]_), +citation references ([12]_), substitution references (|example|), and _`inline hyperlink targets` +(see Targets_ below for a reference back to here). Character-level inline markup is also possible +(although exceedingly ugly!) in *re*\ ``Structured``\ *Text*. Problems are indicated by |problematic| +text (generated by processing errors; this one is intentional). + +Also with ``sphinx.ext.autodoc``, which I use in the demo, I can link to :class:`test_py_module.test.Foo`. +It will link you right my code documentation for it. + +The default role for interpreted text is `Title Reference`. Here are some explicit interpreted text roles: +a PEP reference (:PEP:`287`); an RFC reference (:RFC:`2822`); a :sub:`subscript`; a :sup:`superscript`; +and explicit roles for :emphasis:`standard` :strong:`inline` :literal:`markup`. + +GUI labels are a useful way to indicate that :guilabel:`Some action` is to be taken by the user. +The GUI label should not run over ``line-height`` so as not to :guilabel:`interfere` with text from adjacent lines. + +Key-bindings indicate that the read is to press a button on the keyboard or mouse, +for example :kbd:`MMB` and :kbd:`Shift-MMB`. Another useful markup to indicate a user action +is to use ``menuselection`` this can be used to show short and long menus in software. +For example, and ``menuselection`` can be seen here that breaks is too long to fit on this line. +:menuselection:`My --> Software --> Some menu --> Some sub menu 1 --> sub menu 2`. + +.. DO NOT RE-WRAP THE FOLLOWING PARAGRAPH! + +Let's test wrapping and whitespace significance in inline literals: +``This is an example of --inline-literal --text, --including some-- +strangely--hyphenated-words. Adjust-the-width-of-your-browser-window +to see how the text is wrapped. -- ---- -------- Now note the +spacing between the words of this sentence (words +should be grouped in pairs).`` + +If the ``--pep-references`` option was supplied, there should be a live link to PEP 258 here. + +Math +==== + +This is a test. Here is an equation: +:math:`X_{0:5} = (X_0, X_1, X_2, X_3, X_4)`. +Here is another: + +.. math:: + :label: This is a label + + \nabla^2 f = + \frac{1}{r^2} \frac{\partial}{\partial r} + \left( r^2 \frac{\partial f}{\partial r} \right) + + \frac{1}{r^2 \sin \theta} \frac{\partial f}{\partial \theta} + \left( \sin \theta \, \frac{\partial f}{\partial \theta} \right) + + \frac{1}{r^2 \sin^2\theta} \frac{\partial^2 f}{\partial \phi^2} + +You can add a link to equations like the one above :eq:`This is a label` by using ``:eq:``. + +Meta +==== + +.. meta:: + :keywords: reStructuredText, demonstration, demo, parser + :description lang=en: A demonstration of the reStructuredText + markup language, containing examples of all basic + constructs and many advanced constructs. + +Blocks +====== + +Literal Blocks +-------------- + +Literal blocks are indicated with a double-colon ("::") at the end of +the preceding paragraph (over there ``-->``). They can be indented:: + + if literal_block: + text = 'is left as-is' + spaces_and_linebreaks = 'are preserved' + markup_processing = None + +Or they can be quoted without indentation:: + +>> Great idea! +> +> Why didn't I think of that? + +Line Blocks +----------- + +| This is a line block. It ends with a blank line. +| Each new line begins with a vertical bar ("|"). +| Line breaks and initial indents are preserved. +| Continuation lines are wrapped portions of long lines; + they begin with a space in place of the vertical bar. +| The left edge of a continuation line need not be aligned with + the left edge of the text above it. + +| This is a second line block. +| +| Blank lines are permitted internally, but they must begin with a "|". + +Take it away, Eric the Orchestra Leader! + + | A one, two, a one two three four + | + | Half a bee, philosophically, + | must, *ipso facto*, half not be. + | But half the bee has got to be, + | *vis a vis* its entity. D'you see? + | + | But can a bee be said to be + | or not to be an entire bee, + | when half the bee is not a bee, + | due to some ancient injury? + | + | Singing... + +Block Quotes +------------ + +Block quotes consist of indented body elements: + + My theory by A. Elk. Brackets Miss, brackets. This theory goes + as follows and begins now. All brontosauruses are thin at one + end, much much thicker in the middle and then thin again at the + far end. That is my theory, it is mine, and belongs to me and I + own it, and what it is too. + + -- Anne Elk (Miss) + +Doctest Blocks +-------------- + +>>> print 'Python-specific usage examples; begun with ">>>"' +Python-specific usage examples; begun with ">>>" +>>> print '(cut and pasted from interactive Python sessions)' +(cut and pasted from interactive Python sessions) + +Code Blocks +----------- + +.. parsed-literal:: + + # parsed-literal test + curl -O http://someurl/release-|version|.tar-gz + + +.. code-block:: json + :caption: Code Blocks can have captions. + + { + "windows": [ + { + "panes": [ + { + "shell_command": [ + "echo 'did you know'", + "echo 'you can inline'" + ] + }, + { + "shell_command": "echo 'single commands'" + }, + "echo 'for panes'" + ], + "window_name": "long form" + } + ], + "session_name": "shorthands" + } + +Emphasized lines with line numbers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: python + :linenos: + :emphasize-lines: 3,5 + + def some_function(): + interesting = False + print 'This line is highlighted.' + print 'This one is not...' + print '...but this one is.' + +Sidebar +======= + +.. sidebar:: Ch'ien / The Creative + + .. image:: static/yi_jing_01_chien.jpg + + *Above* CH'IEN THE CREATIVE, HEAVEN + + *Below* CH'IEN THE CREATIVE, HEAVEN + +The first hexagram is made up of six unbroken lines. These unbroken lines stand for the primal power, +which is light-giving, active, strong, and of the spirit. The hexagram is consistently strong in character, +and since it is without weakness, its essence is power or energy. Its image is heaven. +Its energy is represented as unrestricted by any fixed conditions in space and is therefore conceived of as motion. +Time is regarded as the basis of this motion. +Thus the hexagram includes also the power of time and the power of persisting in time, that is, duration. + +The power represented by the hexagram is to be interpreted in a dual sense in terms of its action +on the universe and of its action on the world of men. In relation to the universe, the hexagram expresses the strong, +creative action of the Deity. In relation to the human world, it denotes the creative action of the holy man or sage, +of the ruler or leader of men, who through his power awakens and develops their higher nature. + +Code with Sidebar +----------------- + +.. sidebar:: A code example + + With a sidebar on the right. + +.. literalinclude:: test_py_module/test.py + :language: python + :caption: Literal includes can also have captions. + :linenos: + :lines: 1-40 + +References +========== + +Footnotes +--------- + +.. [1] A footnote contains body elements, consistently indented by at + least 3 spaces. + + This is the footnote's second paragraph. + +.. [#label] Footnotes may be numbered, either manually (as in [1]_) or + automatically using a "#"-prefixed label. This footnote has a + label so it can be referred to from multiple places, both as a + footnote reference ([#label]_) and as a hyperlink reference + (label_). + +.. [#] This footnote is numbered automatically and anonymously using a + label of "#" only. + +.. [*] Footnotes may also use symbols, specified with a "*" label. + Here's a reference to the next footnote: [*]_. + +.. [*] This footnote shows the next symbol in the sequence. + +.. [4] Here's an unreferenced footnote, with a reference to a + nonexistent footnote: [5]_. + +Citations +--------- + +.. [11] This is the citation I made, let's make this extremely long so that we can tell that it doesn't follow the normal responsive table stuff. + +.. [12] This citation has some ``code blocks`` in it, maybe some **bold** and + *italics* too. Heck, lets put a link to a meta citation [13]_ too. + +.. [13] This citation will have two backlinks. + + +Here's a reference to the above, [12]_, and a [nonexistent]_ citation. + +Here is another type of citation: `citation` + +Glossary +-------- + +This is a glossary with definition terms for thing like :term:`Writing`: + +.. glossary:: + + Documentation + Provides users with the knowledge they need to use something. + + Reading + The process of taking information into ones mind through the use of eyes. + + Writing + The process of putting thoughts into a medium for other people to :term:`read `. + +Targets +------- + +.. _example: + +This paragraph is pointed to by the explicit "example" target. +A reference can be found under `Inline Markup`_, above. `Inline +hyperlink targets`_ are also possible. + +Section headers are implicit targets, referred to by name. See +Targets_, which is a subsection of `Body Elements`_. + +Explicit external targets are interpolated into references such as "Python_". + +.. _Python: http://www.python.org/ + +Targets may be indirect and anonymous. Thus `this phrase`__ may also +refer to the Targets_ section. + +__ Targets_ + +Here's a `hyperlink reference without a target`_, which generates an error. + + +Directives +========== + +Contents +-------- + +.. contents:: :local: + +These are just a sample of the many reStructuredText Directives. For others, please see: +http://docutils.sourceforge.net/docs/ref/rst/directives.html. + + +Centered text +------------- + +You can create a statement with centered text with ``.. centered::`` + +.. centered:: This is centered text! + +Images & Figures +---------------- + +Images +^^^^^^ + +An image directive (also clickable -- a hyperlink reference): + +.. image:: static/yi_jing_01_chien.jpg + :target: directives_ + +Figures +^^^^^^^ + +.. figure:: static/yi_jing_01_chien.jpg + :alt: reStructuredText, the markup syntax + + A figure is an image with a caption and/or a legend: + + +------------+-----------------------------------------------+ + | re | Revised, revisited, based on 're' module. | + +------------+-----------------------------------------------+ + | Structured | Structure-enhanced text, structuredtext. | + +------------+-----------------------------------------------+ + | Text | Well it is, isn't it? | + +------------+-----------------------------------------------+ + + This paragraph is also part of the legend. + +A figure directive with center alignment + +.. figure:: static/yi_jing_01_chien.jpg + :align: center + + This caption should be centered. + +Admonitions +----------- + +.. Attention:: Directives at large. + +.. Caution:: Don't take any wooden nickels. + +.. DANGER:: Mad scientist at work! + +.. Error:: Does not compute. + +.. Hint:: It's bigger than a bread box. + +.. Important:: + - Wash behind your ears. + - Clean up your room. + + - Including the closet. + - The bathroom too. + + - Take the trash out of the bathroom. + - Clean the sink. + - Call your mother. + - Back up your data. + +.. Note:: This is a note. + Equations within a note: + :math:`G_{\mu\nu} = 8 \pi G (T_{\mu\nu} + \rho_\Lambda g_{\mu\nu})`. + +.. Tip:: 15% if the service is good. + + +---------+ + | Example | + +=========+ + | Thing1 | + +---------+ + | Thing2 | + +---------+ + | Thing3 | + +---------+ + +.. WARNING:: Strong prose may provoke extreme mental exertion. + Reader discretion is strongly advised. + +.. admonition:: And, by the way... + + You can make up your own admonition too. + +Topics, Sidebars, and Rubrics +----------------------------- + +.. sidebar:: Sidebar Title + :subtitle: Optional Subtitle + + This is a sidebar. It is for text outside the flow of the main + text. + + .. rubric:: This is a rubric inside a sidebar + + Sidebars often appears beside the main text with a border and + background color. + +.. topic:: Topic Title + + This is a topic. + +.. rubric:: This is a rubric + +Target Footnotes +---------------- + +.. target-notes:: + +Replacement Text +---------------- + +I recommend you try |Python|_. + +.. |Python| replace:: Python, *the* best language around + +Compound Paragraph +------------------ + +.. compound:: + + This paragraph contains a literal block:: + + Connecting... OK + Transmitting data... OK + Disconnecting... OK + + and thus consists of a simple paragraph, a literal block, and + another simple paragraph. Nonetheless it is semantically *one* + paragraph. + +This construct is called a *compound paragraph* and can be produced +with the "compound" directive. + +Download Links +============== + +:download:`This long long long long long long long long long long long long long long long download link should be blue, normal weight text with a leading icon, and should wrap white-spaces ` diff --git a/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/demo/lists_tables.rst.txt b/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/demo/lists_tables.rst.txt new file mode 100644 index 0000000000..a31d213924 --- /dev/null +++ b/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/demo/lists_tables.rst.txt @@ -0,0 +1,302 @@ + +************** +Lists & Tables +************** + +.. contents:: Table of Contents + +Lists +===== + +Enumerated Lists +---------------- + +1. Arabic numerals. + + a) lower alpha) + + (i) (lower roman) + + A. upper alpha. + + I) upper roman) + +2. Lists that don't start at 1: + + 3. Three + + 4. Four + + C. C + + D. D + + iii. iii + + iv. iv + +#. List items may also be auto-enumerated. + +Definition Lists +---------------- + +Term + Definition +Term : classifier + Definition paragraph 1. + + Definition paragraph 2. +Term + Definition + + +Option Lists +------------ + +For listing command-line options: + +-a command-line option "a" +-b file options can have arguments + and long descriptions +--long options can be long also +--input=file long options can also have + arguments + +--very-long-option + The description can also start on the next line. + + The description may contain multiple body elements, + regardless of where it starts. + +-x, -y, -z Multiple options are an "option group". +-v, --verbose Commonly-seen: short & long options. +-1 file, --one=file, --two file + Multiple options with arguments. +/V DOS/VMS-style options too + +There must be at least two spaces between the option and the description. + +Field list +---------- + +.. bibliographic fields (which also require a transform): + +:Author: David Goodger +:Address: 123 Example Street + Example, EX Canada + A1B 2C3 +:Contact: docutils-develop@lists.sourceforge.net +:Authors: Me; Myself; I +:organization: humankind +:date: $Date: 2012-01-03 19:23:53 +0000 (Tue, 03 Jan 2012) $ +:status: This is a "work in progress" +:revision: $Revision: 7302 $ +:version: 1 +:copyright: This document has been placed in the public domain. You + may do with it as you wish. You may copy, modify, + redistribute, reattribute, sell, buy, rent, lease, + destroy, or improve it, quote it at length, excerpt, + incorporate, collate, fold, staple, or mutilate it, or do + anything else to it that your or anyone else's heart + desires. +:field name: This is a generic bibliographic field. +:field name 2: + Generic bibliographic fields may contain multiple body elements. + + Like this. + +:Dedication: + + For Docutils users & co-developers. + +:abstract: + + This document is a demonstration of the reStructuredText markup + language, containing examples of all basic reStructuredText + constructs and many advanced constructs. + +Bullet Lists +------------ + +- A bullet list + + + Nested bullet list. + + Nested item 2. + +- Item 2. + + Paragraph 2 of item 2. + + * Nested bullet list. + * Nested item 2. + + - Third level. + - Item 2. + + * Nested item 3. + +- ``inline literall`` +- ``inline literall`` +- ``inline literall`` + +Second list level +^^^^^^^^^^^^^^^^^ + +- here is a list in a second-level section. +- `yahoo `_ +- `yahoo `_ + + - `yahoo `_ + - here is an inner bullet ``oh`` + + - one more ``with an inline literally``. `yahoo `_ + + heh heh. child. try to beat this embed: + + .. literalinclude:: test_py_module/test.py + :language: python + :linenos: + :lines: 1-10 + - and another. `yahoo `_ + - `yahoo `_ + - ``hi`` +- and hehe + +But deeper down the rabbit hole +""""""""""""""""""""""""""""""" + +- I kept saying that, "deeper down the rabbit hole". `yahoo `_ + + - I cackle at night `yahoo `_. +- I'm so lonely here in GZ ``guangzhou`` +- A man of python destiny, hopes and dreams. `yahoo `_ + + - `yahoo `_ + + - `yahoo `_ ``hi`` + - ``destiny`` + +Hlists +------ + +.. hlist:: + :columns: 2 + + - First item + - Second item + - Third item + - Forth item + - Fifth item + - Sixths item + +.. rubric:: Hlist with images + +.. hlist:: + :columns: 2 + + - .. figure:: static/yi_jing_01_chien.jpg + + This is a short caption for a figure. + + - .. figure:: static/yi_jing_01_chien.jpg + + This is a long caption for a figure. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Donec porttitor dolor in odio posuere, vitae ornare libero mattis. In lobortis justo vestibulum nibh aliquet, non. + +Numbered List +------------- + +#. One, +#. Two. +#. Three with long text. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Sed feugiat sagittis neque quis eleifend. Duis rutrum lectus sit amet mattis suscipit. + +- A) Using bullets and letters. (A) +- B) Using bullets and letters. (B) +- C) Using bullets and letters. (C) + +Tables +====== + +Grid Tables +----------- + +Here's a grid table followed by a simple table: + ++------------------------+------------+----------+----------+ +| Header row, column 1 | Header 2 | Header 3 | Header 4 | +| (header rows optional) | | | | ++========================+============+==========+==========+ +| body row 1, column 1 | column 2 | column 3 | column 4 | ++------------------------+------------+----------+----------+ +| body row 2 | Cells may span columns. | ++------------------------+------------+---------------------+ +| body row 3 | Cells may | - Table cells | ++------------------------+ span rows. | - contain | +| body row 4 | | - body elements. | ++------------------------+------------+----------+----------+ +| body row 5 | Cells may also be | | +| | empty: ``-->`` | | ++------------------------+-----------------------+----------+ + +===== ===== ====== + Inputs Output +------------ ------ + A B A or B +===== ===== ====== +False False False +True False True +False True True +True True True +===== ===== ====== + +Giant Tables +^^^^^^^^^^^^ + ++------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+ +| Header 1 | Header 2 | Header 3 | Header 1 | Header 2 | Header 3 | Header 1 | Header 2 | Header 3 | Header 1 | Header 2 | Header 3 | ++============+============+===========+============+============+===========+============+============+===========+============+============+===========+ +| body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | ++------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+ +| body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | ++------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+ +| body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | ++------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+ +| body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | ++------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+ + +List Tables +----------- + +.. list-table:: List tables can have captions like this one. + :widths: 10 5 10 50 + :header-rows: 1 + :stub-columns: 1 + + * - List table + - Header 1 + - Header 2 + - Header 3 long. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet mauris arcu. + * - Stub Row 1 + - Row 1 + - Column 2 + - Column 3 long. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet mauris arcu. + * - Stub Row 2 + - Row 2 + - Column 2 + - Column 3 long. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet mauris arcu. + * - Stub Row 3 + - Row 3 + - Column 2 + - Column 3 long. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet mauris arcu. + +.. list-table:: This is a list table with images in it. + + * - .. figure:: static/yi_jing_01_chien.jpg + + This is a short caption for a figure. + + - .. figure:: static/yi_jing_01_chien.jpg + + This is a long caption for a figure. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Donec porttitor dolor in odio posuere, vitae ornare libero mattis. In lobortis justo vestibulum nibh aliquet, non. diff --git a/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/demo/long.rst.txt b/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/demo/long.rst.txt new file mode 100644 index 0000000000..26b1add9d1 --- /dev/null +++ b/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/demo/long.rst.txt @@ -0,0 +1,214 @@ + +*************** +Long Sticky Nav +*************** + +.. contents:: Table of Contents + +This section demonstrates how the 'sticky_navigation' setting behaves when the menu is very long. +When this section is selected, it will make the menu and the main area scroll when you are at the top of the page. + + +Example Menu 1 +============== + +Just a place holder... + + +Example Menu 2 +============== + +Just a place holder... + + +Example Menu 3 +============== + +Just a place holder... + + +Example Menu 4 +============== + +Just a place holder... + + +Example Menu 5 +============== + +Just a place holder... + + +Example Menu 6 +============== + +Just a place holder... + + +Example Menu 7 +============== + +Just a place holder... + + +Example Menu 8 +============== + +Just a place holder... + + +Example Menu 9 +============== + +Just a place holder... + + +Example Menu 10 +=============== + +Just a place holder... + + +Example Menu 11 +=============== + +Just a place holder... + + +Example Menu 12 +=============== + +Just a place holder... + + +Example Menu 13 +=============== + +Just a place holder... + + +Example Menu 14 +=============== + +Just a place holder... + + +Example Menu 15 +=============== + +Just a place holder... + + +Example Menu 16 +=============== + +Just a place holder... + + +Example Menu 17 +=============== + +Just a place holder... + + +Example Menu 18 +=============== + +Just a place holder... + + +Example Menu 19 +=============== + +Just a place holder... + + +Example Menu 20 +=============== + +Just a place holder... + +Example Submenu 1 +================= + +Just a place holder... + +Submenu 1 +--------- + +Just a place holder... + +Subsubmenu 1 +^^^^^^^^^^^^ + +Just a place holder... + +Subsubmenu 2 +^^^^^^^^^^^^ + +Just a place holder... + +Submenu 2 +--------- + +Just a place holder... + +Subsubmenu 1 +^^^^^^^^^^^^ + +Just a place holder... + +Submenu 3 +--------- + +Just a place holder... + +Submenu 4 +--------- + +Just a place holder... + +Submenu 5 +--------- + +Just a place holder... + +Example Submenu 2 +================= + +Just a place holder... + +Submenu 1 +--------- + +Just a place holder... + +Subsubmenu 1 +^^^^^^^^^^^^ + +Just a place holder... + +Submenu 2 +--------- + +Just a place holder... + +Subsubmenu 1 +^^^^^^^^^^^^ + +Just a place holder... + +Submenu 3 +--------- + +Just a place holder... + +Submenu 4 +--------- + +Just a place holder... + +Submenu 5 +--------- + +Just a place holder... diff --git a/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/demo/structure.rst.txt b/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/demo/structure.rst.txt new file mode 100644 index 0000000000..d21fc96321 --- /dev/null +++ b/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/demo/structure.rst.txt @@ -0,0 +1,101 @@ + +******************* +Structural Elements +******************* + +.. contents:: Table of Contents + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec lorem neque, interdum in ipsum nec, +finibus dictum velit. Ut eu efficitur arcu, id aliquam erat. In sit amet diam gravida, imperdiet tellus eu, +gravida nisl. Praesent aliquet odio eget libero elementum, quis rhoncus tellus tincidunt. +Suspendisse quis volutpat ipsum. Sed lobortis scelerisque tristique. Aenean condimentum risus tellus, +quis accumsan ipsum laoreet ut. Integer porttitor maximus suscipit. Mauris in posuere sapien. +Aliquam accumsan feugiat ligula, nec fringilla libero commodo sed. Proin et erat pharetra. + +--------- + +Etiam turpis ante, luctus sed velit tristique, finibus volutpat dui. Nam sagittis vel ante nec malesuada. +Praesent dignissim mi nec ornare elementum. Nunc eu augue vel sem dignissim cursus sed et nulla. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Pellentesque dictum dui sem, non placerat tortor rhoncus in. Sed placerat nulla at rhoncus iaculis. + +Document Section +================ + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum nulla vel neque venenatis, +nec placerat lorem placerat. Cras purus eros, gravida vitae tincidunt id, vehicula nec nulla. +Fusce aliquet auctor cursus. Phasellus ex neque, vestibulum non est vitae, viverra fringilla tortor. +Donec vestibulum convallis justo, a faucibus lorem vulputate vel. Aliquam cursus odio eu felis sodales aliquet. +Aliquam erat volutpat. Maecenas eget dictum mauris. Suspendisse arcu eros, condimentum eget risus sed, +luctus efficitur arcu. Cras ut dictum mi. Nulla congue interdum lorem, semper semper enim commodo nec. + +Document Subsection +------------------- + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam efficitur in eros et blandit. Nunc maximus, +nisl at auctor vestibulum, justo ex sollicitudin ligula, id faucibus urna orci tristique nisl. +Duis auctor rutrum orci, in ornare lacus condimentum quis. Quisque arcu velit, facilisis quis interdum ac, +hendrerit auctor mauris. Curabitur urna nibh, porttitor at ante sit amet, vestibulum interdum dolor. +Duis dictum elit orci, tincidunt imperdiet sem pellentesque et. In vehicula pellentesque varius. +Phasellus a turpis sollicitudin, bibendum massa et, imperdiet neque. Integer quis sapien in magna rutrum bibendum. +Integer cursus ex sed magna vehicula finibus. Proin tempus orci quis dolor tempus, nec condimentum odio vestibulum. +Etiam efficitur sollicitudin libero, tincidunt volutpat ligula interdum sed. + +Document Subsubsection +^^^^^^^^^^^^^^^^^^^^^^ + +Donec non rutrum lorem. Aenean sagittis metus at pharetra fringilla. Nunc sapien dolor, cursus sed nisi at, +pretium tristique lectus. Sed pellentesque leo lectus, et convallis ipsum euismod a. +Integer at leo vitae felis pretium aliquam fringilla quis odio. Sed pharetra enim accumsan feugiat pretium. +Maecenas at pharetra tortor. Morbi semper eget mi vel finibus. Cras rutrum nulla eros, id feugiat arcu pellentesque ut. +Sed finibus tortor ac nisi ultrices viverra. Duis feugiat malesuada sapien, at commodo ante porttitor ac. +Curabitur posuere mauris mi, vel ornare orci scelerisque sit amet. Suspendisse nec fringilla dui. + +Document Paragraph +"""""""""""""""""" + +Pellentesque nec est in odio ultrices elementum. Vestibulum et hendrerit sapien, quis vulputate turpis. +Suspendisse potenti. Curabitur tristique sit amet lectus non viverra. Phasellus rutrum dapibus turpis sed imperdiet. +Mauris maximus viverra ante. Donec eu egestas mauris. Morbi vulputate tincidunt euismod. Integer vel porttitor neque. +Donec at lacus suscipit, lacinia lectus vel, sagittis lectus. + +********************* +Structural Elements 2 +********************* + +Etiam turpis ante, luctus sed velit tristique, finibus volutpat dui. Nam sagittis vel ante nec malesuada. +Praesent dignissim mi nec ornare elementum. Nunc eu augue vel sem dignissim cursus sed et nulla. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Pellentesque dictum dui sem, non placerat tortor rhoncus in. Sed placerat nulla at rhoncus iaculis. + +Document Section +================ + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum nulla vel neque venenatis, +nec placerat lorem placerat. Cras purus eros, gravida vitae tincidunt id, vehicula nec nulla. +Fusce aliquet auctor cursus. Phasellus ex neque, vestibulum non est vitae, viverra fringilla tortor. +Donec vestibulum convallis justo, a faucibus lorem vulputate vel. Aliquam cursus odio eu felis sodales aliquet. +Aliquam erat volutpat. Maecenas eget dictum mauris. Suspendisse arcu eros, condimentum eget risus sed, +luctus efficitur arcu. Cras ut dictum mi. Nulla congue interdum lorem, semper semper enim commodo nec. + +Document Subsection +------------------- + +.. figure:: static/yi_jing_01_chien.jpg + :align: right + :figwidth: 200px + + This is a caption for a figure. Text should wrap around the caption. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam efficitur in eros et blandit. Nunc maximus, +nisl at auctor vestibulum, justo ex sollicitudin ligula, id faucibus urna orci tristique nisl. +Duis auctor rutrum orci, in ornare lacus condimentum quis. Quisque arcu velit, facilisis quis interdum ac, +hendrerit auctor mauris. Curabitur urna nibh, porttitor at ante sit amet, vestibulum interdum dolor. +Duis dictum elit orci, tincidunt imperdiet sem pellentesque et. In vehicula pellentesque varius. +Phasellus a turpis sollicitudin, bibendum massa et, imperdiet neque. Integer quis sapien in magna rutrum bibendum. +Integer cursus ex sed magna vehicula finibus. Proin tempus orci quis dolor tempus, nec condimentum odio vestibulum. +Etiam efficitur sollicitudin libero, tincidunt volutpat ligula interdum sed. Praesent congue sagittis nisl et suscipit. +Vivamus sagittis risus et egestas commodo.Cras venenatis arcu in pharetra interdum. +Donec quis metus porttitor tellus cursus lobortis. Quisque et orci magna. Fusce rhoncus mi mi, +at vehicula massa rhoncus quis. Mauris augue leo, pretium eget molestie vitae, efficitur nec nulla. +In hac habitasse platea dictumst. Sed sit amet imperdiet purus. diff --git a/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/index.rst.txt b/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/index.rst.txt new file mode 100644 index 0000000000..ba42326fd7 --- /dev/null +++ b/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/index.rst.txt @@ -0,0 +1,27 @@ +.. include:: ../README.rst + +.. toctree:: + :caption: Theme Documentation + :maxdepth: 2 + + installing + configuring + changelog + + +.. toctree:: + :maxdepth: 2 + :numbered: + :caption: Demo Documents + + demo/structure + demo/demo + demo/lists_tables + demo/api + +.. toctree:: + :maxdepth: 3 + :numbered: + :caption: This is an incredibly long caption for a long menu + + demo/long diff --git a/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/installing.rst.txt b/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/installing.rst.txt new file mode 100644 index 0000000000..df406b999d --- /dev/null +++ b/docs/v1.1.1/_sources/src/pytorch-sphinx-theme/docs/installing.rst.txt @@ -0,0 +1,17 @@ + +************ +Installation +************ + +Via Git or Download +=================== + +Symlink or subtree the ``pytorch_sphinx_theme`` repository into your documentation at +``docs/_themes/pytorch_sphinx_theme`` then add the following two settings to your Sphinx +``conf.py`` file: + +.. code:: python + + html_theme = "pytorch_sphinx_theme" + html_theme_path = ["_themes", ] + diff --git a/docs/v1.1.1/_sources/tutorials/creating_torchscript_module_in_python.rst.txt b/docs/v1.1.1/_sources/tutorials/creating_torchscript_module_in_python.rst.txt new file mode 100644 index 0000000000..eaa1708b83 --- /dev/null +++ b/docs/v1.1.1/_sources/tutorials/creating_torchscript_module_in_python.rst.txt @@ -0,0 +1,137 @@ +.. _creating_a_ts_mod: + +Creating a TorchScript Module +------------------------------ +TorchScript is a way to create serializable and optimizable models from PyTorch code. +PyTorch has detailed documentation on how to do this https://pytorch.org/tutorials/beginner/Intro_to_TorchScript_tutorial.html but briefly here is the +here is key background information and the process: + +PyTorch programs are based around ``Module`` s which can be used to compose higher level modules. ``Modules`` contain a constructor to set up the modules, parameters and sub-modules +and a forward function which describes how to use the parameters and submodules when the module is invoked. + +For example, we can define a LeNet module like this: + +.. code-block:: python + :linenos: + + import torch.nn as nn + import torch.nn.functional as F + + class LeNetFeatExtractor(nn.Module): + def __init__(self): + super(LeNetFeatExtractor, self).__init__() + self.conv1 = nn.Conv2d(1, 6, 3) + self.conv2 = nn.Conv2d(6, 16, 3) + + def forward(self, x): + x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) + x = F.max_pool2d(F.relu(self.conv2(x)), 2) + return x + + class LeNetClassifier(nn.Module): + def __init__(self): + super(LeNetClassifier, self).__init__() + self.fc1 = nn.Linear(16 * 6 * 6, 120) + self.fc2 = nn.Linear(120, 84) + self.fc3 = nn.Linear(84, 10) + + def forward(self, x): + x = torch.flatten(x,1) + x = F.relu(self.fc1(x)) + x = F.relu(self.fc2(x)) + x = self.fc3(x) + return x + + class LeNet(nn.Module): + def __init__(self): + super(LeNet, self).__init__() + self.feat = LeNetFeatExtractor() + self.classifer = LeNetClassifier() + + def forward(self, x): + x = self.feat(x) + x = self.classifer(x) + return x + +. + + Obviously you may want to consolidate such a simple model into a single module but we can see the composability of PyTorch here + +From here are two pathways for going from PyTorch Python code to TorchScript code: Tracing and Scripting. + +Tracing follows the path of execution when the module is called and records what happens. +To trace an instance of our LeNet module, we can call ``torch.jit.trace`` with an example input. + +.. code-block:: python + + import torch + + model = LeNet() + input_data = torch.empty([1,1,32,32]) + traced_model = torch.jit.trace(model, input_data) + +Scripting actually inspects your code with a compiler and generates an equivalent TorchScript program. The difference is that since tracing +is following the execution of your module, it cannot pick up control flow for instance. By working from the Python code, the compiler can +include these components. We can run the script compiler on our LeNet module by calling ``torch.jit.script`` + +.. code-block:: python + + import torch + + model = LeNet() + script_model = torch.jit.script(model) + +There are reasons to use one path or another, the PyTorch documentation has information on how to choose. From a Torch-TensorRT prespective, there is +better support (i.e your module is more likely to compile) for traced modules because it doesn't include all the complexities of a complete +programming language, though both paths supported. + +After scripting or tracing your module, you are given back a TorchScript Module. This contains the code and parameters used to run the module stored +in a intermediate representation that Torch-TensorRT can consume. + +Here is what the LeNet traced module IR looks like: + +.. code-block:: none + + graph(%self.1 : __torch__.___torch_mangle_10.LeNet, + %input.1 : Float(1, 1, 32, 32)): + %129 : __torch__.___torch_mangle_9.LeNetClassifier = prim::GetAttr[name="classifer"](%self.1) + %119 : __torch__.___torch_mangle_5.LeNetFeatExtractor = prim::GetAttr[name="feat"](%self.1) + %137 : Tensor = prim::CallMethod[name="forward"](%119, %input.1) + %138 : Tensor = prim::CallMethod[name="forward"](%129, %137) + return (%138) + +and the LeNet scripted module IR: + +.. code-block:: none + + graph(%self : __torch__.LeNet, + %x.1 : Tensor): + %2 : __torch__.LeNetFeatExtractor = prim::GetAttr[name="feat"](%self) + %x.3 : Tensor = prim::CallMethod[name="forward"](%2, %x.1) # x.py:38:12 + %5 : __torch__.LeNetClassifier = prim::GetAttr[name="classifer"](%self) + %x.5 : Tensor = prim::CallMethod[name="forward"](%5, %x.3) # x.py:39:12 + return (%x.5) + +You can see that the IR preserves the module structure we have in our python code. + +.. _ts_in_py: + +Working with TorchScript in Python +----------------------------------- + +TorchScript Modules are run the same way you run normal PyTorch modules. You can run the forward pass using the +``forward`` method or just calling the module ``torch_scirpt_module(in_tensor)`` The JIT compiler will compile +and optimize the module on the fly and then returns the results. + +Saving TorchScript Module to Disk +----------------------------------- + +For either traced or scripted modules, you can save the module to disk with the following command + +.. code-block:: python + + import torch + + model = LeNet() + script_model = torch.jit.script(model) + script_model.save("lenet_scripted.ts") diff --git a/docs/v1.1.1/_sources/tutorials/getting_started_with_cpp_api.rst.txt b/docs/v1.1.1/_sources/tutorials/getting_started_with_cpp_api.rst.txt new file mode 100644 index 0000000000..41b8a448c0 --- /dev/null +++ b/docs/v1.1.1/_sources/tutorials/getting_started_with_cpp_api.rst.txt @@ -0,0 +1,338 @@ +.. _getting_started: + +Getting Started with C++ +======================== + +If you haven't already, acquire a tarball of the library by following the instructions in :ref:`Installation` + +Using Torch-TensorRT in C++ +*************************** +Torch-TensorRT C++ API accepts TorchScript modules (generated either from ``torch.jit.script`` or ``torch.jit.trace``) as an input and returns +a Torchscript module (optimized using TensorRT). This requires users to use Pytorch (in python) to generate torchscript modules beforehand. +Please refer to `Creating TorchScript modules in Python `_ section to generate torchscript graphs. + + +.. _torch_tensorrt_quickstart: + +[Torch-TensorRT Quickstart] Compiling TorchScript Modules with ``torchtrtc`` +--------------------------------------------------------------------------------- + +An easy way to get started with Torch-TensorRT and to check if your model can be supported without extra work is to run it through +``torchtrtc``, which supports almost all features of the compiler from the command line including post training quantization +(given a previously created calibration cache). For example we can compile our lenet model by setting our preferred operating +precision and input size. This new TorchScript file can be loaded into Python (note: you need to ``import torch_tensorrt`` before loading +these compiled modules because the compiler extends the PyTorch the deserializer and runtime to execute compiled modules). + +.. code-block:: shell + + ❯ torchtrtc -p f16 lenet_scripted.ts trt_lenet_scripted.ts "(1,1,32,32)" + + ❯ python3 + Python 3.6.9 (default, Apr 18 2020, 01:56:04) + [GCC 8.4.0] on linux + Type "help", "copyright", "credits" or "license" for more information. + >>> import torch + >>> import torch_tensorrt + >>> ts_model = torch.jit.load(“trt_lenet_scripted.ts”) + >>> ts_model(torch.randn((1,1,32,32)).to(“cuda”).half()) + +You can learn more about ``torchtrtc`` usage here: :ref:`torchtrtc` + +.. _ts_in_cc: + +Working with TorchScript in C++ +-------------------------------- + +If we are developing an application to deploy with C++, we can save either our traced or scripted module using ``torch.jit.save`` +which will serialize the TorchScript code, weights and other information into a package. This is also where our dependency on Python ends. + +.. code-block:: python + + torch_script_module.save("lenet.jit.pt") + +From here we can now load our TorchScript module in C++ + +.. code-block:: c++ + + #include // One-stop header. + + #include + #include + + int main(int argc, const char* argv[]) { + torch::jit::Module module; + try { + // Deserialize the ScriptModule from a file using torch::jit::load(). + module = torch::jit::load(""); + } + catch (const c10::Error& e) { + std::cerr << "error loading the model\n"; + return -1; + } + + std::cout << "ok\n"; + + +You can do full training and inference in C++ with PyTorch / LibTorch if you would like, you can even define your modules in C++ and +have access to the same powerful tensor library that backs PyTorch. (For more information: https://pytorch.org/cppdocs/). +For instance we can do inference with our LeNet module like this: + +.. code-block:: c++ + + mod.eval(); + torch::Tensor in = torch::randn({1, 1, 32, 32}); + auto out = mod.forward(in); + +and to run on the GPU: + +.. code-block:: c++ + + mod.eval(); + mod.to(torch::kCUDA); + torch::Tensor in = torch::randn({1, 1, 32, 32}, torch::kCUDA); + auto out = mod.forward(in); + +As you can see it is pretty similar to the Python API. When you call the ``forward`` method, you invoke the PyTorch JIT compiler, which will optimize and run your TorchScript code. + +.. _compile_cpp: + +Compiling with Torch-TensorRT in C++ +------------------------------------- +We are also at the point were we can compile and optimize our module with Torch-TensorRT, but instead of in a JIT fashion we must do it ahead-of-time (AOT) i.e. before we start doing actual inference work +since it takes a bit of time to optimize the module, it would not make sense to do this every time you run the module or even the first time you run it. + +With our module loaded, we can feed it into the Torch-TensorRT compiler. When we do so we must provide some information on the expected input size and also configure any additional settings. + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + ... + + mod.to(at::kCUDA); + mod.eval(); + + auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}); + auto trt_mod = torch_tensorrt::CompileGraph(mod, std::vector{{in.sizes()}}); + auto out = trt_mod.forward({in}); + +Thats it! Now the graph runs primarily not with the JIT compiler but using TensorRT (though we execute the graph using the JIT runtime). + +We can also set settings like operating precision to run in FP16. + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + ... + + mod.to(at::kCUDA); + mod.eval(); + + auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}).to(torch::kHALF); + auto input_sizes = std::vector({in.sizes()}); + torch_tensorrt::CompileSpec info(input_sizes); + info.enable_precisions.insert(torch::kHALF); + auto trt_mod = torch_tensorrt::CompileGraph(mod, info); + auto out = trt_mod.forward({in}); + +And now we are running the module in FP16 precision. You can then save the module to load later. + +.. code-block:: c++ + + trt_mod.save("") + +Torch-TensorRT compiled TorchScript modules are loaded in the same way as normal TorchScript module. Make sure your deployment application is linked against ``libtorchtrt.so`` + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + + int main(int argc, const char* argv[]) { + torch::jit::Module module; + try { + // Deserialize the ScriptModule from a file using torch::jit::load(). + module = torch::jit::load(""); + } + catch (const c10::Error& e) { + std::cerr << "error loading the model\n"; + return -1; + } + + torch::Tensor in = torch::randn({1, 1, 32, 32}, torch::kCUDA); + auto out = mod.forward(in); + + std::cout << "ok\n"; + } + +If you want to save the engine produced by Torch-TensorRT to use in a TensorRT application you can use the ``ConvertGraphToTRTEngine`` API. + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + ... + + mod.to(at::kCUDA); + mod.eval(); + + auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}).to(torch::kHALF); + auto input_sizes = std::vector({in.sizes()}); + torch_tensorrt::CompileSpec info(input_sizes); + info.enabled_precisions.insert(torch::kHALF); + auto trt_mod = torch_tensorrt::ConvertGraphToTRTEngine(mod, "forward", info); + std::ofstream out("/tmp/engine_converted_from_jit.trt"); + out << engine; + out.close(); + +.. _under_the_hood: + +Under The Hood +--------------- + +When a module is provided to Torch-TensorRT, the compiler starts by mapping a graph like you saw above to a graph like this: + +.. code-block:: none + + graph(%input.2 : Tensor): + %2 : Float(84, 10) = prim::Constant[value=]() + %3 : Float(120, 84) = prim::Constant[value=]() + %4 : Float(576, 120) = prim::Constant[value=]() + %5 : int = prim::Constant[value=-1]() # x.py:25:0 + %6 : int[] = prim::Constant[value=annotate(List[int], [])]() + %7 : int[] = prim::Constant[value=[2, 2]]() + %8 : int[] = prim::Constant[value=[0, 0]]() + %9 : int[] = prim::Constant[value=[1, 1]]() + %10 : bool = prim::Constant[value=1]() # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0 + %11 : int = prim::Constant[value=1]() # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0 + %12 : bool = prim::Constant[value=0]() # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0 + %self.classifer.fc3.bias : Float(10) = prim::Constant[value= 0.0464 0.0383 0.0678 0.0932 0.1045 -0.0805 -0.0435 -0.0818 0.0208 -0.0358 [ CUDAFloatType{10} ]]() + %self.classifer.fc2.bias : Float(84) = prim::Constant[value=]() + %self.classifer.fc1.bias : Float(120) = prim::Constant[value=]() + %self.feat.conv2.weight : Float(16, 6, 3, 3) = prim::Constant[value=]() + %self.feat.conv2.bias : Float(16) = prim::Constant[value=]() + %self.feat.conv1.weight : Float(6, 1, 3, 3) = prim::Constant[value=]() + %self.feat.conv1.bias : Float(6) = prim::Constant[value= 0.0530 -0.1691 0.2802 0.1502 0.1056 -0.1549 [ CUDAFloatType{6} ]]() + %input0.4 : Tensor = aten::_convolution(%input.2, %self.feat.conv1.weight, %self.feat.conv1.bias, %9, %8, %9, %12, %8, %11, %12, %12, %10) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0 + %input0.5 : Tensor = aten::relu(%input0.4) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0 + %input1.2 : Tensor = aten::max_pool2d(%input0.5, %7, %6, %8, %9, %12) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0 + %input0.6 : Tensor = aten::_convolution(%input1.2, %self.feat.conv2.weight, %self.feat.conv2.bias, %9, %8, %9, %12, %8, %11, %12, %12, %10) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0 + %input2.1 : Tensor = aten::relu(%input0.6) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0 + %x.1 : Tensor = aten::max_pool2d(%input2.1, %7, %6, %8, %9, %12) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0 + %input.1 : Tensor = aten::flatten(%x.1, %11, %5) # x.py:25:0 + %27 : Tensor = aten::matmul(%input.1, %4) + %28 : Tensor = trt::const(%self.classifer.fc1.bias) + %29 : Tensor = aten::add_(%28, %27, %11) + %input0.2 : Tensor = aten::relu(%29) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0 + %31 : Tensor = aten::matmul(%input0.2, %3) + %32 : Tensor = trt::const(%self.classifer.fc2.bias) + %33 : Tensor = aten::add_(%32, %31, %11) + %input1.1 : Tensor = aten::relu(%33) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0 + %35 : Tensor = aten::matmul(%input1.1, %2) + %36 : Tensor = trt::const(%self.classifer.fc3.bias) + %37 : Tensor = aten::add_(%36, %35, %11) + return (%37) + (CompileGraph) + +The graph has now been transformed from a collection of modules, each managing their own parameters into a single graph with the parameters inlined +into the graph and all of the operations laid out. Torch-TensorRT has also executed a number of optimizations and mappings to make the graph easier to translate to TensorRT. +From here the compiler can assemble the TensorRT engine by following the dataflow through the graph. + +When the graph construction phase is complete, Torch-TensorRT produces a serialized TensorRT engine. From here depending on the API, this engine is returned +to the user or moves into the graph construction phase. Here Torch-TensorRT creates a JIT Module to execute the TensorRT engine which will be instantiated and managed +by the Torch-TensorRT runtime. + +Here is the graph that you get back after compilation is complete: + +.. code-block:: none + + graph(%self_1 : __torch__.lenet, %input_0 : Tensor): + %1 : ...trt.Engine = prim::GetAttr[name="lenet"](%self_1) + %3 : Tensor[] = prim::ListConstruct(%input_0) + %4 : Tensor[] = trt::execute_engine(%3, %1) + %5 : Tensor = prim::ListUnpack(%4) + return (%5) + + +You can see the call where the engine is executed, after extracting the attribute containing the engine and constructing a list of inputs, then returns the tensors back to the user. + +.. _unsupported_ops: + +Working with Unsupported Operators +----------------------------------- + +Torch-TensorRT is a new library and the PyTorch operator library is quite large, so there will be ops that aren't supported natively by the compiler. You can either use the composition techinques +shown above to make modules are fully Torch-TensorRT supported and ones that are not and stitch the modules together in the deployment application or you can register converters for missing ops. + + You can check support without going through the full compilation pipleine using the ``torch_tensorrt::CheckMethodOperatorSupport(const torch::jit::Module& module, std::string method_name)`` api + to see what operators are not supported. ``torchtrtc`` automatically checks modules with this method before starting compilation and will print out a list of operators that are not supported. + +.. _custom_converters: + +Registering Custom Converters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Operations are mapped to TensorRT through the use of modular converters, a function that takes a node from a the JIT graph and produces an equivalent layer or subgraph in TensorRT. +Torch-TensorRT ships with a library of these converters stored in a registry, that will be executed depending on the node being parsed. For instance a ``aten::relu(%input0.4)`` instruction will trigger +the relu converter to be run on it, producing an activation layer in the TensorRT graph. But since this library is not exhaustive you may need to write your own to get Torch-TensorRT +to support your module. + +Shipped with the Torch-TensorRT distribution are the internal core API headers. You can therefore access the converter registry and add a converter for the op you need. + +For example, if we try to compile a graph with a build of Torch-TensorRT that doesn't support the flatten operation (``aten::flatten``) you may see this error: + +.. code-block:: none + + terminate called after throwing an instance of 'torch_tensorrt::Error' + what(): [enforce fail at core/conversion/conversion.cpp:109] Expected converter to be true but got false + Unable to convert node: %input.1 : Tensor = aten::flatten(%x.1, %11, %5) # x.py:25:0 (conversion.AddLayer) + Schema: aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor) + Converter for aten::flatten requested, but no such converter was found. + If you need a converter for this operator, you can try implementing one yourself + or request a converter: https://www.github.com/NVIDIA/Torch-TensorRT/issues + +We can register a converter for this operator in our application. All of the tools required to build a converter can be imported by including ``torch_tensorrt/core/conversion/converters/converters.h``. +We start by creating an instance of the self-registering class ``torch_tensorrt::core::conversion::converters::RegisterNodeConversionPatterns()`` which will register converters +in the global converter registry, associating a function schema like ``aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor)`` with a lambda that +will take the state of the conversion, the node/operation in question to convert and all of the inputs to the node and produces as a side effect a new layer in the TensorRT network. +Arguments are passed as a vector of inspectable unions of TensorRT ``ITensors`` and Torch ``IValues`` in the order arguments are listed in the schema. + +Below is a implementation of a ``aten::flatten`` converter that we can use in our application. You have full access to the Torch and TensorRT libraries in the converter implementation. So +for example we can quickly get the output size by just running the operation in PyTorch instead of implementing the full calculation outself like we do below for this flatten converter. + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + #include "torch_tensorrt/core/conversion/converters/converters.h" + + static auto flatten_converter = torch_tensorrt::core::conversion::converters::RegisterNodeConversionPatterns() + .pattern({ + "aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor)", + [](torch_tensorrt::core::conversion::ConversionCtx* ctx, + const torch::jit::Node* n, + torch_tensorrt::core::conversion::converters::args& args) -> bool { + auto in = args[0].ITensor(); + auto start_dim = args[1].unwrapToInt(); + auto end_dim = args[2].unwrapToInt(); + auto in_shape = torch_tensorrt::core::util::toVec(in->getDimensions()); + auto out_shape = torch::flatten(torch::rand(in_shape), start_dim, end_dim).sizes(); + + auto shuffle = ctx->net->addShuffle(*in); + shuffle->setReshapeDimensions(torch_tensorrt::core::util::toDims(out_shape)); + shuffle->setName(torch_tensorrt::core::util::node_info(n).c_str()); + + auto out_tensor = ctx->AssociateValueAndTensor(n->outputs()[0], shuffle->getOutput(0)); + return true; + } + }); + + int main() { + ... + +To use this converter in Python, it is recommended to use PyTorch's `C++ / CUDA Extention `_ +template to wrap your library of converters into a ``.so`` that you can load with ``ctypes.CDLL()`` in your Python application. + +You can find more information on all the details of writing converters in the contributors documentation (:ref:`writing_converters`). +If you find yourself with a large library of converter implementations, do consider upstreaming them, PRs are welcome and it would be great for the community to benefit as well. diff --git a/docs/v1.1.1/_sources/tutorials/getting_started_with_fx_path.rst.txt b/docs/v1.1.1/_sources/tutorials/getting_started_with_fx_path.rst.txt new file mode 100644 index 0000000000..d7dc9b0166 --- /dev/null +++ b/docs/v1.1.1/_sources/tutorials/getting_started_with_fx_path.rst.txt @@ -0,0 +1,297 @@ +.. _getting_started_with_fx: + +Torch-TensorRT (FX Frontend) User Guide +======================== +Torch-TensorRT (FX Frontend) is a tool that can convert a PyTorch model through ``torch.fx`` to an +TensorRT engine optimized targeting running on Nvidia GPUs. TensorRT is the inference engine +developed by NVIDIA which composed of various kinds of optimization including kernel fusion, +graph optimization, low precision, etc.. This tool is developed in Python environment which allows this +workflow to be very accessible to researchers and engineers. There are a few stages that a +user want to use this tool and we will introduce them here. + +> Torch-TensorRT (FX Frontend) is in ``Beta`` and currently it is recommended to work with PyTorch nightly. + +.. code-block:: shell + + # Test an example by + $ python py/torch_tensorrt/fx/example/lower_example.py + + +Converting a PyTorch Model to TensorRT Engine +--------------------------------------------- +In general, users are welcome to use the ``compile()`` to finish the conversion from a model to tensorRT engine. It is a +wrapper API that consists of the major steps needed to finish this converison. Please refer to ``lower_example.py`` file in ``examples/fx``. + +In this section, we will go through an example to illustrate the major steps that fx path uses. +Users can refer to ``fx2trt_example.py`` file in ``examples/fx``. + +* **Step 1: Trace the model with acc_tracer** +Acc_tracer is a tracer inheritated from FX tracer. It comes with args normalizer to convert all args to kwargs and pass to TRT converters. + +.. code-block:: shell + + import torch_tensorrt.fx.tracer.acc_tracer.acc_tracer as acc_tracer + + # Build the model which needs to be a PyTorch nn.Module. + my_pytorch_model = build_model() + + # Prepare inputs to the model. Inputs have to be a List of Tensors + inputs = [Tensor, Tensor, ...] + + # Trace the model with acc_tracer. + acc_mod = acc_tracer.trace(my_pytorch_model, inputs) + +*Common Errors:* + +symbolically traced variables cannot be used as inputs to control flow +This means the model contains dynamic control flow. Please refer to section “Dynamic Control Flow” in `FX guide `_. + +* **Step 2: Build TensorRT engine** +There are `two different modes `_ for how TensorRT handles batch dimension, explicit batch dimension and implicit batch dimension. This mode was used by early versions of TensorRT, and is now deprecated but continues to be supported for backwards compatibility. In explicit batch mode, all dimensions are explicit and can be dynamic, that is their length can change at execution time. Many new features, such as dynamic shapes and loops, are available only in this mode. User can still choose to use implicit batch mode when they set ``explicit_batch_dimension=False`` in ``compile()``. We do not recommend to use it since it will lack of support in future TensorRT versions. + +Explicit batch is the default mode and it must be set for dynamic shape. For most of vision task, user can choose to enable ``dynamic_batch`` in ``compile()`` if they want to get the similar effects as implicit mode where only batch dimension changes. It has some requirements: +1. Shapes of inputs, outputs and activations are fixed except batch dimension. +2. Inputs, outputs and activations have batch dimension as the major dimension. +3. All the operators in the model do not modify batch dimension (permute, transpose, split, etc.) or compute over batch dimension (sum, softmax, etc.). + +For examples of the last path, if we have a 3D tensor t shaped as (batch, sequence, dimension), operations such as torch.transpose(0, 2). If any of these three are not satisfied, we’ll need to specify InputTensorSpec as inputs with dynamic range. + +.. code-block:: shell + + import deeplearning.trt.fx2trt.converter.converters + from torch.fx.experimental.fx2trt.fx2trt import InputTensorSpec, TRTInterpreter + + # InputTensorSpec is a dataclass we use to store input information. + # There're two ways we can build input_specs. + # Option 1, build it manually. + input_specs = [ + InputTensorSpec(shape=(1, 2, 3), dtype=torch.float32), + InputTensorSpec(shape=(1, 4, 5), dtype=torch.float32), + ] + # Option 2, build it using sample_inputs where user provide a sample + inputs = [ + torch.rand((1,2,3), dtype=torch.float32), + torch.rand((1,4,5), dtype=torch.float32), + ] + input_specs = InputTensorSpec.from_tensors(inputs) + + # IMPORTANT: If dynamic shape is needed, we need to build it slightly differently. + input_specs = [ + InputTensorSpec( + shape=(-1, 2, 3), + dtype=torch.float32, + # Currently we only support one set of dynamic range. User may set other dimensions but it is not promised to work for any models + # (min_shape, optimize_target_shape, max_shape) + # For more information refer to fx/input_tensor_spec.py + shape_ranges = [ + ((1, 2, 3), (4, 2, 3), (100, 2, 3)), + ], + ), + InputTensorSpec(shape=(1, 4, 5), dtype=torch.float32), + ] + + # Build a TRT interpreter. Set explicit_batch_dimension accordingly. + interpreter = TRTInterpreter( + acc_mod, input_specs, explicit_batch_dimension=True/False + ) + + # The output of TRTInterpreter run() is wrapped as TRTInterpreterResult. + # The TRTInterpreterResult contains required parameter to build TRTModule, + # and other informational output from TRTInterpreter run. + class TRTInterpreterResult(NamedTuple): + engine: Any + input_names: Sequence[str] + output_names: Sequence[str] + serialized_cache: bytearray + + #max_batch_size: set accordingly for maximum batch size you will use. + #max_workspace_size: set to the maximum size we can afford for temporary buffer + #lower_precision: the precision model layers are running on (TensorRT will choose the best perforamnce precision). + #sparse_weights: allow the builder to examine weights and use optimized functions when weights have suitable sparsity + #force_fp32_output: force output to be fp32 + #strict_type_constraints: Usually we should set it to False unless we want to control the precision of certain layer for numeric #reasons. + #algorithm_selector: set up algorithm selection for certain layer + #timing_cache: enable timing cache for TensorRT + #profiling_verbosity: TensorRT logging level + trt_interpreter_result = interpreter.run( + max_batch_size=64, + max_workspace_size=1 << 25, + sparse_weights=False, + force_fp32_output=False, + strict_type_constraints=False, + algorithm_selector=None, + timing_cache=None, + profiling_verbosity=None, + ) + + +*Common Errors:* + +RuntimeError: Conversion of function xxx not currently supported! +- This means we don’t have the support for this xxx operator. Please refer to section “How to add a missing op” below for further instructions. + +* **Step 3: Run the model** +One way is using TRTModule, which is basically a PyTorch nn.Module. + +.. code-block:: shell + + from torch_tensorrt.fx import TRTModule + mod = TRTModule( + trt_interpreter_result.engine, + trt_interpreter_result.input_names, + trt_interpreter_result.output_names) + # Just like all other PyTorch modules + outputs = mod(*inputs) + torch.save(mod, "trt.pt") + reload_trt_mod = torch.load("trt.pt") + reload_model_output = reload_trt_mod(*inputs) + +So far, we give a detailed explanation of major steps in convterting a PyTorch model into TensorRT engine. Users are welcome to refer to the source code for some parameters explanations. In the converting scheme, there are two important actions in it. One is acc tracer which helps us to convert a PyTorch model to acc graph. The other is FX path converter which helps to convert the acc graph's operation to corresponding TensorRT operation and build up the TensoRT engine for it. + +Acc Tracer +--------- + +Acc tracer is a custom FX symbolic tracer. It does a couple more things compare to the vanilla FX symbolic tracer. We mainly depend on it to convert PyTorch ops or builtin ops to acc ops. There are two main purposes for fx2trt to use acc ops: + +1. there’re many ops that do similar things in PyTorch ops and builtin ops such like torch.add, builtin.add and torch.Tensor.add. Using acc tracer, we normalize these three ops to a single acc_ops.add. This helps reduce the number of converters we need to write. +2. acc ops only have kwargs which makes writing converter easier as we don’t need to add additional logic to find arguments in args and kwargs. + +FX2TRT +-------- +After symbolic tracing, we have the graph representation of a PyTorch model. fx2trt leverages the power of fx.Interpreter. fx.Interpreter goes through the whole graph node by node and calls the function that node represents. fx2trt overrides the original behavior of calling the function with invoking corresponding converts for each node. Each converter function adds corresponding TensorRT layer(s). + +Below is an example of a converter function. The decorator is used to register this converter function with the corresponding node. In this example, we register this converter to a fx node whose target is acc_ops.sigmoid. + +.. code-block:: shell + + @tensorrt_converter(acc_ops.sigmoid) + def acc_ops_sigmoid(network, target, args, kwargs, name): + """ + network: TensorRT network. We'll be adding layers to it. + + The rest arguments are attributes of fx node. + """ + input_val = kwargs['input'] + + if not isinstance(input_val, trt.tensorrt.ITensor): + raise RuntimeError(f'Sigmoid received input {input_val} that is not part ' + 'of the TensorRT region!') + + layer = network.add_activation(input=input_val, type=trt.ActivationType.SIGMOID) + layer.name = name + return layer.get_output(0) + +How to Add a Missing Op +**************** + +You can actually add it wherever you want just need to remember import the file so that all acc ops and mapper will be registered before tracing with acc_tracer. + +* **Step 1. Add a new acc op** + +TODO: Need to explain more on the logistic of acc op like when we want to break down an op and when we want to reuse other ops. + +In `acc tracer `_, we convert nodes in the graph to acc ops if there’s a mapping registered for the node to an acc op. + +In order to make the conversion to acc ops to happen, there’re two things required. One is that there should be an acc op function defined and the other is there should be a mapping registered. + +Defining an acc op is simple, we first just need a function and register the function as an acc op via this decorator `acc_normalizer.py `_. e.g. the following code adds an acc op named foo() which adds two given inputs. + +.. code-block:: shell + + # NOTE: all acc ops should only take kwargs as inputs, therefore we need the "*" + # at the beginning. + @register_acc_op + def foo(*, input, other, alpha): + return input + alpha * other + +There’re two ways to register a mapping. One is `register_acc_op_mapping() `_. Let’s register a mapping from torch.add to foo() we just created above. We need to add decorator register_acc_op_mapping to it. + +.. code-block:: shell + + this_arg_is_optional = True + + @register_acc_op_mapping( + op_and_target=("call_function", torch.add), + arg_replacement_tuples=[ + ("input", "input"), + ("other", "other"), + ("alpha", "alpha", this_arg_is_optional), + ], + ) + @register_acc_op + def foo(*, input, other, alpha=1.0): + return input + alpha * other + +``op_and_target`` determines which node will trigger this mapping. op and target are the attributes of FX node. In acc_normalization when we see a node with the same op and target as set in the ``op_and_target``, we will trigger the mapping. Since we want to map from ``torch.add``, then op would be call_function and target would be ``torch.add``. ``arg_replacement_tuples`` determines how we construct kwargs for new acc op node using args and kwargs from original node. Each tuple in ``arg_replacement_tuples`` represents one argument mapping rule. It contains two or three elements. The third element is a boolean variable that determines whether this kwarg is optional in *original node*. We only need to specify the third element if it’s True. The first element is the argument name in original node which will be used as the acc op node’s argument whose name is the second element in the tuple. The sequence of the tuples does matter because the position of the tuple determines where the argument is in original node’s args. We use this information to map args from original node to kwargs in acc op node. +We don’t have to specify arg_replacement_tuples if none of the followings are true. + +1. kwargs of original nodes and acc op nodes have different name. +2. there’re optional arguments. + +The other way to register a mapping is through `register_custom_acc_mapper_fn() `_. This one is designed to reduce the redundant op registration as it allows you to use a function to map to one or more existing acc ops throught some combinations. In the function, you can do basically whatever you want. Let’s use an example to explain how it works. + +.. code-block:: shell + + @register_acc_op + def foo(*, input, other, alpha=1.0): + return input + alpha * other + + @register_custom_acc_mapper_fn( + op_and_target=("call_function", torch.add), + arg_replacement_tuples=[ + ("input", "input"), + ("other", "other"), + ("alpha", "alpha", this_arg_is_optional), + ], + ) + def custom_mapper(node: torch.fx.Node, _: nn.Module) -> torch.fx.Node: + """ + `node` is original node, which is a call_function node with target + being torch.add. + """ + alpha = 1 + if "alpha" in node.kwargs: + alpha = node.kwargs["alpha"] + foo_kwargs = {"input": node["input"], "other": node["other"], "alpha": alpha} + with node.graph.inserting_before(node): + foo_node = node.graph.call_function(foo, kwargs=foo_kwargs) + foo_node.meta = node.meta.copy() + return foo_node + + +In the custom mapper function, we construct an acc op node and return it. The node we returns here would take over all the children nodes of original nodes `acc_normalizer.py `_. + +The last step would be *adding unit test* for the new acc op or mapper function we added. The place to add the unit test is here `test_acc_tracer.py `_. + +* **Step 2. Add a new converter** + +All the developed converters for acc ops are all in `acc_op_converter.py `_. It could give you a good example of how the converter is added. + +Essentially, the converter is the mapping mechanism that maps the acc ops to a TensorRT layer. If we are able to find all the TensorRT layers we need we can get start to add a converter for the node using `TensorRT APIs `_. + +.. code-block:: shell + + @tensorrt_converter(acc_ops.sigmoid) + def acc_ops_sigmoid(network, target, args, kwargs, name): + """ + network: TensorRT network. We'll be adding layers to it. + + The rest arguments are attributes of fx node. + """ + input_val = kwargs['input'] + + if not isinstance(input_val, trt.tensorrt.ITensor): + raise RuntimeError(f'Sigmoid received input {input_val} that is not part ' + 'of the TensorRT region!') + + layer = network.add_activation(input=input_val, type=trt.ActivationType.SIGMOID) + layer.name = name + return layer.get_output(0) + +We need to use ``tensorrt_converter`` decorator to register the converter. The argument for the decorator is the target of the fx node that we need to convert. In the converter, we can find the inputs to the fx node in kwargs. As in the example, the original node is `acc_ops.sigmoid` which only has one argument “input” in acc_ops.py. We get the input and check if it’s a TensorRT tensor. After that, we add a sigmoid layer to TensorRT network and return the output of the layer. The output we returned will be passed to the children nodes of acc_ops.sigmoid by fx.Interpreter. + +**What if we can not find corresponding layers in TensorRT that do the same thing as the node.** + +In this case, we would need to do a bit more work. TensorRT provides plugins which serves as custom layers. *We have not implement this feature yet. We will update once it is enabled*. + +Last step would be adding the unit test for the new converter we added. User could add corresponding unit test in this `folder `_. diff --git a/docs/v1.1.1/_sources/tutorials/getting_started_with_python_api.rst.txt b/docs/v1.1.1/_sources/tutorials/getting_started_with_python_api.rst.txt new file mode 100644 index 0000000000..b63665c980 --- /dev/null +++ b/docs/v1.1.1/_sources/tutorials/getting_started_with_python_api.rst.txt @@ -0,0 +1,47 @@ +.. _getting_started_with_python_api: + +Using Torch-TensorRT in Python +******************************* + +Torch-TensorRT Python API accepts a ```torch.nn.Module`` as an input. Under the hood, it uses ``torch.jit.script`` to convert the input module into a +TorchScript module. To compile your input ```torch.nn.Module`` with Torch-TensorRT, all you need to do is provide the module and inputs +to Torch-TensorRT and you will be returned an optimized TorchScript module to run or add into another PyTorch module. Inputs +is a list of ``torch_tensorrt.Input`` classes which define input's shape, datatype and memory format. You can also specify settings such as +operating precision for the engine or target device. After compilation you can save the module just like any other module +to load in a deployment application. In order to load a TensorRT/TorchScript module, make sure you first import ``torch_tensorrt``. + +.. code-block:: python + + import torch_tensorrt + + ... + + model = MyModel().eval() # torch module needs to be in eval (not training) mode + + inputs = [torch_tensorrt.Input( + min_shape=[1, 1, 16, 16], + opt_shape=[1, 1, 32, 32], + max_shape=[1, 1, 64, 64], + dtype=torch.half, + )] + enabled_precisions = {torch.float, torch.half} # Run with fp16 + + trt_ts_module = torch_tensorrt.compile(model, inputs=inputs, enabled_precisions=enabled_precisions) + + input_data = input_data.to('cuda').half() + result = trt_ts_module(input_data) + torch.jit.save(trt_ts_module, "trt_ts_module.ts") + +.. code-block:: python + + # Deployment application + import torch + import torch_tensorrt + + trt_ts_module = torch.jit.load("trt_ts_module.ts") + input_data = input_data.to('cuda').half() + result = trt_ts_module(input_data) + +Torch-TensorRT python API also provides ``torch_tensorrt.ts.compile`` which accepts a TorchScript module as input. +The torchscript module can be obtained via scripting or tracing (refer to :ref:`creating_torchscript_module_in_python`). ``torch_tensorrt.ts.compile`` accepts a Torchscript module +and a list of ``torch_tensorrt.Input`` classes. diff --git a/docs/v1.1.1/_sources/tutorials/installation.rst.txt b/docs/v1.1.1/_sources/tutorials/installation.rst.txt new file mode 100644 index 0000000000..949fa2ddc9 --- /dev/null +++ b/docs/v1.1.1/_sources/tutorials/installation.rst.txt @@ -0,0 +1,387 @@ +.. _installation: + +Installation +============= + +Precompiled Binaries +********************* + +Dependencies +--------------- + +You need to have either PyTorch or LibTorch installed based on if you are using Python or C++ +and you must have CUDA, cuDNN and TensorRT installed. + + * https://www.pytorch.org + * https://developer.nvidia.com/cuda + * https://developer.nvidia.com/cudnn + * https://developer.nvidia.com/tensorrt + + +Python Package +--------------- + +You can install the python package using + +.. code-block:: sh + + pip3 install torch-tensorrt -f https://github.com/NVIDIA/Torch-TensorRT/releases + +.. _bin-dist: + +C++ Binary Distribution +------------------------ + +Precompiled tarballs for releases are provided here: https://github.com/NVIDIA/Torch-TensorRT/releases + +.. _compile-from-source: + +Compiling From Source +****************************************** + +.. _installing-deps: + +Dependencies for Compilation +------------------------------- + +Torch-TensorRT is built with Bazel, so begin by installing it. + + * The easiest way is to install bazelisk using the method of your choosing https://github.com/bazelbuild/bazelisk + * Otherwise you can use the following instructions to install binaries https://docs.bazel.build/versions/master/install.html + * Finally if you need to compile from source (e.g. aarch64 until bazel distributes binaries for the architecture) you can use these instructions + + .. code-block:: shell + + export BAZEL_VERSION=$(cat /.bazelversion) + mkdir bazel + cd bazel + curl -fSsL -O https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-dist.zip + unzip bazel-$BAZEL_VERSION-dist.zip + bash ./compile.sh + cp output/bazel /usr/local/bin/ + + +You will also need to have CUDA installed on the system (or if running in a container, the system must have +the CUDA driver installed and the container must have CUDA) + +The correct LibTorch version will be pulled down for you by bazel. + + NOTE: For best compatability with official PyTorch, use torch==1.10.0+cuda113, TensorRT 8.0 and cuDNN 8.2 for CUDA 11.3 however Torch-TensorRT itself supports + TensorRT and cuDNN for other CUDA versions for usecases such as using NVIDIA compiled distributions of PyTorch that use other versions of CUDA + e.g. aarch64 or custom compiled version of PyTorch. + +.. _abis: + +Choosing the Right ABI +^^^^^^^^^^^^^^^^^^^^^^^^ + +Likely the most complicated thing about compiling Torch-TensorRT is selecting the correct ABI. There are two options +which are incompatible with each other, pre-cxx11-abi and the cxx11-abi. The complexity comes from the fact that while +the most popular distribution of PyTorch (wheels downloaded from pytorch.org/pypi directly) use the pre-cxx11-abi, most +other distributions you might encounter (e.g. ones from NVIDIA - NGC containers, and builds for Jetson as well as certain +libtorch builds and likely if you build PyTorch from source) use the cxx11-abi. It is important you compile Torch-TensorRT +using the correct ABI to function properly. Below is a table with general pairings of PyTorch distribution sources and the +recommended commands: + ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| PyTorch Source | Recommended C++ Compilation Command | Recommended Python Compilation Command | ++=============================================================+==========================================================+====================================================================+ +| PyTorch whl file from PyTorch.org | bazel build //:libtorchtrt -c opt --config pre_cxx11_abi | python3 setup.py bdist_wheel | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| libtorch-shared-with-deps-*.zip from PyTorch.org | bazel build //:libtorchtrt -c opt --config pre_cxx11_abi | python3 setup.py bdist_wheel | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| libtorch-cxx11-abi-shared-with-deps-*.zip from PyTorch.org | bazel build //:libtorchtrt -c opt | python3 setup.py bdist_wheel --use-cxx11-abi | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| PyTorch preinstalled in an NGC container | bazel build //:libtorchtrt -c opt | python3 setup.py bdist_wheel --use-cxx11-abi | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| PyTorch from the NVIDIA Forums for Jetson | bazel build //:libtorchtrt -c opt | python3 setup.py bdist_wheel --jetpack-version 4.6 --use-cxx11-abi | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| PyTorch built from Source | bazel build //:libtorchtrt -c opt | python3 setup.py bdist_wheel --use-cxx11-abi | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ + + NOTE: For all of the above cases you must correctly declare the source of PyTorch you intend to use in your WORKSPACE file for both Python and C++ builds. See below for more information + +You then have two compilation options: + +.. _build-from-archive: + +**Building using cuDNN & TensorRT tarball distributions** +-------------------------------------------------------------- + + This is recommended so as to build Torch-TensorRT hermetically and insures any compilation errors are not caused by version issues + + Make sure when running Torch-TensorRT that these versions of the libraries are prioritized in your ``$LD_LIBRARY_PATH`` + +You need to download the tarball distributions of TensorRT and cuDNN from the NVIDIA website. + * https://developer.nvidia.com/cudnn + * https://developer.nvidia.com/tensorrt + +Place these files in a directory (the directories ``third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu]`` exist for this purpose) + +Then compile referencing the directory with the tarballs + + If you get errors regarding the packages, check their sha256 hashes and make sure they match the ones listed in ``WORKSPACE`` + +Release Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: shell + + bazel build //:libtorchtrt -c opt --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu] + +A tarball with the include files and library can then be found in ``bazel-bin`` + +.. _build-from-archive-debug: + +Debug Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +To build with debug symbols use the following command + +.. code-block:: shell + + bazel build //:libtorchtrt -c dbg --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu] + +A tarball with the include files and library can then be found in ``bazel-bin`` + +Pre CXX11 ABI Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +To build using the pre-CXX11 ABI use the ``pre_cxx11_abi`` config + +.. code-block:: shell + + bazel build //:libtorchtrt --config pre_cxx11_abi -c [dbg/opt] --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu] + +A tarball with the include files and library can then be found in ``bazel-bin`` + +.. _build-from-local: + +**Building using locally installed cuDNN & TensorRT** +-------------------------------------------------------------- + + If you encounter bugs and you compiled using this method please disclose that you used local sources in the issue (an ldd dump would be nice too) + +Install TensorRT, CUDA and cuDNN on the system before starting to compile. + +In WORKSPACE comment out: + +.. code-block:: python + + # Downloaded distributions to use with --distdir + http_archive( + name = "cudnn", + urls = ["",], + + build_file = "@//third_party/cudnn/archive:BUILD", + sha256 = "", + strip_prefix = "cuda" + ) + + http_archive( + name = "tensorrt", + urls = ["",], + + build_file = "@//third_party/tensorrt/archive:BUILD", + sha256 = "", + strip_prefix = "TensorRT-" + ) + +and uncomment + +.. code-block:: python + + # Locally installed dependencies + new_local_repository( + name = "cudnn", + path = "/usr/", + build_file = "@//third_party/cudnn/local:BUILD" + ) + + new_local_repository( + name = "tensorrt", + path = "/usr/", + build_file = "@//third_party/tensorrt/local:BUILD" + ) + +Release Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +Compile using: + +.. code-block:: shell + + bazel build //:libtorchtrt -c opt + +A tarball with the include files and library can then be found in ``bazel-bin`` + +.. _build-from-local-debug: + +Debug Build +^^^^^^^^^^^^ + +To build with debug symbols use the following command + +.. code-block:: shell + + bazel build //:libtorchtrt -c dbg + + +A tarball with the include files and library can then be found in ``bazel-bin`` + +Pre CXX11 ABI Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +To build using the pre-CXX11 ABI use the ``pre_cxx11_abi`` config + +.. code-block:: shell + + bazel build //:libtorchtrt --config pre_cxx11_abi -c [dbg/opt] + +**Building the Python package** +-------------------------------- + +Begin by installing ``ninja`` + +You can build the Python package using ``setup.py`` (this will also build the correct version of ``libtorchtrt.so``) + +.. code-block:: shell + + python3 setup.py [install/bdist_wheel] + +Debug Build +^^^^^^^^^^^^ + +.. code-block:: shell + + python3 setup.py develop [--user] + +This also compiles a debug build of ``libtorchtrt.so`` + +**Building Natively on aarch64 (Jetson)** +------------------------------------------- + +Prerequisites +^^^^^^^^^^^^^^ + +Install or compile a build of PyTorch/LibTorch for aarch64 + +NVIDIA hosts builds the latest release branch for Jetson here: + + https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-10-now-available/72048 + + +Enviorment Setup +^^^^^^^^^^^^^^^^^ + +To build natively on aarch64-linux-gnu platform, configure the ``WORKSPACE`` with local available dependencies. + +1. Disable the rules with ``http_archive`` for x86_64 by commenting the following rules: + +.. code-block:: shell + + #http_archive( + # name = "libtorch", + # build_file = "@//third_party/libtorch:BUILD", + # strip_prefix = "libtorch", + # urls = ["https://download.pytorch.org/libtorch/cu102/libtorch-cxx11-abi-shared-with-deps-1.5.1.zip"], + # sha256 = "cf0691493d05062fe3239cf76773bae4c5124f4b039050dbdd291c652af3ab2a" + #) + + #http_archive( + # name = "libtorch_pre_cxx11_abi", + # build_file = "@//third_party/libtorch:BUILD", + # strip_prefix = "libtorch", + # sha256 = "818977576572eadaf62c80434a25afe44dbaa32ebda3a0919e389dcbe74f8656", + # urls = ["https://download.pytorch.org/libtorch/cu102/libtorch-shared-with-deps-1.5.1.zip"], + #) + + # Download these tarballs manually from the NVIDIA website + # Either place them in the distdir directory in third_party and use the --distdir flag + # or modify the urls to "file:////.tar.gz + + #http_archive( + # name = "cudnn", + # urls = ["https://developer.nvidia.com/compute/machine-learning/cudnn/secure/8.0.1.13/10.2_20200626/cudnn-10.2-linux-x64-v8.0.1.13.tgz"], + # build_file = "@//third_party/cudnn/archive:BUILD", + # sha256 = "0c106ec84f199a0fbcf1199010166986da732f9b0907768c9ac5ea5b120772db", + # strip_prefix = "cuda" + #) + + #http_archive( + # name = "tensorrt", + # urls = ["https://developer.nvidia.com/compute/machine-learning/tensorrt/secure/7.1/tars/TensorRT-7.1.3.4.Ubuntu-18.04.x86_64-gnu.cuda-10.2.cudnn8.0.tar.gz"], + # build_file = "@//third_party/tensorrt/archive:BUILD", + # sha256 = "9205bed204e2ae7aafd2e01cce0f21309e281e18d5bfd7172ef8541771539d41", + # strip_prefix = "TensorRT-7.1.3.4" + #) + + NOTE: You may also need to configure the CUDA version to 10.2 by setting the path for the cuda new_local_repository + + +2. Configure the correct paths to directory roots containing local dependencies in the ``new_local_repository`` rules: + + NOTE: If you installed PyTorch using a pip package, the correct path is the path to the root of the python torch package. + In the case that you installed with ``sudo pip install`` this will be ``/usr/local/lib/python3.6/dist-packages/torch``. + In the case you installed with ``pip install --user`` this will be ``$HOME/.local/lib/python3.6/site-packages/torch``. + +In the case you are using NVIDIA compiled pip packages, set the path for both libtorch sources to the same path. This is because unlike +PyTorch on x86_64, NVIDIA aarch64 PyTorch uses the CXX11-ABI. If you compiled for source using the pre_cxx11_abi and only would like to +use that library, set the paths to the same path but when you compile make sure to add the flag ``--config=pre_cxx11_abi`` + +.. code-block:: shell + + new_local_repository( + name = "libtorch", + path = "/usr/local/lib/python3.6/dist-packages/torch", + build_file = "third_party/libtorch/BUILD" + ) + + new_local_repository( + name = "libtorch_pre_cxx11_abi", + path = "/usr/local/lib/python3.6/dist-packages/torch", + build_file = "third_party/libtorch/BUILD" + ) + + new_local_repository( + name = "cudnn", + path = "/usr/", + build_file = "@//third_party/cudnn/local:BUILD" + ) + + new_local_repository( + name = "tensorrt", + path = "/usr/", + build_file = "@//third_party/tensorrt/local:BUILD" + ) + +Compile C++ Library and Compiler CLI +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + NOTE: Due to shifting dependency locations between Jetpack 4.5 and 4.6 there is a now a flag to inform bazel of the Jetpack version + + .. code-block:: shell + + --platforms //toolchains:jetpack_4.x + + +Compile Torch-TensorRT library using bazel command: + +.. code-block:: shell + + bazel build //:libtorchtrt --platforms //toolchains:jetpack_4.6 + +Compile Python API +^^^^^^^^^^^^^^^^^^^^ + + NOTE: Due to shifting dependencies locations between Jetpack 4.5 and Jetpack 4.6 there is now a flag for ``setup.py`` which sets the jetpack version (default: 4.6) + +Compile the Python API using the following command from the ``//py`` directory: + +.. code-block:: shell + + python3 setup.py install --use-cxx11-abi + +If you have a build of PyTorch that uses Pre-CXX11 ABI drop the ``--use-cxx11-abi`` flag + +If you are building for Jetpack 4.5 add the ``--jetpack-version 4.5`` flag diff --git a/docs/v1.1.1/_sources/tutorials/notebooks.rst.txt b/docs/v1.1.1/_sources/tutorials/notebooks.rst.txt new file mode 100644 index 0000000000..df903fc353 --- /dev/null +++ b/docs/v1.1.1/_sources/tutorials/notebooks.rst.txt @@ -0,0 +1,154 @@ +.. _notebooks: + +Example notebooks +=================== + +There exists a number of notebooks which cover specific using specific features and models +with Torch-TensorRT + +Notebooks +------------ + +Compiling CitriNet with Torch-TensorRT +******************************************** + +Citrinet is an acoustic model used for the speech to text recognition task. It is a version +of QuartzNet that extends ContextNet, utilizing subword encoding (via Word Piece tokenization) +and Squeeze-and-Excitation(SE) mechanism and are therefore smaller than QuartzNet models. CitriNet +models take in audio segments and transcribe them to letter, byte pair, or word piece sequences. + +This notebook demonstrates the steps for optimizing a pretrained CitriNet model with Torch-TensorRT, +and running it to test the speedup obtained. + +* `Torch-TensorRT Getting Started - CitriNet `_ + + +Compiling EfficentNet with Torch-TensorRT +******************************************** + +EfficentNet is a feedforward CNN designed to achieve better performance and accuracy than alternative architectures +by using a "scaling method that uniformly scales all dimensions of depth/width/resolution using a simple yet highly effective compound coefficient". + +This notebook demonstrates the steps for optimizing a pretrained EfficentNet model with Torch-TensorRT, +and running it to test the speedup obtained. + +* `Torch-TensorRT Getting Started - EfficientNet-B0 `_ + + +Masked Language Modeling (MLM) with Hugging Face BERT Transformer accelerated by Torch-TensorRT +************************************************************************************************* + +"BERT is a transformer model pretrained on a large corpus of English data in a self-supervised fashion. +This way, the model learns an inner representation of the English language that can then be used to extract +features useful for downstream tasks: if you have a dataset of labeled sentences for instance, you can train +a standard classifier using the features produced by the BERT model as inputs." (https://huggingface.co/bert-base-uncased) + +This notebook demonstrates the steps for optimizing a pretrained EfficentNet model with Torch-TensorRT, +and running it to test the speedup obtained. + +* `Masked Language Modeling (MLM) with Hugging Face BERT Transformer `_ + + +Serving a model in C++ using Torch-TensorRT +********************************************** + +This example shows how you can load a pretrained ResNet-50 model, convert it to a Torch-TensorRT +optimized model (via the Torch-TensorRT Python API), save the model as a torchscript module, and +then finally load and serve the model with the PyTorch C++ API. + +* `ResNet C++ Serving Example `_ + + +Compiling ResNet50 with Torch-TensorRT +******************************************** + +This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a +pretrained ResNet-50 network, and running it to test the speedup obtained. + +* `Torch-TensorRT Getting Started - ResNet 50 `_ + + +Using Dynamic Shapes with Torch-TensorRT +******************************************** + +Making use of Dynamic Shaped Tensors in Torch TensorRT is quite simple. Let's say you are +using the ``torch_tensorrt.compile(...)`` function to compile a torchscript module. One +of the args in this function in this function is ``input``: which defines an input to a +module in terms of expected shape, data type and tensor format: ``torch_tensorrt.Input.`` + +For the purposes of this walkthrough we just need three kwargs: `min_shape`, `opt_shape`` and `max_shape`. + +.. code-block:: py + + torch_tensorrt.Input( + min_shape=(1, 224, 224, 3), + opt_shape=(1, 512, 512, 3), + max_shape=(1, 1024, 1024, 3), + dtype=torch.int32 + format=torch.channel_last + ) + ... + +In this example, we are going to use a simple ResNet model to demonstrate the use of the API. + +* `Torch-TensorRT - Using Dynamic Shapes `_ + +Using the FX Frontend with Torch-TensorRT +******************************************** + +The purpose of this example is to demostrate the overall flow of lowering a PyTorch model to TensorRT +conveniently with using FX. + +* `Using the FX Frontend with Torch-TensorRT `_ + + +Compiling a PyTorch model using FX Frontend with Torch-TensorRT +******************************************************************* + +The purpose of this example is to demonstrate the overall flow of lowering a PyTorch +model to TensorRT via FX with existing FX based tooling + +* `Compiling a PyTorch model using FX Frontend with Torch-TensorRT `_ + + +Compiling LeNet with Torch-TensorRT +******************************************************************* + +This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a simple LeNet network. + +* `Torch-TensorRT Getting Started - LeNet `_ + + +Accelerate Deep Learning Models using Quantization in Torch-TensorRT +******************************************************************* + +Model Quantization is a popular way of optimization which reduces the size of models thereby +accelerating inference, also opening up the possibilities of deployments on devices with lower +computation power such as Jetson. Simply put, quantization is a process of mapping input values + from a larger set to output values in a smaller set. In this notebook, we illustrate the workflow + that you can adopt while quantizing a deep learning model in Torch-TensorRT. The notebook takes + you through an example of Mobilenetv2 for a classification task on a subset of Imagenet Dataset + called Imagenette which has 10 classes. + +* `Accelerate Deep Learning Models using Quantization in Torch-TensorRT `_ + + +Object Detection with Torch-TensorRT (SSD) +******************************************************************* + +This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained SSD network, and running it to test the speedup obtained. + +* `Object Detection with Torch-TensorRT (SSD) `_ + + +Deploying Quantization Aware Trained models in INT8 using Torch-TensorRT +***************************************************************************** + +Quantization Aware training (QAT) simulates quantization during training by +quantizing weights and activation layers. This will help to reduce the loss in +accuracy when we convert the network trained in FP32 to INT8 for faster inference. +QAT introduces additional nodes in the graph which will be used to learn the dynamic +ranges of weights and activation layers. In this notebook, we illustrate the following +steps from training to inference of a QAT model in Torch-TensorRT. + +* `Deploying Quantization Aware Trained models in INT8 using Torch-TensorRT `_ diff --git a/docs/v1.1.1/_sources/tutorials/ptq.rst.txt b/docs/v1.1.1/_sources/tutorials/ptq.rst.txt new file mode 100644 index 0000000000..7b7617289b --- /dev/null +++ b/docs/v1.1.1/_sources/tutorials/ptq.rst.txt @@ -0,0 +1,210 @@ +.. _ptq: + +Post Training Quantization (PTQ) +================================= + +Post Training Quantization (PTQ) is a technique to reduce the required computational resources for inference +while still preserving the accuracy of your model by mapping the traditional FP32 activation space to a reduced +INT8 space. TensorRT uses a calibration step which executes your model with sample data from the target domain +and track the activations in FP32 to calibrate a mapping to INT8 that minimizes the information loss between +FP32 inference and INT8 inference. + +Users writing TensorRT applications are required to setup a calibrator class which will provide sample data to +the TensorRT calibrator. With Torch-TensorRT we look to leverage existing infrastructure in PyTorch to make implementing +calibrators easier. + +LibTorch provides a ``DataLoader`` and ``Dataset`` API which steamlines preprocessing and batching input data. +These APIs are exposed via both C++ and Python interface which makes it easier for the end user. +For C++ interface, we use ``torch::Dataset`` and ``torch::data::make_data_loader`` objects to construct and perform pre-processing on datasets. +The equivalent functionality in python interface uses ``torch.utils.data.Dataset`` and ``torch.utils.data.DataLoader``. +This section of the PyTorch documentation has more information https://pytorch.org/tutorials/advanced/cpp_frontend.html#loading-data and https://pytorch.org/tutorials/recipes/recipes/loading_data_recipe.html. +Torch-TensorRT uses Dataloaders as the base of a generic calibrator implementation. So you will be able to reuse or quickly +implement a ``torch::Dataset`` for your target domain, place it in a DataLoader and create a INT8 Calibrator +which you can provide to Torch-TensorRT to run INT8 Calibration during compliation of your module. + +.. _writing_ptq_cpp: + +How to create your own PTQ application in C++ +----------------------------------------------- + +Here is an example interface of a ``torch::Dataset`` class for CIFAR10: + +.. code-block:: c++ + :linenos: + + //cpp/ptq/datasets/cifar10.h + #pragma once + + #include "torch/data/datasets/base.h" + #include "torch/data/example.h" + #include "torch/types.h" + + #include + #include + + namespace datasets { + // The CIFAR10 Dataset + class CIFAR10 : public torch::data::datasets::Dataset { + public: + // The mode in which the dataset is loaded + enum class Mode { kTrain, kTest }; + + // Loads CIFAR10 from un-tarred file + // Dataset can be found https://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz + // Root path should be the directory that contains the content of tarball + explicit CIFAR10(const std::string& root, Mode mode = Mode::kTrain); + + // Returns the pair at index in the dataset + torch::data::Example<> get(size_t index) override; + + // The size of the dataset + c10::optional size() const override; + + // The mode the dataset is in + bool is_train() const noexcept; + + // Returns all images stacked into a single tensor + const torch::Tensor& images() const; + + // Returns all targets stacked into a single tensor + const torch::Tensor& targets() const; + + // Trims the dataset to the first n pairs + CIFAR10&& use_subset(int64_t new_size); + + + private: + Mode mode_; + torch::Tensor images_, targets_; + }; + } // namespace datasets + + +This class's implementation reads from the binary distribution of the CIFAR10 dataset and builds two tensors which hold the images and labels. + +We use a subset of the dataset to use for calibration, since we don't need the the full dataset for effective calibration and calibration does +some take time, then define the preprocessing to apply to the images in the dataset and create a DataLoader from the dataset which will batch the data: + +.. code-block:: c++ + + auto calibration_dataset = datasets::CIFAR10(data_dir, datasets::CIFAR10::Mode::kTest) + .use_subset(320) + .map(torch::data::transforms::Normalize<>({0.4914, 0.4822, 0.4465}, + {0.2023, 0.1994, 0.2010})) + .map(torch::data::transforms::Stack<>()); + auto calibration_dataloader = torch::data::make_data_loader(std::move(calibration_dataset), + torch::data::DataLoaderOptions().batch_size(32) + .workers(2)); + + +Next we create a calibrator from the ``calibration_dataloader`` using the calibrator factory (found in ``torch_tensorrt/ptq.h``): + +.. code-block:: c++ + + #include "torch_tensorrt/ptq.h" + ... + + auto calibrator = torch_tensorrt::ptq::make_int8_calibrator(std::move(calibration_dataloader), calibration_cache_file, true); + +Here we also define a location to write a calibration cache file to which we can use to reuse the calibration data without needing the dataset and whether or not +we should use the cache file if it exists. There also exists a ``torch_tensorrt::ptq::make_int8_cache_calibrator`` factory which creates a calibrator that uses the cache +only for cases where you may do engine building on a machine that has limited storage (i.e. no space for a full dataset) or to have a simpiler deployment application. + +The calibrator factories create a calibrator that inherits from a ``nvinfer1::IInt8Calibrator`` virtual class (``nvinfer1::IInt8EntropyCalibrator2`` by default) which +defines the calibration algorithm used when calibrating. You can explicitly make the selection of calibration algorithm like this: + +.. code-block:: c++ + + // MinMax Calibrator is geared more towards NLP tasks + auto calibrator = torch_tensorrt::ptq::make_int8_calibrator(std::move(calibration_dataloader), calibration_cache_file, true); + +Then all thats required to setup the module for INT8 calibration is to set the following compile settings in the `torch_tensorrt::CompileSpec` struct and compiling the module: + +.. code-block:: c++ + + std::vector> input_shape = {{32, 3, 32, 32}}; + /// Configure settings for compilation + auto compile_spec = torch_tensorrt::CompileSpec({input_shape}); + /// Set operating precision to INT8 + compile_spec.enabled_precisions.insert(torch::kF16); + compile_spec.enabled_precisions.insert(torch::kI8); + /// Use the TensorRT Entropy Calibrator + compile_spec.ptq_calibrator = calibrator; + /// Set a larger workspace (you may get better performace from doing so) + compile_spec.workspace_size = 1 << 28; + + auto trt_mod = torch_tensorrt::CompileGraph(mod, compile_spec); + +If you have an existing Calibrator implementation for TensorRT you may directly set the ``ptq_calibrator`` field with a pointer to your calibrator and it will work as well. +From here not much changes in terms of how to execution works. You are still able to fully use LibTorch as the sole interface for inference. Data should remain +in FP32 precision when it's passed into `trt_mod.forward`. There exists an example application in the Torch-TensorRT demo that takes you from training a VGG16 network on +CIFAR10 to deploying in INT8 with Torch-TensorRT here: https://github.com/NVIDIA/Torch-TensorRT/tree/master/cpp/ptq + +.. _writing_ptq_python: + +How to create your own PTQ application in Python +-------------------------------------------------- + +Torch-TensorRT Python API provides an easy and convenient way to use pytorch dataloaders with TensorRT calibrators. ``DataLoaderCalibrator`` class can be used to create +a TensorRT calibrator by providing desired configuration. The following code demonstrates an example on how to use it + +.. code-block:: python + + testing_dataset = torchvision.datasets.CIFAR10(root='./data', + train=False, + download=True, + transform=transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize((0.4914, 0.4822, 0.4465), + (0.2023, 0.1994, 0.2010)) + ])) + + testing_dataloader = torch.utils.data.DataLoader(testing_dataset, + batch_size=1, + shuffle=False, + num_workers=1) + calibrator = torch_tensorrt.ptq.DataLoaderCalibrator(testing_dataloader, + cache_file='./calibration.cache', + use_cache=False, + algo_type=torch_tensorrt.ptq.CalibrationAlgo.ENTROPY_CALIBRATION_2, + device=torch.device('cuda:0')) + + compile_spec = { + "inputs": [torch_tensorrt.Input((1, 3, 32, 32))], + "enabled_precisions": {torch.float, torch.half, torch.int8}, + "calibrator": calibrator, + "device": { + "device_type": torch_tensorrt.DeviceType.GPU, + "gpu_id": 0, + "dla_core": 0, + "allow_gpu_fallback": False, + "disable_tf32": False + } + } + trt_mod = torch_tensorrt.compile(model, compile_spec) + +In the cases where there is a pre-existing calibration cache file that users want to use, ``CacheCalibrator`` can be used without any dataloaders. The following example demonstrates how +to use ``CacheCalibrator`` to use in INT8 mode. + +.. code-block:: python + + calibrator = torch_tensorrt.ptq.CacheCalibrator("./calibration.cache") + + compile_settings = { + "inputs": [torch_tensorrt.Input([1, 3, 32, 32])], + "enabled_precisions": {torch.float, torch.half, torch.int8}, + "calibrator": calibrator, + } + + trt_mod = torch_tensorrt.compile(model, compile_settings) + +If you already have an existing calibrator class (implemented directly using TensorRT API), you can directly set the calibrator field to your class which can be very convenient. +For a demo on how PTQ can be performed on a VGG network using Torch-TensorRT API, you can refer to https://github.com/NVIDIA/Torch-TensorRT/blob/master/tests/py/test_ptq_dataloader_calibrator.py +and https://github.com/NVIDIA/Torch-TensorRT/blob/master/tests/py/test_ptq_trt_calibrator.py + +Citations +^^^^^^^^^^^ + +Krizhevsky, A., & Hinton, G. (2009). Learning multiple layers of features from tiny images. + +Simonyan, K., & Zisserman, A. (2014). Very deep convolutional networks for large-scale image recognition. arXiv preprint arXiv:1409.1556. diff --git a/docs/v1.1.1/_sources/tutorials/runtime.rst.txt b/docs/v1.1.1/_sources/tutorials/runtime.rst.txt new file mode 100644 index 0000000000..77dd2c35b1 --- /dev/null +++ b/docs/v1.1.1/_sources/tutorials/runtime.rst.txt @@ -0,0 +1,36 @@ +.. _runtime: + +Deploying Torch-TensorRT Programs +==================================== + +After compiling and saving Torch-TensorRT programs there is no longer a strict dependency on the full +Torch-TensorRT library. All that is required to run a compiled program is the runtime. There are therfore a couple +options to deploy your programs other than shipping the full Torch-TensorRT compiler with your applications. + +Torch-TensorRT package / libtorchtrt.so +-------------------------------------------- + +Once a program is compiled, you run it using the standard PyTorch APIs. All that is required is that the package +must be imported in python or linked in C++. + +Runtime Library +----------------- + +Distributed with the C++ distribution is ``libtorchtrt_runtime.so``. This library only contains the components +necessary to run Torch-TensorRT programs. Instead of linking ``libtorchtrt.so`` or importing ``torch_tensorrt`` you can +link ``libtorchtrt_runtime.so`` in your deployment programs or use ``DL_OPEN`` or ``LD_PRELOAD``. For python +you can load the runtime with ``torch.ops.load_library("libtorchtrt_runtime.so")``. You can then continue to use +programs just as you would otherwise via PyTorch API. + +.. note:: If you are using the standard distribution of PyTorch in Python on x86, likely you will need the pre-cxx11-abi variant of ``libtorchtrt_runtime.so``, check :ref:`Installation` documentation for more details. + +.. note:: If you are linking ``libtorchtrt_runtime.so``, likely using the following flags will help ``-Wl,--no-as-needed -ltorchtrt -Wl,--as-needed`` as theres no direct symbol dependency to anything in the Torch-TensorRT runtime for most Torch-TensorRT runtime applications + +An example of how to use ``libtorchtrt_runtime.so`` can be found here: https://github.com/NVIDIA/Torch-TensorRT/tree/master/examples/torchtrt_example + +Plugin Library +--------------- + +In the case you use Torch-TensorRT as a converter to a TensorRT engine and your engine uses plugins provided by Torch-TensorRT, Torch-TensorRT +ships the library ``libtorchtrt_plugins.so`` which contains the implementation of the TensorRT plugins used by Torch-TensorRT during +compilation. This library can be ``DL_OPEN`` or ``LD_PRELOAD`` similar to other TensorRT plugin libraries. diff --git a/docs/v1.1.1/_sources/tutorials/serving_torch_tensorrt_with_triton.rst.txt b/docs/v1.1.1/_sources/tutorials/serving_torch_tensorrt_with_triton.rst.txt new file mode 100644 index 0000000000..a713d563c2 --- /dev/null +++ b/docs/v1.1.1/_sources/tutorials/serving_torch_tensorrt_with_triton.rst.txt @@ -0,0 +1,216 @@ +.. _serving_torch_tensorrt_with_triton: + +Serving a Torch-TensorRT model with Triton +========================================== + +Optimization and deployment go hand in hand in a discussion about Machine +Learning infrastructure. Once network level optimzation are done +to get the maximum performance, the next step would be to deploy it. + +However, serving this optimized model comes with it's own set of considerations +and challenges like: building an infrastructure to support concorrent model +executions, supporting clients over HTTP or gRPC and more. + +The `Triton Inference Server `__ +solves the aforementioned and more. Let's discuss step-by-step, the process of +optimizing a model with Torch-TensorRT, deploying it on Triton Inference +Server, and building a client to query the model. + +Step 1: Optimize your model with Torch-TensorRT +----------------------------------------------- + +Most Torch-TensorRT users will be familiar with this step. For the purpose of +this demonstration, we will be using a ResNet50 model from Torchhub. + +Let’s first pull the `NGC PyTorch Docker container `__. You may need to create +an account and get the API key from `here `__. +Sign up and login with your key (follow the instructions +`here `__ after signing up). + +:: + + # is the yy:mm for the publishing tag for NVIDIA's Pytorch + # container; eg. 22.04 + + docker run -it --gpus all -v ${PWD}:/scratch_space nvcr.io/nvidia/pytorch:-py3 + cd /scratch_space + +Once inside the container, we can proceed to download a ResNet model from +Torchhub and optimize it with Torch-TensorRT. + +:: + + import torch + import torch_tensorrt + torch.hub._validate_not_a_forked_repo=lambda a,b,c: True + + # load model + model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True).eval().to("cuda") + + # Compile with Torch TensorRT; + trt_model = torch_tensorrt.compile(model, + inputs= [torch_tensorrt.Input((1, 3, 224, 224))], + enabled_precisions= { torch.half} # Run with FP32 + ) + + # Save the model + torch.jit.save(trt_model, "model.pt") + +After copying the model, exit the container. The next step in the process +is to set up a Triton Inference Server. + +Step 2: Set Up Triton Inference Server +-------------------------------------- + +If you are new to the Triton Inference Server and want to learn more, we +highly recommend to checking our `Github +Repository `__. + +To use Triton, we need to make a model repository. A model repository, as the +name suggested, is a repository of the models the Inference server hosts. While +Triton can serve models from multiple repositories, in this example, we will +discuss the simplest possible form of the model repository. + +The structure of this repository should look something like this: + +:: + + model_repository + | + +-- resnet50 + | + +-- config.pbtxt + +-- 1 + | + +-- model.pt + +There are two files that Triton requires to serve the model: the model itself +and a model configuration file which is typically provided in ``config.pbtxt``. +For the model we prepared in step 1, the following configuration can be used: + +:: + + name: "resnet50" + platform: "pytorch_libtorch" + max_batch_size : 0 + input [ + { + name: "input__0" + data_type: TYPE_FP32 + dims: [ 3, 224, 224 ] + reshape { shape: [ 1, 3, 224, 224 ] } + } + ] + output [ + { + name: "output__0" + data_type: TYPE_FP32 + dims: [ 1, 1000 ,1, 1] + reshape { shape: [ 1, 1000 ] } + } + ] + +The ``config.pbtxt`` file is used to describe the exact model configuration +with details like the names and shapes of the input and output layer(s), +datatypes, scheduling and batching details and more. If you are new to Triton, +we highly encourage you to check out this `section of our +documentation `__ +for more details. + +With the model repository setup, we can proceed to launch the Triton server +with the docker command below. Refer `this page `__ for the pull tag for the container. + +:: + + # Make sure that the TensorRT version in the Triton container + # and TensorRT version in the environment used to optimize the model + # are the same. + + docker run --gpus all --rm -p 8000:8000 -p 8001:8001 -p 8002:8002 -v /full/path/to/the_model_repository/model_repository:/models nvcr.io/nvidia/tritonserver:-py3 tritonserver --model-repository=/models + +This should spin up a Triton Inference server. Next step, building a simple +http client to query the server. + +Step 3: Building a Triton Client to Query the Server +---------------------------------------------------- + +Before proceeding, make sure to have a sample image on hand. If you don't +have one, download an example image to test inference. In this section, we +will be going over a very basic client. For a variety of more fleshed out +examples, refer to the `Triton Client Repository `__ + +:: + + wget -O img1.jpg "https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg" + +We then need to install dependencies for building a python client. These will +change from client to client. For a full list of all languages supported by Triton, +please refer to `Triton's client repository `__. + +:: + + pip install torchvision + pip install attrdict + pip install nvidia-pyindex + pip install tritonclient[all] + +Let's jump into the client. Firstly, we write a small preprocessing function to +resize and normalize the query image. + +:: + + import numpy as np + from torchvision import transforms + from PIL import Image + import tritonclient.http as httpclient + from tritonclient.utils import triton_to_np_dtype + + # preprocessing function + def rn50_preprocess(img_path="img1.jpg"): + img = Image.open(img_path) + preprocess = transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), + ]) + return preprocess(img).numpy() + + transformed_img = rn50_preprocess() + +Building a client requires three basic points. Firstly, we setup a connection +with the Triton Inference Server. + +:: + + # Setting up client + client = httpclient.InferenceServerClient(url="localhost:8000") + +Secondly, we specify the names of the input and output layer(s) of our model. + +:: + + inputs = httpclient.InferInput("input__0", transformed_img.shape, datatype="FP32") + inputs.set_data_from_numpy(transformed_img, binary_data=True) + + outputs = httpclient.InferRequestedOutput("output__0", binary_data=True, class_count=1000) + +Lastly, we send an inference request to the Triton Inference Server. + +:: + + # Querying the server + results = client.infer(model_name="resnet50", inputs=[inputs], outputs=[outputs]) + inference_output = results.as_numpy('output__0') + print(inference_output[:5]) + +The output of the same should look like below: + +:: + + [b'12.468750:90' b'11.523438:92' b'9.664062:14' b'8.429688:136' + b'8.234375:11'] + +The output format here is ``:``. +To learn how to map these to the label names and more, refer to Triton Inference Server's +`documentation `__. diff --git a/docs/v1.1.1/_sources/tutorials/torchtrtc.rst.txt b/docs/v1.1.1/_sources/tutorials/torchtrtc.rst.txt new file mode 100644 index 0000000000..b841c891e5 --- /dev/null +++ b/docs/v1.1.1/_sources/tutorials/torchtrtc.rst.txt @@ -0,0 +1,128 @@ +.. _torchtrtc: + +torchtrtc +================================= + +``torchtrtc`` is a CLI application for using the Torch-TensorRT compiler. It serves as an easy way to compile a +TorchScript Module with Torch-TensorRT from the command-line to quickly check support or as part of +a deployment pipeline. All basic features of the compiler are supported including post training +quantization (though you must already have a calibration cache file to use the PTQ feature). The compiler can +output two formats, either a TorchScript program with the TensorRT engine embedded or +the TensorRT engine itself as a PLAN file. + +All that is required to run the program after compilation is for C++ linking against ``libtorchtrt.so`` +or in Python importing the torch_tensorrt package. All other aspects of using compiled modules are identical +to standard TorchScript. Load with ``torch.jit.load()`` and run like you would run any other module. + +.. code-block:: txt + + torchtrtc [input_file_path] [output_file_path] + [input_specs...] {OPTIONS} + + torchtrtc is a compiler for TorchScript, it will compile and optimize + TorchScript programs to run on NVIDIA GPUs using TensorRT + + OPTIONS: + + -h, --help Display this help menu + Verbiosity of the compiler + -v, --verbose Dumps debugging information about the + compilation process onto the console + -w, --warnings Disables warnings generated during + compilation onto the console (warnings + are on by default) + --i, --info Dumps info messages generated during + compilation onto the console + --build-debuggable-engine Creates a debuggable engine + --allow-gpu-fallback (Only used when targeting DLA + (device-type)) Lets engine run layers on + GPU if they are not supported on DLA + --require-full-compilation Require that the model should be fully + compiled to TensorRT or throw an error + --check-method-support=[method_name] + Check the support for end to end + compilation of a specified method in the + TorchScript module + --disable-tf32 Prevent Float32 layers from using the + TF32 data format + --sparse-weights Enable sparsity for weights of conv and + FC layers + -p[precision...], + --enable-precision=[precision...] (Repeatable) Enabling an operating + precision for kernels to use when + building the engine (Int8 requires a + calibration-cache argument) [ float | + float32 | f32 | fp32 | half | float16 | + f16 | fp16 | int8 | i8 | char ] + (default: float) + -d[type], --device-type=[type] The type of device the engine should be + built for [ gpu | dla ] (default: gpu) + --gpu-id=[gpu_id] GPU id if running on multi-GPU platform + (defaults to 0) + --dla-core=[dla_core] DLACore id if running on available DLA + (defaults to 0) + --engine-capability=[capability] The type of device the engine should be + built for [ standard | safety | + dla_standalone ] + --calibration-cache-file=[file_path] + Path to calibration cache file to use + for post training quantization + --teo=[op_name...], + --torch-executed-op=[op_name...] (Repeatable) Operator in the graph that + should always be run in PyTorch for + execution (partial compilation must be + enabled) + --tem=[module_name...], + --torch-executed-mod=[module_name...] + (Repeatable) Module that should always + be run in Pytorch for execution (partial + compilation must be enabled) + --mbs=[num_ops], + --min-block-size=[num_ops] Minimum number of contiguous TensorRT + supported ops to compile a subgraph to + TensorRT + --embed-engine Whether to treat input file as a + serialized TensorRT engine and embed it + into a TorchScript module (device spec + must be provided) + --num-min-timing-iter=[num_iters] Number of minimization timing iterations + used to select kernels + --num-avg-timing-iters=[num_iters] + Number of averaging timing iterations + used to select kernels + --workspace-size=[workspace_size] Maximum size of workspace given to + TensorRT + -t[threshold], + --threshold=[threshold] Maximum acceptable numerical deviation + from standard torchscript output + (default 2e-5) + --no-threshold-check Skip checking threshold compliance + --truncate-long-double, + --truncate, --truncate-64bit Truncate weights that are provided in + 64bit to 32bit (Long, Double to Int, + Float) + --save-engine Instead of compiling a full a + TorchScript program, save the created + engine to the path specified as the + output path + input_file_path Path to input TorchScript file + output_file_path Path for compiled TorchScript (or + TensorRT engine) file + input_specs... Specs for inputs to engine, can either + be a single size or a range defined by + Min, Optimal, Max sizes, e.g. + "(N,..,C,H,W)" + "[(MIN_N,..,MIN_C,MIN_H,MIN_W);(OPT_N,..,OPT_C,OPT_H,OPT_W);(MAX_N,..,MAX_C,MAX_H,MAX_W)]". + Data Type and format can be specified by + adding an "@" followed by dtype and "%" + followed by format to the end of the + shape spec. e.g. "(3, 3, 32, + 32)@f16%NHWC" + "--" can be used to terminate flag options and force all following + arguments to be treated as positional options + +e.g. + +.. code-block:: shell + + torchtrtc tests/modules/ssd_traced.jit.pt ssd_trt.ts "[(1,3,300,300); (1,3,512,512); (1, 3, 1024, 1024)]@f16%contiguous" -p f16 diff --git a/docs/v1.1.1/_sources/tutorials/use_from_pytorch.rst.txt b/docs/v1.1.1/_sources/tutorials/use_from_pytorch.rst.txt new file mode 100644 index 0000000000..0c616e9414 --- /dev/null +++ b/docs/v1.1.1/_sources/tutorials/use_from_pytorch.rst.txt @@ -0,0 +1,64 @@ +.. _use_from_pytorch: + +Using Torch-TensorRT Directly From PyTorch +============================================ + +You will now be able to directly access TensorRT from PyTorch APIs. The process to use this feature +is very similar to the compilation workflow described in :ref:`getting_started_with_python_api` + +Start by loading ``torch_tensorrt`` into your application. + +.. code-block:: python + + import torch + import torch_tensorrt + + +Then given a TorchScript module, you can compile it with TensorRT using the ``torch._C._jit_to_backend("tensorrt", ...)`` API. + +.. code-block:: python + + import torchvision.models as models + + model = models.mobilenet_v2(pretrained=True) + script_model = torch.jit.script(model) + +Unlike the ``compile`` API in Torch-TensorRT which assumes you are trying to compile the ``forward`` function of a module +or the ``convert_method_to_trt_engine`` which converts a specified function to a TensorRT engine, the backend API +will take a dictionary which maps names of functions to compile to Compilation Spec objects which wrap the same +sort of dictionary you would provide to ``compile``. For more information on the compile spec dictionary take a look +at the documentation for the Torch-TensorRT ``TensorRTCompileSpec`` API. + +.. code-block:: python + + spec = { + "forward": + torch_tensorrt.ts.TensorRTCompileSpec({ + "inputs": [torch_tensorrt.Input([1, 3, 300, 300])], + "enabled_precisions": {torch.float, torch.half}, + "refit": False, + "debug": False, + "device": { + "device_type": torch_tensorrt.DeviceType.GPU, + "gpu_id": 0, + "dla_core": 0, + "allow_gpu_fallback": True + }, + "capability": torch_tensorrt.EngineCapability.default, + "num_min_timing_iters": 2, + "num_avg_timing_iters": 1, + }) + } + +Now to compile with Torch-TensorRT, provide the target module objects and the spec dictionary to ``torch._C._jit_to_backend("tensorrt", ...)`` + +.. code-block:: python + + trt_model = torch._C._jit_to_backend("tensorrt", script_model, spec) + +To run explicitly call the function of the method you want to run (vs. how you can just call on the module itself in standard PyTorch) + +.. code-block:: python + + input = torch.randn((1, 3, 300, 300)).to("cuda").to(torch.half) + print(trt_model.forward(input)) diff --git a/docs/v1.1.1/_sources/tutorials/using_dla.rst.txt b/docs/v1.1.1/_sources/tutorials/using_dla.rst.txt new file mode 100644 index 0000000000..ab40b942b3 --- /dev/null +++ b/docs/v1.1.1/_sources/tutorials/using_dla.rst.txt @@ -0,0 +1,50 @@ +.. _using_dla: + +DLA +================================= + +``DLA`` NVIDIA Deep Learning Accelerator is a fixed-function accelerator engine targeted for deep learning operations. DLA is designed to do full hardware acceleration of convolutional neural networks. DLA supports various layers such as convolution, deconvolution, fully-connected, activation, pooling, batch normalization, etc. ``torch_tensorrt`` supports compilation of TorchScript Module and deployment pipeline on the DLA hardware available on NVIDIA embedded platforms. + +NOTE: DLA supports fp16 and int8 precision only. + +Using DLA with torchtrtc + +.. code-block:: shell + + torchtrtc [input_file_path] [output_file_path] [input_shapes...] -p f16 -d dla {OPTIONS} + +Using DLA in a C++ application + +.. code-block:: c++ + + std::vector> input_shape = {{32, 3, 32, 32}}; + auto compile_spec = torch_tensorrt::CompileSpec({input_shape}); + + # Set a precision. DLA supports fp16 or int8 only + compile_spec.enabled_precisions = {torch::kF16}; + compile_spec.device.device_type = torch_tensorrt::CompileSpec::DeviceType::kDLA; + + # Make sure the gpu id is set to Xavier id for DLA + compile_spec.device.gpu_id = 0; + + # Set the DLA core id + compile_spec.device.dla_core = 1; + + # If a layer fails to run on DLA it will fallback to GPU + compile_spec.device.allow_gpu_fallback = true; + + # Set the workspace size + compile_spec.workspace_size = 1 << 28; + + +Using DLA in a python application + +.. code-block:: python + + compile_spec = { + "inputs": [torch_tensorrt.Input(self.input.shape)], + "device": torch_tensorrt.Device("dla:0", allow_gpu_fallback=True), + "enalbed_precisions": {torch.half} + } + + trt_mod = torch_tensorrt.compile(self.scripted_model, compile_spec) diff --git a/docs/v1.1.1/_static/basic.css b/docs/v1.1.1/_static/basic.css new file mode 100644 index 0000000000..7630a0c5ee --- /dev/null +++ b/docs/v1.1.1/_static/basic.css @@ -0,0 +1 @@ +@charset "utf-8"; div.clearer{clear:both}div.section::after{display:block;content:'';clear:left}div.related{width:100%;font-size:90%}div.related h3{display:none}div.related ul{margin:0;padding:0 0 0 10px;list-style:none}div.related li{display:inline}div.related li.right{float:right;margin-right:5px}div.sphinxsidebarwrapper{padding:10px 5px 0 10px}div.sphinxsidebar{float:left;width:230px;margin-left:-100%;font-size:90%;word-wrap:break-word;overflow-wrap:break-word}div.sphinxsidebar ul{list-style:none}div.sphinxsidebar ul ul,div.sphinxsidebar ul.want-points{margin-left:20px;list-style:square}div.sphinxsidebar ul ul{margin-top:0;margin-bottom:0}div.sphinxsidebar form{margin-top:10px}div.sphinxsidebar input{border:1px solid #98dbcc;font-family:sans-serif;font-size:1em}div.sphinxsidebar #searchbox form.search{overflow:hidden}div.sphinxsidebar #searchbox input[type=text]{float:left;width:80%;padding:.25em;box-sizing:border-box}div.sphinxsidebar #searchbox input[type=submit]{float:left;width:20%;border-left:none;padding:.25em;box-sizing:border-box}img{border:0;max-width:100%}ul.search{margin:10px 0 0 20px;padding:0}ul.search li{padding:5px 0 5px 20px;background-image:url(file.png);background-repeat:no-repeat;background-position:0 7px}ul.search li a{font-weight:bold}ul.search li div.context{color:#888;margin:2px 0 0 30px;text-align:left}ul.keywordmatches li.goodmatch a{font-weight:bold}table.contentstable{width:90%;margin-left:auto;margin-right:auto}table.contentstable p.biglink{line-height:150%}a.biglink{font-size:1.3em}span.linkdescr{font-style:italic;padding-top:5px;font-size:90%}table.indextable{width:100%}table.indextable td{text-align:left;vertical-align:top}table.indextable ul{margin-top:0;margin-bottom:0;list-style-type:none}table.indextable>tbody>tr>td>ul{padding-left:0}table.indextable tr.pcap{height:10px}table.indextable tr.cap{margin-top:10px;background-color:#f2f2f2}img.toggler{margin-right:3px;margin-top:3px;cursor:pointer}div.modindex-jumpbox{border-top:1px solid #ddd;border-bottom:1px solid #ddd;margin:1em 0 1em 0;padding:.4em}div.genindex-jumpbox{border-top:1px solid #ddd;border-bottom:1px solid #ddd;margin:1em 0 1em 0;padding:.4em}table.modindextable td{padding:2px;border-collapse:collapse}div.body{min-width:450px;max-width:800px}div.body p,div.body dd,div.body li,div.body blockquote{-moz-hyphens:auto;-ms-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}a.headerlink{visibility:hidden}a.brackets:before,span.brackets>a:before{content:"["}a.brackets:after,span.brackets>a:after{content:"]"}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink,dt:hover>a.headerlink,caption:hover>a.headerlink,p.caption:hover>a.headerlink,div.code-block-caption:hover>a.headerlink{visibility:visible}div.body p.caption{text-align:inherit}div.body td{text-align:left}.first{margin-top:0 !important}p.rubric{margin-top:30px;font-weight:bold}img.align-left,.figure.align-left,object.align-left{clear:left;float:left;margin-right:1em}img.align-right,.figure.align-right,object.align-right{clear:right;float:right;margin-left:1em}img.align-center,.figure.align-center,object.align-center{display:block;margin-left:auto;margin-right:auto}img.align-default,.figure.align-default{display:block;margin-left:auto;margin-right:auto}.align-left{text-align:left}.align-center{text-align:center}.align-default{text-align:center}.align-right{text-align:right}div.sidebar{margin:0 0 .5em 1em;border:1px solid #ddb;padding:7px;background-color:#ffe;width:40%;float:right;clear:right;overflow-x:auto}p.sidebar-title{font-weight:bold}div.admonition,div.topic,blockquote{clear:left}div.topic{border:1px solid #ccc;padding:7px;margin:10px 0 10px 0}p.topic-title{font-size:1.1em;font-weight:bold;margin-top:10px}div.admonition{margin-top:10px;margin-bottom:10px;padding:7px}div.admonition dt{font-weight:bold}p.admonition-title{margin:0 10px 5px 0;font-weight:bold}div.body p.centered{text-align:center;margin-top:25px}div.sidebar>:last-child,div.topic>:last-child,div.admonition>:last-child{margin-bottom:0}div.sidebar::after,div.topic::after,div.admonition::after,blockquote::after{display:block;content:'';clear:both}table.docutils{margin-top:10px;margin-bottom:10px;border:0;border-collapse:collapse}table.align-center{margin-left:auto;margin-right:auto}table.align-default{margin-left:auto;margin-right:auto}table caption span.caption-number{font-style:italic}table caption span.caption-text{}table.docutils td,table.docutils th{padding:1px 8px 1px 5px;border-top:0;border-left:0;border-right:0;border-bottom:1px solid #aaa}table.footnote td,table.footnote th{border:0 !important}th{text-align:left;padding-right:5px}table.citation{border-left:solid 1px gray;margin-left:1px}table.citation td{border-bottom:none}th>:first-child,td>:first-child{margin-top:0}th>:last-child,td>:last-child{margin-bottom:0}div.figure{margin:.5em;padding:.5em}div.figure p.caption{padding:.3em}div.figure p.caption span.caption-number{font-style:italic}div.figure p.caption span.caption-text{}table.field-list td,table.field-list th{border:0 !important}.field-list ul{margin:0;padding-left:1em}.field-list p{margin:0}.field-name{-moz-hyphens:manual;-ms-hyphens:manual;-webkit-hyphens:manual;hyphens:manual}table.hlist{margin:1em 0}table.hlist td{vertical-align:top}ol.arabic{list-style:decimal}ol.loweralpha{list-style:lower-alpha}ol.upperalpha{list-style:upper-alpha}ol.lowerroman{list-style:lower-roman}ol.upperroman{list-style:upper-roman}:not(li)>ol>li:first-child>:first-child,:not(li)>ul>li:first-child>:first-child{margin-top:0}:not(li)>ol>li:last-child>:last-child,:not(li)>ul>li:last-child>:last-child{margin-bottom:0}ol.simple ol p,ol.simple ul p,ul.simple ol p,ul.simple ul p{margin-top:0}ol.simple>li:not(:first-child)>p,ul.simple>li:not(:first-child)>p{margin-top:0}ol.simple p,ul.simple p{margin-bottom:0}dl.footnote>dt,dl.citation>dt{float:left;margin-right:.5em}dl.footnote>dd,dl.citation>dd{margin-bottom:0}dl.footnote>dd:after,dl.citation>dd:after{content:"";clear:both}dl.field-list{display:grid;grid-template-columns:fit-content(30%) auto}dl.field-list>dt{font-weight:bold;word-break:break-word;padding-left:.5em;padding-right:5px}dl.field-list>dt:after{content:":"}dl.field-list>dd{padding-left:.5em;margin-top:0;margin-left:0;margin-bottom:0}dl{margin-bottom:15px}dd>:first-child{margin-top:0}dd ul,dd table{margin-bottom:10px}dd{margin-top:3px;margin-bottom:10px;margin-left:30px}dl>dd:last-child,dl>dd:last-child>:last-child{margin-bottom:0}dt:target,span.highlighted{background-color:#fbe54e}rect.highlighted{fill:#fbe54e}dl.glossary dt{font-weight:bold;font-size:1.1em}.optional{font-size:1.3em}.sig-paren{font-size:larger}.versionmodified{font-style:italic}.system-message{background-color:#fda;padding:5px;border:3px solid red}.footnote:target{background-color:#ffa}.line-block{display:block;margin-top:1em;margin-bottom:1em}.line-block .line-block{margin-top:0;margin-bottom:0;margin-left:1.5em}.guilabel,.menuselection{font-family:sans-serif}.accelerator{text-decoration:underline}.classifier{font-style:oblique}.classifier:before{font-style:normal;margin:.5em;content:":"}abbr,acronym{border-bottom:dotted 1px;cursor:help}pre{overflow:auto;overflow-y:hidden}pre,div[class|="highlight"]{clear:both}span.pre{-moz-hyphens:none;-ms-hyphens:none;-webkit-hyphens:none;hyphens:none}div[class^="highlight-"]{margin:1em 0}td.linenos pre{border:0;background-color:transparent;color:#aaa}table.highlighttable{display:block}table.highlighttable tbody{display:block}table.highlighttable tr{display:flex}table.highlighttable td{margin:0;padding:0}table.highlighttable td.linenos{padding-right:.5em}table.highlighttable td.code{flex:1;overflow:hidden}.highlight .hll{display:block}div.highlight pre,table.highlighttable pre{margin:0}div.code-block-caption + div{margin-top:0}div.code-block-caption{margin-top:1em;padding:2px 5px;font-size:small}div.code-block-caption code{background-color:transparent}table.highlighttable td.linenos,div.doctest>div.highlight span.gp{user-select:none}div.code-block-caption span.caption-number{padding:.1em .3em;font-style:italic}div.code-block-caption span.caption-text{}div.literal-block-wrapper{margin:1em 0}code.descname{background-color:transparent;font-weight:bold;font-size:1.2em}code.descclassname{background-color:transparent}code.xref,a code{background-color:transparent;font-weight:bold}h1 code,h2 code,h3 code,h4 code,h5 code,h6 code{background-color:transparent}.viewcode-link{float:right}.viewcode-back{float:right;font-family:sans-serif}div.viewcode-block:target{margin:-1px -10px;padding:0 10px}img.math{vertical-align:middle}div.body div.math p{text-align:center}span.eqno{float:right}span.eqno a.headerlink{position:absolute;z-index:1}div.math:hover a.headerlink{visibility:visible}@media print{div.document,div.documentwrapper,div.bodywrapper{margin:0 !important;width:100%}div.sphinxsidebar,div.related,div.footer,#top-link{display:none}} \ No newline at end of file diff --git a/docs/v1.1.1/_static/collapsible-lists/LICENSE.md b/docs/v1.1.1/_static/collapsible-lists/LICENSE.md new file mode 100644 index 0000000000..ef81a64535 --- /dev/null +++ b/docs/v1.1.1/_static/collapsible-lists/LICENSE.md @@ -0,0 +1,7 @@ +This code is the fruit of Kate Morley's labor, taken from here: + +- http://code.iamkate.com/javascript/collapsible-lists/ + +She includes a generous CC0 1.0 license for all materials on her site: + +- http://code.iamkate.com/ diff --git a/docs/v1.1.1/_static/collapsible-lists/css/button-closed.png b/docs/v1.1.1/_static/collapsible-lists/css/button-closed.png new file mode 100644 index 0000000000..417eb2fc40 Binary files /dev/null and b/docs/v1.1.1/_static/collapsible-lists/css/button-closed.png differ diff --git a/docs/v1.1.1/_static/collapsible-lists/css/button-open.png b/docs/v1.1.1/_static/collapsible-lists/css/button-open.png new file mode 100644 index 0000000000..ac4a6ef32a Binary files /dev/null and b/docs/v1.1.1/_static/collapsible-lists/css/button-open.png differ diff --git a/docs/v1.1.1/_static/collapsible-lists/css/button.png b/docs/v1.1.1/_static/collapsible-lists/css/button.png new file mode 100644 index 0000000000..631d734d13 Binary files /dev/null and b/docs/v1.1.1/_static/collapsible-lists/css/button.png differ diff --git a/docs/v1.1.1/_static/collapsible-lists/css/list-item-contents.png b/docs/v1.1.1/_static/collapsible-lists/css/list-item-contents.png new file mode 100644 index 0000000000..bc082929dc Binary files /dev/null and b/docs/v1.1.1/_static/collapsible-lists/css/list-item-contents.png differ diff --git a/docs/v1.1.1/_static/collapsible-lists/css/list-item-last-open.png b/docs/v1.1.1/_static/collapsible-lists/css/list-item-last-open.png new file mode 100644 index 0000000000..cf4cf9bdb9 Binary files /dev/null and b/docs/v1.1.1/_static/collapsible-lists/css/list-item-last-open.png differ diff --git a/docs/v1.1.1/_static/collapsible-lists/css/list-item-last.png b/docs/v1.1.1/_static/collapsible-lists/css/list-item-last.png new file mode 100644 index 0000000000..1eb1c64a25 Binary files /dev/null and b/docs/v1.1.1/_static/collapsible-lists/css/list-item-last.png differ diff --git a/docs/v1.1.1/_static/collapsible-lists/css/list-item-open.png b/docs/v1.1.1/_static/collapsible-lists/css/list-item-open.png new file mode 100644 index 0000000000..0889c801a9 Binary files /dev/null and b/docs/v1.1.1/_static/collapsible-lists/css/list-item-open.png differ diff --git a/docs/v1.1.1/_static/collapsible-lists/css/list-item-root.png b/docs/v1.1.1/_static/collapsible-lists/css/list-item-root.png new file mode 100644 index 0000000000..874417106a Binary files /dev/null and b/docs/v1.1.1/_static/collapsible-lists/css/list-item-root.png differ diff --git a/docs/v1.1.1/_static/collapsible-lists/css/list-item.png b/docs/v1.1.1/_static/collapsible-lists/css/list-item.png new file mode 100644 index 0000000000..81934f9b82 Binary files /dev/null and b/docs/v1.1.1/_static/collapsible-lists/css/list-item.png differ diff --git a/docs/v1.1.1/_static/collapsible-lists/css/tree_view.css b/docs/v1.1.1/_static/collapsible-lists/css/tree_view.css new file mode 100644 index 0000000000..03fb9d19e4 --- /dev/null +++ b/docs/v1.1.1/_static/collapsible-lists/css/tree_view.css @@ -0,0 +1 @@ +@charset "utf-8"; .treeView{-moz-user-select:none;position:relative}.treeView ul{margin:0 0 0 -1.5em !important;padding:0 0 0 1.5em !important}.treeView ul ul{background:url(list-item-contents.png) repeat-y left !important}.treeView li.lastChild>ul{background-image:none !important}.treeView li{margin:0 !important;padding:0 !important;background:url(list-item-root.png) no-repeat top left !important;list-style-position:inside !important;list-style-image:url(button.png) !important;cursor:auto}.treeView li.collapsibleListOpen{list-style-image:url(button-open.png) !important;cursor:pointer}.treeView li.collapsibleListClosed{list-style-image:url(button-closed.png) !important;cursor:pointer}.treeView li li{background-image:url(list-item.png) !important;padding-left:1.5em !important}.treeView li.lastChild{background-image:url(list-item-last.png) !important}.treeView li.collapsibleListOpen{background-image:url(list-item-open.png) !important}.treeView li.collapsibleListOpen.lastChild{background-image:url(list-item-last-open.png) !important} \ No newline at end of file diff --git a/docs/v1.1.1/_static/collapsible-lists/js/CollapsibleLists.compressed.js b/docs/v1.1.1/_static/collapsible-lists/js/CollapsibleLists.compressed.js new file mode 100644 index 0000000000..429406cf39 --- /dev/null +++ b/docs/v1.1.1/_static/collapsible-lists/js/CollapsibleLists.compressed.js @@ -0,0 +1,83 @@ +/* + +CollapsibleLists.js + +An object allowing lists to dynamically expand and collapse + +Created by Kate Morley - http://code.iamkate.com/ - and released under +the terms of the CC0 1.0 Universal legal code: + +http://creativecommons.org/publicdomain/zero/1.0/legalcode + +*/ + +var CollapsibleLists=new function(){ +this.apply=function(_1){ +var _2=document.getElementsByTagName("ul"); +for(var _3=0;_3<_2.length;_3++){ +if(_2[_3].className.match(/(^| )collapsibleList( |$)/)){ +this.applyTo(_2[_3],true); +if(!_1){ +var _4=_2[_3].getElementsByTagName("ul"); +for(var _5=0;_5<_4.length;_5++){ +_4[_5].className+=" collapsibleList"; +} +} +} +} +}; +this.applyTo=function(_6,_7){ +var _8=_6.getElementsByTagName("li"); +for(var _9=0;_9<_8.length;_9++){ +if(!_7||_6==_8[_9].parentNode){ +if(_8[_9].addEventListener){ +_8[_9].addEventListener("mousedown",function(e){ +e.preventDefault(); +},false); +}else{ +_8[_9].attachEvent("onselectstart",function(){ +event.returnValue=false; +}); +} +if(_8[_9].addEventListener){ +_8[_9].addEventListener("click",_a(_8[_9]),false); +}else{ +_8[_9].attachEvent("onclick",_a(_8[_9])); +} +_b(_8[_9]); +} +} +}; +function _a(_c){ +return function(e){ +if(!e){ +e=window.event; +} +var _d=(e.target?e.target:e.srcElement); +while(_d.nodeName!="LI"){ +_d=_d.parentNode; +} +if(_d==_c){ +_b(_c); +} +}; +}; +function _b(_e){ +var _f=_e.className.match(/(^| )collapsibleListClosed( |$)/); +var uls=_e.getElementsByTagName("ul"); +for(var _10=0;_100){ +_e.className+=" collapsibleList"+(_f?"Open":"Closed"); +} +}; +}(); + diff --git a/docs/v1.1.1/_static/collapsible-lists/js/apply-collapsible-lists.js b/docs/v1.1.1/_static/collapsible-lists/js/apply-collapsible-lists.js new file mode 100644 index 0000000000..e848bb9811 --- /dev/null +++ b/docs/v1.1.1/_static/collapsible-lists/js/apply-collapsible-lists.js @@ -0,0 +1,3 @@ +$(document).ready(function() { + CollapsibleLists.apply(); +}); diff --git a/docs/v1.1.1/_static/css/theme.css b/docs/v1.1.1/_static/css/theme.css new file mode 100644 index 0000000000..4756448c98 --- /dev/null +++ b/docs/v1.1.1/_static/css/theme.css @@ -0,0 +1 @@ +@charset "UTF-8";/*!* Bootstrap v4.0.0(https://getbootstrap.com) * Copyright 2011-2018 The Bootstrap Authors * Copyright 2011-2018 Twitter,Inc. * Licensed under MIT(https://github.com/twbs/bootstrap/blob/master/LICENSE) */ :root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,*::before,*::after{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex=-1]:focus{outline:0 !important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):hover,a:not([href]):not([tabindex]):focus{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}pre,code,kbd,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{padding:0;border-style:none}input[type=radio],input[type=checkbox]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}h1,.h1{font-size:2.5rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.75rem}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,0.1)}small,.small{font-size:80%;font-weight:400}mark,.mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*="col-"]{padding-right:0;padding-left:0}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table th,.table td{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody + tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm th,.table-sm td{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered th,.table-bordered td{border:1px solid #dee2e6}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,0.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,0.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>th,.table-success>td{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>th,.table-info>td{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>th,.table-warning>td{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>th,.table-danger>td{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>th,.table-light>td{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>th,.table-dark>td{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,0.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark th,.table-dark td,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,0.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,0.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(0,123,255,0.25);box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.form-control-plaintext.form-control-lg,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.btn{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}select.form-control-sm:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control-lg:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*="col-"]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled ~ .form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,0.8);border-radius:.2rem}.was-validated .form-control:valid,.form-control.is-valid,.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#28a745}.was-validated .form-control:valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#28a745;-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,0.25);box-shadow:0 0 0 .2rem rgba(40,167,69,0.25)}.was-validated .form-control:valid ~ .valid-feedback,.was-validated .form-control:valid ~ .valid-tooltip,.form-control.is-valid ~ .valid-feedback,.form-control.is-valid ~ .valid-tooltip,.was-validated .custom-select:valid ~ .valid-feedback,.was-validated .custom-select:valid ~ .valid-tooltip,.custom-select.is-valid ~ .valid-feedback,.custom-select.is-valid ~ .valid-tooltip{display:block}.was-validated .form-check-input:valid ~ .form-check-label,.form-check-input.is-valid ~ .form-check-label{color:#28a745}.was-validated .form-check-input:valid ~ .valid-feedback,.was-validated .form-check-input:valid ~ .valid-tooltip,.form-check-input.is-valid ~ .valid-feedback,.form-check-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid ~ .custom-control-label,.custom-control-input.is-valid ~ .custom-control-label{color:#28a745}.was-validated .custom-control-input:valid ~ .custom-control-label::before,.custom-control-input.is-valid ~ .custom-control-label::before{background-color:#71dd8a}.was-validated .custom-control-input:valid ~ .valid-feedback,.was-validated .custom-control-input:valid ~ .valid-tooltip,.custom-control-input.is-valid ~ .valid-feedback,.custom-control-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before,.custom-control-input.is-valid:checked ~ .custom-control-label::before{background-color:#34ce57}.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before,.custom-control-input.is-valid:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,0.25);box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,0.25)}.was-validated .custom-file-input:valid ~ .custom-file-label,.custom-file-input.is-valid ~ .custom-file-label{border-color:#28a745}.was-validated .custom-file-input:valid ~ .custom-file-label::before,.custom-file-input.is-valid ~ .custom-file-label::before{border-color:inherit}.was-validated .custom-file-input:valid ~ .valid-feedback,.was-validated .custom-file-input:valid ~ .valid-tooltip,.custom-file-input.is-valid ~ .valid-feedback,.custom-file-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-file-input:valid:focus ~ .custom-file-label,.custom-file-input.is-valid:focus ~ .custom-file-label{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,0.25);box-shadow:0 0 0 .2rem rgba(40,167,69,0.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,0.8);border-radius:.2rem}.was-validated .form-control:invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#dc3545}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#dc3545;-webkit-box-shadow:0 0 0 .2rem rgba(220,53,69,0.25);box-shadow:0 0 0 .2rem rgba(220,53,69,0.25)}.was-validated .form-control:invalid ~ .invalid-feedback,.was-validated .form-control:invalid ~ .invalid-tooltip,.form-control.is-invalid ~ .invalid-feedback,.form-control.is-invalid ~ .invalid-tooltip,.was-validated .custom-select:invalid ~ .invalid-feedback,.was-validated .custom-select:invalid ~ .invalid-tooltip,.custom-select.is-invalid ~ .invalid-feedback,.custom-select.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-check-input:invalid ~ .form-check-label,.form-check-input.is-invalid ~ .form-check-label{color:#dc3545}.was-validated .form-check-input:invalid ~ .invalid-feedback,.was-validated .form-check-input:invalid ~ .invalid-tooltip,.form-check-input.is-invalid ~ .invalid-feedback,.form-check-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid ~ .custom-control-label,.custom-control-input.is-invalid ~ .custom-control-label{color:#dc3545}.was-validated .custom-control-input:invalid ~ .custom-control-label::before,.custom-control-input.is-invalid ~ .custom-control-label::before{background-color:#efa2a9}.was-validated .custom-control-input:invalid ~ .invalid-feedback,.was-validated .custom-control-input:invalid ~ .invalid-tooltip,.custom-control-input.is-invalid ~ .invalid-feedback,.custom-control-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before,.custom-control-input.is-invalid:checked ~ .custom-control-label::before{background-color:#e4606d}.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before,.custom-control-input.is-invalid:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,0.25);box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,0.25)}.was-validated .custom-file-input:invalid ~ .custom-file-label,.custom-file-input.is-invalid ~ .custom-file-label{border-color:#dc3545}.was-validated .custom-file-input:invalid ~ .custom-file-label::before,.custom-file-input.is-invalid ~ .custom-file-label::before{border-color:inherit}.was-validated .custom-file-input:invalid ~ .invalid-feedback,.was-validated .custom-file-input:invalid ~ .invalid-tooltip,.custom-file-input.is-invalid ~ .invalid-feedback,.custom-file-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-file-input:invalid:focus ~ .custom-file-label,.custom-file-input.is-invalid:focus ~ .custom-file-label{-webkit-box-shadow:0 0 0 .2rem rgba(220,53,69,0.25);box-shadow:0 0 0 .2rem rgba(220,53,69,0.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}.btn:hover,.btn:focus{text-decoration:none}.btn:focus,.btn.focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(0,123,255,0.25);box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled):active,.btn:not(:disabled):not(.disabled).active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary:focus,.btn-primary.focus{-webkit-box-shadow:0 0 0 .2rem rgba(0,123,255,0.5);box-shadow:0 0 0 .2rem rgba(0,123,255,0.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(0,123,255,0.5);box-shadow:0 0 0 .2rem rgba(0,123,255,0.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary:focus,.btn-secondary.focus{-webkit-box-shadow:0 0 0 .2rem rgba(108,117,125,0.5);box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(108,117,125,0.5);box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success:focus,.btn-success.focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,0.5);box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,0.5);box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info:focus,.btn-info.focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,0.5);box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,0.5);box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning:focus,.btn-warning.focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,0.5);box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,0.5);box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger:focus,.btn-danger.focus{-webkit-box-shadow:0 0 0 .2rem rgba(220,53,69,0.5);box-shadow:0 0 0 .2rem rgba(220,53,69,0.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(220,53,69,0.5);box-shadow:0 0 0 .2rem rgba(220,53,69,0.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light:focus,.btn-light.focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,0.5);box-shadow:0 0 0 .2rem rgba(248,249,250,0.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,0.5);box-shadow:0 0 0 .2rem rgba(248,249,250,0.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark:focus,.btn-dark.focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,0.5);box-shadow:0 0 0 .2rem rgba(52,58,64,0.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,0.5);box-shadow:0 0 0 .2rem rgba(52,58,64,0.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:focus,.btn-outline-primary.focus{-webkit-box-shadow:0 0 0 .2rem rgba(0,123,255,0.5);box-shadow:0 0 0 .2rem rgba(0,123,255,0.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(0,123,255,0.5);box-shadow:0 0 0 .2rem rgba(0,123,255,0.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:focus,.btn-outline-secondary.focus{-webkit-box-shadow:0 0 0 .2rem rgba(108,117,125,0.5);box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(108,117,125,0.5);box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:focus,.btn-outline-success.focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,0.5);box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,0.5);box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:focus,.btn-outline-info.focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,0.5);box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,0.5);box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:focus,.btn-outline-warning.focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,0.5);box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,0.5);box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:focus,.btn-outline-danger.focus{-webkit-box-shadow:0 0 0 .2rem rgba(220,53,69,0.5);box-shadow:0 0 0 .2rem rgba(220,53,69,0.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(220,53,69,0.5);box-shadow:0 0 0 .2rem rgba(220,53,69,0.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:focus,.btn-outline-light.focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,0.5);box-shadow:0 0 0 .2rem rgba(248,249,250,0.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,0.5);box-shadow:0 0 0 .2rem rgba(248,249,250,0.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:focus,.btn-outline-dark.focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,0.5);box-shadow:0 0 0 .2rem rgba(52,58,64,0.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,0.5);box-shadow:0 0 0 .2rem rgba(52,58,64,0.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link:focus,.btn-link.focus{text-decoration:underline;border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link:disabled,.btn-link.disabled{color:#6c757d}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block + .btn-block{margin-top:.5rem}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}.dropup,.dropdown{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.15);border-radius:.25rem}.dropup .dropdown-menu{margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:1}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-group .btn + .btn,.btn-group .btn + .btn-group,.btn-group .btn-group + .btn,.btn-group .btn-group + .btn-group,.btn-group-vertical .btn + .btn,.btn-group-vertical .btn + .btn-group,.btn-group-vertical .btn-group + .btn,.btn-group-vertical .btn-group + .btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after{margin-left:0}.btn-sm + .dropdown-toggle-split,.btn-group-sm>.btn + .dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg + .dropdown-toggle-split,.btn-group-lg>.btn + .dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn + .btn,.btn-group-vertical>.btn + .btn-group,.btn-group-vertical>.btn-group + .btn,.btn-group-vertical>.btn-group + .btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.custom-select,.input-group>.custom-file{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file:focus{z-index:3}.input-group>.form-control + .form-control,.input-group>.form-control + .custom-select,.input-group>.form-control + .custom-file,.input-group>.custom-select + .form-control,.input-group>.custom-select + .custom-select,.input-group>.custom-select + .custom-file,.input-group>.custom-file + .form-control,.input-group>.custom-file + .custom-select,.input-group>.custom-file + .custom-file{margin-left:-1px}.input-group>.form-control:not(:last-child),.input-group>.custom-select:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.form-control:not(:first-child),.input-group>.custom-select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::before{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:first-child) .custom-file-label::before{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-prepend,.input-group-append{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-prepend .btn,.input-group-append .btn{position:relative;z-index:2}.input-group-prepend .btn + .btn,.input-group-prepend .btn + .input-group-text,.input-group-prepend .input-group-text + .input-group-text,.input-group-prepend .input-group-text + .btn,.input-group-append .btn + .btn,.input-group-append .btn + .input-group-text,.input-group-append .input-group-text + .input-group-text,.input-group-append .input-group-text + .btn{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=radio],.input-group-text input[type=checkbox]{margin-top:0}.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text,.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked ~ .custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,0.25);box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,0.25)}.custom-control-input:active ~ .custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled ~ .custom-control-label{color:#6c757d}.custom-control-input:disabled ~ .custom-control-label::before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after{background-image:url(data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E)}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after{background-image:url(data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E)}.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,123,255,0.5)}.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(0,123,255,0.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked ~ .custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked ~ .custom-control-label::after{background-image:url(data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E)}.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,123,255,0.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url(data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E) no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.075),0 0 5px rgba(128,189,255,0.5);box-shadow:inset 0 1px 2px rgba(0,0,0,0.075),0 0 5px rgba(128,189,255,0.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size=1]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus ~ .custom-file-control{border-color:#80bdff;-webkit-box-shadow:0 0 0 .2rem rgba(0,123,255,0.25);box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.custom-file-input:focus ~ .custom-file-control::before{border-color:#80bdff}.custom-file-input:lang(en) ~ .custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(calc(2.25rem + 2px) - 1px * 2);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:hover,.navbar-toggler:focus{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .dropup .dropdown-menu{top:auto;bottom:100%}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .dropup .dropdown-menu{top:auto;bottom:100%}.navbar-light .navbar-brand{color:rgba(0,0,0,0.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,0.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,0.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,0.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,0.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,0.5);border-color:rgba(0,0,0,0.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0,0,0,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,0.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,0.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,0.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,0.5)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,0.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,0.5);border-color:rgba(255,255,255,0.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255,255,255,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,0.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,0.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-0.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link + .card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,0.03);border-bottom:1px solid rgba(0,0,0,0.125)}.card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.card-header + .list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,0.03);border-top:1px solid rgba(0,0,0,0.125)}.card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.card-header-tabs{margin-right:-0.625rem;margin-bottom:-0.75rem;margin-left:-0.625rem;border-bottom:0}.card-header-pills{margin-right:-0.625rem;margin-left:-0.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(0.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(0.25rem - 1px);border-bottom-left-radius:calc(0.25rem - 1px)}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0;flex:1 0 0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0;flex:1 0 0;margin-bottom:0}.card-group>.card + .card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-img-top,.card-group>.card:first-child .card-header{border-top-right-radius:0}.card-group>.card:first-child .card-img-bottom,.card-group>.card:first-child .card-footer{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-img-top,.card-group>.card:last-child .card-header{border-top-left-radius:0}.card-group>.card:last-child .card-img-bottom,.card-group>.card:last-child .card-footer{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-img-top,.card-group>.card:only-child .card-header{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-img-bottom,.card-group>.card:only-child .card-footer{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item + .breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#6c757d;content:"/"}.breadcrumb-item + .breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item + .breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(0,123,255,0.25);box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:hover,.badge-primary[href]:focus{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:hover,.badge-secondary[href]:focus{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:hover,.badge-success[href]:focus{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:hover,.badge-info[href]:focus{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:hover,.badge-warning[href]:focus{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:hover,.badge-danger[href]:focus{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:hover,.badge-light[href]:focus{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:hover,.badge-dark[href]:focus{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;background-color:#007bff;-webkit-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,0.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:hover,.list-group-item:focus{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover,.close:focus{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% -(0.5rem * 2))}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% -(1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^="top"]{padding:.4rem 0}.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^="top"] .arrow{bottom:0}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^="top"] .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^="right"]{padding:0 .4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^="right"] .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^="right"] .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^="bottom"]{padding:.4rem 0}.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^="bottom"] .arrow{top:0}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^="bottom"] .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^="left"]{padding:0 .4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^="left"] .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^="left"] .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top,.bs-popover-auto[x-placement^="top"]{margin-bottom:.5rem}.bs-popover-top .arrow,.bs-popover-auto[x-placement^="top"] .arrow{bottom:calc((0.5rem + 1px) * -1)}.bs-popover-top .arrow::before,.bs-popover-auto[x-placement^="top"] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-auto[x-placement^="top"] .arrow::after{border-width:.5rem .5rem 0}.bs-popover-top .arrow::before,.bs-popover-auto[x-placement^="top"] .arrow::before{bottom:0;border-top-color:rgba(0,0,0,0.25)}.bs-popover-top .arrow::after,.bs-popover-auto[x-placement^="top"] .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^="right"]{margin-left:.5rem}.bs-popover-right .arrow,.bs-popover-auto[x-placement^="right"] .arrow{left:calc((0.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-right .arrow::before,.bs-popover-auto[x-placement^="right"] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-auto[x-placement^="right"] .arrow::after{border-width:.5rem .5rem .5rem 0}.bs-popover-right .arrow::before,.bs-popover-auto[x-placement^="right"] .arrow::before{left:0;border-right-color:rgba(0,0,0,0.25)}.bs-popover-right .arrow::after,.bs-popover-auto[x-placement^="right"] .arrow::after{left:1px;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^="bottom"]{margin-top:.5rem}.bs-popover-bottom .arrow,.bs-popover-auto[x-placement^="bottom"] .arrow{top:calc((0.5rem + 1px) * -1)}.bs-popover-bottom .arrow::before,.bs-popover-auto[x-placement^="bottom"] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-auto[x-placement^="bottom"] .arrow::after{border-width:0 .5rem .5rem .5rem}.bs-popover-bottom .arrow::before,.bs-popover-auto[x-placement^="bottom"] .arrow::before{top:0;border-bottom-color:rgba(0,0,0,0.25)}.bs-popover-bottom .arrow::after,.bs-popover-auto[x-placement^="bottom"] .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-0.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-left,.bs-popover-auto[x-placement^="left"]{margin-right:.5rem}.bs-popover-left .arrow,.bs-popover-auto[x-placement^="left"] .arrow{right:calc((0.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-left .arrow::before,.bs-popover-auto[x-placement^="left"] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-auto[x-placement^="left"] .arrow::after{border-width:.5rem 0 .5rem .5rem}.bs-popover-left .arrow::before,.bs-popover-auto[x-placement^="left"] .arrow::before{right:0;border-left-color:rgba(0,0,0,0.25)}.bs-popover-left .arrow::after,.bs-popover-auto[x-placement^="left"] .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(0.3rem - 1px);border-top-right-radius:calc(0.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;-webkit-transition:-webkit-transform .6s ease;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports(transform-style:preserve-3d){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-item-next,.active.carousel-item-right{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports(transform-style:preserve-3d){.carousel-item-next,.active.carousel-item-right{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.carousel-item-prev,.active.carousel-item-left{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports(transform-style:preserve-3d){.carousel-item-prev,.active.carousel-item-left{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url(data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E)}.carousel-control-next-icon{background-image:url(data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E)}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,0.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#007bff !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#0062cc !important}.bg-secondary{background-color:#6c757d !important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#545b62 !important}.bg-success{background-color:#28a745 !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#1e7e34 !important}.bg-info{background-color:#17a2b8 !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#117a8b !important}.bg-warning{background-color:#ffc107 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#d39e00 !important}.bg-danger{background-color:#dc3545 !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#bd2130 !important}.bg-light{background-color:#f8f9fa !important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#dae0e5 !important}.bg-dark{background-color:#343a40 !important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#1d2124 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:transparent !important}.border{border:1px solid #dee2e6 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-right{border-right:1px solid #dee2e6 !important}.border-bottom{border-bottom:1px solid #dee2e6 !important}.border-left{border-left:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#007bff !important}.border-secondary{border-color:#6c757d !important}.border-success{border-color:#28a745 !important}.border-info{border-color:#17a2b8 !important}.border-warning{border-color:#ffc107 !important}.border-danger{border-color:#dc3545 !important}.border-light{border-color:#f8f9fa !important}.border-dark{border-color:#343a40 !important}.border-white{border-color:#fff !important}.rounded{border-radius:.25rem !important}.rounded-top{border-top-left-radius:.25rem !important;border-top-right-radius:.25rem !important}.rounded-right{border-top-right-radius:.25rem !important;border-bottom-right-radius:.25rem !important}.rounded-bottom{border-bottom-right-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-left{border-top-left-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-circle{border-radius:50% !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}@media (min-width:576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-sm-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width:768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-md-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width:992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-lg-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width:1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-xl-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media print{.d-print-none{display:none !important}.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-print-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.8571428571%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.justify-content-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-sm-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-sm-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-sm-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-sm-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-sm-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.justify-content-sm-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-sm-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-sm-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-sm-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-sm-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-sm-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-sm-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-sm-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-sm-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-sm-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-sm-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-sm-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-sm-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-sm-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-sm-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-sm-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-sm-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-sm-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-sm-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-sm-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-sm-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-sm-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-md-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-md-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-md-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-md-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-md-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.justify-content-md-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-md-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-md-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-md-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-md-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-md-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-md-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-md-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-md-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-md-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-md-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-md-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-md-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-md-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-md-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-md-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-md-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-md-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-md-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-md-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-md-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-md-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-lg-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-lg-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-lg-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-lg-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-lg-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.justify-content-lg-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-lg-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-lg-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-lg-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-lg-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-lg-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-lg-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-lg-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-lg-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-lg-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-lg-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-lg-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-lg-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-lg-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-lg-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-lg-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-lg-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-lg-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-lg-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-lg-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-lg-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-lg-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-xl-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-xl-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-xl-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-xl-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-xl-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.justify-content-xl-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-xl-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-xl-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-xl-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-xl-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-xl-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-xl-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-xl-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-xl-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-xl-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-xl-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-xl-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-xl-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-xl-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-xl-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-xl-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-xl-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-xl-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-xl-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-xl-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-xl-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-xl-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media (min-width:576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media (min-width:768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media (min-width:992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media (min-width:1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports(position:sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:.25rem !important}.mt-1,.my-1{margin-top:.25rem !important}.mr-1,.mx-1{margin-right:.25rem !important}.mb-1,.my-1{margin-bottom:.25rem !important}.ml-1,.mx-1{margin-left:.25rem !important}.m-2{margin:.5rem !important}.mt-2,.my-2{margin-top:.5rem !important}.mr-2,.mx-2{margin-right:.5rem !important}.mb-2,.my-2{margin-bottom:.5rem !important}.ml-2,.mx-2{margin-left:.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:.25rem !important}.pt-1,.py-1{padding-top:.25rem !important}.pr-1,.px-1{padding-right:.25rem !important}.pb-1,.py-1{padding-bottom:.25rem !important}.pl-1,.px-1{padding-left:.25rem !important}.p-2{padding:.5rem !important}.pt-2,.py-2{padding-top:.5rem !important}.pr-2,.px-2{padding-right:.5rem !important}.pb-2,.py-2{padding-bottom:.5rem !important}.pl-2,.px-2{padding-left:.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.px-4{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,.px-4{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media (min-width:576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:.25rem !important}.mt-sm-1,.my-sm-1{margin-top:.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:.25rem !important}.m-sm-2{margin:.5rem !important}.mt-sm-2,.my-sm-2{margin-top:.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:.25rem !important}.pt-sm-1,.py-sm-1{padding-top:.25rem !important}.pr-sm-1,.px-sm-1{padding-right:.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem !important}.pl-sm-1,.px-sm-1{padding-left:.25rem !important}.p-sm-2{padding:.5rem !important}.pt-sm-2,.py-sm-2{padding-top:.5rem !important}.pr-sm-2,.px-sm-2{padding-right:.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem !important}.pl-sm-2,.px-sm-2{padding-left:.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media (min-width:768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:.25rem !important}.mt-md-1,.my-md-1{margin-top:.25rem !important}.mr-md-1,.mx-md-1{margin-right:.25rem !important}.mb-md-1,.my-md-1{margin-bottom:.25rem !important}.ml-md-1,.mx-md-1{margin-left:.25rem !important}.m-md-2{margin:.5rem !important}.mt-md-2,.my-md-2{margin-top:.5rem !important}.mr-md-2,.mx-md-2{margin-right:.5rem !important}.mb-md-2,.my-md-2{margin-bottom:.5rem !important}.ml-md-2,.mx-md-2{margin-left:.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:.25rem !important}.pt-md-1,.py-md-1{padding-top:.25rem !important}.pr-md-1,.px-md-1{padding-right:.25rem !important}.pb-md-1,.py-md-1{padding-bottom:.25rem !important}.pl-md-1,.px-md-1{padding-left:.25rem !important}.p-md-2{padding:.5rem !important}.pt-md-2,.py-md-2{padding-top:.5rem !important}.pr-md-2,.px-md-2{padding-right:.5rem !important}.pb-md-2,.py-md-2{padding-bottom:.5rem !important}.pl-md-2,.px-md-2{padding-left:.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media (min-width:992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:.25rem !important}.mt-lg-1,.my-lg-1{margin-top:.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:.25rem !important}.m-lg-2{margin:.5rem !important}.mt-lg-2,.my-lg-2{margin-top:.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:.25rem !important}.pt-lg-1,.py-lg-1{padding-top:.25rem !important}.pr-lg-1,.px-lg-1{padding-right:.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem !important}.pl-lg-1,.px-lg-1{padding-left:.25rem !important}.p-lg-2{padding:.5rem !important}.pt-lg-2,.py-lg-2{padding-top:.5rem !important}.pr-lg-2,.px-lg-2{padding-right:.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem !important}.pl-lg-2,.px-lg-2{padding-left:.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media (min-width:1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:.25rem !important}.mt-xl-1,.my-xl-1{margin-top:.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:.25rem !important}.m-xl-2{margin:.5rem !important}.mt-xl-2,.my-xl-2{margin-top:.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:.25rem !important}.pt-xl-1,.py-xl-1{padding-top:.25rem !important}.pr-xl-1,.px-xl-1{padding-right:.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem !important}.pl-xl-1,.px-xl-1{padding-left:.25rem !important}.p-xl-2{padding:.5rem !important}.pt-xl-2,.py-xl-2{padding-top:.5rem !important}.pr-xl-2,.px-xl-2{padding-right:.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem !important}.pl-xl-2,.px-xl-2{padding-left:.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}.text-justify{text-align:justify !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media (min-width:576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media (min-width:768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media (min-width:992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media (min-width:1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#007bff !important}a.text-primary:hover,a.text-primary:focus{color:#0062cc !important}.text-secondary{color:#6c757d !important}a.text-secondary:hover,a.text-secondary:focus{color:#545b62 !important}.text-success{color:#28a745 !important}a.text-success:hover,a.text-success:focus{color:#1e7e34 !important}.text-info{color:#17a2b8 !important}a.text-info:hover,a.text-info:focus{color:#117a8b !important}.text-warning{color:#ffc107 !important}a.text-warning:hover,a.text-warning:focus{color:#d39e00 !important}.text-danger{color:#dc3545 !important}a.text-danger:hover,a.text-danger:focus{color:#bd2130 !important}.text-light{color:#f8f9fa !important}a.text-light:hover,a.text-light:focus{color:#dae0e5 !important}.text-dark{color:#343a40 !important}a.text-dark:hover,a.text-dark:focus{color:#1d2124 !important}.text-muted{color:#6c757d !important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media print{*,*::before,*::after{text-shadow:none !important;-webkit-box-shadow:none !important;box-shadow:none !important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:"(" attr(title) ")"}pre{white-space:pre-wrap !important}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px !important}.container{min-width:992px !important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}.highlight table td{padding:5px}.highlight table pre{margin:0}.highlight .cm{color:#998;font-style:italic}.highlight .cp{color:#999;font-weight:bold}.highlight .c1{color:#998;font-style:italic}.highlight .cs{color:#999;font-weight:bold;font-style:italic}.highlight .c,.highlight .cd{color:#998;font-style:italic}.highlight .err{color:#a61717;background-color:#e3d2d2}.highlight .gd{color:#000;background-color:#fdd}.highlight .ge{color:#000;font-style:italic}.highlight .gr{color:#a00}.highlight .gh{color:#999}.highlight .gi{color:#000;background-color:#dfd}.highlight .go{color:#888}.highlight .gp{color:#555}.highlight .gs{font-weight:bold}.highlight .gu{color:#aaa}.highlight .gt{color:#a00}.highlight .kc{color:#000;font-weight:bold}.highlight .kd{color:#000;font-weight:bold}.highlight .kn{color:#000;font-weight:bold}.highlight .kp{color:#000;font-weight:bold}.highlight .kr{color:#000;font-weight:bold}.highlight .kt{color:#458;font-weight:bold}.highlight .k,.highlight .kv{color:#000;font-weight:bold}.highlight .mf{color:#099}.highlight .mh{color:#099}.highlight .il{color:#099}.highlight .mi{color:#099}.highlight .mo{color:#099}.highlight .m,.highlight .mb,.highlight .mx{color:#099}.highlight .sb{color:#d14}.highlight .sc{color:#d14}.highlight .sd{color:#d14}.highlight .s2{color:#d14}.highlight .se{color:#d14}.highlight .sh{color:#d14}.highlight .si{color:#d14}.highlight .sx{color:#d14}.highlight .sr{color:#009926}.highlight .s1{color:#d14}.highlight .ss{color:#990073}.highlight .s{color:#d14}.highlight .na{color:#008080}.highlight .bp{color:#525252}.highlight .nb{color:#0086B3}.highlight .nc{color:#458;font-weight:bold}.highlight .no{color:#008080}.highlight .nd{color:#3c5d5d;font-weight:bold}.highlight .ni{color:#800080}.highlight .ne{color:#900;font-weight:bold}.highlight .nf{color:#900;font-weight:bold}.highlight .nl{color:#900;font-weight:bold}.highlight .nn{color:#555}.highlight .nt{color:#000080}.highlight .vc{color:#008080}.highlight .vg{color:#008080}.highlight .vi{color:#008080}.highlight .nv{color:#008080}.highlight .ow{color:#000;font-weight:bold}.highlight .o{color:#000;font-weight:bold}.highlight .n{color:#000;font-weight:bold}.highlight .p{color:#000;font-weight:bold}.highlight .w{color:#bbb}.highlight{background-color:#f8f8f8}@font-face{font-family:FreightSans;font-weight:700;font-style:normal;src:url(../fonts/FreightSans/freight-sans-bold.woff2) format("woff2"),url(../fonts/FreightSans/freight-sans-bold.woff) format("woff")}@font-face{font-family:FreightSans;font-weight:700;font-style:italic;src:url(../fonts/FreightSans/freight-sans-bold-italic.woff2) format("woff2"),url(../fonts/FreightSans/freight-sans-bold-italic.woff) format("woff")}@font-face{font-family:FreightSans;font-weight:500;font-style:normal;src:url(../fonts/FreightSans/freight-sans-medium.woff2) format("woff2"),url(../fonts/FreightSans/freight-sans-medium.woff) format("woff")}@font-face{font-family:FreightSans;font-weight:500;font-style:italic;src:url(../fonts/FreightSans/freight-sans-medium-italic.woff2) format("woff2"),url(../fonts/FreightSans/freight-sans-medium-italic.woff) format("woff")}@font-face{font-family:FreightSans;font-weight:100;font-style:normal;src:url(../fonts/FreightSans/freight-sans-light.woff2) format("woff2"),url(../fonts/FreightSans/freight-sans-light.woff) format("woff")}@font-face{font-family:FreightSans;font-weight:100;font-style:italic;src:url(../fonts/FreightSans/freight-sans-light-italic.woff2) format("woff2"),url(../fonts/FreightSans/freight-sans-light-italic.woff) format("woff")}@font-face{font-family:FreightSans;font-weight:400;font-style:italic;src:url(../fonts/FreightSans/freight-sans-book-italic.woff2) format("woff2"),url(../fonts/FreightSans/freight-sans-book-italic.woff) format("woff")}@font-face{font-family:FreightSans;font-weight:400;font-style:normal;src:url(../fonts/FreightSans/freight-sans-book.woff2) format("woff2"),url(../fonts/FreightSans/freight-sans-book.woff) format("woff")}@font-face{font-family:IBMPlexMono;font-weight:600;font-style:normal;unicode-range:u+0020-007f;src:local("IBMPlexMono-SemiBold"),url(../fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff2) format("woff2"),url(../fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff) format("woff")}@font-face{font-family:IBMPlexMono;font-weight:500;font-style:normal;unicode-range:u+0020-007f;src:local("IBMPlexMono-Medium"),url(../fonts/IBMPlexMono/IBMPlexMono-Medium.woff2) format("woff2"),url(../fonts/IBMPlexMono/IBMPlexMono-Medium.woff) format("woff")}@font-face{font-family:IBMPlexMono;font-weight:400;font-style:normal;unicode-range:u+0020-007f;src:local("IBMPlexMono-Regular"),url(../fonts/IBMPlexMono/IBMPlexMono-Regular.woff2) format("woff2"),url(../fonts/IBMPlexMono/IBMPlexMono-Regular.woff) format("woff")}@font-face{font-family:IBMPlexMono;font-weight:300;font-style:normal;unicode-range:u+0020-007f;src:local("IBMPlexMono-Light"),url(../fonts/IBMPlexMono/IBMPlexMono-Light.woff2) format("woff2"),url(../fonts/IBMPlexMono/IBMPlexMono-Light.woff) format("woff")}html{position:relative;min-height:100%;font-size:12px}@media screen and (min-width:768px){html{font-size:16px}}*{-webkit-box-sizing:border-box;box-sizing:border-box}body{font-family:FreightSans,Helvetica Neue,Helvetica,Arial,sans-serif}a:link,a:visited,a:hover{text-decoration:none;color:#e44c2c}a.with-right-arrow,.btn.with-right-arrow{padding-right:1.375rem;position:relative;background-image:url(../images/chevron-right-orange.svg);background-size:6px 13px;background-position:center right 5px;background-repeat:no-repeat}@media screen and (min-width:768px){a.with-right-arrow,.btn.with-right-arrow{background-size:8px 14px;background-position:center right 12px;padding-right:2rem}}::-webkit-input-placeholder{color:#e44c2c}::-moz-placeholder{color:#e44c2c}:-ms-input-placeholder{color:#e44c2c}:-moz-placeholder{color:#e44c2c}.email-subscribe-form input.email{color:#e44c2c;border:0;border-bottom:1px solid #939393;width:100%;background-color:transparent;outline:none;font-size:1.125rem;letter-spacing:.25px;line-height:2.25rem}.email-subscribe-form input[type=submit]{position:absolute;right:0;top:10px;height:15px;width:15px;background-image:url(../images/arrow-right-with-tail.svg);background-color:transparent;background-repeat:no-repeat;background-size:15px 15px;background-position:center center;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0}.email-subscribe-form-fields-wrapper{position:relative}.anchorjs-link{color:#6c6c6d !important}@media screen and (min-width:768px){.anchorjs-link:hover{color:inherit;text-decoration:none !important}}.pytorch-article #table-of-contents{display:none}code,kbd,pre,samp{font-family:IBMPlexMono,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code span,kbd span,pre span,samp span{font-family:IBMPlexMono,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}pre{padding:1.125rem}pre code{font-size:.875rem}pre.highlight{background-color:#f3f4f7;line-height:1.3125rem}code.highlighter-rouge{color:#6c6c6d;background-color:#f3f4f7;padding:2px 6px}a:link code.highlighter-rouge,a:visited code.highlighter-rouge,a:hover code.highlighter-rouge{color:#4974D1}a:link.has-code,a:visited.has-code,a:hover.has-code{color:#4974D1}p code,h1 code,h2 code,h3 code,h4 code,h5 code,h6 code{font-size:78.5%}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}.header-holder{height:68px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;left:0;margin-left:auto;margin-right:auto;position:fixed;right:0;top:0;width:100%;z-index:9999;background-color:#fff;border-bottom:1px solid #e2e2e2}@media screen and (min-width:1100px){.header-holder{height:90px}}.header-container{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.header-container:before,.header-container:after{content:"";display:table}.header-container:after{clear:both}.header-container{*zoom:1}@media screen and (min-width:1100px){.header-container{display:block}}.header-logo{height:23px;width:93px;background-image:url(../images/logo.svg);background-repeat:no-repeat;background-size:93px 23px;display:block;float:left;z-index:10}@media screen and (min-width:1100px){.header-logo{background-size:108px 27px;position:absolute;height:27px;width:108px;top:4px;float:none}}.main-menu-open-button{background-image:url(../images/icon-menu-dots.svg);background-position:center center;background-size:25px 7px;background-repeat:no-repeat;width:25px;height:17px;position:absolute;right:0;top:4px}@media screen and (min-width:1100px){.main-menu-open-button{display:none}}.header-holder .main-menu{display:none}@media screen and (min-width:1100px){.header-holder .main-menu{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}}.header-holder .main-menu ul{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0}.header-holder .main-menu ul li{display:inline-block;margin-right:40px;position:relative}.header-holder .main-menu ul li.active:after{content:"•";bottom:-24px;color:#e44c2c;font-size:1.375rem;left:0;position:absolute;right:0;text-align:center}.header-holder .main-menu ul li.active a{color:#e44c2c}.header-holder .main-menu ul li.docs-active:after{content:"•";bottom:-24px;color:#e44c2c;font-size:1.375rem;left:-24px;position:absolute;right:0;text-align:center}.header-holder .main-menu ul li:last-of-type{margin-right:0}.header-holder .main-menu ul li a{color:#fff;font-size:1.3rem;letter-spacing:0;line-height:2.125rem;text-align:center;text-decoration:none}@media screen and (min-width:1100px){.header-holder .main-menu ul li a:hover{color:#e44c2c}}.mobile-main-menu{display:none}.mobile-main-menu.open{background-color:#262626;display:block;height:100%;left:0;margin-left:auto;margin-right:auto;min-height:100%;position:fixed;right:0;top:0;width:100%;z-index:99999}.mobile-main-menu .container-fluid{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;height:68px;position:relative}.mobile-main-menu .container-fluid:before,.mobile-main-menu .container-fluid:after{content:"";display:table}.mobile-main-menu .container-fluid:after{clear:both}.mobile-main-menu .container-fluid{*zoom:1}.mobile-main-menu.open ul{list-style-type:none;padding:0}.mobile-main-menu.open ul li a,.mobile-main-menu.open .resources-mobile-menu-title{font-size:2rem;color:#fff;letter-spacing:0;line-height:4rem;text-decoration:none}.mobile-main-menu.open ul li.active a{color:#e44c2c}.main-menu-close-button{background-image:url(../images/icon-close.svg);background-position:center center;background-repeat:no-repeat;background-size:24px 24px;height:24px;position:absolute;right:0;width:24px;top:-4px}.mobile-main-menu-header-container{position:relative}.mobile-main-menu-links-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:2.8125rem;height:90vh;margin-top:-25px;padding-top:50%;overflow-y:scroll}.mobile-main-menu-links-container .main-menu{height:100vh}.mobile-main-menu-links-container ul.resources-mobile-menu-items li{padding-left:15px}.site-footer{padding:2.5rem 0;width:100%;background:#000;background-size:100%;margin-left:0;margin-right:0;position:relative;z-index:201}@media screen and (min-width:768px){.site-footer{padding:5rem 0}}.site-footer p{color:#fff}.site-footer ul{list-style-type:none;padding-left:0;margin-bottom:0}.site-footer ul li{font-size:1.125rem;line-height:2rem;color:#A0A0A1;padding-bottom:.375rem}.site-footer ul li.list-title{padding-bottom:.75rem;color:#fff}.site-footer a:link,.site-footer a:visited{color:inherit}@media screen and (min-width:768px){.site-footer a:hover{color:#e44c2c}}.docs-tutorials-resources{background-color:#262626;color:#fff;padding-top:2.5rem;padding-bottom:2.5rem;position:relative;z-index:201}@media screen and (min-width:768px){.docs-tutorials-resources{padding-top:5rem;padding-bottom:5rem}}.docs-tutorials-resources p{color:#929292;font-size:1.125rem}.docs-tutorials-resources h2{font-size:1.5rem;letter-spacing:-0.25px;text-transform:none;margin-bottom:.25rem}@media screen and (min-width:768px){.docs-tutorials-resources h2{margin-bottom:1.25rem}}.docs-tutorials-resources .col-md-4{margin-bottom:2rem;text-align:center}@media screen and (min-width:768px){.docs-tutorials-resources .col-md-4{margin-bottom:0}}.docs-tutorials-resources .with-right-arrow{margin-left:12px}.docs-tutorials-resources .with-right-arrow:hover{background-image:url(../images/chevron-right-white.svg)}.docs-tutorials-resources p{font-size:1rem;line-height:1.5rem;letter-spacing:.22px;color:#939393;margin-bottom:0}@media screen and (min-width:768px){.docs-tutorials-resources p{margin-bottom:1.25rem}}.docs-tutorials-resources a{font-size:1.125rem;color:#e44c2c}.docs-tutorials-resources a:hover{color:#fff}.footer-container{position:relative}@media screen and (min-width:768px){.footer-logo-wrapper{position:absolute;top:0;left:30px}}.footer-logo{background-image:url(../images/logo-icon.svg);background-position:center;background-repeat:no-repeat;background-size:20px 24px;display:block;height:24px;margin-bottom:2.8125rem;width:20px}@media screen and (min-width:768px){.footer-logo{background-size:29px 36px;height:36px;margin-bottom:0;margin-bottom:0;width:29px}}.footer-links-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}@media screen and (min-width:768px){.footer-links-wrapper{-ms-flex-wrap:initial;flex-wrap:initial;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}}.footer-links-col{margin-bottom:3.75rem;width:50%}@media screen and (min-width:768px){.footer-links-col{margin-bottom:0;width:14%;margin-right:23px}.footer-links-col.follow-us-col{width:18%;margin-right:0}}@media (min-width:768px) and (max-width:1239px){.footer-links-col{width:18%;margin-right:30px}}.footer-social-icons{margin:8.5625rem 0 2.5rem 0}.footer-social-icons a{height:32px;width:32px;display:inline-block;background-color:#CCCDD1;border-radius:50%;margin-right:5px}.footer-social-icons a.facebook{background-image:url(../images/logo-facebook-dark.svg);background-position:center center;background-size:9px 18px;background-repeat:no-repeat}.footer-social-icons a.twitter{background-image:url(../images/logo-twitter-dark.svg);background-position:center center;background-size:17px 17px;background-repeat:no-repeat}.footer-social-icons a.youtube{background-image:url(../images/logo-youtube-dark.svg);background-position:center center;background-repeat:no-repeat}.site-footer .mc-field-group{margin-top:-2px}article.pytorch-article{max-width:920px;margin:0 auto}article.pytorch-article h2,article.pytorch-article h3,article.pytorch-article h4,article.pytorch-article h5,article.pytorch-article h6{margin:1.375rem 0;color:#262626}article.pytorch-article h2{font-size:1.625rem;letter-spacing:1.33px;line-height:2rem;text-transform:none}article.pytorch-article h3{font-size:1.5rem;letter-spacing:-0.25px;line-height:1.875rem;text-transform:none}article.pytorch-article h4,article.pytorch-article h5,article.pytorch-article h6{font-size:1.125rem;letter-spacing:-0.19px;line-height:1.875rem}article.pytorch-article p{margin-bottom:1.125rem}article.pytorch-article p,article.pytorch-article ul li,article.pytorch-article ol li,article.pytorch-article dl dt,article.pytorch-article dl dd,article.pytorch-article blockquote{font-size:1rem;line-height:1.375rem;color:#262626;letter-spacing:.01px;font-weight:500}article.pytorch-article table{margin-bottom:2.5rem;width:100%}article.pytorch-article table thead{border-bottom:1px solid #cacaca}article.pytorch-article table th{padding:.625rem;color:#262626}article.pytorch-article table td{padding:.3125rem}article.pytorch-article table tr th:first-of-type,article.pytorch-article table tr td:first-of-type{padding-left:0}article.pytorch-article table.docutils.field-list th.field-name{padding:.3125rem;padding-left:0}article.pytorch-article table.docutils.field-list td.field-body{padding:.3125rem}article.pytorch-article table.docutils.field-list td.field-body p:last-of-type{margin-bottom:0}article.pytorch-article ul,article.pytorch-article ol{margin:1.5rem 0 3.125rem 0}@media screen and (min-width:768px){article.pytorch-article ul,article.pytorch-article ol{padding-left:6.25rem}}article.pytorch-article ul li,article.pytorch-article ol li{margin-bottom:.625rem}article.pytorch-article dl{margin-bottom:1.5rem}article.pytorch-article dl dt{margin-bottom:.75rem}article.pytorch-article pre{margin-bottom:2.5rem}article.pytorch-article hr{margin-top:4.6875rem;margin-bottom:4.6875rem}article.pytorch-article blockquote{margin:0 auto;margin-bottom:2.5rem;width:65%}article.pytorch-article img{width:100%}html{height:100%}@media screen and (min-width:768px){html{font-size:16px}}body{background:#fff;height:100%;margin:0}body.no-scroll{height:100%;overflow:hidden}p{margin-top:0;margin-bottom:1.125rem}p a:link,p a:visited,p a:hover{color:#e44c2c;text-decoration:none}@media screen and (min-width:768px){p a:hover{text-decoration:underline}}p a:link,p a:visited,p a:hover{color:#ee4c2c}.wy-breadcrumbs li a{color:#ee4c2c}ul.pytorch-breadcrumbs{padding-left:0;list-style-type:none}ul.pytorch-breadcrumbs li{display:inline-block;font-size:.875rem}ul.pytorch-breadcrumbs a{color:#ee4c2c;text-decoration:none}.table-of-contents-link-wrapper{display:block;margin-top:0;padding:1.25rem 1.875rem;background-color:#f3f4f7;position:relative;color:#262626;font-size:1.25rem}.table-of-contents-link-wrapper.is-open .toggle-table-of-contents{-webkit-transform:rotate(180deg);transform:rotate(180deg)}@media screen and (min-width:1100px){.table-of-contents-link-wrapper{display:none}}.toggle-table-of-contents{background-image:url(../images/chevron-down-grey.svg);background-position:center center;background-repeat:no-repeat;background-size:18px 18px;height:100%;position:absolute;right:21px;width:30px;top:0}.tutorials-header .header-logo{background-image:url(../images/logo-dark.svg)}.tutorials-header .main-menu ul li a{color:#262626}.tutorials-header .main-menu-open-button{background-image:url(../images/icon-menu-dots-dark.svg)}.rst-content footer .rating-hr.hr-top{margin-bottom:-0.0625rem}.rst-content footer .rating-hr.hr-bottom{margin-top:-0.0625rem}.rst-content footer .rating-container{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;font-size:1.125rem}.rst-content footer .rating-container .rating-prompt,.rst-content footer .rating-container .was-helpful-thank-you{padding:.625rem 1.25rem .625rem 1.25rem}.rst-content footer .rating-container .was-helpful-thank-you{display:none}.rst-content footer .rating-container .rating-prompt.yes-link,.rst-content footer .rating-container .rating-prompt.no-link{color:#e44c2c;cursor:pointer}.rst-content footer .rating-container .rating-prompt.yes-link:hover,.rst-content footer .rating-container .rating-prompt.no-link:hover{background-color:#e44c2c;color:#fff}.rst-content footer .rating-container .stars-outer{display:inline-block;position:relative;font-family:FontAwesome;padding:.625rem 1.25rem .625rem 1.25rem}.rst-content footer .rating-container .stars-outer i{cursor:pointer}.rst-content footer .rating-container .stars-outer .star-fill{color:#ee4c2c}.rst-content footer div[role=contentinfo]{padding-top:2.5rem}.rst-content footer div[role=contentinfo] p{margin-bottom:0}h1{font-size:2rem;letter-spacing:1.78px;line-height:2.5rem;text-transform:uppercase;margin:1.375rem 0}span.pre{color:#6c6c6d;background-color:#f3f4f7;padding:2px 0}pre{padding:1.375rem}.highlight .c1{color:#6c6c6d}.headerlink{display:none !important}a:link.has-code,a:hover.has-code,a:visited.has-code{color:#4974D1}a:link.has-code span,a:hover.has-code span,a:visited.has-code span{color:#4974D1}article.pytorch-article ul,article.pytorch-article ol{padding-left:1.875rem;margin:0}article.pytorch-article ul li,article.pytorch-article ol li{margin:0;line-height:1.75rem}article.pytorch-article ul p,article.pytorch-article ol p{line-height:1.75rem;margin-bottom:0}article.pytorch-article ul ul,article.pytorch-article ul ol,article.pytorch-article ol ul,article.pytorch-article ol ol{margin:0}article.pytorch-article h1,article.pytorch-article h2,article.pytorch-article h3,article.pytorch-article h4,article.pytorch-article h5,article.pytorch-article h6{font-weight:normal}article.pytorch-article h1 a,article.pytorch-article h2 a,article.pytorch-article h3 a,article.pytorch-article h4 a,article.pytorch-article h5 a,article.pytorch-article h6 a{color:#262626}article.pytorch-article p.caption{margin-top:1.25rem}article.pytorch-article .section:first-of-type h1:first-of-type{margin-top:0}article.pytorch-article .sphx-glr-thumbcontainer{margin:0;border:1px solid #d6d7d8;border-radius:0;width:45%;text-align:center;margin-bottom:5%}@media screen and (max-width:1100px){article.pytorch-article .sphx-glr-thumbcontainer:nth-child(odd){margin-left:0;margin-right:2.5%}article.pytorch-article .sphx-glr-thumbcontainer:nth-child(even){margin-right:0;margin-left:2.5%}article.pytorch-article .sphx-glr-thumbcontainer .figure{width:40%}}@media screen and (min-width:1101px){article.pytorch-article .sphx-glr-thumbcontainer{margin-right:3%;margin-bottom:3%;width:30%}}article.pytorch-article .sphx-glr-thumbcontainer .caption-text a{font-size:1rem;color:#262626;letter-spacing:0;line-height:1.5rem;text-decoration:none}article.pytorch-article .sphx-glr-thumbcontainer:hover{-webkit-box-shadow:none;box-shadow:none;border-bottom-color:#fff}article.pytorch-article .sphx-glr-thumbcontainer:hover .figure:before{bottom:100%}article.pytorch-article .sphx-glr-thumbcontainer .figure{width:80%}article.pytorch-article .sphx-glr-thumbcontainer .figure:before{content:"";display:block;position:absolute;top:0;bottom:35%;left:0;right:0;background:#8A94B3;opacity:.10}article.pytorch-article .sphx-glr-thumbcontainer .figure a.reference.internal{text-align:left}@media screen and (min-width:768px){article.pytorch-article .sphx-glr-thumbcontainer:after{content:"";display:block;width:0;height:1px;position:absolute;bottom:0;left:0;background-color:#e44c2c;-webkit-transition:width .250s ease-in-out;transition:width .250s ease-in-out}article.pytorch-article .sphx-glr-thumbcontainer:hover:after{width:100%}}@media screen and (min-width:768px){article.pytorch-article .sphx-glr-thumbcontainer:after{background-color:#ee4c2c}}article.pytorch-article .section :not(dt)>code{color:#262626;border-top:solid 2px #fff;background-color:#fff;border-bottom:solid 2px #fff;padding:0 3px;-webkit-box-decoration-break:clone;box-decoration-break:clone}article.pytorch-article .section :not(dt)>code .pre{outline:0;padding:0}article.pytorch-article .function dt,article.pytorch-article .attribute dt,article.pytorch-article .class .attribute dt,article.pytorch-article .class dt{position:relative;background:#f3f4f7;padding:.5rem;border-left:3px solid #ee4c2c;word-wrap:break-word;padding-right:100px}article.pytorch-article .function dt em.property,article.pytorch-article .attribute dt em.property,article.pytorch-article .class dt em.property{font-family:inherit}article.pytorch-article .function dt em,article.pytorch-article .attribute dt em,article.pytorch-article .class .attribute dt em,article.pytorch-article .class dt em,article.pytorch-article .function dt .sig-paren,article.pytorch-article .attribute dt .sig-paren,article.pytorch-article .class dt .sig-paren{font-family:IBMPlexMono,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:87.5%}article.pytorch-article .function dt a,article.pytorch-article .attribute dt a,article.pytorch-article .class .attribute dt a,article.pytorch-article .class dt a{right:30px;padding-right:0;top:50%;-webkit-transform:perspective(1px) translateY(-50%);transform:perspective(1px) translateY(-50%)}article.pytorch-article .function dt:hover .viewcode-link,article.pytorch-article .attribute dt:hover .viewcode-link,article.pytorch-article .class dt:hover .viewcode-link{color:#ee4c2c}article.pytorch-article .function .anchorjs-link,article.pytorch-article .attribute .anchorjs-link,article.pytorch-article .class .anchorjs-link{display:inline;position:absolute;right:8px;font-size:1.5625rem !important;padding-left:0}article.pytorch-article .function dt>code,article.pytorch-article .attribute dt>code,article.pytorch-article .class .attribute dt>code,article.pytorch-article .class dt>code{color:#262626;border-top:solid 2px #f3f4f7;background-color:#f3f4f7;border-bottom:solid 2px #f3f4f7;-webkit-box-decoration-break:clone;box-decoration-break:clone}article.pytorch-article .function .viewcode-link,article.pytorch-article .attribute .viewcode-link,article.pytorch-article .class .viewcode-link{padding-left:.6rem;position:absolute;font-size:.875rem;color:#979797;letter-spacing:0;line-height:1.5rem;text-transform:uppercase}article.pytorch-article .function dd,article.pytorch-article .attribute dd,article.pytorch-article .class .attribute dd,article.pytorch-article .class dd{padding-left:3.75rem}article.pytorch-article .function dd p,article.pytorch-article .attribute dd p,article.pytorch-article .class .attribute dd p,article.pytorch-article .class dd p{color:#262626}article.pytorch-article .function table tbody tr th.field-name,article.pytorch-article .attribute table tbody tr th.field-name,article.pytorch-article .class table tbody tr th.field-name{white-space:nowrap;color:#262626;width:20%}@media screen and (min-width:768px){article.pytorch-article .function table tbody tr th.field-name,article.pytorch-article .attribute table tbody tr th.field-name,article.pytorch-article .class table tbody tr th.field-name{width:15%}}article.pytorch-article .function table tbody tr td.field-body,article.pytorch-article .attribute table tbody tr td.field-body,article.pytorch-article .class table tbody tr td.field-body{padding:.625rem;width:80%;color:#262626}@media screen and (min-width:768px){article.pytorch-article .function table tbody tr td.field-body,article.pytorch-article .attribute table tbody tr td.field-body,article.pytorch-article .class table tbody tr td.field-body{width:85%}}@media screen and (min-width:1600px){article.pytorch-article .function table tbody tr td.field-body,article.pytorch-article .attribute table tbody tr td.field-body,article.pytorch-article .class table tbody tr td.field-body{padding-left:1.25rem}}article.pytorch-article .function table tbody tr td.field-body p,article.pytorch-article .attribute table tbody tr td.field-body p,article.pytorch-article .class table tbody tr td.field-body p{padding-left:0}article.pytorch-article .function table tbody tr td.field-body p:last-of-type,article.pytorch-article .attribute table tbody tr td.field-body p:last-of-type,article.pytorch-article .class table tbody tr td.field-body p:last-of-type{margin-bottom:0}article.pytorch-article .function table tbody tr td.field-body ol,article.pytorch-article .attribute table tbody tr td.field-body ol,article.pytorch-article .class table tbody tr td.field-body ol,article.pytorch-article .function table tbody tr td.field-body ul,article.pytorch-article .attribute table tbody tr td.field-body ul,article.pytorch-article .class table tbody tr td.field-body ul{padding-left:1rem;padding-bottom:0}article.pytorch-article .function table.docutils.field-list,article.pytorch-article .attribute table.docutils.field-list,article.pytorch-article .class table.docutils.field-list{margin-bottom:.75rem}article.pytorch-article .attribute .has-code{float:none}article.pytorch-article .class dt{border-left:none;border-top:3px solid #ee4c2c;padding-left:4em}article.pytorch-article .class dt em.property{position:absolute;left:.5rem}article.pytorch-article .class dd .docutils dt{padding-left:.5rem}article.pytorch-article .class em.property{text-transform:uppercase;font-style:normal;color:#ee4c2c;font-size:1rem;letter-spacing:0;padding-right:.75rem}article.pytorch-article .class dl dt em.property{position:static;left:0;padding-right:0}article.pytorch-article .class .method dt,article.pytorch-article .class .staticmethod dt{border-left:3px solid #ee4c2c;border-top:none}article.pytorch-article .class .method dt,article.pytorch-article .class .staticmethod dt{padding-left:.5rem}article.pytorch-article .class .attribute dt{border-top:none}article.pytorch-article .class .attribute dt em.property{position:relative;left:0}article.pytorch-article table{table-layout:fixed}div.deprecated p{display:inline}div.deprecated,div.versionchanged{margin-top:.5rem;padding:.5rem;margin-bottom:.5rem;border:none}div.versionadded{margin:1rem 0}div.deprecated p:last-child,div.versionchanged p:last-child,div.versionadded p:last-child{margin-bottom:0}div.deprecated{color:#b94a48;background-color:#fdede9}div.versionchanged{background-color:#fffbe8}article.pytorch-article .note,article.pytorch-article .warning,article.pytorch-article .tip,article.pytorch-article .seealso,article.pytorch-article .hint,article.pytorch-article .important,article.pytorch-article .caution,article.pytorch-article .danger,article.pytorch-article .attention,article.pytorch-article .error{background:#f3f4f7;margin-top:1.875rem;margin-bottom:1.125rem}article.pytorch-article .note .admonition-title,article.pytorch-article .warning .admonition-title,article.pytorch-article .tip .admonition-title,article.pytorch-article .seealso .admonition-title,article.pytorch-article .hint .admonition-title,article.pytorch-article .important .admonition-title,article.pytorch-article .caution .admonition-title,article.pytorch-article .danger .admonition-title,article.pytorch-article .attention .admonition-title,article.pytorch-article .error .admonition-title{color:#fff;letter-spacing:1px;text-transform:uppercase;margin-bottom:1.125rem;padding:3px 0 3px 1.375rem;position:relative;font-size:.875rem}article.pytorch-article .note .admonition-title:before,article.pytorch-article .warning .admonition-title:before,article.pytorch-article .tip .admonition-title:before,article.pytorch-article .seealso .admonition-title:before,article.pytorch-article .hint .admonition-title:before,article.pytorch-article .important .admonition-title:before,article.pytorch-article .caution .admonition-title:before,article.pytorch-article .danger .admonition-title:before,article.pytorch-article .attention .admonition-title:before,article.pytorch-article .error .admonition-title:before{content:"\2022";position:absolute;left:9px;color:#fff;top:2px}article.pytorch-article .note p:nth-child(n + 2),article.pytorch-article .warning p:nth-child(n + 2),article.pytorch-article .tip p:nth-child(n + 2),article.pytorch-article .seealso p:nth-child(n + 2),article.pytorch-article .hint p:nth-child(n + 2),article.pytorch-article .important p:nth-child(n + 2),article.pytorch-article .caution p:nth-child(n + 2),article.pytorch-article .danger p:nth-child(n + 2),article.pytorch-article .attention p:nth-child(n + 2),article.pytorch-article .error p:nth-child(n + 2){padding:0 1.375rem}article.pytorch-article .note table,article.pytorch-article .warning table,article.pytorch-article .tip table,article.pytorch-article .seealso table,article.pytorch-article .hint table,article.pytorch-article .important table,article.pytorch-article .caution table,article.pytorch-article .danger table,article.pytorch-article .attention table,article.pytorch-article .error table{margin:0 2rem;width:auto}article.pytorch-article .note :not(dt)>code,article.pytorch-article .warning :not(dt)>code,article.pytorch-article .tip :not(dt)>code,article.pytorch-article .seealso :not(dt)>code,article.pytorch-article .hint :not(dt)>code,article.pytorch-article .important :not(dt)>code,article.pytorch-article .caution :not(dt)>code,article.pytorch-article .danger :not(dt)>code,article.pytorch-article .attention :not(dt)>code,article.pytorch-article .error :not(dt)>code{border-top:solid 2px #fff;background-color:#fff;border-bottom:solid 2px #fff;padding:0 3px;-webkit-box-decoration-break:clone;box-decoration-break:clone;outline:1px solid #e9e9e9}article.pytorch-article .note :not(dt)>code .pre,article.pytorch-article .warning :not(dt)>code .pre,article.pytorch-article .tip :not(dt)>code .pre,article.pytorch-article .seealso :not(dt)>code .pre,article.pytorch-article .hint :not(dt)>code .pre,article.pytorch-article .important :not(dt)>code .pre,article.pytorch-article .caution :not(dt)>code .pre,article.pytorch-article .danger :not(dt)>code .pre,article.pytorch-article .attention :not(dt)>code .pre,article.pytorch-article .error :not(dt)>code .pre{outline:0;padding:0}article.pytorch-article .note pre,article.pytorch-article .warning pre,article.pytorch-article .tip pre,article.pytorch-article .seealso pre,article.pytorch-article .hint pre,article.pytorch-article .important pre,article.pytorch-article .caution pre,article.pytorch-article .danger pre,article.pytorch-article .attention pre,article.pytorch-article .error pre{margin-bottom:0}article.pytorch-article .note .highlight,article.pytorch-article .warning .highlight,article.pytorch-article .tip .highlight,article.pytorch-article .seealso .highlight,article.pytorch-article .hint .highlight,article.pytorch-article .important .highlight,article.pytorch-article .caution .highlight,article.pytorch-article .danger .highlight,article.pytorch-article .attention .highlight,article.pytorch-article .error .highlight{margin:0 2rem 1.125rem 2rem}article.pytorch-article .note ul,article.pytorch-article .note ol,article.pytorch-article .warning ul,article.pytorch-article .warning ol,article.pytorch-article .tip ul,article.pytorch-article .tip ol,article.pytorch-article .seealso ul,article.pytorch-article .seealso ol,article.pytorch-article .hint ul,article.pytorch-article .hint ol,article.pytorch-article .important ul,article.pytorch-article .important ol,article.pytorch-article .caution ul,article.pytorch-article .caution ol,article.pytorch-article .danger ul,article.pytorch-article .danger ol,article.pytorch-article .attention ul,article.pytorch-article .attention ol,article.pytorch-article .error ul,article.pytorch-article .error ol{padding-left:3.25rem}article.pytorch-article .note ul li,article.pytorch-article .note ol li,article.pytorch-article .warning ul li,article.pytorch-article .warning ol li,article.pytorch-article .tip ul li,article.pytorch-article .tip ol li,article.pytorch-article .seealso ul li,article.pytorch-article .seealso ol li,article.pytorch-article .hint ul li,article.pytorch-article .hint ol li,article.pytorch-article .important ul li,article.pytorch-article .important ol li,article.pytorch-article .caution ul li,article.pytorch-article .caution ol li,article.pytorch-article .danger ul li,article.pytorch-article .danger ol li,article.pytorch-article .attention ul li,article.pytorch-article .attention ol li,article.pytorch-article .error ul li,article.pytorch-article .error ol li{color:#262626}article.pytorch-article .note p,article.pytorch-article .warning p,article.pytorch-article .tip p,article.pytorch-article .seealso p,article.pytorch-article .hint p,article.pytorch-article .important p,article.pytorch-article .caution p,article.pytorch-article .danger p,article.pytorch-article .attention p,article.pytorch-article .error p{margin-top:1.125rem}article.pytorch-article .note .admonition-title{background:#54c7ec}article.pytorch-article .warning .admonition-title{background:#e94f3b}article.pytorch-article .tip .admonition-title{background:#6bcebb}article.pytorch-article .seealso .admonition-title{background:#6bcebb}article.pytorch-article .hint .admonition-title{background:#a2cdde}article.pytorch-article .important .admonition-title{background:#5890ff}article.pytorch-article .caution .admonition-title{background:#f7923a}article.pytorch-article .danger .admonition-title{background:#db2c49}article.pytorch-article .attention .admonition-title{background:#f5a623}article.pytorch-article .error .admonition-title{background:#cc2f90}article.pytorch-article .sphx-glr-download-link-note.admonition.note,article.pytorch-article .reference.download.internal,article.pytorch-article .sphx-glr-signature{display:none}article.pytorch-article .admonition>p:last-of-type{margin-bottom:0;padding-bottom:1.125rem !important}.pytorch-article div.sphx-glr-download a{background-color:#f3f4f7;background-image:url(../images/arrow-down-orange.svg);background-repeat:no-repeat;background-position:left 10px center;background-size:15px 15px;border-radius:0;border:0;display:block;text-align:left;padding:.9375rem 3.125rem;position:relative;margin:1.25rem auto}@media screen and (min-width:768px){.pytorch-article div.sphx-glr-download a:after{content:"";display:block;width:0;height:1px;position:absolute;bottom:0;left:0;background-color:#e44c2c;-webkit-transition:width .250s ease-in-out;transition:width .250s ease-in-out}.pytorch-article div.sphx-glr-download a:hover:after{width:100%}}@media screen and (min-width:768px){.pytorch-article div.sphx-glr-download a:after{background-color:#ee4c2c}}@media screen and (min-width:768px){.pytorch-article div.sphx-glr-download a{background-position:left 20px center}}.pytorch-article div.sphx-glr-download a:hover{-webkit-box-shadow:none;box-shadow:none;text-decoration:none;background-image:url(../images/arrow-down-orange.svg);background-color:#f3f4f7}.pytorch-article div.sphx-glr-download a span.pre{background-color:transparent;font-size:1.125rem;padding:0;color:#262626}.pytorch-article div.sphx-glr-download a code,.pytorch-article div.sphx-glr-download a kbd,.pytorch-article div.sphx-glr-download a pre,.pytorch-article div.sphx-glr-download a samp,.pytorch-article div.sphx-glr-download a span.pre{font-family:FreightSans,Helvetica Neue,Helvetica,Arial,sans-serif}.pytorch-article p.sphx-glr-script-out{margin-bottom:1.125rem}.pytorch-article div.sphx-glr-script-out{margin-bottom:2.5rem}.pytorch-article div.sphx-glr-script-out .highlight{margin-left:0;margin-top:0}.pytorch-article div.sphx-glr-script-out .highlight pre{background-color:#fdede9;padding:1.5625rem;color:#837b79}.pytorch-article div.sphx-glr-script-out + p{margin-top:unset}article.pytorch-article .wy-table-responsive table{border:0;border-color:#fff !important;table-layout:fixed}article.pytorch-article .wy-table-responsive table thead tr{border-bottom:2px solid #6c6c6d}article.pytorch-article .wy-table-responsive table thead th{line-height:1.75rem;padding-left:.9375rem;padding-right:.9375rem}article.pytorch-article .wy-table-responsive table tbody .row-odd{background-color:#f3f4f7}article.pytorch-article .wy-table-responsive table tbody td{color:#6c6c6d;white-space:normal;padding:.9375rem;font-size:1rem;line-height:1.375rem}article.pytorch-article .wy-table-responsive table tbody td .pre{background:#fff;color:#ee4c2c;font-size:87.5%}article.pytorch-article .wy-table-responsive table tbody td code{font-size:87.5%}a[rel~="prev"],a[rel~="next"]{padding:.375rem 0 0 0}img.next-page,img.previous-page{width:8px;height:10px;position:relative;top:-1px}img.previous-page{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.rst-footer-buttons{margin-top:1.875rem;margin-bottom:1.875rem}.rst-footer-buttons .btn:focus,.rst-footer-buttons .btn.focus{-webkit-box-shadow:none;box-shadow:none}article.pytorch-article blockquote{margin-left:3.75rem;color:#6c6c6d}article.pytorch-article .caption{color:#6c6c6d;letter-spacing:.25px;line-height:2.125rem}article.pytorch-article .math{color:#262626;width:auto;text-align:center}article.pytorch-article .math img{width:auto}.pytorch-breadcrumbs-wrapper{width:100%}@media screen and (min-width:1101px){.pytorch-breadcrumbs-wrapper{float:left;margin-left:3%;width:75%}}@media screen and (min-width:1600px){.pytorch-breadcrumbs-wrapper{width:850px;margin-left:1.875rem}}.pytorch-breadcrumbs-wrapper .pytorch-breadcrumbs-aside{float:right}.pytorch-breadcrumbs-wrapper .pytorch-breadcrumbs-aside .fa.fa-github{margin-top:5px;display:block}.pytorch-article .container{padding-left:0;padding-right:0;max-width:none}a:link,a:visited,a:hover{color:#ee4c2c}::-webkit-input-placeholder{color:#ee4c2c}::-moz-placeholder{color:#ee4c2c}:-ms-input-placeholder{color:#ee4c2c}:-moz-placeholder{color:#ee4c2c}@media screen and (min-width:768px){.site-footer a:hover{color:#ee4c2c}}.docs-tutorials-resources a{color:#ee4c2c}.header-holder{position:relative;z-index:201}.header-holder .main-menu ul li.active:after{color:#ee4c2c}.header-holder .main-menu ul li.active a{color:#ee4c2c}@media screen and (min-width:1100px){.header-holder .main-menu ul li a:hover{color:#ee4c2c}}.mobile-main-menu.open ul li.active a{color:#ee4c2c}.version{padding-bottom:1rem}.pytorch-call-to-action-links{padding-top:0;display:-webkit-box;display:-ms-flexbox;display:flex}@media screen and (min-width:768px){.pytorch-call-to-action-links{padding-top:2.5rem}}@media (min-width:768px) and (max-width:1239px){.pytorch-call-to-action-links{padding-top:0}}@media (min-width:1100px) and (max-width:1239px){.pytorch-call-to-action-links{padding-top:2.5rem}}.pytorch-call-to-action-links #tutorial-type{display:none}.pytorch-call-to-action-links .call-to-action-img,.pytorch-call-to-action-links .call-to-action-notebook-img{height:1.375rem;width:1.375rem;margin-right:10px}.pytorch-call-to-action-links .call-to-action-notebook-img{height:1rem}.pytorch-call-to-action-links a{padding-right:1.25rem;color:#000;cursor:pointer}.pytorch-call-to-action-links a:hover{color:#e44c2c}.pytorch-call-to-action-links a .call-to-action-desktop-view{display:none}@media screen and (min-width:768px){.pytorch-call-to-action-links a .call-to-action-desktop-view{display:block}}.pytorch-call-to-action-links a .call-to-action-mobile-view{display:block}@media screen and (min-width:768px){.pytorch-call-to-action-links a .call-to-action-mobile-view{display:none}}.pytorch-call-to-action-links a #google-colab-link,.pytorch-call-to-action-links a #download-notebook-link,.pytorch-call-to-action-links a #github-view-link{padding-bottom:.625rem;border-bottom:1px solid #f3f4f7;padding-right:2.5rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.pytorch-call-to-action-links a #google-colab-link:hover,.pytorch-call-to-action-links a #download-notebook-link:hover,.pytorch-call-to-action-links a #github-view-link:hover{border-bottom-color:#e44c2c;color:#e44c2c}#tutorial-cards-container #tutorial-cards{width:100%}#tutorial-cards-container .tutorials-nav{padding-left:0;padding-right:0;padding-bottom:0}#tutorial-cards-container .tutorials-hr{margin-top:1rem;margin-bottom:1rem}#tutorial-cards-container .card.tutorials-card{border-radius:0;border-color:#f3f4f7;height:98px;margin-bottom:1.25rem;margin-bottom:1.875rem;overflow:scroll;background-color:#f3f4f7;cursor:pointer}@media screen and (min-width:1240px){#tutorial-cards-container .card.tutorials-card{height:200px;overflow:inherit}}@media (min-width:768px) and (max-width:1239px){#tutorial-cards-container .card.tutorials-card{height:200px;overflow:scroll}}#tutorial-cards-container .card.tutorials-card .tutorials-image{position:absolute;top:0;right:0;height:96px;width:96px;opacity:.5}#tutorial-cards-container .card.tutorials-card .tutorials-image img{height:100%;width:100%}@media screen and (min-width:768px){#tutorial-cards-container .card.tutorials-card .tutorials-image{height:100%;width:25%}}@media (min-width:768px) and (max-width:1239px){#tutorial-cards-container .card.tutorials-card .tutorials-image{height:100%;width:198px}}#tutorial-cards-container .card.tutorials-card .tutorials-image:before{content:'';position:absolute;top:0;left:0;bottom:0;right:0;z-index:1;background:#000;opacity:.075}#tutorial-cards-container .card.tutorials-card .card-title-container{width:70%;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}@media screen and (min-width:768px){#tutorial-cards-container .card.tutorials-card .card-title-container{width:75%}}@media (min-width:768px) and (max-width:1239px){#tutorial-cards-container .card.tutorials-card .card-title-container{width:70%}}#tutorial-cards-container .card.tutorials-card .card-title-container h4{margin-bottom:1.125rem;margin-top:0;font-size:1.5rem}#tutorial-cards-container .card.tutorials-card p.card-summary,#tutorial-cards-container .card.tutorials-card p.tags{font-size:.9375rem;line-height:1.5rem;margin-bottom:0;color:#6c6c6d;font-weight:400;width:70%}@media screen and (min-width:768px){#tutorial-cards-container .card.tutorials-card p.card-summary,#tutorial-cards-container .card.tutorials-card p.tags{width:75%}}@media (min-width:768px) and (max-width:1239px){#tutorial-cards-container .card.tutorials-card p.card-summary,#tutorial-cards-container .card.tutorials-card p.tags{width:70%}}#tutorial-cards-container .card.tutorials-card p.tags{margin-top:30px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}#tutorial-cards-container .card.tutorials-card h4{color:#262626;margin-bottom:1.125rem}#tutorial-cards-container .card.tutorials-card a{height:100%}@media screen and (min-width:768px){#tutorial-cards-container .card.tutorials-card a{min-height:190px}}@media (min-width:768px) and (max-width:1239px){#tutorial-cards-container .card.tutorials-card a{min-height:234px}}@media screen and (min-width:768px){#tutorial-cards-container .card.tutorials-card:after{content:"";display:block;width:0;height:1px;position:absolute;bottom:0;left:0;background-color:#e44c2c;-webkit-transition:width .250s ease-in-out;transition:width .250s ease-in-out}#tutorial-cards-container .card.tutorials-card:hover:after{width:100%}}#tutorial-cards-container .card.tutorials-card:hover{background-color:#fff;border:1px solid #e2e2e2;border-bottom:none}#tutorial-cards-container .card.tutorials-card:hover p.card-summary{color:#262626}#tutorial-cards-container .card.tutorials-card:hover .tutorials-image{opacity:unset}#tutorial-cards-container .tutorial-tags-container{width:75%}#tutorial-cards-container .tutorial-tags-container.active{width:0}#tutorial-cards-container .tutorial-filter-menu ul{list-style-type:none;padding-left:1.25rem}#tutorial-cards-container .tutorial-filter-menu ul li{padding-right:1.25rem;word-break:break-all}#tutorial-cards-container .tutorial-filter-menu ul li a{color:#979797}#tutorial-cards-container .tutorial-filter-menu ul li a:hover{color:#e44c2c}#tutorial-cards-container .tutorial-filter{cursor:pointer}#tutorial-cards-container .filter-btn{color:#979797;border:1px solid #979797;display:inline-block;text-align:center;white-space:nowrap;vertical-align:middle;padding:.375rem .75rem;font-size:1rem;line-height:1.5;margin-bottom:5px}#tutorial-cards-container .filter-btn:hover{border:1px solid #e44c2c;color:#e44c2c}#tutorial-cards-container .filter-btn.selected{background-color:#e44c2c;border:1px solid #e44c2c;color:#fff}#tutorial-cards-container .all-tag-selected{background-color:#979797;color:#fff}#tutorial-cards-container .all-tag-selected:hover{border-color:#979797;color:#fff}#tutorial-cards-container .pagination .page{border:1px solid #dee2e6;padding:.5rem .75rem}#tutorial-cards-container .pagination .active .page{background-color:#dee2e6}article.pytorch-article .tutorials-callout-container{padding-bottom:50px}article.pytorch-article .tutorials-callout-container .col-md-6{padding-bottom:10px}article.pytorch-article .tutorials-callout-container .text-container{padding:10px 0 30px 0;padding-bottom:10px}article.pytorch-article .tutorials-callout-container .text-container .body-paragraph{color:#666;font-weight:300;font-size:1.125rem;line-height:1.875rem}article.pytorch-article .tutorials-callout-container .btn.callout-button{font-size:1.125rem;border-radius:0;border:0;background-color:#f3f4f7;color:#6c6c6d;font-weight:400;position:relative;letter-spacing:.25px}@media screen and (min-width:768px){article.pytorch-article .tutorials-callout-container .btn.callout-button:after{content:"";display:block;width:0;height:1px;position:absolute;bottom:0;left:0;background-color:#e44c2c;-webkit-transition:width .250s ease-in-out;transition:width .250s ease-in-out}article.pytorch-article .tutorials-callout-container .btn.callout-button:hover:after{width:100%}}article.pytorch-article .tutorials-callout-container .btn.callout-button a{color:inherit}.pytorch-container{margin:0 auto;padding:0 1.875rem;width:auto;position:relative}@media screen and (min-width:1100px){.pytorch-container{padding:0}}@media screen and (min-width:1101px){.pytorch-container{margin-left:25%}}@media screen and (min-width:1600px){.pytorch-container{margin-left:350px}}.pytorch-container:before,.pytorch-container:after{content:"";display:table}.pytorch-container:after{clear:both}.pytorch-container{*zoom:1}.pytorch-content-wrap{background-color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;padding-top:0}.pytorch-content-wrap:before,.pytorch-content-wrap:after{content:"";display:table}.pytorch-content-wrap:after{clear:both}.pytorch-content-wrap{*zoom:1}@media screen and (min-width:1101px){.pytorch-content-wrap{padding-top:45px;float:left;width:100%;display:block}}@media screen and (min-width:1600px){.pytorch-content-wrap{width:100%}}.pytorch-content{background:#fff;width:100%;max-width:700px;position:relative}.pytorch-content-left{min-height:100vh;margin-top:2.5rem;width:100%}@media screen and (min-width:1101px){.pytorch-content-left{margin-top:0;margin-left:3%;width:75%;float:left}}@media screen and (min-width:1600px){.pytorch-content-left{width:850px;margin-left:30px}}.pytorch-content-left .main-content{padding-top:.9375rem}.pytorch-content-left .main-content ul.simple{padding-bottom:1.25rem}.pytorch-content-left .main-content .note:nth-child(1),.pytorch-content-left .main-content .warning:nth-child(1){margin-top:0}.pytorch-content-right{display:none;position:relative;overflow-x:hidden;overflow-y:hidden}@media screen and (min-width:1101px){.pytorch-content-right{display:block;margin-left:0;width:19%;float:left;height:100%}}@media screen and (min-width:1600px){.pytorch-content-right{width:280px}}@media screen and (min-width:1101px){.pytorch-side-scroll{position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}}.pytorch-menu-vertical{padding:1.25rem 1.875rem 2.5rem 1.875rem}@media screen and (min-width:1101px){.pytorch-menu-vertical{display:block;padding-top:0;padding-right:13.5%;padding-bottom:5.625rem}}@media screen and (min-width:1600px){.pytorch-menu-vertical{padding-left:0;padding-right:1.5625rem}}.pytorch-left-menu{display:none;background-color:#f3f4f7;color:#262626;overflow:scroll}@media screen and (min-width:1101px){.pytorch-left-menu{display:block;overflow-x:hidden;overflow-y:hidden;padding-bottom:110px;padding:0 1.875rem 0 0;width:25%;z-index:200;float:left}.pytorch-left-menu.make-fixed{position:fixed;top:0;bottom:0;left:0;float:none}}@media screen and (min-width:1600px){.pytorch-left-menu{padding:0 0 0 1.875rem;width:350px}}.expand-menu,.hide-menu{color:#6c6c6d;padding-left:10px;cursor:pointer}.collapse{display:none}.left-nav-top-caption{padding-top:1rem}.pytorch-left-menu p.caption{color:#262626;display:block;font-size:1rem;line-height:1.375rem;margin-bottom:1rem;text-transform:none;white-space:normal}.pytorch-left-menu-search{margin-bottom:2.5rem}@media screen and (min-width:1101px){.pytorch-left-menu-search{margin:1.25rem .625rem 1.875rem 0}}.pytorch-left-menu-search ::-webkit-input-placeholder{color:#262626}.pytorch-left-menu-search ::-moz-placeholder{color:#262626}.pytorch-left-menu-search :-ms-input-placeholder{color:#262626}.pytorch-left-menu-search ::-ms-input-placeholder{color:#262626}.pytorch-left-menu-search ::placeholder{color:#262626}.pytorch-left-menu-search :focus::-webkit-input-placeholder{color:transparent}.pytorch-left-menu-search :focus::-moz-placeholder{color:transparent}.pytorch-left-menu-search :focus:-ms-input-placeholder{color:transparent}.pytorch-left-menu-search :focus::-ms-input-placeholder{color:transparent}.pytorch-left-menu-search :focus::placeholder{color:transparent}.pytorch-left-menu-search input[type=text]{border-radius:0;padding:.5rem .75rem;border-color:#fff;color:#262626;border-style:solid;font-size:1rem;width:100%;background-color:#f3f4f7;background-image:url(../images/search-icon.svg);background-repeat:no-repeat;background-size:18px 18px;background-position:12px 10px;padding-left:40px;background-color:#fff}.pytorch-left-menu-search input[type=text]:focus{outline:0}@media screen and (min-width:1101px){.pytorch-left-menu .pytorch-side-scroll{width:120%}}@media screen and (min-width:1600px){.pytorch-left-menu .pytorch-side-scroll{width:340px}}.pytorch-right-menu{min-height:100px;overflow-x:hidden;overflow-y:hidden;left:0;z-index:200;padding-top:0;position:relative}@media screen and (min-width:1101px){.pytorch-right-menu{width:100%}.pytorch-right-menu.scrolling-fixed{position:fixed;top:45px;left:83.5%;width:14%}.pytorch-right-menu.scrolling-absolute{position:absolute;left:0}}@media screen and (min-width:1600px){.pytorch-right-menu{left:0;width:380px}.pytorch-right-menu.scrolling-fixed{position:fixed;top:45px;left:1230px}.pytorch-right-menu.scrolling-absolute{position:absolute;left:0}}.pytorch-left-menu ul,.pytorch-right-menu ul{list-style-type:none;padding-left:0;margin-bottom:2.5rem}.pytorch-left-menu>ul,.pytorch-right-menu>ul{margin-bottom:2.5rem}.pytorch-left-menu a:link,.pytorch-left-menu a:visited,.pytorch-left-menu a:hover,.pytorch-right-menu a:link,.pytorch-right-menu a:visited,.pytorch-right-menu a:hover{color:#6c6c6d;font-size:.875rem;line-height:1rem;padding:0;text-decoration:none}.pytorch-left-menu a:link.reference.internal,.pytorch-left-menu a:visited.reference.internal,.pytorch-left-menu a:hover.reference.internal,.pytorch-right-menu a:link.reference.internal,.pytorch-right-menu a:visited.reference.internal,.pytorch-right-menu a:hover.reference.internal{margin-bottom:.3125rem;position:relative}.pytorch-left-menu li code,.pytorch-right-menu li code{border:0;background:inherit;color:inherit;padding-left:0;padding-right:0}.pytorch-left-menu li span.toctree-expand,.pytorch-right-menu li span.toctree-expand{display:block;float:left;margin-left:-1.2em;font-size:.8em;line-height:1.6em}.pytorch-left-menu li.on a,.pytorch-left-menu li.current>a,.pytorch-right-menu li.on a,.pytorch-right-menu li.current>a{position:relative;border:none}.pytorch-left-menu li.on a span.toctree-expand,.pytorch-left-menu li.current>a span.toctree-expand,.pytorch-right-menu li.on a span.toctree-expand,.pytorch-right-menu li.current>a span.toctree-expand{display:block;font-size:.8em;line-height:1.6em}.pytorch-left-menu li.toctree-l1.current>a,.pytorch-right-menu li.toctree-l1.current>a{color:#ee4c2c}.pytorch-left-menu li.toctree-l1.current>a:before,.pytorch-right-menu li.toctree-l1.current>a:before{content:"\2022";display:inline-block;position:absolute;left:-15px;top:-10%;font-size:1.375rem;color:#ee4c2c}@media screen and (min-width:1101px){.pytorch-left-menu li.toctree-l1.current>a:before,.pytorch-right-menu li.toctree-l1.current>a:before{left:-20px}}.pytorch-left-menu li.toctree-l1.current li.toctree-l2>ul,.pytorch-left-menu li.toctree-l2.current li.toctree-l3>ul,.pytorch-right-menu li.toctree-l1.current li.toctree-l2>ul,.pytorch-right-menu li.toctree-l2.current li.toctree-l3>ul{display:none}.pytorch-left-menu li.toctree-l1.current li.toctree-l2.current>ul,.pytorch-left-menu li.toctree-l2.current li.toctree-l3.current>ul,.pytorch-right-menu li.toctree-l1.current li.toctree-l2.current>ul,.pytorch-right-menu li.toctree-l2.current li.toctree-l3.current>ul{display:block}.pytorch-left-menu li.toctree-l2.current li.toctree-l3>a,.pytorch-right-menu li.toctree-l2.current li.toctree-l3>a{display:block}.pytorch-left-menu li.toctree-l3,.pytorch-right-menu li.toctree-l3{font-size:.9em}.pytorch-left-menu li.toctree-l3.current li.toctree-l4>a,.pytorch-right-menu li.toctree-l3.current li.toctree-l4>a{display:block}.pytorch-left-menu li.toctree-l4,.pytorch-right-menu li.toctree-l4{font-size:.9em}.pytorch-left-menu li.current ul,.pytorch-right-menu li.current ul{display:block}.pytorch-left-menu li ul,.pytorch-right-menu li ul{margin-bottom:0;display:none}.pytorch-left-menu li ul li a,.pytorch-right-menu li ul li a{margin-bottom:0}.pytorch-left-menu a,.pytorch-right-menu a{display:inline-block;position:relative}.pytorch-left-menu a:hover,.pytorch-right-menu a:hover{cursor:pointer}.pytorch-left-menu a:active,.pytorch-right-menu a:active{cursor:pointer}.pytorch-left-menu ul{padding-left:0}.pytorch-right-menu a:link,.pytorch-right-menu a:visited,.pytorch-right-menu a:hover{color:#6c6c6d}.pytorch-right-menu a:link span.pre,.pytorch-right-menu a:visited span.pre,.pytorch-right-menu a:hover span.pre{color:#6c6c6d}.pytorch-right-menu a.reference.internal.expanded:before{content:"-";font-family:monospace;position:absolute;left:-12px}.pytorch-right-menu a.reference.internal.not-expanded:before{content:"+";font-family:monospace;position:absolute;left:-12px}.pytorch-right-menu li.active>a{color:#ee4c2c}.pytorch-right-menu li.active>a span.pre,.pytorch-right-menu li.active>a:before{color:#ee4c2c}.pytorch-right-menu li.active>a:after{content:"\2022";color:#e44c2c;display:inline-block;font-size:1.375rem;left:-17px;position:absolute;top:1px}.pytorch-right-menu .pytorch-side-scroll>ul>li>ul>li{margin-bottom:0}.pytorch-right-menu ul ul{padding-left:0}.pytorch-right-menu ul ul li{padding-left:0}.pytorch-right-menu ul ul li a.reference.internal{padding-left:0}.pytorch-right-menu ul ul li ul{display:none;padding-left:10px}.pytorch-right-menu ul ul li li a.reference.internal{padding-left:0}.pytorch-right-menu li ul{display:block}.pytorch-right-menu .pytorch-side-scroll{padding-top:20px}@media screen and (min-width:1101px){.pytorch-right-menu .pytorch-side-scroll{width:120%}}@media screen and (min-width:1600px){.pytorch-right-menu .pytorch-side-scroll{width:400px}}.pytorch-right-menu .pytorch-side-scroll>ul{padding-left:10%;padding-right:10%;margin-bottom:0}@media screen and (min-width:1600px){.pytorch-right-menu .pytorch-side-scroll>ul{padding-left:25px}}.pytorch-right-menu .pytorch-side-scroll>ul>li>a.reference.internal{color:#262626;font-weight:500}.pytorch-right-menu .pytorch-side-scroll ul li{position:relative}#pytorch-right-menu .side-scroll-highlight{color:#ee4c2c}.header-container{max-width:none;margin-top:4px}@media screen and (min-width:1101px){.header-container{margin-top:0}}@media screen and (min-width:1600px){.header-container{margin-top:0}}.container-fluid.header-holder{padding-right:0;padding-left:0}.header-holder .container{max-width:none;padding-right:1.875rem;padding-left:1.875rem}@media screen and (min-width:1101px){.header-holder .container{padding-right:1.875rem;padding-left:1.875rem}}.header-holder .main-menu{-webkit-box-pack:unset;-ms-flex-pack:unset;justify-content:unset;position:relative}@media screen and (min-width:1101px){.header-holder .main-menu ul{padding-left:0;margin-left:26%}}@media screen and (min-width:1600px){.header-holder .main-menu ul{padding-left:38px;margin-left:310px}}.pytorch-page-level-bar{display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#fff;border-bottom:1px solid #e2e2e2;width:100%;z-index:201}@media screen and (min-width:1101px){.pytorch-page-level-bar{left:0;display:-webkit-box;display:-ms-flexbox;display:flex;height:45px;padding-left:0;width:100%;position:absolute;z-index:1}.pytorch-page-level-bar.left-menu-is-fixed{position:fixed;top:0;left:25%;padding-left:0;right:0;width:75%}}@media screen and (min-width:1600px){.pytorch-page-level-bar{left:0;right:0;width:auto;z-index:1}.pytorch-page-level-bar.left-menu-is-fixed{left:350px;right:0;width:auto}}.pytorch-page-level-bar ul,.pytorch-page-level-bar li{margin:0}.pytorch-shortcuts-wrapper{display:none}@media screen and (min-width:1101px){.pytorch-shortcuts-wrapper{font-size:.875rem;float:left;margin-left:2%}}@media screen and (min-width:1600px){.pytorch-shortcuts-wrapper{margin-left:1.875rem}}.cookie-banner-wrapper{display:none}.cookie-banner-wrapper .container{padding-left:1.875rem;padding-right:1.875rem;max-width:1240px}.cookie-banner-wrapper.is-visible{display:block;position:fixed;bottom:0;background-color:#f3f4f7;min-height:100px;width:100%;z-index:401;border-top:3px solid #ededee}.cookie-banner-wrapper .gdpr-notice{color:#6c6c6d;margin-top:1.5625rem;text-align:left;max-width:1440px}@media screen and (min-width:768px){.cookie-banner-wrapper .gdpr-notice{width:77%}}@media (min-width:768px) and (max-width:1239px){.cookie-banner-wrapper .gdpr-notice{width:inherit}}.cookie-banner-wrapper .gdpr-notice .cookie-policy-link{color:#343434}.cookie-banner-wrapper .close-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:1px solid #f3f4f7;height:1.3125rem;position:absolute;bottom:42px;right:0;top:0;cursor:pointer;outline:none}@media screen and (min-width:768px){.cookie-banner-wrapper .close-button{right:20%;top:inherit}}@media (min-width:768px) and (max-width:1239px){.cookie-banner-wrapper .close-button{right:0;top:0}}.main-menu ul li .resources-dropdown a{cursor:pointer}.main-menu ul li .dropdown-menu{border-radius:0;padding:0}.main-menu ul li .dropdown-menu .dropdown-item{color:#6c6c6d;border-bottom:1px solid #e2e2e2}.main-menu ul li .dropdown-menu .dropdown-item:last-of-type{border-bottom-color:transparent}.main-menu ul li .dropdown-menu .dropdown-item:hover{background-color:#e44c2c}.main-menu ul li .dropdown-menu .dropdown-item p{font-size:1rem;color:#979797}.main-menu ul li .dropdown-menu a.dropdown-item:hover{color:#fff}.main-menu ul li .dropdown-menu a.dropdown-item:hover p{color:#fff}.resources-dropdown-menu{left:-75px;width:226px;display:none;position:absolute;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.15);border-radius:.25rem}.resources-dropdown:hover .resources-dropdown-menu{display:block}.main-menu ul li .resources-dropdown-menu{border-radius:0;padding:0}.main-menu ul li.active:hover .resources-dropdown-menu{display:block}.main-menu ul li .resources-dropdown-menu .dropdown-item{color:#6c6c6d;border-bottom:1px solid #e2e2e2}.resources-dropdown .with-down-orange-arrow{padding-right:2rem;position:relative;background:url(../images/chevron-down-orange.svg);background-size:14px 18px;background-position:top 7px right 10px;background-repeat:no-repeat}.with-down-arrow{padding-right:2rem;position:relative;background-image:url(../images/chevron-down-black.svg);background-size:14px 18px;background-position:top 7px right 10px;background-repeat:no-repeat}.with-down-arrow:hover{background-image:url(../images/chevron-down-orange.svg);background-repeat:no-repeat}.header-holder .main-menu ul li .resources-dropdown .doc-dropdown-option{padding-top:1rem}.header-holder .main-menu ul li a.nav-dropdown-item{display:block;font-size:1rem;line-height:1.3125rem;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#979797;text-align:center;background-color:transparent;border-bottom:1px solid #e2e2e2}.header-holder .main-menu ul li a.nav-dropdown-item:last-of-type{border-bottom-color:transparent}.header-holder .main-menu ul li a.nav-dropdown-item:hover{background-color:#e44c2c;color:white}.header-holder .main-menu ul li a.nav-dropdown-item .dropdown-title{font-size:1.125rem;color:#6c6c6d;letter-spacing:0;line-height:34px}.header-holder .main-menu ul li a.nav-dropdown-item:hover .dropdown-title{background-color:#e44c2c;color:white} \ No newline at end of file diff --git a/docs/v1.1.1/_static/doctools.js b/docs/v1.1.1/_static/doctools.js new file mode 100644 index 0000000000..daccd209da --- /dev/null +++ b/docs/v1.1.1/_static/doctools.js @@ -0,0 +1,315 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(x) { + return decodeURIComponent(x).replace(/\+/g, ' '); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { + this.initOnKeyListeners(); + } + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated === 'undefined') + return string; + return (typeof translated === 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated === 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) === 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this === '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, + + initOnKeyListeners: function() { + $(document).keydown(function(event) { + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box or textarea + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' + && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) { + switch (event.keyCode) { + case 37: // left + var prevHref = $('link[rel="prev"]').prop('href'); + if (prevHref) { + window.location.href = prevHref; + return false; + } + case 39: // right + var nextHref = $('link[rel="next"]').prop('href'); + if (nextHref) { + window.location.href = nextHref; + return false; + } + } + } + }); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/docs/v1.1.1/_static/documentation_options.js b/docs/v1.1.1/_static/documentation_options.js new file mode 100644 index 0000000000..d204020b4e --- /dev/null +++ b/docs/v1.1.1/_static/documentation_options.js @@ -0,0 +1,12 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: 'v1.1.1', + LANGUAGE: 'None', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false +}; \ No newline at end of file diff --git a/docs/v1.1.1/_static/file.png b/docs/v1.1.1/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/docs/v1.1.1/_static/file.png differ diff --git a/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-bold-italic.woff b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-bold-italic.woff new file mode 100644 index 0000000000..e317248423 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-bold-italic.woff differ diff --git a/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-bold-italic.woff2 b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-bold-italic.woff2 new file mode 100644 index 0000000000..cec2dc94fb Binary files /dev/null and b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-bold-italic.woff2 differ diff --git a/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-bold.woff b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-bold.woff new file mode 100644 index 0000000000..de46625edf Binary files /dev/null and b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-bold.woff differ diff --git a/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-bold.woff2 b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-bold.woff2 new file mode 100644 index 0000000000..dc05cd82bc Binary files /dev/null and b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-bold.woff2 differ diff --git a/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-book-italic.woff b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-book-italic.woff new file mode 100644 index 0000000000..a50e5038a4 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-book-italic.woff differ diff --git a/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-book-italic.woff2 b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-book-italic.woff2 new file mode 100644 index 0000000000..fe284db661 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-book-italic.woff2 differ diff --git a/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-book.woff b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-book.woff new file mode 100644 index 0000000000..6ab8775f00 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-book.woff differ diff --git a/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-book.woff2 b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-book.woff2 new file mode 100644 index 0000000000..2688739f1f Binary files /dev/null and b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-book.woff2 differ diff --git a/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-light-italic.woff b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-light-italic.woff new file mode 100644 index 0000000000..beda58d4e2 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-light-italic.woff differ diff --git a/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-light-italic.woff2 b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-light-italic.woff2 new file mode 100644 index 0000000000..e2fa0134b1 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-light-italic.woff2 differ diff --git a/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-light.woff b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-light.woff new file mode 100644 index 0000000000..226a0bf835 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-light.woff differ diff --git a/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-light.woff2 b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-light.woff2 new file mode 100644 index 0000000000..6d8ff2c045 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-light.woff2 differ diff --git a/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-medium-italic.woff b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-medium-italic.woff new file mode 100644 index 0000000000..a42115d63b Binary files /dev/null and b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-medium-italic.woff differ diff --git a/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-medium-italic.woff2 b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-medium-italic.woff2 new file mode 100644 index 0000000000..16a7713a45 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-medium-italic.woff2 differ diff --git a/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-medium.woff b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-medium.woff new file mode 100644 index 0000000000..5ea34539c6 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-medium.woff differ diff --git a/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-medium.woff2 b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-medium.woff2 new file mode 100644 index 0000000000..c58b6a528b Binary files /dev/null and b/docs/v1.1.1/_static/fonts/FreightSans/freight-sans-medium.woff2 differ diff --git a/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-Light.woff b/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-Light.woff new file mode 100644 index 0000000000..cf37a5c50b Binary files /dev/null and b/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-Light.woff differ diff --git a/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-Light.woff2 b/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-Light.woff2 new file mode 100644 index 0000000000..955a6eab5b Binary files /dev/null and b/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-Light.woff2 differ diff --git a/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-Medium.woff b/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-Medium.woff new file mode 100644 index 0000000000..fc65a679c2 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-Medium.woff differ diff --git a/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-Medium.woff2 b/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-Medium.woff2 new file mode 100644 index 0000000000..c352e40e34 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-Medium.woff2 differ diff --git a/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-Regular.woff b/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-Regular.woff new file mode 100644 index 0000000000..7d63d89f24 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-Regular.woff differ diff --git a/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-Regular.woff2 b/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-Regular.woff2 new file mode 100644 index 0000000000..d0d7ded907 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-Regular.woff2 differ diff --git a/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff b/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff new file mode 100644 index 0000000000..1da7753cf2 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff differ diff --git a/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff2 b/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff2 new file mode 100644 index 0000000000..79dffdb85f Binary files /dev/null and b/docs/v1.1.1/_static/fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff2 differ diff --git a/docs/v1.1.1/_static/fonts/font-awesome.css b/docs/v1.1.1/_static/fonts/font-awesome.css new file mode 100644 index 0000000000..e7dcefb822 --- /dev/null +++ b/docs/v1.1.1/_static/fonts/font-awesome.css @@ -0,0 +1 @@ +@charset "utf-8";/*!* Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license(Font:SIL OFL 1.1,CSS:MIT License) */@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(specimen/FontAwesome.woff2) format("woff2"),url(specimen/FontAwesome.woff) format("woff"),url(specimen/FontAwesome.ttf) format("truetype")}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0,mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2,mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} \ No newline at end of file diff --git a/docs/v1.1.1/_static/fonts/material-icons.css b/docs/v1.1.1/_static/fonts/material-icons.css new file mode 100644 index 0000000000..76de20cb10 --- /dev/null +++ b/docs/v1.1.1/_static/fonts/material-icons.css @@ -0,0 +1 @@ +@charset "utf-8";/*!* Licensed under the Apache License,Version 2.0(the "License");you may not * use this file except in compliance with the License. You may obtain a copy * of the License at:* * http://www.apache.org/licenses/LICENSE-2.0 * * UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING,SOFTWARE * DISTRIBUTED UNDER THE LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,EITHER EXPRESS OR IMPLIED. * SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING PERMISSIONS AND * LIMITATIONS UNDER THE LICENSE. */@font-face{font-display:swap;font-family:"Material Icons";font-style:normal;font-weight:400;src:local("Material Icons"),local("MaterialIcons-Regular"),url(specimen/MaterialIcons-Regular.woff2) format("woff2"),url(specimen/MaterialIcons-Regular.woff) format("woff"),url(specimen/MaterialIcons-Regular.ttf) format("truetype")} \ No newline at end of file diff --git a/docs/v1.1.1/_static/fonts/specimen/FontAwesome.ttf b/docs/v1.1.1/_static/fonts/specimen/FontAwesome.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/specimen/FontAwesome.ttf differ diff --git a/docs/v1.1.1/_static/fonts/specimen/FontAwesome.woff b/docs/v1.1.1/_static/fonts/specimen/FontAwesome.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/specimen/FontAwesome.woff differ diff --git a/docs/v1.1.1/_static/fonts/specimen/FontAwesome.woff2 b/docs/v1.1.1/_static/fonts/specimen/FontAwesome.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/specimen/FontAwesome.woff2 differ diff --git a/docs/v1.1.1/_static/fonts/specimen/MaterialIcons-Regular.ttf b/docs/v1.1.1/_static/fonts/specimen/MaterialIcons-Regular.ttf new file mode 100644 index 0000000000..7015564ad1 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/specimen/MaterialIcons-Regular.ttf differ diff --git a/docs/v1.1.1/_static/fonts/specimen/MaterialIcons-Regular.woff b/docs/v1.1.1/_static/fonts/specimen/MaterialIcons-Regular.woff new file mode 100644 index 0000000000..b648a3eea2 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/specimen/MaterialIcons-Regular.woff differ diff --git a/docs/v1.1.1/_static/fonts/specimen/MaterialIcons-Regular.woff2 b/docs/v1.1.1/_static/fonts/specimen/MaterialIcons-Regular.woff2 new file mode 100644 index 0000000000..9fa2112520 Binary files /dev/null and b/docs/v1.1.1/_static/fonts/specimen/MaterialIcons-Regular.woff2 differ diff --git a/docs/v1.1.1/_static/images/arrow-down-orange.svg b/docs/v1.1.1/_static/images/arrow-down-orange.svg new file mode 100644 index 0000000000..e9d8e9ecf2 --- /dev/null +++ b/docs/v1.1.1/_static/images/arrow-down-orange.svg @@ -0,0 +1,19 @@ + + + + Group 5 + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_static/images/arrow-right-with-tail.svg b/docs/v1.1.1/_static/images/arrow-right-with-tail.svg new file mode 100644 index 0000000000..5843588fca --- /dev/null +++ b/docs/v1.1.1/_static/images/arrow-right-with-tail.svg @@ -0,0 +1,19 @@ + + + + Page 1 + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_static/images/chevron-down-black.svg b/docs/v1.1.1/_static/images/chevron-down-black.svg new file mode 100644 index 0000000000..097bc076ec --- /dev/null +++ b/docs/v1.1.1/_static/images/chevron-down-black.svg @@ -0,0 +1,16 @@ + + + Created with Sketch. + + + + + + + + + + + + + diff --git a/docs/v1.1.1/_static/images/chevron-down-grey.svg b/docs/v1.1.1/_static/images/chevron-down-grey.svg new file mode 100644 index 0000000000..82d6514f25 --- /dev/null +++ b/docs/v1.1.1/_static/images/chevron-down-grey.svg @@ -0,0 +1,18 @@ + + + + +Created with Sketch. + + + + + + + + + + + + diff --git a/docs/v1.1.1/_static/images/chevron-down-orange.svg b/docs/v1.1.1/_static/images/chevron-down-orange.svg new file mode 100644 index 0000000000..fd79a57854 --- /dev/null +++ b/docs/v1.1.1/_static/images/chevron-down-orange.svg @@ -0,0 +1,16 @@ + + + Created with Sketch. + + + + + + + + + + + + + diff --git a/docs/v1.1.1/_static/images/chevron-down-white.svg b/docs/v1.1.1/_static/images/chevron-down-white.svg new file mode 100644 index 0000000000..e6c94e27b6 --- /dev/null +++ b/docs/v1.1.1/_static/images/chevron-down-white.svg @@ -0,0 +1,16 @@ + + + Created with Sketch. + + + + + + + + + + + + + diff --git a/docs/v1.1.1/_static/images/chevron-right-orange.svg b/docs/v1.1.1/_static/images/chevron-right-orange.svg new file mode 100644 index 0000000000..7033fc93bf --- /dev/null +++ b/docs/v1.1.1/_static/images/chevron-right-orange.svg @@ -0,0 +1,17 @@ + + + + +Page 1 +Created with Sketch. + + + + + + + + + + diff --git a/docs/v1.1.1/_static/images/chevron-right-white.svg b/docs/v1.1.1/_static/images/chevron-right-white.svg new file mode 100644 index 0000000000..dd9e77f261 --- /dev/null +++ b/docs/v1.1.1/_static/images/chevron-right-white.svg @@ -0,0 +1,17 @@ + + + + +Page 1 +Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_static/images/favicon.png b/docs/v1.1.1/_static/images/favicon.png new file mode 100644 index 0000000000..76d17f57ad Binary files /dev/null and b/docs/v1.1.1/_static/images/favicon.png differ diff --git a/docs/v1.1.1/_static/images/home-footer-background.jpg b/docs/v1.1.1/_static/images/home-footer-background.jpg new file mode 100644 index 0000000000..b307bb57f4 Binary files /dev/null and b/docs/v1.1.1/_static/images/home-footer-background.jpg differ diff --git a/docs/v1.1.1/_static/images/icon-close.svg b/docs/v1.1.1/_static/images/icon-close.svg new file mode 100644 index 0000000000..348964e79f --- /dev/null +++ b/docs/v1.1.1/_static/images/icon-close.svg @@ -0,0 +1,21 @@ + + + + Page 1 + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_static/images/icon-menu-dots-dark.svg b/docs/v1.1.1/_static/images/icon-menu-dots-dark.svg new file mode 100644 index 0000000000..fa2ad044b3 --- /dev/null +++ b/docs/v1.1.1/_static/images/icon-menu-dots-dark.svg @@ -0,0 +1,42 @@ + + + + Page 1 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/_static/images/icons/bitbucket.1b09e088.svg b/docs/v1.1.1/_static/images/icons/bitbucket.1b09e088.svg new file mode 100644 index 0000000000..cf58c14fbc --- /dev/null +++ b/docs/v1.1.1/_static/images/icons/bitbucket.1b09e088.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/v1.1.1/_static/images/icons/bitbucket.svg b/docs/v1.1.1/_static/images/icons/bitbucket.svg new file mode 100644 index 0000000000..cf58c14fbc --- /dev/null +++ b/docs/v1.1.1/_static/images/icons/bitbucket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/v1.1.1/_static/images/icons/github.f0b8504a.svg b/docs/v1.1.1/_static/images/icons/github.f0b8504a.svg new file mode 100644 index 0000000000..3d13b19751 --- /dev/null +++ b/docs/v1.1.1/_static/images/icons/github.f0b8504a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/v1.1.1/_static/images/icons/github.svg b/docs/v1.1.1/_static/images/icons/github.svg new file mode 100644 index 0000000000..3d13b19751 --- /dev/null +++ b/docs/v1.1.1/_static/images/icons/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/v1.1.1/_static/images/icons/gitlab.6dd19c00.svg b/docs/v1.1.1/_static/images/icons/gitlab.6dd19c00.svg new file mode 100644 index 0000000000..1d9fffa74f --- /dev/null +++ b/docs/v1.1.1/_static/images/icons/gitlab.6dd19c00.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/v1.1.1/_static/images/icons/gitlab.svg b/docs/v1.1.1/_static/images/icons/gitlab.svg new file mode 100644 index 0000000000..1d9fffa74f --- /dev/null +++ b/docs/v1.1.1/_static/images/icons/gitlab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/v1.1.1/_static/images/logo-dark.svg b/docs/v1.1.1/_static/images/logo-dark.svg new file mode 100644 index 0000000000..9b4c1a56ac --- /dev/null +++ b/docs/v1.1.1/_static/images/logo-dark.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/docs/v1.1.1/_static/images/logo-facebook-dark.svg b/docs/v1.1.1/_static/images/logo-facebook-dark.svg new file mode 100644 index 0000000000..cff17915c4 --- /dev/null +++ b/docs/v1.1.1/_static/images/logo-facebook-dark.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/docs/v1.1.1/_static/images/logo-icon.svg b/docs/v1.1.1/_static/images/logo-icon.svg new file mode 100644 index 0000000000..575f6823e4 --- /dev/null +++ b/docs/v1.1.1/_static/images/logo-icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/docs/v1.1.1/_static/images/logo-twitter-dark.svg b/docs/v1.1.1/_static/images/logo-twitter-dark.svg new file mode 100644 index 0000000000..1572570f88 --- /dev/null +++ b/docs/v1.1.1/_static/images/logo-twitter-dark.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/docs/v1.1.1/_static/images/logo-youtube-dark.svg b/docs/v1.1.1/_static/images/logo-youtube-dark.svg new file mode 100644 index 0000000000..e3cfedd79d --- /dev/null +++ b/docs/v1.1.1/_static/images/logo-youtube-dark.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/v1.1.1/_static/images/logo.svg b/docs/v1.1.1/_static/images/logo.svg new file mode 100644 index 0000000000..f8d44b9842 --- /dev/null +++ b/docs/v1.1.1/_static/images/logo.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/docs/v1.1.1/_static/images/pytorch-colab.svg b/docs/v1.1.1/_static/images/pytorch-colab.svg new file mode 100644 index 0000000000..2ab15e2f30 --- /dev/null +++ b/docs/v1.1.1/_static/images/pytorch-colab.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + diff --git a/docs/v1.1.1/_static/images/pytorch-download.svg b/docs/v1.1.1/_static/images/pytorch-download.svg new file mode 100644 index 0000000000..cc37d638e9 --- /dev/null +++ b/docs/v1.1.1/_static/images/pytorch-download.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/docs/v1.1.1/_static/images/pytorch-github.svg b/docs/v1.1.1/_static/images/pytorch-github.svg new file mode 100644 index 0000000000..2c2570da1d --- /dev/null +++ b/docs/v1.1.1/_static/images/pytorch-github.svg @@ -0,0 +1,15 @@ + + + + + + diff --git a/docs/v1.1.1/_static/images/pytorch-x.svg b/docs/v1.1.1/_static/images/pytorch-x.svg new file mode 100644 index 0000000000..74856ea9fd --- /dev/null +++ b/docs/v1.1.1/_static/images/pytorch-x.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/docs/v1.1.1/_static/images/search-icon.svg b/docs/v1.1.1/_static/images/search-icon.svg new file mode 100644 index 0000000000..ebb0df8677 --- /dev/null +++ b/docs/v1.1.1/_static/images/search-icon.svg @@ -0,0 +1,19 @@ + + + + Created with Sketch. + + + + + + + + + + + + + + + diff --git a/docs/v1.1.1/_static/images/view-page-source-icon.svg b/docs/v1.1.1/_static/images/view-page-source-icon.svg new file mode 100644 index 0000000000..6f5bbe0748 --- /dev/null +++ b/docs/v1.1.1/_static/images/view-page-source-icon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/docs/v1.1.1/_static/javascripts/application.js b/docs/v1.1.1/_static/javascripts/application.js new file mode 100644 index 0000000000..7c724d2e4f --- /dev/null +++ b/docs/v1.1.1/_static/javascripts/application.js @@ -0,0 +1,2540 @@ +! function(e, t) { + for (var n in t) e[n] = t[n] +}(window, function(n) { + var r = {}; + + function i(e) { + if (r[e]) return r[e].exports; + var t = r[e] = { + i: e, + l: !1, + exports: {} + }; + return n[e].call(t.exports, t, t.exports, i), t.l = !0, t.exports + } + return i.m = n, i.c = r, i.d = function(e, t, n) { + i.o(e, t) || Object.defineProperty(e, t, { + enumerable: !0, + get: n + }) + }, i.r = function(e) { + "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { + value: "Module" + }), Object.defineProperty(e, "__esModule", { + value: !0 + }) + }, i.t = function(t, e) { + if (1 & e && (t = i(t)), 8 & e) return t; + if (4 & e && "object" == typeof t && t && t.__esModule) return t; + var n = Object.create(null); + if (i.r(n), Object.defineProperty(n, "default", { + enumerable: !0, + value: t + }), 2 & e && "string" != typeof t) + for (var r in t) i.d(n, r, function(e) { + return t[e] + }.bind(null, r)); + return n + }, i.n = function(e) { + var t = e && e.__esModule ? function() { + return e.default + } : function() { + return e + }; + return i.d(t, "a", t), t + }, i.o = function(e, t) { + return Object.prototype.hasOwnProperty.call(e, t) + }, i.p = "", i(i.s = 13) +}([function(e, t, n) { + "use strict"; + var r = { + Listener: function() { + function e(e, t, n) { + var r = this; + this.els_ = Array.prototype.slice.call("string" == typeof e ? document.querySelectorAll(e) : [].concat(e)), this.handler_ = "function" == typeof n ? { + update: n + } : n, this.events_ = [].concat(t), this.update_ = function(e) { + return r.handler_.update(e) + } + } + var t = e.prototype; + return t.listen = function() { + var n = this; + this.els_.forEach(function(t) { + n.events_.forEach(function(e) { + t.addEventListener(e, n.update_, !1) + }) + }), "function" == typeof this.handler_.setup && this.handler_.setup() + }, t.unlisten = function() { + var n = this; + this.els_.forEach(function(t) { + n.events_.forEach(function(e) { + t.removeEventListener(e, n.update_) + }) + }), "function" == typeof this.handler_.reset && this.handler_.reset() + }, e + }(), + MatchMedia: function(e, t) { + this.handler_ = function(e) { + e.matches ? t.listen() : t.unlisten() + }; + var n = window.matchMedia(e); + n.addListener(this.handler_), this.handler_(n) + } + }, + i = { + Shadow: function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement && n.parentNode instanceof HTMLElement)) throw new ReferenceError; + if (this.el_ = n.parentNode, !((n = "string" == typeof t ? document.querySelector(t) : t) instanceof HTMLElement)) throw new ReferenceError; + this.header_ = n, this.height_ = 0, this.active_ = !1 + } + var t = e.prototype; + return t.setup = function() { + for (var e = this.el_; e = e.previousElementSibling;) { + if (!(e instanceof HTMLElement)) throw new ReferenceError; + this.height_ += e.offsetHeight + } + this.update() + }, t.update = function(e) { + if (!e || "resize" !== e.type && "orientationchange" !== e.type) { + var t = window.pageYOffset >= this.height_; + t !== this.active_ && (this.header_.dataset.mdState = (this.active_ = t) ? "shadow" : "") + } else this.height_ = 0, this.setup() + }, t.reset = function() { + this.header_.dataset.mdState = "", this.height_ = 0, this.active_ = !1 + }, e + }(), + Title: function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + if (this.el_ = n, !((n = "string" == typeof t ? document.querySelector(t) : t) instanceof HTMLHeadingElement)) throw new ReferenceError; + this.header_ = n, this.active_ = !1 + } + var t = e.prototype; + return t.setup = function() { + var t = this; + Array.prototype.forEach.call(this.el_.children, function(e) { + e.style.width = t.el_.offsetWidth - 20 + "px" + }) + }, t.update = function(e) { + var t = this, + n = window.pageYOffset >= this.header_.offsetTop; + n !== this.active_ && (this.el_.dataset.mdState = (this.active_ = n) ? "active" : ""), "resize" !== e.type && "orientationchange" !== e.type || Array.prototype.forEach.call(this.el_.children, function(e) { + e.style.width = t.el_.offsetWidth - 20 + "px" + }) + }, t.reset = function() { + this.el_.dataset.mdState = "", this.el_.style.width = "", this.active_ = !1 + }, e + }() + }, + o = { + Blur: function() { + function e(e) { + this.els_ = "string" == typeof e ? document.querySelectorAll(e) : e, this.index_ = 0, this.offset_ = window.pageYOffset, this.dir_ = !1, this.anchors_ = [].reduce.call(this.els_, function(e, t) { + var n = decodeURIComponent(t.hash); + return e.concat(document.getElementById(n.substring(1)) || []) + }, []) + } + var t = e.prototype; + return t.setup = function() { + this.update() + }, t.update = function() { + var e = window.pageYOffset, + t = this.offset_ - e < 0; + if (this.dir_ !== t && (this.index_ = this.index_ = t ? 0 : this.els_.length - 1), 0 !== this.anchors_.length) { + if (this.offset_ <= e) + for (var n = this.index_ + 1; n < this.els_.length && this.anchors_[n].offsetTop - 80 <= e; n++) 0 < n && (this.els_[n - 1].dataset.mdState = "blur"), this.index_ = n; + else + for (var r = this.index_; 0 <= r; r--) { + if (!(this.anchors_[r].offsetTop - 80 > e)) { + this.index_ = r; + break + } + 0 < r && (this.els_[r - 1].dataset.mdState = "") + } + this.offset_ = e, this.dir_ = t + } + }, t.reset = function() { + Array.prototype.forEach.call(this.els_, function(e) { + e.dataset.mdState = "" + }), this.index_ = 0, this.offset_ = window.pageYOffset + }, e + }(), + Collapse: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + this.el_ = t + } + var t = e.prototype; + return t.setup = function() { + var e = this.el_.getBoundingClientRect().height; + this.el_.style.display = e ? "block" : "none", this.el_.style.overflow = e ? "visible" : "hidden" + }, t.update = function() { + var e = this, + t = this.el_.getBoundingClientRect().height; + this.el_.style.display = "block", this.el_.style.overflow = ""; + var r = this.el_.previousElementSibling.previousElementSibling.checked; + if (r) this.el_.style.maxHeight = t + "px", requestAnimationFrame(function() { + e.el_.setAttribute("data-md-state", "animate"), e.el_.style.maxHeight = "0px" + }); + else { + this.el_.setAttribute("data-md-state", "expand"), this.el_.style.maxHeight = ""; + var n = this.el_.getBoundingClientRect().height; + this.el_.removeAttribute("data-md-state"), this.el_.style.maxHeight = "0px", requestAnimationFrame(function() { + e.el_.setAttribute("data-md-state", "animate"), e.el_.style.maxHeight = n + "px" + }) + } + this.el_.addEventListener("transitionend", function e(t) { + var n = t.target; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + n.removeAttribute("data-md-state"), n.style.maxHeight = "", n.style.display = r ? "none" : "block", n.style.overflow = r ? "hidden" : "visible", n.removeEventListener("transitionend", e) + }, !1) + }, t.reset = function() { + this.el_.dataset.mdState = "", this.el_.style.maxHeight = "", this.el_.style.display = "", this.el_.style.overflow = "" + }, e + }(), + Scrolling: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + this.el_ = t + } + var t = e.prototype; + return t.setup = function() { + this.el_.children[this.el_.children.length - 1].style.webkitOverflowScrolling = "touch"; + var e = this.el_.querySelectorAll("[data-md-toggle]"); + Array.prototype.forEach.call(e, function(e) { + if (!(e instanceof HTMLInputElement)) throw new ReferenceError; + if (e.checked) { + var t = e.nextElementSibling; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + for (; + "NAV" !== t.tagName && t.nextElementSibling;) t = t.nextElementSibling; + if (!(e.parentNode instanceof HTMLElement && e.parentNode.parentNode instanceof HTMLElement)) throw new ReferenceError; + var n = e.parentNode.parentNode, + r = t.children[t.children.length - 1]; + n.style.webkitOverflowScrolling = "", r.style.webkitOverflowScrolling = "touch" + } + }) + }, t.update = function(e) { + var t = e.target; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + var n = t.nextElementSibling; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + for (; + "NAV" !== n.tagName && n.nextElementSibling;) n = n.nextElementSibling; + if (!(t.parentNode instanceof HTMLElement && t.parentNode.parentNode instanceof HTMLElement)) throw new ReferenceError; + var r = t.parentNode.parentNode, + i = n.children[n.children.length - 1]; + if (r.style.webkitOverflowScrolling = "", i.style.webkitOverflowScrolling = "", !t.checked) { + n.addEventListener("transitionend", function e() { + n instanceof HTMLElement && (r.style.webkitOverflowScrolling = "touch", n.removeEventListener("transitionend", e)) + }, !1) + } + if (t.checked) { + n.addEventListener("transitionend", function e() { + n instanceof HTMLElement && (i.style.webkitOverflowScrolling = "touch", n.removeEventListener("transitionend", e)) + }, !1) + } + }, t.reset = function() { + this.el_.children[1].style.webkitOverflowScrolling = ""; + var e = this.el_.querySelectorAll("[data-md-toggle]"); + Array.prototype.forEach.call(e, function(e) { + if (!(e instanceof HTMLInputElement)) throw new ReferenceError; + if (e.checked) { + var t = e.nextElementSibling; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + for (; + "NAV" !== t.tagName && t.nextElementSibling;) t = t.nextElementSibling; + if (!(e.parentNode instanceof HTMLElement && e.parentNode.parentNode instanceof HTMLElement)) throw new ReferenceError; + var n = e.parentNode.parentNode, + r = t.children[t.children.length - 1]; + n.style.webkitOverflowScrolling = "", r.style.webkitOverflowScrolling = "" + } + }) + }, e + }() + }, + a = { + Lock: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLInputElement)) throw new ReferenceError; + if (this.el_ = t, !document.body) throw new ReferenceError; + this.lock_ = document.body + } + var t = e.prototype; + return t.setup = function() { + this.update() + }, t.update = function() { + var e = this; + this.el_.checked ? (this.offset_ = window.pageYOffset, setTimeout(function() { + window.scrollTo(0, 0), e.el_.checked && (e.lock_.dataset.mdState = "lock") + }, 400)) : (this.lock_.dataset.mdState = "", setTimeout(function() { + void 0 !== e.offset_ && window.scrollTo(0, e.offset_) + }, 100)) + }, t.reset = function() { + "lock" === this.lock_.dataset.mdState && window.scrollTo(0, this.offset_), this.lock_.dataset.mdState = "" + }, e + }(), + Result: n(9).a + }, + s = { + Position: function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement && n.parentNode instanceof HTMLElement)) throw new ReferenceError; + if (this.el_ = n, this.parent_ = n.parentNode, !((n = "string" == typeof t ? document.querySelector(t) : t) instanceof HTMLElement)) throw new ReferenceError; + this.header_ = n, this.height_ = 0, this.pad_ = "fixed" === window.getComputedStyle(this.header_).position + } + var t = e.prototype; + return t.setup = function() { + var e = Array.prototype.reduce.call(this.parent_.children, function(e, t) { + return Math.max(e, t.offsetTop) + }, 0); + this.offset_ = e - (this.pad_ ? this.header_.offsetHeight : 0), this.update() + }, t.update = function(e) { + var t = window.pageYOffset, + n = window.innerHeight; + e && "resize" === e.type && this.setup(); + var r = this.pad_ ? this.header_.offsetHeight : 0, + i = this.parent_.offsetTop + this.parent_.offsetHeight, + o = n - r - Math.max(0, this.offset_ - t) - Math.max(0, t + n - i); + o !== this.height_ && (this.el_.style.height = (this.height_ = o) + "px"), t >= this.offset_ ? "lock" !== this.el_.dataset.mdState && (this.el_.dataset.mdState = "lock") : "lock" === this.el_.dataset.mdState && (this.el_.dataset.mdState = "") + }, t.reset = function() { + this.el_.dataset.mdState = "", this.el_.style.height = "", this.height_ = 0 + }, e + }() + }, + c = n(6), + l = n.n(c); + var u = { + Adapter: { + GitHub: function(o) { + var e, t; + + function n(e) { + var t; + t = o.call(this, e) || this; + var n = /^.+github\.com\/([^/]+)\/?([^/]+)?.*$/.exec(t.base_); + if (n && 3 === n.length) { + var r = n[1], + i = n[2]; + t.base_ = "https://api.github.com/users/" + r + "/repos", t.name_ = i + } + return t + } + return t = o, (e = n).prototype = Object.create(t.prototype), (e.prototype.constructor = e).__proto__ = t, n.prototype.fetch_ = function() { + var i = this; + return function n(r) { + return void 0 === r && (r = 0), fetch(i.base_ + "?per_page=30&page=" + r).then(function(e) { + return e.json() + }).then(function(e) { + if (!(e instanceof Array)) throw new TypeError; + if (i.name_) { + var t = e.find(function(e) { + return e.name === i.name_ + }); + return t || 30 !== e.length ? t ? [i.format_(t.stargazers_count) + " Stars", i.format_(t.forks_count) + " Forks"] : [] : n(r + 1) + } + return [e.length + " Repositories"] + }) + }() + }, n + }(function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLAnchorElement)) throw new ReferenceError; + this.el_ = t, this.base_ = this.el_.href, this.salt_ = this.hash_(this.base_) + } + var t = e.prototype; + return t.fetch = function() { + var n = this; + return new Promise(function(t) { + var e = l.a.getJSON(n.salt_ + ".cache-source"); + void 0 !== e ? t(e) : n.fetch_().then(function(e) { + l.a.set(n.salt_ + ".cache-source", e, { + expires: 1 / 96 + }), t(e) + }) + }) + }, t.fetch_ = function() { + throw new Error("fetch_(): Not implemented") + }, t.format_ = function(e) { + return 1e4 < e ? (e / 1e3).toFixed(0) + "k" : 1e3 < e ? (e / 1e3).toFixed(1) + "k" : "" + e + }, t.hash_ = function(e) { + var t = 0; + if (0 === e.length) return t; + for (var n = 0, r = e.length; n < r; n++) t = (t << 5) - t + e.charCodeAt(n), t |= 0; + return t + }, e + }()) + }, + Repository: n(10).a + }, + f = { + Toggle: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof Node)) throw new ReferenceError; + this.el_ = t; + var n = document.querySelector("[data-md-component=header]"); + this.height_ = n.offsetHeight, this.active_ = !1 + } + var t = e.prototype; + return t.update = function() { + var e = window.pageYOffset >= this.el_.children[0].offsetTop + (5 - this.height_); + e !== this.active_ && (this.el_.dataset.mdState = (this.active_ = e) ? "hidden" : "") + }, t.reset = function() { + this.el_.dataset.mdState = "", this.active_ = !1 + }, e + }() + }; + t.a = { + Event: r, + Header: i, + Nav: o, + Search: a, + Sidebar: s, + Source: u, + Tabs: f + } +}, function(t, e, n) { + (function(e) { + t.exports = e.lunr = n(24) + }).call(this, n(4)) +}, function(e, f, d) { + "use strict"; + (function(t) { + var e = d(8), + n = setTimeout; + + function r() {} + + function o(e) { + if (!(this instanceof o)) throw new TypeError("Promises must be constructed via new"); + if ("function" != typeof e) throw new TypeError("not a function"); + this._state = 0, this._handled = !1, this._value = void 0, this._deferreds = [], u(e, this) + } + + function i(n, r) { + for (; 3 === n._state;) n = n._value; + 0 !== n._state ? (n._handled = !0, o._immediateFn(function() { + var e = 1 === n._state ? r.onFulfilled : r.onRejected; + if (null !== e) { + var t; + try { + t = e(n._value) + } catch (e) { + return void s(r.promise, e) + } + a(r.promise, t) + } else(1 === n._state ? a : s)(r.promise, n._value) + })) : n._deferreds.push(r) + } + + function a(t, e) { + try { + if (e === t) throw new TypeError("A promise cannot be resolved with itself."); + if (e && ("object" == typeof e || "function" == typeof e)) { + var n = e.then; + if (e instanceof o) return t._state = 3, t._value = e, void c(t); + if ("function" == typeof n) return void u((r = n, i = e, function() { + r.apply(i, arguments) + }), t) + } + t._state = 1, t._value = e, c(t) + } catch (e) { + s(t, e) + } + var r, i + } + + function s(e, t) { + e._state = 2, e._value = t, c(e) + } + + function c(e) { + 2 === e._state && 0 === e._deferreds.length && o._immediateFn(function() { + e._handled || o._unhandledRejectionFn(e._value) + }); + for (var t = 0, n = e._deferreds.length; t < n; t++) i(e, e._deferreds[t]); + e._deferreds = null + } + + function l(e, t, n) { + this.onFulfilled = "function" == typeof e ? e : null, this.onRejected = "function" == typeof t ? t : null, this.promise = n + } + + function u(e, t) { + var n = !1; + try { + e(function(e) { + n || (n = !0, a(t, e)) + }, function(e) { + n || (n = !0, s(t, e)) + }) + } catch (e) { + if (n) return; + n = !0, s(t, e) + } + } + o.prototype.catch = function(e) { + return this.then(null, e) + }, o.prototype.then = function(e, t) { + var n = new this.constructor(r); + return i(this, new l(e, t, n)), n + }, o.prototype.finally = e.a, o.all = function(t) { + return new o(function(r, i) { + if (!t || void 0 === t.length) throw new TypeError("Promise.all accepts an array"); + var o = Array.prototype.slice.call(t); + if (0 === o.length) return r([]); + var a = o.length; + + function s(t, e) { + try { + if (e && ("object" == typeof e || "function" == typeof e)) { + var n = e.then; + if ("function" == typeof n) return void n.call(e, function(e) { + s(t, e) + }, i) + } + o[t] = e, 0 == --a && r(o) + } catch (e) { + i(e) + } + } + for (var e = 0; e < o.length; e++) s(e, o[e]) + }) + }, o.resolve = function(t) { + return t && "object" == typeof t && t.constructor === o ? t : new o(function(e) { + e(t) + }) + }, o.reject = function(n) { + return new o(function(e, t) { + t(n) + }) + }, o.race = function(i) { + return new o(function(e, t) { + for (var n = 0, r = i.length; n < r; n++) i[n].then(e, t) + }) + }, o._immediateFn = "function" == typeof t && function(e) { + t(e) + } || function(e) { + n(e, 0) + }, o._unhandledRejectionFn = function(e) { + "undefined" != typeof console && console && console.warn("Possible Unhandled Promise Rejection:", e) + }, f.a = o + }).call(this, d(21).setImmediate) +}, function(e, t, n) { + "use strict"; + + function r(e, t) { + var n = document.createElement(e); + t && Array.prototype.forEach.call(Object.keys(t), function(e) { + n.setAttribute(e, t[e]) + }); + for (var r = arguments.length, i = new Array(2 < r ? r - 2 : 0), o = 2; o < r; o++) i[o - 2] = arguments[o]; + return function t(e) { + Array.prototype.forEach.call(e, function(e) { + "string" == typeof e || "number" == typeof e ? n.textContent += e : Array.isArray(e) ? t(e) : void 0 !== e.__html ? n.innerHTML += e.__html : e instanceof Node && n.appendChild(e) + }) + }(i), n + } + n.r(t), n.d(t, "createElement", function() { + return r + }) +}, function(e, t) { + var n; + n = function() { + return this + }(); + try { + n = n || new Function("return this")() + } catch (e) { + "object" == typeof window && (n = window) + } + e.exports = n +}, function(e, t, n) { + var r; + r = function() { + return function(n) { + var r = {}; + + function i(e) { + if (r[e]) return r[e].exports; + var t = r[e] = { + i: e, + l: !1, + exports: {} + }; + return n[e].call(t.exports, t, t.exports, i), t.l = !0, t.exports + } + return i.m = n, i.c = r, i.d = function(e, t, n) { + i.o(e, t) || Object.defineProperty(e, t, { + enumerable: !0, + get: n + }) + }, i.r = function(e) { + "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { + value: "Module" + }), Object.defineProperty(e, "__esModule", { + value: !0 + }) + }, i.t = function(t, e) { + if (1 & e && (t = i(t)), 8 & e) return t; + if (4 & e && "object" == typeof t && t && t.__esModule) return t; + var n = Object.create(null); + if (i.r(n), Object.defineProperty(n, "default", { + enumerable: !0, + value: t + }), 2 & e && "string" != typeof t) + for (var r in t) i.d(n, r, function(e) { + return t[e] + }.bind(null, r)); + return n + }, i.n = function(e) { + var t = e && e.__esModule ? function() { + return e.default + } : function() { + return e + }; + return i.d(t, "a", t), t + }, i.o = function(e, t) { + return Object.prototype.hasOwnProperty.call(e, t) + }, i.p = "", i(i.s = 0) + }([function(e, t, n) { + "use strict"; + var i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e + }, + o = function() { + function r(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r) + } + } + return function(e, t, n) { + return t && r(e.prototype, t), n && r(e, n), e + } + }(), + a = r(n(1)), + s = r(n(3)), + c = r(n(4)); + + function r(e) { + return e && e.__esModule ? e : { + default: e + } + } + var l = function(e) { + function r(e, t) { + ! function(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") + }(this, r); + var n = function(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || "object" != typeof t && "function" != typeof t ? e : t + }(this, (r.__proto__ || Object.getPrototypeOf(r)).call(this)); + return n.resolveOptions(t), n.listenClick(e), n + } + return function(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) + }(r, s.default), o(r, [{ + key: "resolveOptions", + value: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}; + this.action = "function" == typeof e.action ? e.action : this.defaultAction, this.target = "function" == typeof e.target ? e.target : this.defaultTarget, this.text = "function" == typeof e.text ? e.text : this.defaultText, this.container = "object" === i(e.container) ? e.container : document.body + } + }, { + key: "listenClick", + value: function(e) { + var t = this; + this.listener = (0, c.default)(e, "click", function(e) { + return t.onClick(e) + }) + } + }, { + key: "onClick", + value: function(e) { + var t = e.delegateTarget || e.currentTarget; + this.clipboardAction && (this.clipboardAction = null), this.clipboardAction = new a.default({ + action: this.action(t), + target: this.target(t), + text: this.text(t), + container: this.container, + trigger: t, + emitter: this + }) + } + }, { + key: "defaultAction", + value: function(e) { + return u("action", e) + } + }, { + key: "defaultTarget", + value: function(e) { + var t = u("target", e); + if (t) return document.querySelector(t) + } + }, { + key: "defaultText", + value: function(e) { + return u("text", e) + } + }, { + key: "destroy", + value: function() { + this.listener.destroy(), this.clipboardAction && (this.clipboardAction.destroy(), this.clipboardAction = null) + } + }], [{ + key: "isSupported", + value: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : ["copy", "cut"], + t = "string" == typeof e ? [e] : e, + n = !!document.queryCommandSupported; + return t.forEach(function(e) { + n = n && !!document.queryCommandSupported(e) + }), n + } + }]), r + }(); + + function u(e, t) { + var n = "data-clipboard-" + e; + if (t.hasAttribute(n)) return t.getAttribute(n) + } + e.exports = l + }, function(e, t, n) { + "use strict"; + var r, i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e + }, + o = function() { + function r(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r) + } + } + return function(e, t, n) { + return t && r(e.prototype, t), n && r(e, n), e + } + }(), + a = n(2), + s = (r = a) && r.__esModule ? r : { + default: r + }; + var c = function() { + function t(e) { + ! function(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") + }(this, t), this.resolveOptions(e), this.initSelection() + } + return o(t, [{ + key: "resolveOptions", + value: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}; + this.action = e.action, this.container = e.container, this.emitter = e.emitter, this.target = e.target, this.text = e.text, this.trigger = e.trigger, this.selectedText = "" + } + }, { + key: "initSelection", + value: function() { + this.text ? this.selectFake() : this.target && this.selectTarget() + } + }, { + key: "selectFake", + value: function() { + var e = this, + t = "rtl" == document.documentElement.getAttribute("dir"); + this.removeFake(), this.fakeHandlerCallback = function() { + return e.removeFake() + }, this.fakeHandler = this.container.addEventListener("click", this.fakeHandlerCallback) || !0, this.fakeElem = document.createElement("textarea"), this.fakeElem.style.fontSize = "12pt", this.fakeElem.style.border = "0", this.fakeElem.style.padding = "0", this.fakeElem.style.margin = "0", this.fakeElem.style.position = "absolute", this.fakeElem.style[t ? "right" : "left"] = "-9999px"; + var n = window.pageYOffset || document.documentElement.scrollTop; + this.fakeElem.style.top = n + "px", this.fakeElem.setAttribute("readonly", ""), this.fakeElem.value = this.text, this.container.appendChild(this.fakeElem), this.selectedText = (0, s.default)(this.fakeElem), this.copyText() + } + }, { + key: "removeFake", + value: function() { + this.fakeHandler && (this.container.removeEventListener("click", this.fakeHandlerCallback), this.fakeHandler = null, this.fakeHandlerCallback = null), this.fakeElem && (this.container.removeChild(this.fakeElem), this.fakeElem = null) + } + }, { + key: "selectTarget", + value: function() { + this.selectedText = (0, s.default)(this.target), this.copyText() + } + }, { + key: "copyText", + value: function() { + var t = void 0; + try { + t = document.execCommand(this.action) + } catch (e) { + t = !1 + } + this.handleResult(t) + } + }, { + key: "handleResult", + value: function(e) { + this.emitter.emit(e ? "success" : "error", { + action: this.action, + text: this.selectedText, + trigger: this.trigger, + clearSelection: this.clearSelection.bind(this) + }) + } + }, { + key: "clearSelection", + value: function() { + this.trigger && this.trigger.focus(), window.getSelection().removeAllRanges() + } + }, { + key: "destroy", + value: function() { + this.removeFake() + } + }, { + key: "action", + set: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : "copy"; + if (this._action = e, "copy" !== this._action && "cut" !== this._action) throw new Error('Invalid "action" value, use either "copy" or "cut"') + }, + get: function() { + return this._action + } + }, { + key: "target", + set: function(e) { + if (void 0 !== e) { + if (!e || "object" !== (void 0 === e ? "undefined" : i(e)) || 1 !== e.nodeType) throw new Error('Invalid "target" value, use a valid Element'); + if ("copy" === this.action && e.hasAttribute("disabled")) throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'); + if ("cut" === this.action && (e.hasAttribute("readonly") || e.hasAttribute("disabled"))) throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes'); + this._target = e + } + }, + get: function() { + return this._target + } + }]), t + }(); + e.exports = c + }, function(e, t) { + e.exports = function(e) { + var t; + if ("SELECT" === e.nodeName) e.focus(), t = e.value; + else if ("INPUT" === e.nodeName || "TEXTAREA" === e.nodeName) { + var n = e.hasAttribute("readonly"); + n || e.setAttribute("readonly", ""), e.select(), e.setSelectionRange(0, e.value.length), n || e.removeAttribute("readonly"), t = e.value + } else { + e.hasAttribute("contenteditable") && e.focus(); + var r = window.getSelection(), + i = document.createRange(); + i.selectNodeContents(e), r.removeAllRanges(), r.addRange(i), t = r.toString() + } + return t + } + }, function(e, t) { + function n() {} + n.prototype = { + on: function(e, t, n) { + var r = this.e || (this.e = {}); + return (r[e] || (r[e] = [])).push({ + fn: t, + ctx: n + }), this + }, + once: function(e, t, n) { + var r = this; + + function i() { + r.off(e, i), t.apply(n, arguments) + } + return i._ = t, this.on(e, i, n) + }, + emit: function(e) { + for (var t = [].slice.call(arguments, 1), n = ((this.e || (this.e = {}))[e] || []).slice(), r = 0, i = n.length; r < i; r++) n[r].fn.apply(n[r].ctx, t); + return this + }, + off: function(e, t) { + var n = this.e || (this.e = {}), + r = n[e], + i = []; + if (r && t) + for (var o = 0, a = r.length; o < a; o++) r[o].fn !== t && r[o].fn._ !== t && i.push(r[o]); + return i.length ? n[e] = i : delete n[e], this + } + }, e.exports = n + }, function(e, t, n) { + var d = n(5), + h = n(6); + e.exports = function(e, t, n) { + if (!e && !t && !n) throw new Error("Missing required arguments"); + if (!d.string(t)) throw new TypeError("Second argument must be a String"); + if (!d.fn(n)) throw new TypeError("Third argument must be a Function"); + if (d.node(e)) return u = t, f = n, (l = e).addEventListener(u, f), { + destroy: function() { + l.removeEventListener(u, f) + } + }; + if (d.nodeList(e)) return a = e, s = t, c = n, Array.prototype.forEach.call(a, function(e) { + e.addEventListener(s, c) + }), { + destroy: function() { + Array.prototype.forEach.call(a, function(e) { + e.removeEventListener(s, c) + }) + } + }; + if (d.string(e)) return r = e, i = t, o = n, h(document.body, r, i, o); + throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList"); + var r, i, o, a, s, c, l, u, f + } + }, function(e, n) { + n.node = function(e) { + return void 0 !== e && e instanceof HTMLElement && 1 === e.nodeType + }, n.nodeList = function(e) { + var t = Object.prototype.toString.call(e); + return void 0 !== e && ("[object NodeList]" === t || "[object HTMLCollection]" === t) && "length" in e && (0 === e.length || n.node(e[0])) + }, n.string = function(e) { + return "string" == typeof e || e instanceof String + }, n.fn = function(e) { + return "[object Function]" === Object.prototype.toString.call(e) + } + }, function(e, t, n) { + var a = n(7); + + function o(e, t, n, r, i) { + var o = function(t, n, e, r) { + return function(e) { + e.delegateTarget = a(e.target, n), e.delegateTarget && r.call(t, e) + } + }.apply(this, arguments); + return e.addEventListener(n, o, i), { + destroy: function() { + e.removeEventListener(n, o, i) + } + } + } + e.exports = function(e, t, n, r, i) { + return "function" == typeof e.addEventListener ? o.apply(null, arguments) : "function" == typeof n ? o.bind(null, document).apply(null, arguments) : ("string" == typeof e && (e = document.querySelectorAll(e)), Array.prototype.map.call(e, function(e) { + return o(e, t, n, r, i) + })) + } + }, function(e, t) { + if ("undefined" != typeof Element && !Element.prototype.matches) { + var n = Element.prototype; + n.matches = n.matchesSelector || n.mozMatchesSelector || n.msMatchesSelector || n.oMatchesSelector || n.webkitMatchesSelector + } + e.exports = function(e, t) { + for (; e && 9 !== e.nodeType;) { + if ("function" == typeof e.matches && e.matches(t)) return e; + e = e.parentNode + } + } + }]) + }, e.exports = r() +}, function(r, i, o) { + var a, s; + ! function(e) { + if (void 0 === (s = "function" == typeof(a = e) ? a.call(i, o, i, r) : a) || (r.exports = s), !0, r.exports = e(), !!0) { + var t = window.Cookies, + n = window.Cookies = e(); + n.noConflict = function() { + return window.Cookies = t, n + } + } + }(function() { + function m() { + for (var e = 0, t = {}; e < arguments.length; e++) { + var n = arguments[e]; + for (var r in n) t[r] = n[r] + } + return t + } + return function e(h) { + function p(e, t, n) { + var r; + if ("undefined" != typeof document) { + if (1 < arguments.length) { + if ("number" == typeof(n = m({ + path: "/" + }, p.defaults, n)).expires) { + var i = new Date; + i.setMilliseconds(i.getMilliseconds() + 864e5 * n.expires), n.expires = i + } + n.expires = n.expires ? n.expires.toUTCString() : ""; + try { + r = JSON.stringify(t), /^[\{\[]/.test(r) && (t = r) + } catch (e) {} + t = h.write ? h.write(t, e) : encodeURIComponent(String(t)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent), e = (e = (e = encodeURIComponent(String(e))).replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)).replace(/[\(\)]/g, escape); + var o = ""; + for (var a in n) n[a] && (o += "; " + a, !0 !== n[a] && (o += "=" + n[a])); + return document.cookie = e + "=" + t + o + } + e || (r = {}); + for (var s = document.cookie ? document.cookie.split("; ") : [], c = /(%[0-9A-Z]{2})+/g, l = 0; l < s.length; l++) { + var u = s[l].split("="), + f = u.slice(1).join("="); + this.json || '"' !== f.charAt(0) || (f = f.slice(1, -1)); + try { + var d = u[0].replace(c, decodeURIComponent); + if (f = h.read ? h.read(f, d) : h(f, d) || f.replace(c, decodeURIComponent), this.json) try { + f = JSON.parse(f) + } catch (e) {} + if (e === d) { + r = f; + break + } + e || (r[d] = f) + } catch (e) {} + } + return r + } + } + return (p.set = p).get = function(e) { + return p.call(p, e) + }, p.getJSON = function() { + return p.apply({ + json: !0 + }, [].slice.call(arguments)) + }, p.defaults = {}, p.remove = function(e, t) { + p(e, "", m(t, { + expires: -1 + })) + }, p.withConverter = e, p + }(function() {}) + }) +}, function(e, t, n) { + "use strict"; + n.r(t); + var r = "function" == typeof fetch ? fetch.bind() : function(i, o) { + return o = o || {}, new Promise(function(e, t) { + var n = new XMLHttpRequest; + for (var r in n.open(o.method || "get", i, !0), o.headers) n.setRequestHeader(r, o.headers[r]); + + function s() { + var r, i = [], + o = [], + a = {}; + return n.getAllResponseHeaders().replace(/^(.*?):[^\S\n]*([\s\S]*?)$/gm, function(e, t, n) { + i.push(t = t.toLowerCase()), o.push([t, n]), r = a[t], a[t] = r ? r + "," + n : n + }), { + ok: 2 == (n.status / 100 | 0), + status: n.status, + statusText: n.statusText, + url: n.responseURL, + clone: s, + text: function() { + return Promise.resolve(n.responseText) + }, + json: function() { + return Promise.resolve(n.responseText).then(JSON.parse) + }, + blob: function() { + return Promise.resolve(new Blob([n.response])) + }, + headers: { + keys: function() { + return i + }, + entries: function() { + return o + }, + get: function(e) { + return a[e.toLowerCase()] + }, + has: function(e) { + return e.toLowerCase() in a + } + } + } + } + n.withCredentials = "include" == o.credentials, n.onload = function() { + e(s()) + }, n.onerror = t, n.send(o.body || null) + }) + }; + t.default = r +}, function(e, t, n) { + "use strict"; + t.a = function(t) { + var n = this.constructor; + return this.then(function(e) { + return n.resolve(t()).then(function() { + return e + }) + }, function(e) { + return n.resolve(t()).then(function() { + return n.reject(e) + }) + }) + } +}, function(e, n, r) { + "use strict"; + (function(f) { + r.d(n, "a", function() { + return t + }); + var e = r(1), + d = r.n(e), + h = function(e) { + var t = document.getElementsByName("lang:" + e)[0]; + if (!(t instanceof HTMLMetaElement)) throw new ReferenceError; + return t.content + }, + t = function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + this.el_ = n; + var r = Array.prototype.slice.call(this.el_.children), + i = r[0], + o = r[1]; + this.data_ = t, this.meta_ = i, this.list_ = o, this.message_ = { + placeholder: this.meta_.textContent, + none: h("search.result.none"), + one: h("search.result.one"), + other: h("search.result.other") + }; + var a = h("search.tokenizer"); + a.length && (d.a.tokenizer.separator = a), this.lang_ = h("search.language").split(",").filter(Boolean).map(function(e) { + return e.trim() + }) + } + return e.prototype.update = function(e) { + var t, a = this; + if ("focus" !== e.type || this.index_) { + if ("focus" === e.type || "keyup" === e.type) { + var n = e.target; + if (!(n instanceof HTMLInputElement)) throw new ReferenceError; + if (!this.index_ || n.value === this.value_) return; + for (; this.list_.firstChild;) this.list_.removeChild(this.list_.firstChild); + if (this.value_ = n.value, 0 === this.value_.length) return void(this.meta_.textContent = this.message_.placeholder); + var r = this.index_.query(function(t) { + a.value_.toLowerCase().split(" ").filter(Boolean).forEach(function(e) { + t.term(e, { + wildcard: d.a.Query.wildcard.TRAILING + }) + }) + }).reduce(function(e, t) { + var n = a.docs_.get(t.ref); + if (n.parent) { + var r = n.parent.location; + e.set(r, (e.get(r) || []).concat(t)) + } else { + var i = n.location; + e.set(i, e.get(i) || []) + } + return e + }, new Map), + i = (t = this.value_.trim(), t.replace(/[|\\{}()[\]^$+*?.-]/g, "\\$&")).replace(new RegExp(d.a.tokenizer.separator, "img"), "|"), + s = new RegExp("(^|" + d.a.tokenizer.separator + ")(" + i + ")", "img"), + c = function(e, t, n) { + return t + "" + n + "" + }; + this.stack_ = [], r.forEach(function(e, t) { + var n, r = a.docs_.get(t), + i = f.createElement("li", { + class: "md-search-result__item" + }, f.createElement("a", { + href: r.location, + title: r.title, + class: "md-search-result__link", + tabindex: "-1" + }, f.createElement("article", { + class: "md-search-result__article md-search-result__article--document" + }, f.createElement("h1", { + class: "md-search-result__title" + }, { + __html: r.title.replace(s, c) + }), r.text.length ? f.createElement("p", { + class: "md-search-result__teaser" + }, { + __html: r.text.replace(s, c) + }) : {}))), + o = e.map(function(t) { + return function() { + var e = a.docs_.get(t.ref); + i.appendChild(f.createElement("a", { + href: e.location, + title: e.title, + class: "md-search-result__link", + "data-md-rel": "anchor", + tabindex: "-1" + }, f.createElement("article", { + class: "md-search-result__article" + }, f.createElement("h1", { + class: "md-search-result__title" + }, { + __html: e.title.replace(s, c) + }), e.text.length ? f.createElement("p", { + class: "md-search-result__teaser" + }, { + __html: function(e, t) { + var n = t; + if (e.length > n) { + for (; + " " !== e[n] && 0 < --n;); + return e.substring(0, n) + "..." + } + return e + }(e.text.replace(s, c), 400) + }) : {}))) + } + }); + (n = a.stack_).push.apply(n, [function() { + return a.list_.appendChild(i) + }].concat(o)) + }); + var o = this.el_.parentNode; + if (!(o instanceof HTMLElement)) throw new ReferenceError; + for (; this.stack_.length && o.offsetHeight >= o.scrollHeight - 16;) this.stack_.shift()(); + var l = this.list_.querySelectorAll("[data-md-rel=anchor]"); + switch (Array.prototype.forEach.call(l, function(r) { + ["click", "keydown"].forEach(function(n) { + r.addEventListener(n, function(e) { + if ("keydown" !== n || 13 === e.keyCode) { + var t = document.querySelector("[data-md-toggle=search]"); + if (!(t instanceof HTMLInputElement)) throw new ReferenceError; + t.checked && (t.checked = !1, t.dispatchEvent(new CustomEvent("change"))), e.preventDefault(), setTimeout(function() { + document.location.href = r.href + }, 100) + } + }) + }) + }), r.size) { + case 0: + this.meta_.textContent = this.message_.none; + break; + case 1: + this.meta_.textContent = this.message_.one; + break; + default: + this.meta_.textContent = this.message_.other.replace("#", r.size) + } + } + } else { + var u = function(e) { + a.docs_ = e.reduce(function(e, t) { + var n, r, i, o = t.location.split("#"), + a = o[0], + s = o[1]; + return t.text = (n = t.text, r = document.createTextNode(n), (i = document.createElement("p")).appendChild(r), i.innerHTML), s && (t.parent = e.get(a), t.parent && !t.parent.done && (t.parent.title = t.title, t.parent.text = t.text, t.parent.done = !0)), t.text = t.text.replace(/\n/g, " ").replace(/\s+/g, " ").replace(/\s+([,.:;!?])/g, function(e, t) { + return t + }), t.parent && t.parent.title === t.title || e.set(t.location, t), e + }, new Map); + var i = a.docs_, + o = a.lang_; + a.stack_ = [], a.index_ = d()(function() { + var e, t = this, + n = { + "search.pipeline.trimmer": d.a.trimmer, + "search.pipeline.stopwords": d.a.stopWordFilter + }, + r = Object.keys(n).reduce(function(e, t) { + return h(t).match(/^false$/i) || e.push(n[t]), e + }, []); + this.pipeline.reset(), r && (e = this.pipeline).add.apply(e, r), 1 === o.length && "en" !== o[0] && d.a[o[0]] ? this.use(d.a[o[0]]) : 1 < o.length && this.use(d.a.multiLanguage.apply(d.a, o)), this.field("title", { + boost: 10 + }), this.field("text"), this.ref("location"), i.forEach(function(e) { + return t.add(e) + }) + }); + var t = a.el_.parentNode; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + t.addEventListener("scroll", function() { + for (; a.stack_.length && t.scrollTop + t.offsetHeight >= t.scrollHeight - 16;) a.stack_.splice(0, 10).forEach(function(e) { + return e() + }) + }) + }; + setTimeout(function() { + return "function" == typeof a.data_ ? a.data_().then(u) : u(a.data_) + }, 250) + } + }, e + }() + }).call(this, r(3)) +}, function(e, n, r) { + "use strict"; + (function(t) { + r.d(n, "a", function() { + return e + }); + var e = function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + this.el_ = t + } + return e.prototype.initialize = function(e) { + e.length && this.el_.children.length && this.el_.children[this.el_.children.length - 1].appendChild(t.createElement("ul", { + class: "md-source__facts" + }, e.map(function(e) { + return t.createElement("li", { + class: "md-source__fact" + }, e) + }))), this.el_.dataset.mdState = "done" + }, e + }() + }).call(this, r(3)) +}, , , function(e, n, c) { + "use strict"; + c.r(n), + function(o) { + c.d(n, "app", function() { + return t + }); + c(14), c(15), c(16), c(17), c(18), c(19), c(20); + var r = c(2), + e = c(5), + a = c.n(e), + i = c(0); + window.Promise = window.Promise || r.a; + var s = function(e) { + var t = document.getElementsByName("lang:" + e)[0]; + if (!(t instanceof HTMLMetaElement)) throw new ReferenceError; + return t.content + }; + var t = { + initialize: function(t) { + new i.a.Event.Listener(document, "DOMContentLoaded", function() { + if (!(document.body instanceof HTMLElement)) throw new ReferenceError; + Modernizr.addTest("ios", function() { + return !!navigator.userAgent.match(/(iPad|iPhone|iPod)/g) + }); + var e = document.querySelectorAll("table:not([class])"); + if (Array.prototype.forEach.call(e, function(e) { + var t = o.createElement("div", { + class: "md-typeset__scrollwrap" + }, o.createElement("div", { + class: "md-typeset__table" + })); + e.nextSibling ? e.parentNode.insertBefore(t, e.nextSibling) : e.parentNode.appendChild(t), t.children[0].appendChild(e) + }), a.a.isSupported()) { + var t = document.querySelectorAll(".codehilite > pre, pre > code"); + Array.prototype.forEach.call(t, function(e, t) { + var n = "__code_" + t, + r = o.createElement("button", { + class: "md-clipboard", + title: s("clipboard.copy"), + "data-clipboard-target": "#" + n + " pre, #" + n + " code" + }, o.createElement("span", { + class: "md-clipboard__message" + })), + i = e.parentNode; + i.id = n, i.insertBefore(r, e) + }), new a.a(".md-clipboard").on("success", function(e) { + var t = e.trigger.querySelector(".md-clipboard__message"); + if (!(t instanceof HTMLElement)) throw new ReferenceError; + e.clearSelection(), t.dataset.mdTimer && clearTimeout(parseInt(t.dataset.mdTimer, 10)), t.classList.add("md-clipboard__message--active"), t.innerHTML = s("clipboard.copied"), t.dataset.mdTimer = setTimeout(function() { + t.classList.remove("md-clipboard__message--active"), t.dataset.mdTimer = "" + }, 2e3).toString() + }) + } + if (!Modernizr.details) { + var n = document.querySelectorAll("details > summary"); + Array.prototype.forEach.call(n, function(e) { + e.addEventListener("click", function(e) { + var t = e.target.parentNode; + t.hasAttribute("open") ? t.removeAttribute("open") : t.setAttribute("open", "") + }) + }) + } + var r = function() { + if (document.location.hash) { + var e = document.getElementById(document.location.hash.substring(1)); + if (!e) return; + for (var t = e.parentNode; t && !(t instanceof HTMLDetailsElement);) t = t.parentNode; + if (t && !t.open) { + t.open = !0; + var n = location.hash; + location.hash = " ", location.hash = n + } + } + }; + if (window.addEventListener("hashchange", r), r(), Modernizr.ios) { + var i = document.querySelectorAll("[data-md-scrollfix]"); + Array.prototype.forEach.call(i, function(t) { + t.addEventListener("touchstart", function() { + var e = t.scrollTop; + 0 === e ? t.scrollTop = 1 : e + t.offsetHeight === t.scrollHeight && (t.scrollTop = e - 1) + }) + }) + } + }).listen(), new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Header.Shadow("[data-md-component=container]", "[data-md-component=header]")).listen(), new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Header.Title("[data-md-component=title]", ".md-typeset h1")).listen(), document.querySelector("[data-md-component=hero]") && new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Tabs.Toggle("[data-md-component=hero]")).listen(), document.querySelector("[data-md-component=tabs]") && new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Tabs.Toggle("[data-md-component=tabs]")).listen(), new i.a.Event.MatchMedia("(min-width: 1220px)", new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Sidebar.Position("[data-md-component=navigation]", "[data-md-component=header]"))), document.querySelector("[data-md-component=toc]") && new i.a.Event.MatchMedia("(min-width: 960px)", new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Sidebar.Position("[data-md-component=toc]", "[data-md-component=header]"))), new i.a.Event.MatchMedia("(min-width: 960px)", new i.a.Event.Listener(window, "scroll", new i.a.Nav.Blur("[data-md-component=toc] .md-nav__link"))); + var e = document.querySelectorAll("[data-md-component=collapsible]"); + Array.prototype.forEach.call(e, function(e) { + new i.a.Event.MatchMedia("(min-width: 1220px)", new i.a.Event.Listener(e.previousElementSibling, "click", new i.a.Nav.Collapse(e))) + }), new i.a.Event.MatchMedia("(max-width: 1219px)", new i.a.Event.Listener("[data-md-component=navigation] [data-md-toggle]", "change", new i.a.Nav.Scrolling("[data-md-component=navigation] nav"))), document.querySelector("[data-md-component=search]") && (new i.a.Event.MatchMedia("(max-width: 959px)", new i.a.Event.Listener("[data-md-toggle=search]", "change", new i.a.Search.Lock("[data-md-toggle=search]")))), + new i.a.Event.Listener(document.body, "keydown", function(e) { + if (9 === e.keyCode) { + var t = document.querySelectorAll("[data-md-component=navigation] .md-nav__link[for]:not([tabindex])"); + Array.prototype.forEach.call(t, function(e) { + e.offsetHeight && (e.tabIndex = 0) + }) + } + }).listen(), new i.a.Event.Listener(document.body, "mousedown", function() { + var e = document.querySelectorAll("[data-md-component=navigation] .md-nav__link[tabindex]"); + Array.prototype.forEach.call(e, function(e) { + e.removeAttribute("tabIndex") + }) + }).listen(), document.body.addEventListener("click", function() { + "tabbing" === document.body.dataset.mdState && (document.body.dataset.mdState = "") + }), new i.a.Event.MatchMedia("(max-width: 959px)", new i.a.Event.Listener("[data-md-component=navigation] [href^='#']", "click", function() { + var e = document.querySelector("[data-md-toggle=drawer]"); + if (!(e instanceof HTMLInputElement)) throw new ReferenceError; + e.checked && (e.checked = !1, e.dispatchEvent(new CustomEvent("change"))) + })), + function() { + var e = document.querySelector("[data-md-source]"); + if (!e) return r.a.resolve([]); + if (!(e instanceof HTMLAnchorElement)) throw new ReferenceError; + switch (e.dataset.mdSource) { + case "github": + return new i.a.Source.Adapter.GitHub(e).fetch(); + default: + return r.a.resolve([]) + } + }().then(function(t) { + var e = document.querySelectorAll("[data-md-source]"); + Array.prototype.forEach.call(e, function(e) { + new i.a.Source.Repository(e).initialize(t) + }) + }); + var n = function() { + var e = document.querySelectorAll("details"); + Array.prototype.forEach.call(e, function(e) { + e.setAttribute("open", "") + }) + }; + new i.a.Event.MatchMedia("print", { + listen: n, + unlisten: function() {} + }), window.onbeforeprint = n + } + } + }.call(this, c(3)) +}, function(e, t, n) { + e.exports = n.p + "assets/images/icons/bitbucket.1b09e088.svg" +}, function(e, t, n) { + e.exports = n.p + "assets/images/icons/github.f0b8504a.svg" +}, function(e, t, n) { + e.exports = n.p + "assets/images/icons/gitlab.6dd19c00.svg" +}, function(e, t) { + e.exports = "/Users/squidfunk/Desktop/General/Sources/mkdocs-material/material/application.4031d38b.css" +}, function(e, t) { + e.exports = "/Users/squidfunk/Desktop/General/Sources/mkdocs-material/material/application-palette.224b79ff.css" +}, function(e, t) { + ! function() { + if ("undefined" != typeof window) try { + var e = new window.CustomEvent("test", { + cancelable: !0 + }); + if (e.preventDefault(), !0 !== e.defaultPrevented) throw new Error("Could not prevent default") + } catch (e) { + var t = function(e, t) { + var n, r; + return (t = t || {}).bubbles = !!t.bubbles, t.cancelable = !!t.cancelable, (n = document.createEvent("CustomEvent")).initCustomEvent(e, t.bubbles, t.cancelable, t.detail), r = n.preventDefault, n.preventDefault = function() { + r.call(this); + try { + Object.defineProperty(this, "defaultPrevented", { + get: function() { + return !0 + } + }) + } catch (e) { + this.defaultPrevented = !0 + } + }, n + }; + t.prototype = window.Event.prototype, window.CustomEvent = t + } + }() +}, function(e, t, n) { + window.fetch || (window.fetch = n(7).default || n(7)) +}, function(e, i, o) { + (function(e) { + var t = void 0 !== e && e || "undefined" != typeof self && self || window, + n = Function.prototype.apply; + + function r(e, t) { + this._id = e, this._clearFn = t + } + i.setTimeout = function() { + return new r(n.call(setTimeout, t, arguments), clearTimeout) + }, i.setInterval = function() { + return new r(n.call(setInterval, t, arguments), clearInterval) + }, i.clearTimeout = i.clearInterval = function(e) { + e && e.close() + }, r.prototype.unref = r.prototype.ref = function() {}, r.prototype.close = function() { + this._clearFn.call(t, this._id) + }, i.enroll = function(e, t) { + clearTimeout(e._idleTimeoutId), e._idleTimeout = t + }, i.unenroll = function(e) { + clearTimeout(e._idleTimeoutId), e._idleTimeout = -1 + }, i._unrefActive = i.active = function(e) { + clearTimeout(e._idleTimeoutId); + var t = e._idleTimeout; + 0 <= t && (e._idleTimeoutId = setTimeout(function() { + e._onTimeout && e._onTimeout() + }, t)) + }, o(22), i.setImmediate = "undefined" != typeof self && self.setImmediate || void 0 !== e && e.setImmediate || this && this.setImmediate, i.clearImmediate = "undefined" != typeof self && self.clearImmediate || void 0 !== e && e.clearImmediate || this && this.clearImmediate + }).call(this, o(4)) +}, function(e, t, n) { + (function(e, p) { + ! function(n, r) { + "use strict"; + if (!n.setImmediate) { + var i, o, t, a, e, s = 1, + c = {}, + l = !1, + u = n.document, + f = Object.getPrototypeOf && Object.getPrototypeOf(n); + f = f && f.setTimeout ? f : n, i = "[object process]" === {}.toString.call(n.process) ? function(e) { + p.nextTick(function() { + h(e) + }) + } : function() { + if (n.postMessage && !n.importScripts) { + var e = !0, + t = n.onmessage; + return n.onmessage = function() { + e = !1 + }, n.postMessage("", "*"), n.onmessage = t, e + } + }() ? (a = "setImmediate$" + Math.random() + "$", e = function(e) { + e.source === n && "string" == typeof e.data && 0 === e.data.indexOf(a) && h(+e.data.slice(a.length)) + }, n.addEventListener ? n.addEventListener("message", e, !1) : n.attachEvent("onmessage", e), function(e) { + n.postMessage(a + e, "*") + }) : n.MessageChannel ? ((t = new MessageChannel).port1.onmessage = function(e) { + h(e.data) + }, function(e) { + t.port2.postMessage(e) + }) : u && "onreadystatechange" in u.createElement("script") ? (o = u.documentElement, function(e) { + var t = u.createElement("script"); + t.onreadystatechange = function() { + h(e), t.onreadystatechange = null, o.removeChild(t), t = null + }, o.appendChild(t) + }) : function(e) { + setTimeout(h, 0, e) + }, f.setImmediate = function(e) { + "function" != typeof e && (e = new Function("" + e)); + for (var t = new Array(arguments.length - 1), n = 0; n < t.length; n++) t[n] = arguments[n + 1]; + var r = { + callback: e, + args: t + }; + return c[s] = r, i(s), s++ + }, f.clearImmediate = d + } + + function d(e) { + delete c[e] + } + + function h(e) { + if (l) setTimeout(h, 0, e); + else { + var t = c[e]; + if (t) { + l = !0; + try { + ! function(e) { + var t = e.callback, + n = e.args; + switch (n.length) { + case 0: + t(); + break; + case 1: + t(n[0]); + break; + case 2: + t(n[0], n[1]); + break; + case 3: + t(n[0], n[1], n[2]); + break; + default: + t.apply(r, n) + } + }(t) + } finally { + d(e), l = !1 + } + } + } + } + }("undefined" == typeof self ? void 0 === e ? this : e : self) + }).call(this, n(4), n(23)) +}, function(e, t) { + var n, r, i = e.exports = {}; + + function o() { + throw new Error("setTimeout has not been defined") + } + + function a() { + throw new Error("clearTimeout has not been defined") + } + + function s(t) { + if (n === setTimeout) return setTimeout(t, 0); + if ((n === o || !n) && setTimeout) return n = setTimeout, setTimeout(t, 0); + try { + return n(t, 0) + } catch (e) { + try { + return n.call(null, t, 0) + } catch (e) { + return n.call(this, t, 0) + } + } + }! function() { + try { + n = "function" == typeof setTimeout ? setTimeout : o + } catch (e) { + n = o + } + try { + r = "function" == typeof clearTimeout ? clearTimeout : a + } catch (e) { + r = a + } + }(); + var c, l = [], + u = !1, + f = -1; + + function d() { + u && c && (u = !1, c.length ? l = c.concat(l) : f = -1, l.length && h()) + } + + function h() { + if (!u) { + var e = s(d); + u = !0; + for (var t = l.length; t;) { + for (c = l, l = []; ++f < t;) c && c[f].run(); + f = -1, t = l.length + } + c = null, u = !1, + function(t) { + if (r === clearTimeout) return clearTimeout(t); + if ((r === a || !r) && clearTimeout) return r = clearTimeout, clearTimeout(t); + try { + r(t) + } catch (e) { + try { + return r.call(null, t) + } catch (e) { + return r.call(this, t) + } + } + }(e) + } + } + + function p(e, t) { + this.fun = e, this.array = t + } + + function m() {} + i.nextTick = function(e) { + var t = new Array(arguments.length - 1); + if (1 < arguments.length) + for (var n = 1; n < arguments.length; n++) t[n - 1] = arguments[n]; + l.push(new p(e, t)), 1 !== l.length || u || s(h) + }, p.prototype.run = function() { + this.fun.apply(null, this.array) + }, i.title = "browser", i.browser = !0, i.env = {}, i.argv = [], i.version = "", i.versions = {}, i.on = m, i.addListener = m, i.once = m, i.off = m, i.removeListener = m, i.removeAllListeners = m, i.emit = m, i.prependListener = m, i.prependOnceListener = m, i.listeners = function(e) { + return [] + }, i.binding = function(e) { + throw new Error("process.binding is not supported") + }, i.cwd = function() { + return "/" + }, i.chdir = function(e) { + throw new Error("process.chdir is not supported") + }, i.umask = function() { + return 0 + } +}, function(i, o, a) { + var s, c; + /** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.6 + * Copyright (C) 2019 Oliver Nightingale + * @license MIT + */ + ! function() { + var t, l, u, e, n, f, d, h, p, m, y, v, g, w, _, E, x, b, k, S, T, L, R, O, C, r, D = function(e) { + var t = new D.Builder; + return t.pipeline.add(D.trimmer, D.stopWordFilter, D.stemmer), t.searchPipeline.add(D.stemmer), e.call(t, t), t.build() + }; + D.version = "2.3.6", D.utils = {}, D.utils.warn = (t = this, function(e) { + t.console && console.warn && console.warn(e) + }), D.utils.asString = function(e) { + return null == e ? "" : e.toString() + }, D.utils.clone = function(e) { + if (null == e) return e; + for (var t = Object.create(null), n = Object.keys(e), r = 0; r < n.length; r++) { + var i = n[r], + o = e[i]; + if (Array.isArray(o)) t[i] = o.slice(); + else { + if ("string" != typeof o && "number" != typeof o && "boolean" != typeof o) throw new TypeError("clone is not deep and does not support nested objects"); + t[i] = o + } + } + return t + }, D.FieldRef = function(e, t, n) { + this.docRef = e, this.fieldName = t, this._stringValue = n + }, D.FieldRef.joiner = "/", D.FieldRef.fromString = function(e) { + var t = e.indexOf(D.FieldRef.joiner); + if (-1 === t) throw "malformed field ref string"; + var n = e.slice(0, t), + r = e.slice(t + 1); + return new D.FieldRef(r, n, e) + }, D.FieldRef.prototype.toString = function() { + return null == this._stringValue && (this._stringValue = this.fieldName + D.FieldRef.joiner + this.docRef), this._stringValue + }, D.Set = function(e) { + if (this.elements = Object.create(null), e) { + this.length = e.length; + for (var t = 0; t < this.length; t++) this.elements[e[t]] = !0 + } else this.length = 0 + }, D.Set.complete = { + intersect: function(e) { + return e + }, + union: function(e) { + return e + }, + contains: function() { + return !0 + } + }, D.Set.empty = { + intersect: function() { + return this + }, + union: function(e) { + return e + }, + contains: function() { + return !1 + } + }, D.Set.prototype.contains = function(e) { + return !!this.elements[e] + }, D.Set.prototype.intersect = function(e) { + var t, n, r, i = []; + if (e === D.Set.complete) return this; + if (e === D.Set.empty) return e; + n = this.length < e.length ? (t = this, e) : (t = e, this), r = Object.keys(t.elements); + for (var o = 0; o < r.length; o++) { + var a = r[o]; + a in n.elements && i.push(a) + } + return new D.Set(i) + }, D.Set.prototype.union = function(e) { + return e === D.Set.complete ? D.Set.complete : e === D.Set.empty ? this : new D.Set(Object.keys(this.elements).concat(Object.keys(e.elements))) + }, D.idf = function(e, t) { + var n = 0; + for (var r in e) "_index" != r && (n += Object.keys(e[r]).length); + var i = (t - n + .5) / (n + .5); + return Math.log(1 + Math.abs(i)) + }, D.Token = function(e, t) { + this.str = e || "", this.metadata = t || {} + }, D.Token.prototype.toString = function() { + return this.str + }, D.Token.prototype.update = function(e) { + return this.str = e(this.str, this.metadata), this + }, D.Token.prototype.clone = function(e) { + return e = e || function(e) { + return e + }, new D.Token(e(this.str, this.metadata), this.metadata) + }, D.tokenizer = function(e, t) { + if (null == e || null == e) return []; + if (Array.isArray(e)) return e.map(function(e) { + return new D.Token(D.utils.asString(e).toLowerCase(), D.utils.clone(t)) + }); + for (var n = e.toString().trim().toLowerCase(), r = n.length, i = [], o = 0, a = 0; o <= r; o++) { + var s = o - a; + if (n.charAt(o).match(D.tokenizer.separator) || o == r) { + if (0 < s) { + var c = D.utils.clone(t) || {}; + c.position = [a, s], c.index = i.length, i.push(new D.Token(n.slice(a, o), c)) + } + a = o + 1 + } + } + return i + }, D.tokenizer.separator = /[\s\-]+/, D.Pipeline = function() { + this._stack = [] + }, D.Pipeline.registeredFunctions = Object.create(null), D.Pipeline.registerFunction = function(e, t) { + t in this.registeredFunctions && D.utils.warn("Overwriting existing registered function: " + t), e.label = t, D.Pipeline.registeredFunctions[e.label] = e + }, D.Pipeline.warnIfFunctionNotRegistered = function(e) { + e.label && e.label in this.registeredFunctions || D.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n", e) + }, D.Pipeline.load = function(e) { + var n = new D.Pipeline; + return e.forEach(function(e) { + var t = D.Pipeline.registeredFunctions[e]; + if (!t) throw new Error("Cannot load unregistered function: " + e); + n.add(t) + }), n + }, D.Pipeline.prototype.add = function() { + Array.prototype.slice.call(arguments).forEach(function(e) { + D.Pipeline.warnIfFunctionNotRegistered(e), this._stack.push(e) + }, this) + }, D.Pipeline.prototype.after = function(e, t) { + D.Pipeline.warnIfFunctionNotRegistered(t); + var n = this._stack.indexOf(e); + if (-1 == n) throw new Error("Cannot find existingFn"); + n += 1, this._stack.splice(n, 0, t) + }, D.Pipeline.prototype.before = function(e, t) { + D.Pipeline.warnIfFunctionNotRegistered(t); + var n = this._stack.indexOf(e); + if (-1 == n) throw new Error("Cannot find existingFn"); + this._stack.splice(n, 0, t) + }, D.Pipeline.prototype.remove = function(e) { + var t = this._stack.indexOf(e); - 1 != t && this._stack.splice(t, 1) + }, D.Pipeline.prototype.run = function(e) { + for (var t = this._stack.length, n = 0; n < t; n++) { + for (var r = this._stack[n], i = [], o = 0; o < e.length; o++) { + var a = r(e[o], o, e); + if (void 0 !== a && "" !== a) + if (Array.isArray(a)) + for (var s = 0; s < a.length; s++) i.push(a[s]); + else i.push(a) + } + e = i + } + return e + }, D.Pipeline.prototype.runString = function(e, t) { + var n = new D.Token(e, t); + return this.run([n]).map(function(e) { + return e.toString() + }) + }, D.Pipeline.prototype.reset = function() { + this._stack = [] + }, D.Pipeline.prototype.toJSON = function() { + return this._stack.map(function(e) { + return D.Pipeline.warnIfFunctionNotRegistered(e), e.label + }) + }, D.Vector = function(e) { + this._magnitude = 0, this.elements = e || [] + }, D.Vector.prototype.positionForIndex = function(e) { + if (0 == this.elements.length) return 0; + for (var t = 0, n = this.elements.length / 2, r = n - t, i = Math.floor(r / 2), o = this.elements[2 * i]; 1 < r && (o < e && (t = i), e < o && (n = i), o != e);) r = n - t, i = t + Math.floor(r / 2), o = this.elements[2 * i]; + return o == e ? 2 * i : e < o ? 2 * i : o < e ? 2 * (i + 1) : void 0 + }, D.Vector.prototype.insert = function(e, t) { + this.upsert(e, t, function() { + throw "duplicate index" + }) + }, D.Vector.prototype.upsert = function(e, t, n) { + this._magnitude = 0; + var r = this.positionForIndex(e); + this.elements[r] == e ? this.elements[r + 1] = n(this.elements[r + 1], t) : this.elements.splice(r, 0, e, t) + }, D.Vector.prototype.magnitude = function() { + if (this._magnitude) return this._magnitude; + for (var e = 0, t = this.elements.length, n = 1; n < t; n += 2) { + var r = this.elements[n]; + e += r * r + } + return this._magnitude = Math.sqrt(e) + }, D.Vector.prototype.dot = function(e) { + for (var t = 0, n = this.elements, r = e.elements, i = n.length, o = r.length, a = 0, s = 0, c = 0, l = 0; c < i && l < o;)(a = n[c]) < (s = r[l]) ? c += 2 : s < a ? l += 2 : a == s && (t += n[c + 1] * r[l + 1], c += 2, l += 2); + return t + }, D.Vector.prototype.similarity = function(e) { + return this.dot(e) / this.magnitude() || 0 + }, D.Vector.prototype.toArray = function() { + for (var e = new Array(this.elements.length / 2), t = 1, n = 0; t < this.elements.length; t += 2, n++) e[n] = this.elements[t]; + return e + }, D.Vector.prototype.toJSON = function() { + return this.elements + }, D.stemmer = (l = { + ational: "ate", + tional: "tion", + enci: "ence", + anci: "ance", + izer: "ize", + bli: "ble", + alli: "al", + entli: "ent", + eli: "e", + ousli: "ous", + ization: "ize", + ation: "ate", + ator: "ate", + alism: "al", + iveness: "ive", + fulness: "ful", + ousness: "ous", + aliti: "al", + iviti: "ive", + biliti: "ble", + logi: "log" + }, u = { + icate: "ic", + ative: "", + alize: "al", + iciti: "ic", + ical: "ic", + ful: "", + ness: "" + }, e = "[aeiouy]", n = "[^aeiou][^aeiouy]*", f = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*"), d = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*[aeiouy][aeiou]*[^aeiou][^aeiouy]*"), h = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*([aeiouy][aeiou]*)?$"), p = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy]"), m = /^(.+?)(ss|i)es$/, y = /^(.+?)([^s])s$/, v = /^(.+?)eed$/, g = /^(.+?)(ed|ing)$/, w = /.$/, _ = /(at|bl|iz)$/, E = new RegExp("([^aeiouylsz])\\1$"), x = new RegExp("^" + n + e + "[^aeiouwxy]$"), b = /^(.+?[^aeiou])y$/, k = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/, S = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/, T = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/, L = /^(.+?)(s|t)(ion)$/, R = /^(.+?)e$/, O = /ll$/, C = new RegExp("^" + n + e + "[^aeiouwxy]$"), r = function(e) { + var t, n, r, i, o, a, s; + if (e.length < 3) return e; + if ("y" == (r = e.substr(0, 1)) && (e = r.toUpperCase() + e.substr(1)), o = y, (i = m).test(e) ? e = e.replace(i, "$1$2") : o.test(e) && (e = e.replace(o, "$1$2")), o = g, (i = v).test(e)) { + var c = i.exec(e); + (i = f).test(c[1]) && (i = w, e = e.replace(i, "")) + } else if (o.test(e)) { + t = (c = o.exec(e))[1], (o = p).test(t) && (a = E, s = x, (o = _).test(e = t) ? e += "e" : a.test(e) ? (i = w, e = e.replace(i, "")) : s.test(e) && (e += "e")) + }(i = b).test(e) && (e = (t = (c = i.exec(e))[1]) + "i"); + (i = k).test(e) && (t = (c = i.exec(e))[1], n = c[2], (i = f).test(t) && (e = t + l[n])); + (i = S).test(e) && (t = (c = i.exec(e))[1], n = c[2], (i = f).test(t) && (e = t + u[n])); + if (o = L, (i = T).test(e)) t = (c = i.exec(e))[1], (i = d).test(t) && (e = t); + else if (o.test(e)) { + t = (c = o.exec(e))[1] + c[2], (o = d).test(t) && (e = t) + }(i = R).test(e) && (t = (c = i.exec(e))[1], o = h, a = C, ((i = d).test(t) || o.test(t) && !a.test(t)) && (e = t)); + return o = d, (i = O).test(e) && o.test(e) && (i = w, e = e.replace(i, "")), "y" == r && (e = r.toLowerCase() + e.substr(1)), e + }, function(e) { + return e.update(r) + }), D.Pipeline.registerFunction(D.stemmer, "stemmer"), D.generateStopWordFilter = function(e) { + var t = e.reduce(function(e, t) { + return e[t] = t, e + }, {}); + return function(e) { + if (e && t[e.toString()] !== e.toString()) return e + } + }, D.stopWordFilter = D.generateStopWordFilter(["a", "able", "about", "across", "after", "all", "almost", "also", "am", "among", "an", "and", "any", "are", "as", "at", "be", "because", "been", "but", "by", "can", "cannot", "could", "dear", "did", "do", "does", "either", "else", "ever", "every", "for", "from", "get", "got", "had", "has", "have", "he", "her", "hers", "him", "his", "how", "however", "i", "if", "in", "into", "is", "it", "its", "just", "least", "let", "like", "likely", "may", "me", "might", "most", "must", "my", "neither", "no", "nor", "not", "of", "off", "often", "on", "only", "or", "other", "our", "own", "rather", "said", "say", "says", "she", "should", "since", "so", "some", "than", "that", "the", "their", "them", "then", "there", "these", "they", "this", "tis", "to", "too", "twas", "us", "wants", "was", "we", "were", "what", "when", "where", "which", "while", "who", "whom", "why", "will", "with", "would", "yet", "you", "your"]), D.Pipeline.registerFunction(D.stopWordFilter, "stopWordFilter"), D.trimmer = function(e) { + return e.update(function(e) { + return e.replace(/^\W+/, "").replace(/\W+$/, "") + }) + }, D.Pipeline.registerFunction(D.trimmer, "trimmer"), D.TokenSet = function() { + this.final = !1, this.edges = {}, this.id = D.TokenSet._nextId, D.TokenSet._nextId += 1 + }, D.TokenSet._nextId = 1, D.TokenSet.fromArray = function(e) { + for (var t = new D.TokenSet.Builder, n = 0, r = e.length; n < r; n++) t.insert(e[n]); + return t.finish(), t.root + }, D.TokenSet.fromClause = function(e) { + return "editDistance" in e ? D.TokenSet.fromFuzzyString(e.term, e.editDistance) : D.TokenSet.fromString(e.term) + }, D.TokenSet.fromFuzzyString = function(e, t) { + for (var n = new D.TokenSet, r = [{ + node: n, + editsRemaining: t, + str: e + }]; r.length;) { + var i = r.pop(); + if (0 < i.str.length) { + var o, a = i.str.charAt(0); + a in i.node.edges ? o = i.node.edges[a] : (o = new D.TokenSet, i.node.edges[a] = o), 1 == i.str.length && (o.final = !0), r.push({ + node: o, + editsRemaining: i.editsRemaining, + str: i.str.slice(1) + }) + } + if (0 != i.editsRemaining) { + if ("*" in i.node.edges) var s = i.node.edges["*"]; + else { + s = new D.TokenSet; + i.node.edges["*"] = s + } + if (0 == i.str.length && (s.final = !0), r.push({ + node: s, + editsRemaining: i.editsRemaining - 1, + str: i.str + }), 1 < i.str.length && r.push({ + node: i.node, + editsRemaining: i.editsRemaining - 1, + str: i.str.slice(1) + }), 1 == i.str.length && (i.node.final = !0), 1 <= i.str.length) { + if ("*" in i.node.edges) var c = i.node.edges["*"]; + else { + c = new D.TokenSet; + i.node.edges["*"] = c + } + 1 == i.str.length && (c.final = !0), r.push({ + node: c, + editsRemaining: i.editsRemaining - 1, + str: i.str.slice(1) + }) + } + if (1 < i.str.length) { + var l, u = i.str.charAt(0), + f = i.str.charAt(1); + f in i.node.edges ? l = i.node.edges[f] : (l = new D.TokenSet, i.node.edges[f] = l), 1 == i.str.length && (l.final = !0), r.push({ + node: l, + editsRemaining: i.editsRemaining - 1, + str: u + i.str.slice(2) + }) + } + } + } + return n + }, D.TokenSet.fromString = function(e) { + for (var t = new D.TokenSet, n = t, r = 0, i = e.length; r < i; r++) { + var o = e[r], + a = r == i - 1; + if ("*" == o)(t.edges[o] = t).final = a; + else { + var s = new D.TokenSet; + s.final = a, t.edges[o] = s, t = s + } + } + return n + }, D.TokenSet.prototype.toArray = function() { + for (var e = [], t = [{ + prefix: "", + node: this + }]; t.length;) { + var n = t.pop(), + r = Object.keys(n.node.edges), + i = r.length; + n.node.final && (n.prefix.charAt(0), e.push(n.prefix)); + for (var o = 0; o < i; o++) { + var a = r[o]; + t.push({ + prefix: n.prefix.concat(a), + node: n.node.edges[a] + }) + } + } + return e + }, D.TokenSet.prototype.toString = function() { + if (this._str) return this._str; + for (var e = this.final ? "1" : "0", t = Object.keys(this.edges).sort(), n = t.length, r = 0; r < n; r++) { + var i = t[r]; + e = e + i + this.edges[i].id + } + return e + }, D.TokenSet.prototype.intersect = function(e) { + for (var t = new D.TokenSet, n = void 0, r = [{ + qNode: e, + output: t, + node: this + }]; r.length;) { + n = r.pop(); + for (var i = Object.keys(n.qNode.edges), o = i.length, a = Object.keys(n.node.edges), s = a.length, c = 0; c < o; c++) + for (var l = i[c], u = 0; u < s; u++) { + var f = a[u]; + if (f == l || "*" == l) { + var d = n.node.edges[f], + h = n.qNode.edges[l], + p = d.final && h.final, + m = void 0; + f in n.output.edges ? (m = n.output.edges[f]).final = m.final || p : ((m = new D.TokenSet).final = p, n.output.edges[f] = m), r.push({ + qNode: h, + output: m, + node: d + }) + } + } + } + return t + }, D.TokenSet.Builder = function() { + this.previousWord = "", this.root = new D.TokenSet, this.uncheckedNodes = [], this.minimizedNodes = {} + }, D.TokenSet.Builder.prototype.insert = function(e) { + var t, n = 0; + if (e < this.previousWord) throw new Error("Out of order word insertion"); + for (var r = 0; r < e.length && r < this.previousWord.length && e[r] == this.previousWord[r]; r++) n++; + this.minimize(n), t = 0 == this.uncheckedNodes.length ? this.root : this.uncheckedNodes[this.uncheckedNodes.length - 1].child; + for (r = n; r < e.length; r++) { + var i = new D.TokenSet, + o = e[r]; + t.edges[o] = i, this.uncheckedNodes.push({ + parent: t, + char: o, + child: i + }), t = i + } + t.final = !0, this.previousWord = e + }, D.TokenSet.Builder.prototype.finish = function() { + this.minimize(0) + }, D.TokenSet.Builder.prototype.minimize = function(e) { + for (var t = this.uncheckedNodes.length - 1; e <= t; t--) { + var n = this.uncheckedNodes[t], + r = n.child.toString(); + r in this.minimizedNodes ? n.parent.edges[n.char] = this.minimizedNodes[r] : (n.child._str = r, this.minimizedNodes[r] = n.child), this.uncheckedNodes.pop() + } + }, D.Index = function(e) { + this.invertedIndex = e.invertedIndex, this.fieldVectors = e.fieldVectors, this.tokenSet = e.tokenSet, this.fields = e.fields, this.pipeline = e.pipeline + }, D.Index.prototype.search = function(t) { + return this.query(function(e) { + new D.QueryParser(t, e).parse() + }) + }, D.Index.prototype.query = function(e) { + for (var t = new D.Query(this.fields), n = Object.create(null), r = Object.create(null), i = Object.create(null), o = Object.create(null), a = Object.create(null), s = 0; s < this.fields.length; s++) r[this.fields[s]] = new D.Vector; + e.call(t, t); + for (s = 0; s < t.clauses.length; s++) { + var c = t.clauses[s], + l = null, + u = D.Set.complete; + l = c.usePipeline ? this.pipeline.runString(c.term, { + fields: c.fields + }) : [c.term]; + for (var f = 0; f < l.length; f++) { + var d = l[f]; + c.term = d; + var h = D.TokenSet.fromClause(c), + p = this.tokenSet.intersect(h).toArray(); + if (0 === p.length && c.presence === D.Query.presence.REQUIRED) { + for (var m = 0; m < c.fields.length; m++) { + o[Q = c.fields[m]] = D.Set.empty + } + break + } + for (var y = 0; y < p.length; y++) { + var v = p[y], + g = this.invertedIndex[v], + w = g._index; + for (m = 0; m < c.fields.length; m++) { + var _ = g[Q = c.fields[m]], + E = Object.keys(_), + x = v + "/" + Q, + b = new D.Set(E); + if (c.presence == D.Query.presence.REQUIRED && (u = u.union(b), void 0 === o[Q] && (o[Q] = D.Set.complete)), c.presence != D.Query.presence.PROHIBITED) { + if (r[Q].upsert(w, c.boost, function(e, t) { + return e + t + }), !i[x]) { + for (var k = 0; k < E.length; k++) { + var S, T = E[k], + L = new D.FieldRef(T, Q), + R = _[T]; + void 0 === (S = n[L]) ? n[L] = new D.MatchData(v, Q, R) : S.add(v, Q, R) + } + i[x] = !0 + } + } else void 0 === a[Q] && (a[Q] = D.Set.empty), a[Q] = a[Q].union(b) + } + } + } + if (c.presence === D.Query.presence.REQUIRED) + for (m = 0; m < c.fields.length; m++) { + o[Q = c.fields[m]] = o[Q].intersect(u) + } + } + var O = D.Set.complete, + C = D.Set.empty; + for (s = 0; s < this.fields.length; s++) { + var Q; + o[Q = this.fields[s]] && (O = O.intersect(o[Q])), a[Q] && (C = C.union(a[Q])) + } + var P = Object.keys(n), + A = [], + I = Object.create(null); + if (t.isNegated()) { + P = Object.keys(this.fieldVectors); + for (s = 0; s < P.length; s++) { + L = P[s]; + var M = D.FieldRef.fromString(L); + n[L] = new D.MatchData + } + } + for (s = 0; s < P.length; s++) { + var N = (M = D.FieldRef.fromString(P[s])).docRef; + if (O.contains(N) && !C.contains(N)) { + var j, F = this.fieldVectors[M], + H = r[M.fieldName].similarity(F); + if (void 0 !== (j = I[N])) j.score += H, j.matchData.combine(n[M]); + else { + var q = { + ref: N, + score: H, + matchData: n[M] + }; + I[N] = q, A.push(q) + } + } + } + return A.sort(function(e, t) { + return t.score - e.score + }) + }, D.Index.prototype.toJSON = function() { + var e = Object.keys(this.invertedIndex).sort().map(function(e) { + return [e, this.invertedIndex[e]] + }, this), + t = Object.keys(this.fieldVectors).map(function(e) { + return [e, this.fieldVectors[e].toJSON()] + }, this); + return { + version: D.version, + fields: this.fields, + fieldVectors: t, + invertedIndex: e, + pipeline: this.pipeline.toJSON() + } + }, D.Index.load = function(e) { + var t = {}, + n = {}, + r = e.fieldVectors, + i = Object.create(null), + o = e.invertedIndex, + a = new D.TokenSet.Builder, + s = D.Pipeline.load(e.pipeline); + e.version != D.version && D.utils.warn("Version mismatch when loading serialised index. Current version of lunr '" + D.version + "' does not match serialized index '" + e.version + "'"); + for (var c = 0; c < r.length; c++) { + var l = (f = r[c])[0], + u = f[1]; + n[l] = new D.Vector(u) + } + for (c = 0; c < o.length; c++) { + var f, d = (f = o[c])[0], + h = f[1]; + a.insert(d), i[d] = h + } + return a.finish(), t.fields = e.fields, t.fieldVectors = n, t.invertedIndex = i, t.tokenSet = a.root, t.pipeline = s, new D.Index(t) + }, D.Builder = function() { + this._ref = "id", this._fields = Object.create(null), this._documents = Object.create(null), this.invertedIndex = Object.create(null), this.fieldTermFrequencies = {}, this.fieldLengths = {}, this.tokenizer = D.tokenizer, this.pipeline = new D.Pipeline, this.searchPipeline = new D.Pipeline, this.documentCount = 0, this._b = .75, this._k1 = 1.2, this.termIndex = 0, this.metadataWhitelist = [] + }, D.Builder.prototype.ref = function(e) { + this._ref = e + }, D.Builder.prototype.field = function(e, t) { + if (/\//.test(e)) throw new RangeError("Field '" + e + "' contains illegal character '/'"); + this._fields[e] = t || {} + }, D.Builder.prototype.b = function(e) { + this._b = e < 0 ? 0 : 1 < e ? 1 : e + }, D.Builder.prototype.k1 = function(e) { + this._k1 = e + }, D.Builder.prototype.add = function(e, t) { + var n = e[this._ref], + r = Object.keys(this._fields); + this._documents[n] = t || {}, this.documentCount += 1; + for (var i = 0; i < r.length; i++) { + var o = r[i], + a = this._fields[o].extractor, + s = a ? a(e) : e[o], + c = this.tokenizer(s, { + fields: [o] + }), + l = this.pipeline.run(c), + u = new D.FieldRef(n, o), + f = Object.create(null); + this.fieldTermFrequencies[u] = f, this.fieldLengths[u] = 0, this.fieldLengths[u] += l.length; + for (var d = 0; d < l.length; d++) { + var h = l[d]; + if (null == f[h] && (f[h] = 0), f[h] += 1, null == this.invertedIndex[h]) { + var p = Object.create(null); + p._index = this.termIndex, this.termIndex += 1; + for (var m = 0; m < r.length; m++) p[r[m]] = Object.create(null); + this.invertedIndex[h] = p + } + null == this.invertedIndex[h][o][n] && (this.invertedIndex[h][o][n] = Object.create(null)); + for (var y = 0; y < this.metadataWhitelist.length; y++) { + var v = this.metadataWhitelist[y], + g = h.metadata[v]; + null == this.invertedIndex[h][o][n][v] && (this.invertedIndex[h][o][n][v] = []), this.invertedIndex[h][o][n][v].push(g) + } + } + } + }, D.Builder.prototype.calculateAverageFieldLengths = function() { + for (var e = Object.keys(this.fieldLengths), t = e.length, n = {}, r = {}, i = 0; i < t; i++) { + var o = D.FieldRef.fromString(e[i]), + a = o.fieldName; + r[a] || (r[a] = 0), r[a] += 1, n[a] || (n[a] = 0), n[a] += this.fieldLengths[o] + } + var s = Object.keys(this._fields); + for (i = 0; i < s.length; i++) { + var c = s[i]; + n[c] = n[c] / r[c] + } + this.averageFieldLength = n + }, D.Builder.prototype.createFieldVectors = function() { + for (var e = {}, t = Object.keys(this.fieldTermFrequencies), n = t.length, r = Object.create(null), i = 0; i < n; i++) { + for (var o = D.FieldRef.fromString(t[i]), a = o.fieldName, s = this.fieldLengths[o], c = new D.Vector, l = this.fieldTermFrequencies[o], u = Object.keys(l), f = u.length, d = this._fields[a].boost || 1, h = this._documents[o.docRef].boost || 1, p = 0; p < f; p++) { + var m, y, v, g = u[p], + w = l[g], + _ = this.invertedIndex[g]._index; + void 0 === r[g] ? (m = D.idf(this.invertedIndex[g], this.documentCount), r[g] = m) : m = r[g], y = m * ((this._k1 + 1) * w) / (this._k1 * (1 - this._b + this._b * (s / this.averageFieldLength[a])) + w), y *= d, y *= h, v = Math.round(1e3 * y) / 1e3, c.insert(_, v) + } + e[o] = c + } + this.fieldVectors = e + }, D.Builder.prototype.createTokenSet = function() { + this.tokenSet = D.TokenSet.fromArray(Object.keys(this.invertedIndex).sort()) + }, D.Builder.prototype.build = function() { + return this.calculateAverageFieldLengths(), this.createFieldVectors(), this.createTokenSet(), new D.Index({ + invertedIndex: this.invertedIndex, + fieldVectors: this.fieldVectors, + tokenSet: this.tokenSet, + fields: Object.keys(this._fields), + pipeline: this.searchPipeline + }) + }, D.Builder.prototype.use = function(e) { + var t = Array.prototype.slice.call(arguments, 1); + t.unshift(this), e.apply(this, t) + }, D.MatchData = function(e, t, n) { + for (var r = Object.create(null), i = Object.keys(n || {}), o = 0; o < i.length; o++) { + var a = i[o]; + r[a] = n[a].slice() + } + this.metadata = Object.create(null), void 0 !== e && (this.metadata[e] = Object.create(null), this.metadata[e][t] = r) + }, D.MatchData.prototype.combine = function(e) { + for (var t = Object.keys(e.metadata), n = 0; n < t.length; n++) { + var r = t[n], + i = Object.keys(e.metadata[r]); + null == this.metadata[r] && (this.metadata[r] = Object.create(null)); + for (var o = 0; o < i.length; o++) { + var a = i[o], + s = Object.keys(e.metadata[r][a]); + null == this.metadata[r][a] && (this.metadata[r][a] = Object.create(null)); + for (var c = 0; c < s.length; c++) { + var l = s[c]; + null == this.metadata[r][a][l] ? this.metadata[r][a][l] = e.metadata[r][a][l] : this.metadata[r][a][l] = this.metadata[r][a][l].concat(e.metadata[r][a][l]) + } + } + } + }, D.MatchData.prototype.add = function(e, t, n) { + if (!(e in this.metadata)) return this.metadata[e] = Object.create(null), void(this.metadata[e][t] = n); + if (t in this.metadata[e]) + for (var r = Object.keys(n), i = 0; i < r.length; i++) { + var o = r[i]; + o in this.metadata[e][t] ? this.metadata[e][t][o] = this.metadata[e][t][o].concat(n[o]) : this.metadata[e][t][o] = n[o] + } else this.metadata[e][t] = n + }, D.Query = function(e) { + this.clauses = [], this.allFields = e + }, D.Query.wildcard = new String("*"), D.Query.wildcard.NONE = 0, D.Query.wildcard.LEADING = 1, D.Query.wildcard.TRAILING = 2, D.Query.presence = { + OPTIONAL: 1, + REQUIRED: 2, + PROHIBITED: 3 + }, D.Query.prototype.clause = function(e) { + return "fields" in e || (e.fields = this.allFields), "boost" in e || (e.boost = 1), "usePipeline" in e || (e.usePipeline = !0), "wildcard" in e || (e.wildcard = D.Query.wildcard.NONE), e.wildcard & D.Query.wildcard.LEADING && e.term.charAt(0) != D.Query.wildcard && (e.term = "*" + e.term), e.wildcard & D.Query.wildcard.TRAILING && e.term.slice(-1) != D.Query.wildcard && (e.term = e.term + "*"), "presence" in e || (e.presence = D.Query.presence.OPTIONAL), this.clauses.push(e), this + }, D.Query.prototype.isNegated = function() { + for (var e = 0; e < this.clauses.length; e++) + if (this.clauses[e].presence != D.Query.presence.PROHIBITED) return !1; + return !0 + }, D.Query.prototype.term = function(e, t) { + if (Array.isArray(e)) return e.forEach(function(e) { + this.term(e, D.utils.clone(t)) + }, this), this; + var n = t || {}; + return n.term = e.toString(), this.clause(n), this + }, D.QueryParseError = function(e, t, n) { + this.name = "QueryParseError", this.message = e, this.start = t, this.end = n + }, D.QueryParseError.prototype = new Error, D.QueryLexer = function(e) { + this.lexemes = [], this.str = e, this.length = e.length, this.pos = 0, this.start = 0, this.escapeCharPositions = [] + }, D.QueryLexer.prototype.run = function() { + for (var e = D.QueryLexer.lexText; e;) e = e(this) + }, D.QueryLexer.prototype.sliceString = function() { + for (var e = [], t = this.start, n = this.pos, r = 0; r < this.escapeCharPositions.length; r++) n = this.escapeCharPositions[r], e.push(this.str.slice(t, n)), t = n + 1; + return e.push(this.str.slice(t, this.pos)), this.escapeCharPositions.length = 0, e.join("") + }, D.QueryLexer.prototype.emit = function(e) { + this.lexemes.push({ + type: e, + str: this.sliceString(), + start: this.start, + end: this.pos + }), this.start = this.pos + }, D.QueryLexer.prototype.escapeCharacter = function() { + this.escapeCharPositions.push(this.pos - 1), this.pos += 1 + }, D.QueryLexer.prototype.next = function() { + if (this.pos >= this.length) return D.QueryLexer.EOS; + var e = this.str.charAt(this.pos); + return this.pos += 1, e + }, D.QueryLexer.prototype.width = function() { + return this.pos - this.start + }, D.QueryLexer.prototype.ignore = function() { + this.start == this.pos && (this.pos += 1), this.start = this.pos + }, D.QueryLexer.prototype.backup = function() { + this.pos -= 1 + }, D.QueryLexer.prototype.acceptDigitRun = function() { + for (var e, t; 47 < (t = (e = this.next()).charCodeAt(0)) && t < 58;); + e != D.QueryLexer.EOS && this.backup() + }, D.QueryLexer.prototype.more = function() { + return this.pos < this.length + }, D.QueryLexer.EOS = "EOS", D.QueryLexer.FIELD = "FIELD", D.QueryLexer.TERM = "TERM", D.QueryLexer.EDIT_DISTANCE = "EDIT_DISTANCE", D.QueryLexer.BOOST = "BOOST", D.QueryLexer.PRESENCE = "PRESENCE", D.QueryLexer.lexField = function(e) { + return e.backup(), e.emit(D.QueryLexer.FIELD), e.ignore(), D.QueryLexer.lexText + }, D.QueryLexer.lexTerm = function(e) { + if (1 < e.width() && (e.backup(), e.emit(D.QueryLexer.TERM)), e.ignore(), e.more()) return D.QueryLexer.lexText + }, D.QueryLexer.lexEditDistance = function(e) { + return e.ignore(), e.acceptDigitRun(), e.emit(D.QueryLexer.EDIT_DISTANCE), D.QueryLexer.lexText + }, D.QueryLexer.lexBoost = function(e) { + return e.ignore(), e.acceptDigitRun(), e.emit(D.QueryLexer.BOOST), D.QueryLexer.lexText + }, D.QueryLexer.lexEOS = function(e) { + 0 < e.width() && e.emit(D.QueryLexer.TERM) + }, D.QueryLexer.termSeparator = D.tokenizer.separator, D.QueryLexer.lexText = function(e) { + for (;;) { + var t = e.next(); + if (t == D.QueryLexer.EOS) return D.QueryLexer.lexEOS; + if (92 != t.charCodeAt(0)) { + if (":" == t) return D.QueryLexer.lexField; + if ("~" == t) return e.backup(), 0 < e.width() && e.emit(D.QueryLexer.TERM), D.QueryLexer.lexEditDistance; + if ("^" == t) return e.backup(), 0 < e.width() && e.emit(D.QueryLexer.TERM), D.QueryLexer.lexBoost; + if ("+" == t && 1 === e.width()) return e.emit(D.QueryLexer.PRESENCE), D.QueryLexer.lexText; + if ("-" == t && 1 === e.width()) return e.emit(D.QueryLexer.PRESENCE), D.QueryLexer.lexText; + if (t.match(D.QueryLexer.termSeparator)) return D.QueryLexer.lexTerm + } else e.escapeCharacter() + } + }, D.QueryParser = function(e, t) { + this.lexer = new D.QueryLexer(e), this.query = t, this.currentClause = {}, this.lexemeIdx = 0 + }, D.QueryParser.prototype.parse = function() { + this.lexer.run(), this.lexemes = this.lexer.lexemes; + for (var e = D.QueryParser.parseClause; e;) e = e(this); + return this.query + }, D.QueryParser.prototype.peekLexeme = function() { + return this.lexemes[this.lexemeIdx] + }, D.QueryParser.prototype.consumeLexeme = function() { + var e = this.peekLexeme(); + return this.lexemeIdx += 1, e + }, D.QueryParser.prototype.nextClause = function() { + var e = this.currentClause; + this.query.clause(e), this.currentClause = {} + }, D.QueryParser.parseClause = function(e) { + var t = e.peekLexeme(); + if (null != t) switch (t.type) { + case D.QueryLexer.PRESENCE: + return D.QueryParser.parsePresence; + case D.QueryLexer.FIELD: + return D.QueryParser.parseField; + case D.QueryLexer.TERM: + return D.QueryParser.parseTerm; + default: + var n = "expected either a field or a term, found " + t.type; + throw 1 <= t.str.length && (n += " with value '" + t.str + "'"), new D.QueryParseError(n, t.start, t.end) + } + }, D.QueryParser.parsePresence = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + switch (t.str) { + case "-": + e.currentClause.presence = D.Query.presence.PROHIBITED; + break; + case "+": + e.currentClause.presence = D.Query.presence.REQUIRED; + break; + default: + var n = "unrecognised presence operator'" + t.str + "'"; + throw new D.QueryParseError(n, t.start, t.end) + } + var r = e.peekLexeme(); + if (null == r) { + n = "expecting term or field, found nothing"; + throw new D.QueryParseError(n, t.start, t.end) + } + switch (r.type) { + case D.QueryLexer.FIELD: + return D.QueryParser.parseField; + case D.QueryLexer.TERM: + return D.QueryParser.parseTerm; + default: + n = "expecting term or field, found '" + r.type + "'"; + throw new D.QueryParseError(n, r.start, r.end) + } + } + }, D.QueryParser.parseField = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + if (-1 == e.query.allFields.indexOf(t.str)) { + var n = e.query.allFields.map(function(e) { + return "'" + e + "'" + }).join(", "), + r = "unrecognised field '" + t.str + "', possible fields: " + n; + throw new D.QueryParseError(r, t.start, t.end) + } + e.currentClause.fields = [t.str]; + var i = e.peekLexeme(); + if (null == i) { + r = "expecting term, found nothing"; + throw new D.QueryParseError(r, t.start, t.end) + } + switch (i.type) { + case D.QueryLexer.TERM: + return D.QueryParser.parseTerm; + default: + r = "expecting term, found '" + i.type + "'"; + throw new D.QueryParseError(r, i.start, i.end) + } + } + }, D.QueryParser.parseTerm = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + e.currentClause.term = t.str.toLowerCase(), -1 != t.str.indexOf("*") && (e.currentClause.usePipeline = !1); + var n = e.peekLexeme(); + if (null != n) switch (n.type) { + case D.QueryLexer.TERM: + return e.nextClause(), D.QueryParser.parseTerm; + case D.QueryLexer.FIELD: + return e.nextClause(), D.QueryParser.parseField; + case D.QueryLexer.EDIT_DISTANCE: + return D.QueryParser.parseEditDistance; + case D.QueryLexer.BOOST: + return D.QueryParser.parseBoost; + case D.QueryLexer.PRESENCE: + return e.nextClause(), D.QueryParser.parsePresence; + default: + var r = "Unexpected lexeme type '" + n.type + "'"; + throw new D.QueryParseError(r, n.start, n.end) + } else e.nextClause() + } + }, D.QueryParser.parseEditDistance = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + var n = parseInt(t.str, 10); + if (isNaN(n)) { + var r = "edit distance must be numeric"; + throw new D.QueryParseError(r, t.start, t.end) + } + e.currentClause.editDistance = n; + var i = e.peekLexeme(); + if (null != i) switch (i.type) { + case D.QueryLexer.TERM: + return e.nextClause(), D.QueryParser.parseTerm; + case D.QueryLexer.FIELD: + return e.nextClause(), D.QueryParser.parseField; + case D.QueryLexer.EDIT_DISTANCE: + return D.QueryParser.parseEditDistance; + case D.QueryLexer.BOOST: + return D.QueryParser.parseBoost; + case D.QueryLexer.PRESENCE: + return e.nextClause(), D.QueryParser.parsePresence; + default: + r = "Unexpected lexeme type '" + i.type + "'"; + throw new D.QueryParseError(r, i.start, i.end) + } else e.nextClause() + } + }, D.QueryParser.parseBoost = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + var n = parseInt(t.str, 10); + if (isNaN(n)) { + var r = "boost must be numeric"; + throw new D.QueryParseError(r, t.start, t.end) + } + e.currentClause.boost = n; + var i = e.peekLexeme(); + if (null != i) switch (i.type) { + case D.QueryLexer.TERM: + return e.nextClause(), D.QueryParser.parseTerm; + case D.QueryLexer.FIELD: + return e.nextClause(), D.QueryParser.parseField; + case D.QueryLexer.EDIT_DISTANCE: + return D.QueryParser.parseEditDistance; + case D.QueryLexer.BOOST: + return D.QueryParser.parseBoost; + case D.QueryLexer.PRESENCE: + return e.nextClause(), D.QueryParser.parsePresence; + default: + r = "Unexpected lexeme type '" + i.type + "'"; + throw new D.QueryParseError(r, i.start, i.end) + } else e.nextClause() + } + }, void 0 === (c = "function" == typeof(s = function() { + return D + }) ? s.call(o, a, o, i) : s) || (i.exports = c) + }() +}])); \ No newline at end of file diff --git a/docs/v1.1.1/_static/javascripts/lunr/lunr.da.js b/docs/v1.1.1/_static/javascripts/lunr/lunr.da.js new file mode 100644 index 0000000000..34910dfe5f --- /dev/null +++ b/docs/v1.1.1/_static/javascripts/lunr/lunr.da.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,m,i;e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWordFilter,e.da.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.da.stemmer))},e.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.da.trimmer=e.trimmerSupport.generateTrimmer(e.da.wordCharacters),e.Pipeline.registerFunction(e.da.trimmer,"trimmer-da"),e.da.stemmer=(r=e.stemmerSupport.Among,m=e.stemmerSupport.SnowballProgram,i=new function(){var i,t,n,s=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],o=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],a=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],u=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],c=new m;function l(){var e,r=c.limit-c.cursor;c.cursor>=t&&(e=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,c.find_among_b(o,4)?(c.bra=c.cursor,c.limit_backward=e,c.cursor=c.limit-r,c.cursor>c.limit_backward&&(c.cursor--,c.bra=c.cursor,c.slice_del())):c.limit_backward=e)}this.setCurrent=function(e){c.setCurrent(e)},this.getCurrent=function(){return c.getCurrent()},this.stem=function(){var e,r=c.cursor;return function(){var e,r=c.cursor+3;if(t=c.limit,0<=r&&r<=c.limit){for(i=r;;){if(e=c.cursor,c.in_grouping(d,97,248)){c.cursor=e;break}if((c.cursor=e)>=c.limit)return;c.cursor++}for(;!c.out_grouping(d,97,248);){if(c.cursor>=c.limit)return;c.cursor++}(t=c.cursor)=t&&(r=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,e=c.find_among_b(s,32),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:c.in_grouping_b(u,97,229)&&c.slice_del()}}(),c.cursor=c.limit,l(),c.cursor=c.limit,function(){var e,r,i,n=c.limit-c.cursor;if(c.ket=c.cursor,c.eq_s_b(2,"st")&&(c.bra=c.cursor,c.eq_s_b(2,"ig")&&c.slice_del()),c.cursor=c.limit-n,c.cursor>=t&&(r=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,e=c.find_among_b(a,5),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del(),i=c.limit-c.cursor,l(),c.cursor=c.limit-i;break;case 2:c.slice_from("løs")}}(),c.cursor=c.limit,c.cursor>=t&&(e=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,c.out_grouping_b(d,97,248)?(c.bra=c.cursor,n=c.slice_to(n),c.limit_backward=e,c.eq_v_b(n)&&c.slice_del()):c.limit_backward=e),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}}); \ No newline at end of file diff --git a/docs/v1.1.1/_static/javascripts/lunr/lunr.de.js b/docs/v1.1.1/_static/javascripts/lunr/lunr.de.js new file mode 100644 index 0000000000..1529892c82 --- /dev/null +++ b/docs/v1.1.1/_static/javascripts/lunr/lunr.de.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var _,p,r;e.de=function(){this.pipeline.reset(),this.pipeline.add(e.de.trimmer,e.de.stopWordFilter,e.de.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.de.stemmer))},e.de.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.de.trimmer=e.trimmerSupport.generateTrimmer(e.de.wordCharacters),e.Pipeline.registerFunction(e.de.trimmer,"trimmer-de"),e.de.stemmer=(_=e.stemmerSupport.Among,p=e.stemmerSupport.SnowballProgram,r=new function(){var r,n,i,s=[new _("",-1,6),new _("U",0,2),new _("Y",0,1),new _("ä",0,3),new _("ö",0,4),new _("ü",0,5)],o=[new _("e",-1,2),new _("em",-1,1),new _("en",-1,2),new _("ern",-1,1),new _("er",-1,1),new _("s",-1,3),new _("es",5,2)],c=[new _("en",-1,1),new _("er",-1,1),new _("st",-1,2),new _("est",2,1)],u=[new _("ig",-1,1),new _("lich",-1,1)],a=[new _("end",-1,1),new _("ig",-1,2),new _("ung",-1,1),new _("lich",-1,3),new _("isch",-1,2),new _("ik",-1,2),new _("heit",-1,3),new _("keit",-1,4)],t=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32,8],d=[117,30,5],l=[117,30,4],m=new p;function h(e,r,n){return!(!m.eq_s(1,e)||(m.ket=m.cursor,!m.in_grouping(t,97,252)))&&(m.slice_from(r),m.cursor=n,!0)}function w(){for(;!m.in_grouping(t,97,252);){if(m.cursor>=m.limit)return!0;m.cursor++}for(;!m.out_grouping(t,97,252);){if(m.cursor>=m.limit)return!0;m.cursor++}return!1}function f(){return i<=m.cursor}function b(){return n<=m.cursor}this.setCurrent=function(e){m.setCurrent(e)},this.getCurrent=function(){return m.getCurrent()},this.stem=function(){var e=m.cursor;return function(){for(var e,r,n,i,s=m.cursor;;)if(e=m.cursor,m.bra=e,m.eq_s(1,"ß"))m.ket=m.cursor,m.slice_from("ss");else{if(e>=m.limit)break;m.cursor=e+1}for(m.cursor=s;;)for(r=m.cursor;;){if(n=m.cursor,m.in_grouping(t,97,252)){if(i=m.cursor,m.bra=i,h("u","U",n))break;if(m.cursor=i,h("y","Y",n))break}if(n>=m.limit)return m.cursor=r;m.cursor=n+1}}(),m.cursor=e,function(){i=m.limit,n=i;var e=m.cursor+3;0<=e&&e<=m.limit&&(r=e,w()||((i=m.cursor)=m.limit)return;m.cursor++}}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.de.stemmer,"stemmer-de"),e.de.stopWordFilter=e.generateStopWordFilter("aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daß dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures für gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines können könnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte während würde würden zu zum zur zwar zwischen über".split(" ")),e.Pipeline.registerFunction(e.de.stopWordFilter,"stopWordFilter-de")}}); \ No newline at end of file diff --git a/docs/v1.1.1/_static/javascripts/lunr/lunr.du.js b/docs/v1.1.1/_static/javascripts/lunr/lunr.du.js new file mode 100644 index 0000000000..52632004a2 --- /dev/null +++ b/docs/v1.1.1/_static/javascripts/lunr/lunr.du.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var v,q,r;console.warn('[Lunr Languages] Please use the "nl" instead of the "du". The "nl" code is the standard code for Dutch language, and "du" will be removed in the next major versions.'),e.du=function(){this.pipeline.reset(),this.pipeline.add(e.du.trimmer,e.du.stopWordFilter,e.du.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.du.stemmer))},e.du.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.du.trimmer=e.trimmerSupport.generateTrimmer(e.du.wordCharacters),e.Pipeline.registerFunction(e.du.trimmer,"trimmer-du"),e.du.stemmer=(v=e.stemmerSupport.Among,q=e.stemmerSupport.SnowballProgram,r=new function(){var r,i,u,o=[new v("",-1,6),new v("á",0,1),new v("ä",0,1),new v("é",0,2),new v("ë",0,2),new v("í",0,3),new v("ï",0,3),new v("ó",0,4),new v("ö",0,4),new v("ú",0,5),new v("ü",0,5)],n=[new v("",-1,3),new v("I",0,2),new v("Y",0,1)],t=[new v("dd",-1,-1),new v("kk",-1,-1),new v("tt",-1,-1)],c=[new v("ene",-1,2),new v("se",-1,3),new v("en",-1,2),new v("heden",2,1),new v("s",-1,3)],a=[new v("end",-1,1),new v("ig",-1,2),new v("ing",-1,1),new v("lijk",-1,3),new v("baar",-1,4),new v("bar",-1,5)],l=[new v("aa",-1,-1),new v("ee",-1,-1),new v("oo",-1,-1),new v("uu",-1,-1)],m=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],d=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],f=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],_=new q;function s(e){return(_.cursor=e)>=_.limit||(_.cursor++,!1)}function w(){for(;!_.in_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}for(;!_.out_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}function b(){return i<=_.cursor}function p(){return r<=_.cursor}function g(){var e=_.limit-_.cursor;_.find_among_b(t,3)&&(_.cursor=_.limit-e,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del()))}function h(){var e;u=!1,_.ket=_.cursor,_.eq_s_b(1,"e")&&(_.bra=_.cursor,b()&&(e=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-e,_.slice_del(),u=!0,g())))}function k(){var e;b()&&(e=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-e,_.eq_s_b(3,"gem")||(_.cursor=_.limit-e,_.slice_del(),g())))}this.setCurrent=function(e){_.setCurrent(e)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var e=_.cursor;return function(){for(var e,r,i,n=_.cursor;;){if(_.bra=_.cursor,e=_.find_among(o,11))switch(_.ket=_.cursor,e){case 1:_.slice_from("a");continue;case 2:_.slice_from("e");continue;case 3:_.slice_from("i");continue;case 4:_.slice_from("o");continue;case 5:_.slice_from("u");continue;case 6:if(_.cursor>=_.limit)break;_.cursor++;continue}break}for(_.cursor=n,_.bra=n,_.eq_s(1,"y")?(_.ket=_.cursor,_.slice_from("Y")):_.cursor=n;;)if(r=_.cursor,_.in_grouping(m,97,232)){if(i=_.cursor,_.bra=i,_.eq_s(1,"i"))_.ket=_.cursor,_.in_grouping(m,97,232)&&(_.slice_from("I"),_.cursor=r);else if(_.cursor=i,_.eq_s(1,"y"))_.ket=_.cursor,_.slice_from("Y"),_.cursor=r;else if(s(r))break}else if(s(r))break}(),_.cursor=e,i=_.limit,r=i,w()||((i=_.cursor)<3&&(i=3),w()||(r=_.cursor)),_.limit_backward=e,_.cursor=_.limit,function(){var e,r,i,n,o,t,s=_.limit-_.cursor;if(_.ket=_.cursor,e=_.find_among_b(c,5))switch(_.bra=_.cursor,e){case 1:b()&&_.slice_from("heid");break;case 2:k();break;case 3:b()&&_.out_grouping_b(f,97,232)&&_.slice_del()}if(_.cursor=_.limit-s,h(),_.cursor=_.limit-s,_.ket=_.cursor,_.eq_s_b(4,"heid")&&(_.bra=_.cursor,p()&&(r=_.limit-_.cursor,_.eq_s_b(1,"c")||(_.cursor=_.limit-r,_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"en")&&(_.bra=_.cursor,k())))),_.cursor=_.limit-s,_.ket=_.cursor,e=_.find_among_b(a,6))switch(_.bra=_.cursor,e){case 1:if(p()){if(_.slice_del(),i=_.limit-_.cursor,_.ket=_.cursor,_.eq_s_b(2,"ig")&&(_.bra=_.cursor,p()&&(n=_.limit-_.cursor,!_.eq_s_b(1,"e")))){_.cursor=_.limit-n,_.slice_del();break}_.cursor=_.limit-i,g()}break;case 2:p()&&(o=_.limit-_.cursor,_.eq_s_b(1,"e")||(_.cursor=_.limit-o,_.slice_del()));break;case 3:p()&&(_.slice_del(),h());break;case 4:p()&&_.slice_del();break;case 5:p()&&u&&_.slice_del()}_.cursor=_.limit-s,_.out_grouping_b(d,73,232)&&(t=_.limit-_.cursor,_.find_among_b(l,4)&&_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-t,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del())))}(),_.cursor=_.limit_backward,function(){for(var e;;)if(_.bra=_.cursor,e=_.find_among(n,3))switch(_.ket=_.cursor,e){case 1:_.slice_from("y");break;case 2:_.slice_from("i");break;case 3:if(_.cursor>=_.limit)return;_.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.du.stemmer,"stemmer-du"),e.du.stopWordFilter=e.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),e.Pipeline.registerFunction(e.du.stopWordFilter,"stopWordFilter-du")}}); \ No newline at end of file diff --git a/docs/v1.1.1/_static/javascripts/lunr/lunr.es.js b/docs/v1.1.1/_static/javascripts/lunr/lunr.es.js new file mode 100644 index 0000000000..9de6c09cb4 --- /dev/null +++ b/docs/v1.1.1/_static/javascripts/lunr/lunr.es.js @@ -0,0 +1 @@ +!function(e,s){"function"==typeof define&&define.amd?define(s):"object"==typeof exports?module.exports=s():s()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var C,P,s;e.es=function(){this.pipeline.reset(),this.pipeline.add(e.es.trimmer,e.es.stopWordFilter,e.es.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.es.stemmer))},e.es.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.es.trimmer=e.trimmerSupport.generateTrimmer(e.es.wordCharacters),e.Pipeline.registerFunction(e.es.trimmer,"trimmer-es"),e.es.stemmer=(C=e.stemmerSupport.Among,P=e.stemmerSupport.SnowballProgram,s=new function(){var r,n,i,a=[new C("",-1,6),new C("á",0,1),new C("é",0,2),new C("í",0,3),new C("ó",0,4),new C("ú",0,5)],t=[new C("la",-1,-1),new C("sela",0,-1),new C("le",-1,-1),new C("me",-1,-1),new C("se",-1,-1),new C("lo",-1,-1),new C("selo",5,-1),new C("las",-1,-1),new C("selas",7,-1),new C("les",-1,-1),new C("los",-1,-1),new C("selos",10,-1),new C("nos",-1,-1)],o=[new C("ando",-1,6),new C("iendo",-1,6),new C("yendo",-1,7),new C("ándo",-1,2),new C("iéndo",-1,1),new C("ar",-1,6),new C("er",-1,6),new C("ir",-1,6),new C("ár",-1,3),new C("ér",-1,4),new C("ír",-1,5)],s=[new C("ic",-1,-1),new C("ad",-1,-1),new C("os",-1,-1),new C("iv",-1,1)],u=[new C("able",-1,1),new C("ible",-1,1),new C("ante",-1,1)],w=[new C("ic",-1,1),new C("abil",-1,1),new C("iv",-1,1)],c=[new C("ica",-1,1),new C("ancia",-1,2),new C("encia",-1,5),new C("adora",-1,2),new C("osa",-1,1),new C("ista",-1,1),new C("iva",-1,9),new C("anza",-1,1),new C("logía",-1,3),new C("idad",-1,8),new C("able",-1,1),new C("ible",-1,1),new C("ante",-1,2),new C("mente",-1,7),new C("amente",13,6),new C("ación",-1,2),new C("ución",-1,4),new C("ico",-1,1),new C("ismo",-1,1),new C("oso",-1,1),new C("amiento",-1,1),new C("imiento",-1,1),new C("ivo",-1,9),new C("ador",-1,2),new C("icas",-1,1),new C("ancias",-1,2),new C("encias",-1,5),new C("adoras",-1,2),new C("osas",-1,1),new C("istas",-1,1),new C("ivas",-1,9),new C("anzas",-1,1),new C("logías",-1,3),new C("idades",-1,8),new C("ables",-1,1),new C("ibles",-1,1),new C("aciones",-1,2),new C("uciones",-1,4),new C("adores",-1,2),new C("antes",-1,2),new C("icos",-1,1),new C("ismos",-1,1),new C("osos",-1,1),new C("amientos",-1,1),new C("imientos",-1,1),new C("ivos",-1,9)],m=[new C("ya",-1,1),new C("ye",-1,1),new C("yan",-1,1),new C("yen",-1,1),new C("yeron",-1,1),new C("yendo",-1,1),new C("yo",-1,1),new C("yas",-1,1),new C("yes",-1,1),new C("yais",-1,1),new C("yamos",-1,1),new C("yó",-1,1)],l=[new C("aba",-1,2),new C("ada",-1,2),new C("ida",-1,2),new C("ara",-1,2),new C("iera",-1,2),new C("ía",-1,2),new C("aría",5,2),new C("ería",5,2),new C("iría",5,2),new C("ad",-1,2),new C("ed",-1,2),new C("id",-1,2),new C("ase",-1,2),new C("iese",-1,2),new C("aste",-1,2),new C("iste",-1,2),new C("an",-1,2),new C("aban",16,2),new C("aran",16,2),new C("ieran",16,2),new C("ían",16,2),new C("arían",20,2),new C("erían",20,2),new C("irían",20,2),new C("en",-1,1),new C("asen",24,2),new C("iesen",24,2),new C("aron",-1,2),new C("ieron",-1,2),new C("arán",-1,2),new C("erán",-1,2),new C("irán",-1,2),new C("ado",-1,2),new C("ido",-1,2),new C("ando",-1,2),new C("iendo",-1,2),new C("ar",-1,2),new C("er",-1,2),new C("ir",-1,2),new C("as",-1,2),new C("abas",39,2),new C("adas",39,2),new C("idas",39,2),new C("aras",39,2),new C("ieras",39,2),new C("ías",39,2),new C("arías",45,2),new C("erías",45,2),new C("irías",45,2),new C("es",-1,1),new C("ases",49,2),new C("ieses",49,2),new C("abais",-1,2),new C("arais",-1,2),new C("ierais",-1,2),new C("íais",-1,2),new C("aríais",55,2),new C("eríais",55,2),new C("iríais",55,2),new C("aseis",-1,2),new C("ieseis",-1,2),new C("asteis",-1,2),new C("isteis",-1,2),new C("áis",-1,2),new C("éis",-1,1),new C("aréis",64,2),new C("eréis",64,2),new C("iréis",64,2),new C("ados",-1,2),new C("idos",-1,2),new C("amos",-1,2),new C("ábamos",70,2),new C("áramos",70,2),new C("iéramos",70,2),new C("íamos",70,2),new C("aríamos",74,2),new C("eríamos",74,2),new C("iríamos",74,2),new C("emos",-1,1),new C("aremos",78,2),new C("eremos",78,2),new C("iremos",78,2),new C("ásemos",78,2),new C("iésemos",78,2),new C("imos",-1,2),new C("arás",-1,2),new C("erás",-1,2),new C("irás",-1,2),new C("ís",-1,2),new C("ará",-1,2),new C("erá",-1,2),new C("irá",-1,2),new C("aré",-1,2),new C("eré",-1,2),new C("iré",-1,2),new C("ió",-1,2)],d=[new C("a",-1,1),new C("e",-1,2),new C("o",-1,1),new C("os",-1,1),new C("á",-1,1),new C("é",-1,2),new C("í",-1,1),new C("ó",-1,1)],b=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,4,10],f=new P;function _(){if(f.out_grouping(b,97,252)){for(;!f.in_grouping(b,97,252);){if(f.cursor>=f.limit)return!0;f.cursor++}return!1}return!0}function h(){var e,s=f.cursor;if(function(){if(f.in_grouping(b,97,252)){var e=f.cursor;if(_()){if(f.cursor=e,!f.in_grouping(b,97,252))return!0;for(;!f.out_grouping(b,97,252);){if(f.cursor>=f.limit)return!0;f.cursor++}}return!1}return!0}()){if(f.cursor=s,!f.out_grouping(b,97,252))return;if(e=f.cursor,_()){if(f.cursor=e,!f.in_grouping(b,97,252)||f.cursor>=f.limit)return;f.cursor++}}i=f.cursor}function v(){for(;!f.in_grouping(b,97,252);){if(f.cursor>=f.limit)return!1;f.cursor++}for(;!f.out_grouping(b,97,252);){if(f.cursor>=f.limit)return!1;f.cursor++}return!0}function p(){return i<=f.cursor}function g(){return r<=f.cursor}function k(e,s){if(!g())return!0;f.slice_del(),f.ket=f.cursor;var r=f.find_among_b(e,s);return r&&(f.bra=f.cursor,1==r&&g()&&f.slice_del()),!1}function y(e){return!g()||(f.slice_del(),f.ket=f.cursor,f.eq_s_b(2,e)&&(f.bra=f.cursor,g()&&f.slice_del()),!1)}function q(){var e;if(f.ket=f.cursor,e=f.find_among_b(c,46)){switch(f.bra=f.cursor,e){case 1:if(!g())return!1;f.slice_del();break;case 2:if(y("ic"))return!1;break;case 3:if(!g())return!1;f.slice_from("log");break;case 4:if(!g())return!1;f.slice_from("u");break;case 5:if(!g())return!1;f.slice_from("ente");break;case 6:if(!(n<=f.cursor))return!1;f.slice_del(),f.ket=f.cursor,(e=f.find_among_b(s,4))&&(f.bra=f.cursor,g()&&(f.slice_del(),1==e&&(f.ket=f.cursor,f.eq_s_b(2,"at")&&(f.bra=f.cursor,g()&&f.slice_del()))));break;case 7:if(k(u,3))return!1;break;case 8:if(k(w,3))return!1;break;case 9:if(y("at"))return!1}return!0}return!1}this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var e,s=f.cursor;return e=f.cursor,i=f.limit,r=n=i,h(),f.cursor=e,v()&&(n=f.cursor,v()&&(r=f.cursor)),f.limit_backward=s,f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,f.find_among_b(t,13)&&(f.bra=f.cursor,(e=f.find_among_b(o,11))&&p()))switch(e){case 1:f.bra=f.cursor,f.slice_from("iendo");break;case 2:f.bra=f.cursor,f.slice_from("ando");break;case 3:f.bra=f.cursor,f.slice_from("ar");break;case 4:f.bra=f.cursor,f.slice_from("er");break;case 5:f.bra=f.cursor,f.slice_from("ir");break;case 6:f.slice_del();break;case 7:f.eq_s_b(1,"u")&&f.slice_del()}}(),f.cursor=f.limit,q()||(f.cursor=f.limit,function(){var e,s;if(f.cursor>=i&&(s=f.limit_backward,f.limit_backward=i,f.ket=f.cursor,e=f.find_among_b(m,12),f.limit_backward=s,e)){if(f.bra=f.cursor,1==e){if(!f.eq_s_b(1,"u"))return!1;f.slice_del()}return!0}return!1}()||(f.cursor=f.limit,function(){var e,s,r,n;if(f.cursor>=i&&(s=f.limit_backward,f.limit_backward=i,f.ket=f.cursor,e=f.find_among_b(l,96),f.limit_backward=s,e))switch(f.bra=f.cursor,e){case 1:r=f.limit-f.cursor,f.eq_s_b(1,"u")?(n=f.limit-f.cursor,f.eq_s_b(1,"g")?f.cursor=f.limit-n:f.cursor=f.limit-r):f.cursor=f.limit-r,f.bra=f.cursor;case 2:f.slice_del()}}())),f.cursor=f.limit,function(){var e,s;if(f.ket=f.cursor,e=f.find_among_b(d,8))switch(f.bra=f.cursor,e){case 1:p()&&f.slice_del();break;case 2:p()&&(f.slice_del(),f.ket=f.cursor,f.eq_s_b(1,"u")&&(f.bra=f.cursor,s=f.limit-f.cursor,f.eq_s_b(1,"g")&&(f.cursor=f.limit-s,p()&&f.slice_del())))}}(),f.cursor=f.limit_backward,function(){for(var e;;){if(f.bra=f.cursor,e=f.find_among(a,6))switch(f.ket=f.cursor,e){case 1:f.slice_from("a");continue;case 2:f.slice_from("e");continue;case 3:f.slice_from("i");continue;case 4:f.slice_from("o");continue;case 5:f.slice_from("u");continue;case 6:if(f.cursor>=f.limit)break;f.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return s.setCurrent(e),s.stem(),s.getCurrent()}):(s.setCurrent(e),s.stem(),s.getCurrent())}),e.Pipeline.registerFunction(e.es.stemmer,"stemmer-es"),e.es.stopWordFilter=e.generateStopWordFilter("a al algo algunas algunos ante antes como con contra cual cuando de del desde donde durante e el ella ellas ellos en entre era erais eran eras eres es esa esas ese eso esos esta estaba estabais estaban estabas estad estada estadas estado estados estamos estando estar estaremos estará estarán estarás estaré estaréis estaría estaríais estaríamos estarían estarías estas este estemos esto estos estoy estuve estuviera estuvierais estuvieran estuvieras estuvieron estuviese estuvieseis estuviesen estuvieses estuvimos estuviste estuvisteis estuviéramos estuviésemos estuvo está estábamos estáis están estás esté estéis estén estés fue fuera fuerais fueran fueras fueron fuese fueseis fuesen fueses fui fuimos fuiste fuisteis fuéramos fuésemos ha habida habidas habido habidos habiendo habremos habrá habrán habrás habré habréis habría habríais habríamos habrían habrías habéis había habíais habíamos habían habías han has hasta hay haya hayamos hayan hayas hayáis he hemos hube hubiera hubierais hubieran hubieras hubieron hubiese hubieseis hubiesen hubieses hubimos hubiste hubisteis hubiéramos hubiésemos hubo la las le les lo los me mi mis mucho muchos muy más mí mía mías mío míos nada ni no nos nosotras nosotros nuestra nuestras nuestro nuestros o os otra otras otro otros para pero poco por porque que quien quienes qué se sea seamos sean seas seremos será serán serás seré seréis sería seríais seríamos serían serías seáis sido siendo sin sobre sois somos son soy su sus suya suyas suyo suyos sí también tanto te tendremos tendrá tendrán tendrás tendré tendréis tendría tendríais tendríamos tendrían tendrías tened tenemos tenga tengamos tengan tengas tengo tengáis tenida tenidas tenido tenidos teniendo tenéis tenía teníais teníamos tenían tenías ti tiene tienen tienes todo todos tu tus tuve tuviera tuvierais tuvieran tuvieras tuvieron tuviese tuvieseis tuviesen tuvieses tuvimos tuviste tuvisteis tuviéramos tuviésemos tuvo tuya tuyas tuyo tuyos tú un una uno unos vosotras vosotros vuestra vuestras vuestro vuestros y ya yo él éramos".split(" ")),e.Pipeline.registerFunction(e.es.stopWordFilter,"stopWordFilter-es")}}); \ No newline at end of file diff --git a/docs/v1.1.1/_static/javascripts/lunr/lunr.fi.js b/docs/v1.1.1/_static/javascripts/lunr/lunr.fi.js new file mode 100644 index 0000000000..2f9bf5aebd --- /dev/null +++ b/docs/v1.1.1/_static/javascripts/lunr/lunr.fi.js @@ -0,0 +1 @@ +!function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===i.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var v,C,e;i.fi=function(){this.pipeline.reset(),this.pipeline.add(i.fi.trimmer,i.fi.stopWordFilter,i.fi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(i.fi.stemmer))},i.fi.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",i.fi.trimmer=i.trimmerSupport.generateTrimmer(i.fi.wordCharacters),i.Pipeline.registerFunction(i.fi.trimmer,"trimmer-fi"),i.fi.stemmer=(v=i.stemmerSupport.Among,C=i.stemmerSupport.SnowballProgram,e=new function(){var n,t,l,o,r=[new v("pa",-1,1),new v("sti",-1,2),new v("kaan",-1,1),new v("han",-1,1),new v("kin",-1,1),new v("hän",-1,1),new v("kään",-1,1),new v("ko",-1,1),new v("pä",-1,1),new v("kö",-1,1)],s=[new v("lla",-1,-1),new v("na",-1,-1),new v("ssa",-1,-1),new v("ta",-1,-1),new v("lta",3,-1),new v("sta",3,-1)],a=[new v("llä",-1,-1),new v("nä",-1,-1),new v("ssä",-1,-1),new v("tä",-1,-1),new v("ltä",3,-1),new v("stä",3,-1)],u=[new v("lle",-1,-1),new v("ine",-1,-1)],c=[new v("nsa",-1,3),new v("mme",-1,3),new v("nne",-1,3),new v("ni",-1,2),new v("si",-1,1),new v("an",-1,4),new v("en",-1,6),new v("än",-1,5),new v("nsä",-1,3)],i=[new v("aa",-1,-1),new v("ee",-1,-1),new v("ii",-1,-1),new v("oo",-1,-1),new v("uu",-1,-1),new v("ää",-1,-1),new v("öö",-1,-1)],m=[new v("a",-1,8),new v("lla",0,-1),new v("na",0,-1),new v("ssa",0,-1),new v("ta",0,-1),new v("lta",4,-1),new v("sta",4,-1),new v("tta",4,9),new v("lle",-1,-1),new v("ine",-1,-1),new v("ksi",-1,-1),new v("n",-1,7),new v("han",11,1),new v("den",11,-1,q),new v("seen",11,-1,j),new v("hen",11,2),new v("tten",11,-1,q),new v("hin",11,3),new v("siin",11,-1,q),new v("hon",11,4),new v("hän",11,5),new v("hön",11,6),new v("ä",-1,8),new v("llä",22,-1),new v("nä",22,-1),new v("ssä",22,-1),new v("tä",22,-1),new v("ltä",26,-1),new v("stä",26,-1),new v("ttä",26,9)],w=[new v("eja",-1,-1),new v("mma",-1,1),new v("imma",1,-1),new v("mpa",-1,1),new v("impa",3,-1),new v("mmi",-1,1),new v("immi",5,-1),new v("mpi",-1,1),new v("impi",7,-1),new v("ejä",-1,-1),new v("mmä",-1,1),new v("immä",10,-1),new v("mpä",-1,1),new v("impä",12,-1)],_=[new v("i",-1,-1),new v("j",-1,-1)],k=[new v("mma",-1,1),new v("imma",0,-1)],b=[17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],e=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],f=[17,97,24,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],h=new C;function p(){for(var i;i=h.cursor,!h.in_grouping(d,97,246);){if((h.cursor=i)>=h.limit)return!0;h.cursor++}for(h.cursor=i;!h.out_grouping(d,97,246);){if(h.cursor>=h.limit)return!0;h.cursor++}return!1}function g(){var i,e;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(r,10)){switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:if(!h.in_grouping_b(f,97,246))return;break;case 2:if(!(l<=h.cursor))return}h.slice_del()}else h.limit_backward=e}function j(){return h.find_among_b(i,7)}function q(){return h.eq_s_b(1,"i")&&h.in_grouping_b(e,97,246)}this.setCurrent=function(i){h.setCurrent(i)},this.getCurrent=function(){return h.getCurrent()},this.stem=function(){var i,e=h.cursor;return o=h.limit,l=o,p()||(o=h.cursor,p()||(l=h.cursor)),n=!1,h.limit_backward=e,h.cursor=h.limit,g(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(c,9))switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:r=h.limit-h.cursor,h.eq_s_b(1,"k")||(h.cursor=h.limit-r,h.slice_del());break;case 2:h.slice_del(),h.ket=h.cursor,h.eq_s_b(3,"kse")&&(h.bra=h.cursor,h.slice_from("ksi"));break;case 3:h.slice_del();break;case 4:h.find_among_b(s,6)&&h.slice_del();break;case 5:h.find_among_b(a,6)&&h.slice_del();break;case 6:h.find_among_b(u,2)&&h.slice_del()}else h.limit_backward=e}(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(m,30)){switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:if(!h.eq_s_b(1,"a"))return;break;case 2:case 9:if(!h.eq_s_b(1,"e"))return;break;case 3:if(!h.eq_s_b(1,"i"))return;break;case 4:if(!h.eq_s_b(1,"o"))return;break;case 5:if(!h.eq_s_b(1,"ä"))return;break;case 6:if(!h.eq_s_b(1,"ö"))return;break;case 7:if(r=h.limit-h.cursor,!j()&&(h.cursor=h.limit-r,!h.eq_s_b(2,"ie"))){h.cursor=h.limit-r;break}if(h.cursor=h.limit-r,h.cursor<=h.limit_backward){h.cursor=h.limit-r;break}h.cursor--,h.bra=h.cursor;break;case 8:if(!h.in_grouping_b(d,97,246)||!h.out_grouping_b(d,97,246))return}h.slice_del(),n=!0}else h.limit_backward=e}(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=l)if(e=h.limit_backward,h.limit_backward=l,h.ket=h.cursor,i=h.find_among_b(w,14)){if(h.bra=h.cursor,h.limit_backward=e,1==i){if(r=h.limit-h.cursor,h.eq_s_b(2,"po"))return;h.cursor=h.limit-r}h.slice_del()}else h.limit_backward=e}(),h.cursor=h.limit,h.cursor=(n?h.cursor>=o&&(i=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,h.find_among_b(_,2)?(h.bra=h.cursor,h.limit_backward=i,h.slice_del()):h.limit_backward=i):(h.cursor=h.limit,function(){var i,e,r,n,t,s;if(h.cursor>=o){if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,h.eq_s_b(1,"t")&&(h.bra=h.cursor,r=h.limit-h.cursor,h.in_grouping_b(d,97,246)&&(h.cursor=h.limit-r,h.slice_del(),h.limit_backward=e,n=h.limit-h.cursor,h.cursor>=l&&(h.cursor=l,t=h.limit_backward,h.limit_backward=h.cursor,h.cursor=h.limit-n,h.ket=h.cursor,i=h.find_among_b(k,2))))){if(h.bra=h.cursor,h.limit_backward=t,1==i){if(s=h.limit-h.cursor,h.eq_s_b(2,"po"))return;h.cursor=h.limit-s}return h.slice_del()}h.limit_backward=e}}()),h.limit),function(){var i,e,r,n;if(h.cursor>=o){for(i=h.limit_backward,h.limit_backward=o,e=h.limit-h.cursor,j()&&(h.cursor=h.limit-e,h.ket=h.cursor,h.cursor>h.limit_backward&&(h.cursor--,h.bra=h.cursor,h.slice_del())),h.cursor=h.limit-e,h.ket=h.cursor,h.in_grouping_b(b,97,228)&&(h.bra=h.cursor,h.out_grouping_b(d,97,246)&&h.slice_del()),h.cursor=h.limit-e,h.ket=h.cursor,h.eq_s_b(1,"j")&&(h.bra=h.cursor,r=h.limit-h.cursor,h.eq_s_b(1,"o")?h.slice_del():(h.cursor=h.limit-r,h.eq_s_b(1,"u")&&h.slice_del())),h.cursor=h.limit-e,h.ket=h.cursor,h.eq_s_b(1,"o")&&(h.bra=h.cursor,h.eq_s_b(1,"j")&&h.slice_del()),h.cursor=h.limit-e,h.limit_backward=i;;){if(n=h.limit-h.cursor,h.out_grouping_b(d,97,246)){h.cursor=h.limit-n;break}if(h.cursor=h.limit-n,h.cursor<=h.limit_backward)return;h.cursor--}h.ket=h.cursor,h.cursor>h.limit_backward&&(h.cursor--,h.bra=h.cursor,t=h.slice_to(),h.eq_v_b(t)&&h.slice_del())}}(),!0}},function(i){return"function"==typeof i.update?i.update(function(i){return e.setCurrent(i),e.stem(),e.getCurrent()}):(e.setCurrent(i),e.stem(),e.getCurrent())}),i.Pipeline.registerFunction(i.fi.stemmer,"stemmer-fi"),i.fi.stopWordFilter=i.generateStopWordFilter("ei eivät emme en et ette että he heidän heidät heihin heille heillä heiltä heissä heistä heitä hän häneen hänelle hänellä häneltä hänen hänessä hänestä hänet häntä itse ja johon joiden joihin joiksi joilla joille joilta joina joissa joista joita joka joksi jolla jolle jolta jona jonka jos jossa josta jota jotka kanssa keiden keihin keiksi keille keillä keiltä keinä keissä keistä keitä keneen keneksi kenelle kenellä keneltä kenen kenenä kenessä kenestä kenet ketkä ketkä ketä koska kuin kuka kun me meidän meidät meihin meille meillä meiltä meissä meistä meitä mihin miksi mikä mille millä miltä minkä minkä minua minulla minulle minulta minun minussa minusta minut minuun minä minä missä mistä mitkä mitä mukaan mutta ne niiden niihin niiksi niille niillä niiltä niin niin niinä niissä niistä niitä noiden noihin noiksi noilla noille noilta noin noina noissa noista noita nuo nyt näiden näihin näiksi näille näillä näiltä näinä näissä näistä näitä nämä ole olemme olen olet olette oli olimme olin olisi olisimme olisin olisit olisitte olisivat olit olitte olivat olla olleet ollut on ovat poikki se sekä sen siihen siinä siitä siksi sille sillä sillä siltä sinua sinulla sinulle sinulta sinun sinussa sinusta sinut sinuun sinä sinä sitä tai te teidän teidät teihin teille teillä teiltä teissä teistä teitä tuo tuohon tuoksi tuolla tuolle tuolta tuon tuona tuossa tuosta tuota tähän täksi tälle tällä tältä tämä tämän tänä tässä tästä tätä vaan vai vaikka yli".split(" ")),i.Pipeline.registerFunction(i.fi.stopWordFilter,"stopWordFilter-fi")}}); \ No newline at end of file diff --git a/docs/v1.1.1/_static/javascripts/lunr/lunr.fr.js b/docs/v1.1.1/_static/javascripts/lunr/lunr.fr.js new file mode 100644 index 0000000000..078d0cab70 --- /dev/null +++ b/docs/v1.1.1/_static/javascripts/lunr/lunr.fr.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,y,s;e.fr=function(){this.pipeline.reset(),this.pipeline.add(e.fr.trimmer,e.fr.stopWordFilter,e.fr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.fr.stemmer))},e.fr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.fr.trimmer=e.trimmerSupport.generateTrimmer(e.fr.wordCharacters),e.Pipeline.registerFunction(e.fr.trimmer,"trimmer-fr"),e.fr.stemmer=(r=e.stemmerSupport.Among,y=e.stemmerSupport.SnowballProgram,s=new function(){var s,i,t,n=[new r("col",-1,-1),new r("par",-1,-1),new r("tap",-1,-1)],u=[new r("",-1,4),new r("I",0,1),new r("U",0,2),new r("Y",0,3)],o=[new r("iqU",-1,3),new r("abl",-1,3),new r("Ièr",-1,4),new r("ièr",-1,4),new r("eus",-1,2),new r("iv",-1,1)],c=[new r("ic",-1,2),new r("abil",-1,1),new r("iv",-1,3)],a=[new r("iqUe",-1,1),new r("atrice",-1,2),new r("ance",-1,1),new r("ence",-1,5),new r("logie",-1,3),new r("able",-1,1),new r("isme",-1,1),new r("euse",-1,11),new r("iste",-1,1),new r("ive",-1,8),new r("if",-1,8),new r("usion",-1,4),new r("ation",-1,2),new r("ution",-1,4),new r("ateur",-1,2),new r("iqUes",-1,1),new r("atrices",-1,2),new r("ances",-1,1),new r("ences",-1,5),new r("logies",-1,3),new r("ables",-1,1),new r("ismes",-1,1),new r("euses",-1,11),new r("istes",-1,1),new r("ives",-1,8),new r("ifs",-1,8),new r("usions",-1,4),new r("ations",-1,2),new r("utions",-1,4),new r("ateurs",-1,2),new r("ments",-1,15),new r("ements",30,6),new r("issements",31,12),new r("ités",-1,7),new r("ment",-1,15),new r("ement",34,6),new r("issement",35,12),new r("amment",34,13),new r("emment",34,14),new r("aux",-1,10),new r("eaux",39,9),new r("eux",-1,1),new r("ité",-1,7)],l=[new r("ira",-1,1),new r("ie",-1,1),new r("isse",-1,1),new r("issante",-1,1),new r("i",-1,1),new r("irai",4,1),new r("ir",-1,1),new r("iras",-1,1),new r("ies",-1,1),new r("îmes",-1,1),new r("isses",-1,1),new r("issantes",-1,1),new r("îtes",-1,1),new r("is",-1,1),new r("irais",13,1),new r("issais",13,1),new r("irions",-1,1),new r("issions",-1,1),new r("irons",-1,1),new r("issons",-1,1),new r("issants",-1,1),new r("it",-1,1),new r("irait",21,1),new r("issait",21,1),new r("issant",-1,1),new r("iraIent",-1,1),new r("issaIent",-1,1),new r("irent",-1,1),new r("issent",-1,1),new r("iront",-1,1),new r("ît",-1,1),new r("iriez",-1,1),new r("issiez",-1,1),new r("irez",-1,1),new r("issez",-1,1)],w=[new r("a",-1,3),new r("era",0,2),new r("asse",-1,3),new r("ante",-1,3),new r("ée",-1,2),new r("ai",-1,3),new r("erai",5,2),new r("er",-1,2),new r("as",-1,3),new r("eras",8,2),new r("âmes",-1,3),new r("asses",-1,3),new r("antes",-1,3),new r("âtes",-1,3),new r("ées",-1,2),new r("ais",-1,3),new r("erais",15,2),new r("ions",-1,1),new r("erions",17,2),new r("assions",17,3),new r("erons",-1,2),new r("ants",-1,3),new r("és",-1,2),new r("ait",-1,3),new r("erait",23,2),new r("ant",-1,3),new r("aIent",-1,3),new r("eraIent",26,2),new r("èrent",-1,2),new r("assent",-1,3),new r("eront",-1,2),new r("ât",-1,3),new r("ez",-1,2),new r("iez",32,2),new r("eriez",33,2),new r("assiez",33,3),new r("erez",32,2),new r("é",-1,2)],f=[new r("e",-1,3),new r("Ière",0,2),new r("ière",0,2),new r("ion",-1,1),new r("Ier",-1,2),new r("ier",-1,2),new r("ë",-1,4)],m=[new r("ell",-1,-1),new r("eill",-1,-1),new r("enn",-1,-1),new r("onn",-1,-1),new r("ett",-1,-1)],_=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5],b=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128],d=new y;function k(e,r,s){return!(!d.eq_s(1,e)||(d.ket=d.cursor,!d.in_grouping(_,97,251)))&&(d.slice_from(r),d.cursor=s,!0)}function p(e,r,s){return!!d.eq_s(1,e)&&(d.ket=d.cursor,d.slice_from(r),d.cursor=s,!0)}function g(){for(;!d.in_grouping(_,97,251);){if(d.cursor>=d.limit)return!0;d.cursor++}for(;!d.out_grouping(_,97,251);){if(d.cursor>=d.limit)return!0;d.cursor++}return!1}function q(){return t<=d.cursor}function v(){return i<=d.cursor}function h(){return s<=d.cursor}function z(){if(!function(){var e,r;if(d.ket=d.cursor,e=d.find_among_b(a,43)){switch(d.bra=d.cursor,e){case 1:if(!h())return!1;d.slice_del();break;case 2:if(!h())return!1;d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"ic")&&(d.bra=d.cursor,h()?d.slice_del():d.slice_from("iqU"));break;case 3:if(!h())return!1;d.slice_from("log");break;case 4:if(!h())return!1;d.slice_from("u");break;case 5:if(!h())return!1;d.slice_from("ent");break;case 6:if(!q())return!1;if(d.slice_del(),d.ket=d.cursor,e=d.find_among_b(o,6))switch(d.bra=d.cursor,e){case 1:h()&&(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,h()&&d.slice_del()));break;case 2:h()?d.slice_del():v()&&d.slice_from("eux");break;case 3:h()&&d.slice_del();break;case 4:q()&&d.slice_from("i")}break;case 7:if(!h())return!1;if(d.slice_del(),d.ket=d.cursor,e=d.find_among_b(c,3))switch(d.bra=d.cursor,e){case 1:h()?d.slice_del():d.slice_from("abl");break;case 2:h()?d.slice_del():d.slice_from("iqU");break;case 3:h()&&d.slice_del()}break;case 8:if(!h())return!1;if(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,h()&&(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"ic")))){d.bra=d.cursor,h()?d.slice_del():d.slice_from("iqU");break}break;case 9:d.slice_from("eau");break;case 10:if(!v())return!1;d.slice_from("al");break;case 11:if(h())d.slice_del();else{if(!v())return!1;d.slice_from("eux")}break;case 12:if(!v()||!d.out_grouping_b(_,97,251))return!1;d.slice_del();break;case 13:return q()&&d.slice_from("ant"),!1;case 14:return q()&&d.slice_from("ent"),!1;case 15:return r=d.limit-d.cursor,d.in_grouping_b(_,97,251)&&q()&&(d.cursor=d.limit-r,d.slice_del()),!1}return!0}return!1}()&&(d.cursor=d.limit,!function(){var e,r;if(d.cursor=t){if(s=d.limit_backward,d.limit_backward=t,d.ket=d.cursor,e=d.find_among_b(f,7))switch(d.bra=d.cursor,e){case 1:if(h()){if(i=d.limit-d.cursor,!d.eq_s_b(1,"s")&&(d.cursor=d.limit-i,!d.eq_s_b(1,"t")))break;d.slice_del()}break;case 2:d.slice_from("i");break;case 3:d.slice_del();break;case 4:d.eq_s_b(2,"gu")&&d.slice_del()}d.limit_backward=s}}();d.cursor=d.limit,d.ket=d.cursor,d.eq_s_b(1,"Y")?(d.bra=d.cursor,d.slice_from("i")):(d.cursor=d.limit,d.eq_s_b(1,"ç")&&(d.bra=d.cursor,d.slice_from("c")))}this.setCurrent=function(e){d.setCurrent(e)},this.getCurrent=function(){return d.getCurrent()},this.stem=function(){var e,r=d.cursor;return function(){for(var e,r;;){if(e=d.cursor,d.in_grouping(_,97,251)){if(d.bra=d.cursor,r=d.cursor,k("u","U",e))continue;if(d.cursor=r,k("i","I",e))continue;if(d.cursor=r,p("y","Y",e))continue}if(d.cursor=e,!k("y","Y",d.bra=e)){if(d.cursor=e,d.eq_s(1,"q")&&(d.bra=d.cursor,p("u","U",e)))continue;if((d.cursor=e)>=d.limit)return;d.cursor++}}}(),d.cursor=r,function(){var e=d.cursor;if(t=d.limit,s=i=t,d.in_grouping(_,97,251)&&d.in_grouping(_,97,251)&&d.cursor=d.limit){d.cursor=t;break}d.cursor++}while(!d.in_grouping(_,97,251))}t=d.cursor,d.cursor=e,g()||(i=d.cursor,g()||(s=d.cursor))}(),d.limit_backward=r,d.cursor=d.limit,z(),d.cursor=d.limit,e=d.limit-d.cursor,d.find_among_b(m,5)&&(d.cursor=d.limit-e,d.ket=d.cursor,d.cursor>d.limit_backward&&(d.cursor--,d.bra=d.cursor,d.slice_del())),d.cursor=d.limit,function(){for(var e,r=1;d.out_grouping_b(_,97,251);)r--;if(r<=0){if(d.ket=d.cursor,e=d.limit-d.cursor,!d.eq_s_b(1,"é")&&(d.cursor=d.limit-e,!d.eq_s_b(1,"è")))return;d.bra=d.cursor,d.slice_from("e")}}(),d.cursor=d.limit_backward,function(){for(var e,r;r=d.cursor,d.bra=r,e=d.find_among(u,4);)switch(d.ket=d.cursor,e){case 1:d.slice_from("i");break;case 2:d.slice_from("u");break;case 3:d.slice_from("y");break;case 4:if(d.cursor>=d.limit)return;d.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return s.setCurrent(e),s.stem(),s.getCurrent()}):(s.setCurrent(e),s.stem(),s.getCurrent())}),e.Pipeline.registerFunction(e.fr.stemmer,"stemmer-fr"),e.fr.stopWordFilter=e.generateStopWordFilter("ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci celà ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux eûmes eût eûtes furent fus fusse fussent fusses fussiez fussions fut fûmes fût fûtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon même n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y à étaient étais était étant étiez étions été étée étées étés êtes".split(" ")),e.Pipeline.registerFunction(e.fr.stopWordFilter,"stopWordFilter-fr")}}); \ No newline at end of file diff --git a/docs/v1.1.1/_static/javascripts/lunr/lunr.hu.js b/docs/v1.1.1/_static/javascripts/lunr/lunr.hu.js new file mode 100644 index 0000000000..56a4b0dc19 --- /dev/null +++ b/docs/v1.1.1/_static/javascripts/lunr/lunr.hu.js @@ -0,0 +1 @@ +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var p,_,n;e.hu=function(){this.pipeline.reset(),this.pipeline.add(e.hu.trimmer,e.hu.stopWordFilter,e.hu.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hu.stemmer))},e.hu.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.hu.trimmer=e.trimmerSupport.generateTrimmer(e.hu.wordCharacters),e.Pipeline.registerFunction(e.hu.trimmer,"trimmer-hu"),e.hu.stemmer=(p=e.stemmerSupport.Among,_=e.stemmerSupport.SnowballProgram,n=new function(){var r,i=[new p("cs",-1,-1),new p("dzs",-1,-1),new p("gy",-1,-1),new p("ly",-1,-1),new p("ny",-1,-1),new p("sz",-1,-1),new p("ty",-1,-1),new p("zs",-1,-1)],n=[new p("á",-1,1),new p("é",-1,2)],a=[new p("bb",-1,-1),new p("cc",-1,-1),new p("dd",-1,-1),new p("ff",-1,-1),new p("gg",-1,-1),new p("jj",-1,-1),new p("kk",-1,-1),new p("ll",-1,-1),new p("mm",-1,-1),new p("nn",-1,-1),new p("pp",-1,-1),new p("rr",-1,-1),new p("ccs",-1,-1),new p("ss",-1,-1),new p("zzs",-1,-1),new p("tt",-1,-1),new p("vv",-1,-1),new p("ggy",-1,-1),new p("lly",-1,-1),new p("nny",-1,-1),new p("tty",-1,-1),new p("ssz",-1,-1),new p("zz",-1,-1)],t=[new p("al",-1,1),new p("el",-1,2)],e=[new p("ba",-1,-1),new p("ra",-1,-1),new p("be",-1,-1),new p("re",-1,-1),new p("ig",-1,-1),new p("nak",-1,-1),new p("nek",-1,-1),new p("val",-1,-1),new p("vel",-1,-1),new p("ul",-1,-1),new p("nál",-1,-1),new p("nél",-1,-1),new p("ból",-1,-1),new p("ról",-1,-1),new p("tól",-1,-1),new p("bõl",-1,-1),new p("rõl",-1,-1),new p("tõl",-1,-1),new p("ül",-1,-1),new p("n",-1,-1),new p("an",19,-1),new p("ban",20,-1),new p("en",19,-1),new p("ben",22,-1),new p("képpen",22,-1),new p("on",19,-1),new p("ön",19,-1),new p("képp",-1,-1),new p("kor",-1,-1),new p("t",-1,-1),new p("at",29,-1),new p("et",29,-1),new p("ként",29,-1),new p("anként",32,-1),new p("enként",32,-1),new p("onként",32,-1),new p("ot",29,-1),new p("ért",29,-1),new p("öt",29,-1),new p("hez",-1,-1),new p("hoz",-1,-1),new p("höz",-1,-1),new p("vá",-1,-1),new p("vé",-1,-1)],s=[new p("án",-1,2),new p("én",-1,1),new p("ánként",-1,3)],c=[new p("stul",-1,2),new p("astul",0,1),new p("ástul",0,3),new p("stül",-1,2),new p("estül",3,1),new p("éstül",3,4)],w=[new p("á",-1,1),new p("é",-1,2)],o=[new p("k",-1,7),new p("ak",0,4),new p("ek",0,6),new p("ok",0,5),new p("ák",0,1),new p("ék",0,2),new p("ök",0,3)],l=[new p("éi",-1,7),new p("áéi",0,6),new p("ééi",0,5),new p("é",-1,9),new p("ké",3,4),new p("aké",4,1),new p("eké",4,1),new p("oké",4,1),new p("áké",4,3),new p("éké",4,2),new p("öké",4,1),new p("éé",3,8)],u=[new p("a",-1,18),new p("ja",0,17),new p("d",-1,16),new p("ad",2,13),new p("ed",2,13),new p("od",2,13),new p("ád",2,14),new p("éd",2,15),new p("öd",2,13),new p("e",-1,18),new p("je",9,17),new p("nk",-1,4),new p("unk",11,1),new p("ánk",11,2),new p("énk",11,3),new p("ünk",11,1),new p("uk",-1,8),new p("juk",16,7),new p("ájuk",17,5),new p("ük",-1,8),new p("jük",19,7),new p("éjük",20,6),new p("m",-1,12),new p("am",22,9),new p("em",22,9),new p("om",22,9),new p("ám",22,10),new p("ém",22,11),new p("o",-1,18),new p("á",-1,19),new p("é",-1,20)],m=[new p("id",-1,10),new p("aid",0,9),new p("jaid",1,6),new p("eid",0,9),new p("jeid",3,6),new p("áid",0,7),new p("éid",0,8),new p("i",-1,15),new p("ai",7,14),new p("jai",8,11),new p("ei",7,14),new p("jei",10,11),new p("ái",7,12),new p("éi",7,13),new p("itek",-1,24),new p("eitek",14,21),new p("jeitek",15,20),new p("éitek",14,23),new p("ik",-1,29),new p("aik",18,26),new p("jaik",19,25),new p("eik",18,26),new p("jeik",21,25),new p("áik",18,27),new p("éik",18,28),new p("ink",-1,20),new p("aink",25,17),new p("jaink",26,16),new p("eink",25,17),new p("jeink",28,16),new p("áink",25,18),new p("éink",25,19),new p("aitok",-1,21),new p("jaitok",32,20),new p("áitok",-1,22),new p("im",-1,5),new p("aim",35,4),new p("jaim",36,1),new p("eim",35,4),new p("jeim",38,1),new p("áim",35,2),new p("éim",35,3)],k=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,52,14],f=new _;function b(){return r<=f.cursor}function d(){var e=f.limit-f.cursor;return!!f.find_among_b(a,23)&&(f.cursor=f.limit-e,!0)}function g(){if(f.cursor>f.limit_backward){f.cursor--,f.ket=f.cursor;var e=f.cursor-1;f.limit_backward<=e&&e<=f.limit&&(f.cursor=e,f.bra=e,f.slice_del())}}function h(){f.ket=f.cursor,f.find_among_b(e,44)&&(f.bra=f.cursor,b()&&(f.slice_del(),function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(n,2))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("a");break;case 2:f.slice_from("e")}}()))}this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var e=f.cursor;return function(){var e,n=f.cursor;if(r=f.limit,f.in_grouping(k,97,252))for(;;){if(e=f.cursor,f.out_grouping(k,97,252))return f.cursor=e,f.find_among(i,8)||(f.cursor=e)=f.limit)return r=e;f.cursor++}if(f.cursor=n,f.out_grouping(k,97,252)){for(;!f.in_grouping(k,97,252);){if(f.cursor>=f.limit)return;f.cursor++}r=f.cursor}}(),f.limit_backward=e,f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(t,2))&&(f.bra=f.cursor,b())){if((1==e||2==e)&&!d())return;f.slice_del(),g()}}(),f.cursor=f.limit,h(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(s,3))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("e");break;case 2:case 3:f.slice_from("a")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(c,6))&&(f.bra=f.cursor,b()))switch(e){case 1:case 2:f.slice_del();break;case 3:f.slice_from("a");break;case 4:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(w,2))&&(f.bra=f.cursor,b())){if((1==e||2==e)&&!d())return;f.slice_del(),g()}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(l,12))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 7:case 9:f.slice_del();break;case 2:case 5:case 8:f.slice_from("e");break;case 3:case 6:f.slice_from("a")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(u,31))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 7:case 8:case 9:case 12:case 13:case 16:case 17:case 18:f.slice_del();break;case 2:case 5:case 10:case 14:case 19:f.slice_from("a");break;case 3:case 6:case 11:case 15:case 20:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(m,42))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 5:case 6:case 9:case 10:case 11:case 14:case 15:case 16:case 17:case 20:case 21:case 24:case 25:case 26:case 29:f.slice_del();break;case 2:case 7:case 12:case 18:case 22:case 27:f.slice_from("a");break;case 3:case 8:case 13:case 19:case 23:case 28:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(o,7))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("a");break;case 2:f.slice_from("e");break;case 3:case 4:case 5:case 6:case 7:f.slice_del()}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.hu.stemmer,"stemmer-hu"),e.hu.stopWordFilter=e.generateStopWordFilter("a abban ahhoz ahogy ahol aki akik akkor alatt amely amelyek amelyekben amelyeket amelyet amelynek ami amikor amit amolyan amíg annak arra arról az azok azon azonban azt aztán azután azzal azért be belül benne bár cikk cikkek cikkeket csak de e ebben eddig egy egyes egyetlen egyik egyre egyéb egész ehhez ekkor el ellen elsõ elég elõ elõször elõtt emilyen ennek erre ez ezek ezen ezt ezzel ezért fel felé hanem hiszen hogy hogyan igen ill ill. illetve ilyen ilyenkor ismét ison itt jobban jó jól kell kellett keressünk keresztül ki kívül között közül legalább legyen lehet lehetett lenne lenni lesz lett maga magát majd majd meg mellett mely melyek mert mi mikor milyen minden mindenki mindent mindig mint mintha mit mivel miért most már más másik még míg nagy nagyobb nagyon ne nekem neki nem nincs néha néhány nélkül olyan ott pedig persze rá s saját sem semmi sok sokat sokkal szemben szerint szinte számára talán tehát teljes tovább továbbá több ugyanis utolsó után utána vagy vagyis vagyok valaki valami valamint való van vannak vele vissza viszont volna volt voltak voltam voltunk által általában át én éppen és így õ õk õket össze úgy új újabb újra".split(" ")),e.Pipeline.registerFunction(e.hu.stopWordFilter,"stopWordFilter-hu")}}); \ No newline at end of file diff --git a/docs/v1.1.1/_static/javascripts/lunr/lunr.it.js b/docs/v1.1.1/_static/javascripts/lunr/lunr.it.js new file mode 100644 index 0000000000..50dddaa04b --- /dev/null +++ b/docs/v1.1.1/_static/javascripts/lunr/lunr.it.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var z,P,r;e.it=function(){this.pipeline.reset(),this.pipeline.add(e.it.trimmer,e.it.stopWordFilter,e.it.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.it.stemmer))},e.it.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.it.trimmer=e.trimmerSupport.generateTrimmer(e.it.wordCharacters),e.Pipeline.registerFunction(e.it.trimmer,"trimmer-it"),e.it.stemmer=(z=e.stemmerSupport.Among,P=e.stemmerSupport.SnowballProgram,r=new function(){var o,t,s,a=[new z("",-1,7),new z("qu",0,6),new z("á",0,1),new z("é",0,2),new z("í",0,3),new z("ó",0,4),new z("ú",0,5)],u=[new z("",-1,3),new z("I",0,1),new z("U",0,2)],c=[new z("la",-1,-1),new z("cela",0,-1),new z("gliela",0,-1),new z("mela",0,-1),new z("tela",0,-1),new z("vela",0,-1),new z("le",-1,-1),new z("cele",6,-1),new z("gliele",6,-1),new z("mele",6,-1),new z("tele",6,-1),new z("vele",6,-1),new z("ne",-1,-1),new z("cene",12,-1),new z("gliene",12,-1),new z("mene",12,-1),new z("sene",12,-1),new z("tene",12,-1),new z("vene",12,-1),new z("ci",-1,-1),new z("li",-1,-1),new z("celi",20,-1),new z("glieli",20,-1),new z("meli",20,-1),new z("teli",20,-1),new z("veli",20,-1),new z("gli",20,-1),new z("mi",-1,-1),new z("si",-1,-1),new z("ti",-1,-1),new z("vi",-1,-1),new z("lo",-1,-1),new z("celo",31,-1),new z("glielo",31,-1),new z("melo",31,-1),new z("telo",31,-1),new z("velo",31,-1)],w=[new z("ando",-1,1),new z("endo",-1,1),new z("ar",-1,2),new z("er",-1,2),new z("ir",-1,2)],r=[new z("ic",-1,-1),new z("abil",-1,-1),new z("os",-1,-1),new z("iv",-1,1)],n=[new z("ic",-1,1),new z("abil",-1,1),new z("iv",-1,1)],i=[new z("ica",-1,1),new z("logia",-1,3),new z("osa",-1,1),new z("ista",-1,1),new z("iva",-1,9),new z("anza",-1,1),new z("enza",-1,5),new z("ice",-1,1),new z("atrice",7,1),new z("iche",-1,1),new z("logie",-1,3),new z("abile",-1,1),new z("ibile",-1,1),new z("usione",-1,4),new z("azione",-1,2),new z("uzione",-1,4),new z("atore",-1,2),new z("ose",-1,1),new z("ante",-1,1),new z("mente",-1,1),new z("amente",19,7),new z("iste",-1,1),new z("ive",-1,9),new z("anze",-1,1),new z("enze",-1,5),new z("ici",-1,1),new z("atrici",25,1),new z("ichi",-1,1),new z("abili",-1,1),new z("ibili",-1,1),new z("ismi",-1,1),new z("usioni",-1,4),new z("azioni",-1,2),new z("uzioni",-1,4),new z("atori",-1,2),new z("osi",-1,1),new z("anti",-1,1),new z("amenti",-1,6),new z("imenti",-1,6),new z("isti",-1,1),new z("ivi",-1,9),new z("ico",-1,1),new z("ismo",-1,1),new z("oso",-1,1),new z("amento",-1,6),new z("imento",-1,6),new z("ivo",-1,9),new z("ità",-1,8),new z("istà",-1,1),new z("istè",-1,1),new z("istì",-1,1)],l=[new z("isca",-1,1),new z("enda",-1,1),new z("ata",-1,1),new z("ita",-1,1),new z("uta",-1,1),new z("ava",-1,1),new z("eva",-1,1),new z("iva",-1,1),new z("erebbe",-1,1),new z("irebbe",-1,1),new z("isce",-1,1),new z("ende",-1,1),new z("are",-1,1),new z("ere",-1,1),new z("ire",-1,1),new z("asse",-1,1),new z("ate",-1,1),new z("avate",16,1),new z("evate",16,1),new z("ivate",16,1),new z("ete",-1,1),new z("erete",20,1),new z("irete",20,1),new z("ite",-1,1),new z("ereste",-1,1),new z("ireste",-1,1),new z("ute",-1,1),new z("erai",-1,1),new z("irai",-1,1),new z("isci",-1,1),new z("endi",-1,1),new z("erei",-1,1),new z("irei",-1,1),new z("assi",-1,1),new z("ati",-1,1),new z("iti",-1,1),new z("eresti",-1,1),new z("iresti",-1,1),new z("uti",-1,1),new z("avi",-1,1),new z("evi",-1,1),new z("ivi",-1,1),new z("isco",-1,1),new z("ando",-1,1),new z("endo",-1,1),new z("Yamo",-1,1),new z("iamo",-1,1),new z("avamo",-1,1),new z("evamo",-1,1),new z("ivamo",-1,1),new z("eremo",-1,1),new z("iremo",-1,1),new z("assimo",-1,1),new z("ammo",-1,1),new z("emmo",-1,1),new z("eremmo",54,1),new z("iremmo",54,1),new z("immo",-1,1),new z("ano",-1,1),new z("iscano",58,1),new z("avano",58,1),new z("evano",58,1),new z("ivano",58,1),new z("eranno",-1,1),new z("iranno",-1,1),new z("ono",-1,1),new z("iscono",65,1),new z("arono",65,1),new z("erono",65,1),new z("irono",65,1),new z("erebbero",-1,1),new z("irebbero",-1,1),new z("assero",-1,1),new z("essero",-1,1),new z("issero",-1,1),new z("ato",-1,1),new z("ito",-1,1),new z("uto",-1,1),new z("avo",-1,1),new z("evo",-1,1),new z("ivo",-1,1),new z("ar",-1,1),new z("ir",-1,1),new z("erà",-1,1),new z("irà",-1,1),new z("erò",-1,1),new z("irò",-1,1)],m=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2,1],f=[17,65,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2],v=[17],b=new P;function d(e,r,n){return!(!b.eq_s(1,e)||(b.ket=b.cursor,!b.in_grouping(m,97,249)))&&(b.slice_from(r),b.cursor=n,!0)}function _(e){if(b.cursor=e,!b.in_grouping(m,97,249))return!1;for(;!b.out_grouping(m,97,249);){if(b.cursor>=b.limit)return!1;b.cursor++}return!0}function g(){var e,r=b.cursor;if(!function(){if(b.in_grouping(m,97,249)){var e=b.cursor;if(b.out_grouping(m,97,249)){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return _(e);b.cursor++}return!0}return _(e)}return!1}()){if(b.cursor=r,!b.out_grouping(m,97,249))return;if(e=b.cursor,b.out_grouping(m,97,249)){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return b.cursor=e,void(b.in_grouping(m,97,249)&&b.cursor=b.limit)return;b.cursor++}s=b.cursor}function p(){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return!1;b.cursor++}for(;!b.out_grouping(m,97,249);){if(b.cursor>=b.limit)return!1;b.cursor++}return!0}function k(){return s<=b.cursor}function h(){return o<=b.cursor}function q(){var e;if(b.ket=b.cursor,!(e=b.find_among_b(i,51)))return!1;switch(b.bra=b.cursor,e){case 1:if(!h())return!1;b.slice_del();break;case 2:if(!h())return!1;b.slice_del(),b.ket=b.cursor,b.eq_s_b(2,"ic")&&(b.bra=b.cursor,h()&&b.slice_del());break;case 3:if(!h())return!1;b.slice_from("log");break;case 4:if(!h())return!1;b.slice_from("u");break;case 5:if(!h())return!1;b.slice_from("ente");break;case 6:if(!k())return!1;b.slice_del();break;case 7:if(!(t<=b.cursor))return!1;b.slice_del(),b.ket=b.cursor,(e=b.find_among_b(r,4))&&(b.bra=b.cursor,h()&&(b.slice_del(),1==e&&(b.ket=b.cursor,b.eq_s_b(2,"at")&&(b.bra=b.cursor,h()&&b.slice_del()))));break;case 8:if(!h())return!1;b.slice_del(),b.ket=b.cursor,(e=b.find_among_b(n,3))&&(b.bra=b.cursor,1==e&&h()&&b.slice_del());break;case 9:if(!h())return!1;b.slice_del(),b.ket=b.cursor,b.eq_s_b(2,"at")&&(b.bra=b.cursor,h()&&(b.slice_del(),b.ket=b.cursor,b.eq_s_b(2,"ic")&&(b.bra=b.cursor,h()&&b.slice_del())))}return!0}function C(){var e;e=b.limit-b.cursor,b.ket=b.cursor,b.in_grouping_b(f,97,242)&&(b.bra=b.cursor,k()&&(b.slice_del(),b.ket=b.cursor,b.eq_s_b(1,"i")&&(b.bra=b.cursor,k())))?b.slice_del():b.cursor=b.limit-e,b.ket=b.cursor,b.eq_s_b(1,"h")&&(b.bra=b.cursor,b.in_grouping_b(v,99,103)&&k()&&b.slice_del())}this.setCurrent=function(e){b.setCurrent(e)},this.getCurrent=function(){return b.getCurrent()},this.stem=function(){var e,r,n,i=b.cursor;return function(){for(var e,r,n,i,o=b.cursor;;){if(b.bra=b.cursor,e=b.find_among(a,7))switch(b.ket=b.cursor,e){case 1:b.slice_from("à");continue;case 2:b.slice_from("è");continue;case 3:b.slice_from("ì");continue;case 4:b.slice_from("ò");continue;case 5:b.slice_from("ù");continue;case 6:b.slice_from("qU");continue;case 7:if(b.cursor>=b.limit)break;b.cursor++;continue}break}for(b.cursor=o;;)for(r=b.cursor;;){if(n=b.cursor,b.in_grouping(m,97,249)){if(b.bra=b.cursor,i=b.cursor,d("u","U",n))break;if(b.cursor=i,d("i","I",n))break}if(b.cursor=n,b.cursor>=b.limit)return b.cursor=r;b.cursor++}}(),b.cursor=i,e=b.cursor,s=b.limit,o=t=s,g(),b.cursor=e,p()&&(t=b.cursor,p()&&(o=b.cursor)),b.limit_backward=i,b.cursor=b.limit,function(){var e;if(b.ket=b.cursor,b.find_among_b(c,37)&&(b.bra=b.cursor,(e=b.find_among_b(w,5))&&k()))switch(e){case 1:b.slice_del();break;case 2:b.slice_from("e")}}(),b.cursor=b.limit,q()||(b.cursor=b.limit,b.cursor>=s&&(n=b.limit_backward,b.limit_backward=s,b.ket=b.cursor,(r=b.find_among_b(l,87))&&(b.bra=b.cursor,1==r&&b.slice_del()),b.limit_backward=n)),b.cursor=b.limit,C(),b.cursor=b.limit_backward,function(){for(var e;b.bra=b.cursor,e=b.find_among(u,3);)switch(b.ket=b.cursor,e){case 1:b.slice_from("i");break;case 2:b.slice_from("u");break;case 3:if(b.cursor>=b.limit)return;b.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.it.stemmer,"stemmer-it"),e.it.stopWordFilter=e.generateStopWordFilter("a abbia abbiamo abbiano abbiate ad agl agli ai al all alla alle allo anche avemmo avendo avesse avessero avessi avessimo aveste avesti avete aveva avevamo avevano avevate avevi avevo avrai avranno avrebbe avrebbero avrei avremmo avremo avreste avresti avrete avrà avrò avuta avute avuti avuto c che chi ci coi col come con contro cui da dagl dagli dai dal dall dalla dalle dallo degl degli dei del dell della delle dello di dov dove e ebbe ebbero ebbi ed era erano eravamo eravate eri ero essendo faccia facciamo facciano facciate faccio facemmo facendo facesse facessero facessi facessimo faceste facesti faceva facevamo facevano facevate facevi facevo fai fanno farai faranno farebbe farebbero farei faremmo faremo fareste faresti farete farà farò fece fecero feci fosse fossero fossi fossimo foste fosti fu fui fummo furono gli ha hai hanno ho i il in io l la le lei li lo loro lui ma mi mia mie miei mio ne negl negli nei nel nell nella nelle nello noi non nostra nostre nostri nostro o per perché più quale quanta quante quanti quanto quella quelle quelli quello questa queste questi questo sarai saranno sarebbe sarebbero sarei saremmo saremo sareste saresti sarete sarà sarò se sei si sia siamo siano siate siete sono sta stai stando stanno starai staranno starebbe starebbero starei staremmo staremo stareste staresti starete starà starò stava stavamo stavano stavate stavi stavo stemmo stesse stessero stessi stessimo steste stesti stette stettero stetti stia stiamo stiano stiate sto su sua sue sugl sugli sui sul sull sulla sulle sullo suo suoi ti tra tu tua tue tuo tuoi tutti tutto un una uno vi voi vostra vostre vostri vostro è".split(" ")),e.Pipeline.registerFunction(e.it.stopWordFilter,"stopWordFilter-it")}}); \ No newline at end of file diff --git a/docs/v1.1.1/_static/javascripts/lunr/lunr.ja.js b/docs/v1.1.1/_static/javascripts/lunr/lunr.ja.js new file mode 100644 index 0000000000..69f620250d --- /dev/null +++ b/docs/v1.1.1/_static/javascripts/lunr/lunr.ja.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(m){if(void 0===m)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===m.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var l="2"==m.version[0];m.ja=function(){this.pipeline.reset(),this.pipeline.add(m.ja.trimmer,m.ja.stopWordFilter,m.ja.stemmer),l?this.tokenizer=m.ja.tokenizer:(m.tokenizer&&(m.tokenizer=m.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=m.ja.tokenizer))};var j=new m.TinySegmenter;m.ja.tokenizer=function(e){var r,t,i,n,o,s,p,a,u;if(!arguments.length||null==e||null==e)return[];if(Array.isArray(e))return e.map(function(e){return l?new m.Token(e.toLowerCase()):e.toLowerCase()});for(r=(t=e.toString().toLowerCase().replace(/^\s+/,"")).length-1;0<=r;r--)if(/\S/.test(t.charAt(r))){t=t.substring(0,r+1);break}for(o=[],i=t.length,p=a=0;a<=i;a++)if(s=a-p,t.charAt(a).match(/\s/)||a==i){if(0=_.limit||(_.cursor++,!1)}function w(){for(;!_.in_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}for(;!_.out_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}function b(){return i<=_.cursor}function p(){return e<=_.cursor}function g(){var r=_.limit-_.cursor;_.find_among_b(t,3)&&(_.cursor=_.limit-r,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del()))}function h(){var r;u=!1,_.ket=_.cursor,_.eq_s_b(1,"e")&&(_.bra=_.cursor,b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.slice_del(),u=!0,g())))}function k(){var r;b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.eq_s_b(3,"gem")||(_.cursor=_.limit-r,_.slice_del(),g())))}this.setCurrent=function(r){_.setCurrent(r)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var r=_.cursor;return function(){for(var r,e,i,n=_.cursor;;){if(_.bra=_.cursor,r=_.find_among(o,11))switch(_.ket=_.cursor,r){case 1:_.slice_from("a");continue;case 2:_.slice_from("e");continue;case 3:_.slice_from("i");continue;case 4:_.slice_from("o");continue;case 5:_.slice_from("u");continue;case 6:if(_.cursor>=_.limit)break;_.cursor++;continue}break}for(_.cursor=n,_.bra=n,_.eq_s(1,"y")?(_.ket=_.cursor,_.slice_from("Y")):_.cursor=n;;)if(e=_.cursor,_.in_grouping(m,97,232)){if(i=_.cursor,_.bra=i,_.eq_s(1,"i"))_.ket=_.cursor,_.in_grouping(m,97,232)&&(_.slice_from("I"),_.cursor=e);else if(_.cursor=i,_.eq_s(1,"y"))_.ket=_.cursor,_.slice_from("Y"),_.cursor=e;else if(s(e))break}else if(s(e))break}(),_.cursor=r,i=_.limit,e=i,w()||((i=_.cursor)<3&&(i=3),w()||(e=_.cursor)),_.limit_backward=r,_.cursor=_.limit,function(){var r,e,i,n,o,t,s=_.limit-_.cursor;if(_.ket=_.cursor,r=_.find_among_b(c,5))switch(_.bra=_.cursor,r){case 1:b()&&_.slice_from("heid");break;case 2:k();break;case 3:b()&&_.out_grouping_b(f,97,232)&&_.slice_del()}if(_.cursor=_.limit-s,h(),_.cursor=_.limit-s,_.ket=_.cursor,_.eq_s_b(4,"heid")&&(_.bra=_.cursor,p()&&(e=_.limit-_.cursor,_.eq_s_b(1,"c")||(_.cursor=_.limit-e,_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"en")&&(_.bra=_.cursor,k())))),_.cursor=_.limit-s,_.ket=_.cursor,r=_.find_among_b(a,6))switch(_.bra=_.cursor,r){case 1:if(p()){if(_.slice_del(),i=_.limit-_.cursor,_.ket=_.cursor,_.eq_s_b(2,"ig")&&(_.bra=_.cursor,p()&&(n=_.limit-_.cursor,!_.eq_s_b(1,"e")))){_.cursor=_.limit-n,_.slice_del();break}_.cursor=_.limit-i,g()}break;case 2:p()&&(o=_.limit-_.cursor,_.eq_s_b(1,"e")||(_.cursor=_.limit-o,_.slice_del()));break;case 3:p()&&(_.slice_del(),h());break;case 4:p()&&_.slice_del();break;case 5:p()&&u&&_.slice_del()}_.cursor=_.limit-s,_.out_grouping_b(d,73,232)&&(t=_.limit-_.cursor,_.find_among_b(l,4)&&_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-t,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del())))}(),_.cursor=_.limit_backward,function(){for(var r;;)if(_.bra=_.cursor,r=_.find_among(n,3))switch(_.ket=_.cursor,r){case 1:_.slice_from("y");break;case 2:_.slice_from("i");break;case 3:if(_.cursor>=_.limit)return;_.cursor++}}(),!0}},function(r){return"function"==typeof r.update?r.update(function(r){return e.setCurrent(r),e.stem(),e.getCurrent()}):(e.setCurrent(r),e.stem(),e.getCurrent())}),r.Pipeline.registerFunction(r.nl.stemmer,"stemmer-nl"),r.nl.stopWordFilter=r.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),r.Pipeline.registerFunction(r.nl.stopWordFilter,"stopWordFilter-nl")}}); \ No newline at end of file diff --git a/docs/v1.1.1/_static/javascripts/lunr/lunr.no.js b/docs/v1.1.1/_static/javascripts/lunr/lunr.no.js new file mode 100644 index 0000000000..3d156b9c19 --- /dev/null +++ b/docs/v1.1.1/_static/javascripts/lunr/lunr.no.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,n,i;e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWordFilter,e.no.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.no.stemmer))},e.no.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.no.trimmer=e.trimmerSupport.generateTrimmer(e.no.wordCharacters),e.Pipeline.registerFunction(e.no.trimmer,"trimmer-no"),e.no.stemmer=(r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){var o,s,a=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],m=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],u=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],d=[119,125,149,1],c=new n;this.setCurrent=function(e){c.setCurrent(e)},this.getCurrent=function(){return c.getCurrent()},this.stem=function(){var e,r,n,i,t=c.cursor;return function(){var e,r=c.cursor+3;if(s=c.limit,0<=r||r<=c.limit){for(o=r;;){if(e=c.cursor,c.in_grouping(u,97,248)){c.cursor=e;break}if(e>=c.limit)return;c.cursor=e+1}for(;!c.out_grouping(u,97,248);){if(c.cursor>=c.limit)return;c.cursor++}(s=c.cursor)=s&&(r=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,e=c.find_among_b(a,29),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:n=c.limit-c.cursor,c.in_grouping_b(d,98,122)?c.slice_del():(c.cursor=c.limit-n,c.eq_s_b(1,"k")&&c.out_grouping_b(u,97,248)&&c.slice_del());break;case 3:c.slice_from("er")}}(),c.cursor=c.limit,r=c.limit-c.cursor,c.cursor>=s&&(e=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,c.find_among_b(m,2)?(c.bra=c.cursor,c.limit_backward=e,c.cursor=c.limit-r,c.cursor>c.limit_backward&&(c.cursor--,c.bra=c.cursor,c.slice_del())):c.limit_backward=e),c.cursor=c.limit,c.cursor>=s&&(i=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,(n=c.find_among_b(l,11))?(c.bra=c.cursor,c.limit_backward=i,1==n&&c.slice_del()):c.limit_backward=i),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}}); \ No newline at end of file diff --git a/docs/v1.1.1/_static/javascripts/lunr/lunr.pt.js b/docs/v1.1.1/_static/javascripts/lunr/lunr.pt.js new file mode 100644 index 0000000000..f50fc9fa6d --- /dev/null +++ b/docs/v1.1.1/_static/javascripts/lunr/lunr.pt.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var j,C,r;e.pt=function(){this.pipeline.reset(),this.pipeline.add(e.pt.trimmer,e.pt.stopWordFilter,e.pt.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.pt.stemmer))},e.pt.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.pt.trimmer=e.trimmerSupport.generateTrimmer(e.pt.wordCharacters),e.Pipeline.registerFunction(e.pt.trimmer,"trimmer-pt"),e.pt.stemmer=(j=e.stemmerSupport.Among,C=e.stemmerSupport.SnowballProgram,r=new function(){var s,n,i,o=[new j("",-1,3),new j("ã",0,1),new j("õ",0,2)],a=[new j("",-1,3),new j("a~",0,1),new j("o~",0,2)],r=[new j("ic",-1,-1),new j("ad",-1,-1),new j("os",-1,-1),new j("iv",-1,1)],t=[new j("ante",-1,1),new j("avel",-1,1),new j("ível",-1,1)],u=[new j("ic",-1,1),new j("abil",-1,1),new j("iv",-1,1)],w=[new j("ica",-1,1),new j("ância",-1,1),new j("ência",-1,4),new j("ira",-1,9),new j("adora",-1,1),new j("osa",-1,1),new j("ista",-1,1),new j("iva",-1,8),new j("eza",-1,1),new j("logía",-1,2),new j("idade",-1,7),new j("ante",-1,1),new j("mente",-1,6),new j("amente",12,5),new j("ável",-1,1),new j("ível",-1,1),new j("ución",-1,3),new j("ico",-1,1),new j("ismo",-1,1),new j("oso",-1,1),new j("amento",-1,1),new j("imento",-1,1),new j("ivo",-1,8),new j("aça~o",-1,1),new j("ador",-1,1),new j("icas",-1,1),new j("ências",-1,4),new j("iras",-1,9),new j("adoras",-1,1),new j("osas",-1,1),new j("istas",-1,1),new j("ivas",-1,8),new j("ezas",-1,1),new j("logías",-1,2),new j("idades",-1,7),new j("uciones",-1,3),new j("adores",-1,1),new j("antes",-1,1),new j("aço~es",-1,1),new j("icos",-1,1),new j("ismos",-1,1),new j("osos",-1,1),new j("amentos",-1,1),new j("imentos",-1,1),new j("ivos",-1,8)],m=[new j("ada",-1,1),new j("ida",-1,1),new j("ia",-1,1),new j("aria",2,1),new j("eria",2,1),new j("iria",2,1),new j("ara",-1,1),new j("era",-1,1),new j("ira",-1,1),new j("ava",-1,1),new j("asse",-1,1),new j("esse",-1,1),new j("isse",-1,1),new j("aste",-1,1),new j("este",-1,1),new j("iste",-1,1),new j("ei",-1,1),new j("arei",16,1),new j("erei",16,1),new j("irei",16,1),new j("am",-1,1),new j("iam",20,1),new j("ariam",21,1),new j("eriam",21,1),new j("iriam",21,1),new j("aram",20,1),new j("eram",20,1),new j("iram",20,1),new j("avam",20,1),new j("em",-1,1),new j("arem",29,1),new j("erem",29,1),new j("irem",29,1),new j("assem",29,1),new j("essem",29,1),new j("issem",29,1),new j("ado",-1,1),new j("ido",-1,1),new j("ando",-1,1),new j("endo",-1,1),new j("indo",-1,1),new j("ara~o",-1,1),new j("era~o",-1,1),new j("ira~o",-1,1),new j("ar",-1,1),new j("er",-1,1),new j("ir",-1,1),new j("as",-1,1),new j("adas",47,1),new j("idas",47,1),new j("ias",47,1),new j("arias",50,1),new j("erias",50,1),new j("irias",50,1),new j("aras",47,1),new j("eras",47,1),new j("iras",47,1),new j("avas",47,1),new j("es",-1,1),new j("ardes",58,1),new j("erdes",58,1),new j("irdes",58,1),new j("ares",58,1),new j("eres",58,1),new j("ires",58,1),new j("asses",58,1),new j("esses",58,1),new j("isses",58,1),new j("astes",58,1),new j("estes",58,1),new j("istes",58,1),new j("is",-1,1),new j("ais",71,1),new j("eis",71,1),new j("areis",73,1),new j("ereis",73,1),new j("ireis",73,1),new j("áreis",73,1),new j("éreis",73,1),new j("íreis",73,1),new j("ásseis",73,1),new j("ésseis",73,1),new j("ísseis",73,1),new j("áveis",73,1),new j("íeis",73,1),new j("aríeis",84,1),new j("eríeis",84,1),new j("iríeis",84,1),new j("ados",-1,1),new j("idos",-1,1),new j("amos",-1,1),new j("áramos",90,1),new j("éramos",90,1),new j("íramos",90,1),new j("ávamos",90,1),new j("íamos",90,1),new j("aríamos",95,1),new j("eríamos",95,1),new j("iríamos",95,1),new j("emos",-1,1),new j("aremos",99,1),new j("eremos",99,1),new j("iremos",99,1),new j("ássemos",99,1),new j("êssemos",99,1),new j("íssemos",99,1),new j("imos",-1,1),new j("armos",-1,1),new j("ermos",-1,1),new j("irmos",-1,1),new j("ámos",-1,1),new j("arás",-1,1),new j("erás",-1,1),new j("irás",-1,1),new j("eu",-1,1),new j("iu",-1,1),new j("ou",-1,1),new j("ará",-1,1),new j("erá",-1,1),new j("irá",-1,1)],c=[new j("a",-1,1),new j("i",-1,1),new j("o",-1,1),new j("os",-1,1),new j("á",-1,1),new j("í",-1,1),new j("ó",-1,1)],l=[new j("e",-1,1),new j("ç",-1,2),new j("é",-1,1),new j("ê",-1,1)],f=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,3,19,12,2],d=new C;function v(){if(d.out_grouping(f,97,250)){for(;!d.in_grouping(f,97,250);){if(d.cursor>=d.limit)return!0;d.cursor++}return!1}return!0}function p(){var e,r,s=d.cursor;if(d.in_grouping(f,97,250))if(e=d.cursor,v()){if(d.cursor=e,function(){if(d.in_grouping(f,97,250))for(;!d.out_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}return i=d.cursor,!0}())return}else i=d.cursor;if(d.cursor=s,d.out_grouping(f,97,250)){if(r=d.cursor,v()){if(d.cursor=r,!d.in_grouping(f,97,250)||d.cursor>=d.limit)return;d.cursor++}i=d.cursor}}function _(){for(;!d.in_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}for(;!d.out_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}return!0}function h(){return i<=d.cursor}function b(){return s<=d.cursor}function g(){var e;if(d.ket=d.cursor,!(e=d.find_among_b(w,45)))return!1;switch(d.bra=d.cursor,e){case 1:if(!b())return!1;d.slice_del();break;case 2:if(!b())return!1;d.slice_from("log");break;case 3:if(!b())return!1;d.slice_from("u");break;case 4:if(!b())return!1;d.slice_from("ente");break;case 5:if(!(n<=d.cursor))return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(r,4))&&(d.bra=d.cursor,b()&&(d.slice_del(),1==e&&(d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,b()&&d.slice_del()))));break;case 6:if(!b())return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(t,3))&&(d.bra=d.cursor,1==e&&b()&&d.slice_del());break;case 7:if(!b())return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(u,3))&&(d.bra=d.cursor,1==e&&b()&&d.slice_del());break;case 8:if(!b())return!1;d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,b()&&d.slice_del());break;case 9:if(!h()||!d.eq_s_b(1,"e"))return!1;d.slice_from("ir")}return!0}function k(e,r){if(d.eq_s_b(1,e)){d.bra=d.cursor;var s=d.limit-d.cursor;if(d.eq_s_b(1,r))return d.cursor=d.limit-s,h()&&d.slice_del(),!1}return!0}function q(){if(!g()&&(d.cursor=d.limit,!function(){var e,r;if(d.cursor>=i){if(r=d.limit_backward,d.limit_backward=i,d.ket=d.cursor,e=d.find_among_b(m,120))return d.bra=d.cursor,1==e&&d.slice_del(),d.limit_backward=r,!0;d.limit_backward=r}return!1}()))return d.cursor=d.limit,d.ket=d.cursor,void((e=d.find_among_b(c,7))&&(d.bra=d.cursor,1==e&&h()&&d.slice_del()));var e;d.cursor=d.limit,d.ket=d.cursor,d.eq_s_b(1,"i")&&(d.bra=d.cursor,d.eq_s_b(1,"c")&&(d.cursor=d.limit,h()&&d.slice_del()))}this.setCurrent=function(e){d.setCurrent(e)},this.getCurrent=function(){return d.getCurrent()},this.stem=function(){var e,r=d.cursor;return function(){for(var e;;){if(d.bra=d.cursor,e=d.find_among(o,3))switch(d.ket=d.cursor,e){case 1:d.slice_from("a~");continue;case 2:d.slice_from("o~");continue;case 3:if(d.cursor>=d.limit)break;d.cursor++;continue}break}}(),d.cursor=r,e=d.cursor,i=d.limit,s=n=i,p(),d.cursor=e,_()&&(n=d.cursor,_()&&(s=d.cursor)),d.limit_backward=r,d.cursor=d.limit,q(),d.cursor=d.limit,function(){var e;if(d.ket=d.cursor,e=d.find_among_b(l,4))switch(d.bra=d.cursor,e){case 1:h()&&(d.slice_del(),d.ket=d.cursor,d.limit,d.cursor,k("u","g")&&k("i","c"));break;case 2:d.slice_from("c")}}(),d.cursor=d.limit_backward,function(){for(var e;;){if(d.bra=d.cursor,e=d.find_among(a,3))switch(d.ket=d.cursor,e){case 1:d.slice_from("ã");continue;case 2:d.slice_from("õ");continue;case 3:if(d.cursor>=d.limit)break;d.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.pt.stemmer,"stemmer-pt"),e.pt.stopWordFilter=e.generateStopWordFilter("a ao aos aquela aquelas aquele aqueles aquilo as até com como da das de dela delas dele deles depois do dos e ela elas ele eles em entre era eram essa essas esse esses esta estamos estas estava estavam este esteja estejam estejamos estes esteve estive estivemos estiver estivera estiveram estiverem estivermos estivesse estivessem estivéramos estivéssemos estou está estávamos estão eu foi fomos for fora foram forem formos fosse fossem fui fôramos fôssemos haja hajam hajamos havemos hei houve houvemos houver houvera houveram houverei houverem houveremos houveria houveriam houvermos houverá houverão houveríamos houvesse houvessem houvéramos houvéssemos há hão isso isto já lhe lhes mais mas me mesmo meu meus minha minhas muito na nas nem no nos nossa nossas nosso nossos num numa não nós o os ou para pela pelas pelo pelos por qual quando que quem se seja sejam sejamos sem serei seremos seria seriam será serão seríamos seu seus somos sou sua suas são só também te tem temos tenha tenham tenhamos tenho terei teremos teria teriam terá terão teríamos teu teus teve tinha tinham tive tivemos tiver tivera tiveram tiverem tivermos tivesse tivessem tivéramos tivéssemos tu tua tuas tém tínhamos um uma você vocês vos à às éramos".split(" ")),e.Pipeline.registerFunction(e.pt.stopWordFilter,"stopWordFilter-pt")}}); \ No newline at end of file diff --git a/docs/v1.1.1/_static/javascripts/lunr/lunr.ro.js b/docs/v1.1.1/_static/javascripts/lunr/lunr.ro.js new file mode 100644 index 0000000000..b19627e1b3 --- /dev/null +++ b/docs/v1.1.1/_static/javascripts/lunr/lunr.ro.js @@ -0,0 +1 @@ +!function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var h,z,i;e.ro=function(){this.pipeline.reset(),this.pipeline.add(e.ro.trimmer,e.ro.stopWordFilter,e.ro.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ro.stemmer))},e.ro.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.ro.trimmer=e.trimmerSupport.generateTrimmer(e.ro.wordCharacters),e.Pipeline.registerFunction(e.ro.trimmer,"trimmer-ro"),e.ro.stemmer=(h=e.stemmerSupport.Among,z=e.stemmerSupport.SnowballProgram,i=new function(){var r,n,t,a,o=[new h("",-1,3),new h("I",0,1),new h("U",0,2)],s=[new h("ea",-1,3),new h("aţia",-1,7),new h("aua",-1,2),new h("iua",-1,4),new h("aţie",-1,7),new h("ele",-1,3),new h("ile",-1,5),new h("iile",6,4),new h("iei",-1,4),new h("atei",-1,6),new h("ii",-1,4),new h("ului",-1,1),new h("ul",-1,1),new h("elor",-1,3),new h("ilor",-1,4),new h("iilor",14,4)],c=[new h("icala",-1,4),new h("iciva",-1,4),new h("ativa",-1,5),new h("itiva",-1,6),new h("icale",-1,4),new h("aţiune",-1,5),new h("iţiune",-1,6),new h("atoare",-1,5),new h("itoare",-1,6),new h("ătoare",-1,5),new h("icitate",-1,4),new h("abilitate",-1,1),new h("ibilitate",-1,2),new h("ivitate",-1,3),new h("icive",-1,4),new h("ative",-1,5),new h("itive",-1,6),new h("icali",-1,4),new h("atori",-1,5),new h("icatori",18,4),new h("itori",-1,6),new h("ători",-1,5),new h("icitati",-1,4),new h("abilitati",-1,1),new h("ivitati",-1,3),new h("icivi",-1,4),new h("ativi",-1,5),new h("itivi",-1,6),new h("icităi",-1,4),new h("abilităi",-1,1),new h("ivităi",-1,3),new h("icităţi",-1,4),new h("abilităţi",-1,1),new h("ivităţi",-1,3),new h("ical",-1,4),new h("ator",-1,5),new h("icator",35,4),new h("itor",-1,6),new h("ător",-1,5),new h("iciv",-1,4),new h("ativ",-1,5),new h("itiv",-1,6),new h("icală",-1,4),new h("icivă",-1,4),new h("ativă",-1,5),new h("itivă",-1,6)],u=[new h("ica",-1,1),new h("abila",-1,1),new h("ibila",-1,1),new h("oasa",-1,1),new h("ata",-1,1),new h("ita",-1,1),new h("anta",-1,1),new h("ista",-1,3),new h("uta",-1,1),new h("iva",-1,1),new h("ic",-1,1),new h("ice",-1,1),new h("abile",-1,1),new h("ibile",-1,1),new h("isme",-1,3),new h("iune",-1,2),new h("oase",-1,1),new h("ate",-1,1),new h("itate",17,1),new h("ite",-1,1),new h("ante",-1,1),new h("iste",-1,3),new h("ute",-1,1),new h("ive",-1,1),new h("ici",-1,1),new h("abili",-1,1),new h("ibili",-1,1),new h("iuni",-1,2),new h("atori",-1,1),new h("osi",-1,1),new h("ati",-1,1),new h("itati",30,1),new h("iti",-1,1),new h("anti",-1,1),new h("isti",-1,3),new h("uti",-1,1),new h("işti",-1,3),new h("ivi",-1,1),new h("ităi",-1,1),new h("oşi",-1,1),new h("ităţi",-1,1),new h("abil",-1,1),new h("ibil",-1,1),new h("ism",-1,3),new h("ator",-1,1),new h("os",-1,1),new h("at",-1,1),new h("it",-1,1),new h("ant",-1,1),new h("ist",-1,3),new h("ut",-1,1),new h("iv",-1,1),new h("ică",-1,1),new h("abilă",-1,1),new h("ibilă",-1,1),new h("oasă",-1,1),new h("ată",-1,1),new h("ită",-1,1),new h("antă",-1,1),new h("istă",-1,3),new h("ută",-1,1),new h("ivă",-1,1)],w=[new h("ea",-1,1),new h("ia",-1,1),new h("esc",-1,1),new h("ăsc",-1,1),new h("ind",-1,1),new h("ând",-1,1),new h("are",-1,1),new h("ere",-1,1),new h("ire",-1,1),new h("âre",-1,1),new h("se",-1,2),new h("ase",10,1),new h("sese",10,2),new h("ise",10,1),new h("use",10,1),new h("âse",10,1),new h("eşte",-1,1),new h("ăşte",-1,1),new h("eze",-1,1),new h("ai",-1,1),new h("eai",19,1),new h("iai",19,1),new h("sei",-1,2),new h("eşti",-1,1),new h("ăşti",-1,1),new h("ui",-1,1),new h("ezi",-1,1),new h("âi",-1,1),new h("aşi",-1,1),new h("seşi",-1,2),new h("aseşi",29,1),new h("seseşi",29,2),new h("iseşi",29,1),new h("useşi",29,1),new h("âseşi",29,1),new h("işi",-1,1),new h("uşi",-1,1),new h("âşi",-1,1),new h("aţi",-1,2),new h("eaţi",38,1),new h("iaţi",38,1),new h("eţi",-1,2),new h("iţi",-1,2),new h("âţi",-1,2),new h("arăţi",-1,1),new h("serăţi",-1,2),new h("aserăţi",45,1),new h("seserăţi",45,2),new h("iserăţi",45,1),new h("userăţi",45,1),new h("âserăţi",45,1),new h("irăţi",-1,1),new h("urăţi",-1,1),new h("ârăţi",-1,1),new h("am",-1,1),new h("eam",54,1),new h("iam",54,1),new h("em",-1,2),new h("asem",57,1),new h("sesem",57,2),new h("isem",57,1),new h("usem",57,1),new h("âsem",57,1),new h("im",-1,2),new h("âm",-1,2),new h("ăm",-1,2),new h("arăm",65,1),new h("serăm",65,2),new h("aserăm",67,1),new h("seserăm",67,2),new h("iserăm",67,1),new h("userăm",67,1),new h("âserăm",67,1),new h("irăm",65,1),new h("urăm",65,1),new h("ârăm",65,1),new h("au",-1,1),new h("eau",76,1),new h("iau",76,1),new h("indu",-1,1),new h("ându",-1,1),new h("ez",-1,1),new h("ească",-1,1),new h("ară",-1,1),new h("seră",-1,2),new h("aseră",84,1),new h("seseră",84,2),new h("iseră",84,1),new h("useră",84,1),new h("âseră",84,1),new h("iră",-1,1),new h("ură",-1,1),new h("âră",-1,1),new h("ează",-1,1)],i=[new h("a",-1,1),new h("e",-1,1),new h("ie",1,1),new h("i",-1,1),new h("ă",-1,1)],m=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0,4],l=new z;function f(e,i){l.eq_s(1,e)&&(l.ket=l.cursor,l.in_grouping(m,97,259)&&l.slice_from(i))}function p(){if(l.out_grouping(m,97,259)){for(;!l.in_grouping(m,97,259);){if(l.cursor>=l.limit)return!0;l.cursor++}return!1}return!0}function d(){var e,i,r=l.cursor;if(l.in_grouping(m,97,259)){if(e=l.cursor,!p())return void(a=l.cursor);if(l.cursor=e,!function(){if(l.in_grouping(m,97,259))for(;!l.out_grouping(m,97,259);){if(l.cursor>=l.limit)return!0;l.cursor++}return!1}())return void(a=l.cursor)}l.cursor=r,l.out_grouping(m,97,259)&&(i=l.cursor,p()&&(l.cursor=i,l.in_grouping(m,97,259)&&l.cursor=l.limit)return!1;l.cursor++}for(;!l.out_grouping(m,97,259);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function v(){return t<=l.cursor}function _(){var e,i=l.limit-l.cursor;if(l.ket=l.cursor,(e=l.find_among_b(c,46))&&(l.bra=l.cursor,v())){switch(e){case 1:l.slice_from("abil");break;case 2:l.slice_from("ibil");break;case 3:l.slice_from("iv");break;case 4:l.slice_from("ic");break;case 5:l.slice_from("at");break;case 6:l.slice_from("it")}return r=!0,l.cursor=l.limit-i,!0}return!1}function g(){var e,i;for(r=!1;;)if(i=l.limit-l.cursor,!_()){l.cursor=l.limit-i;break}if(l.ket=l.cursor,(e=l.find_among_b(u,62))&&(l.bra=l.cursor,n<=l.cursor)){switch(e){case 1:l.slice_del();break;case 2:l.eq_s_b(1,"ţ")&&(l.bra=l.cursor,l.slice_from("t"));break;case 3:l.slice_from("ist")}r=!0}}function k(){var e;l.ket=l.cursor,(e=l.find_among_b(i,5))&&(l.bra=l.cursor,a<=l.cursor&&1==e&&l.slice_del())}this.setCurrent=function(e){l.setCurrent(e)},this.getCurrent=function(){return l.getCurrent()},this.stem=function(){var e,i=l.cursor;return function(){for(var e,i;e=l.cursor,l.in_grouping(m,97,259)&&(i=l.cursor,l.bra=i,f("u","U"),l.cursor=i,f("i","I")),l.cursor=e,!(l.cursor>=l.limit);)l.cursor++}(),l.cursor=i,e=l.cursor,a=l.limit,n=t=a,d(),l.cursor=e,b()&&(t=l.cursor,b()&&(n=l.cursor)),l.limit_backward=i,l.cursor=l.limit,function(){var e,i;if(l.ket=l.cursor,(e=l.find_among_b(s,16))&&(l.bra=l.cursor,v()))switch(e){case 1:l.slice_del();break;case 2:l.slice_from("a");break;case 3:l.slice_from("e");break;case 4:l.slice_from("i");break;case 5:i=l.limit-l.cursor,l.eq_s_b(2,"ab")||(l.cursor=l.limit-i,l.slice_from("i"));break;case 6:l.slice_from("at");break;case 7:l.slice_from("aţi")}}(),l.cursor=l.limit,g(),l.cursor=l.limit,r||(l.cursor=l.limit,function(){var e,i,r;if(l.cursor>=a){if(i=l.limit_backward,l.limit_backward=a,l.ket=l.cursor,e=l.find_among_b(w,94))switch(l.bra=l.cursor,e){case 1:if(r=l.limit-l.cursor,!l.out_grouping_b(m,97,259)&&(l.cursor=l.limit-r,!l.eq_s_b(1,"u")))break;case 2:l.slice_del()}l.limit_backward=i}}(),l.cursor=l.limit),k(),l.cursor=l.limit_backward,function(){for(var e;;){if(l.bra=l.cursor,e=l.find_among(o,3))switch(l.ket=l.cursor,e){case 1:l.slice_from("i");continue;case 2:l.slice_from("u");continue;case 3:if(l.cursor>=l.limit)break;l.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.ro.stemmer,"stemmer-ro"),e.ro.stopWordFilter=e.generateStopWordFilter("acea aceasta această aceea acei aceia acel acela acele acelea acest acesta aceste acestea aceşti aceştia acolo acord acum ai aia aibă aici al ale alea altceva altcineva am ar are asemenea asta astea astăzi asupra au avea avem aveţi azi aş aşadar aţi bine bucur bună ca care caut ce cel ceva chiar cinci cine cineva contra cu cum cumva curând curînd când cât câte câtva câţi cînd cît cîte cîtva cîţi că căci cărei căror cărui către da dacă dar datorită dată dau de deci deja deoarece departe deşi din dinaintea dintr- dintre doi doilea două drept după dă ea ei el ele eram este eu eşti face fata fi fie fiecare fii fim fiu fiţi frumos fără graţie halbă iar ieri la le li lor lui lângă lîngă mai mea mei mele mereu meu mi mie mine mult multă mulţi mulţumesc mâine mîine mă ne nevoie nici nicăieri nimeni nimeri nimic nişte noastre noastră noi noroc nostru nouă noştri nu opt ori oricare orice oricine oricum oricând oricât oricînd oricît oriunde patra patru patrulea pe pentru peste pic poate pot prea prima primul prin puţin puţina puţină până pînă rog sa sale sau se spate spre sub sunt suntem sunteţi sută sînt sîntem sînteţi să săi său ta tale te timp tine toate toată tot totuşi toţi trei treia treilea tu tăi tău un una unde undeva unei uneia unele uneori unii unor unora unu unui unuia unul vi voastre voastră voi vostru vouă voştri vreme vreo vreun vă zece zero zi zice îi îl îmi împotriva în înainte înaintea încotro încât încît între întrucât întrucît îţi ăla ălea ăsta ăstea ăştia şapte şase şi ştiu ţi ţie".split(" ")),e.Pipeline.registerFunction(e.ro.stopWordFilter,"stopWordFilter-ro")}}); \ No newline at end of file diff --git a/docs/v1.1.1/_static/javascripts/lunr/lunr.ru.js b/docs/v1.1.1/_static/javascripts/lunr/lunr.ru.js new file mode 100644 index 0000000000..ac99248044 --- /dev/null +++ b/docs/v1.1.1/_static/javascripts/lunr/lunr.ru.js @@ -0,0 +1 @@ +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var h,g,n;e.ru=function(){this.pipeline.reset(),this.pipeline.add(e.ru.trimmer,e.ru.stopWordFilter,e.ru.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ru.stemmer))},e.ru.wordCharacters="Ѐ-҄҇-ԯᴫᵸⷠ-ⷿꙀ-ꚟ︮︯",e.ru.trimmer=e.trimmerSupport.generateTrimmer(e.ru.wordCharacters),e.Pipeline.registerFunction(e.ru.trimmer,"trimmer-ru"),e.ru.stemmer=(h=e.stemmerSupport.Among,g=e.stemmerSupport.SnowballProgram,n=new function(){var n,e,r=[new h("в",-1,1),new h("ив",0,2),new h("ыв",0,2),new h("вши",-1,1),new h("ивши",3,2),new h("ывши",3,2),new h("вшись",-1,1),new h("ившись",6,2),new h("ывшись",6,2)],t=[new h("ее",-1,1),new h("ие",-1,1),new h("ое",-1,1),new h("ые",-1,1),new h("ими",-1,1),new h("ыми",-1,1),new h("ей",-1,1),new h("ий",-1,1),new h("ой",-1,1),new h("ый",-1,1),new h("ем",-1,1),new h("им",-1,1),new h("ом",-1,1),new h("ым",-1,1),new h("его",-1,1),new h("ого",-1,1),new h("ему",-1,1),new h("ому",-1,1),new h("их",-1,1),new h("ых",-1,1),new h("ею",-1,1),new h("ою",-1,1),new h("ую",-1,1),new h("юю",-1,1),new h("ая",-1,1),new h("яя",-1,1)],w=[new h("ем",-1,1),new h("нн",-1,1),new h("вш",-1,1),new h("ивш",2,2),new h("ывш",2,2),new h("щ",-1,1),new h("ющ",5,1),new h("ующ",6,2)],i=[new h("сь",-1,1),new h("ся",-1,1)],u=[new h("ла",-1,1),new h("ила",0,2),new h("ыла",0,2),new h("на",-1,1),new h("ена",3,2),new h("ете",-1,1),new h("ите",-1,2),new h("йте",-1,1),new h("ейте",7,2),new h("уйте",7,2),new h("ли",-1,1),new h("или",10,2),new h("ыли",10,2),new h("й",-1,1),new h("ей",13,2),new h("уй",13,2),new h("л",-1,1),new h("ил",16,2),new h("ыл",16,2),new h("ем",-1,1),new h("им",-1,2),new h("ым",-1,2),new h("н",-1,1),new h("ен",22,2),new h("ло",-1,1),new h("ило",24,2),new h("ыло",24,2),new h("но",-1,1),new h("ено",27,2),new h("нно",27,1),new h("ет",-1,1),new h("ует",30,2),new h("ит",-1,2),new h("ыт",-1,2),new h("ют",-1,1),new h("уют",34,2),new h("ят",-1,2),new h("ны",-1,1),new h("ены",37,2),new h("ть",-1,1),new h("ить",39,2),new h("ыть",39,2),new h("ешь",-1,1),new h("ишь",-1,2),new h("ю",-1,2),new h("ую",44,2)],s=[new h("а",-1,1),new h("ев",-1,1),new h("ов",-1,1),new h("е",-1,1),new h("ие",3,1),new h("ье",3,1),new h("и",-1,1),new h("еи",6,1),new h("ии",6,1),new h("ами",6,1),new h("ями",6,1),new h("иями",10,1),new h("й",-1,1),new h("ей",12,1),new h("ией",13,1),new h("ий",12,1),new h("ой",12,1),new h("ам",-1,1),new h("ем",-1,1),new h("ием",18,1),new h("ом",-1,1),new h("ям",-1,1),new h("иям",21,1),new h("о",-1,1),new h("у",-1,1),new h("ах",-1,1),new h("ях",-1,1),new h("иях",26,1),new h("ы",-1,1),new h("ь",-1,1),new h("ю",-1,1),new h("ию",30,1),new h("ью",30,1),new h("я",-1,1),new h("ия",33,1),new h("ья",33,1)],o=[new h("ост",-1,1),new h("ость",-1,1)],c=[new h("ейше",-1,1),new h("н",-1,2),new h("ейш",-1,1),new h("ь",-1,3)],m=[33,65,8,232],l=new g;function f(){for(;!l.in_grouping(m,1072,1103);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function a(){for(;!l.out_grouping(m,1072,1103);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function p(e,n){var r,t;if(l.ket=l.cursor,r=l.find_among_b(e,n)){switch(l.bra=l.cursor,r){case 1:if(t=l.limit-l.cursor,!l.eq_s_b(1,"а")&&(l.cursor=l.limit-t,!l.eq_s_b(1,"я")))return!1;case 2:l.slice_del()}return!0}return!1}function d(e,n){var r;return l.ket=l.cursor,!!(r=l.find_among_b(e,n))&&(l.bra=l.cursor,1==r&&l.slice_del(),!0)}function _(){return!!d(t,26)&&(p(w,8),!0)}function b(){var e;l.ket=l.cursor,(e=l.find_among_b(o,2))&&(l.bra=l.cursor,n<=l.cursor&&1==e&&l.slice_del())}this.setCurrent=function(e){l.setCurrent(e)},this.getCurrent=function(){return l.getCurrent()},this.stem=function(){return e=l.limit,n=e,f()&&(e=l.cursor,a()&&f()&&a()&&(n=l.cursor)),l.cursor=l.limit,!(l.cursor>3]&1<<(7&s))return this.cursor++,!0}return!1},in_grouping_b:function(r,t,i){if(this.cursor>this.limit_backward){var s=b.charCodeAt(this.cursor-1);if(s<=i&&t<=s&&r[(s-=t)>>3]&1<<(7&s))return this.cursor--,!0}return!1},out_grouping:function(r,t,i){if(this.cursor>3]&1<<(7&s)))return this.cursor++,!0}return!1},out_grouping_b:function(r,t,i){if(this.cursor>this.limit_backward){var s=b.charCodeAt(this.cursor-1);if(i>3]&1<<(7&s)))return this.cursor--,!0}return!1},eq_s:function(r,t){if(this.limit-this.cursor>1),a=0,f=u=(l=r[i]).s_size){if(this.cursor=e+l.s_size,!l.method)return l.result;var m=l.method();if(this.cursor=e+l.s_size,m)return l.result}if((i=l.substring_i)<0)return 0}},find_among_b:function(r,t){for(var i=0,s=t,e=this.cursor,n=this.limit_backward,u=0,o=0,h=!1;;){for(var c=i+(s-i>>1),a=0,f=u=(_=r[i]).s_size){if(this.cursor=e-_.s_size,!_.method)return _.result;var m=_.method();if(this.cursor=e-_.s_size,m)return _.result}if((i=_.substring_i)<0)return 0}},replace_s:function(r,t,i){var s=i.length-(t-r);return b=b.substring(0,r)+i+b.substring(t),this.limit+=s,this.cursor>=t?this.cursor+=s:this.cursor>r&&(this.cursor=r),s},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>b.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),b.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}}); \ No newline at end of file diff --git a/docs/v1.1.1/_static/javascripts/lunr/lunr.sv.js b/docs/v1.1.1/_static/javascripts/lunr/lunr.sv.js new file mode 100644 index 0000000000..6daf5f9d80 --- /dev/null +++ b/docs/v1.1.1/_static/javascripts/lunr/lunr.sv.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,l,n;e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=(r=e.stemmerSupport.Among,l=e.stemmerSupport.SnowballProgram,n=new function(){var n,t,i=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],s=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],a=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],o=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],u=[119,127,149],m=new l;this.setCurrent=function(e){m.setCurrent(e)},this.getCurrent=function(){return m.getCurrent()},this.stem=function(){var e,r=m.cursor;return function(){var e,r=m.cursor+3;if(t=m.limit,0<=r||r<=m.limit){for(n=r;;){if(e=m.cursor,m.in_grouping(o,97,246)){m.cursor=e;break}if(m.cursor=e,m.cursor>=m.limit)return;m.cursor++}for(;!m.out_grouping(o,97,246);){if(m.cursor>=m.limit)return;m.cursor++}(t=m.cursor)=t&&(m.limit_backward=t,m.cursor=m.limit,m.ket=m.cursor,e=m.find_among_b(i,37),m.limit_backward=r,e))switch(m.bra=m.cursor,e){case 1:m.slice_del();break;case 2:m.in_grouping_b(u,98,121)&&m.slice_del()}}(),m.cursor=m.limit,e=m.limit_backward,m.cursor>=t&&(m.limit_backward=t,m.cursor=m.limit,m.find_among_b(s,7)&&(m.cursor=m.limit,m.ket=m.cursor,m.cursor>m.limit_backward&&(m.bra=--m.cursor,m.slice_del())),m.limit_backward=e),m.cursor=m.limit,function(){var e,r;if(m.cursor>=t){if(r=m.limit_backward,m.limit_backward=t,m.cursor=m.limit,m.ket=m.cursor,e=m.find_among_b(a,5))switch(m.bra=m.cursor,e){case 1:m.slice_del();break;case 2:m.slice_from("lös");break;case 3:m.slice_from("full")}m.limit_backward=r}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}}); \ No newline at end of file diff --git a/docs/v1.1.1/_static/javascripts/lunr/lunr.th.js b/docs/v1.1.1/_static/javascripts/lunr/lunr.th.js new file mode 100644 index 0000000000..ee8ef373a0 --- /dev/null +++ b/docs/v1.1.1/_static/javascripts/lunr/lunr.th.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(t){if(void 0===t)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===t.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==t.version[0];t.th=function(){this.pipeline.reset(),this.pipeline.add(t.th.trimmer),i?this.tokenizer=t.th.tokenizer:(t.tokenizer&&(t.tokenizer=t.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=t.th.tokenizer))},t.th.wordCharacters="[฀-๿]",t.th.trimmer=t.trimmerSupport.generateTrimmer(t.th.wordCharacters),t.Pipeline.registerFunction(t.th.trimmer,"trimmer-th");var n=t.wordcut;n.init(),t.th.tokenizer=function(e){if(!arguments.length||null==e||null==e)return[];if(Array.isArray(e))return e.map(function(e){return i?new t.Token(e):e});var r=e.toString().replace(/^\s+/,"");return n.cut(r).split("|")}}}); \ No newline at end of file diff --git a/docs/v1.1.1/_static/javascripts/lunr/lunr.tr.js b/docs/v1.1.1/_static/javascripts/lunr/lunr.tr.js new file mode 100644 index 0000000000..e8fb5a7df6 --- /dev/null +++ b/docs/v1.1.1/_static/javascripts/lunr/lunr.tr.js @@ -0,0 +1 @@ +!function(r,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var mr,dr,i;r.tr=function(){this.pipeline.reset(),this.pipeline.add(r.tr.trimmer,r.tr.stopWordFilter,r.tr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(r.tr.stemmer))},r.tr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.tr.trimmer=r.trimmerSupport.generateTrimmer(r.tr.wordCharacters),r.Pipeline.registerFunction(r.tr.trimmer,"trimmer-tr"),r.tr.stemmer=(mr=r.stemmerSupport.Among,dr=r.stemmerSupport.SnowballProgram,i=new function(){var t,r=[new mr("m",-1,-1),new mr("n",-1,-1),new mr("miz",-1,-1),new mr("niz",-1,-1),new mr("muz",-1,-1),new mr("nuz",-1,-1),new mr("müz",-1,-1),new mr("nüz",-1,-1),new mr("mız",-1,-1),new mr("nız",-1,-1)],i=[new mr("leri",-1,-1),new mr("ları",-1,-1)],e=[new mr("ni",-1,-1),new mr("nu",-1,-1),new mr("nü",-1,-1),new mr("nı",-1,-1)],n=[new mr("in",-1,-1),new mr("un",-1,-1),new mr("ün",-1,-1),new mr("ın",-1,-1)],u=[new mr("a",-1,-1),new mr("e",-1,-1)],o=[new mr("na",-1,-1),new mr("ne",-1,-1)],s=[new mr("da",-1,-1),new mr("ta",-1,-1),new mr("de",-1,-1),new mr("te",-1,-1)],c=[new mr("nda",-1,-1),new mr("nde",-1,-1)],l=[new mr("dan",-1,-1),new mr("tan",-1,-1),new mr("den",-1,-1),new mr("ten",-1,-1)],a=[new mr("ndan",-1,-1),new mr("nden",-1,-1)],m=[new mr("la",-1,-1),new mr("le",-1,-1)],d=[new mr("ca",-1,-1),new mr("ce",-1,-1)],f=[new mr("im",-1,-1),new mr("um",-1,-1),new mr("üm",-1,-1),new mr("ım",-1,-1)],b=[new mr("sin",-1,-1),new mr("sun",-1,-1),new mr("sün",-1,-1),new mr("sın",-1,-1)],w=[new mr("iz",-1,-1),new mr("uz",-1,-1),new mr("üz",-1,-1),new mr("ız",-1,-1)],_=[new mr("siniz",-1,-1),new mr("sunuz",-1,-1),new mr("sünüz",-1,-1),new mr("sınız",-1,-1)],k=[new mr("lar",-1,-1),new mr("ler",-1,-1)],p=[new mr("niz",-1,-1),new mr("nuz",-1,-1),new mr("nüz",-1,-1),new mr("nız",-1,-1)],g=[new mr("dir",-1,-1),new mr("tir",-1,-1),new mr("dur",-1,-1),new mr("tur",-1,-1),new mr("dür",-1,-1),new mr("tür",-1,-1),new mr("dır",-1,-1),new mr("tır",-1,-1)],y=[new mr("casına",-1,-1),new mr("cesine",-1,-1)],z=[new mr("di",-1,-1),new mr("ti",-1,-1),new mr("dik",-1,-1),new mr("tik",-1,-1),new mr("duk",-1,-1),new mr("tuk",-1,-1),new mr("dük",-1,-1),new mr("tük",-1,-1),new mr("dık",-1,-1),new mr("tık",-1,-1),new mr("dim",-1,-1),new mr("tim",-1,-1),new mr("dum",-1,-1),new mr("tum",-1,-1),new mr("düm",-1,-1),new mr("tüm",-1,-1),new mr("dım",-1,-1),new mr("tım",-1,-1),new mr("din",-1,-1),new mr("tin",-1,-1),new mr("dun",-1,-1),new mr("tun",-1,-1),new mr("dün",-1,-1),new mr("tün",-1,-1),new mr("dın",-1,-1),new mr("tın",-1,-1),new mr("du",-1,-1),new mr("tu",-1,-1),new mr("dü",-1,-1),new mr("tü",-1,-1),new mr("dı",-1,-1),new mr("tı",-1,-1)],h=[new mr("sa",-1,-1),new mr("se",-1,-1),new mr("sak",-1,-1),new mr("sek",-1,-1),new mr("sam",-1,-1),new mr("sem",-1,-1),new mr("san",-1,-1),new mr("sen",-1,-1)],v=[new mr("miş",-1,-1),new mr("muş",-1,-1),new mr("müş",-1,-1),new mr("mış",-1,-1)],q=[new mr("b",-1,1),new mr("c",-1,2),new mr("d",-1,3),new mr("ğ",-1,4)],C=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,8,0,0,0,0,0,0,1],P=[1,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,1],F=[65],S=[65],W=[["a",[1,64,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],97,305],["e",[17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130],101,252],["ı",[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],97,305],["i",[17],101,105],["o",F,111,117],["ö",S,246,252],["u",F,111,117]],L=new dr;function x(r,i,e){for(;;){var n=L.limit-L.cursor;if(L.in_grouping_b(r,i,e)){L.cursor=L.limit-n;break}if(L.cursor=L.limit-n,L.cursor<=L.limit_backward)return!1;L.cursor--}return!0}function A(){var r,i;r=L.limit-L.cursor,x(C,97,305);for(var e=0;eL.limit_backward&&(L.cursor--,e=L.limit-L.cursor,i()))?(L.cursor=L.limit-e,!0):(L.cursor=L.limit-n,r()?(L.cursor=L.limit-n,!1):(L.cursor=L.limit-n,!(L.cursor<=L.limit_backward)&&(L.cursor--,!!i()&&(L.cursor=L.limit-n,!0))))}function j(r){return E(r,function(){return L.in_grouping_b(C,97,305)})}function T(){return j(function(){return L.eq_s_b(1,"n")})}function Z(){return j(function(){return L.eq_s_b(1,"y")})}function B(){return L.find_among_b(r,10)&&E(function(){return L.in_grouping_b(P,105,305)},function(){return L.out_grouping_b(C,97,305)})}function D(){return A()&&L.in_grouping_b(P,105,305)&&j(function(){return L.eq_s_b(1,"s")})}function G(){return L.find_among_b(i,2)}function H(){return A()&&L.find_among_b(n,4)&&T()}function I(){return A()&&L.find_among_b(s,4)}function J(){return A()&&L.find_among_b(c,2)}function K(){return A()&&L.find_among_b(f,4)&&Z()}function M(){return A()&&L.find_among_b(b,4)}function N(){return A()&&L.find_among_b(w,4)&&Z()}function O(){return L.find_among_b(_,4)}function Q(){return A()&&L.find_among_b(k,2)}function R(){return A()&&L.find_among_b(g,8)}function U(){return A()&&L.find_among_b(z,32)&&Z()}function V(){return L.find_among_b(h,8)&&Z()}function X(){return A()&&L.find_among_b(v,4)&&Z()}function Y(){var r=L.limit-L.cursor;return!(X()||(L.cursor=L.limit-r,U()||(L.cursor=L.limit-r,V()||(L.cursor=L.limit-r,L.eq_s_b(3,"ken")&&Z()))))}function $(){if(L.find_among_b(y,2)){var r=L.limit-L.cursor;if(O()||(L.cursor=L.limit-r,Q()||(L.cursor=L.limit-r,K()||(L.cursor=L.limit-r,M()||(L.cursor=L.limit-r,N()||(L.cursor=L.limit-r))))),X())return!1}return!0}function rr(){if(!A()||!L.find_among_b(p,4))return!0;var r=L.limit-L.cursor;return!U()&&(L.cursor=L.limit-r,!V())}function ir(){var r,i,e,n=L.limit-L.cursor;if(L.ket=L.cursor,t=!0,Y()&&(L.cursor=L.limit-n,$()&&(L.cursor=L.limit-n,function(){if(Q()){L.bra=L.cursor,L.slice_del();var r=L.limit-L.cursor;return L.ket=L.cursor,R()||(L.cursor=L.limit-r,U()||(L.cursor=L.limit-r,V()||(L.cursor=L.limit-r,X()||(L.cursor=L.limit-r)))),t=!1}return!0}()&&(L.cursor=L.limit-n,rr()&&(L.cursor=L.limit-n,e=L.limit-L.cursor,!(O()||(L.cursor=L.limit-e,N()||(L.cursor=L.limit-e,M()||(L.cursor=L.limit-e,K()))))||(L.bra=L.cursor,L.slice_del(),i=L.limit-L.cursor,L.ket=L.cursor,X()||(L.cursor=L.limit-i),0)))))){if(L.cursor=L.limit-n,!R())return;L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,r=L.limit-L.cursor,O()||(L.cursor=L.limit-r,Q()||(L.cursor=L.limit-r,K()||(L.cursor=L.limit-r,M()||(L.cursor=L.limit-r,N()||(L.cursor=L.limit-r))))),X()||(L.cursor=L.limit-r)}L.bra=L.cursor,L.slice_del()}function er(){var r,i,e,n;if(L.ket=L.cursor,L.eq_s_b(2,"ki")){if(r=L.limit-L.cursor,I())return L.bra=L.cursor,L.slice_del(),i=L.limit-L.cursor,L.ket=L.cursor,Q()?(L.bra=L.cursor,L.slice_del(),er()):(L.cursor=L.limit-i,B()&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er()))),!0;if(L.cursor=L.limit-r,H()){if(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,e=L.limit-L.cursor,G())L.bra=L.cursor,L.slice_del();else{if(L.cursor=L.limit-e,L.ket=L.cursor,!B()&&(L.cursor=L.limit-e,!D()&&(L.cursor=L.limit-e,!er())))return!0;L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())}return!0}if(L.cursor=L.limit-r,J()){if(n=L.limit-L.cursor,G())L.bra=L.cursor,L.slice_del();else if(L.cursor=L.limit-n,D())L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er());else if(L.cursor=L.limit-n,!er())return!1;return!0}}return!1}function nr(r){if(L.ket=L.cursor,!J()&&(L.cursor=L.limit-r,!A()||!L.find_among_b(o,2)))return!1;var i=L.limit-L.cursor;if(G())L.bra=L.cursor,L.slice_del();else if(L.cursor=L.limit-i,D())L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er());else if(L.cursor=L.limit-i,!er())return!1;return!0}function tr(r){if(L.ket=L.cursor,!(A()&&L.find_among_b(a,2)||(L.cursor=L.limit-r,A()&&L.find_among_b(e,4))))return!1;var i=L.limit-L.cursor;return!(!D()&&(L.cursor=L.limit-i,!G()))&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er()),!0)}function ur(){var r,i=L.limit-L.cursor;return L.ket=L.cursor,!!(H()||(L.cursor=L.limit-i,A()&&L.find_among_b(m,2)&&Z()))&&(L.bra=L.cursor,L.slice_del(),r=L.limit-L.cursor,L.ket=L.cursor,!(!Q()||(L.bra=L.cursor,L.slice_del(),!er()))||(L.cursor=L.limit-r,L.ket=L.cursor,(B()||(L.cursor=L.limit-r,D()||(L.cursor=L.limit-r,er())))&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())),!0))}function or(){var r,i,e=L.limit-L.cursor;if(L.ket=L.cursor,!(I()||(L.cursor=L.limit-e,A()&&L.in_grouping_b(P,105,305)&&Z()||(L.cursor=L.limit-e,A()&&L.find_among_b(u,2)&&Z()))))return!1;if(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,r=L.limit-L.cursor,B())L.bra=L.cursor,L.slice_del(),i=L.limit-L.cursor,L.ket=L.cursor,Q()||(L.cursor=L.limit-i);else if(L.cursor=L.limit-r,!Q())return!0;return L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,er(),!0}function sr(){var r,i,e=L.limit-L.cursor;if(L.ket=L.cursor,Q())return L.bra=L.cursor,L.slice_del(),void er();if(L.cursor=L.limit-e,L.ket=L.cursor,A()&&L.find_among_b(d,2)&&T())if(L.bra=L.cursor,L.slice_del(),r=L.limit-L.cursor,L.ket=L.cursor,G())L.bra=L.cursor,L.slice_del();else{if(L.cursor=L.limit-r,L.ket=L.cursor,!B()&&(L.cursor=L.limit-r,!D())){if(L.cursor=L.limit-r,L.ket=L.cursor,!Q())return;if(L.bra=L.cursor,L.slice_del(),!er())return}L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())}else if(L.cursor=L.limit-e,!nr(e)&&(L.cursor=L.limit-e,!tr(e))){if(L.cursor=L.limit-e,L.ket=L.cursor,A()&&L.find_among_b(l,4))return L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,i=L.limit-L.cursor,void(B()?(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())):(L.cursor=L.limit-i,Q()?(L.bra=L.cursor,L.slice_del()):L.cursor=L.limit-i,er()));if(L.cursor=L.limit-e,!ur()){if(L.cursor=L.limit-e,G())return L.bra=L.cursor,void L.slice_del();L.cursor=L.limit-e,er()||(L.cursor=L.limit-e,or()||(L.cursor=L.limit-e,L.ket=L.cursor,(B()||(L.cursor=L.limit-e,D()))&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er()))))}}}function cr(r,i,e){if(L.cursor=L.limit-r,function(){for(;;){var r=L.limit-L.cursor;if(L.in_grouping_b(C,97,305)){L.cursor=L.limit-r;break}if(L.cursor=L.limit-r,L.cursor<=L.limit_backward)return!1;L.cursor--}return!0}()){var n=L.limit-L.cursor;if(!L.eq_s_b(1,i)&&(L.cursor=L.limit-n,!L.eq_s_b(1,e)))return!0;L.cursor=L.limit-r;var t=L.cursor;return L.insert(L.cursor,L.cursor,e),L.cursor=t,!1}return!0}function lr(r,i,e){for(;!L.eq_s(i,e);){if(L.cursor>=L.limit)return!0;L.cursor++}return i!=L.limit||(L.cursor=r,!1)}function ar(){var r,i,e=L.cursor;return!(!lr(r=L.cursor,2,"ad")||!lr(L.cursor=r,5,"soyad"))&&(L.limit_backward=e,L.cursor=L.limit,i=L.limit-L.cursor,(L.eq_s_b(1,"d")||(L.cursor=L.limit-i,L.eq_s_b(1,"g")))&&cr(i,"a","ı")&&cr(i,"e","i")&&cr(i,"o","u")&&cr(i,"ö","ü"),L.cursor=L.limit,function(){var r;if(L.ket=L.cursor,r=L.find_among_b(q,4))switch(L.bra=L.cursor,r){case 1:L.slice_from("p");break;case 2:L.slice_from("ç");break;case 3:L.slice_from("t");break;case 4:L.slice_from("k")}}(),!0)}this.setCurrent=function(r){L.setCurrent(r)},this.getCurrent=function(){return L.getCurrent()},this.stem=function(){return!!(function(){for(var r,i=L.cursor,e=2;;){for(r=L.cursor;!L.in_grouping(C,97,305);){if(L.cursor>=L.limit)return L.cursor=r,!(0e&&(this._events[n].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[n].length),"function"==typeof console.trace&&console.trace()));return this},r.prototype.once=function(n,t){if(!a(t))throw TypeError("listener must be a function");var e=!1;function r(){this.removeListener(n,r),e||(e=!0,t.apply(this,arguments))}return r.listener=t,this.on(n,r),this},r.prototype.removeListener=function(n,t){var e,r,i,o;if(!a(t))throw TypeError("listener must be a function");if(!this._events||!this._events[n])return this;if(i=(e=this._events[n]).length,r=-1,e===t||a(e.listener)&&e.listener===t)delete this._events[n],this._events.removeListener&&this.emit("removeListener",n,t);else if(c(e)){for(o=i;0this.maxLength)return i();if(!this.stat&&p(this.cache,o)){var t=this.cache[o];if(Array.isArray(t)&&(t="DIR"),!n||"DIR"===t)return i(null,t);if(n&&"FILE"===t)return i()}var e=this.statCache[o];if(void 0!==e){if(!1===e)return i(null,e);var s=e.isDirectory()?"DIR":"FILE";return n&&"FILE"===s?i():i(null,s,e)}var a=this,c=d("stat\0"+o,function(n,e){{if(e&&e.isSymbolicLink())return u.stat(o,function(n,t){n?a._stat2(r,o,null,e,i):a._stat2(r,o,n,t,i)});a._stat2(r,o,n,e,i)}});c&&u.lstat(o,c)},b.prototype._stat2=function(n,t,e,r,i){if(e)return this.statCache[t]=!1,i();var o="/"===n.slice(-1);if(this.statCache[t]=r,"/"===t.slice(-1)&&!r.isDirectory())return i(null,!1,r);var s=r.isDirectory()?"DIR":"FILE";return this.cache[t]=this.cache[t]||s,o&&"DIR"!==s?i():i(null,s,r)}}).call(this,_("_process"))},{"./common.js":15,"./sync.js":17,_process:24,assert:9,events:14,fs:12,inflight:18,inherits:19,minimatch:20,once:21,path:22,"path-is-absolute":23,util:28}],17:[function(e,r,n){(function(i){(r.exports=n).GlobSync=h;var s=e("fs"),c=e("minimatch"),g=(c.Minimatch,e("./glob.js").Glob,e("util"),e("path")),u=e("assert"),l=e("path-is-absolute"),t=e("./common.js"),o=(t.alphasort,t.alphasorti,t.setopts),a=t.ownProp,f=t.childrenIgnored;function n(n,t){if("function"==typeof t||3===arguments.length)throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");return new h(n,t).found}function h(n,t){if(!n)throw new Error("must provide pattern");if("function"==typeof t||3===arguments.length)throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");if(!(this instanceof h))return new h(n,t);if(o(this,n,t),this.noprocess)return this;var e=this.minimatch.set.length;this.matches=new Array(e);for(var r=0;rthis.maxLength)return!1;if(!this.stat&&a(this.cache,t)){var r=this.cache[t];if(Array.isArray(r)&&(r="DIR"),!e||"DIR"===r)return r;if(e&&"FILE"===r)return!1}var i=this.statCache[t];if(!i){var o;try{o=s.lstatSync(t)}catch(n){return!1}if(o.isSymbolicLink())try{i=s.statSync(t)}catch(n){i=o}else i=o}r=(this.statCache[t]=i).isDirectory()?"DIR":"FILE";return this.cache[t]=this.cache[t]||r,(!e||"DIR"===r)&&r},h.prototype._mark=function(n){return t.mark(this,n)},h.prototype._makeAbs=function(n){return t.makeAbs(this,n)}}).call(this,e("_process"))},{"./common.js":15,"./glob.js":16,_process:24,assert:9,fs:12,minimatch:20,path:22,"path-is-absolute":23,util:28}],18:[function(t,r,n){(function(s){var n=t("wrappy"),a=Object.create(null),e=t("once");r.exports=n(function(n,t){return a[n]?(a[n].push(t),null):(a[n]=[t],o=n,e(function n(){var t=a[o],e=t.length,r=function(n){for(var t=n.length,e=[],r=0;re?(t.splice(0,e),s.nextTick(function(){n.apply(null,r)})):delete a[o]}}));var o})}).call(this,t("_process"))},{_process:24,once:21,wrappy:29}],19:[function(n,t,e){"function"==typeof Object.create?t.exports=function(n,t){n.super_=t,n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(n,t){n.super_=t;var e=function(){};e.prototype=t.prototype,n.prototype=new e,n.prototype.constructor=n}},{}],20:[function(n,t,e){(t.exports=s).Minimatch=i;var u={sep:"/"};try{u=n("path")}catch(n){}var M=s.GLOBSTAR=i.GLOBSTAR={},r=n("brace-expansion"),C={"!":{open:"(?:(?!(?:",close:"))[^/]*?)"},"?":{open:"(?:",close:")?"},"+":{open:"(?:",close:")+"},"*":{open:"(?:",close:")*"},"@":{open:"(?:",close:")"}},P="[^/]",z=P+"*?",B="().*{}+?[]^$\\!".split("").reduce(function(n,t){return n[t]=!0,n},{});var l=/\/+/;function o(t,e){t=t||{},e=e||{};var r={};return Object.keys(e).forEach(function(n){r[n]=e[n]}),Object.keys(t).forEach(function(n){r[n]=t[n]}),r}function s(n,t,e){if("string"!=typeof t)throw new TypeError("glob pattern string required");return e||(e={}),!(!e.nocomment&&"#"===t.charAt(0))&&(""===t.trim()?""===n:new i(t,e).match(n))}function i(n,t){if(!(this instanceof i))return new i(n,t);if("string"!=typeof n)throw new TypeError("glob pattern string required");t||(t={}),n=n.trim(),"/"!==u.sep&&(n=n.split(u.sep).join("/")),this.options=t,this.set=[],this.pattern=n,this.regexp=null,this.negate=!1,this.comment=!1,this.empty=!1,this.make()}function a(n,t){if(t||(t=this instanceof i?this.options:{}),void 0===(n=void 0===n?this.pattern:n))throw new TypeError("undefined pattern");return t.nobrace||!n.match(/\{.*\}/)?[n]:r(n)}s.filter=function(r,i){return i=i||{},function(n,t,e){return s(n,r,i)}},s.defaults=function(r){if(!r||!Object.keys(r).length)return s;var i=s,n=function(n,t,e){return i.minimatch(n,t,o(r,e))};return n.Minimatch=function(n,t){return new i.Minimatch(n,o(r,t))},n},i.defaults=function(n){return n&&Object.keys(n).length?s.defaults(n).Minimatch:i},i.prototype.debug=function(){},i.prototype.make=function(){if(this._made)return;var n=this.pattern,t=this.options;if(!t.nocomment&&"#"===n.charAt(0))return void(this.comment=!0);if(!n)return void(this.empty=!0);this.parseNegate();var e=this.globSet=this.braceExpand();t.debug&&(this.debug=console.error);this.debug(this.pattern,e),e=this.globParts=e.map(function(n){return n.split(l)}),this.debug(this.pattern,e),e=e.map(function(n,t,e){return n.map(this.parse,this)},this),this.debug(this.pattern,e),e=e.filter(function(n){return-1===n.indexOf(!1)}),this.debug(this.pattern,e),this.set=e},i.prototype.parseNegate=function(){var n=this.pattern,t=!1,e=this.options,r=0;if(e.nonegate)return;for(var i=0,o=n.length;i>> no match, partial?",n,f,t,h),f!==s))}if("string"==typeof u?(c=r.nocase?l.toLowerCase()===u.toLowerCase():l===u,this.debug("string match",u,l,c)):(c=l.match(u),this.debug("pattern match",u,l,c)),!c)return!1}if(i===s&&o===a)return!0;if(i===s)return e;if(o===a)return i===s-1&&""===n[i];throw new Error("wtf?")}},{"brace-expansion":11,path:22}],21:[function(n,t,e){var r=n("wrappy");function i(n){var t=function(){return t.called?t.value:(t.called=!0,t.value=n.apply(this,arguments))};return t.called=!1,t}function o(n){var t=function(){if(t.called)throw new Error(t.onceError);return t.called=!0,t.value=n.apply(this,arguments)},e=n.name||"Function wrapped with `once`";return t.onceError=e+" shouldn't be called more than once",t.called=!1,t}t.exports=r(i),t.exports.strict=r(o),i.proto=i(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return i(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return o(this)},configurable:!0})})},{wrappy:29}],22:[function(n,t,u){(function(i){function o(n,t){for(var e=0,r=n.length-1;0<=r;r--){var i=n[r];"."===i?n.splice(r,1):".."===i?(n.splice(r,1),e++):e&&(n.splice(r,1),e--)}if(t)for(;e--;e)n.unshift("..");return n}var t=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,s=function(n){return t.exec(n).slice(1)};function a(n,t){if(n.filter)return n.filter(t);for(var e=[],r=0;r":">",'"':""","'":"'","`":"`"},D=d.invert(N),F=function(t){var e=function(n){return t[n]},n="(?:"+d.keys(t).join("|")+")",r=RegExp(n),i=RegExp(n,"g");return function(n){return n=null==n?"":""+n,r.test(n)?n.replace(i,e):n}};d.escape=F(N),d.unescape=F(D),d.result=function(n,t,e){var r=null==n?void 0:n[t];return void 0===r&&(r=e),d.isFunction(r)?r.call(n):r};var M=0;d.uniqueId=function(n){var t=++M+"";return n?n+t:t},d.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var C=/(.)^/,P={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},z=/\\|'|\r|\n|\u2028|\u2029/g,B=function(n){return"\\"+P[n]};d.template=function(o,n,t){!n&&t&&(n=t),n=d.defaults({},n,d.templateSettings);var e=RegExp([(n.escape||C).source,(n.interpolate||C).source,(n.evaluate||C).source].join("|")+"|$","g"),s=0,a="__p+='";o.replace(e,function(n,t,e,r,i){return a+=o.slice(s,i).replace(z,B),s=i+n.length,t?a+="'+\n((__t=("+t+"))==null?'':_.escape(__t))+\n'":e?a+="'+\n((__t=("+e+"))==null?'':__t)+\n'":r&&(a+="';\n"+r+"\n__p+='"),n}),a+="';\n",n.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{var r=new Function(n.variable||"obj","_",a)}catch(n){throw n.source=a,n}var i=function(n){return r.call(this,n,d)},c=n.variable||"obj";return i.source="function("+c+"){\n"+a+"}",i},d.chain=function(n){var t=d(n);return t._chain=!0,t};var U=function(n,t){return n._chain?d(t).chain():t};d.mixin=function(e){d.each(d.functions(e),function(n){var t=d[n]=e[n];d.prototype[n]=function(){var n=[this._wrapped];return i.apply(n,arguments),U(this,t.apply(d,n))}})},d.mixin(d),d.each(["pop","push","reverse","shift","sort","splice","unshift"],function(t){var e=r[t];d.prototype[t]=function(){var n=this._wrapped;return e.apply(n,arguments),"shift"!==t&&"splice"!==t||0!==n.length||delete n[0],U(this,n)}}),d.each(["concat","join","slice"],function(n){var t=r[n];d.prototype[n]=function(){return U(this,t.apply(this._wrapped,arguments))}}),d.prototype.value=function(){return this._wrapped},d.prototype.valueOf=d.prototype.toJSON=d.prototype.value,d.prototype.toString=function(){return""+this._wrapped}}).call(this)},{}],26:[function(n,t,e){arguments[4][19][0].apply(e,arguments)},{dup:19}],27:[function(n,t,e){t.exports=function(n){return n&&"object"==typeof n&&"function"==typeof n.copy&&"function"==typeof n.fill&&"function"==typeof n.readUInt8}},{}],28:[function(h,n,k){(function(r,i){var a=/%[sdj%]/g;k.format=function(n){if(!_(n)){for(var t=[],e=0;e elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.5.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.5 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2020-03-14 + */ +( function( window ) { +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[ i ] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] + // or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + nonHex : + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android<4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + + // Can't trust NodeList.length + while ( ( target[ j++ ] = els[ i++ ] ) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split( "|" ), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[ i ] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( ( cur = cur.nextSibling ) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return ( name === "input" || name === "button" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem.namespaceURI, + docElem = ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find[ "TAG" ] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll( "[name=d]" ).length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + } ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + } : + function( a, b ) { + if ( b ) { + while ( ( b = b.parentNode ) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == preferredDoc && + contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document || b.ownerDocument == preferredDoc && + contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( ( cur = cur.parentNode ) ) { + ap.unshift( cur ); + } + cur = b; + while ( ( cur = cur.parentNode ) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[ i ] === bp[ i ] ) { + i++; + } + + return i ? + + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[ i ], bp[ i ] ) : + + // Otherwise nodes in our document sort first + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || + match[ 5 ] || "" ).replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( + className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + /* eslint-disable max-len */ + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + /* eslint-enable max-len */ + + }; + }, + + "CHILD": function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + "not": markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element (issue #299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + "has": markFunction( function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + } ), + + "contains": markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && + ( !document.hasFocus || document.hasFocus() ) && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); + }, + + "selected": function( elem ) { + + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos[ "empty" ]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo( function() { + return [ 0 ]; + } ), + + "last": createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + "even": createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "odd": createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rcombinators.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( + selector || "*", + context.nodeType ? [ context ] : context, + [] + ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens + .slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( + selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) + ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find[ "ID" ]( token.matches[ 0 ] + .replace( runescape, funescape ), context ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || + context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + } ); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert( function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + } ); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; + } + } ); +} + +return Sizzle; + +} )( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + return result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px"; + tr.style.height = "1px"; + trChild.style.height = "9px"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( + dataPriv.get( cur, "events" ) || Object.create( null ) + )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script + if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

torchtrtc

+

torchtrtc is a CLI application for using the Torch-TensorRT compiler. It serves as an easy way to compile a +TorchScript Module with Torch-TensorRT from the command-line to quickly check support or as part of +a deployment pipeline. All basic features of the compiler are supported including post training +quantization (though you must already have a calibration cache file to use the PTQ feature). The compiler can +output two formats, either a TorchScript program with the TensorRT engine embedded or +the TensorRT engine itself as a PLAN file.

+

All that is required to run the program after compilation is for C++ linking against libtorchtrt.so +or in Python importing the torch_tensorrt package. All other aspects of using compiled modules are identical +to standard TorchScript. Load with torch.jit.load() and run like you would run any other module.

+
torchtrtc [input_file_path] [output_file_path]
+  [input_specs...] {OPTIONS}
+
+  torchtrtc is a compiler for TorchScript, it will compile and optimize
+  TorchScript programs to run on NVIDIA GPUs using TensorRT
+
+OPTIONS:
+
+    -h, --help                        Display this help menu
+    Verbiosity of the compiler
+      -v, --verbose                     Dumps debugging information about the
+                                        compilation process onto the console
+      -w, --warnings                    Disables warnings generated during
+                                        compilation onto the console (warnings
+                                        are on by default)
+      --i, --info                       Dumps info messages generated during
+                                        compilation onto the console
+    --build-debuggable-engine         Creates a debuggable engine
+    --allow-gpu-fallback              (Only used when targeting DLA
+                                      (device-type)) Lets engine run layers on
+                                      GPU if they are not supported on DLA
+    --require-full-compilation        Require that the model should be fully
+                                      compiled to TensorRT or throw an error
+    --check-method-support=[method_name]
+                                      Check the support for end to end
+                                      compilation of a specified method in the
+                                      TorchScript module
+    --disable-tf32                    Prevent Float32 layers from using the
+                                      TF32 data format
+    --sparse-weights                  Enable sparsity for weights of conv and
+                                      FC layers
+    -p[precision...],
+    --enable-precision=[precision...] (Repeatable) Enabling an operating
+                                      precision for kernels to use when
+                                      building the engine (Int8 requires a
+                                      calibration-cache argument) [ float |
+                                      float32 | f32 | fp32 | half | float16 |
+                                      f16 | fp16 | int8 | i8 | char ]
+                                      (default: float)
+    -d[type], --device-type=[type]    The type of device the engine should be
+                                      built for [ gpu | dla ] (default: gpu)
+    --gpu-id=[gpu_id]                 GPU id if running on multi-GPU platform
+                                      (defaults to 0)
+    --dla-core=[dla_core]             DLACore id if running on available DLA
+                                      (defaults to 0)
+    --engine-capability=[capability]  The type of device the engine should be
+                                      built for [ standard | safety |
+                                      dla_standalone ]
+    --calibration-cache-file=[file_path]
+                                      Path to calibration cache file to use
+                                      for post training quantization
+    --teo=[op_name...],
+    --torch-executed-op=[op_name...]  (Repeatable) Operator in the graph that
+                                      should always be run in PyTorch for
+                                      execution (partial compilation must be
+                                      enabled)
+    --tem=[module_name...],
+    --torch-executed-mod=[module_name...]
+                                      (Repeatable) Module that should always
+                                      be run in Pytorch for execution (partial
+                                      compilation must be enabled)
+    --mbs=[num_ops],
+    --min-block-size=[num_ops]        Minimum number of contiguous TensorRT
+                                      supported ops to compile a subgraph to
+                                      TensorRT
+    --embed-engine                    Whether to treat input file as a
+                                      serialized TensorRT engine and embed it
+                                      into a TorchScript module (device spec
+                                      must be provided)
+    --num-avg-timing-iters=[num_iters]
+                                      Number of averaging timing iterations
+                                      used to select kernels
+    --workspace-size=[workspace_size] Maximum size of workspace given to
+                                      TensorRT
+    --dla-sram-size=[dla_sram_size]   Fast software managed RAM used by DLA
+                                      to communicate within a layer.
+    --dla-local-dram-size=[dla_local_dram_size]  Host RAM used by DLA to share
+                                      intermediate tensor data across operations.
+    --dla-global-dram-size=[dla_global_dram_size] Host RAM used by DLA to store
+                                      weights and metadata for execution
+    --atol=[atol]                     Absolute tolerance threshold for acceptable
+                                      numerical deviation from standard torchscript
+                                      output (default 1e-8)
+    --rtol=[rtol]                     Relative tolerance threshold for acceptable
+                                      numerical deviation from standard torchscript
+                                      output  (default 1e-5)
+    --no-threshold-check              Skip checking threshold compliance
+    --truncate-long-double,
+    --truncate, --truncate-64bit      Truncate weights that are provided in
+                                      64bit to 32bit (Long, Double to Int,
+                                      Float)
+    --save-engine                     Instead of compiling a full a
+                                      TorchScript program, save the created
+                                      engine to the path specified as the
+                                      output path
+    --custom-torch-ops                (repeatable) Shared object/DLL containing custom torch operators
+    --custom-converters               (repeatable) Shared object/DLL containing custom converters
+    input_file_path                   Path to input TorchScript file
+    output_file_path                  Path for compiled TorchScript (or
+                                      TensorRT engine) file
+    input_specs...                    Specs for inputs to engine, can either
+                                      be a single size or a range defined by
+                                      Min, Optimal, Max sizes, e.g.
+                                      "(N,..,C,H,W)"
+                                      "[(MIN_N,..,MIN_C,MIN_H,MIN_W);(OPT_N,..,OPT_C,OPT_H,OPT_W);(MAX_N,..,MAX_C,MAX_H,MAX_W)]".
+                                      Data Type and format can be specified by
+                                      adding an "@" followed by dtype and "%"
+                                      followed by format to the end of the
+                                      shape spec. e.g. "(3, 3, 32,
+                                      32)@f16%NHWC"
+    "--" can be used to terminate flag options and force all following
+    arguments to be treated as positional options
+
+
+

e.g.

+
torchtrtc tests/modules/ssd_traced.jit.pt ssd_trt.ts "[(1,3,300,300); (1,3,512,512); (1, 3, 1024, 1024)]@f16%contiguous" -p f16
+
+
+

To run with custom torch operators +.. code-block:: shell +torchtrtc tests/modules/ssd_traced.jit.pt ssd_trt.ts –custom-torch-ops=<path to custom library> “[(1,3,300,300); (1,3,512,512); (1, 3, 1024, 1024)]@fp16%contiguous” -p f16

+

To run with custom converters +.. code-block:: shell +torchtrtc tests/modules/ssd_traced.jit.pt ssd_trt.ts –custom-converters=<path to custom library> “[(1,3,300,300); (1,3,512,512); (1, 3, 1024, 1024)]@fp16%contiguous” -p f16

+
+ + +
+ +
+ + +
+
+ +
+
+
+ + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/contributors/conversion.html b/docs/v1.1.1/contributors/conversion.html new file mode 100644 index 0000000000..19d1041650 --- /dev/null +++ b/docs/v1.1.1/contributors/conversion.html @@ -0,0 +1,712 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Conversion Phase — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ Conversion Phase + + ¶ + +

+

+ Once the graph has be simplified to a form thats easy to convert, we then set up a conversion context +to manage the construction of a TensorRT + + + INetworkDefinition + + + from the blocks nodes. The conversion context +records the set of converted nodes, block inputs and outputs and other information about the conversion +of the graph. This data is then used to help converters link together layers and also hold build time +information like weights required to construct the engine. After the context is created, the block +converter starts iterating through the list of nodes, for each node, the converter will look at its +inputs and assemble an array of resources to pass to the converter. Inputs can be in a couple of states: +

+
    +
  • +

    + The input is a block parameter +

    +
      +
    • +

      + In this case the input should have already been stored in as an IValue in the +conversion context + + + evaluated_value_map + + + . The conversion stage will add the IValue to the list of args for the +converter +

      +
    • +
    +
  • +
  • +

    + The input is an output of a node that has already been converted +

    +
      +
    • +

      + In this case the ITensor of the output has added to the + + + value_tensor_map + + + , +The conversion stage will add the ITensor to the list of args for the converter +

      +
    • +
    +
  • +
  • +

    + The input is from a node that produces a static value +

    +
      +
    • +

      + There are nodes that produce static values, typically used to store parameters for operators, we need to +evaluate these nodes at conversion time to be able to convert a op. The conversion system will look for a node +evaluator in the evaluator registry and run it on the node. The IValue produced will be entered in the +conversion context + + + evaluated_value_map + + + and added to the list of args for the converter. If the node +to be evaluated takes inputs, the conversion stage will recursively resolve dependencies until the final +static value has been evaluated +

      +
    • +
    +
  • +
  • +

    + The input is from a node that has not been converted +

    +
      +
    • +

      + Torch-TensorRT will error out here +

      +
    • +
    +
  • +
+

+ Node Evaluation + + ¶ + +

+

+ There are some nodes that contain static data and are resources for operations. These can be evaluated at +conversion time so that you can use those values when doing node conversion. In theory any node kind can have +a conversion time evaluator as long as it produces a static IValue, This IValue will be stored in the conversion +context so it can be consumed by any node that takes the evaluated node as an input. Common node types are + + + prim::Constant + + + which emits a constant and + + + prim::ListConstruct + + + which makes lists. +

+

+ Node Converters + + ¶ + +

+

+ Node converters map JIT nodes to layers or subgraphs of layers. They then associate outputs from the JIT graph +and the TRT graph together in the conversion context. This allows the conversion stage to assemble the inputs +for the next node. There are some cases where a node produces an output that is not a Tensor but a static result +from a calculation done on inputs which need to be converted first. In this case the converter may associate the outputs in +the + + + evaluated_value_map + + + instead of the + + + value_tensor_map + + + . For more information take a look at: + + + Writing Converters + + +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/contributors/lowering.html b/docs/v1.1.1/contributors/lowering.html new file mode 100644 index 0000000000..37d9f6b5b1 --- /dev/null +++ b/docs/v1.1.1/contributors/lowering.html @@ -0,0 +1,1224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Lowering Phase — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Lowering Phase + + ¶ + +

+

+ The lowering phase is made up out of passes which are operations which map a graph from a high level representation +to a lower level one. Each pass does something specific for instance inlining method calls. The idea is to +significantly reduce what the conversion phase needs to be able to handle when actually mapping to TensorRT. +We aim for closer to 1->1 op conversion vs looking for applicable subgraphs, limiting the number of converters and +reduce the scope of each converter. +

+

+ You can see the effects of each pass by setting the log level to + + + Level::kGraph + + +

+

+ Passes Used + + ¶ + +

+

+ EliminateCommonSubexpression + + ¶ + +

+
+ +
+

+ Removes common subexpressions in the graph +

+

+ Eliminate Dead Code + + ¶ + +

+
+ +
+

+ Dead code elimination will check if a node has side effects and not delete it if it does. +

+

+ Eliminate Exeception Or Pass Pattern + + ¶ + +

+
+ +
+

+ A common pattern in scripted modules are dimension gaurds which will throw execptions if +the input dimension is not what was expected. +

+
+
+
%1013 : bool = aten::ne(%1012, %24) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/batchnorm.py:248:11
+    = prim::If(%1013) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/batchnorm.py:248:8
+    block0():
+        = prim::RaiseException(%23) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/batchnorm.py:249:12
+    -> ()
+    block1():
+    -> ()
+
+
+
+

+ Since we are resolving all of this at compile time and there are no execptions in the TensorRT graph, we just remove it. +

+

+ Eliminate Redundant Gaurds + + ¶ + +

+
+ +
+

+ Eliminate redundant guards for ops whose outputs are fully determined by their inputs i.e. if inputs to such ops are +guarded we are allowed to remove a guard on ops’ outputs +

+

+ Freeze Module + + ¶ + +

+
+ +
+

+ Freeze attributes and inline constants and modules. Propogates constants in the graph. +

+

+ Fuse AddMM Branches + + ¶ + +

+
+ +
+

+ A common pattern in scripted modules is tensors of different dimensions use different constructions for implementing linear layers. We fuse these +different varients into a single one that will get caught by the Unpack AddMM pass. +

+
+
+
%ret : Tensor = prim::If(%622)
+block0():
+  %ret.1 : Tensor = aten::addmm(%self.fc.bias, %x9.1, %3677, %3, %3)
+  -> (%ret.1)
+block1():
+  %output.1 : Tensor = aten::matmul(%x9.1, %3677)
+  %output0.1 : Tensor = aten::add_(%output.1, %self.fc.bias, %3)
+  -> (%output0.1)
+
+
+
+

+ We fuse this set of blocks into a graph like this: +

+
+
+
%ret : Tensor = aten::addmm(%self.fc.bias, %x9.1, %3677, %3, %3)
+
+
+
+

+ Fuse Linear + + ¶ + +

+
+ +
+

+ Match the + + + aten::linear + + + pattern and fuse it into a single + + + aten::linear + + + This pass fuse the addmm or matmul + add generated by JIT back to linear +

+

+ Fuse Flatten Linear + + ¶ + +

+
+ +
+

+ TensorRT implicity flattens input layers into fully connected layers when they are higher than 1D. So when there is a + + + aten::flatten + + + -> + + + aten::linear + + + pattern we remove the + + + aten::flatten + + + . +

+

+ Lower Graph + + ¶ + +

+
+ +
+

+ Given a graph with of a method which first argument is %self, lower it to a graph where +all attributes accesses are replaced with explicit inputs of the graph +(rather than results of prim::GetAttr executed on %self). Returns a tuple +(graph, parameters) where the last module.parameters.size() inputs to the +graph are the trainable parameters used in this method. The remaining inputs +are the true inputs to the function. +

+

+ Lower Tuples + + ¶ + +

+
+ +
+
    +
  • +

    + + + LowerSimpleTuples + + + : +

    +
  • +
+

+ Removes tuples where TupleConstruct and TupleUnpack are matched but leaves tuples in place across if statements, loops, and as inputs/outputs +

+
    +
  • +

    + + + LowerAllTuples + + + : +

    +
  • +
+

+ Removes _all_ tuples and raises an error if some cannot be removed, this is used by ONNX to ensure there are not tuples before conversion, but will not work on graphs whose inputs contain tuples. +

+

+ Module Fallback + + ¶ + +

+
+ +
+

+ Module fallback consists of two lowering passes that must be run as a pair. The first pass is run before freezing to place delimiters in the graph around modules +that should run in PyTorch. The second pass marks nodes between these delimiters after freezing to signify they should run in PyTorch. +

+
    +
  • +

    + + + NotateModuleForFallback + + +

    +
  • +
+

+ Places delimiting nodes around module calls pre freezing to signify where in the graph nodes should run in PyTorch +

+
    +
  • +

    + + + MarkNodesForFallback + + +

    +
  • +
+

+ Looks for delimiters then marks all nodes between the delimiters to tell partitioning to run them in PyTorch +

+

+ Peephole Optimze + + ¶ + +

+
+ +
+

+ The intent for this optimization pass is to catch all of the small, easy to catch peephole optimizations you might be interested in doing. +

+
+
+ Right now, it does: +
+
+
    +
  • +

    + Eliminate no-op ‘expand’ nodes +

    +
  • +
  • +

    + Simply x.t().t() to x +

    +
  • +
+
+
+

+ Remove Contiguous + + ¶ + +

+
+ +
+

+ Removes contiguous operators since we are doing TensorRT memory is already contiguous. +

+

+ Remove Dropout + + ¶ + +

+
+ +
+

+ Removes dropout operators since we are doing inference. +

+

+ Remove To + + ¶ + +

+
+ +
+

+ Removes + + + aten::to + + + operators that do casting, since TensorRT mangages it itself. It is important that this is one of the last passes run so that +other passes have a change to move required cast operators out of the main namespace. +

+

+ Unpack AddMM + + ¶ + +

+
+ +
+

+ Unpacks + + + aten::addmm + + + into + + + aten::matmul + + + and + + + aten::add_ + + + (with an additional + + + trt::const + + + op to freeze the bias in the TensorRT graph). This lets us reuse the + + + aten::matmul + + + and + + + aten::add_ + + + converters instead of needing a dedicated converter. +

+

+ Unpack LogSoftmax + + ¶ + +

+
+ +
+

+ Unpacks + + + aten::logsoftmax + + + into + + + aten::softmax + + + and + + + aten::log + + + . This lets us reuse the + + + aten::softmax + + + and + + + aten::log + + + converters instead of needing a dedicated converter. +

+

+ Unroll Loops + + ¶ + +

+
+ +
+

+ Unrolls the operations of compatable loops (e.g. sufficently short) so that you only have to go through the loop once. +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/contributors/partitioning.html b/docs/v1.1.1/contributors/partitioning.html new file mode 100644 index 0000000000..5c1512cbe0 --- /dev/null +++ b/docs/v1.1.1/contributors/partitioning.html @@ -0,0 +1,550 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Partitioning Phase — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ Partitioning Phase + + ¶ + +

+

+ The phase is optional and enabled by the user. It instructs the compiler to separate nodes into ones that should run in PyTorch and ones that should run in TensorRT. +Criteria for separation include: Lack of a converter, operator is explicitly set to run in PyTorch by the user or the node has a flag which tells partitioning to +run in PyTorch by the module fallback passes. +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/contributors/phases.html b/docs/v1.1.1/contributors/phases.html new file mode 100644 index 0000000000..603e72413d --- /dev/null +++ b/docs/v1.1.1/contributors/phases.html @@ -0,0 +1,616 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Compiler Phases — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+

+ Compiler Phases + + ¶ + +

+
+
+

+ Lowering + + ¶ + +

+

+ + + Lowering Phase + + +

+

+ The lowering is made up of a set of passes (some from PyTorch and some specific to Torch-TensorRT) +run over the graph IR to map the large PyTorch opset to a reduced opset that is easier to convert to +TensorRT. +

+

+ Partitioning + + ¶ + +

+

+ + + Partitioning Phase + + +

+

+ The phase is optional and enabled by the user. It instructs the compiler to separate nodes into ones that should run in PyTorch and ones that should run in TensorRT. +Criteria for separation include: Lack of a converter, operator is explicitly set to run in PyTorch by the user or the node has a flag which tells partitioning to +run in PyTorch by the module fallback passes. +

+

+ Conversion + + ¶ + +

+

+ + + Conversion Phase + + +

+

+ In the conversion phase we traverse the lowered graph and construct an equivalent TensorRT graph. +The conversion phase is made up of three main components, a context to manage compile time data, +a evaluator library which will execute operations that can be resolved at compile time and a converter +library which maps an op from JIT to TensorRT. +

+

+ Compilation and Runtime + + ¶ + +

+

+ + + Deploying Torch-TensorRT Programs + + +

+

+ The final compilation phase constructs a TorchScript program to run the converted TensorRT engine. It +takes a serialized engine and instantiates it within a engine manager, then the compiler will +build out a JIT graph that references this engine and wraps it in a module to return to the user. +When the user executes the module, the JIT program run in the JIT runtime extended by Torch-TensorRT with the data providied from the user. +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/contributors/runtime.html b/docs/v1.1.1/contributors/runtime.html new file mode 100644 index 0000000000..c85df80839 --- /dev/null +++ b/docs/v1.1.1/contributors/runtime.html @@ -0,0 +1,753 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Runtime Phase — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Runtime Phase + + ¶ + +

+

+ The Runtime phase is responsible for constructing self standing TorchScript graphs with embedded TensorRT engines and serving as the runtime +when these engines are called. The main interface accepts a serialized TensorRT engine. The execution phase +will deserialize and wrap this engine in a class which maintains a execution context for each engine +and some metadata about its inputs and outputs and is compatable with the TorchScript interpreter so that +it can be moved around and used like other TorchScript IValues. The engine is run by providing it and inputs +to the + + + tensorrt::execute_engine + + + operator which will take the engine and its inputs and return the results of engine exeuction. +

+

+ Background + + ¶ + +

+

+ PyTorch JIT’s runtime is based around a stack machine, all operators pop off arguments from the stack, pass them to +some implementation of the operator then push results back onto the stack. The actual elements of the stack +are + + + torch::jit::IValues + + + , the same type we evaluate in the conversion phase (the realization of the abstract +torch::jit::Value type). +

+

+ TensorRT Engine Executor Op + + ¶ + +

+

+ When the Torch-TensorRT is loaded, it registers an operator in the PyTorch JIT operator library called + + + trt::execute_engine(Tensor[] + + + inputs, + + + __torch__.torch.classes.tensorrt.Engine + + + engine) + + + -> + + + Tensor[] + + + which takes an +instantiated engine and list of inputs. Compiled graphs store this engine in an attribute so that it is portable and serializable. +When the op is called, an instnantiated engine and input tensors are popped off the runtime stack. These inputs are passed into a generic engine execution function which +will run the tensors through the TensorRT engine and return new tensors as results. These tensors are pushed on to the +stack so that the next op whatever it is can use it. +

+

+ Constructing the Resulting Graph + + ¶ + +

+

+ Once the engine is deserialized and instantiated, the compiler will construct a graph that will execute the engine when the module is called. +Here is an example: +

+
+
+
graph(%self_1 : __torch__.torchvision.models.resnet.___torch_mangle_4847.ResNet_trt,
+  %input_0 : Tensor):
+    %1 : __torch__.torch.classes.tensorrt.Engine = prim::GetAttr[name="__torch___torchvision_models_resnet____torch_mangle_4847_ResNet_trt_engine"](%self_1)
+    %3 : Tensor[] = prim::ListConstruct(%input_0)
+    %4 : Tensor[] = trt::execute_engine(%3, %1)
+    %5 : Tensor = prim::ListUnpack(%4)
+return (%5)
+
+
+
+

+ You can see the engine attribute in the graph and the + + + trt::execute_engine + + + op taking a list of input tensors and an engine in +and produces a list of output tensors which is returned. When + + + forward + + + is called on the module this graph is executed, thereby +running the TensorRT engine. +

+

+ In the case of multiple outputs, the compiled graph may repack output tensors into a Tuple to return back to the user. +

+
+
+
graph(%self_1 : __torch__.PyTorch.Detection.SSD.src.model.SSD300_trt,
+  %input_0 : Tensor):
+    %1 : __torch__.torch.classes.tensorrt.Engine = prim::GetAttr[name="__torch___PyTorch_Detection_SSD_src_model_SSD300_trt_engine"](%self_1)
+    %3 : Tensor[] = prim::ListConstruct(%input_0)
+    %4 : Tensor[] = trt::execute_engine(%3, %1)
+    %5 : Tensor, %6 : Tensor = prim::ListUnpack(%4)
+    %7 : (Tensor, Tensor) = prim::TupleConstruct(%5, %6)
+return (%7)
+
+
+
+

+ Serialization and Deserialization + + ¶ + +

+

+ Serialization and deserialization of TensorRT engines embedded in TorchScript graphs are handled by the holder class for the engine and TorchBind. +When a TorchScript module is saved, the pickler will run serilization on the cuda engine and store the serialized engine in the zip file created. +When deserializing, the depickler will call a constructor for the engine holder class with the serialized engine so that it can be set up again for +execution. +

+

+ ABI Versioning and Serialization Format + + ¶ + +

+

+ Torch-TensorRT programs are standard TorchScript with TensorRT engines as objects embedded in the graph. Therefore there is a serialization format +for the TensorRT engines. The format for Torch-TensorRT serialized programs are versioned with an “ABI” version which tells the runtime about runtime compatibility. +

+

+ > Current ABI version is 3 +

+

+ The format is a vector of serialized strings. They encode the following information +

+
    +
  • +

    + ABI Version for the program +

    +
  • +
  • +

    + Name of the TRT engine +

    +
  • +
  • +

    + Device information: Includes the target device the engine was built on, SM capability and other device information. This information is used at deserialization time to select the correct device to run the engine +

    +
  • +
  • +

    + Serialized TensorRT engine +

    +
  • +
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/contributors/system_overview.html b/docs/v1.1.1/contributors/system_overview.html new file mode 100644 index 0000000000..acde91b1c0 --- /dev/null +++ b/docs/v1.1.1/contributors/system_overview.html @@ -0,0 +1,780 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + System Overview — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ System Overview + + ¶ + +

+

+ Torch-TensorRT is primarily a C++ Library with a Python API planned. We use Bazel as our build system and target Linux x86_64 and +Linux aarch64 (only natively) right now. The compiler we use is GCC 7.5.0 and the library is untested with compilers before that +version so there may be compilation errors if you try to use an older compiler. +

+

+ The repository is structured into: +

+
    +
  • +

    + core: Main compiler source code +

    +
  • +
  • +

    + cpp: C++ API +

    +
  • +
  • +

    + tests: tests of the C++ API, the core and converters +

    +
  • +
  • +

    + py: Python API +

    +
  • +
  • +

    + notebooks: Example applications built with Torch-TensorRT +

    +
  • +
  • +

    + docs: Documentation +

    +
  • +
  • +

    + docsrc: Documentation Source +

    +
  • +
  • +

    + third_party: BUILD files for dependency libraries +

    +
  • +
  • +

    + toolchains: Toolchains for different platforms +

    +
  • +
+

+ The C++ API is unstable and subject to change until the library matures, though most work is done under the hood in the core. +

+

+ The core has a couple major parts: The top level compiler interface which coordinates ingesting a module, lowering, +converting and generating a new module and returning it back to the user. There are the three main phases of the +compiler, the lowering phase, the conversion phase, and the execution phase. +

+

+ Compiler Phases + + ¶ + +

+
+
+

+ Lowering + + ¶ + +

+

+ + + Lowering Phase + + +

+

+ The lowering is made up of a set of passes (some from PyTorch and some specific to Torch-TensorRT) +run over the graph IR to map the large PyTorch opset to a reduced opset that is easier to convert to +TensorRT. +

+

+ Partitioning + + ¶ + +

+

+ + + Partitioning Phase + + +

+

+ The phase is optional and enabled by the user. It instructs the compiler to separate nodes into ones that should run in PyTorch and ones that should run in TensorRT. +Criteria for separation include: Lack of a converter, operator is explicitly set to run in PyTorch by the user or the node has a flag which tells partitioning to +run in PyTorch by the module fallback passes. +

+

+ Conversion + + ¶ + +

+

+ + + Conversion Phase + + +

+

+ In the conversion phase we traverse the lowered graph and construct an equivalent TensorRT graph. +The conversion phase is made up of three main components, a context to manage compile time data, +a evaluator library which will execute operations that can be resolved at compile time and a converter +library which maps an op from JIT to TensorRT. +

+

+ Compilation and Runtime + + ¶ + +

+

+ + + Deploying Torch-TensorRT Programs + + +

+

+ The final compilation phase constructs a TorchScript program to run the converted TensorRT engine. It +takes a serialized engine and instantiates it within a engine manager, then the compiler will +build out a JIT graph that references this engine and wraps it in a module to return to the user. +When the user executes the module, the JIT program run in the JIT runtime extended by Torch-TensorRT with the data providied from the user. +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/contributors/useful_links.html b/docs/v1.1.1/contributors/useful_links.html new file mode 100644 index 0000000000..9670d62f32 --- /dev/null +++ b/docs/v1.1.1/contributors/useful_links.html @@ -0,0 +1,727 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Useful Links for Torch-TensorRT Development — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Useful Links for Torch-TensorRT Development + + ¶ + +

+

+ TensorRT Available Layers and Expected Dimensions + + ¶ + +

+ +

+ TensorRT C++ Documentation + + ¶ + +

+ +

+ TensorRT Python Documentation (Sometimes easier to read) + + ¶ + +

+ +

+ PyTorch Functional API + + ¶ + +

+ +

+ PyTorch native_ops + + ¶ + +

+ +

+ PyTorch IR Documentation + + ¶ + +

+ +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/contributors/writing_converters.html b/docs/v1.1.1/contributors/writing_converters.html new file mode 100644 index 0000000000..25875590a0 --- /dev/null +++ b/docs/v1.1.1/contributors/writing_converters.html @@ -0,0 +1,986 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Writing Converters — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Writing Converters + + ¶ + +

+

+ Background + + ¶ + +

+

+ In the JIT IR, operations are represented as nodes in a graph. A node has inputs and outputs, represented by + + + torch::jit::Values + + + which are typed abstract representation of data flowing into and out of a node. TensorRT represents its graph though the +use of + + + nvinfer1::ILayers + + + and + + + nvinfer1::ITensors + + + which are its analogues to nodes and values. The goal of +converters create new ILayers and subgraphs that do operation specified by the node and associate produced ITensors +and Values together. +

+

+ Converters + + ¶ + +

+

+ Converters should be functions which will use a list of inputs (either + + + nvinfer1::ITensors + + + or + + + torch::jit::IValues + + + ) to +construct an equivalent layer to the LibTorch op. +

+

+ Converters can be registered using the + + + RegisterNodeConversionPatterns + + + helper class where you instantiate a +RegisterNodeConversionPatterns object and call the pattern function on it (like below) which takes a string +which describes the function schema of the op that will cause the converter to be run and a lambda or function +which will do the actual conversion: +

+
+
+

+ Note the pattern function can be chained +

+
+
+
+
+
auto acthardtanh TORCHTRT_UNUSED = RegisterNodeConversionPatterns()
+    .pattern({
+        "aten::hardtanh(Tensor self, Scalar min_val=-1, Scalar max_val=1) -> (Tensor)",
+        [](ConversionCtx* ctx, const torch::jit::Node* n, args& args) -> bool {
+            auto in = args[0].ITensor();
+            auto min = args[1].unwrapToDouble();
+            auto max = args[2].unwrapToDouble();
+
+            auto new_layer = ctx->net->addActivation(*in, nvinfer1::ActivationType::kCLIP);
+            TORCHTRT_CHECK(new_layer, "Unable to create layer for aten::hardtanh");
+
+            new_layer->setAlpha(min);
+            new_layer->setBeta(max);
+
+            new_layer->setName(util::node_info(n).c_str());
+            auto out_tensor = ctx->AssociateValueAndTensor(n->outputs()[0], new_layer->getOutput(0));
+
+            LOG_DEBUG("Output shape: " << out_tensor->getDimensions());
+            return true;
+        }
+    });
+
+
+
+

+ Converter Contract + + ¶ + +

+

+ What is guaranteed to converters + + ¶ + +

+
    +
  1. +

    + In the args there will be an entry for each node input value, either a ITensor or IValue +

    +
  2. +
  3. +

    + Inputs will be provided in order according to the function schema +

    +
  4. +
+

+ Responsibilities of a converter + + ¶ + +

+
    +
  1. +

    + Args must be guaranteed to be a type to unwrap the Arg union without checking, typically input tensor arguments can be expected to be ITensors +

    +
  2. +
  3. +

    + Any weights or static values must guaranteed to be valid until the end of conversion time +

    +
      +
    1. +

      + A helpful tool is the Weights helper class described below +

      +
    2. +
    +
  4. +
  5. +

    + Converters are expected to produce an IValue or ITensor for each output of a node. The compiler will check this and produce warnings if there are Values that don’t have associated ITensors or IValues. +

    +
  6. +
  7. +

    + Outputs must be annotated +

    +
      +
    1. +

      + There must be an association between a JIT nodes output values and the new TRT layers output tensors in the + + + value_tensor_map + + + in the conversion context +

      +
    2. +
    +
  8. +
  9. +

    + Name your layers +

    +
      +
    1. +

      + Its much easier to debug when we can track which layers and nodes correspond with each other. The system we are currently using is to use the “node info” of the node as the name of the layer +

      +
    2. +
    +
  10. +
  11. +

    + Name your tensors +

    +
      +
    1. +

      + Use the output value debug name as the name for the new ITensor (again for debugging) +

      +
    2. +
    +
  12. +
+

+ Conversion Context + + ¶ + +

+

+ The conversion context maintains the state of conversion, it manages the Network Definition, two maps +one that stores associations between Values and IValues (the evaluated_value_map) and one that stores +associations between Values and ITensors, and any sort of memory that needs to live until the end of +conversion. The main apis that you will interface with in converters is directly accessing the network +definition to add layers + + + ctx->net + + + and data association functions + + + ctx->AssociateValueAndTensor() + + + and + + + ctx->AssociateValueAndIValue() + + + , which you will use to add layers to the TRT layers and log +pairs of node outputs and static values or TensorRT layer outputs. +

+

+ Args + + ¶ + +

+

+ Arguments provided to the converter are inspectable unions of + + + nvinfer1::ITensors + + + and + + + torch::jit::IValues + + + (i.e. +abstract dataflow in the TensorRT graph and static values). You are guaranteed that you will have some +argument for each input value for the node. They are provided in the order of the function schema. +It can be expected that inputs (meaning the parameters that would be passed into the forward +function of a module in PyTorch) will be ITensors but the Arg class also has mechanisms to inspect arguments safely +before unwrapping if you are unsure. Args also have deep unwrap methods that let you get straight to the +underlying data in an IValue if you know it’s safe. You can also pass in a fallback value if there is a +chance the IValue is None. IValues have been extended to be able to hold a wrapper around ITensors only in the case of TensorLists. +You can get an ITensor from an IValue by a pattern similar to this: + + + ivalue.toCustomClass<TensorContainer>()->tensor() + + + . +You can tell if an IValue contains a Tensor or an ITensor by using + + + ivalue.isTensor() + + + or + + + ivalue.isCustomClass() + + + . +

+

+ Weights + + ¶ + +

+

+ Weights are used during build time, so any weights need to be guaranteed to live until the end of the conversion phase. +TensorRT also uses its own weights structure to hold the weights. There is a wrapper around this class available +to converts which abstracts a lot of this. +

+

+ The weights wrapper class can accept either + + + at::Tensors + + + or singular values (right now). You also need to pass the +conversion context when constructing these weights because internally the weights class will allocate memory managed +by the conversion context to store a copy of the tensor data. This data gets freed when the conversion context +destructor gets destroyed so converters don’t really need to think about it. +

+

+ There is metadata generated from the shape of the input data which becomes useful in interfacing with TensorRT, such +as number of input maps, number of output maps and kernel shape. +

+

+ Other advice + + ¶ + +

+

+ You have the benefit of the full aten library when dealing with weights and other static values. This means that you +can do quite a bit of work during conversion time to produce efficient conversion. A good example is batch_norm +converter where the converter does fusion of operations with PyTorch before creating the TensorRT layer. +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/genindex.html b/docs/v1.1.1/genindex.html new file mode 100644 index 0000000000..6057580262 --- /dev/null +++ b/docs/v1.1.1/genindex.html @@ -0,0 +1,1371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Index — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

+ Index +

+ +

+ D +

+ + + + +
+ +
+

+ P +

+ + + + +
+ +
+

+ R +

+ + + + + +
+ + + +
+

+ S +

+ + + + +
+ +
+

+ T +

+ + + + + +
+ + + +
+

+ W +

+ + + + +
+ +
+

+ X +

+ + + + +
+ +
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/getting_started/getting_started_with_cpp_api.html b/docs/v1.1.1/getting_started/getting_started_with_cpp_api.html new file mode 100644 index 0000000000..a0135d5aa7 --- /dev/null +++ b/docs/v1.1.1/getting_started/getting_started_with_cpp_api.html @@ -0,0 +1,935 @@ + + + + + + + + + + + + + Using Torch-TensorRT in C++ — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Using Torch-TensorRT in C++
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Using Torch-TensorRT in C++

+

If you haven’t already, acquire a tarball of the library by following the instructions in Installation

+
+

Using Torch-TensorRT in C++

+

Torch-TensorRT C++ API accepts TorchScript modules (generated either from torch.jit.script or torch.jit.trace) as an input and returns +a Torchscript module (optimized using TensorRT). This requires users to use Pytorch (in python) to generate torchscript modules beforehand. +Please refer to Creating TorchScript modules in Python section to generate torchscript graphs.

+
+

[Torch-TensorRT Quickstart] Compiling TorchScript Modules with torchtrtc

+

An easy way to get started with Torch-TensorRT and to check if your model can be supported without extra work is to run it through +torchtrtc, which supports almost all features of the compiler from the command line including post training quantization +(given a previously created calibration cache). For example we can compile our lenet model by setting our preferred operating +precision and input size. This new TorchScript file can be loaded into Python (note: you need to import torch_tensorrt before loading +these compiled modules because the compiler extends the PyTorch the deserializer and runtime to execute compiled modules).

+
❯ torchtrtc -p f16 lenet_scripted.ts trt_lenet_scripted.ts "(1,1,32,32)"
+
+❯ python3
+Python 3.6.9 (default, Apr 18 2020, 01:56:04)
+[GCC 8.4.0] on linux
+Type "help", "copyright", "credits" or "license" for more information.
+>>> import torch
+>>> import torch_tensorrt
+>>> ts_model = torch.jit.load(“trt_lenet_scripted.ts”)
+>>> ts_model(torch.randn((1,1,32,32)).to(“cuda”).half())
+
+
+

You can learn more about torchtrtc usage here: torchtrtc

+
+
+

Working with TorchScript in C++

+

If we are developing an application to deploy with C++, we can save either our traced or scripted module using torch.jit.save +which will serialize the TorchScript code, weights and other information into a package. This is also where our dependency on Python ends.

+
torch_script_module.save("lenet.jit.pt")
+
+
+

From here we can now load our TorchScript module in C++

+
#include <torch/script.h> // One-stop header.
+
+#include <iostream>
+#include <memory>
+
+int main(int argc, const char* argv[]) {
+    torch::jit::Module module;
+    try {
+        // Deserialize the ScriptModule from a file using torch::jit::load().
+        module = torch::jit::load("<PATH TO SAVED TS MOD>");
+    }
+    catch (const c10::Error& e) {
+        std::cerr << "error loading the model\n";
+        return -1;
+    }
+
+    std::cout << "ok\n";
+
+
+

You can do full training and inference in C++ with PyTorch / LibTorch if you would like, you can even define your modules in C++ and +have access to the same powerful tensor library that backs PyTorch. (For more information: https://pytorch.org/cppdocs/). +For instance we can do inference with our LeNet module like this:

+
mod.eval();
+torch::Tensor in = torch::randn({1, 1, 32, 32});
+auto out = mod.forward(in);
+
+
+

and to run on the GPU:

+
mod.eval();
+mod.to(torch::kCUDA);
+torch::Tensor in = torch::randn({1, 1, 32, 32}, torch::kCUDA);
+auto out = mod.forward(in);
+
+
+

As you can see it is pretty similar to the Python API. When you call the forward method, you invoke the PyTorch JIT compiler, which will optimize and run your TorchScript code.

+
+
+

Compiling with Torch-TensorRT in C++

+

We are also at the point were we can compile and optimize our module with Torch-TensorRT, but instead of in a JIT fashion we must do it ahead-of-time (AOT) i.e. before we start doing actual inference work +since it takes a bit of time to optimize the module, it would not make sense to do this every time you run the module or even the first time you run it.

+

With our module loaded, we can feed it into the Torch-TensorRT compiler. When we do so we must provide some information on the expected input size and also configure any additional settings.

+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+...
+
+    mod.to(at::kCUDA);
+    mod.eval();
+
+    auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA});
+    auto trt_mod = torch_tensorrt::CompileGraph(mod, std::vector<torch_tensorrt::CompileSpec::InputRange>{{in.sizes()}});
+    auto out = trt_mod.forward({in});
+
+
+

Thats it! Now the graph runs primarily not with the JIT compiler but using TensorRT (though we execute the graph using the JIT runtime).

+

We can also set settings like operating precision to run in FP16.

+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+...
+
+    mod.to(at::kCUDA);
+    mod.eval();
+
+    auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}).to(torch::kHALF);
+    auto input_sizes = std::vector<torch_tensorrt::CompileSpec::InputRange>({in.sizes()});
+    torch_tensorrt::CompileSpec info(input_sizes);
+    info.enable_precisions.insert(torch::kHALF);
+    auto trt_mod = torch_tensorrt::CompileGraph(mod, info);
+    auto out = trt_mod.forward({in});
+
+
+

And now we are running the module in FP16 precision. You can then save the module to load later.

+
trt_mod.save("<PATH TO SAVED TRT/TS MOD>")
+
+
+

Torch-TensorRT compiled TorchScript modules are loaded in the same way as normal TorchScript module. Make sure your deployment application is linked against libtorchtrt.so

+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+
+int main(int argc, const char* argv[]) {
+    torch::jit::Module module;
+    try {
+        // Deserialize the ScriptModule from a file using torch::jit::load().
+        module = torch::jit::load("<PATH TO SAVED TRT/TS MOD>");
+    }
+    catch (const c10::Error& e) {
+        std::cerr << "error loading the model\n";
+        return -1;
+    }
+
+    torch::Tensor in = torch::randn({1, 1, 32, 32}, torch::kCUDA);
+    auto out = mod.forward(in);
+
+    std::cout << "ok\n";
+}
+
+
+

If you want to save the engine produced by Torch-TensorRT to use in a TensorRT application you can use the ConvertGraphToTRTEngine API.

+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+...
+
+    mod.to(at::kCUDA);
+    mod.eval();
+
+    auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}).to(torch::kHALF);
+    auto input_sizes = std::vector<torch_tensorrt::CompileSpec::InputRange>({in.sizes()});
+    torch_tensorrt::CompileSpec info(input_sizes);
+    info.enabled_precisions.insert(torch::kHALF);
+    auto trt_mod = torch_tensorrt::ConvertGraphToTRTEngine(mod, "forward", info);
+    std::ofstream out("/tmp/engine_converted_from_jit.trt");
+    out << engine;
+    out.close();
+
+
+
+
+

Under The Hood

+

When a module is provided to Torch-TensorRT, the compiler starts by mapping a graph like you saw above to a graph like this:

+
graph(%input.2 : Tensor):
+    %2 : Float(84, 10) = prim::Constant[value=<Tensor>]()
+    %3 : Float(120, 84) = prim::Constant[value=<Tensor>]()
+    %4 : Float(576, 120) = prim::Constant[value=<Tensor>]()
+    %5 : int = prim::Constant[value=-1]() # x.py:25:0
+    %6 : int[] = prim::Constant[value=annotate(List[int], [])]()
+    %7 : int[] = prim::Constant[value=[2, 2]]()
+    %8 : int[] = prim::Constant[value=[0, 0]]()
+    %9 : int[] = prim::Constant[value=[1, 1]]()
+    %10 : bool = prim::Constant[value=1]() # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0
+    %11 : int = prim::Constant[value=1]() # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0
+    %12 : bool = prim::Constant[value=0]() # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0
+    %self.classifer.fc3.bias : Float(10) = prim::Constant[value= 0.0464  0.0383  0.0678  0.0932  0.1045 -0.0805 -0.0435 -0.0818  0.0208 -0.0358 [ CUDAFloatType{10} ]]()
+    %self.classifer.fc2.bias : Float(84) = prim::Constant[value=<Tensor>]()
+    %self.classifer.fc1.bias : Float(120) = prim::Constant[value=<Tensor>]()
+    %self.feat.conv2.weight : Float(16, 6, 3, 3) = prim::Constant[value=<Tensor>]()
+    %self.feat.conv2.bias : Float(16) = prim::Constant[value=<Tensor>]()
+    %self.feat.conv1.weight : Float(6, 1, 3, 3) = prim::Constant[value=<Tensor>]()
+    %self.feat.conv1.bias : Float(6) = prim::Constant[value= 0.0530 -0.1691  0.2802  0.1502  0.1056 -0.1549 [ CUDAFloatType{6} ]]()
+    %input0.4 : Tensor = aten::_convolution(%input.2, %self.feat.conv1.weight, %self.feat.conv1.bias, %9, %8, %9, %12, %8, %11, %12, %12, %10) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0
+    %input0.5 : Tensor = aten::relu(%input0.4) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0
+    %input1.2 : Tensor = aten::max_pool2d(%input0.5, %7, %6, %8, %9, %12) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0
+    %input0.6 : Tensor = aten::_convolution(%input1.2, %self.feat.conv2.weight, %self.feat.conv2.bias, %9, %8, %9, %12, %8, %11, %12, %12, %10) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0
+    %input2.1 : Tensor = aten::relu(%input0.6) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0
+    %x.1 : Tensor = aten::max_pool2d(%input2.1, %7, %6, %8, %9, %12) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0
+    %input.1 : Tensor = aten::flatten(%x.1, %11, %5) # x.py:25:0
+    %27 : Tensor = aten::matmul(%input.1, %4)
+    %28 : Tensor = trt::const(%self.classifer.fc1.bias)
+    %29 : Tensor = aten::add_(%28, %27, %11)
+    %input0.2 : Tensor = aten::relu(%29) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0
+    %31 : Tensor = aten::matmul(%input0.2, %3)
+    %32 : Tensor = trt::const(%self.classifer.fc2.bias)
+    %33 : Tensor = aten::add_(%32, %31, %11)
+    %input1.1 : Tensor = aten::relu(%33) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0
+    %35 : Tensor = aten::matmul(%input1.1, %2)
+    %36 : Tensor = trt::const(%self.classifer.fc3.bias)
+    %37 : Tensor = aten::add_(%36, %35, %11)
+    return (%37)
+(CompileGraph)
+
+
+

The graph has now been transformed from a collection of modules, each managing their own parameters into a single graph with the parameters inlined +into the graph and all of the operations laid out. Torch-TensorRT has also executed a number of optimizations and mappings to make the graph easier to translate to TensorRT. +From here the compiler can assemble the TensorRT engine by following the dataflow through the graph.

+

When the graph construction phase is complete, Torch-TensorRT produces a serialized TensorRT engine. From here depending on the API, this engine is returned +to the user or moves into the graph construction phase. Here Torch-TensorRT creates a JIT Module to execute the TensorRT engine which will be instantiated and managed +by the Torch-TensorRT runtime.

+

Here is the graph that you get back after compilation is complete:

+
graph(%self_1 : __torch__.lenet, %input_0 : Tensor):
+    %1 : ...trt.Engine = prim::GetAttr[name="lenet"](%self_1)
+    %3 : Tensor[] = prim::ListConstruct(%input_0)
+    %4 : Tensor[] = trt::execute_engine(%3, %1)
+    %5 : Tensor = prim::ListUnpack(%4)
+    return (%5)
+
+
+

You can see the call where the engine is executed, after extracting the attribute containing the engine and constructing a list of inputs, then returns the tensors back to the user.

+
+
+

Working with Unsupported Operators

+

Torch-TensorRT is a new library and the PyTorch operator library is quite large, so there will be ops that aren’t supported natively by the compiler. You can either use the composition techinques +shown above to make modules are fully Torch-TensorRT supported and ones that are not and stitch the modules together in the deployment application or you can register converters for missing ops.

+
+

You can check support without going through the full compilation pipleine using the torch_tensorrt::CheckMethodOperatorSupport(const torch::jit::Module& module, std::string method_name) api +to see what operators are not supported. torchtrtc automatically checks modules with this method before starting compilation and will print out a list of operators that are not supported.

+
+
+

Registering Custom Converters

+

Operations are mapped to TensorRT through the use of modular converters, a function that takes a node from a the JIT graph and produces an equivalent layer or subgraph in TensorRT. +Torch-TensorRT ships with a library of these converters stored in a registry, that will be executed depending on the node being parsed. For instance a aten::relu(%input0.4) instruction will trigger +the relu converter to be run on it, producing an activation layer in the TensorRT graph. But since this library is not exhaustive you may need to write your own to get Torch-TensorRT +to support your module.

+

Shipped with the Torch-TensorRT distribution are the internal core API headers. You can therefore access the converter registry and add a converter for the op you need.

+

For example, if we try to compile a graph with a build of Torch-TensorRT that doesn’t support the flatten operation (aten::flatten) you may see this error:

+
terminate called after throwing an instance of 'torch_tensorrt::Error'
+what():  [enforce fail at core/conversion/conversion.cpp:109] Expected converter to be true but got false
+Unable to convert node: %input.1 : Tensor = aten::flatten(%x.1, %11, %5) # x.py:25:0 (conversion.AddLayer)
+Schema: aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor)
+Converter for aten::flatten requested, but no such converter was found.
+If you need a converter for this operator, you can try implementing one yourself
+or request a converter: https://www.github.com/NVIDIA/Torch-TensorRT/issues
+
+
+

We can register a converter for this operator in our application. All of the tools required to build a converter can be imported by including torch_tensorrt/core/conversion/converters/converters.h. +We start by creating an instance of the self-registering class torch_tensorrt::core::conversion::converters::RegisterNodeConversionPatterns() which will register converters +in the global converter registry, associating a function schema like aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor) with a lambda that +will take the state of the conversion, the node/operation in question to convert and all of the inputs to the node and produces as a side effect a new layer in the TensorRT network. +Arguments are passed as a vector of inspectable unions of TensorRT ITensors and Torch IValues in the order arguments are listed in the schema.

+

Below is a implementation of a aten::flatten converter that we can use in our application. You have full access to the Torch and TensorRT libraries in the converter implementation. So +for example we can quickly get the output size by just running the operation in PyTorch instead of implementing the full calculation outself like we do below for this flatten converter.

+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+#include "torch_tensorrt/core/conversion/converters/converters.h"
+
+static auto flatten_converter = torch_tensorrt::core::conversion::converters::RegisterNodeConversionPatterns()
+    .pattern({
+        "aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor)",
+        [](torch_tensorrt::core::conversion::ConversionCtx* ctx,
+           const torch::jit::Node* n,
+           torch_tensorrt::core::conversion::converters::args& args) -> bool {
+            auto in = args[0].ITensor();
+            auto start_dim = args[1].unwrapToInt();
+            auto end_dim = args[2].unwrapToInt();
+            auto in_shape = torch_tensorrt::core::util::toVec(in->getDimensions());
+            auto out_shape = torch::flatten(torch::rand(in_shape), start_dim, end_dim).sizes();
+
+            auto shuffle = ctx->net->addShuffle(*in);
+            shuffle->setReshapeDimensions(torch_tensorrt::core::util::toDims(out_shape));
+            shuffle->setName(torch_tensorrt::core::util::node_info(n).c_str());
+
+            auto out_tensor = ctx->AssociateValueAndTensor(n->outputs()[0], shuffle->getOutput(0));
+            return true;
+        }
+    });
+
+int main() {
+    ...
+
+
+

To use this converter in Python, it is recommended to use PyTorch’s C++ / CUDA Extention +template to wrap your library of converters into a .so that you can load with ctypes.CDLL() in your Python application.

+

You can find more information on all the details of writing converters in the contributors documentation (Writing Converters). +If you find yourself with a large library of converter implementations, do consider upstreaming them, PRs are welcome and it would be great for the community to benefit as well.

+
+
+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/getting_started/getting_started_with_python_api.html b/docs/v1.1.1/getting_started/getting_started_with_python_api.html new file mode 100644 index 0000000000..cc8cf46689 --- /dev/null +++ b/docs/v1.1.1/getting_started/getting_started_with_python_api.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Using Torch-TensorRT in Python — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Using Torch-TensorRT in Python
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Using Torch-TensorRT in Python

+

The Torch-TensorRT Python API supports a number of unique usecases compared to the CLI and C++ APIs which solely support TorchScript compilation.

+

Torch-TensorRT Python API can accept a torch.nn.Module, torch.jit.ScriptModule, or torch.fx.GraphModule as an input. +Depending on what is provided one of the two frontends (TorchScript or FX) will be selected to compile the module. Provided the +module type is supported, users may explicitly set which frontend they would like to use using the ir flag for compile. +If given a torch.nn.Module and the ir flag is set to either default or torchscript the module will be run through +torch.jit.script to convert the input module into a TorchScript module.

+

To compile your input torch.nn.Module with Torch-TensorRT, all you need to do is provide the module and inputs +to Torch-TensorRT and you will be returned an optimized TorchScript module to run or add into another PyTorch module. Inputs +is a list of torch_tensorrt.Input classes which define input’s shape, datatype and memory format. You can also specify settings such as +operating precision for the engine or target device. After compilation you can save the module just like any other module +to load in a deployment application. In order to load a TensorRT/TorchScript module, make sure you first import torch_tensorrt.

+
import torch_tensorrt
+
+...
+
+model = MyModel().eval()  # torch module needs to be in eval (not training) mode
+
+inputs = [
+    torch_tensorrt.Input(
+        min_shape=[1, 1, 16, 16],
+        opt_shape=[1, 1, 32, 32],
+        max_shape=[1, 1, 64, 64],
+        dtype=torch.half,
+    )
+]
+enabled_precisions = {torch.float, torch.half}  # Run with fp16
+
+trt_ts_module = torch_tensorrt.compile(
+    model, inputs=inputs, enabled_precisions=enabled_precisions
+)
+
+input_data = input_data.to("cuda").half()
+result = trt_ts_module(input_data)
+torch.jit.save(trt_ts_module, "trt_ts_module.ts")
+
+
+
# Deployment application
+import torch
+import torch_tensorrt
+
+trt_ts_module = torch.jit.load("trt_ts_module.ts")
+input_data = input_data.to("cuda").half()
+result = trt_ts_module(input_data)
+
+
+

Torch-TensorRT Python API also provides torch_tensorrt.ts.compile which accepts a TorchScript module as input and torch_tensorrt.fx.compile which accepts a FX GraphModule as input.

+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/getting_started/installation.html b/docs/v1.1.1/getting_started/installation.html new file mode 100644 index 0000000000..90bd35442f --- /dev/null +++ b/docs/v1.1.1/getting_started/installation.html @@ -0,0 +1,1012 @@ + + + + + + + + + + + + + Installation — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Installation

+
+

Precompiled Binaries

+
+

Dependencies

+

You need to have either PyTorch or LibTorch installed based on if you are using Python or C++ +and you must have CUDA, cuDNN and TensorRT installed.

+
+
+
+
+

Python Package

+

You can install the python package using

+
pip3 install torch-tensorrt -f https://github.com/pytorch/TensorRT/releases
+
+
+
+
+

C++ Binary Distribution

+

Precompiled tarballs for releases are provided here: https://github.com/pytorch/TensorRT/releases

+
+
+
+

Compiling From Source

+
+

Dependencies for Compilation

+

Torch-TensorRT is built with Bazel, so begin by installing it.

+
+
+
export BAZEL_VERSION=$(cat <PATH_TO_TORCHTRT_ROOT>/.bazelversion)
+mkdir bazel
+cd bazel
+curl -fSsL -O https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-dist.zip
+unzip bazel-$BAZEL_VERSION-dist.zip
+bash ./compile.sh
+cp output/bazel /usr/local/bin/
+
+
+
+

You will also need to have CUDA installed on the system (or if running in a container, the system must have +the CUDA driver installed and the container must have CUDA)

+

The correct LibTorch version will be pulled down for you by bazel.

+
+

NOTE: For best compatability with official PyTorch, use torch==1.10.0+cuda113, TensorRT 8.0 and cuDNN 8.2 for CUDA 11.3 however Torch-TensorRT itself supports +TensorRT and cuDNN for other CUDA versions for usecases such as using NVIDIA compiled distributions of PyTorch that use other versions of CUDA +e.g. aarch64 or custom compiled version of PyTorch.

+
+
+

Choosing the Right ABI

+

Likely the most complicated thing about compiling Torch-TensorRT is selecting the correct ABI. There are two options +which are incompatible with each other, pre-cxx11-abi and the cxx11-abi. The complexity comes from the fact that while +the most popular distribution of PyTorch (wheels downloaded from pytorch.org/pypi directly) use the pre-cxx11-abi, most +other distributions you might encounter (e.g. ones from NVIDIA - NGC containers, and builds for Jetson as well as certain +libtorch builds and likely if you build PyTorch from source) use the cxx11-abi. It is important you compile Torch-TensorRT +using the correct ABI to function properly. Below is a table with general pairings of PyTorch distribution sources and the +recommended commands:

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

PyTorch Source

Recommended C++ Compilation Command

Recommended Python Compilation Command

PyTorch whl file from PyTorch.org

bazel build //:libtorchtrt -c opt –config pre_cxx11_abi

python3 setup.py bdist_wheel

libtorch-shared-with-deps-*.zip from PyTorch.org

bazel build //:libtorchtrt -c opt –config pre_cxx11_abi

python3 setup.py bdist_wheel

libtorch-cxx11-abi-shared-with-deps-*.zip from PyTorch.org

bazel build //:libtorchtrt -c opt

python3 setup.py bdist_wheel –use-cxx11-abi

PyTorch preinstalled in an NGC container

bazel build //:libtorchtrt -c opt

python3 setup.py bdist_wheel –use-cxx11-abi

PyTorch from the NVIDIA Forums for Jetson

bazel build //:libtorchtrt -c opt

python3 setup.py bdist_wheel –jetpack-version 4.6 –use-cxx11-abi

PyTorch built from Source

bazel build //:libtorchtrt -c opt

python3 setup.py bdist_wheel –use-cxx11-abi

+
+

NOTE: For all of the above cases you must correctly declare the source of PyTorch you intend to use in your WORKSPACE file for both Python and C++ builds. See below for more information

+
+

You then have two compilation options:

+
+
+
+

Building using cuDNN & TensorRT tarball distributions

+
+

This is recommended so as to build Torch-TensorRT hermetically and insures any compilation errors are not caused by version issues

+

Make sure when running Torch-TensorRT that these versions of the libraries are prioritized in your $LD_LIBRARY_PATH

+
+
+
You need to download the tarball distributions of TensorRT and cuDNN from the NVIDIA website.
+
+
+

Place these files in a directory (the directories third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu] exist for this purpose)

+

Then compile referencing the directory with the tarballs

+
+

If you get errors regarding the packages, check their sha256 hashes and make sure they match the ones listed in WORKSPACE

+
+
+

Release Build

+
bazel build //:libtorchtrt -c opt --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu]
+
+
+

A tarball with the include files and library can then be found in bazel-bin

+
+
+

Debug Build

+

To build with debug symbols use the following command

+
bazel build //:libtorchtrt -c dbg --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu]
+
+
+

A tarball with the include files and library can then be found in bazel-bin

+
+
+

Pre CXX11 ABI Build

+

To build using the pre-CXX11 ABI use the pre_cxx11_abi config

+
bazel build //:libtorchtrt --config pre_cxx11_abi -c [dbg/opt] --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu]
+
+
+

A tarball with the include files and library can then be found in bazel-bin

+
+
+
+

Building using locally installed cuDNN & TensorRT

+
+

If you encounter bugs and you compiled using this method please disclose that you used local sources in the issue (an ldd dump would be nice too)

+
+

Install TensorRT, CUDA and cuDNN on the system before starting to compile.

+

In WORKSPACE comment out:

+
# Downloaded distributions to use with --distdir
+http_archive(
+    name="cudnn",
+    urls=[
+        "<URL>",
+    ],
+    build_file="@//third_party/cudnn/archive:BUILD",
+    sha256="<TAR SHA256>",
+    strip_prefix="cuda",
+)
+
+http_archive(
+    name="tensorrt",
+    urls=[
+        "<URL>",
+    ],
+    build_file="@//third_party/tensorrt/archive:BUILD",
+    sha256="<TAR SHA256>",
+    strip_prefix="TensorRT-<VERSION>",
+)
+
+
+

and uncomment

+
# Locally installed dependencies
+new_local_repository(
+    name="cudnn", path="/usr/", build_file="@//third_party/cudnn/local:BUILD"
+)
+
+new_local_repository(
+    name="tensorrt", path="/usr/", build_file="@//third_party/tensorrt/local:BUILD"
+)
+
+
+
+

Release Build

+

Compile using:

+
bazel build //:libtorchtrt -c opt
+
+
+

A tarball with the include files and library can then be found in bazel-bin

+
+
+

Debug Build

+

To build with debug symbols use the following command

+
bazel build //:libtorchtrt -c dbg
+
+
+

A tarball with the include files and library can then be found in bazel-bin

+
+
+

Pre CXX11 ABI Build

+

To build using the pre-CXX11 ABI use the pre_cxx11_abi config

+
bazel build //:libtorchtrt --config pre_cxx11_abi -c [dbg/opt]
+
+
+
+
+
+

Building with CMake

+

It is possible to build the API libraries (in cpp/) and the torchtrtc executable using CMake instead of Bazel. +Currently, the python API and the tests cannot be built with CMake. +Begin by installing CMake.

+
+
    +
  • Latest releases of CMake and instructions on how to install are available for different platforms +[on their website](https://cmake.org/download/).

  • +
+
+

A few useful CMake options include:

+
+
    +
  • CMake finders for TensorRT and cuDNN are provided in cmake/Modules. In order for CMake to use them, pass +-DCMAKE_MODULE_PATH=cmake/Modules when configuring the project with CMake.

  • +
  • Libtorch provides its own CMake finder. In case CMake doesn’t find it, pass the path to your install of +libtorch with -DTorch_DIR=<path to libtorch>/share/cmake/Torch

  • +
  • If TensorRT is not found with the provided cmake finder, specify -DTensorRT_ROOT=<path to TensorRT>

  • +
  • Finally, configure and build the project in a build directory of your choice with the following command +from the root of Torch-TensorRT project:

  • +
+
cmake -S. -B<build directory> \
+    [-DCMAKE_MODULE_PATH=cmake/Module] \
+    [-DTorch_DIR=<path to libtorch>/share/cmake/Torch] \
+    [-DTensorRT_ROOT=<path to TensorRT>] \
+    [-DCMAKE_BUILD_TYPE=Debug|Release]
+cmake --build <build directory>
+
+
+
+
+
+

Building the Python package

+

Begin by installing ninja

+

You can build the Python package using setup.py (this will also build the correct version of libtorchtrt.so)

+
python3 setup.py [install/bdist_wheel]
+
+
+
+

Debug Build

+
python3 setup.py develop [--user]
+
+
+

This also compiles a debug build of libtorchtrt.so

+
+
+
+

Building Natively on aarch64 (Jetson)

+
+

Prerequisites

+

Install or compile a build of PyTorch/LibTorch for aarch64

+

NVIDIA hosts builds the latest release branch for Jetson here:

+
+
+
+
+

Enviorment Setup

+

To build natively on aarch64-linux-gnu platform, configure the WORKSPACE with local available dependencies.

+
    +
  1. Replace WORKSPACE with the corresponding WORKSPACE file in //toolchains/jp_workspaces

  2. +
  3. Configure the correct paths to directory roots containing local dependencies in the new_local_repository rules:

    +
    +

    NOTE: If you installed PyTorch using a pip package, the correct path is the path to the root of the python torch package. +In the case that you installed with sudo pip install this will be /usr/local/lib/python3.8/dist-packages/torch. +In the case you installed with pip install --user this will be $HOME/.local/lib/python3.8/site-packages/torch.

    +
    +
  4. +
+

In the case you are using NVIDIA compiled pip packages, set the path for both libtorch sources to the same path. This is because unlike +PyTorch on x86_64, NVIDIA aarch64 PyTorch uses the CXX11-ABI. If you compiled for source using the pre_cxx11_abi and only would like to +use that library, set the paths to the same path but when you compile make sure to add the flag --config=pre_cxx11_abi

+
new_local_repository(
+    name = "libtorch",
+    path = "/usr/local/lib/python3.8/dist-packages/torch",
+    build_file = "third_party/libtorch/BUILD"
+)
+
+new_local_repository(
+    name = "libtorch_pre_cxx11_abi",
+    path = "/usr/local/lib/python3.8/dist-packages/torch",
+    build_file = "third_party/libtorch/BUILD"
+)
+
+
+
+
+

Compile C++ Library and Compiler CLI

+
+

NOTE: Due to shifting dependency locations between Jetpack 4.5 and 4.6 there is a now a flag to inform bazel of the Jetpack version

+
--platforms //toolchains:jetpack_x.x
+
+
+
+

Compile Torch-TensorRT library using bazel command:

+
bazel build //:libtorchtrt --platforms //toolchains:jetpack_5.0
+
+
+
+
+

Compile Python API

+
+

NOTE: Due to shifting dependencies locations between Jetpack 4.5 and newer Jetpack verisons there is now a flag for setup.py which sets the jetpack version (default: 5.0)

+
+

Compile the Python API using the following command from the //py directory:

+
python3 setup.py install --use-cxx11-abi
+
+
+

If you have a build of PyTorch that uses Pre-CXX11 ABI drop the --use-cxx11-abi flag

+

If you are building for Jetpack 4.5 add the --jetpack-version 5.0 flag

+
+
+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/index.html b/docs/v1.1.1/index.html new file mode 100644 index 0000000000..b3f8798fa0 --- /dev/null +++ b/docs/v1.1.1/index.html @@ -0,0 +1,833 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Torch-TensorRT — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+

+ Torch-TensorRT + + ¶ + +

+

+ Ahead-of-time compilation of TorchScript / PyTorch JIT for NVIDIA GPUs + + ¶ + +

+

+ Torch-TensorRT is a compiler for PyTorch/TorchScript, targeting NVIDIA GPUs via NVIDIA’s TensorRT Deep Learning Optimizer and Runtime. +Unlike PyTorch’s Just-In-Time (JIT) compiler, Torch-TensorRT is an Ahead-of-Time (AOT) compiler, meaning that before you deploy your +TorchScript code, you go through an explicit compile step to convert a standard TorchScript program into an module targeting +a TensorRT engine. Torch-TensorRT operates as a PyTorch extention and compiles modules that integrate into the JIT runtime seamlessly. +After compilation using the optimized graph should feel no different than running a TorchScript module. +You also have access to TensorRT’s suite of configurations at compile time, so you are able to specify +operating precision (FP32/FP16/INT8) and other settings for your module. +

+

+ More Information / System Architecture: +

+ +

+ Getting Started + + ¶ + +

+ +
+
+
+
+

+ Python API Documenation + + ¶ + +

+ +
+
+

+ C++ API Documenation + + ¶ + +

+ +
+
+

+ Contributor Documentation + + ¶ + +

+ +
+
+

+ Indices + + ¶ + +

+ +
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/indices/supported_ops.html b/docs/v1.1.1/indices/supported_ops.html new file mode 100644 index 0000000000..85e510b93e --- /dev/null +++ b/docs/v1.1.1/indices/supported_ops.html @@ -0,0 +1,2043 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Operators Supported — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Operators Supported + + ¶ + +

+

+ Operators Currently Supported Through Converters + + ¶ + +

+
    +
  • +

    + aten::_convolution(Tensor input, Tensor weight, Tensor? bias, int[] stride, int[] padding, int[] dilation, bool transposed, int[] output_padding, int groups, bool benchmark, bool deterministic, bool cudnn_enabled, bool allow_tf32) -> (Tensor) +

    +
  • +
  • +

    + aten::_convolution.deprecated(Tensor input, Tensor weight, Tensor? bias, int[] stride, int[] padding, int[] dilation, bool transposed, int[] output_padding, int groups, bool benchmark, bool deterministic, bool cudnn_enabled) -> (Tensor) +

    +
  • +
  • +

    + aten::abs(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::acos(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::acosh(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::adaptive_avg_pool1d(Tensor self, int[1] output_size) -> (Tensor) +

    +
  • +
  • +

    + aten::adaptive_avg_pool2d(Tensor self, int[2] output_size) -> (Tensor) +

    +
  • +
  • +

    + aten::adaptive_avg_pool3d(Tensor self, int[3] output_size) -> (Tensor) +

    +
  • +
  • +

    + aten::adaptive_max_pool1d(Tensor self, int[2] output_size) -> (Tensor, Tensor) +

    +
  • +
  • +

    + aten::adaptive_max_pool2d(Tensor self, int[2] output_size) -> (Tensor, Tensor) +

    +
  • +
  • +

    + aten::adaptive_max_pool3d(Tensor self, int[3] output_size) -> (Tensor, Tensor) +

    +
  • +
  • +

    + aten::add.Scalar(Tensor self, Scalar other, Scalar alpha=1) -> (Tensor) +

    +
  • +
  • +

    + aten::add.Tensor(Tensor self, Tensor other, Scalar alpha=1) -> (Tensor) +

    +
  • +
  • +

    + aten:: + + + add_ + + + .Tensor(Tensor(a!) self, Tensor other, + + + * + + + , Scalar alpha=1) -> (Tensor(a!)) +

    +
  • +
  • +

    + aten::asin(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::asinh(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::atan(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::atanh(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::avg_pool1d(Tensor self, int[1] kernel_size, int[1] stride=[], int[1] padding=[0], bool ceil_mode=False, bool count_include_pad=True) -> (Tensor) +

    +
  • +
  • +

    + aten::avg_pool2d(Tensor self, int[2] kernel_size, int[2] stride=[], int[2] padding=[0, 0], bool ceil_mode=False, bool count_include_pad=True, int? divisor_override=None) -> (Tensor) +

    +
  • +
  • +

    + aten::avg_pool3d(Tensor self, int[3] kernel_size, int[3] stride=[], int[3] padding=[], bool ceil_mode=False, bool count_include_pad=True, int? divisor_override=None) -> (Tensor) +

    +
  • +
  • +

    + aten::batch_norm(Tensor input, Tensor? gamma, Tensor? beta, Tensor? mean, Tensor? var, bool training, float momentum, float eps, bool cudnn_enabled) -> (Tensor) +

    +
  • +
  • +

    + aten::bmm(Tensor self, Tensor mat2) -> (Tensor) +

    +
  • +
  • +

    + aten::cat(Tensor[] tensors, int dim=0) -> (Tensor) +

    +
  • +
  • +

    + aten::ceil(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::clamp(Tensor self, Scalar? min=None, Scalar? max=None) -> (Tensor) +

    +
  • +
  • +

    + aten::clamp_max(Tensor self, Scalar max) -> (Tensor) +

    +
  • +
  • +

    + aten::clamp_min(Tensor self, Scalar min) -> (Tensor) +

    +
  • +
  • +

    + aten::constant_pad_nd(Tensor self, int[] pad, Scalar value=0) -> (Tensor) +

    +
  • +
  • +

    + aten::cos(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::cosh(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::cumsum(Tensor self, int dim, + + + * + + + , int? dtype=None) -> (Tensor) +

    +
  • +
  • +

    + aten::div.Scalar(Tensor self, Scalar other) -> (Tensor) +

    +
  • +
  • +

    + aten::div.Tensor(Tensor self, Tensor other) -> (Tensor) +

    +
  • +
  • +

    + aten::div.Tensor_mode(Tensor self, Tensor other, + + + * + + + , str? rounding_mode) -> (Tensor) +

    +
  • +
  • +

    + aten:: + + + div_ + + + .Scalar(Tensor(a!) self, Scalar other) -> (Tensor(a!)) +

    +
  • +
  • +

    + aten:: + + + div_ + + + .Tensor(Tensor(a!) self, Tensor other) -> (Tensor(a!)) +

    +
  • +
  • +

    + aten::elu(Tensor self, Scalar alpha=1, Scalar scale=1, Scalar input_scale=1) -> (Tensor) +

    +
  • +
  • +

    + aten::embedding(Tensor weight, Tensor indices, int padding_idx=-1, bool scale_grad_by_freq=False, bool sparse=False) -> (Tensor) +

    +
  • +
  • +

    + aten::eq.Scalar(Tensor self, Scalar other) -> (Tensor) +

    +
  • +
  • +

    + aten::eq.Tensor(Tensor self, Tensor other) -> (Tensor) +

    +
  • +
  • +

    + aten::erf(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::exp(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::expand(Tensor(a) self, int[] size, + + + * + + + , bool implicit=False) -> (Tensor(a)) +

    +
  • +
  • +

    + aten::expand_as(Tensor(a) self, Tensor other) -> (Tensor(a)) +

    +
  • +
  • +

    + aten::fake_quantize_per_channel_affine(Tensor self, Tensor scale, Tensor zero_point, int axis, int quant_min, int quant_max) -> (Tensor) +

    +
  • +
  • +

    + aten::fake_quantize_per_tensor_affine(Tensor self, float scale, int zero_point, int quant_min, int quant_max) -> (Tensor) +

    +
  • +
  • +

    + aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor) +

    +
  • +
  • +

    + aten::floor(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::floor_divide(Tensor self, Tensor other) -> (Tensor) +

    +
  • +
  • +

    + aten::floor_divide.Scalar(Tensor self, Scalar other) -> (Tensor) +

    +
  • +
  • +

    + aten::ge.Scalar(Tensor self, Scalar other) -> (Tensor) +

    +
  • +
  • +

    + aten::ge.Tensor(Tensor self, Tensor other) -> (Tensor) +

    +
  • +
  • +

    + aten::gru_cell(Tensor input, Tensor hx, Tensor w_ih, Tensor w_hh, Tensor? b_ih=None, Tensor? b_hh=None) -> (Tensor) +

    +
  • +
  • +

    + aten::gt.Scalar(Tensor self, Scalar other) -> (Tensor) +

    +
  • +
  • +

    + aten::gt.Tensor(Tensor self, Tensor other) -> (Tensor) +

    +
  • +
  • +

    + aten::hardtanh(Tensor self, Scalar min_val=-1, Scalar max_val=1) -> (Tensor) +

    +
  • +
  • +

    + aten::hardtanh_(Tensor(a!) self, Scalar min_val=-1, Scalar max_val=1) -> (Tensor(a!)) +

    +
  • +
  • +

    + aten::index.Tensor(Tensor self, Tensor?[] indices) -> (Tensor) +

    +
  • +
  • +

    + aten::instance_norm(Tensor input, Tensor? weight, Tensor? bias, Tensor? running_mean, Tensor? running_var, bool use_input_stats, float momentum, float eps, bool cudnn_enabled) -> (Tensor) +

    +
  • +
  • +

    + aten::layer_norm(Tensor input, int[] normalized_shape, Tensor? gamma, Tensor? beta, float eps, bool cudnn_enabled) -> (Tensor) +

    +
  • +
  • +

    + aten::le.Scalar(Tensor self, Scalar other) -> (Tensor) +

    +
  • +
  • +

    + aten::le.Tensor(Tensor self, Tensor other) -> (Tensor) +

    +
  • +
  • +

    + aten::leaky_relu(Tensor self, Scalar negative_slope=0.01) -> (Tensor) +

    +
  • +
  • +

    + aten::leaky_relu_(Tensor(a!) self, Scalar negative_slope=0.01) -> (Tensor(a!)) +

    +
  • +
  • +

    + aten::linear(Tensor input, Tensor weight, Tensor? bias=None) -> (Tensor) +

    +
  • +
  • +

    + aten::log(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::lstm_cell(Tensor input, Tensor[] hx, Tensor w_ih, Tensor w_hh, Tensor? b_ih=None, Tensor? b_hh=None) -> (Tensor, Tensor) +

    +
  • +
  • +

    + aten::lt.Scalar(Tensor self, Scalar other) -> (Tensor) +

    +
  • +
  • +

    + aten::lt.Tensor(Tensor self, Tensor other) -> (Tensor) +

    +
  • +
  • +

    + aten::masked_fill.Scalar(Tensor self, Tensor mask, Scalar value) -> (Tensor) +

    +
  • +
  • +

    + aten::matmul(Tensor self, Tensor other) -> (Tensor) +

    +
  • +
  • +

    + aten::max(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::max.dim(Tensor self, int dim, bool keepdim=False) -> (Tensor values, Tensor indices) +

    +
  • +
  • +

    + aten::max.other(Tensor self, Tensor other) -> (Tensor) +

    +
  • +
  • +

    + aten::max_pool1d(Tensor self, int[1] kernel_size, int[1] stride=[], int[1] padding=[], int[1] dilation=[], bool ceil_mode=False) -> (Tensor) +

    +
  • +
  • +

    + aten::max_pool2d(Tensor self, int[2] kernel_size, int[2] stride=[], int[2] padding=[0, 0], int[2] dilation=[1, 1], bool ceil_mode=False) -> (Tensor) +

    +
  • +
  • +

    + aten::max_pool3d(Tensor self, int[3] kernel_size, int[3] stride=[], int[3] padding=[], int[3] dilation=[], bool ceil_mode=False) -> (Tensor) +

    +
  • +
  • +

    + aten::mean(Tensor self, + + + * + + + , int? dtype=None) -> (Tensor) +

    +
  • +
  • +

    + aten::mean.dim(Tensor self, int[] dim, bool keepdim=False, + + + * + + + , int? dtype=None) -> (Tensor) +

    +
  • +
  • +

    + aten::min(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::min.other(Tensor self, Tensor other) -> (Tensor) +

    +
  • +
  • +

    + aten::mul.Scalar(Tensor self, Scalar other) -> (Tensor) +

    +
  • +
  • +

    + aten::mul.Tensor(Tensor self, Tensor other) -> (Tensor) +

    +
  • +
  • +

    + aten:: + + + mul_ + + + .Tensor(Tensor(a!) self, Tensor other) -> (Tensor(a!)) +

    +
  • +
  • +

    + aten::narrow(Tensor(a) self, int dim, int start, int length) -> (Tensor(a)) +

    +
  • +
  • +

    + aten::narrow.Tensor(Tensor(a) self, int dim, Tensor start, int length) -> (Tensor(a)) +

    +
  • +
  • +

    + aten::ne.Scalar(Tensor self, Scalar other) -> (Tensor) +

    +
  • +
  • +

    + aten::ne.Tensor(Tensor self, Tensor other) -> (Tensor) +

    +
  • +
  • +

    + aten::neg(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::norm.ScalarOpt_dim(Tensor self, Scalar? p, int[1] dim, bool keepdim=False) -> (Tensor) +

    +
  • +
  • +

    + aten::permute(Tensor(a) self, int[] dims) -> (Tensor(a)) +

    +
  • +
  • +

    + aten::pixel_shuffle(Tensor self, int upscale_factor) -> (Tensor) +

    +
  • +
  • +

    + aten::pow.Tensor_Scalar(Tensor self, Scalar exponent) -> (Tensor) +

    +
  • +
  • +

    + aten::pow.Tensor_Tensor(Tensor self, Tensor exponent) -> (Tensor) +

    +
  • +
  • +

    + aten::prelu(Tensor self, Tensor weight) -> (Tensor) +

    +
  • +
  • +

    + aten::prod(Tensor self, + + + * + + + , int? dtype=None) -> (Tensor) +

    +
  • +
  • +

    + aten::prod.dim_int(Tensor self, int dim, bool keepdim=False, + + + * + + + , int? dtype=None) -> (Tensor) +

    +
  • +
  • +

    + aten::reciprocal(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::reflection_pad1d(Tensor self, int[2] padding) -> (Tensor) +

    +
  • +
  • +

    + aten::reflection_pad2d(Tensor self, int[4] padding) -> (Tensor) +

    +
  • +
  • +

    + aten::relu(Tensor input) -> (Tensor) +

    +
  • +
  • +

    + aten::relu_(Tensor(a!) self) -> (Tensor(a!)) +

    +
  • +
  • +

    + aten::repeat(Tensor self, int[] repeats) -> (Tensor) +

    +
  • +
  • +

    + aten::replication_pad1d(Tensor self, int[2] padding) -> (Tensor) +

    +
  • +
  • +

    + aten::replication_pad2d(Tensor self, int[4] padding) -> (Tensor) +

    +
  • +
  • +

    + aten::replication_pad3d(Tensor self, int[6] padding) -> (Tensor) +

    +
  • +
  • +

    + aten::reshape(Tensor self, int[] shape) -> (Tensor) +

    +
  • +
  • +

    + aten::roll(Tensor self, int[1] shifts, int[1] dims=[]) -> (Tensor) +

    +
  • +
  • +

    + aten::rsub.Scalar(Tensor self, Scalar other, Scalar alpha=1) -> (Tensor) +

    +
  • +
  • +

    + aten::rsub.Tensor(Tensor self, Tensor other, Scalar alpha=1) -> (Tensor) +

    +
  • +
  • +

    + aten::select.int(Tensor(a) self, int dim, int index) -> (Tensor(a)) +

    +
  • +
  • +

    + aten::sigmoid(Tensor input) -> (Tensor) +

    +
  • +
  • +

    + aten::sigmoid_(Tensor(a!) self) -> (Tensor(a!)) +

    +
  • +
  • +

    + aten::sin(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::sinh(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::slice.Tensor(Tensor(a) self, int dim=0, int? start=None, int? end=None, int step=1) -> (Tensor(a)) +

    +
  • +
  • +

    + aten::softmax.int(Tensor self, int dim, int? dtype=None) -> (Tensor) +

    +
  • +
  • +

    + aten::split(Tensor self, int[] split_sizes, int dim=0) -> (Tensor[]) +

    +
  • +
  • +

    + aten::split.Tensor(Tensor(a) self, int split_size, int dim=0) -> (Tensor[]) +

    +
  • +
  • +

    + aten::split_with_sizes(Tensor(a) self, int[] split_sizes, int dim=0) -> (Tensor[]) +

    +
  • +
  • +

    + aten::sqrt(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::squeeze.dim(Tensor(a) self, int dim) -> (Tensor(a)) +

    +
  • +
  • +

    + aten::stack(Tensor[] tensors, int dim=0) -> (Tensor) +

    +
  • +
  • +

    + aten::sub.Scalar(Tensor self, Scalar other, Scalar alpha=1) -> (Tensor) +

    +
  • +
  • +

    + aten::sub.Tensor(Tensor self, Tensor other, Scalar alpha=1) -> (Tensor) +

    +
  • +
  • +

    + aten:: + + + sub_ + + + .Tensor(Tensor(a!) self, Tensor other, + + + * + + + , Scalar alpha=1) -> (Tensor(a!)) +

    +
  • +
  • +

    + aten::sum(Tensor self, + + + * + + + , int? dtype=None) -> (Tensor) +

    +
  • +
  • +

    + aten::sum.dim_IntList(Tensor self, int[1] dim, bool keepdim=False, + + + * + + + , int? dtype=None) -> (Tensor) +

    +
  • +
  • +

    + aten::t(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::tan(Tensor self) -> (Tensor) +

    +
  • +
  • +

    + aten::tanh(Tensor input) -> (Tensor) +

    +
  • +
  • +

    + aten::tanh_(Tensor(a!) self) -> (Tensor(a!)) +

    +
  • +
  • +

    + aten::to.device(Tensor(a) self, Device device, int dtype, bool non_blocking=False, bool copy=False, int? memory_format=None) -> (Tensor(a)) +

    +
  • +
  • +

    + aten::to.dtype(Tensor self, int dtype, bool non_blocking=False, bool copy=False, int? memory_format=None) -> (Tensor) +

    +
  • +
  • +

    + aten::to.other(Tensor self, Tensor other, bool non_blocking=False, bool copy=False, int? memory_format=None) -> (Tensor) +

    +
  • +
  • +

    + aten::to.prim_Device(Tensor(a) self, Device? device, int? dtype=None, bool non_blocking=False, bool copy=False) -> (Tensor(a|b)) +

    +
  • +
  • +

    + aten::topk(Tensor self, int k, int dim=-1, bool largest=True, bool sorted=True) -> (Tensor values, Tensor indices) +

    +
  • +
  • +

    + aten::transpose.int(Tensor(a) self, int dim0, int dim1) -> (Tensor(a)) +

    +
  • +
  • +

    + aten::unbind.int(Tensor(a -> + + + * + + + ) self, int dim=0) -> (Tensor[]) +

    +
  • +
  • +

    + aten::unsqueeze(Tensor(a) self, int dim) -> (Tensor(a)) +

    +
  • +
  • +

    + aten::upsample_bilinear2d(Tensor self, int[2] output_size, bool align_corners, float? scales_h=None, float? scales_w=None) -> (Tensor) +

    +
  • +
  • +

    + aten::upsample_bilinear2d.vec(Tensor input, int[]? output_size, bool align_corners, float[]? scale_factors) -> (Tensor) +

    +
  • +
  • +

    + aten::upsample_linear1d(Tensor self, int[1] output_size, bool align_corners, float? scales=None) -> (Tensor) +

    +
  • +
  • +

    + aten::upsample_linear1d.vec(Tensor input, int[]? output_size, bool align_corners, float[]? scale_factors) -> (Tensor) +

    +
  • +
  • +

    + aten::upsample_nearest1d(Tensor self, int[1] output_size, float? scales=None) -> (Tensor) +

    +
  • +
  • +

    + aten::upsample_nearest1d.vec(Tensor input, int[]? output_size, float[]? scale_factors) -> (Tensor) +

    +
  • +
  • +

    + aten::upsample_nearest2d(Tensor self, int[2] output_size, float? scales_h=None, float? scales_w=None) -> (Tensor) +

    +
  • +
  • +

    + aten::upsample_nearest2d.vec(Tensor input, int[]? output_size, float[]? scale_factors) -> (Tensor) +

    +
  • +
  • +

    + aten::upsample_nearest3d(Tensor self, int[3] output_size, float? scales_d=None, float? scales_h=None, float? scales_w=None) -> (Tensor) +

    +
  • +
  • +

    + aten::upsample_nearest3d.vec(Tensor input, int[]? output_size, float[]? scale_factors) -> (Tensor) +

    +
  • +
  • +

    + aten::upsample_trilinear3d(Tensor self, int[3] output_size, bool align_corners, float? scales_d=None, float? scales_h=None, float? scales_w=None) -> (Tensor) +

    +
  • +
  • +

    + aten::upsample_trilinear3d.vec(Tensor input, int[]? output_size, bool align_corners, float[]? scale_factors) -> (Tensor) +

    +
  • +
  • +

    + aten::view(Tensor(a) self, int[] size) -> (Tensor(a)) +

    +
  • +
  • +

    + trt::const(Tensor self) -> (Tensor) +

    +
  • +
+

+ Operators Currently Supported Through Evaluators + + ¶ + +

+
    +
  • +

    + aten::Bool.float(float b) -> (bool) +

    +
  • +
  • +

    + aten::Bool.int(int a) -> (bool) +

    +
  • +
  • +

    + aten::Float.Scalar(Scalar a) -> float +

    +
  • +
  • +

    + aten::Float.bool(bool a) -> float +

    +
  • +
  • +

    + aten::Float.int(int a) -> float +

    +
  • +
  • +

    + aten::Int.Scalar(Scalar a) -> int +

    +
  • +
  • +

    + aten::Int.bool(bool a) -> int +

    +
  • +
  • +

    + aten::Int.float(float a) -> int +

    +
  • +
  • +

    + aten::Int.int(int a) -> int +

    +
  • +
  • +

    + aten::__and__(int a, int b) -> (bool) +

    +
  • +
  • +

    + aten::__and__.bool(bool a, bool b) -> (bool) +

    +
  • +
  • +

    + aten::__getitem__.t(t[](a) list, int idx) -> (t(*)) +

    +
  • +
  • +

    + aten::__is__(t1 self, t2 obj) -> bool +

    +
  • +
  • +

    + aten::__isnot__(t1 self, t2 obj) -> bool +

    +
  • +
  • +

    + aten::__not__(bool self) -> bool +

    +
  • +
  • +

    + aten::__or__(int a, int b) -> (bool) +

    +
  • +
  • +

    + aten::__range_length(int lo, int hi, int step) -> int +

    +
  • +
  • +

    + aten::__round_to_zero_floordiv(int a, int b) -> (int) +

    +
  • +
  • +

    + aten::__xor__(int a, int b) -> (bool) +

    +
  • +
  • +

    + aten::add.float(float a, float b) -> (float) +

    +
  • +
  • +

    + aten::add.int(int a, int b) -> (int) +

    +
  • +
  • +

    + aten::add.str(str a, str b) -> (str) +

    +
  • +
  • +

    + aten:: + + + add_ + + + .t(t[](a!) self, t[] b) -> (t[]) +

    +
  • +
  • +

    + aten::append.t(t[](a!) self, t(c -> + + + * + + + ) el) -> (t[](a!)) +

    +
  • +
  • +
    +
    + aten::arange(Scalar end, + + + * + + + , int? dtype=None, int? layout=None, +
    +
    +

    + Device? device=None, bool? pin_memory=None) -> (Tensor) +

    +
    +
    +
  • +
  • +
    +
    + aten::arange.start(Scalar start, Scalar end, + + + * + + + , ScalarType? dtype=None, +
    +
    +

    + Layout? layout=None, Device? device=None, bool? pin_memory=None) -> (Tensor) +

    +
    +
    +
  • +
  • +
    +
    + aten::arange.start_step(Scalar start, Scalar end, Scalar step, + + + * + + + , ScalarType? dtype=None, +
    +
    +

    + Layout? layout=None, Device? device=None, bool? pin_memory=None) -> (Tensor) +

    +
    +
    +
  • +
  • +

    + aten::clone(Tensor self, + + + * + + + , int? memory_format=None) -> (Tensor) +

    +
  • +
  • +

    + aten::copy_(Tensor(a!) self, Tensor src, bool non_blocking=False) -> (Tensor(a!)) +

    +
  • +
  • +

    + aten::dim(Tensor self) -> int +

    +
  • +
  • +

    + aten::div.float(float a, float b) -> (float) +

    +
  • +
  • +

    + aten::div.int(int a, int b) -> (float) +

    +
  • +
  • +

    + aten::eq.bool(bool a, bool b) -> (bool) +

    +
  • +
  • +

    + aten::eq.float(float a, float b) -> (bool) +

    +
  • +
  • +

    + aten::eq.float_int(float a, int b) -> (bool) +

    +
  • +
  • +

    + aten::eq.int(int a, int b) -> (bool) +

    +
  • +
  • +

    + aten::eq.int_float(int a, float b) -> (bool) +

    +
  • +
  • +

    + aten::eq.str(str a, str b) -> (bool) +

    +
  • +
  • +

    + aten::extend.t(t[](a!) self, t[] other) -> () +

    +
  • +
  • +

    + aten::floor.float(float a) -> (int) +

    +
  • +
  • +

    + aten::floor.int(int a) -> (int) +

    +
  • +
  • +

    + aten::floordiv.float(float a, float b) -> (int) +

    +
  • +
  • +

    + aten::floordiv.int(int a, int b) -> (int) +

    +
  • +
  • +

    + aten::format(str self, …) -> (str) +

    +
  • +
  • +

    + aten::ge.bool(bool a, bool b) -> (bool) +

    +
  • +
  • +

    + aten::ge.float(float a, float b) -> (bool) +

    +
  • +
  • +

    + aten::ge.float_int(float a, int b) -> (bool) +

    +
  • +
  • +

    + aten::ge.int(int a, int b) -> (bool) +

    +
  • +
  • +

    + aten::ge.int_float(int a, float b) -> (bool) +

    +
  • +
  • +

    + aten::gt.bool(bool a, bool b) -> (bool) +

    +
  • +
  • +

    + aten::gt.float(float a, float b) -> (bool) +

    +
  • +
  • +

    + aten::gt.float_int(float a, int b) -> (bool) +

    +
  • +
  • +

    + aten::gt.int(int a, int b) -> (bool) +

    +
  • +
  • +

    + aten::gt.int_float(int a, float b) -> (bool) +

    +
  • +
  • +

    + aten::is_floating_point(Tensor self) -> (bool) +

    +
  • +
  • +

    + aten::le.bool(bool a, bool b) -> (bool) +

    +
  • +
  • +

    + aten::le.float(float a, float b) -> (bool) +

    +
  • +
  • +

    + aten::le.float_int(float a, int b) -> (bool) +

    +
  • +
  • +

    + aten::le.int(int a, int b) -> (bool) +

    +
  • +
  • +

    + aten::le.int_float(int a, float b) -> (bool) +

    +
  • +
  • +

    + aten::len.t(t[] a) -> (int) +

    +
  • +
  • +

    + aten::lt.bool(bool a, bool b) -> (bool) +

    +
  • +
  • +

    + aten::lt.float(float a, float b) -> (bool) +

    +
  • +
  • +

    + aten::lt.float_int(float a, int b) -> (bool) +

    +
  • +
  • +

    + aten::lt.int(int a, int b) -> (bool) +

    +
  • +
  • +

    + aten::lt.int_float(int a, float b) -> (bool) +

    +
  • +
  • +

    + aten::mul.float(float a, float b) -> (float) +

    +
  • +
  • +

    + aten::mul.int(int a, int b) -> (int) +

    +
  • +
  • +

    + aten::ne.bool(bool a, bool b) -> (bool) +

    +
  • +
  • +

    + aten::ne.float(float a, float b) -> (bool) +

    +
  • +
  • +

    + aten::ne.float_int(float a, int b) -> (bool) +

    +
  • +
  • +

    + aten::ne.int(int a, int b) -> (bool) +

    +
  • +
  • +

    + aten::ne.int_float(int a, float b) -> (bool) +

    +
  • +
  • +

    + aten::neg.int(int a) -> (int) +

    +
  • +
  • +

    + aten::numel(Tensor self) -> int +

    +
  • +
  • +

    + aten::pow.float(float a, float b) -> (float) +

    +
  • +
  • +

    + aten::pow.float_int(float a, int b) -> (float) +

    +
  • +
  • +

    + aten::pow.int(int a, int b) -> (float) +

    +
  • +
  • +

    + aten::pow.int_float(int a, float b) -> (float) +

    +
  • +
  • +

    + aten::size(Tensor self) -> (int[]) +

    +
  • +
  • +

    + aten::size.int(Tensor self, int dim) -> (int) +

    +
  • +
  • +

    + aten::slice.t(t[] l, int start, int end=9223372036854775807, int step=1) -> (t[]) +

    +
  • +
  • +

    + aten::sqrt.float(float a) -> (float) +

    +
  • +
  • +

    + aten::sqrt.int(int a) -> (float) +

    +
  • +
  • +

    + aten::sub.float(float a, float b) -> (float) +

    +
  • +
  • +

    + aten::sub.int(int a, int b) -> (int) +

    +
  • +
  • +

    + aten::tensor(t[] data, + + + * + + + , int? dtype=None, Device? device=None, bool requires_grad=False) -> (Tensor) +

    +
  • +
  • +

    + prim::dtype(Tensor a) -> (int) +

    +
  • +
  • +

    + prim::max.bool(bool a, bool b) -> (bool) +

    +
  • +
  • +

    + prim::max.float(float a, float b) -> (bool) +

    +
  • +
  • +

    + prim::max.float_int(float a, int b) -> (bool) +

    +
  • +
  • +

    + prim::max.int(int a, int b) -> (bool) +

    +
  • +
  • +

    + prim::max.int_float(int a, float b) -> (bool) +

    +
  • +
  • +

    + prim::max.self_int(int[] self) -> (int) +

    +
  • +
  • +

    + prim::min.bool(bool a, bool b) -> (bool) +

    +
  • +
  • +

    + prim::min.float(float a, float b) -> (bool) +

    +
  • +
  • +

    + prim::min.float_int(float a, int b) -> (bool) +

    +
  • +
  • +

    + prim::min.int(int a, int b) -> (bool) +

    +
  • +
  • +

    + prim::min.int_float(int a, float b) -> (bool) +

    +
  • +
  • +

    + prim::min.self_int(int[] self) -> (int) +

    +
  • +
  • +

    + prim::shape(Tensor a) -> (int[]) +

    +
  • +
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/objects.inv b/docs/v1.1.1/objects.inv new file mode 100644 index 0000000000..8cd99a8f0d Binary files /dev/null and b/docs/v1.1.1/objects.inv differ diff --git a/docs/v1.1.1/py-modindex.html b/docs/v1.1.1/py-modindex.html new file mode 100644 index 0000000000..8bce8fad45 --- /dev/null +++ b/docs/v1.1.1/py-modindex.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + Python Module Index — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+ + +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/py_api/fx.html b/docs/v1.1.1/py_api/fx.html new file mode 100644 index 0000000000..593402d22e --- /dev/null +++ b/docs/v1.1.1/py_api/fx.html @@ -0,0 +1,717 @@ + + + + + + + + + + + + + torch_tensorrt.fx — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

torch_tensorrt.fx

+
+

Functions

+
+
+torch_tensorrt.fx.compile(module: torch.nn.modules.module.Module, input, max_batch_size: int = 2048, max_workspace_size=33554432, explicit_batch_dimension=False, lower_precision=LowerPrecision.FP16, verbose_log=False, timing_cache_prefix='', save_timing_cache=False, cuda_graph_batch_size=- 1, dynamic_batch=True) torch.nn.modules.module.Module[source]
+

Takes in original module, input and lowering setting, run lowering workflow to turn module +into lowered module, or so called TRTModule.

+
+
Parameters
+
    +
  • module – Original module for lowering.

  • +
  • input – Input for module.

  • +
  • max_batch_size – Maximum batch size (must be >= 1 to be set, 0 means not set)

  • +
  • max_workspace_size – Maximum size of workspace given to TensorRT.

  • +
  • explicit_batch_dimension – Use explicit batch dimension in TensorRT if set True, otherwise use implicit batch dimension.

  • +
  • lower_precision – lower_precision config given to TRTModule.

  • +
  • verbose_log – Enable verbose log for TensorRT if set True.

  • +
  • timing_cache_prefix – Timing cache file name for timing cache used by fx2trt.

  • +
  • save_timing_cache – Update timing cache with current timing cache data if set to True.

  • +
  • cuda_graph_batch_size – Cuda graph batch size, default to be -1.

  • +
+
+
Returns
+

A torch.nn.Module lowered by TensorRT.

+
+
+
+ +
+
+

Classes

+
+
+class torch_tensorrt.fx.TRTModule(engine=None, input_names=None, output_names=None, cuda_graph_batch_size=- 1)[source]
+
+ +
+
+class torch_tensorrt.fx.InputTensorSpec(shape: Sequence[int], dtype: torch.dtype, device: torch.device = device(type='cpu'), shape_ranges: List[Tuple[Sequence[int], Sequence[int], Sequence[int]]] = [], has_batch_dim: bool = True)[source]
+

This class contains the information of a input tensor.

+

shape: shape of the tensor.

+

dtype: dtyep of the tensor.

+
+
device: device of the tensor. This is only used to generate inputs to the given model

in order to run shape prop. For TensorRT engine, inputs have to be on cuda device.

+
+
shape_ranges: If dynamic shape is needed (shape has dimensions of -1), then this field

has to be provided (default is empty list). Every shape_range is a tuple of three +tuples ((min_input_shape), (optimized_input_shape), (max_input_shape)). Each shape_range +is used to populate a TensorRT optimization profile. +e.g. If the input shape varies from (1, 224) to (100, 224) and we want to optimize +for (25, 224) because it’s the most common input shape, then we set shape_ranges to +((1, 224), (25, 225), (100, 224)).

+
+
has_batch_dim: Whether the shape includes batch dimension. Batch dimension has to be provided

if the engine want to run with dynamic shape.

+
+
+
+ +
+
+class torch_tensorrt.fx.TRTInterpreter(module: torch.fx.graph_module.GraphModule, input_specs: List[torch_tensorrt.fx.input_tensor_spec.InputTensorSpec], explicit_batch_dimension: bool = False, explicit_precision: bool = False, logger_level=None)[source]
+
+ +
+
+class torch_tensorrt.fx.TRTInterpreterResult(engine, input_names, output_names, serialized_cache)[source]
+
+ +
+
+ + +
+ +
+ + +
+
+ +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/py_api/logging.html b/docs/v1.1.1/py_api/logging.html new file mode 100644 index 0000000000..e8a9bb0d05 --- /dev/null +++ b/docs/v1.1.1/py_api/logging.html @@ -0,0 +1,558 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + torch_tensorrt.logging — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ torch_tensorrt.logging + + ¶ + +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/py_api/ptq.html b/docs/v1.1.1/py_api/ptq.html new file mode 100644 index 0000000000..30f4d3e0c6 --- /dev/null +++ b/docs/v1.1.1/py_api/ptq.html @@ -0,0 +1,614 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + torch_tensorrt.ptq — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/py_api/torch_tensorrt.html b/docs/v1.1.1/py_api/torch_tensorrt.html new file mode 100644 index 0000000000..1f076ce54d --- /dev/null +++ b/docs/v1.1.1/py_api/torch_tensorrt.html @@ -0,0 +1,660 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + torch_tensorrt — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/py_api/ts.html b/docs/v1.1.1/py_api/ts.html new file mode 100644 index 0000000000..b6e8239667 --- /dev/null +++ b/docs/v1.1.1/py_api/ts.html @@ -0,0 +1,598 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + torch_tensorrt.ts — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/search.html b/docs/v1.1.1/search.html new file mode 100644 index 0000000000..30a7ca6df8 --- /dev/null +++ b/docs/v1.1.1/search.html @@ -0,0 +1,515 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Search — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

+ Search +

+
+ +

+ Please activate JavaScript to enable the search + functionality. +

+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/searchindex.js b/docs/v1.1.1/searchindex.js new file mode 100644 index 0000000000..8bc7c8a08f --- /dev/null +++ b/docs/v1.1.1/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({docnames:["_cpp_api/class_view_hierarchy","_cpp_api/classtorch__tensorrt_1_1DataType","_cpp_api/classtorch__tensorrt_1_1Device_1_1DeviceType","_cpp_api/classtorch__tensorrt_1_1TensorFormat","_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator","_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8Calibrator","_cpp_api/define_macros_8h_1a18d295a837ac71add5578860b55e5502","_cpp_api/define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268","_cpp_api/define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e","_cpp_api/define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827","_cpp_api/define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b","_cpp_api/define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da","_cpp_api/define_macros_8h_1ad19939408f7be171a74a89928b36eb59","_cpp_api/define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883","_cpp_api/dir_cpp","_cpp_api/dir_cpp_include","_cpp_api/dir_cpp_include_torch_tensorrt","_cpp_api/enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558","_cpp_api/enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb","_cpp_api/file_cpp_include_torch_tensorrt_logging.h","_cpp_api/file_cpp_include_torch_tensorrt_macros.h","_cpp_api/file_cpp_include_torch_tensorrt_ptq.h","_cpp_api/file_cpp_include_torch_tensorrt_torch_tensorrt.h","_cpp_api/file_view_hierarchy","_cpp_api/function_logging_8h_1a0593f776f469c20469e2f729fc7861a3","_cpp_api/function_logging_8h_1a0c012cb374addd90eb1f42eaec570650","_cpp_api/function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a","_cpp_api/function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2","_cpp_api/function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8","_cpp_api/function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5","_cpp_api/function_logging_8h_1af8f3443813315af7901903d25dd495cc","_cpp_api/function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c","_cpp_api/function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178","_cpp_api/function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039","_cpp_api/function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa","_cpp_api/function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797","_cpp_api/function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9","_cpp_api/function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef","_cpp_api/function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528","_cpp_api/function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384","_cpp_api/function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1","_cpp_api/function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2","_cpp_api/namespace_torch_tensorrt","_cpp_api/namespace_torch_tensorrt__logging","_cpp_api/namespace_torch_tensorrt__ptq","_cpp_api/namespace_torch_tensorrt__torchscript","_cpp_api/program_listing_file_cpp_include_torch_tensorrt_logging.h","_cpp_api/program_listing_file_cpp_include_torch_tensorrt_macros.h","_cpp_api/program_listing_file_cpp_include_torch_tensorrt_ptq.h","_cpp_api/program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h","_cpp_api/structtorch__tensorrt_1_1Device","_cpp_api/structtorch__tensorrt_1_1GraphInputs","_cpp_api/structtorch__tensorrt_1_1Input","_cpp_api/structtorch__tensorrt_1_1torchscript_1_1CompileSpec","_cpp_api/torch_tensort_cpp","_cpp_api/unabridged_api","_cpp_api/unabridged_orphan","_notebooks/CitriNet-example","_notebooks/EfficientNet-example","_notebooks/Hugging-Face-BERT","_notebooks/Resnet50-example","_notebooks/dynamic-shapes","_notebooks/lenet-getting-started","_notebooks/ssd-object-detection-demo","_notebooks/vgg-qat","contributors/conversion","contributors/lowering","contributors/partitioning","contributors/phases","contributors/runtime","contributors/system_overview","contributors/useful_links","contributors/writing_converters","index","indices/supported_ops","py_api/logging","py_api/ptq","py_api/torch_tensorrt","py_api/ts","src/pytorch-sphinx-theme/docs/changelog","src/pytorch-sphinx-theme/docs/configuring","src/pytorch-sphinx-theme/docs/demo/api","src/pytorch-sphinx-theme/docs/demo/demo","src/pytorch-sphinx-theme/docs/demo/lists_tables","src/pytorch-sphinx-theme/docs/demo/long","src/pytorch-sphinx-theme/docs/demo/structure","src/pytorch-sphinx-theme/docs/index","src/pytorch-sphinx-theme/docs/installing","tutorials/creating_torchscript_module_in_python","tutorials/getting_started_with_cpp_api","tutorials/getting_started_with_python_api","tutorials/installation","tutorials/ptq","tutorials/runtime","tutorials/torchtrtc","tutorials/use_from_pytorch","tutorials/using_dla"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.intersphinx":1,nbsphinx:3,sphinx:56},filenames:["_cpp_api/class_view_hierarchy.rst","_cpp_api/classtorch__tensorrt_1_1DataType.rst","_cpp_api/classtorch__tensorrt_1_1Device_1_1DeviceType.rst","_cpp_api/classtorch__tensorrt_1_1TensorFormat.rst","_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator.rst","_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8Calibrator.rst","_cpp_api/define_macros_8h_1a18d295a837ac71add5578860b55e5502.rst","_cpp_api/define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268.rst","_cpp_api/define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e.rst","_cpp_api/define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827.rst","_cpp_api/define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b.rst","_cpp_api/define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da.rst","_cpp_api/define_macros_8h_1ad19939408f7be171a74a89928b36eb59.rst","_cpp_api/define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883.rst","_cpp_api/dir_cpp.rst","_cpp_api/dir_cpp_include.rst","_cpp_api/dir_cpp_include_torch_tensorrt.rst","_cpp_api/enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558.rst","_cpp_api/enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb.rst","_cpp_api/file_cpp_include_torch_tensorrt_logging.h.rst","_cpp_api/file_cpp_include_torch_tensorrt_macros.h.rst","_cpp_api/file_cpp_include_torch_tensorrt_ptq.h.rst","_cpp_api/file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst","_cpp_api/file_view_hierarchy.rst","_cpp_api/function_logging_8h_1a0593f776f469c20469e2f729fc7861a3.rst","_cpp_api/function_logging_8h_1a0c012cb374addd90eb1f42eaec570650.rst","_cpp_api/function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a.rst","_cpp_api/function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2.rst","_cpp_api/function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8.rst","_cpp_api/function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5.rst","_cpp_api/function_logging_8h_1af8f3443813315af7901903d25dd495cc.rst","_cpp_api/function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c.rst","_cpp_api/function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178.rst","_cpp_api/function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039.rst","_cpp_api/function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa.rst","_cpp_api/function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797.rst","_cpp_api/function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9.rst","_cpp_api/function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef.rst","_cpp_api/function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528.rst","_cpp_api/function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384.rst","_cpp_api/function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1.rst","_cpp_api/function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2.rst","_cpp_api/namespace_torch_tensorrt.rst","_cpp_api/namespace_torch_tensorrt__logging.rst","_cpp_api/namespace_torch_tensorrt__ptq.rst","_cpp_api/namespace_torch_tensorrt__torchscript.rst","_cpp_api/program_listing_file_cpp_include_torch_tensorrt_logging.h.rst","_cpp_api/program_listing_file_cpp_include_torch_tensorrt_macros.h.rst","_cpp_api/program_listing_file_cpp_include_torch_tensorrt_ptq.h.rst","_cpp_api/program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst","_cpp_api/structtorch__tensorrt_1_1Device.rst","_cpp_api/structtorch__tensorrt_1_1GraphInputs.rst","_cpp_api/structtorch__tensorrt_1_1Input.rst","_cpp_api/structtorch__tensorrt_1_1torchscript_1_1CompileSpec.rst","_cpp_api/torch_tensort_cpp.rst","_cpp_api/unabridged_api.rst","_cpp_api/unabridged_orphan.rst","_notebooks/CitriNet-example.ipynb","_notebooks/EfficientNet-example.ipynb","_notebooks/Hugging-Face-BERT.ipynb","_notebooks/Resnet50-example.ipynb","_notebooks/dynamic-shapes.ipynb","_notebooks/lenet-getting-started.ipynb","_notebooks/ssd-object-detection-demo.ipynb","_notebooks/vgg-qat.ipynb","contributors/conversion.rst","contributors/lowering.rst","contributors/partitioning.rst","contributors/phases.rst","contributors/runtime.rst","contributors/system_overview.rst","contributors/useful_links.rst","contributors/writing_converters.rst","index.rst","indices/supported_ops.rst","py_api/logging.rst","py_api/ptq.rst","py_api/torch_tensorrt.rst","py_api/ts.rst","src/pytorch-sphinx-theme/docs/changelog.rst","src/pytorch-sphinx-theme/docs/configuring.rst","src/pytorch-sphinx-theme/docs/demo/api.rst","src/pytorch-sphinx-theme/docs/demo/demo.rst","src/pytorch-sphinx-theme/docs/demo/lists_tables.rst","src/pytorch-sphinx-theme/docs/demo/long.rst","src/pytorch-sphinx-theme/docs/demo/structure.rst","src/pytorch-sphinx-theme/docs/index.rst","src/pytorch-sphinx-theme/docs/installing.rst","tutorials/creating_torchscript_module_in_python.rst","tutorials/getting_started_with_cpp_api.rst","tutorials/getting_started_with_python_api.rst","tutorials/installation.rst","tutorials/ptq.rst","tutorials/runtime.rst","tutorials/torchtrtc.rst","tutorials/use_from_pytorch.rst","tutorials/using_dla.rst"],objects:{"":{"torch_tensorrt::DataType":[1,1,1,"_CPPv4N14torch_tensorrt8DataTypeE"],"torch_tensorrt::DataType::DataType":[1,2,1,"_CPPv4N14torch_tensorrt8DataType8DataTypeEv"],"torch_tensorrt::DataType::DataType::t":[1,3,1,"_CPPv4N14torch_tensorrt8DataType8DataTypeEN3c1010ScalarTypeE"],"torch_tensorrt::DataType::Value":[1,4,1,"_CPPv4N14torch_tensorrt8DataType5ValueE"],"torch_tensorrt::DataType::Value::kBool":[1,5,1,"_CPPv4N14torch_tensorrt8DataType5Value5kBoolE"],"torch_tensorrt::DataType::Value::kChar":[1,5,1,"_CPPv4N14torch_tensorrt8DataType5Value5kCharE"],"torch_tensorrt::DataType::Value::kFloat":[1,5,1,"_CPPv4N14torch_tensorrt8DataType5Value6kFloatE"],"torch_tensorrt::DataType::Value::kHalf":[1,5,1,"_CPPv4N14torch_tensorrt8DataType5Value5kHalfE"],"torch_tensorrt::DataType::Value::kInt":[1,5,1,"_CPPv4N14torch_tensorrt8DataType5Value4kIntE"],"torch_tensorrt::DataType::Value::kUnknown":[1,5,1,"_CPPv4N14torch_tensorrt8DataType5Value8kUnknownE"],"torch_tensorrt::DataType::kBool":[1,5,1,"_CPPv4N14torch_tensorrt8DataType5Value5kBoolE"],"torch_tensorrt::DataType::kChar":[1,5,1,"_CPPv4N14torch_tensorrt8DataType5Value5kCharE"],"torch_tensorrt::DataType::kFloat":[1,5,1,"_CPPv4N14torch_tensorrt8DataType5Value6kFloatE"],"torch_tensorrt::DataType::kHalf":[1,5,1,"_CPPv4N14torch_tensorrt8DataType5Value5kHalfE"],"torch_tensorrt::DataType::kInt":[1,5,1,"_CPPv4N14torch_tensorrt8DataType5Value4kIntE"],"torch_tensorrt::DataType::kUnknown":[1,5,1,"_CPPv4N14torch_tensorrt8DataType5Value8kUnknownE"],"torch_tensorrt::DataType::operator Value":[1,2,1,"_CPPv4NK14torch_tensorrt8DataTypecv5ValueEv"],"torch_tensorrt::DataType::operator bool":[1,2,1,"_CPPv4N14torch_tensorrt8DataTypecvbEv"],"torch_tensorrt::DataType::operator!=":[1,2,1,"_CPPv4NK14torch_tensorrt8DataTypeneEN8DataType5ValueE"],"torch_tensorrt::DataType::operator!=::other":[1,3,1,"_CPPv4NK14torch_tensorrt8DataTypeneEN8DataType5ValueE"],"torch_tensorrt::DataType::operator==":[1,2,1,"_CPPv4NK14torch_tensorrt8DataTypeeqEN8DataType5ValueE"],"torch_tensorrt::DataType::operator==::other":[1,3,1,"_CPPv4NK14torch_tensorrt8DataTypeeqEN8DataType5ValueE"],"torch_tensorrt::Device":[50,1,1,"_CPPv4N14torch_tensorrt6DeviceE"],"torch_tensorrt::Device::Device":[50,2,1,"_CPPv4N14torch_tensorrt6Device6DeviceEv"],"torch_tensorrt::Device::DeviceType":[50,1,1,"_CPPv4N14torch_tensorrt6Device10DeviceTypeE"],"torch_tensorrt::Device::DeviceType::DeviceType":[50,2,1,"_CPPv4N14torch_tensorrt6Device10DeviceType10DeviceTypeEv"],"torch_tensorrt::Device::DeviceType::DeviceType::t":[50,3,1,"_CPPv4N14torch_tensorrt6Device10DeviceType10DeviceTypeEN3c1010DeviceTypeE"],"torch_tensorrt::Device::DeviceType::Value":[50,4,1,"_CPPv4N14torch_tensorrt6Device10DeviceType5ValueE"],"torch_tensorrt::Device::DeviceType::Value::kDLA":[50,5,1,"_CPPv4N14torch_tensorrt6Device10DeviceType5Value4kDLAE"],"torch_tensorrt::Device::DeviceType::Value::kGPU":[50,5,1,"_CPPv4N14torch_tensorrt6Device10DeviceType5Value4kGPUE"],"torch_tensorrt::Device::DeviceType::kDLA":[2,5,1,"_CPPv4N14torch_tensorrt6Device10DeviceType5Value4kDLAE"],"torch_tensorrt::Device::DeviceType::kGPU":[2,5,1,"_CPPv4N14torch_tensorrt6Device10DeviceType5Value4kGPUE"],"torch_tensorrt::Device::DeviceType::operator Value":[50,2,1,"_CPPv4NK14torch_tensorrt6Device10DeviceTypecv5ValueEv"],"torch_tensorrt::Device::DeviceType::operator bool":[50,2,1,"_CPPv4N14torch_tensorrt6Device10DeviceTypecvbEv"],"torch_tensorrt::Device::DeviceType::operator!=":[50,2,1,"_CPPv4NK14torch_tensorrt6Device10DeviceTypeneE10DeviceType"],"torch_tensorrt::Device::DeviceType::operator!=::other":[50,3,1,"_CPPv4NK14torch_tensorrt6Device10DeviceTypeneE10DeviceType"],"torch_tensorrt::Device::DeviceType::operator==":[50,2,1,"_CPPv4NK14torch_tensorrt6Device10DeviceTypeeqE10DeviceType"],"torch_tensorrt::Device::DeviceType::operator==::other":[50,3,1,"_CPPv4NK14torch_tensorrt6Device10DeviceTypeeqE10DeviceType"],"torch_tensorrt::Device::allow_gpu_fallback":[50,6,1,"_CPPv4N14torch_tensorrt6Device18allow_gpu_fallbackE"],"torch_tensorrt::Device::device_type":[50,6,1,"_CPPv4N14torch_tensorrt6Device11device_typeE"],"torch_tensorrt::Device::dla_core":[50,6,1,"_CPPv4N14torch_tensorrt6Device8dla_coreE"],"torch_tensorrt::Device::gpu_id":[50,6,1,"_CPPv4N14torch_tensorrt6Device6gpu_idE"],"torch_tensorrt::EngineCapability":[18,4,1,"_CPPv4N14torch_tensorrt16EngineCapabilityE"],"torch_tensorrt::EngineCapability::kDLA_STANDALONE":[18,5,1,"_CPPv4N14torch_tensorrt16EngineCapability15kDLA_STANDALONEE"],"torch_tensorrt::EngineCapability::kSAFETY":[18,5,1,"_CPPv4N14torch_tensorrt16EngineCapability7kSAFETYE"],"torch_tensorrt::EngineCapability::kSTANDARD":[18,5,1,"_CPPv4N14torch_tensorrt16EngineCapability9kSTANDARDE"],"torch_tensorrt::Input":[52,1,1,"_CPPv4N14torch_tensorrt5InputE"],"torch_tensorrt::Input::Input":[52,2,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEENSt6vectorI7int64_tEENSt6vectorI7int64_tEE8DataType12TensorFormat"],"torch_tensorrt::Input::Input::dtype":[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEENSt6vectorI7int64_tEENSt6vectorI7int64_tEE8DataType12TensorFormat"],"torch_tensorrt::Input::Input::format":[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEENSt6vectorI7int64_tEENSt6vectorI7int64_tEE8DataType12TensorFormat"],"torch_tensorrt::Input::Input::max_shape":[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEENSt6vectorI7int64_tEENSt6vectorI7int64_tEE8DataType12TensorFormat"],"torch_tensorrt::Input::Input::min_shape":[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEENSt6vectorI7int64_tEENSt6vectorI7int64_tEE8DataType12TensorFormat"],"torch_tensorrt::Input::Input::opt_shape":[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEENSt6vectorI7int64_tEENSt6vectorI7int64_tEE8DataType12TensorFormat"],"torch_tensorrt::Input::Input::shape":[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEE8DataType12TensorFormat"],"torch_tensorrt::Input::Input::tensor":[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputEN2at6TensorE"],"torch_tensorrt::Input::dtype":[52,6,1,"_CPPv4N14torch_tensorrt5Input5dtypeE"],"torch_tensorrt::Input::format":[52,6,1,"_CPPv4N14torch_tensorrt5Input6formatE"],"torch_tensorrt::Input::max_shape":[52,6,1,"_CPPv4N14torch_tensorrt5Input9max_shapeE"],"torch_tensorrt::Input::min_shape":[52,6,1,"_CPPv4N14torch_tensorrt5Input9min_shapeE"],"torch_tensorrt::Input::opt_shape":[52,6,1,"_CPPv4N14torch_tensorrt5Input9opt_shapeE"],"torch_tensorrt::Input::shape":[52,6,1,"_CPPv4N14torch_tensorrt5Input5shapeE"],"torch_tensorrt::TensorFormat":[3,1,1,"_CPPv4N14torch_tensorrt12TensorFormatE"],"torch_tensorrt::TensorFormat::TensorFormat":[3,2,1,"_CPPv4N14torch_tensorrt12TensorFormat12TensorFormatEv"],"torch_tensorrt::TensorFormat::TensorFormat::t":[3,3,1,"_CPPv4N14torch_tensorrt12TensorFormat12TensorFormatEN2at12MemoryFormatE"],"torch_tensorrt::TensorFormat::Value":[3,4,1,"_CPPv4N14torch_tensorrt12TensorFormat5ValueE"],"torch_tensorrt::TensorFormat::Value::kChannelsLast":[3,5,1,"_CPPv4N14torch_tensorrt12TensorFormat5Value13kChannelsLastE"],"torch_tensorrt::TensorFormat::Value::kContiguous":[3,5,1,"_CPPv4N14torch_tensorrt12TensorFormat5Value11kContiguousE"],"torch_tensorrt::TensorFormat::Value::kUnknown":[3,5,1,"_CPPv4N14torch_tensorrt12TensorFormat5Value8kUnknownE"],"torch_tensorrt::TensorFormat::kChannelsLast":[3,5,1,"_CPPv4N14torch_tensorrt12TensorFormat5Value13kChannelsLastE"],"torch_tensorrt::TensorFormat::kContiguous":[3,5,1,"_CPPv4N14torch_tensorrt12TensorFormat5Value11kContiguousE"],"torch_tensorrt::TensorFormat::kUnknown":[3,5,1,"_CPPv4N14torch_tensorrt12TensorFormat5Value8kUnknownE"],"torch_tensorrt::TensorFormat::operator Value":[3,2,1,"_CPPv4NK14torch_tensorrt12TensorFormatcv5ValueEv"],"torch_tensorrt::TensorFormat::operator bool":[3,2,1,"_CPPv4N14torch_tensorrt12TensorFormatcvbEv"],"torch_tensorrt::TensorFormat::operator!=":[3,2,1,"_CPPv4NK14torch_tensorrt12TensorFormatneEN12TensorFormat5ValueE"],"torch_tensorrt::TensorFormat::operator!=::other":[3,3,1,"_CPPv4NK14torch_tensorrt12TensorFormatneEN12TensorFormat5ValueE"],"torch_tensorrt::TensorFormat::operator==":[3,2,1,"_CPPv4NK14torch_tensorrt12TensorFormateqEN12TensorFormat5ValueE"],"torch_tensorrt::TensorFormat::operator==::other":[3,3,1,"_CPPv4NK14torch_tensorrt12TensorFormateqEN12TensorFormat5ValueE"],"torch_tensorrt::dump_build_info":[40,2,1,"_CPPv4N14torch_tensorrt15dump_build_infoEv"],"torch_tensorrt::get_build_info":[38,2,1,"_CPPv4N14torch_tensorrt14get_build_infoEv"],"torch_tensorrt::kDLA_STANDALONE":[18,5,1,"_CPPv4N14torch_tensorrt16EngineCapability15kDLA_STANDALONEE"],"torch_tensorrt::kSAFETY":[18,5,1,"_CPPv4N14torch_tensorrt16EngineCapability7kSAFETYE"],"torch_tensorrt::kSTANDARD":[18,5,1,"_CPPv4N14torch_tensorrt16EngineCapability9kSTANDARDE"],"torch_tensorrt::logging::Level":[17,4,1,"_CPPv4N14torch_tensorrt7logging5LevelE"],"torch_tensorrt::logging::Level::kDEBUG":[17,5,1,"_CPPv4N14torch_tensorrt7logging5Level6kDEBUGE"],"torch_tensorrt::logging::Level::kERROR":[17,5,1,"_CPPv4N14torch_tensorrt7logging5Level6kERRORE"],"torch_tensorrt::logging::Level::kGRAPH":[17,5,1,"_CPPv4N14torch_tensorrt7logging5Level6kGRAPHE"],"torch_tensorrt::logging::Level::kINFO":[17,5,1,"_CPPv4N14torch_tensorrt7logging5Level5kINFOE"],"torch_tensorrt::logging::Level::kINTERNAL_ERROR":[17,5,1,"_CPPv4N14torch_tensorrt7logging5Level15kINTERNAL_ERRORE"],"torch_tensorrt::logging::Level::kWARNING":[17,5,1,"_CPPv4N14torch_tensorrt7logging5Level8kWARNINGE"],"torch_tensorrt::logging::get_is_colored_output_on":[26,2,1,"_CPPv4N14torch_tensorrt7logging24get_is_colored_output_onEv"],"torch_tensorrt::logging::get_logging_prefix":[24,2,1,"_CPPv4N14torch_tensorrt7logging18get_logging_prefixEv"],"torch_tensorrt::logging::get_reportable_log_level":[25,2,1,"_CPPv4N14torch_tensorrt7logging24get_reportable_log_levelEv"],"torch_tensorrt::logging::kDEBUG":[17,5,1,"_CPPv4N14torch_tensorrt7logging5Level6kDEBUGE"],"torch_tensorrt::logging::kERROR":[17,5,1,"_CPPv4N14torch_tensorrt7logging5Level6kERRORE"],"torch_tensorrt::logging::kGRAPH":[17,5,1,"_CPPv4N14torch_tensorrt7logging5Level6kGRAPHE"],"torch_tensorrt::logging::kINFO":[17,5,1,"_CPPv4N14torch_tensorrt7logging5Level5kINFOE"],"torch_tensorrt::logging::kINTERNAL_ERROR":[17,5,1,"_CPPv4N14torch_tensorrt7logging5Level15kINTERNAL_ERRORE"],"torch_tensorrt::logging::kWARNING":[17,5,1,"_CPPv4N14torch_tensorrt7logging5Level8kWARNINGE"],"torch_tensorrt::logging::log":[28,2,1,"_CPPv4N14torch_tensorrt7logging3logE5LevelNSt6stringE"],"torch_tensorrt::logging::log::lvl":[28,3,1,"_CPPv4N14torch_tensorrt7logging3logE5LevelNSt6stringE"],"torch_tensorrt::logging::log::msg":[28,3,1,"_CPPv4N14torch_tensorrt7logging3logE5LevelNSt6stringE"],"torch_tensorrt::logging::set_is_colored_output_on":[29,2,1,"_CPPv4N14torch_tensorrt7logging24set_is_colored_output_onEb"],"torch_tensorrt::logging::set_is_colored_output_on::colored_output_on":[29,3,1,"_CPPv4N14torch_tensorrt7logging24set_is_colored_output_onEb"],"torch_tensorrt::logging::set_logging_prefix":[30,2,1,"_CPPv4N14torch_tensorrt7logging18set_logging_prefixENSt6stringE"],"torch_tensorrt::logging::set_logging_prefix::prefix":[30,3,1,"_CPPv4N14torch_tensorrt7logging18set_logging_prefixENSt6stringE"],"torch_tensorrt::logging::set_reportable_log_level":[27,2,1,"_CPPv4N14torch_tensorrt7logging24set_reportable_log_levelE5Level"],"torch_tensorrt::logging::set_reportable_log_level::lvl":[27,3,1,"_CPPv4N14torch_tensorrt7logging24set_reportable_log_levelE5Level"],"torch_tensorrt::ptq::Int8CacheCalibrator":[4,1,1,"_CPPv4I0EN14torch_tensorrt3ptq19Int8CacheCalibratorE"],"torch_tensorrt::ptq::Int8CacheCalibrator::Algorithm":[4,7,1,"_CPPv4I0EN14torch_tensorrt3ptq19Int8CacheCalibratorE"],"torch_tensorrt::ptq::Int8CacheCalibrator::Int8CacheCalibrator":[4,2,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator19Int8CacheCalibratorERKNSt6stringE"],"torch_tensorrt::ptq::Int8CacheCalibrator::Int8CacheCalibrator::cache_file_path":[4,3,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator19Int8CacheCalibratorERKNSt6stringE"],"torch_tensorrt::ptq::Int8CacheCalibrator::getBatch":[4,2,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator8getBatchEA_PvA_PKci"],"torch_tensorrt::ptq::Int8CacheCalibrator::getBatch::bindings":[4,3,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator8getBatchEA_PvA_PKci"],"torch_tensorrt::ptq::Int8CacheCalibrator::getBatch::names":[4,3,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator8getBatchEA_PvA_PKci"],"torch_tensorrt::ptq::Int8CacheCalibrator::getBatch::nbBindings":[4,3,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator8getBatchEA_PvA_PKci"],"torch_tensorrt::ptq::Int8CacheCalibrator::getBatchSize":[4,2,1,"_CPPv4NK14torch_tensorrt3ptq19Int8CacheCalibrator12getBatchSizeEv"],"torch_tensorrt::ptq::Int8CacheCalibrator::operator nvinfer1::IInt8Calibrator*":[4,2,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibratorcvPN8nvinfer115IInt8CalibratorEEv"],"torch_tensorrt::ptq::Int8CacheCalibrator::readCalibrationCache":[4,2,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator20readCalibrationCacheER6size_t"],"torch_tensorrt::ptq::Int8CacheCalibrator::readCalibrationCache::length":[4,3,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator20readCalibrationCacheER6size_t"],"torch_tensorrt::ptq::Int8CacheCalibrator::writeCalibrationCache":[4,2,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator21writeCalibrationCacheEPKv6size_t"],"torch_tensorrt::ptq::Int8CacheCalibrator::writeCalibrationCache::cache":[4,3,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator21writeCalibrationCacheEPKv6size_t"],"torch_tensorrt::ptq::Int8CacheCalibrator::writeCalibrationCache::length":[4,3,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator21writeCalibrationCacheEPKv6size_t"],"torch_tensorrt::ptq::Int8Calibrator":[5,1,1,"_CPPv4I00EN14torch_tensorrt3ptq14Int8CalibratorE"],"torch_tensorrt::ptq::Int8Calibrator::Algorithm":[5,7,1,"_CPPv4I00EN14torch_tensorrt3ptq14Int8CalibratorE"],"torch_tensorrt::ptq::Int8Calibrator::DataLoaderUniquePtr":[5,7,1,"_CPPv4I00EN14torch_tensorrt3ptq14Int8CalibratorE"],"torch_tensorrt::ptq::Int8Calibrator::Int8Calibrator":[5,2,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator14Int8CalibratorE19DataLoaderUniquePtrRKNSt6stringEb"],"torch_tensorrt::ptq::Int8Calibrator::Int8Calibrator::cache_file_path":[5,3,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator14Int8CalibratorE19DataLoaderUniquePtrRKNSt6stringEb"],"torch_tensorrt::ptq::Int8Calibrator::Int8Calibrator::dataloader":[5,3,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator14Int8CalibratorE19DataLoaderUniquePtrRKNSt6stringEb"],"torch_tensorrt::ptq::Int8Calibrator::Int8Calibrator::use_cache":[5,3,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator14Int8CalibratorE19DataLoaderUniquePtrRKNSt6stringEb"],"torch_tensorrt::ptq::Int8Calibrator::getBatch":[5,2,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator8getBatchEA_PvA_PKci"],"torch_tensorrt::ptq::Int8Calibrator::getBatch::bindings":[5,3,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator8getBatchEA_PvA_PKci"],"torch_tensorrt::ptq::Int8Calibrator::getBatch::names":[5,3,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator8getBatchEA_PvA_PKci"],"torch_tensorrt::ptq::Int8Calibrator::getBatch::nbBindings":[5,3,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator8getBatchEA_PvA_PKci"],"torch_tensorrt::ptq::Int8Calibrator::getBatchSize":[5,2,1,"_CPPv4NK14torch_tensorrt3ptq14Int8Calibrator12getBatchSizeEv"],"torch_tensorrt::ptq::Int8Calibrator::operator nvinfer1::IInt8Calibrator*":[5,2,1,"_CPPv4N14torch_tensorrt3ptq14Int8CalibratorcvPN8nvinfer115IInt8CalibratorEEv"],"torch_tensorrt::ptq::Int8Calibrator::readCalibrationCache":[5,2,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator20readCalibrationCacheER6size_t"],"torch_tensorrt::ptq::Int8Calibrator::readCalibrationCache::length":[5,3,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator20readCalibrationCacheER6size_t"],"torch_tensorrt::ptq::Int8Calibrator::writeCalibrationCache":[5,2,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator21writeCalibrationCacheEPKv6size_t"],"torch_tensorrt::ptq::Int8Calibrator::writeCalibrationCache::cache":[5,3,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator21writeCalibrationCacheEPKv6size_t"],"torch_tensorrt::ptq::Int8Calibrator::writeCalibrationCache::length":[5,3,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator21writeCalibrationCacheEPKv6size_t"],"torch_tensorrt::ptq::make_int8_cache_calibrator":[34,2,1,"_CPPv4I0EN14torch_tensorrt3ptq26make_int8_cache_calibratorE19Int8CacheCalibratorI9AlgorithmERKNSt6stringE"],"torch_tensorrt::ptq::make_int8_cache_calibrator::Algorithm":[34,7,1,"_CPPv4I0EN14torch_tensorrt3ptq26make_int8_cache_calibratorE19Int8CacheCalibratorI9AlgorithmERKNSt6stringE"],"torch_tensorrt::ptq::make_int8_cache_calibrator::cache_file_path":[34,3,1,"_CPPv4I0EN14torch_tensorrt3ptq26make_int8_cache_calibratorE19Int8CacheCalibratorI9AlgorithmERKNSt6stringE"],"torch_tensorrt::ptq::make_int8_calibrator":[33,2,1,"_CPPv4I00EN14torch_tensorrt3ptq20make_int8_calibratorE14Int8CalibratorI9Algorithm10DataLoaderE10DataLoaderRKNSt6stringEb"],"torch_tensorrt::ptq::make_int8_calibrator::Algorithm":[33,7,1,"_CPPv4I00EN14torch_tensorrt3ptq20make_int8_calibratorE14Int8CalibratorI9Algorithm10DataLoaderE10DataLoaderRKNSt6stringEb"],"torch_tensorrt::ptq::make_int8_calibrator::DataLoader":[33,7,1,"_CPPv4I00EN14torch_tensorrt3ptq20make_int8_calibratorE14Int8CalibratorI9Algorithm10DataLoaderE10DataLoaderRKNSt6stringEb"],"torch_tensorrt::ptq::make_int8_calibrator::cache_file_path":[33,3,1,"_CPPv4I00EN14torch_tensorrt3ptq20make_int8_calibratorE14Int8CalibratorI9Algorithm10DataLoaderE10DataLoaderRKNSt6stringEb"],"torch_tensorrt::ptq::make_int8_calibrator::dataloader":[33,3,1,"_CPPv4I00EN14torch_tensorrt3ptq20make_int8_calibratorE14Int8CalibratorI9Algorithm10DataLoaderE10DataLoaderRKNSt6stringEb"],"torch_tensorrt::ptq::make_int8_calibrator::use_cache":[33,3,1,"_CPPv4I00EN14torch_tensorrt3ptq20make_int8_calibratorE14Int8CalibratorI9Algorithm10DataLoaderE10DataLoaderRKNSt6stringEb"],"torch_tensorrt::set_device":[39,2,1,"_CPPv4N14torch_tensorrt10set_deviceEKi"],"torch_tensorrt::set_device::gpu_id":[39,3,1,"_CPPv4N14torch_tensorrt10set_deviceEKi"],"torch_tensorrt::torchscript::CompileSpec":[53,1,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpecE"],"torch_tensorrt::torchscript::CompileSpec::CompileSpec":[53,2,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec11CompileSpecENSt6vectorINSt6vectorI7int64_tEEEE"],"torch_tensorrt::torchscript::CompileSpec::CompileSpec::fixed_sizes":[53,3,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec11CompileSpecENSt6vectorINSt6vectorI7int64_tEEEE"],"torch_tensorrt::torchscript::CompileSpec::CompileSpec::inputs":[53,3,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec11CompileSpecENSt6vectorI5InputEE"],"torch_tensorrt::torchscript::CompileSpec::capability":[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec10capabilityE"],"torch_tensorrt::torchscript::CompileSpec::debug":[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec5debugE"],"torch_tensorrt::torchscript::CompileSpec::device":[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec6deviceE"],"torch_tensorrt::torchscript::CompileSpec::disable_tf32":[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec12disable_tf32E"],"torch_tensorrt::torchscript::CompileSpec::enabled_precisions":[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec18enabled_precisionsE"],"torch_tensorrt::torchscript::CompileSpec::inputs":[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec6inputsE"],"torch_tensorrt::torchscript::CompileSpec::min_block_size":[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec14min_block_sizeE"],"torch_tensorrt::torchscript::CompileSpec::num_avg_timing_iters":[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec20num_avg_timing_itersE"],"torch_tensorrt::torchscript::CompileSpec::num_min_timing_iters":[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec20num_min_timing_itersE"],"torch_tensorrt::torchscript::CompileSpec::ptq_calibrator":[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec14ptq_calibratorE"],"torch_tensorrt::torchscript::CompileSpec::refit":[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec5refitE"],"torch_tensorrt::torchscript::CompileSpec::require_full_compilation":[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec24require_full_compilationE"],"torch_tensorrt::torchscript::CompileSpec::sparse_weights":[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec14sparse_weightsE"],"torch_tensorrt::torchscript::CompileSpec::torch_executed_modules":[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec22torch_executed_modulesE"],"torch_tensorrt::torchscript::CompileSpec::torch_executed_ops":[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec18torch_executed_opsE"],"torch_tensorrt::torchscript::CompileSpec::truncate_long_and_double":[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec24truncate_long_and_doubleE"],"torch_tensorrt::torchscript::CompileSpec::workspace_size":[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec14workspace_sizeE"],"torch_tensorrt::torchscript::check_method_operator_support":[35,2,1,"_CPPv4N14torch_tensorrt11torchscript29check_method_operator_supportERKN5torch3jit6ModuleENSt6stringE"],"torch_tensorrt::torchscript::check_method_operator_support::method_name":[35,3,1,"_CPPv4N14torch_tensorrt11torchscript29check_method_operator_supportERKN5torch3jit6ModuleENSt6stringE"],"torch_tensorrt::torchscript::check_method_operator_support::module":[35,3,1,"_CPPv4N14torch_tensorrt11torchscript29check_method_operator_supportERKN5torch3jit6ModuleENSt6stringE"],"torch_tensorrt::torchscript::compile":[36,2,1,"_CPPv4N14torch_tensorrt11torchscript7compileERKN5torch3jit6ModuleE11CompileSpec"],"torch_tensorrt::torchscript::compile::info":[36,3,1,"_CPPv4N14torch_tensorrt11torchscript7compileERKN5torch3jit6ModuleE11CompileSpec"],"torch_tensorrt::torchscript::compile::module":[36,3,1,"_CPPv4N14torch_tensorrt11torchscript7compileERKN5torch3jit6ModuleE11CompileSpec"],"torch_tensorrt::torchscript::convert_method_to_trt_engine":[41,2,1,"_CPPv4N14torch_tensorrt11torchscript28convert_method_to_trt_engineERKN5torch3jit6ModuleENSt6stringE11CompileSpec"],"torch_tensorrt::torchscript::convert_method_to_trt_engine::info":[41,3,1,"_CPPv4N14torch_tensorrt11torchscript28convert_method_to_trt_engineERKN5torch3jit6ModuleENSt6stringE11CompileSpec"],"torch_tensorrt::torchscript::convert_method_to_trt_engine::method_name":[41,3,1,"_CPPv4N14torch_tensorrt11torchscript28convert_method_to_trt_engineERKN5torch3jit6ModuleENSt6stringE11CompileSpec"],"torch_tensorrt::torchscript::convert_method_to_trt_engine::module":[41,3,1,"_CPPv4N14torch_tensorrt11torchscript28convert_method_to_trt_engineERKN5torch3jit6ModuleENSt6stringE11CompileSpec"],"torch_tensorrt::torchscript::embed_engine_in_new_module":[37,2,1,"_CPPv4N14torch_tensorrt11torchscript26embed_engine_in_new_moduleERKNSt6stringE6Device"],"torch_tensorrt::torchscript::embed_engine_in_new_module::device":[37,3,1,"_CPPv4N14torch_tensorrt11torchscript26embed_engine_in_new_moduleERKNSt6stringE6Device"],"torch_tensorrt::torchscript::embed_engine_in_new_module::engine":[37,3,1,"_CPPv4N14torch_tensorrt11torchscript26embed_engine_in_new_moduleERKNSt6stringE6Device"],STR:[6,0,1,"c.STR"],TORCHTRT_API:[10,0,1,"c.TORCHTRT_API"],TORCHTRT_HIDDEN:[12,0,1,"c.TORCHTRT_HIDDEN"],TORCH_TENSORRT_MAJOR_VERSION:[8,0,1,"c.TORCH_TENSORRT_MAJOR_VERSION"],TORCH_TENSORRT_MINOR_VERSION:[9,0,1,"c.TORCH_TENSORRT_MINOR_VERSION"],TORCH_TENSORRT_PATCH_VERSION:[7,0,1,"c.TORCH_TENSORRT_PATCH_VERSION"],TORCH_TENSORRT_VERSION:[13,0,1,"c.TORCH_TENSORRT_VERSION"],XSTR:[11,0,1,"c.XSTR"]}},objnames:{"0":["c","macro","C macro"],"1":["cpp","class","C++ class"],"2":["cpp","function","C++ function"],"3":["cpp","functionParam","functionParam"],"4":["cpp","enum","C++ enum"],"5":["cpp","enumerator","C++ enumerator"],"6":["cpp","member","C++ member"],"7":["cpp","templateParam","templateParam"]},objtypes:{"0":"c:macro","1":"cpp:class","2":"cpp:function","3":"cpp:functionParam","4":"cpp:enum","5":"cpp:enumerator","6":"cpp:member","7":"cpp:templateParam"},terms:{"002s":60,"004s":58,"005s":[60,61],"006s":[58,61],"00f1b6db":[58,60,61],"02s":61,"04it":64,"0676ba61":[60,63],"06s":58,"07s":[58,60,61],"0a0":[57,58],"0a3":57,"0c106ec84f199a0fbcf1199010166986da732f9b0907768c9ac5ea5b120772db":91,"0mib":[58,60,61,62],"0rc1":57,"10240mib":62,"10b0":57,"112mib":57,"11k":[58,60,61],"11w":58,"12288mib":57,"12k":60,"13x":58,"14x":59,"15w":60,"15x":59,"1rc0":57,"1ubuntu0":57,"1x1":63,"200w":61,"20w":62,"2453mib":57,"24576mib":[58,60],"2462mib":57,"246kb":58,"24k":[58,60,61],"250w":57,"26w":57,"28c":58,"29c":60,"2_20200626":91,"2c3":83,"2c365_subsampl":[58,60,61],"2c916ef":57,"300x300":63,"320w":62,"32bit":94,"32x32":60,"350w":[58,60],"353k":[58,60,61],"35k":[58,60,61],"35x":58,"366kb":60,"39c":57,"39mib":57,"3x3":64,"40mb":60,"42c":62,"42w":57,"442k":[58,60,61],"47681mib":61,"4fef":[58,60,61],"4mib":57,"51c":61,"53k":[58,60,61],"55c":57,"55k":[58,60,61],"608kb":61,"62w":61,"62x":59,"64bit":94,"67mib":57,"7ubuntu0":57,"818977576572eadaf62c80434a25afe44dbaa32ebda3a0919e389dcbe74f8656":91,"84e944ff11f8":[58,60,61],"84x":60,"86k":[58,61],"89k":[58,61],"8bit":64,"91a9cc5850784b2065e8a0aa3d526fd9":57,"9205bed204e2ae7aafd2e01cce0f21309e281e18d5bfd7172ef8541771539d41":91,"92k":60,"94k":[58,60,61],"99th_p":[57,59],"9ab0":[58,60,61],"abstract":[69,72,83],"boolean":64,"break":[64,82],"byte":57,"case":[1,2,3,50,53,59,62,63,65,69,72,91,92,93],"catch":[66,89],"char":[4,5,48,89,94],"class":[31,32,33,34,48,49,50,51,56,58,59,60,61,62,63,64,69,72,82,83,88,89,90,92],"const":[1,2,3,4,5,31,32,33,34,35,36,37,39,41,48,49,50,66,72,74,89,92],"default":[1,2,3,4,5,17,31,32,33,34,47,49,50,52,53,57,58,60,61,62,63,80,81,82,89,91,92,94,95],"enum":[1,2,3,46,49,50,56,58,92],"export":[57,64,91],"final":[57,65,68,70,91],"float":[53,57,58,60,62,63,74,88,89,90,92,94,95],"function":[1,2,3,4,5,50,52,53,56,57,58,59,60,62,63,64,66,69,72,88,89,91,92,95,96],"import":[57,58,59,60,61,62,63,64,66,80,82,88,89,90,91,93,94,95],"int":[1,4,5,39,48,49,53,58,61,64,74,80,89,94],"long":[53,59,65,82,83,86,94],"new":[1,2,3,4,5,36,37,50,52,53,58,60,62,63,64,69,70,72,82,89],"null":57,"public":[1,2,3,4,5,48,49,50,52,53,83,92],"return":[1,2,3,4,5,25,26,31,32,33,34,35,36,37,38,41,46,47,48,49,50,57,58,59,60,61,62,64,66,68,69,70,72,88,89,90,92],"short":[66,82,83],"static":[52,53,65,72,80,89],"super":[48,62,88],"throw":[66,89,94],"true":[1,2,3,5,50,53,57,58,59,60,61,62,63,64,66,72,74,80,83,89,92,95,96],"try":[57,58,59,60,62,70,82,83,89,95],"var":74,"void":[4,5,27,28,29,30,39,40,46,48,49],"while":[64,91,92],And:89,Are:46,Bus:[57,58,60,61,62],But:[82,89],CLS:59,DOS:83,For:[58,60,62,63,64,65,80,82,83,88,89,91,92,93,95],IDs:63,Its:[72,82],NOT:59,Not:4,One:[59,82,83,89],PRs:89,THE:82,That:82,Thats:89,The:[2,50,52,53,57,58,59,60,61,62,63,64,65,66,67,68,69,70,72,80,83,88,90,91,92,94,95],Then:[91,92,95],There:[5,59,63,64,65,70,72,83,88,91,92,93],These:[58,59,60,65,69,80,82,92],Use:[53,57,64,72,92],Useful:73,Using:[5,63,64,73,83,96],VMS:83,Will:35,With:[58,59,60,61,80,82,89,92],___torch_mangle_10:88,___torch_mangle_4847:69,___torch_mangle_5:88,___torch_mangle_9:88,__and__:74,__attribute__:47,__future__:57,__getitem__:74,__gnuc__:47,__init__:[62,82,88],__is__:74,__isnot__:74,__not__:74,__or__:74,__range_length:74,__round_to_zero_floordiv:74,__torch__:[69,88,89],__torch___pytorch_detection_ssd_src_model_ssd300_trt_engin:69,__torch___torchvision_models_resnet____torch_mangle_4847_resnet_trt_engin:69,__version__:64,__visibility__:47,__xor__:74,_affin:64,_all_:66,_bs:57,_calibr:64,_convolut:[64,74,89],_input_quant:64,_jit_intern:57,_jit_to_backend:95,_pair:64,_quant:64,_theme:87,_tmp:51,_trace:57,_validate_not_a_forked_repo:[60,61,63],_weight_quant:64,a100:[57,58,59,60,62,63],a1b:83,aarch64:70,abi:93,abil:61,abl:[58,59,60,61,62,63,65,66,72,73,92,95],about:[58,60,61,63,64,65,69,72,80,89,91,94],abov:[27,63,64,81,82,89,91],abs:74,absl:57,absolut:64,absolute_import:57,acc:64,acceler:[58,59,60,62,63,96],accept:[52,59,64,69,72,89,90,94],access:[61,63,66,72,73,80,89,95],accord:72,accordingli:[64,80],accumsan:85,accumul:53,accuraci:[63,64,92],achiev:[58,60,62,63,64],aco:74,acosh:74,acoust:57,acquir:89,across:[66,80],acthardtanh:72,action:82,activ:[64,82,89,92,96],activationtyp:72,actual:[62,64,66,69,72,88,89],adaptive_avg_pool1d:74,adaptive_avg_pool2d:74,adaptive_avg_pool3d:74,adaptive_max_pool1d:74,adaptive_max_pool2d:74,adaptive_max_pool3d:74,adaptiveavgpool2d:[60,61],add:[28,65,66,72,74,80,82,87,89,90,91],add_:[66,74,89],add_patch:63,addactiv:72,added:[27,65],adding:94,addit:[63,64,66,89],addlay:89,address:83,addshuffl:89,adipisc:[83,85],adjac:82,adjust:[64,82],adjust_lr:64,adopt:59,advanc:[83,92],advis:82,aenean:85,affin:[60,61],after:[61,63,64,65,66,73,88,89,90,93,94],again:[48,59,63,69,72,82],against:[89,94],agre:[57,58,59,60,61,62,63],agx:49,ahead:[61,89],aim:[59,66],aiohttp:57,aiosign:57,alabast:57,algo_typ:92,algorithm:[4,5,31,32,33,34,48,59,92],alias:47,align:82,align_corn:74,aliquam:85,aliquet:[83,85],all:[17,46,47,48,49,53,57,58,59,60,61,62,63,64,66,69,82,83,88,89,90,91,92,93,94],alloc:72,allow:[52,53,58,60,62,63,65,66,80,94],allow_gpu_fallback:[49,50,92,95,96],allow_tf32:74,almost:89,alpha:[63,74,83],alreadi:[57,58,59,60,61,62,63,64,65,66,89,92,94],also:[31,34,53,58,59,60,61,62,63,65,72,73,80,82,83,89,90,91,92],alter:61,altern:52,although:82,altogeth:80,alwai:[4,5,29,82,94],amax:64,amax_sequeez:64,amazonaw:[58,60,61],amet:[83,85],amount:[59,64],amp:[58,60,61],amp_backend:57,analogu:72,analysi:63,analyt:80,analytics_id:80,ancient:82,ani:[52,57,58,59,60,61,62,63,65,72,80,82,89,90,91,92,94],ann:82,anneal:64,annot:[63,72,89],anonym:82,anoth:[59,82,83,88,90],ant:85,antlr4:57,anyon:83,anyth:[82,83,93],aot:[61,73,89],apach:[57,58,59,60,61,62,63],apex:63,api:[57,61,63,64,70,72,81,89,90,92,93,95],appdir:57,appear:82,append:[57,58,59,60,61,62,63,64,74],applehelp:57,appli:[64,92],applic:[2,31,34,50,57,58,59,60,61,62,63,66,70,89,90,93,94,95,96],approach:[58,60,62,63],apr:[57,89],apt:57,arab:83,arang:74,architectur:[59,63,64,73,91],archiv:[57,60,63,91],arcu:[83,85],area:84,aren:89,arg:[57,65,86,89],argc:89,argmax:[58,59,60,61],argon2:[57,60,61,62,63],argpars:57,argument:[52,57,58,59,64,66,69,72,82,83,89,94],argv:89,around:[64,66,69,72,82,85,88],arrai:[4,5,37,57,59,65],arrayref:[49,52,53],arti:[58,60,61],arxiv:92,asin:74,asinh:74,aspect:94,asr:57,asr_model:57,assembl:[65,89],assign:[4,5,81],associ:[59,65,72,89],associatevalueandivalu:72,associatevalueandtensor:[72,89],assum:[57,64,95],ast:57,asttoken:[57,61,63],async:57,asyncio:[57,60,61,62,63],atan:74,atanh:74,aten:[53,63,64,66,71,72,74,89],attach:63,attent:59,attention_mask:59,attention_masks_tensor:59,attr:[57,60,61,62,63],attrdict:57,attribut:[66,69,82,89],auctor:85,audio:57,audioread:57,augment:59,augu:85,auth:57,author:83,auto:[48,72,82,83,89,92,96],autodoc:[82,83],automat:[58,60,62,63,82,89],avail:[58,60,61,62,63,72,80,91,94,96],ave:[60,61,62],averag:[53,58,60,61,62,63,64,94],avg:[58,63,64,94],avg_pool1d:74,avg_pool2d:74,avg_pool3d:74,avgpool:[60,61,63,64],avoid:[58,59,60,61],awai:82,await:[58,60,61],awaken:82,axes:[58,60,61],axi:[58,60,61,64,74],b_hh:74,b_ih:74,babel:57,back:[66,69,70,82,88,89],back_insert:48,backbon:[59,63],backcal:[57,60,61,62,63],backend:[57,58,59,60,61,62,63,64,81,95],background:[82,88],backlink:82,backport:57,backward:64,bar:[80,82],base:[40,54,55,58,59,60,62,63,64,69,82,88,91,92],basebal:59,baselin:[61,64],bash:91,basi:[57,58,59,60,61,62,63,82],basic:[64,83,94],batch:[4,5,48,57,58,59,60,61,62,63,64,92,96],batch_norm:[72,74],batch_siz:[48,57,59,63,64,92],batched_attention_mask:59,batched_data_:48,batched_indexed_token:59,batched_segment_id:59,batchnorm2d:[60,61],batchnorm:[63,66],batchsiz:57,batchtyp:48,bathroom:82,bazel:[70,91],bazel_vers:91,bazelbuild:91,bazelisk:91,bazelvers:91,bbox:63,bdist_wheel:91,beat:83,beautifulsoup4:[57,61],becaus:[59,72,88,89,91],becom:[59,72],bee:82,been:[65,72,83,89],befor:[53,61,63,64,66,70,72,73,89,91],beforehand:89,begin:[48,59,82,91],beginn:88,begun:82,behav:[63,84],behavior:[53,63],behaviour:[57,58,59,60,61,62,63],behind:82,being:[58,60,62,63,89],belong:82,below:[59,63,72,82,89,91],benchmark:[58,59,60,62,74],benefit:[72,89],bertformaskedlm:59,bertforpretrain:59,bertforsequenceclassif:59,berttoken:59,besid:82,best:[58,60,61,62,63,82,91],best_result:63,best_results_per_input:63,best_results_per_input_trt:63,beta:74,better:[58,60,62,63,88,92],between:[63,66,72,82,83,91,92],bfe5ad2:58,bia:[59,60,61,62,64,66,74,89],bibendum:85,bibliograph:83,bibtex:57,bidirect:59,bigger:82,bin:91,binari:[48,92],bind:[4,5,37,48,57,60,61,62,63,82],bird:[58,60,61,64],bit:[53,59,72,89],bitbucket:80,bitbucket_url:80,black:[57,63],blandit:85,blank:82,bleach:[57,60,61,62,63],blob:[71,80,92],block0:66,block1:66,block:[65,66,86,94],blue:82,bmm:74,bn1:[60,61],bn2:[60,61],bn3:[60,61],bodi:[82,83],bold:82,bool:[1,2,3,4,5,26,29,32,33,35,46,48,49,50,53,66,72,74,80,89,92],border:82,bot:63,both:[58,60,62,63,80,82,88,91,92],boto3:57,botocor:57,bottleneck:[60,61],bottom:80,bound:[63,64],box:[63,82],braceexpand:57,bracket:82,branch:[59,91],bread:82,breed:[58,60,61],briefli:88,broadli:59,broken:[57,58,59,60,61,62,63],brontosaurus:82,browser:82,bsd:[46,47,48,49],buffer:[4,5],bug:91,bui:83,build:[31,32,33,34,38,53,57,58,65,68,70,72,81,86,89,92,94],build_fil:91,builderconfig:49,built:[37,69,70,91,94],bust:[58,60,61],button:[80,82],c10:[1,2,49,50,52,53,89,92],c96b:61,c_api:71,c_str:[72,89],ca6b:[58,60],cach:[4,5,31,32,33,34,48,57,60,61,63,64,89,92,94],cache_:48,cache_fil:[48,92],cache_file_path:[4,5,31,32,33,34,48],cache_file_path_:48,cache_size_:48,cachecalibr:92,cachetool:57,cackl:83,cadenc:61,calcuat:64,calcul:[52,65,89],calendar:57,calib:64,calib_output:64,calibr:[4,5,31,32,33,34,48,53,64,89,92,94],calibrate_model:64,calibration_cache_fil:[31,32,33,34,92],calibration_dataload:[32,33,92],calibration_dataset:92,calibrationalgo:92,call:[31,32,33,34,36,53,57,58,59,60,62,63,64,66,69,72,82,88,89,95],callmethod:88,can:[1,2,5,31,32,33,34,41,50,52,53,57,58,59,60,61,62,63,64,65,66,68,69,70,72,80,82,88,89,90,91,92,93,94,95],canada:83,cannot:[51,52,62,63,64,66,81,88],canon:80,canonical_url:80,cap:[57,58,60,61,62],capabl:[18,49,53,69,94,95],capit:[59,82],caption:[82,85,86],captur:64,car:64,card:[58,59,60],cast:[4,5,66],cat:[64,74,91],caught:66,caus:[58,60,62,63,64,72,80,91],cdll:89,ceil:74,ceil_mod:[60,61,74],cell:[59,63,83],center:[58,59,60],centercrop:[58,60,61],cerr:89,certain:[57,91],certifi:[57,59],cf0691493d05062fe3239cf76773bae4c5124f4b039050dbdd291c652af3ab2a:91,cffi:[57,60,61,62,63],chain:72,challeng:64,chanc:72,chang:[31,34,58,59,60,61,62,63,66,70,80,92],changelog:86,channel:[3,58,60,61,64,81],channel_last:61,charact:82,charset:[57,59],check:[1,2,35,50,61,63,66,72,89,91,93,94],check_method_operator_support:[22,45,49,54,55],checkmethodoperatorsupport:89,checkpoint:[57,59,60,63,64],child:83,chimpansee_amber_r_1920x1080:[58,60,61],chimpanze:[58,60,61],choic:59,choos:[58,60,88],cifar10:[64,92],cifar:[64,92],circular:64,ckpt:64,ckpt_path:64,clamp:[64,74],clamp_max:74,clamp_min:74,class_pr:64,class_prob:64,classes_to_label:63,classif:[62,63,64,88,89],classifi:[62,64,83],clean:82,clear:48,cli:94,clib:57,click:[57,59,63],clickabl:82,client:[57,60,61,62,63],clone:74,close:[64,89],closer:66,closet:82,cloud:57,cloudfront:[58,60,61],cls:59,coco:63,cocodataset:63,code:[58,59,60,61,62,63,70,73,81,83,88,89,92],collapse_navig:80,collat:83,collect:[57,58,60,62,63,64,89],collect_stat:64,colon:82,color:[26,29,82],colorama:57,colored_output_on:[29,46],column:83,com:[57,58,59,60,61,62,63,71,89,91,92,93],come:[58,60,61,62,63,81,91],command:[82,83,88,89,91,94],comment:[82,91],commodo:85,common:[57,60,63,65,66,82],common_subexpression_elimin:66,commonli:83,commun:89,compani:59,compar:[59,63,64],comparis:[1,3],comparison:[2,50],compat:[1,2,50,58,60,62,63,66,69,91],compil:[22,35,41,45,49,53,54,55,57,58,59,60,61,62,63,64,66,67,69,72,80,88,90,92,93,94,95,96],compile_set:[57,92],compile_spec:[64,92,96],compilegraph:[89,92],compilesepc:37,compilespec:[4,5,22,36,41,45,49,54,55,89,92,96],compilespecstruct:[0,54],complet:[57,58,59,60,62,63,88,89],complex:[88,91],compli:63,complianc:[57,58,59,60,61,62,63,94],compliat:92,complic:91,compon:[59,62,68,70,88,93],compos:[58,60,61,62,63,64,88,92],composit:[64,89],comprehens:63,compris:59,comput:[53,57,58,59,60,61,62,63,64,82,91,92],compute_amax:64,conceiv:82,concern:59,conclus:[57,58,59,60],conda:[57,58,59,60,61,62,63,64],condimentum:85,condit:[57,58,59,60,61,62,63,82],conduc:61,conduct:59,conf:[80,87],confid:[58,60,61,63],config:[57,58,91],configur:[36,41,52,57,61,73,86,89,91,92],confirm:57,conflict:[57,58,59,60,61,62,63],congu:85,connect:[58,60,61,66,82,96],consectetur:[83,85],consid:[61,89],consist:[59,66,82],consol:94,consolid:88,constant:[61,64,65,66,89],constant_pad_nd:74,constexpr:[1,2,3,49,50],construct:[1,2,3,4,5,50,52,53,65,66,68,70,72,82,83,89,92],constructor:[1,3,50,52,53,69,88],consult:81,consum:[5,65,88],contact:83,contain:[32,33,35,57,58,59,60,61,62,63,65,66,72,82,83,88,89,91,92,93],content:[61,86,92],context:[58,62,64,65,68,69,70],contextnet:57,contigu:[3,52,53,94],continu:[58,59,60,62,63,82,93],contributor:89,control:[62,63,88],conv1:[60,61,62,88,89],conv2:[60,61,62,88,89],conv2d:[60,61,62,64,88],conv3:[60,61],conv4_x:63,conv5_x:63,conv:[53,64,89,94],conv_asr:57,conval:85,convect:52,conveni:[63,92],convent:[58,59,60,62,63],convers:[58,62,63,64,66,69,89],conversionctx:[72,89],convert:[4,5,35,36,41,57,58,60,61,62,63,64,66,67,68,70,73,90,93,95],convert_method_to_trt_engin:[22,45,49,54,55,95],convertgraphtotrtengin:89,convien:53,convienc:[4,5,53],convnet:63,convolut:[57,58,61,63,64,92,96],coordin:70,copi:[48,57,58,59,60,61,62,63,72,74,83],copy_:74,copyright:[46,47,48,49,57,58,59,60,61,62,63,83,89],core:[49,57,58,60,61,62,63,66,70,89,94,96],corpor:[46,47,48,49,57,58,59,60,61,62,63],correct:[64,69,80,91],correctli:91,correspond:[63,64,72],cos:74,cosh:74,count_include_pad:74,counterpart:64,coupl:[58,60,62,63,65,70,93],cout:89,cp38:63,cpp:[15,16,46,47,48,49,56,66,70,89,92],cpp_frontend:92,cppdirectori:[23,54],cppdoc:89,cpu:57,cra:85,creat:[31,32,33,34,37,57,58,59,60,61,62,63,64,65,69,72,82,89,94],create_model:58,create_transform:58,creating_torchscript_module_in_python:90,credit:89,crit:64,criteria:[67,68,70],cross:[64,82],crossentropyloss:64,csrc:[66,71],cstddef:92,ctc_bpe_model:57,ctx:[72,89],ctype:89,cu102:91,cuda113:91,cuda:[53,57,58,59,60,61,62,63,64,69,89,90,91,92,95],cuda_runtim:[22,49],cudafloattyp:89,cudasetdevic:39,cudnn8:91,cudnn:[57,58,59,60,61,62,63,64],cudnn_en:74,cumsum:74,curabitur:85,curl:[82,91],current:[25,58,60,69,72,80],cursu:85,custom:[58,60,91],cut:82,cxx11:93,cycler:57,cython:57,d17fnq9dkz9hgj:[58,60,61],dapibu:85,data:[1,3,4,5,31,32,33,34,48,50,52,53,57,58,59,60,62,63,64,65,68,70,72,74,82,86,92,94],data_dir:92,data_item_1:81,data_load:64,databas:57,dataflow:[72,89],dataload:[5,31,32,33,34,48,53,64,92],dataloader_:48,dataloadercalibr:92,dataloaderopt:92,dataloaderuniqueptr:[5,48],dataset:[31,34,63,64,92],datatyp:[2,22,42,49,50,52,53,54,55,58,90],datatypeclass:[0,54],date:83,dateutil:[57,60,61,62,63],david:83,dbg:91,ddof:[57,59],dead_code_elimin:66,deal:72,debian_frontend:57,debug:[17,29,49,53,64,72,94,95],debugg:94,debugpi:[57,60,61,62,63],decid:62,declar:[64,91],decod:[58,59,60,61],decode_result:63,deconvolut:96,decor:[57,60,61,62,63],dedic:[66,83],deep:[58,59,60,61,62,63,64,72,73,80,92,96],deeplearn:71,deeplearningexampl:63,deer:64,def:[57,58,59,60,61,62,63,64,82,88],default_tim:[57,59],defer:61,defin:[1,2,3,4,5,17,18,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,47,50,51,52,53,56,57,59,61,62,64,80,88,89,90,92,94],definit:[56,72,82],defusedxml:[57,60,61,62,63],deiti:82,delet:[1,2,3,49,50,66],delimit:66,demo:[58,59,60,63,82,86,92],demonstr:[57,58,59,60,61,62,63,82,83,84,92],demonstrat:[58,60],denorm:63,denot:[59,82],dep:91,depend:[31,34,38,57,61,63,64,65,70,89,93],depickl:69,deploi:[58,60,61,62,63,68,70,73,89,92],deploy:[58,60,62,63,64,89,90,92,93,94,96],deprec:[57,74],depth:80,dequantizelay:64,descclassnam:82,descnam:82,describ:[53,60,62,63,72,88,95],descript:[61,83],deseri:89,design:[58,59,60,62,63,96],desir:[64,83,92],destini:83,destroi:[72,83],destructor:72,detail:[58,60,61,64,88,89,93],detect:[52,60,64,69],detections_batch:63,determin:[58,66],determinist:74,develop:[57,58,59,60,62,63,73,82,83,89,91],devhelp:57,deviat:94,devic:[0,22,37,39,42,49,53,54,55,58,60,62,63,64,69,74,90,92,94,95,96],device_typ:[49,50,92,95,96],deviceclass:[0,54],devicetyp:[22,42,49,50,54,55,92,95,96],devicetypestruct:[0,54],diam:85,dict:63,dictionari:[59,95],dictum:85,dictumst:85,did:82,didn:82,differ:[31,34,59,61,62,63,64,66,70,73,80,88],differenti:[58,60,62,63],digit:57,dignissim:85,dilat:[60,61,62,63,64,74],dim0:74,dim1:74,dim:[58,60,61,64,74],dim_int:74,dim_intlist:74,dimens:[52,61,66],dir:64,direct:[86,93],directli:[72,73,91,92],directori:[19,20,21,22,23,46,47,48,49,51,54,64,91,92],disabl:[58,60,61,62,63,64,80,81,91,94],disable_calib:64,disable_qu:64,disable_tf32:[49,53,92],disclos:91,disconnect:82,discret:82,discuss:61,disp:[57,58,60,61,62],displai:[80,94],display_github:80,display_gitlab:80,display_vers:80,disregard:58,dist:91,distanc:57,distdir:91,distribut:[57,58,59,60,61,62,63,89,92,93],div:74,div_:74,divis:57,divisor_overrid:74,django:81,dl_open:93,dla:[2,49,50,73,94],dla_cor:[49,50,92,94,95,96],dla_standalon:94,dlacor:94,doc:[64,70,71,80,81,82,87,91],docker:[57,58,59,60,62,63],docopt:57,docsrc:70,docstr:[82,83],document:[46,47,48,49,54,55,58,60,61,70,80,82,83,86,87,88,89,92,93,95],docutil:[57,82,83],doe:[47,48,59,63,66,72,82,92],doesn:[64,82,88,89],dog:64,doing:[65,66,89,92],dolor:[83,85],domain:[83,92],don:[62,72,80,82,83,92],done:[57,61,63,65,70],donec:[83,85],dont:46,dothismethod:82,dotpai:81,dotpayprovid:81,doubl:[53,82,94],down:[58,60,62,63,80,91],download:[57,58,60,62,63,64,86,91,92],downsampl:[60,61],doxygen:51,doxygen_should_skip_thi:[48,49],doxygenstruct:51,dream:83,driver:[57,58,60,61,62,91],drop:[63,80,91],dtype:[49,52,53,57,58,59,60,61,62,63,64,74,90,94],dual:82,due:[4,5,58,60,62,63,64,81,82,91],dui:[83,85],dummi:59,dump:[40,91,94],dump_build_info:[22,42,49,54,55],durat:82,dure:[53,64,72,92,93,94],dynam:[52,53,63,64],e1109:64,each:[4,5,53,59,63,64,65,66,69,72,80,82,89,91],eager:[58,60,62,63],ear:82,earliest:64,eas:47,easi:[65,66,89,92,94],easier:[59,64,68,70,72,89,92],easiest:91,easili:[4,5],ecc:[57,58,60,61,62],echo:82,ecosystem:[58,60,62,63],edg:82,edgecolor:63,edit:80,editdist:57,edu:92,effect:[57,64,66,80,89,92],effici:72,efficientnet:[60,63],efficientnet_b0:58,efficientnet_b0_model:58,efficientnet_preprocess:58,efficitur:85,effort:61,egesta:85,eget:85,either:[52,53,57,58,59,60,61,62,63,72,80,82,88,89,91,94],eleifend:83,element:[59,69,82,83,86],element_typ:48,elementum:85,elit:[83,85],elk:82,els:[47,48,52,57,64,82,83],elu:74,emb:[37,83,94],embed:[69,74,82,94,96],embed_engine_in_new_modul:[22,45,49,54,55],emit:65,emphasi:82,emploi:59,empti:[53,62,83,88],emum:[17,18],enabl:[4,5,26,53,58,60,61,62,63,64,67,68,70,80,94],enable_calib:64,enable_precis:89,enable_qu:64,enabled_precis:[49,53,57,58,59,60,61,62,63,64,89,90,92,95,96],enalbed_precis:96,enc:59,enc_input:59,encdecctcmodelbp:57,encod:[57,59,69],encoded_input:59,encorag:[58,59,60,61],encount:91,end:[48,72,74,82,89,92,94],end_dim:[74,89],end_tim:[57,58,59,60,61,62,63,64],endif:[47,48,49],energi:82,enforc:89,engin:[1,2,18,36,37,41,49,50,52,53,57,59,61,65,68,70,73,80,89,90,92,93,94,95,96],engine_converted_from_jit:89,enginecap:[0,22,42,49,53,54,55,95],english:59,enhanc:[63,82],enim:85,enjoi:59,enough:64,ensur:[31,34,64,66],enter:[59,65],entir:[64,82],entiti:82,entri:[53,72],entropi:[31,32,33,34,64,92],entropy_calibration_2:92,entrypoint:[57,60,61,62,63],enumer:[1,2,3,17,18,50,59,64],environ:[57,58,59,60,61,62,63],epoch:64,eps:[60,61,74],equat:82,equival:[36,62,63,68,70,72,88,89,92],equivil:41,erat:85,erf:74,eric:82,ero:85,error:[17,53,57,58,59,60,62,63,65,66,70,82,89,91,94],eskimo_dog:58,essenc:82,essenti:61,est:85,eta:[58,60,62,63],etc:[80,82,96],etiam:85,euismod:85,eval:[57,58,60,61,62,63,64,89,90],evalu:[63,68,69,70],evaluated_value_map:[65,72],even:89,event:52,everi:89,everyth:17,exactli:[59,63],examin:59,exampl:[52,58,60,61,62,63,64,69,70,72,80,81,83,86,88,89,92,93],exceedingli:82,except:[57,58,59,60,61,62,63],exception_elimin:66,excerpt:83,excit:57,execpt:66,execut:[37,57,58,60,61,62,63,66,68,69,70,88,89,92,94],execute_engin:[69,89],exert:82,exeuct:69,exhaust:89,exist:[5,35,36,41,57,91,92],exp:74,expand:[66,74],expand_a:74,expanded_pad:64,expect:[52,53,58,59,60,61,62,63,66,72,89],experi:[58,59,60,62,63],experiment:64,explan:61,explic:[48,64],explicit:[4,5,49,61,66,73,82,92],explicitli:[59,64,67,68,70,92,95],explict:48,explictli:1,expon:74,export_util:57,expos:92,express:[57,58,59,60,61,62,63,82],ext:[82,83],extend:[57,68,70,72,74,89],extens:[57,59,63],extent:[61,73,89],extern:[80,82],extra:[53,89],extract:89,extractor:62,extrem:82,eyes:82,f16:[89,94,96],f32:94,facecolor:63,facilisi:85,fact:91,facto:82,factori:[5,31,32,33,34,92],fail:[89,96],fake:64,fake_quantize_per_:64,fake_quantize_per_channel_affin:[64,74],fake_quantize_per_tensor_affin:[64,74],fallback:[67,68,70,72,94,96],fals:[1,2,3,4,5,48,49,50,53,57,60,61,63,64,74,80,81,82,83,89,92,95],fame:85,famili:[58,60,62,63,64],familyhandyman:[58,60,61],fan:[57,58,60,61,62],far:82,fashion:89,faster:64,fastjsonschema:61,fasttext:57,faucibu:85,fbed:[58,60,61],fc1:[62,88,89],fc2:[62,88,89],fc3:[62,88,89],feat:[62,88,89],featur:[57,58,59,60,61,62,63,64,89,92,94,95],feb:[58,60,62],fed:[4,5,52],feed:[31,32,33,34,64,89],feel:[61,73],feli:85,feugiat:[83,85],few:[58,60,62,63],ffmpeg:57,field:[4,5,92],fifth:83,fig:[58,60,61,63],figur:[83,85],file:[1,2,3,4,5,6,7,8,9,10,11,12,13,17,18,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,50,51,52,53,57,58,59,60,61,62,63,64,69,70,80,81,83,87,89,91,92,94],file_path:94,filelock:[57,59],filer_publ:[58,60,61],filer_public_thumbnail:[58,60,61],fill:[57,58,59,60,62],filter:[57,63,64],find:[5,51,59,63,89],fine:[57,64],finetun:64,finibu:85,finish:63,first:[52,57,59,62,63,64,65,66,82,83,89,90,92],fit:82,five:63,fix:[53,60,63,82,96],fixed_s:[49,53],flag:[64,67,68,70,91,93,94],flatten:[62,74,88,89],flatten_convert:89,flexibl:[58,60,62,63],float16:[57,58,60,62,63,94],float32:[52,53,57,58,59,60,61,64,94],float_int:74,floor:74,floor_divid:74,floordiv:74,flow:[62,63,64,72,82,88],flox:82,fluent:59,flush:82,fly:88,fmax:57,fmin:57,focal:57,fold:83,follow:[37,57,58,59,60,61,62,63,64,69,80,82,83,87,88,89,91,92,93,94],fonttool:57,foo:[82,83],footprint:[58,60,62,63],forc:[80,94],form:[57,59,65,82],format:[37,49,52,53,57,58,59,60,61,62,63,64,74,82,83,90,94],forth:83,forum:91,forward:[31,32,33,34,36,37,62,64,69,72,88,89,92,95],found:[46,47,48,49,57,58,60,61,62,63,82,89,91,92,93],four:[82,83],fp16:[1,52,53,59,61,62,63,64,73,89,90,94,96],fp32:[1,52,53,59,61,62,63,64,73,92,94],frac:82,framework:[58,60,62,63],franc:59,freed:72,freeli:61,freeze_modul:66,fri:58,friend:49,fringilla:85,frog:64,from:[1,2,3,4,5,31,32,33,34,48,50,51,52,53,57,58,59,60,62,63,64,65,66,68,69,70,72,73,80,81,82,83,88,89,92,94],from_pretrain:[57,59],frozen:64,frozendict:57,frozenlist:57,fssl:91,fsspec:57,fstream:[21,48],full:[53,64,72,89,92,93,94,96],fulli:[35,66,89,92,94,96],fusc:85,fuse:[58,60,62,63],fuse_addmm_branch:66,fuse_flatten_linear:66,fuse_linear:66,fusion:72,futur:[57,58,59,60,62,64],futurewarn:57,g2p:57,gain:63,game:59,gamma:74,gatewai:81,gaurd:47,gcc:[70,89],gdown:57,gear:92,geforc:[58,60,62],gener:[4,5,31,34,57,58,59,60,61,62,63,64,66,69,70,72,80,82,83,86,88,89,91,92,94],genutil:[57,60,61,62,63],geometr:59,get:[1,2,3,4,5,25,38,48,50,63,64,66,72,91,92],get_batch_impl:48,get_build_info:[22,42,49,54,55],get_coco_object_dictionari:63,get_is_colored_output_on:[19,43,46,54,55],get_logging_prefix:[19,43,46,54,55],get_model_size_mb:57,get_reportable_log_level:[19,43,46,54,55],getattr:[57,66,69,88,89],getbatch:[4,5,48],getbatchs:[4,5,48],getdimens:[72,89],getoutput:[72,89],git:86,gitdb:57,github:[57,58,59,60,62,63,71,80,89,91,92,93],github_url:80,gitlab:80,gitlab_url:80,gitpython:57,give:[62,80,82],given:[52,53,59,63,66,88,89,94,95],global:[28,64,89],gnu:91,goal:72,goe:[64,82],going:[48,58,60,61,62,63,64,88,89],good:[48,72,82],goodger:83,googl:[57,59,80],got:[82,89],govern:[57,58,59,60,61,62,63],gpu:[2,36,39,41,49,50,57,58,59,60,61,62,63,64,89,92,94,95,96],gpu_id:[39,49,50,92,94,95,96],granular:62,graph:[17,35,36,41,49,57,58,60,61,62,63,64,65,68,70,72,73,88,89,94],graphic:61,graphnam:[57,59],gravida:85,great:[58,60,62,63,82,89],green_mamba:[60,61],group:[64,74,82,83],grpcio:57,gru_cel:74,gtc:73,guangzhou:83,guard:66,guard_elimin:66,guess:59,gui:82,guid:81,gulf:[58,60,61],h5py:57,habit:85,habitass:85,hac:85,hack:48,hakaimagazin:[58,60,61],half:[59,61,62,63,64,82,89,90,92,94,95,96],handl:[63,66,69],happen:[62,64,88],hardtanh:[72,74],hardtanh_:74,hardwar:[58,60,62,63,96],has:[57,58,59,60,61,62,63,64,65,66,67,68,70,72,82,83,88,89,92],hasattr:57,hash:91,have:[31,34,37,48,57,58,59,60,61,62,63,65,66,72,73,82,88,89,91,92,94],haven:89,head:63,header:[58,60,61,80,82,83,89],heart:83,heaven:82,heck:82,heh:83,hehe:83,height:82,help:[29,57,58,59,60,62,64,65,72,89,93,94],helper:[57,62,63,64,72],henc:59,hendrerit:85,here:[48,57,58,59,60,61,62,63,65,69,80,82,83,88,89,91,92,93],hermet:91,hexagram:82,hfile:[23,54],hidden:[47,59,80],hierarchi:64,high:[58,60,63,66,80],higher:[59,66,80,82,88],highfreq:57,highli:61,highlight:82,hinton:92,his:82,hist_percentil:64,histogram:64,historgram:64,hit:57,hold:[50,52,65,72,92],holder:[69,84],holi:82,home:91,hood:[70,90],hope:83,hors:64,host:[60,61,62,63,64,91],how:[4,5,58,59,60,61,63,64,82,84,86,88,93,95],howev:[31,34,58,60,62,63,80,81,91],html:[64,71,82,88,91,92],html_theme:87,html_theme_opt:80,html_theme_path:87,htmlhelp:57,http:[57,58,59,60,61,62,63,64,71,80,82,88,89,91,92,93],http_archiv:91,hub:[57,59,60,63],huge:59,huggingfac:[57,59],human:82,humankind:83,huski:[58,60,61],hydra:57,hyperlink:82,hyphen:82,iaculi:85,icon:[80,82],idea:[66,82],ident:[59,94],idna:[57,59],idx:[63,74],ifndef:[48,49],ifstream:48,iii:83,iint8calibr:[4,5,31,32,33,34,48,49,53,92],iint8entropycalibrator2:[4,5,31,32,33,34,48,92],iint8minmaxcalibr:[31,32,33,34,92],ilay:72,illustr:64,imag:[58,60,61,63,64,92],image_classif:63,image_idx:63,imageio:63,imagenet:[58,60,61,64],imagenet_cla:[58,60,61],imagenet_class_index:[58,60,61],images:57,images_:92,img0:[58,60,61],img1:[58,60,61],img2:[58,60,61],img3:[58,60,61],img:[58,60,61],img_path:[58,60,61],impact:[58,59,60,62,63],imperdiet:85,implement:[4,5,58,59,60,61,62,63,66,69,81,89,92,93],impli:[57,58,59,60,61,62,63],implic:66,implicit:[74,82],importlib:[57,60,61,62,63],improv:[64,83],imshow:[58,60,61,63],in_featur:[60,61,62],in_shap:89,in_tensor:88,incas:48,includ:[14,16,17,38,40,46,47,48,49,56,58,60,62,63,67,68,69,70,80,82,88,89,91,92,94],includedirectori:[23,54],includehidden:80,incompat:91,incorpor:83,incorrect:64,incred:86,ind:[58,60,61],inde:[58,60,62,63],indent:82,independ:63,index:[37,57,58,59,60,61,62,63,64,71,73,74,80,86,92],indic:[57,59,74,80,82],indigo_bunt:58,indirect:82,inetworkdefinit:65,infer:[57,58,59,60,62,64,66,89,92],inflect:57,info:[17,36,41,49,53,72,89,94],inform:[27,37,38,40,52,57,61,63,64,65,69,73,82,88,89,91,92,94,95],infrastructur:92,ingest:70,inherit:[54,55,92],iniconfig:57,init_weight:64,initi:[57,59,64,82],injuri:82,inlin:[48,57,60,61,62,63,66,83,86,89],inner:[53,83],innings:59,inplac:[60,61],input0:89,input1:89,input2:89,input:[4,5,22,31,34,37,42,48,49,53,54,55,57,58,59,60,61,62,63,64,65,66,69,72,74,83,88,89,90,92,94,95,96],input_0:[69,89],input_batch:[58,60,61],input_data:[58,60,61,62,63,64,88,90],input_file_path:[94,96],input_id:59,input_is_dynam:49,input_s:89,input_scal:74,input_shap:[57,58,60,61,62,63,64,92,96],input_spec:94,input_tensor1:59,input_tensor2:59,input_tensor3:59,input_tensor:[57,58,60,61],inputclass:[0,54],inputrang:89,inreleas:57,insert:[64,89,92],insid:82,inspect:[58,60,62,63,72,88,89],instal:[57,58,59,60,61,62,63,64,73,86,89,93],instanc:[59,62,66,88,89],instance_norm:74,instanti:[57,68,69,70,72,89],instatin:[1,2,3,50],instead:[53,57,58,59,60,61,62,63,64,65,66,89,93,94],instnanti:69,instruct:[67,68,70,89,91],insur:91,int32:[59,61],int64_t:[49,50,52,53,92,96],int8:[1,48,52,53,61,73,92,94,96],int8_t:49,int8cachecalibr:[21,31,34,44,48,54,55],int8cachecalibratortempl:[0,54],int8calibr:[4,21,32,33,44,48,54,55],int8calibratornamespac:[0,54],int_float:74,integ:[64,85],integr:[58,59,60,61,62,63,73],intend:[57,91],intent:[66,82],interact:82,intercompat:63,interdum:85,interest:[66,82],interfac:[1,2,3,50,69,70,72,92],interfer:82,intermedi:[17,58,60,62,63,88],intern:[2,17,50,58,60,62,63,64,72,82,89],interpol:[58,82],interpolationmod:58,interpret:[58,60,62,63,69,82],intro_to_torchscript_tutori:88,introduc:[58,60,62,63,64],introduct:59,invalid:64,invok:[88,89],involv:[57,58,59,60,62],ios:48,iostream:[21,22,48,49,89],ipad:57,ipso:82,ipsum:[83,85],ipykernel:[57,60,61,62,63],ipython:[57,60,61,62,63],ipywidget:[57,60,61,62,63,64],is_avail:[58,60,61],is_floating_point:74,is_tar:57,is_train:92,iscustomclass:72,isinst:64,isn:[80,82],isort:57,issu:[4,5,57,58,59,60,62,89,91],istensor:72,istream_iter:48,it_:48,ital:82,item:[57,58,59,60,61,64,81,83],itensor:[65,72,89],iter:[21,48,53,57,58,59,60,61,62,63,64,65,94],its:[31,34,58,60,62,63,65,69,72,82],itself:[1,2,3,50,66,91,94,95],ivalu:[65,69,72,89],jan:83,jarowinkl:57,jedi:[57,60,61,62,63],jetpack:91,jetpack_4:91,jetson:[58,60,62,63],jieba:57,jinja2:[57,60,61,62,63],jit:[35,36,37,41,49,57,58,59,60,61,62,63,64,65,66,68,69,70,71,72,88,89,90,94,95],jit_model:64,jmespath:57,joblib:[57,59],join:64,jpeg:[58,60,61],jpg:[58,60,61,63],jpg__1920x1080_q85_subject_loc:[58,60,61],jsmath:57,json:[58,60,61],json_fil:[58,60,61],jsonschema:[57,60,61,62,63],jupyt:[57,60,61,62,63],jupyterlab:[57,60,61,62,63],jupyterlab_widget:[60,62,63],just:[48,49,58,59,60,61,63,66,73,82,84,88,89,90,93,95],justo:[83,85],kaldi:57,kaldiio:57,kbool:[1,49],kchannelslast:[3,49],kchar:[1,49],kclip:72,kcontigu:[3,49,52],kcpu:[2,50],kcuda:[2,50,89],kdebug:[17,46,48],kdla:[2,49,50,96],kdla_standalon:[18,49],keepdim:74,kei:[59,64,82,88],kept:[64,83],kernel:[52,53,58,60,62,63,72,94],kernel_s:[60,61,62,74],kerror:[17,46],keyboard:82,keyword:57,kf16:[92,96],kfloat:[1,49,53],kgpu:[2,49,50],kgraph:[17,46,66],khalf:[1,49,89],ki8:92,kind:[57,58,59,60,61,62,63,65],kinfo:[17,46,48],kint:[1,49],kinternal_error:[17,46],kiwisolv:57,know:[46,72,80,82],knowledg:82,kriz:92,krizhevski:92,ksafeti:[18,49],kstandard:[18,49,53],ktest:92,ktrain:92,kunknown:[1,3,49],kwarg:64,kwarn:[17,46],label:[58,60,61,63,64,82,92],lacinia:85,lack:[67,68,70],lacu:85,laid:89,lambda:[60,61,63,72,82,89],lang:81,languag:[57,58,60,61,62,63,81,82,83,88],laoreet:85,larg:[58,59,60,62,63,64,68,70,80,82,89,92],larger:[80,92],largest:74,last:[3,57,63,66],latenc:[57,59],later:[31,34,59,89],latest:[58,59,60,80,91],latexcodec:57,law:[57,58,59,60,61,62,63],layer1:[60,61],layer2:[60,61],layer3:[60,61],layer4:[60,61],layer:[50,53,58,60,62,63,64,65,66,72,89,92,94,96],layer_norm:74,layout:[3,52,74],ld_library_path:91,ld_preload:93,ldd:91,lead:82,leader:82,leaky_relu:74,leaky_relu_:74,learn:[61,64,73,89,91,92,96],leas:83,least:[58,59,60,82,83],leav:[62,64,66],lectu:[83,85],left:[63,80,82],legend:82,len:[57,59,63,64,74],lenet:[88,89],lenet_script:[88,89],lenetclassifi:[62,88],lenetfeatextractor:[62,88],length:[4,5,48,58,59,60,61,74,83],leo:85,let:[50,57,58,60,61,62,63,66,72,80,82,94],letter:[57,83],level:[19,25,27,28,43,46,48,54,55,58,59,60,62,63,64,66,70,86,88],levelnamespac:[0,54],leverag:[58,60,61,62,63,92],lib:[57,58,59,60,61,62,63,64,66,89,91],libero:[83,85],librari:[38,46,47,48,49,58,60,61,62,63,64,68,69,70,72,89],librosa:57,libsndfile1:57,libtorch:[5,40,58,60,62,63,72,89,91,92],libtorch_pre_cxx11_abi:91,libtorchtrt:[89,91,94],libtorchtrt_plugin:93,libtorchtrt_runtim:93,licens:[46,47,48,49,57,58,59,60,61,62,63,89],light:82,lightn:57,lightningdeprecationwarn:57,lightningmodul:57,ligula:85,like:[58,60,62,63,65,66,69,72,81,82,88,89,90,91,92,93,94],limit:[57,58,59,60,61,62,63,66,81,92],line:[83,89,94],linear:[3,60,61,62,64,74,88],linewidth:63,link:[65,73,80,81,86,89,93,94],linux:[70,89,91],list:[19,20,21,22,35,53,56,57,59,63,64,65,69,72,74,86,89,90,91],listconstruct:[65,69,89],listunpack:[69,89],liter:83,literal:83,literal_block:82,live:[72,82],llvmlite:57,load:[57,58,60,61,63,64,69,89,90,92,93,94,95],load_calib_amax:64,load_librari:93,load_state_dict:64,loader:[57,58,60,62,63],loading_data_recip:92,loborti:[83,85],local:[63,64,66,80,89],locat:[63,91,92],lock:81,log:[16,17,20,21,23,42,48,54,55,56,59,64,66,72,73,74,77],log_debug:72,loggingenum:[0,54],logo_onli:80,lone:83,longer:[58,60,62,63,80,93],look:[57,58,59,60,61,62,63,64,65,66,88,92,95],loop_unrol:66,lorem:[83,85],lorikeet:[60,61],lose:80,loss:[64,92],lot:72,lower:[17,61,83],lower_graph:66,lower_tupl:66,loweralltupl:66,lowersimpletupl:66,lowfreq:57,lstm_cell:74,ltorchtrt:93,luctu:85,lvl:[27,28,46],machin:[58,60,62,63,69,91,92],macro:[6,7,8,9,10,11,12,13,16,19,22,23,46,49,54,56],mad:82,made:[63,66,68,70,82],maecena:85,magna:85,mai:[57,58,59,60,61,62,63,65,69,70,82,83,88,89,91,92],main:[63,66,68,69,70,72,80,82,84,89],maintain:[59,69,72],major:[58,60,62,63,70],make:[58,59,60,61,62,63,65,82,84,89,90,91,92,96],make_data_load:[5,92],make_int8_cache_calibr:[21,44,48,54,55,92],make_int8_calibr:[21,31,34,44,48,54,55,92],malesuada:85,man:[82,83],manag:[57,58,59,60,61,62,63,65,68,70,72,89],mangag:66,mani:[80,82,83],manifest_filepath:57,mantissa:53,manual:[81,82,91],manual_se:57,manylinux2014_x86_64:63,manylinux_2_17_x86_64:63,map:[2,50,65,66,68,70,72,89,92,95],mark:[58,66,80],markdown:57,marknodesforfallback:66,markup:[83,86],markup_process:82,markupsaf:[57,60,61,62,63],marshmallow:57,mask:[57,74],masked_fil:74,masked_sent:59,massa:85,master:[71,91,92,93],mat2:74,match:[53,66,91],math:86,mathemat:59,matmul:[66,74,89],matplotlib:[57,58,60,61,62,63],matric:59,matrix:71,matti:83,matur:70,mauri:[83,85],max:[52,53,60,61,62,63,64,72,74,80,94],max_bound:64,max_c:94,max_dur:57,max_h:94,max_length:59,max_n:94,max_pool1d:74,max_pool2d:[62,74,88,89],max_pool3d:74,max_shap:[49,52,61,62,90],max_val:[72,74],max_valu:64,max_w:94,maxcalibr:64,maxim:61,maximu:85,maximum:[52,53,58,59,60,61,64,94],maxpool2d:[60,61],maxpool:[60,61],mayb:82,mbs:94,mean:[57,58,59,60,61,62,63,64,72,73,74],mecab:57,mechan:[57,59,72],media:[58,60,61],median:[57,59],medium:82,mel:57,member:[50,52,53],memeori:3,memori:[21,22,48,49,53,57,58,60,61,62,63,66,72,89,90],memory_format:74,memoryformat:[3,49],men:82,mental:82,menu:[80,82,86,94],menuselect:82,messag:[17,27,28,94],meta:86,metadata:[57,69,72,80],meth:82,method:[35,36,37,41,52,57,58,60,61,62,63,64,66,72,82,88,89,91,94,95],method_nam:[35,41,49,89,94],metric:57,metu:85,middl:82,mig:[57,58,60,61,62],might:[59,64,66,80,91],min:[52,53,72,74,94],min_block_s:[49,53],min_bound:64,min_c:94,min_h:94,min_n:94,min_shap:[49,52,61,62,90],min_val:[72,74],min_valu:64,min_w:94,mind:82,mine:82,mini:[58,60,61],minim:[53,92,94],minimum:[52,53,61,94],minmax:[31,32,33,34,92],misbuild:80,miss:[82,89],mistun:[57,60,61,62,63],mix:63,mixin:57,mkdir:[58,60,61,91],mlm_model_t:59,mmb:82,mobilenet_v2:95,mod:[57,86,89,92,94],mode:[64,90,92],mode_:92,model:[57,69,88,89,90,92,94,95],model_math:63,model_nam:[57,64],model_s:57,model_state_dict:64,modelpt:57,modern:63,modifi:[83,91],modified_state_dict:64,modul:[35,36,37,41,49,53,57,58,59,60,61,62,63,64,67,68,69,70,72,73,81,82,83,90,92,94,95,96],modular:89,module_fallback:66,module_nam:94,molesti:85,momentum:[60,61,64,74],mon:61,month:57,monthli:[57,61],morbi:85,more:[58,60,61,62,63,64,65,73,80,83,88,89,91,92,93,95],most:[59,70,91,93],most_likely_token_id:59,most_likely_token_ids_trt:59,mother:82,motion:82,mous:82,move:[32,33,48,49,58,60,61,62,63,66,69,89,92],mpmath:57,mse:64,msg:[28,46,57,59],much:[72,80,82,92],mul:[64,74],mul_:74,multi:94,multidict:57,multipl:[69,82,83,92],multipli:53,must:[37,52,53,59,63,66,72,82,83,89,91,93,94],mutil:83,myclass:82,mymodel:90,mypi:63,myself:83,n01537544:58,n01739381:58,n01749939:[60,61],n01820546:[60,61],n02109961:58,n02110185:[60,61],n02481823:[58,60,61],n_fft:57,n_mel:57,nabla:82,nam:[83,85],name:[4,5,35,37,41,48,57,58,60,61,62,63,64,69,72,82,83,88,89,91,95],named_modul:64,namespac:[0,46,47,48,49,56,66,73,92],narrow:[64,74],nativ:[64,70,71,89],native_funct:71,natur:[59,82],nav:[80,86],navig:80,navigation_depth:80,nbbind:[4,5,48],nbclient:[57,60,61,62,63],nbconvert:[57,60,61,62,63],nbformat:[57,60,61,62,63],nchw:3,ncol:[58,60,61],nec:85,necessari:[46,93],need:[1,2,3,27,31,34,47,50,58,60,61,63,65,66,72,82,89,90,91,92,93],neg:74,negative_slop:74,nemo:57,nemo_1:57,nemo_asr:57,nemo_log:57,nemo_toolkit:57,nequ:[83,85],nest:[54,55,57,60,61,62,63,82,83],net:[58,60,61,72,82,83,89],netu:85,network:[31,32,33,34,58,60,62,63,64,72,89,92,96],networkx:63,neural:[58,60,63,96],new_lay:72,new_level:59,new_local_repositori:91,new_lr:64,new_siz:92,newer:[58,60,62,63],newest:57,newli:57,next:[4,5,63,64,65,69,80,82,83,92],nfilt:57,ngc:[57,58,59,60,61,62,63,91],nhwc:[3,94],nibh:[83,85],nice:91,nickel:82,night:83,nine:59,ninja:91,nisi:85,nisl:85,nlp:[31,32,33,34,59,92],nltk:57,no_grad:[57,58,59,60,61,62,63,64],node:[64,66,67,68,70,72,89],node_info:[72,89],noexcept:[4,5,48,92],non:[83,85],non_block:[64,74],none:[58,60,62,63,64,72,74,80,82],nonetheless:82,nonexist:82,noninteract:57,norm:74,normal:[1,2,3,50,57,58,59,60,61,62,63,64,82,88,89,92,96],normalized_shap:74,noskipw:48,notatemoduleforfallback:66,note:[2,50,52,59,72,80,82,89,91,96],notebook:[57,58,59,60,61,62,63,64,70],notic:[62,63],now:[57,58,59,60,62,63,66,70,72,82,89,91,95],nrow:[58,60,61],nrun:[58,60,61,62,63,64],nulla:85,nullptr:[48,49,53],num:[57,59,94],num_avg_timing_it:[49,53,95],num_batch:64,num_bit:64,num_calib_batch:64,num_class:64,num_epoch:64,num_it:94,num_loop:[57,59],num_min_timing_it:[49,53,95],num_op:94,num_work:[64,92],numba:57,number:[4,5,53,57,58,59,60,64,66,72,80,89,94],numel:74,numer:[57,83,94],numpi:[57,58,59,60,61,62,63,64],nunc:85,nvcr:57,nvidia:[36,41,46,47,48,49,57,58,59,60,61,62,63,64,71,89,91,92,93,94,96],nvidia_convnets_processing_util:63,nvidia_deeplearningexamples_torchhub:63,nvidia_efficientnet:63,nvidia_efficientnet_b0:63,nvidia_efficientnet_b4:63,nvidia_efficientnet_widese_b0:63,nvidia_efficientnet_widese_b4:63,nvidia_resnet50:63,nvidia_resnext101_32x4d:63,nvidia_resnext:63,nvidia_se_resnext101_32x4d:63,nvidia_ssd:63,nvidia_ssd_processing_util:63,nvidia_ssdpyt_amp_200703:63,nvidia_tacotron2:63,nvidia_tts_util:63,nvidia_waveglow:63,nvinfer1:[4,5,31,32,33,34,48,49,53,72,92],nvinfer:[21,48],nwarmup:[58,60,61,62,63,64],oauthlib:57,obj:74,object:[1,2,3,4,5,50,52,53,69,72,92,95],observ:[57,58,59,60,64],obsolet:63,obtain:[57,58,59,60,61,62,63,64,90],obvious:88,octet:[58,60,61],odio:[83,85],off:[57,58,60,61,62,63,69],offici:91,ofstream:[48,89],often:82,okai:53,older:70,omegaconf:57,onc:[46,47,48,49,65,66,69,92,93],one:[59,63,64,66,72,82,88,89],ones:[46,58,60,62,63,67,68,70,82,89,91],onli:[2,4,5,17,31,34,48,50,52,62,63,66,70,72,82,91,92,93,94,96],onnx:[57,66],onto:[69,94],onward:[58,60,61],op_nam:94,op_precis:[58,60,61,63],open:[58,60,61,62,63],opencc:57,oper:[1,2,3,4,5,35,48,49,50,53,58,60,61,62,63,64,65,66,67,68,69,70,72,73,90,92,94,96],ops:[58,59,60,61,63,64,66,89,93,94],opset:[68,70],opt:[52,53,57,58,59,60,61,62,63,64,91],opt_c:94,opt_h:94,opt_n:94,opt_shap:[49,52,61,62,90],opt_state_dict:64,opt_w:94,optim:[52,57,58,59,60,61,62,63,64,66,73,88,89,90,94],optimin:52,optimiz:[58,60,62,63,88],optimized_execut:57,option:[48,52,67,68,70,82,86,91,92,93,94,96],orchestra:82,orci:85,order:[53,63,72,89,90],org:[57,58,59,60,61,62,63,64,71,80,82,88,89,91,92],organ:83,origin:[57,59,63,64],original_nam:62,ornar:[83,85],ostream:49,other:[1,2,3,49,50,58,60,61,62,63,64,65,66,69,73,74,81,82,89,90,91,93,94],otherwis:[58,59,60,91,93],our:[58,59,60,61,62,63,70,88,89],out:[35,48,57,58,59,60,61,62,64,65,66,68,70,72,82,89,91],out_dir:64,out_featur:[60,61,62],out_shap:89,out_tensor:[72,89],output0:66,output:[26,29,37,51,53,58,59,60,61,62,63,64,65,66,69,72,80,82,83,89,91,94],output_file_path:[94,96],output_pad:74,output_s:[60,61,74],output_trt:59,outself:89,outsid:82,over:[58,60,61,62,68,70,82],overkil:62,overrid:[4,5,31,32,33,34,48,92],overview:[59,71,73],own:[57,58,59,60,62,72,82,89],packag:[57,58,59,60,61,62,63,64,66,89,94],pad:[57,59,60,61,64,74],padding_idx:74,padding_mod:64,page:[61,73,84,86],pair:[57,66,72,82,91,92],panda:57,pandocfilt:[57,60,61,62,63],pane:82,pangu:57,paper:[58,60,63],paragraph:[83,86],parallel:59,param_group:64,paramet:[1,2,3,4,5,27,28,29,31,32,33,34,35,36,37,39,41,50,52,53,64,65,66,72,86,88,89],parameter:57,parent:[15,16,19,20,21,22],pari:59,pars:[64,82,89],parser:82,parso:[57,60,61,62,63],part:[57,70,80,81,82,94],parti:61,partial:[58,60,62,63,82,94],particular:62,particularli:59,partit:66,pass:[57,59,64,65,67,68,69,70,72,88,89,92],past:82,patch:63,path:[5,14,15,16,31,32,33,34,62,63,64,88,89,91,92,94],path_to_torchtrt_root:91,pathspec:[57,63],pathtool:57,pathwai:88,pattern:[72,89],payment:81,peephole_optimz:66,pellentesqu:85,peopl:82,pep:82,per:[61,63,64],percentil:[57,59,64],perf:[57,58,60,61,62],perfom:64,perform:[31,32,33,34,58,59,60,61,62,63,92],performac:92,permiss:[57,58,59,60,61,62,63],permit:82,permut:74,persist:[57,58,60,61,62,82],pesq:57,pexpect:[57,60,61,62,63],pharetra:85,phase:[17,64,72,89],phasellu:85,phi:82,philosoph:82,phrase:82,pick:[62,88],pick_best:63,pickler:69,pickleshar:[57,60,61,62,63],pid:[57,58,60,61,62],piec:57,pil:[58,60,61],pillow:[57,58,63],pin:81,pin_memori:74,pip3:91,pip:[57,58,59,60,61,62,63,64,91],pipelin:[94,96],piplein:89,pipreq:57,pixel_shuffl:74,place:[52,66,82,83,84,91,92],placerat:85,plan:[70,94],plane:64,platea:85,platform:[49,58,60,62,63,70,91,94,96],platformdir:63,pleas:[57,58,64,82,89,91],plot:63,plot_result:63,plt:[58,60,61,63],pluggi:57,plugin:57,point:[80,81,82,89],pointer:[4,5,92],polish:81,pooch:57,pool:[60,61,62,63,64,96],pop:69,popular:[59,81,91],portabl:[58,60,62,63,69],portalock:57,portion:82,porttitor:[83,85],pos:59,pos_mask:59,posit:[57,59,80,94],possibl:[58,59,60,62,63,82],post1:57,post:[31,32,33,34,53,73,89,94],posuer:[83,85],potenti:[53,85],pow:74,power:[58,60,62,63,82,89],practic:[58,60,62,63],praesent:85,pragma:[46,47,48,49,92],pre:[37,57,58,59,60,64,66,92,93],pre_cxx11_abi:91,preced:82,precis:[53,59,61,62,63,73,89,90,92,94,96],precisions_str:57,pred:[58,60,61,64],pred_label:63,pred_loc:63,predict:[58,59,60,61,63],prefer:89,prefix:[29,30,46,82],preinstal:91,prelu:74,prepar:[57,58,59,60,62,63],prepare_input:63,prepare_tensor:63,preprint:92,preprocess:[57,58,60,61,64,92],preserv:[64,82,88,92],prespect:88,press:82,pretium:85,pretrain:[57,58,59,60,61,63,95],pretti:89,prev_next_buttons_loc:80,prevent:[53,94],previou:[59,80],previous:[31,34,37,89],prim:[65,66,69,74,88,89],prim_devic:74,primal:82,primari:59,primarili:[70,89],print:[17,35,48,57,58,59,60,61,62,63,64,82,89,95],print_funct:57,printout:59,printstat:[57,59],priorit:91,privat:[4,5,48,49,92],prob:[58,60,61],probabl:[58,59,60,61,63],probablil:[58,60,61],problem:[59,82],problemat:82,proce:[58,60,61],process:[57,58,59,60,61,62,63,64,81,82,88,92,94,95],prod:74,produc:[52,65,69,72,82,89],product:[53,58,60,62,63],profil:[52,62],program:[19,20,21,22,31,34,56,61,62,63,68,69,70,73,88,94],programm:82,progress:83,proin:85,project:[51,81,86],prometheu:[57,60,61,62,63],promis:57,prompt:[57,60,61,62,63],properli:91,properti:[57,59,80],propog:66,prose:82,protobuf:57,provid:[4,5,53,57,58,59,60,61,69,72,82,89,90,91,92,93,94,95],providi:[68,70],provok:82,psutil:[57,61],pth:[60,63,64],ptq:[4,5,16,19,23,42,54,55,56,73,77,94],ptq_calibr:[4,5,49,53,92],ptqtemplat:[0,54],ptyprocess:[57,60,61,62,63],pull:91,purchas:81,pure:[35,57,61,63],purpos:[63,91],puru:85,push:69,push_back:48,put:82,pwr:[57,58,60,61,62],py2:[60,62,63],py3:[57,58,59,60,62,63],pyannot:57,pyasn1:57,pybind11:57,pybtex:57,pycpars:[57,60,61,62,63],pycr:57,pydeprec:57,pydub:57,pygment:[57,60,61,62,63],pypa:[57,58,59,60,61,62,63],pypars:[57,59,60,61,62,63],pypi:[57,58,59,60,61,62,63,64,91],pypinyin:57,pyplot:[58,60,61,63],pyrsist:[57,60,61,62,63],pysock:57,pystoi:57,pytest:57,python3:[57,58,59,60,61,62,63,64,66,89,91],python:[57,58,59,60,61,62,63,64,70,82,83,89,93,94,95,96],python_api:71,pythonhost:[60,61,62,63,64],pytorch:[52,53,57,58,59,60,61,63,64,66,67,68,69,70,72,88,89,90,91,92,93,94],pytorch_lightn:57,pytorch_quant:[63,64],pytorch_sphinx_them:[80,87],pytorch_vision_v0:61,pytz:57,pywavelet:63,pyyaml:[57,59],pyzmq:[57,60,61,62,63],qat:64,qat_model:64,qthelp:57,qualiti:[58,60,63],quant:64,quant_dim:64,quant_input:64,quant_max:74,quant_min:74,quant_modul:64,quant_nn:64,quant_weight:64,quantconv2d:64,quantdescriptor:64,quantiz:[31,32,33,34,63,73,89,94],quantizatiom:53,quantizelay:64,quantlinear:64,quantoz:64,quantpool:64,quartznet:57,question:89,qui:[83,85],quick:64,quickli:[58,60,89,92,94],quisqu:85,quit:[72,89],quot:83,rais:66,raiseexcept:66,rand:89,randn:[57,58,60,61,62,63,64,89,95],random:57,randomcrop:64,randomhorizontalflip:64,rang:[52,53,57,58,59,60,61,62,63,64,94],rank:80,rapidfuzz:57,rate:64,rather:66,raw:[63,80],read:[4,5,31,32,33,34,48,57,61,80,82,92],readcalibrationcach:[4,5,48],reader:82,readi:[57,61],readm:[57,58,59,60,62,63],realiz:69,realli:72,reason:[1,63,88],reattribut:83,recalibr:[31,34],recip:92,recipi:63,reciproc:74,recognit:[57,60,64,92],recomend:[31,32,33,34],recommend:[31,32,33,34,57,58,59,60,61,62,63,64,82,89,91],recompil:63,record:[62,64,65,88],rect:63,rectangl:63,recurs:65,recursivescriptmodul:62,redistribut:83,reduc:[58,60,62,63,64,66,68,70,92],ref:82,refer:[52,64,68,70,81,86,89,90,92],referenc:[63,91],refit:[49,53,95],reflect:49,reflection_pad1d:74,reflection_pad2d:74,regard:[82,91],regardless:83,regex:[57,59],regist:[37,69,72],registernodeconversionpattern:[72,89],registri:[65,89],regular:64,reinterpret_cast:48,relat:[50,82],relationship:[54,55],releas:[57,59,82],relu:[60,61,62,74,88,89],relu_:74,remain:[58,59,60,62,63,66,92],remov:[57,58,60,62,63,64,80],remove_contigu:66,remove_dropout:66,remove_to:66,render:80,rent:83,repack:69,repeat:[74,94],replac:[59,63,66],replication_pad1d:74,replication_pad2d:74,replication_pad3d:74,report:[25,48],repositori:[58,60,63,70,80,87],repres:[52,53,64,72,82],represent:[58,59,60,62,63,66,72,88],request:[57,58,59,60,61,89],requir:[31,34,53,57,58,59,60,61,62,63,64,65,66,80,89,92,93,94],require_full_compil:[49,53,58,60,62,63],requires_grad:74,resampi:57,research:[58,60,62,63],reserv:[46,47,48,49,57,58,59,60,61,62,63],reset:48,reshap:74,residu:60,resiz:[58,60,61],resnet50:[60,61,63],resnet50_model:[60,61],resnet:[61,63,69],resnet_trt:69,resolv:[58,60,61,65,66,68,70],resolve_data_config:58,resourc:[57,60,61,62,63,65,92],respons:[31,34,58,60,61,64,69,82],respositori:59,rest:[82,83],restor:57,restrict:53,restructuredtext:[82,83],result:[57,58,59,60,61,62,64,65,66,80,88,90],results_per_input:63,ret:66,rethink:58,return_tensor:59,reus:[66,92],revert:80,revis:[82,83],revisit:82,rfc:82,rgb:[58,60],rho_:82,rhoncu:85,right:[46,47,48,49,57,58,59,60,61,62,63,66,70,72,82],risu:85,rn50_preprocess:[60,61],role:82,roll:74,roman:83,room:82,root:[46,47,48,49,57,58,59,60,61,62,63,64,80,91,92],round:[53,64],round_:64,rounding_mod:74,row:83,rsa:57,rst:[80,82],rsub:74,ruamel:57,rule:91,ruler:82,run:[2,41,50,53,57,58,59,60,61,62,63,64,65,66,67,68,69,70,72,73,82,88,89,90,91,92,93,94,95,96],runetim:61,runner:57,running_loss:64,running_mean:74,running_var:74,runtim:[57,58,60,61,62,63,73,89],rutrum:[83,85],s3transfer:57,sacrebleu:57,sacremos:[57,59],safe:72,safeti:[53,94],sage:82,sagitti:[83,85],sai:83,said:82,same:[58,60,61,63,69,80,82,88,89,91,95],sampl:[57,58,60,82,92],sample_r:57,sapien:85,satisfi:[57,58,59,60,61,62,63],save:[31,34,48,57,58,60,61,62,63,64,69,89,90,93,94],save_checkpoint:64,save_restore_connector:57,saw:89,scalar:[72,74],scalaropt_dim:74,scalartyp:[1,49,74],scale:[58,64,74,92],scale_factor:74,scale_grad_by_freq:74,scales_d:74,scales_h:74,scales_w:74,scelerisqu:85,schedul:64,schema:[72,89],scientist:82,scikit:[57,63],scikit_imag:63,scipi:[57,63],scope:66,score:[58,60,61,63],scratch:[31,34],screen:80,script:[35,59,63,64,66,88,89,90,95],script_model:[62,88,95],scripted_model:96,scriptmodul:89,scroll:[80,84],sdk:[57,58,60,62,63,71],seamlessli:[61,73],search:[59,73,80],second:[58,59,61,66,82],section:[61,64,80,82,83,84,86,89,92],secur:[57,91],sed:[83,85],see:[35,57,58,59,60,61,62,63,66,69,82,88,89,91],seen:[82,83],segment:57,segments_tensor:59,select:[18,31,32,33,34,41,53,58,60,62,63,69,74,81,84,91,92,94],self:[57,59,62,64,66,69,72,74,88,89,96],self_1:[69,89],self_int:74,sell:83,seller:81,seller_id:81,sem:85,semant:82,semper:85,send2trash:[57,60,61,62,63],senectu:85,sens:[82,89],sent:[58,60,61],sentenc:[59,82],sentencepiec:57,sentencepiecetoken:57,sentinel:[1,3],sentri:57,separ:[58,60,62,63,67,68,70],seq_relationship:59,sequenc:[57,59,82],sequenti:[60,61],serial:[37,41,68,70,89,94],serializ:[69,88],serializinghtml:57,seril:69,serv:[69,94],server:57,servic:82,session:82,session_nam:82,set:[4,5,17,22,27,29,31,34,36,39,41,49,50,52,53,58,60,62,63,64,65,66,67,68,69,70,73,80,84,87,88,89,90,91,92,96],set_devic:[22,42,49,54,55],set_is_colored_output_on:[19,43,46,54,55],set_logging_prefix:[19,43,46,54,55],set_reportable_log_level:[19,43,46,54,55,59,64],set_typecheck_en:57,setalpha:72,setbeta:72,setnam:[72,89],setproctitl:57,setreshapedimens:89,setup:[47,57,64,92],setup_multiple_test_data:57,setup_multiple_validation_data:57,setup_test_data:57,setup_training_data:57,setup_validation_data:57,setuptool:[57,60,61,62,63],sever:[17,28,59],sgd:64,sha256:91,shape:[49,52,53,57,58,59,60,62,63,64,72,74,90,94,96],share:91,shell_command:82,shellingham:57,shift:[74,82,91],ship:[64,89,93],shorthand:82,shortuuid:57,should:[1,4,5,31,34,49,53,58,61,64,65,66,67,68,70,72,73,80,82,85,92,94],show:[63,80,82],showcas:[58,60,61],shown:[59,80,82,89],shuffl:[57,64,89,92],shutterstock_780480850:[58,60,61],siberian:[58,60,61],siberian_huski:[60,61],side:[66,80,89],sidebar:[80,86],sigmoid:74,sigmoid_:74,signifi:[52,66],signific:[63,64,82],significantli:[66,80],similar:[63,72,89,93,95],simonyan:92,simpil:92,simpl:[57,58,59,60,62,63,64,82,83,88],simplejson:57,simplest:59,simpli:[61,62,66],simplic:[58,60,63],simplifi:65,simul:64,sin:[74,82],sinc:[59,62,66,82,88,89,92],sing:82,singl:[52,53,59,62,66,82,88,89,92,94],singular:72,sinh:74,sink:82,sit:[83,85],site:[57,58,59,60,61,62,63,64,66,82,89,91],six:[57,59,60,61,62,63,82],sixth:83,size:[4,5,48,52,53,57,58,59,60,61,62,63,64,66,74,80,89,92,94,96],size_t:[4,5,48,92],skip:94,slash:80,slice:74,slither:[58,60,61],sm_output:[58,60,61],small:[64,66],smaller:57,smallest:59,smi:[57,58,60,61,62],smmap:57,snake:[58,60,61],snowballstemm:57,sodal:85,softmax:[58,60,61,63,64,66,74],softwar:[57,58,59,60,61,62,63,82],sole:92,sollicitudin:85,some:[58,59,60,65,66,68,69,70,72,81,82,89,92],some_funct:82,someth:[47,66,82],someurl:82,sort:[72,74,95],sortedcontain:57,soundfil:57,soupsiev:[57,61],sourc:[46,47,48,49,58,60,63,70],sourceforg:[82,83],sox:57,space:[82,83,92],spaces_and_linebreak:82,span:83,spars:[74,94],sparse_weight:[49,53],sparsiti:[53,94],speak:59,speaker:59,spec:[52,53,58,60,62,63,94,95],specif:[36,53,57,58,59,60,61,62,63,66,68,70,82],specifi:[4,5,53,58,59,60,61,62,63,64,72,73,80,82,90,94,95],speech:57,speed:[57,58,59,60,61,63],speed_m:[57,59],speed_mean:[57,59],speedup:[57,58,59,60],sphinx:[57,80,81,82,83,87],sphinx_rtd_them:[82,83],sphinxcontrib:57,spirit:82,split:[59,74],split_siz:74,split_with_s:74,sqrt:74,squeez:[57,74],src:[69,71,74],ssd300:63,ssd300_trt:69,ssd:69,ssd_300_trace:63,ssd_pyt_ckpt_amp:63,ssd_trace:94,ssd_trt:94,sstream:[21,48],stabl:[64,71,80],stack:[57,61,63,64,69,74,92],stage:65,stand:[69,82],standalon:82,standard:[58,59,60,61,62,63,69,73,82,93,94,95],stapl:83,start:[59,61,63,64,65,74,83,91,95],start_dim:[74,89],start_step:74,start_tim:[57,58,59,60,61,62,63,64],startswith:64,stat:64,state:[57,58,59,60,64,65,72,89],state_dict:64,statement:[66,82],static_cast:48,statist:[59,64],statu:[48,83],std:[4,5,24,28,30,31,32,33,34,35,37,38,41,46,48,49,52,53,57,58,59,60,61,89,92,96],std_dev:[57,59],stderr:64,stdout:40,steamlin:92,step:[57,58,59,60,61,62,63,64,73,74,92],stft:57,stick:80,sticki:[80,86],sticky_navig:[80,84],still:[48,63,92],stitch:[62,89],stop:89,storag:92,store:[3,5,65,69,72,88,89],str:[20,47,48,54,55,58,60,61,74],straight:72,strang:82,strategi:59,stream:[58,60,61],street:83,strict:93,stride:[60,61,62,63,64,74],string:[4,5,19,21,22,24,28,30,31,32,33,34,35,37,38,41,46,48,49,53,69,72,80,89,92],stringstream:48,strip_prefix:91,strong:[58,60,62,63,82],strongli:82,struct:[2,22,42,45,49,92],structur:[31,34,50,53,58,60,62,63,70,72,80,82,86,88],structuredtext:82,stt_en_citrinet_256:57,stt_en_citrinet_256_bs128_torch:57,stt_en_citrinet_256_bs1_torch:57,stt_en_citrinet_256_bs32_torch:57,stt_en_citrinet_256_bs8_torch:57,stub:83,stuff:82,style:[46,47,48,49,80,82,83],style_external_link:80,sub:[74,82,88],sub_:74,subdirectori:56,subexpress:66,subgraph:[53,65,66,72,89,94],subject:70,submenu:86,submodul:[62,88],subplot:[58,60,61,63],subscript:82,subsect:82,subset:[64,92],substitut:82,subtitl:82,subtre:87,subword:57,successfulli:[57,58,60,62,63],sudo:91,suffic:66,suit:[61,73],sum:[53,64,74],summari:59,summarywrit:64,superscript:82,suppli:82,support:[1,2,3,29,35,50,52,53,58,60,61,62,63,64,71,73,80,81,88,89,91,94,96],sure:[89,90,91,96],suscipit:[83,85],suspendiss:85,swap:57,symbol:[37,82,91,93],symlink:87,sympi:57,synchron:[57,58,59,60,61,62,63,64],sys:64,system:[57,58,59,60,61,62,63,65,72,73,91],tabl:[86,91],tabul:57,tag:82,take:[35,36,37,41,57,58,60,62,63,65,68,69,70,72,80,82,89,92,95],taken:[58,60,63,82],talk:73,tan:74,tanh:74,tanh_:74,tar:[82,91,92],tarbal:[89,92],target:[2,37,49,50,52,53,58,60,61,62,63,69,70,73,90,92,94,95,96],targets_:92,tarred_audio_filepath:57,task:[31,32,33,34,57,59,92],techinqu:89,techniqu:[64,92],tell:[66,67,68,69,70,72,82],tellu:85,tem:94,temp:[57,58,60,61,62],templat:[21,44,48,49,54,55,80,89],tempu:85,tensor:[3,37,48,49,52,53,57,58,59,60,61,62,63,64,65,66,69,72,74,88,89,92],tensor_mod:74,tensor_qu:64,tensor_quant:64,tensor_scalar:74,tensor_tensor:74,tensorboard:[57,64],tensorcontain:72,tensorformat:[22,42,49,52,54,55],tensorformatenum:[0,54],tensorlist:72,tensorquant:64,tensorrt:[1,2,4,5,15,31,32,33,34,35,36,37,40,41,48,49,50,51,52,53,56,59,65,66,67,68,70,72,88,92,94],tensorrtcompilespec:95,tensorrtfil:[23,54],teo:94,term:[82,83,92],termin:[29,89,94],terminado:[57,60,61,62,63],test:[57,58,59,60,61,62,63,64,70,82,83,92,94],test_acc:64,test_loss:64,test_pr:64,test_prob:64,test_ptq_dataloader_calibr:92,test_ptq_trt_calibr:92,test_py_modul:[82,86],testing_dataload:[64,92],testing_dataset:[64,92],testpath:[57,60,62,63],text:[57,59,63,83,85],tf32:[53,94],tgz:91,than:[57,59,61,66,73,81,82,93],thats:[65,92],thei:[50,59,63,64,65,66,69,72,80,82,91,94],them:[57,58,59,60,62,63,66,69,80,89,91],theme:86,theori:[65,82],therebi:69,therefor:[31,34,57,58,60,62,63,69,82,89],theres:93,therfor:93,theta:82,thi:[1,2,3,31,32,33,34,46,47,48,49,50,52,53,57,58,59,60,61,62,63,64,65,66,68,69,70,72,80,81,82,84,85,86,88,89,91,92,93,94,95],thicker:82,thin:82,thing1:82,thing2:82,thing3:82,thing:[62,82,91],think:[72,82],third:[61,83],third_parti:[70,91],those:[59,65,82],though:[63,70,72,88,89,94],thought:82,threadpoolctl:57,three:[52,61,68,70,82,83],threshold:94,through:[52,57,58,59,60,61,62,63,65,66,69,73,82,89],throughout:[58,60],throughput:58,thrown:53,thu:[57,62,82],tifffil:63,time:[53,57,58,59,60,61,62,63,64,65,66,68,69,70,72,80,82,89,92,94],time_99th:[57,59],time_m:[57,59],time_mean:[57,59],time_std:[57,59],timegraph:[57,59],timeit:[57,59],timeout:57,timm:[58,60],tincidunt:85,tini:92,tinycss2:61,titan:[57,58,60,62,63],titl:[58,60,61],titles_onli:80,tmp:89,toctre:80,tocustomclass:72,todim:89,todo:80,togeth:[62,65,72,89],toilet:[58,60,61],token:[57,59],token_type_id:59,tokens_tensor:59,toml:57,tomli:63,too:[80,82,83,91],took:59,tool:[58,59,60,62,63,72,89],toolchain:[70,91],toolkit:[57,60,61,62,63,64],top:[63,70,80,84],topk:74,topolog:59,torch:[1,2,3,5,21,31,32,33,34,35,36,37,40,41,48,49,50,51,52,53,59,65,66,68,69,70,72,88,91,92,94,96],torch_executed_modul:[49,53],torch_executed_op:[49,53],torch_scirpt_modul:88,torch_script_modul:89,torch_tensorrt:[0,1,2,3,4,5,16,17,18,23,46,47,48,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,73,89,90,92,93,94,95,96],torch_tensorrt_major_vers:[20,47,54,55],torch_tensorrt_minor_vers:[20,47,54,55],torch_tensorrt_patch_vers:[20,47,54,55],torch_tensorrt_vers:[20,47,54,55],torch_tensorrtnamespac:[0,54],torchbind:69,torchhub:63,torchmetr:57,torchscript:[20,22,42,47,49,53,54,55,57,58,59,60,61,63,64,68,69,70,90,94,95,96],torchscriptstruct:[0,54],torchtrt:[47,57],torchtrt_api:[20,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,46,47,48,49,54,55],torchtrt_check:72,torchtrt_exampl:93,torchtrt_hidden:[20,47,54,55],torchtrt_unus:72,torchtrtc:[73,96],torchvis:[57,58,60,61,64,69,92,95],tornado:[57,60,61,62,63],toronto:92,tortor:85,total:64,totensor:[58,60,61,64,92],tovec:89,toward:92,tqdm:[57,59,64],trace:[57,59,63,64,88,89,90],traced_mlm_model:59,traced_model:[62,63,88],tracerwarn:64,track:[72,92],track_running_stat:[60,61],trade:63,tradit:[52,92],traget:36,trail:80,train:[31,32,33,34,53,57,58,59,60,63,73,74,89,90,94],trainabl:66,trained_vgg16_qat:64,trainer:57,training_dataload:64,training_dataset:64,traitlet:[57,60,61,62,63],transcrib:57,transfer:81,transform:[57,58,60,61,62,63,64,89,92],transforms_factori:58,translat:[63,89],transmit:82,transpos:74,trash:82,travers:[68,70],treat:[64,94],tree:[46,47,48,49,57,80,92,93],trigger:[62,89],trim:92,trim_sil:57,tristiqu:85,trt:[1,2,4,5,50,52,57,65,66,69,72,74,89],trt_lenet_script:89,trt_mod:[64,89,92,96],trt_model:[59,63,95],trt_model_fp16:[58,59,60],trt_model_fp32:[58,60],trt_model_with_d:61,trt_model_without_d:61,trt_script_modul:62,trt_ts_modul:[57,62,90],trtorch:57,truck:64,truncat:[53,94],truncate_long_and_doubl:[49,53,57,59],trust:[60,61,62,63,64],ts_model:89,tue:[60,83],tune:[57,58,60,62,63,64],tupl:69,tupleconstruct:[66,69],tupleunpack:66,turn:57,turpi:85,tutori:[58,60,61,88,92],two:[57,62,63,66,72,82,83,87,88,91,92,94],type:[1,2,3,32,33,52,53,54,55,57,58,59,60,61,62,63,64,65,69,72,82,89,92,94],typecheck:57,typenam:[4,5,31,32,33,34,48],typer:57,typic:[65,72],typing_extens:58,ubuntu:[57,91],ugli:82,uint64_t:[49,53],ultric:85,unabl:[72,89],unbind:74,unbroken:82,uncas:59,unchang:59,uncom:91,uncorr:[57,58,60,61,62],undefin:63,under:[46,47,48,49,57,58,59,60,61,62,63,70,82,90],underli:[1,2,3,50,72],understand:[58,60],unidecod:57,union:[72,89],uniqu:5,unique_ptr:[5,32,33],unit:[59,62],univers:82,unless:[57,58,59,60,61,62,63],unlik:[61,73,91,95],unlimit:80,unmask:59,unmasked_sent:59,unmasked_sentences_trt:59,unmasked_token:59,unmasked_tokens_trt:59,unpack_addmm:66,unpack_log_softmax:66,unqiue_ptr:5,unreferenc:82,unrestrict:82,unsign:64,unsqueez:[58,60,61,74],unstabl:70,unsupport:[35,53],unsur:72,untest:70,until:[61,65,70,72,91],unwrap:72,unwraptodoubl:72,unwraptoint:89,unzip:91,updat:[57,61,64],upgrad:57,upload:[58,60,61],upon:80,upper:[64,83],upsample_bilinear2d:74,upsample_linear1d:74,upsample_nearest1d:74,upsample_nearest2d:74,upsample_nearest3d:74,upsample_trilinear3d:74,upscale_factor:74,upstream:89,uri:[63,82],url:[80,91],urllib3:[57,59],urna:85,usag:[57,58,60,61,62,82,89],use:[1,2,3,4,5,31,32,33,34,47,50,52,53,57,58,59,60,61,62,63,64,65,66,69,70,72,82,88,89,91,92,93,94,95],use_amp:57,use_cach:[4,5,32,33,48,92],use_cache_:48,use_fb_fake_qu:64,use_input_stat:74,use_start_end_token:57,use_subset:92,usecas:91,used:[1,2,3,4,5,48,50,52,53,57,58,59,60,61,62,63,64,65,66,69,72,82,88,91,92,93,94],useful:[72,82],user:[46,52,53,57,58,59,60,61,62,63,67,68,69,70,82,83,89,91,92],userguid:64,userwarn:[57,58,63],uses:[31,32,33,34,48,58,60,62,63,72,90,91,92,93],using:[1,2,3,36,39,41,48,49,50,52,53,57,58,60,61,62,63,72,73,80,81,82,88,89,92,93,94,95],using_int:[74,89],usr:91,usual:[63,64,80],utf:[82,83],util:[58,60,62,64,72,89,92],val2017:63,val:[63,64],valid:[2,50,57,62,63,64,72],valu:[1,2,3,17,18,49,50,52,59,62,64,65,69,72,74,80,89],value_tensor_map:[65,72],vare:61,vari:[58,59,60],variabl:52,variant:[57,93],varient:66,variou:[57,96],variu:85,vcs_pageview_mod:80,vec:74,vector:[21,22,48,49,52,53,69,89,92,96],vehicula:85,vel:85,velit:85,venenati:85,venv:[57,58,59,60,61,62,63],verbios:94,verbos:[83,94],veri:[64,83,84,92,95],verifi:[59,64],version:[38,40,57,58,59,60,61,62,63,64,70,80,83,91],vertic:[80,82],vestibulum:[83,85],vgg16:[64,92],vgg16_base_ckpt:64,vgg16_qat_ckpt:64,vgg:[63,64,92],via:[57,61,63,73,80,86,90,92,93],view:[74,80],vine_snak:58,virtual:[57,58,59,60,61,62,63,92],vis:82,vision:[58,59,60,61],visit:[58,60,61,63],visitor:80,visual:61,vita:[83,85],vivamu:85,viverra:85,volatil:[57,58,60,61,62],volta:[58,60,62,63],volutpat:85,vulput:85,w1109:64,w_hh:74,w_ih:74,wai:[58,60,64,88,89,91,92,94],walk:[57,58,59,60,62,63],wandb:57,want:[46,58,60,62,63,88,89,92,95],warm:[57,58,59,60,61,62,63,64],warn:[17,48,57,58,59,60,61,62,63,64,72,94],warranti:[57,58,59,60,61,62,63],wash:82,wcwidth:[57,60,61,62,63],weak:82,web:82,webdataset:57,webencod:[57,60,61,62,63],websit:91,weight:[52,53,59,64,65,74,82,89,94],weight_decai:64,welcom:89,welecom:[58,60],well:[53,58,59,60,62,63,82,89,91,92],were:[59,63,89],werkzeug:57,wget:[57,58,60,61],what:[5,63,66,82,88,89],whatev:69,wheel:[57,91],when:[29,48,49,50,58,59,60,62,63,64,65,66,68,69,70,72,80,82,84,88,89,91,92,94],where:[57,58,60,62,65,66,72,83,89,92],whether:[5,81,92,94],which:[2,3,31,34,36,41,50,57,58,59,60,61,62,63,64,65,66,67,68,69,70,72,80,82,83,88,89,90,91,92,93,95],white:[63,82],whitespac:82,whl:[58,60,62,63,91],who:82,whole:[58,60,62,63],whose:66,why:82,wide:[61,86],widespread:59,widget:[57,60,61,62,63],widgetsnbextens:[57,60,61,62,63],width:[58,60,61,82],window:82,window_nam:82,wish:83,wit:57,within:[57,58,59,60,61,62,63,68,70,80,82],without:[57,58,59,60,62,63,64,72,80,82,89,92],won:61,wooden:82,word:[57,59,82],wordninja:57,work:[48,62,66,70,72,82,83,92],worker:92,workflow:[64,95],workspac:[53,91,92,94,96],workspace_s:[49,53,57,58,59,60,61,63,92,94,96],world:[58,60,62,63,82],would:[72,89,91,93,94,95],wrap:[64,68,69,70,82,85,89,95],wrapper:72,wrapt:57,write:[4,5,31,32,33,34,48,57,58,59,60,61,62,63,65,73,82,89,92],writecalibrationcach:[4,5,48],writer:64,written:[58,60],wrote:82,www:[57,58,59,60,61,62,63,80,82,89,91,92],x64:91,x86:93,x86_64:[70,91],x_0:82,x_1:82,x_2:82,x_3:82,x_4:82,xavier:[49,58,60,62,63,96],xml:51,xstr:[20,47,54,55],yahoo:83,yaml:[57,71],yarg:57,yarl:57,year:57,yield:59,you:[1,2,3,31,32,33,34,50,52,53,57,58,59,60,61,62,63,64,65,66,69,70,72,73,80,82,83,84,88,89,90,91,92,93,94,95],your:[57,58,59,60,61,62,63,64,72,73,80,82,83,87,88,89,90,91,93,95],yourself:[58,59,60,89],youtokentom:57,zero_grad:64,zero_point:74,zeroth:61,zip:[60,63,69,91],zipp:[57,60,61,62,63],zisserman:92},titles:["Class Hierarchy","Class DataType","Class Device::DeviceType","Class TensorFormat","Template Class Int8CacheCalibrator","Template Class Int8Calibrator","Define STR","Define TORCH_TENSORRT_PATCH_VERSION","Define TORCH_TENSORRT_MAJOR_VERSION","Define TORCH_TENSORRT_MINOR_VERSION","Define TORCHTRT_API","Define XSTR","Define TORCHTRT_HIDDEN","Define TORCH_TENSORRT_VERSION","Directory cpp","Directory include","Directory tensorrt","Enum Level","Enum EngineCapability","File logging.h","File macros.h","File ptq.h","File torch_tensorrt.h","File Hierarchy","Function torch_tensorrt::logging::get_logging_prefix","Function torch_tensorrt::logging::get_reportable_log_level","Function torch_tensorrt::logging::get_is_colored_output_on","Function torch_tensorrt::logging::set_reportable_log_level","Function torch_tensorrt::logging::log","Function torch_tensorrt::logging::set_is_colored_output_on","Function torch_tensorrt::logging::set_logging_prefix","Template Function torch_tensorrt::ptq::make_int8_cache_calibrator","Template Function torch_tensorrt::ptq::make_int8_calibrator","Template Function torch_tensorrt::ptq::make_int8_calibrator","Template Function torch_tensorrt::ptq::make_int8_cache_calibrator","Function torch_tensorrt::torchscript::check_method_operator_support","Function torch_tensorrt::torchscript::compile","Function torch_tensorrt::torchscript::embed_engine_in_new_module","Function torch_tensorrt::get_build_info","Function torch_tensorrt::set_device","Function torch_tensorrt::dump_build_info","Function torch_tensorrt::torchscript::convert_method_to_trt_engine","Namespace torch_tensorrt","Namespace torch_tensorrt::logging","Namespace torch_tensorrt::ptq","Namespace torch_tensorrt::torchscript","Program Listing for File logging.h","Program Listing for File macros.h","Program Listing for File ptq.h","Program Listing for File torch_tensorrt.h","Struct Device","Struct GraphInputs","Struct Input","Struct CompileSpec","Torch-TensorRT C++ API","Full API","Full API","Torch-TensorRT Getting Started - CitriNet","Torch-TensorRT Getting Started - EfficientNet-B0","Masked Language Modeling (MLM) with Hugging Face BERT Transformer","Torch-TensorRT Getting Started - ResNet 50","Torch-TensorRT - Using Dynamic Shapes","Torch-TensorRT Getting Started - LeNet","Object Detection with Torch-TensorRT (SSD)","Deploying Quantization Aware Trained models in INT8 using Torch-TensorRT","Conversion Phase","Lowering Phase","Partitioning Phase","Compiler Phases","Runtime Phase","System Overview","Useful Links for Torch-TensorRT Development","Writing Converters","Torch-TensorRT","Operators Supported","torch_tensorrt.logging","torch_tensorrt.ptq","torch_tensorrt","torch_tensorrt.ts","Changelog","Configuration","5. :mod:`test_py_module`","3. Paragraph Level Markup","4. Lists & Tables","1. Long Sticky Nav","1. Structural Elements","<no title>","Installation","Creating a TorchScript Module","Getting Started with C++","Using Torch-TensorRT in Python","Installation","Post Training Quantization (PTQ)","Deploying Torch-TensorRT Programs","torchtrtc","Using Torch-TensorRT Directly From PyTorch","DLA"],titleterms:{"class":[0,1,2,3,4,5,21,22,42,44,45,54,55,76,77],"enum":[17,18,19,22,42,43,54,55,76,77],"function":[19,21,22,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,54,55,61,71,77,78],"long":84,And:82,But:83,The:[82,89],Used:66,Useful:71,Using:[61,89,90,95],aarch64:91,abi:[69,91],addmm:66,admonit:82,advic:72,ahead:73,api:[54,55,56,71,73,91],applic:92,arg:[72,81],avail:71,awar:64,background:[69,72],base:[4,5,80],benchmark:[57,61,63,64],bert:59,binari:91,block:82,branch:66,build:[61,80,91],bullet:83,can:83,caption:83,center:82,changelog:79,check_method_operator_support:35,choos:91,citat:[82,92],citrinet:57,cli:91,code:[66,82],compil:[36,68,70,73,89,91],compilespec:53,compound:82,conclus:[62,63],configur:80,construct:69,content:[19,20,21,22,42,43,44,45,57,58,59,60,62,63,80,81,82,83,84,85],context:[72,80],contigu:66,contract:72,contributor:73,convers:[65,68,70,72],convert:[65,72,74,89],convert_method_to_trt_engin:41,cpp:[14,19,20,21,22],creat:[88,92],creativ:82,cudnn:91,current:74,custom:89,cxx11:91,data:[61,81],datatyp:1,dead:66,debug:91,deeper:83,defin:[6,7,8,9,10,11,12,13,20,54,55],definit:[19,20,21,22,83],depend:91,deploi:[64,93],descript:[58,60,63],deseri:69,detail:63,detect:63,detector:63,develop:71,devic:[2,50],devicetyp:2,dimens:71,direct:82,directli:95,directori:[14,15,16,56],disk:88,distribut:91,dla:96,doctest:82,documen:73,document:[1,2,3,4,5,6,7,8,9,10,11,12,13,17,18,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,50,51,52,53,71,73,85],down:83,download:[61,82,87],dropout:66,dump_build_info:40,dynam:61,easier:71,efficientnet:58,element:85,elimin:66,eliminatecommonsubexpress:66,embed_engine_in_new_modul:37,emphas:82,engin:69,enginecap:18,enumer:83,envior:91,evalu:[65,74],exampl:[82,84],execept:66,executor:69,expect:71,face:59,fallback:66,field:83,figur:82,file:[16,19,20,21,22,23,46,47,48,49,54,56],flatten:66,footnot:82,format:69,fp16:[57,58,60],fp32:[57,58,60],freez:66,from:[61,91,95],full:[54,55,56],fuse:66,gaurd:66,gener:81,get:[57,58,60,61,62,73,89],get_build_info:38,get_is_colored_output_on:26,get_logging_prefix:24,get_reportable_log_level:25,giant:83,git:87,glossari:82,gpu:73,graph:[66,69],graphinput:51,grid:83,guarante:72,half:[57,58,60],have:83,hierarchi:[0,23,54],hlist:83,hole:83,hood:89,how:[80,92],html:80,hub:61,hug:59,ien:82,imag:[82,83],includ:[15,19,20,21,22],index:81,indic:73,infer:63,inherit:[4,5],inlin:82,input:52,instal:[87,91],int8:64,int8cachecalibr:4,int8calibr:5,jetson:91,jit:73,languag:59,layer:71,learn:[57,58,59,60,62,63],lenet:62,level:[17,80,82,83],librari:[91,93],libtorchtrt:93,like:83,line:82,linear:66,link:[71,82],list:[46,47,48,49,83],liter:82,local:91,log:[19,24,25,26,27,28,29,30,43,46,75],logsoftmax:66,loop:66,lower:[66,68,70],macro:[20,47],make_int8_cache_calibr:[31,34],make_int8_calibr:[32,33],markup:82,mask:59,math:82,measur:63,menu:84,meta:82,mlm:59,mod:81,model:[58,59,60,61,62,63,64],modul:[66,88,89],multibox:63,namespac:[19,20,21,22,42,43,44,45,54,55],nativ:91,native_op:71,nav:84,nest:[2,50],next:[57,58,59,60,61,62],node:65,number:[82,83],nvidia:73,object:[57,58,59,60,62,63],one:83,oper:[74,89],optimz:66,option:[80,81,83],other:72,overview:[57,58,60,62,63,64,70],own:92,packag:[91,93],page:80,paragraph:[82,85],paramet:81,partit:[67,68,70],pass:66,pattern:66,peephol:66,perform:64,phase:[65,66,67,68,69,70],plugin:93,post:92,pre:91,precis:[57,58,60],precompil:91,prerequisit:91,program:[46,47,48,49,93],project:80,ptq:[21,31,32,33,34,44,48,76,92],python:[71,73,88,90,91,92],pytorch:[62,71,73,95],quantiz:[64,92],quickstart:89,quot:82,rabbit:83,read:71,redund:66,refer:[63,82],regist:89,relationship:[2,4,5,50],releas:91,remov:66,replac:82,resnet:60,respons:72,result:[63,69],right:91,rubric:82,runtim:[68,69,70,93],sampl:[61,63],save:88,script:62,second:83,section:85,serial:69,set:61,set_devic:39,set_is_colored_output_on:29,set_logging_prefix:30,set_reportable_log_level:27,setup:91,shape:61,shot:63,sidebar:82,simpl:61,singl:[57,58,60,63],sometim:71,sourc:91,speedup:63,ssd:63,start:[57,58,60,62,73,89],sticki:84,str:6,struct:[50,51,52,53,54,55],structur:85,subdirectori:[14,15],submenu:84,submodul:77,subsect:85,subsubmenu:84,subsubsect:85,support:74,system:70,tabl:[80,81,82,83,84,85],tarbal:91,target:82,templat:[4,5,31,32,33,34],tensorformat:3,tensorrt:[16,54,57,58,60,61,62,63,64,69,71,73,89,90,91,93,95],test_py_modul:81,text:82,theme:80,thi:83,through:74,time:73,titl:82,toc:80,topic:82,torch:[54,57,58,60,61,62,63,64,71,73,89,90,93,95],torch_tensorrt:[19,20,21,22,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,49,75,76,77,78],torch_tensorrt_major_vers:8,torch_tensorrt_minor_vers:9,torch_tensorrt_patch_vers:7,torch_tensorrt_vers:13,torchscript:[35,36,37,41,45,62,73,88,89],torchtrt_api:10,torchtrt_hidden:12,torchtrtc:[89,94],trace:62,train:[64,92],transform:59,trt:61,tupl:66,type:[4,5,50],under:89,unpack:66,unrol:66,unsupport:89,using:[64,91],util:[57,61,63],version:69,via:87,visual:63,wai:82,weight:72,what:[57,58,59,60,61,62,72],wide:80,without:61,work:[61,88,89],write:72,xstr:11,your:92}}) \ No newline at end of file diff --git a/docs/v1.1.1/sitemap.xml b/docs/v1.1.1/sitemap.xml new file mode 100644 index 0000000000..91f3153893 --- /dev/null +++ b/docs/v1.1.1/sitemap.xml @@ -0,0 +1 @@ +https://nvidia.github.io/Torch-TensorRT/_cpp_api/class_view_hierarchy.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/classtorch__tensorrt_1_1DataType.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/classtorch__tensorrt_1_1Device_1_1DeviceType.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/classtorch__tensorrt_1_1TensorFormat.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8Calibrator.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/define_macros_8h_1a18d295a837ac71add5578860b55e5502.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/define_macros_8h_1ad19939408f7be171a74a89928b36eb59.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/dir_cpp.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/dir_cpp_include.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/dir_cpp_include_torch_tensorrt.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/file_cpp_include_torch_tensorrt_logging.h.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/file_cpp_include_torch_tensorrt_macros.h.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/file_cpp_include_torch_tensorrt_ptq.h.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/file_cpp_include_torch_tensorrt_torch_tensorrt.h.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/file_view_hierarchy.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_logging_8h_1a0593f776f469c20469e2f729fc7861a3.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_logging_8h_1a0c012cb374addd90eb1f42eaec570650.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_logging_8h_1af8f3443813315af7901903d25dd495cc.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/namespace_torch_tensorrt.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/namespace_torch_tensorrt__logging.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/namespace_torch_tensorrt__ptq.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/namespace_torch_tensorrt__torchscript.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_logging.h.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_macros.h.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_ptq.h.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/structtorch__tensorrt_1_1Device.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/structtorch__tensorrt_1_1GraphInputs.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/structtorch__tensorrt_1_1Input.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/structtorch__tensorrt_1_1torchscript_1_1CompileSpec.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/torch_tensort_cpp.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/unabridged_api.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/unabridged_orphan.htmlhttps://nvidia.github.io/Torch-TensorRT/_notebooks/CitriNet-example.htmlhttps://nvidia.github.io/Torch-TensorRT/_notebooks/EfficientNet-example.htmlhttps://nvidia.github.io/Torch-TensorRT/_notebooks/Hugging-Face-BERT.htmlhttps://nvidia.github.io/Torch-TensorRT/_notebooks/Resnet50-example.htmlhttps://nvidia.github.io/Torch-TensorRT/_notebooks/dynamic-shapes.htmlhttps://nvidia.github.io/Torch-TensorRT/_notebooks/lenet-getting-started.htmlhttps://nvidia.github.io/Torch-TensorRT/_notebooks/ssd-object-detection-demo.htmlhttps://nvidia.github.io/Torch-TensorRT/_notebooks/vgg-qat.htmlhttps://nvidia.github.io/Torch-TensorRT/contributors/conversion.htmlhttps://nvidia.github.io/Torch-TensorRT/contributors/lowering.htmlhttps://nvidia.github.io/Torch-TensorRT/contributors/partitioning.htmlhttps://nvidia.github.io/Torch-TensorRT/contributors/phases.htmlhttps://nvidia.github.io/Torch-TensorRT/contributors/runtime.htmlhttps://nvidia.github.io/Torch-TensorRT/contributors/system_overview.htmlhttps://nvidia.github.io/Torch-TensorRT/contributors/useful_links.htmlhttps://nvidia.github.io/Torch-TensorRT/contributors/writing_converters.htmlhttps://nvidia.github.io/Torch-TensorRT/index.htmlhttps://nvidia.github.io/Torch-TensorRT/indices/supported_ops.htmlhttps://nvidia.github.io/Torch-TensorRT/py_api/logging.htmlhttps://nvidia.github.io/Torch-TensorRT/py_api/ptq.htmlhttps://nvidia.github.io/Torch-TensorRT/py_api/torch_tensorrt.htmlhttps://nvidia.github.io/Torch-TensorRT/py_api/ts.htmlhttps://nvidia.github.io/Torch-TensorRT/src/pytorch-sphinx-theme/docs/changelog.htmlhttps://nvidia.github.io/Torch-TensorRT/src/pytorch-sphinx-theme/docs/configuring.htmlhttps://nvidia.github.io/Torch-TensorRT/src/pytorch-sphinx-theme/docs/demo/api.htmlhttps://nvidia.github.io/Torch-TensorRT/src/pytorch-sphinx-theme/docs/demo/demo.htmlhttps://nvidia.github.io/Torch-TensorRT/src/pytorch-sphinx-theme/docs/demo/lists_tables.htmlhttps://nvidia.github.io/Torch-TensorRT/src/pytorch-sphinx-theme/docs/demo/long.htmlhttps://nvidia.github.io/Torch-TensorRT/src/pytorch-sphinx-theme/docs/demo/structure.htmlhttps://nvidia.github.io/Torch-TensorRT/src/pytorch-sphinx-theme/docs/index.htmlhttps://nvidia.github.io/Torch-TensorRT/src/pytorch-sphinx-theme/docs/installing.htmlhttps://nvidia.github.io/Torch-TensorRT/tutorials/creating_torchscript_module_in_python.htmlhttps://nvidia.github.io/Torch-TensorRT/tutorials/getting_started_with_cpp_api.htmlhttps://nvidia.github.io/Torch-TensorRT/tutorials/getting_started_with_python_api.htmlhttps://nvidia.github.io/Torch-TensorRT/tutorials/installation.htmlhttps://nvidia.github.io/Torch-TensorRT/tutorials/ptq.htmlhttps://nvidia.github.io/Torch-TensorRT/tutorials/runtime.htmlhttps://nvidia.github.io/Torch-TensorRT/tutorials/torchtrtc.htmlhttps://nvidia.github.io/Torch-TensorRT/tutorials/use_from_pytorch.htmlhttps://nvidia.github.io/Torch-TensorRT/tutorials/using_dla.htmlhttps://nvidia.github.io/Torch-TensorRT/genindex.htmlhttps://nvidia.github.io/Torch-TensorRT/search.html \ No newline at end of file diff --git a/docs/v1.1.1/src/pytorch-sphinx-theme/docs/changelog.html b/docs/v1.1.1/src/pytorch-sphinx-theme/docs/changelog.html new file mode 100644 index 0000000000..45ec179b22 --- /dev/null +++ b/docs/v1.1.1/src/pytorch-sphinx-theme/docs/changelog.html @@ -0,0 +1,511 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Changelog — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

+ Changelog + + ¶ + +

+

+ v0.0.1 +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/src/pytorch-sphinx-theme/docs/configuring.html b/docs/v1.1.1/src/pytorch-sphinx-theme/docs/configuring.html new file mode 100644 index 0000000000..647d58c40c --- /dev/null +++ b/docs/v1.1.1/src/pytorch-sphinx-theme/docs/configuring.html @@ -0,0 +1,958 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Configuration — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+

+ Configuration + + ¶ + +

+

+ You can configure different parts of the theme. +

+

+ Project-wide Configuration + + ¶ + +

+

+ HTML Theme Options + + ¶ + +

+

+ The theme’s project-wide options are defined in the + + + pytorch_sphinx_theme/theme.conf + + + file of this repository, and can be defined in your project’s + + + conf.py + + + via + + + html_theme_options + + + . For example: +

+
+
+
html_theme_options = {
+    'canonical_url': '',
+    'analytics_id': '',
+    'logo_only': False,
+    'display_version': True,
+    'prev_next_buttons_location': 'bottom',
+    'style_external_links': False,
+    'vcs_pageview_mode': '',
+    # Toc options
+    'collapse_navigation': True,
+    'sticky_navigation': True,
+    'navigation_depth': 4,
+    'includehidden': True,
+    'titles_only': False
+}
+
+
+
+

+ The following options are available: +

+

+ Base options + + ¶ + +

+
    +
  • +

    + + + canonical_url + + + String. This will specify a + + canonical url + + to let search engines know they should give higher ranking to latest version of the docs. +The url points to the root of the documentation and requires a trailing slash. +

    +
  • +
  • +

    + + + analytics_id + + + String. Change the Google Analytics ID that is included on pages. +

    +
  • +
  • +

    + + + display_version + + + Bool. With this disabled, the version number isn’t shown at the top of the sidebar. +

    +
  • +
  • +

    + + + prev_next_buttons_location + + + String. can take the value + + + bottom + + + , + + + top + + + , + + + both + + + , or + + + None + + + and will display the “Next” and “Previous” buttons accordingly. +

    +
  • +
  • +

    + + + style_external_links + + + Bool. Add an icon next to external links. Defaults to + + + False + + + . +

    +
  • +
  • +

    + + + vcs_pageview_mode + + + String. Changes how to view files when using + + display_github + + , + + display_gitlab + + , etc. +When using Github or Gitlab this can be: + + blob + + (default), + + edit + + , or + + raw + + , +on Bitbucket, this can be either: + + view + + (default) or + + edit + + . +

    +
  • +
+

+ TOC Options + + ¶ + +

+

+ These effect how we display the Table of Contents in the side bar. You can read more about them here: + + http://www.sphinx-doc.org/en/stable/templating.html#toctree + +

+
    +
  • +

    + + + collapse_navigation + + + Bool. With this enabled, you will lose the + + + [+] + + + drop downs next to each section in the sidebar. +

    +
  • +
  • +

    + + + sticky_navigation + + + Bool. This causes the sidebar to scroll with the main page content as you scroll the page. +

    +
  • +
  • +

    + + + navigation_depth + + + Int. Indicate the max depth of the tree; by default, 4 levels are included; +set it to -1 to allow unlimited depth. +

    +
  • +
  • +

    + + + includehidden + + + Bool. Specifies if the sidebar includes toctrees marked with the + + + :hidden: + + + option +

    +
  • +
  • +

    + + + titles_only + + + Bool. If True, removes headers within a page from the sidebar. +

    +
  • +
+
+

+ Note +

+

+ Setting + + + collapse_navigation + + + to False and using a high + + + navigation_depth + + + can cause projects with many files and a deep file structure to generate HTML files +that are significantly larger in file size and much longer compilation times. +

+
+

+ HTML Context Options + + ¶ + +

+

+ TODO. +

+

+ Page-level Configuration + + ¶ + +

+

+ Pages support metadata that changes how the theme renders. +You can currently add the following: +

+
    +
  • +

    + + + :github_url: + + + This will force the “Edit on GitHub” to the configured URL +

    +
  • +
  • +

    + + + :bitbucket_url: + + + This will force the “Edit on Bitbucket” to the configured URL +

    +
  • +
  • +

    + + + :gitlab_url: + + + This will force the “Edit on GitLab” to the configured URL +

    +
  • +
+

+ How the Table of Contents builds + + ¶ + +

+

+ Currently the left menu will build based upon any + + + toctree(s) + + + defined in your + + + index.rst + + + file. +It outputs 2 levels of depth, which should give your visitors a high level of access to your +docs. If no toctrees are set the theme reverts to sphinx’s usual local toctree. +

+

+ It’s important to note that if you don’t follow the same styling for your rST headers across +your documents, the toctree will misbuild, and the resulting menu might not show the correct +depth when it renders. +

+

+ Also note that by default the table of contents is set with + + + includehidden=True + + + . This allows you +to set a hidden toc in your index file with the + + :hidden: + + property that will allow you +to build a toc without it rendering in your index. +

+

+ By default, the navigation will “stick” to the screen as you scroll. However if your toc +is vertically too large, it will revert to static positioning. To disable the sticky nav +altogether change the setting in + + + conf.py + + + . +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/src/pytorch-sphinx-theme/docs/demo/api.html b/docs/v1.1.1/src/pytorch-sphinx-theme/docs/demo/api.html new file mode 100644 index 0000000000..d20481a04f --- /dev/null +++ b/docs/v1.1.1/src/pytorch-sphinx-theme/docs/demo/api.html @@ -0,0 +1,715 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + 5. :mod:`test_py_module` — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+

+ + + 5. + + + + + :mod:`test_py_module` + + + + ¶ + +

+
+

+ Table of Contents +

+ +
+

+ + + 5.1. + + Generated Index + + + ¶ + +

+

+ Part of the sphinx build process in generate and index file: + + + Index + + + . +

+

+ + + 5.2. + + Optional parameter args + + + ¶ + +

+

+ At this point optional parameters + + cannot be generated from code + + . +However, some projects will manually do it, like so: +

+

+ This example comes from + + django-payments module docs + + . +

+
+
+ + payments.dotpay.DotpayProvider(seller_id, pin[, channel=0[, lock=False], lang='pl']) + +
+
+

+ This backend implements payments using a popular Polish gateway, + + Dotpay.pl + + . +

+

+ Due to API limitations there is no support for transferring purchased items. +

+
+
+ Parameters +
+
+
    +
  • +

    + + seller_id + + – Seller ID assigned by Dotpay +

    +
  • +
  • +

    + + pin + + – PIN assigned by Dotpay +

    +
  • +
  • +

    + + channel + + – Default payment channel (consult reference guide) +

    +
  • +
  • +

    + + lang + + – UI language +

    +
  • +
  • +

    + + lock + + – Whether to disable channels other than the default selected above +

    +
  • +
+
+
+
+
+

+ + + 5.3. + + Data + + + ¶ + +

+

+ Some data link + + + :data:`Data_item_1` + + + . +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/src/pytorch-sphinx-theme/docs/demo/demo.html b/docs/v1.1.1/src/pytorch-sphinx-theme/docs/demo/demo.html new file mode 100644 index 0000000000..80308a6de5 --- /dev/null +++ b/docs/v1.1.1/src/pytorch-sphinx-theme/docs/demo/demo.html @@ -0,0 +1,2754 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3. Paragraph Level Markup — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+

+ + + 3. + + Paragraph Level Markup + + + ¶ + +

+ +

+ + + 3.1. + + Inline Markup + + + ¶ + +

+

+ Paragraphs contain text and may contain inline markup: + + emphasis + + , + + strong emphasis + + , + + + inline + + + literals + + + , +standalone hyperlinks ( + + http://www.python.org + + ), external hyperlinks ( + + Python + + + 5 + + ), internal cross-references ( + + example + + ), +external hyperlinks with embedded URIs ( + + Python web site + + ), footnote references +(manually numbered + + 1 + + , anonymous auto-numbered + + 3 + + , labeled auto-numbered + + 2 + + , or symbolic + + * + + ), +citation references ( + + 12 + + ), substitution references ( + + EXAMPLE + + ), and + + inline hyperlink targets + + (see + + Targets + + below for a reference back to here). Character-level inline markup is also possible +(although exceedingly ugly!) in + + re + + + + Structured + + + + Text + + . Problems are indicated by + + + |problematic| + + + text (generated by processing errors; this one is intentional). +

+

+ Also with + + + sphinx.ext.autodoc + + + , which I use in the demo, I can link to + + + test_py_module.test.Foo + + + . +It will link you right my code documentation for it. +

+

+ The default role for interpreted text is + + Title Reference + + . Here are some explicit interpreted text roles: +a PEP reference ( + + + + + PEP 287 + + + ); an RFC reference ( + + + + + RFC 2822 + + + ); a + + subscript + + ; a + + superscript + + ; +and explicit roles for + + standard + + + inline + + + + markup + + + . +

+

+ GUI labels are a useful way to indicate that + + Some action + + is to be taken by the user. +The GUI label should not run over + + + line-height + + + so as not to + + interfere + + with text from adjacent lines. +

+

+ Key-bindings indicate that the read is to press a button on the keyboard or mouse, +for example + + MMB + + and + + + Shift + + - + + MMB + + + . Another useful markup to indicate a user action +is to use + + + menuselection + + + this can be used to show short and long menus in software. +For example, and + + + menuselection + + + can be seen here that breaks is too long to fit on this line. + + My ‣ Software ‣ Some menu ‣ Some sub menu 1 ‣ sub menu 2 + + . +

+

+ Let’s test wrapping and whitespace significance in inline literals: + + + This + + + is + + + an + + + example + + + of + + + --inline-literal + + + --text, + + + --including + + + some-- + + + strangely--hyphenated-words. + + + Adjust-the-width-of-your-browser-window + + + to + + + see + + + how + + + the + + + text + + + is + + + wrapped. + + + -- + + + ---- + + + -------- + + + Now + + + note + + + the + + + spacing + + + between + + + the + + + words + + + of + + + this + + + sentence + + + (words + + + should + + + be + + + grouped + + + in + + + pairs). + + +

+

+ If the + + + --pep-references + + + option was supplied, there should be a live link to PEP 258 here. +

+

+ + + 3.2. + + Math + + + ¶ + +

+

+ This is a test. Here is an equation: + + \(X_{0:5} = (X_0, X_1, X_2, X_3, X_4)\) + + . +Here is another: +

+
+ + (1) + + ¶ + + + \[\nabla^2 f = +\frac{1}{r^2} \frac{\partial}{\partial r} +\left( r^2 \frac{\partial f}{\partial r} \right) + +\frac{1}{r^2 \sin \theta} \frac{\partial f}{\partial \theta} +\left( \sin \theta \, \frac{\partial f}{\partial \theta} \right) + +\frac{1}{r^2 \sin^2\theta} \frac{\partial^2 f}{\partial \phi^2}\] +
+

+ You can add a link to equations like the one above + + (1) + + by using + + + :eq: + + + . +

+

+ + + 3.3. + + Meta + + + ¶ + +

+

+ + + 3.4. + + Blocks + + + ¶ + +

+

+ + + 3.4.1. + + Literal Blocks + + + ¶ + +

+

+ Literal blocks are indicated with a double-colon (“::”) at the end of +the preceding paragraph (over there + + + --> + + + ). They can be indented: +

+
+
+
if literal_block:
+    text = 'is left as-is'
+    spaces_and_linebreaks = 'are preserved'
+    markup_processing = None
+
+
+
+

+ Or they can be quoted without indentation: +

+
+
+
>> Great idea!
+>
+> Why didn't I think of that?
+
+
+
+

+ + + 3.4.2. + + Line Blocks + + + ¶ + +

+
+
+ This is a line block. It ends with a blank line. +
+
+
+ Each new line begins with a vertical bar (“|”). +
+
+ Line breaks and initial indents are preserved. +
+
+
+ Continuation lines are wrapped portions of long lines; +they begin with a space in place of the vertical bar. +
+
+
+ The left edge of a continuation line need not be aligned with +the left edge of the text above it. +
+
+
+
+
+ This is a second line block. +
+
+
+
+
+ Blank lines are permitted internally, but they must begin with a “|”. +
+
+

+ Take it away, Eric the Orchestra Leader! +

+
+
+
+
+ A one, two, a one two three four +
+
+
+
+
+ Half a bee, philosophically, +
+
+
+ must, + + ipso facto + + , half not be. +
+
+
+ But half the bee has got to be, +
+
+
+ + vis a vis + + its entity. D’you see? +
+
+
+
+
+
+ But can a bee be said to be +
+
+
+ or not to be an entire bee, +
+
+
+ when half the bee is not a bee, +
+
+
+ due to some ancient injury? +
+
+
+
+
+
+
+
+ Singing… +
+
+
+
+

+ + + 3.4.3. + + Block Quotes + + + ¶ + +

+

+ Block quotes consist of indented body elements: +

+
+
+

+ My theory by A. Elk. Brackets Miss, brackets. This theory goes +as follows and begins now. All brontosauruses are thin at one +end, much much thicker in the middle and then thin again at the +far end. That is my theory, it is mine, and belongs to me and I +own it, and what it is too. +

+

+ —Anne Elk (Miss) +

+
+
+

+ + + 3.4.4. + + Doctest Blocks + + + ¶ + +

+
+
+
>>> print 'Python-specific usage examples; begun with ">>>"'
+Python-specific usage examples; begun with ">>>"
+>>> print '(cut and pasted from interactive Python sessions)'
+(cut and pasted from interactive Python sessions)
+
+
+
+

+ + + 3.4.5. + + Code Blocks + + + ¶ + +

+
# parsed-literal test
+curl -O http://someurl/release-.tar-gz
+
+
+ + Code Blocks can have captions. + + + ¶ + +
+
+
+
{
+"windows": [
+    {
+    "panes": [
+        {
+        "shell_command": [
+            "echo 'did you know'",
+            "echo 'you can inline'"
+        ]
+        },
+        {
+        "shell_command": "echo 'single commands'"
+        },
+        "echo 'for panes'"
+    ],
+    "window_name": "long form"
+    }
+],
+"session_name": "shorthands"
+}
+
+
+
+
+

+ + + 3.4.5.1. + + Emphasized lines with line numbers + + + ¶ + +

+
+ + + + + +
+
+
1
+2
+3
+4
+5
+
+
+
+
def some_function():
+    interesting = False
+    print 'This line is highlighted.'
+    print 'This one is not...'
+    print '...but this one is.'
+
+
+
+
+ + +

+ The first hexagram is made up of six unbroken lines. These unbroken lines stand for the primal power, +which is light-giving, active, strong, and of the spirit. The hexagram is consistently strong in character, +and since it is without weakness, its essence is power or energy. Its image is heaven. +Its energy is represented as unrestricted by any fixed conditions in space and is therefore conceived of as motion. +Time is regarded as the basis of this motion. +Thus the hexagram includes also the power of time and the power of persisting in time, that is, duration. +

+

+ The power represented by the hexagram is to be interpreted in a dual sense in terms of its action +on the universe and of its action on the world of men. In relation to the universe, the hexagram expresses the strong, +creative action of the Deity. In relation to the human world, it denotes the creative action of the holy man or sage, +of the ruler or leader of men, who through his power awakens and develops their higher nature. +

+

+ + + 3.5.1. + + Code with Sidebar + + + ¶ + +

+ +
+
+ + Literal includes can also have captions. + + + ¶ + +
+
+ + + + + +
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+
+
+
+
# -*- coding: utf-8 -*-
+"""Test Module for sphinx_rtd_theme."""
+
+
+class Foo:
+
+    """Docstring for class Foo.
+
+    This text tests for the formatting of docstrings generated from output
+    ``sphinx.ext.autodoc``. Which contain reST, but sphinx nests it in the
+    ``<dl>``, and ``<dt>`` tags. Also, ``<tt>`` is used for class, method names
+    and etc, but those will *always* have the ``.descname`` or
+    ``.descclassname`` class.
+
+    Normal ``<tt>`` (like the <tt> I just wrote here) needs to be shown with
+    the same style as anything else with ````this type of markup````.
+
+    It's common for programmers to give a code example inside of their
+    docstring::
+
+        from test_py_module import Foo
+
+        myclass = Foo()
+        myclass.dothismethod('with this argument')
+        myclass.flush()
+
+        print(myclass)
+
+
+    Here is a link to :py:meth:`capitalize`.
+    Here is a link to :py:meth:`__init__`.
+
+    """
+
+    #: Doc comment for class attribute Foo.bar.
+    #: It can have multiple lines.
+    bar = 1
+
+    flox = 1.5   #: Doc comment for Foo.flox. One line only.
+
+
+
+
+
+
+

+ + + 3.6. + + References + + + ¶ + +

+

+ + + 3.6.1. + + Footnotes + + + ¶ + +

+
+
+ + 1 + + + ( + + 1 + + , + + 2 + + ) + +
+
+

+ A footnote contains body elements, consistently indented by at +least 3 spaces. +

+

+ This is the footnote’s second paragraph. +

+
+
+ + 2 + + + ( + + 1 + + , + + 2 + + ) + +
+
+

+ Footnotes may be numbered, either manually (as in + + 1 + + ) or +automatically using a “#”-prefixed label. This footnote has a +label so it can be referred to from multiple places, both as a +footnote reference ( + + 2 + + ) and as a hyperlink reference +( + + label + + ). +

+
+
+ + + 3 + + +
+
+

+ This footnote is numbered automatically and anonymously using a +label of “#” only. +

+
+
+ + + * + + +
+
+

+ Footnotes may also use symbols, specified with a “*” label. +Here’s a reference to the next footnote: + + † + + . +

+
+
+ + + † + + +
+
+

+ This footnote shows the next symbol in the sequence. +

+
+
+ + 4 + +
+
+

+ Here’s an unreferenced footnote, with a reference to a +nonexistent footnote: + + + [5]_ + + + . +

+
+
+

+ + + 3.6.2. + + Citations + + + ¶ + +

+
+
+ + 11 + +
+
+

+ This is the citation I made, let’s make this extremely long so that we can tell that it doesn’t follow the normal responsive table stuff. +

+
+
+ + 12 + + + ( + + 1 + + , + + 2 + + ) + +
+
+

+ This citation has some + + + code + + + blocks + + + in it, maybe some + + bold + + and + + italics + + too. Heck, lets put a link to a meta citation + + 13 + + too. +

+
+
+ + + 13 + + +
+
+

+ This citation will have two backlinks. +

+
+
+

+ Here’s a reference to the above, + + 12 + + , and a + + [nonexistent] + + citation. +

+

+ Here is another type of citation: + + citation + +

+

+ + + 3.6.3. + + Glossary + + + ¶ + +

+

+ This is a glossary with definition terms for thing like + + + Writing + + + : +

+
+
+ Documentation +
+
+

+ Provides users with the knowledge they need to use something. +

+
+
+ Reading +
+
+

+ The process of taking information into ones mind through the use of eyes. +

+
+
+ Writing +
+
+

+ The process of putting thoughts into a medium for other people to + + + read + + + . +

+
+
+

+ + + 3.6.4. + + Targets + + + ¶ + +

+

+ This paragraph is pointed to by the explicit “example” target. +A reference can be found under + + Inline Markup + + , above. + + Inline +hyperlink targets + + are also possible. +

+

+ Section headers are implicit targets, referred to by name. See + + Targets + + , which is a subsection of + + + `Body Elements`_ + + + . +

+

+ Explicit external targets are interpolated into references such as “ + + Python + + + 5 + + ”. +

+

+ Targets may be indirect and anonymous. Thus + + this phrase + + may also +refer to the + + Targets + + section. +

+

+ Here’s a + + + `hyperlink reference without a target`_ + + + , which generates an error. +

+

+ + + 3.7. + + Directives + + + ¶ + +

+

+ + + 3.7.1. + + Contents + + + ¶ + +

+

+ These are just a sample of the many reStructuredText Directives. For others, please see: + + http://docutils.sourceforge.net/docs/ref/rst/directives.html + + . +

+

+ + + 3.7.2. + + Centered text + + + ¶ + +

+

+ You can create a statement with centered text with + + + .. + + + centered:: + + +

+

+ + This is centered text! + +

+

+ + + 3.7.3. + + Images & Figures + + + ¶ + +

+

+ + + 3.7.3.1. + + Images + + + ¶ + +

+

+ An image directive (also clickable – a hyperlink reference): +

+ + ../../../../_images/yi_jing_01_chien.jpg + +

+ + + 3.7.3.2. + + Figures + + + ¶ + +

+
+ reStructuredText, the markup syntax +

+ + A figure is an image with a caption and/or a legend: + + + ¶ + +

+
+ + + + + + + + + + + + + + + + + + + +
+

+ re +

+
+

+ Revised, revisited, based on ‘re’ module. +

+
+

+ Structured +

+
+

+ Structure-enhanced text, structuredtext. +

+
+

+ Text +

+
+

+ Well it is, isn’t it? +

+
+

+ This paragraph is also part of the legend. +

+
+
+

+ A figure directive with center alignment +

+
+ ../../../../_images/yi_jing_01_chien.jpg +

+ + This caption should be centered. + + + ¶ + +

+
+

+ + + 3.7.4. + + Admonitions + + + ¶ + +

+
+

+ Attention +

+

+ Directives at large. +

+
+
+

+ Caution +

+

+ Don’t take any wooden nickels. +

+
+
+

+ Danger +

+

+ Mad scientist at work! +

+
+
+

+ Error +

+

+ Does not compute. +

+
+
+

+ Hint +

+

+ It’s bigger than a bread box. +

+
+
+

+ Important +

+
    +
  • +

    + Wash behind your ears. +

    +
  • +
  • +

    + Clean up your room. +

    +
      +
    • +

      + Including the closet. +

      +
    • +
    • +

      + The bathroom too. +

      +
        +
      • +

        + Take the trash out of the bathroom. +

        +
      • +
      • +

        + Clean the sink. +

        +
      • +
      +
    • +
    +
  • +
  • +

    + Call your mother. +

    +
  • +
  • +

    + Back up your data. +

    +
  • +
+
+
+

+ Note +

+

+ This is a note. +Equations within a note: + + \(G_{\mu\nu} = 8 \pi G (T_{\mu\nu} + \rho_\Lambda g_{\mu\nu})\) + + . +

+
+
+

+ Tip +

+

+ 15% if the service is good. +

+ + + + + + + + + + + + + + + + + + + + +
+

+ Example +

+
+

+ Thing1 +

+
+

+ Thing2 +

+
+

+ Thing3 +

+
+
+
+

+ Warning +

+

+ Strong prose may provoke extreme mental exertion. +Reader discretion is strongly advised. +

+
+
+

+ And, by the way… +

+

+ You can make up your own admonition too. +

+
+

+ + + 3.7.5. + + Topics, Sidebars, and Rubrics + + + ¶ + +

+ +
+

+ Topic Title +

+

+ This is a topic. +

+
+

+ This is a rubric +

+

+ + + 3.7.6. + + Target Footnotes + + + ¶ + +

+
+
+ + 5 + + + ( + + 1 + + , + + 2 + + , + + 3 + + ) + +
+
+

+ + http://www.python.org/ + +

+
+
+

+ + + 3.7.7. + + Replacement Text + + + ¶ + +

+

+ I recommend you try + + Python, + + the + + best language around + + + 5 + + . +

+

+ + + 3.7.8. + + Compound Paragraph + + + ¶ + +

+
+

+ This paragraph contains a literal block: +

+
+
+
Connecting... OK
+Transmitting data... OK
+Disconnecting... OK
+
+
+
+

+ and thus consists of a simple paragraph, a literal block, and +another simple paragraph. Nonetheless it is semantically + + one + + paragraph. +

+
+

+ This construct is called a + + compound paragraph + + and can be produced +with the “compound” directive. +

+ +

+ + + + This + + + long + + + long + + + long + + + long + + + long + + + long + + + long + + + long + + + long + + + long + + + long + + + long + + + long + + + long + + + long + + + download + + + link + + + should + + + be + + + blue, + + + normal + + + weight + + + text + + + with + + + a + + + leading + + + icon, + + + and + + + should + + + wrap + + + white-spaces + + + +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/src/pytorch-sphinx-theme/docs/demo/lists_tables.html b/docs/v1.1.1/src/pytorch-sphinx-theme/docs/demo/lists_tables.html new file mode 100644 index 0000000000..c9239bb6fe --- /dev/null +++ b/docs/v1.1.1/src/pytorch-sphinx-theme/docs/demo/lists_tables.html @@ -0,0 +1,2452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + 4. Lists & Tables — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+

+ + + 4. + + Lists & Tables + + + ¶ + +

+
+

+ Table of Contents +

+ +
+

+ + + 4.1. + + Lists + + + ¶ + +

+

+ + + 4.1.1. + + Enumerated Lists + + + ¶ + +

+
    +
  1. +

    + Arabic numerals. +

    +
      +
    1. +

      + lower alpha) +

      +
        +
      1. +

        + (lower roman) +

        +
          +
        1. +

          + upper alpha. +

          +
            +
          1. +

            + upper roman) +

            +
          2. +
          +
        2. +
        +
      2. +
      +
    2. +
    +
  2. +
  3. +

    + Lists that don’t start at 1: +

    +
      +
    1. +

      + Three +

      +
    2. +
    3. +

      + Four +

      +
    4. +
    +
      +
    1. +

      + C +

      +
    2. +
    3. +

      + D +

      +
    4. +
    +
      +
    1. +

      + iii +

      +
    2. +
    3. +

      + iv +

      +
    4. +
    +
  4. +
  5. +

    + List items may also be auto-enumerated. +

    +
  6. +
+

+ + + 4.1.2. + + Definition Lists + + + ¶ + +

+
+
+ Term +
+
+

+ Definition +

+
+
+ Term + + classifier + +
+
+

+ Definition paragraph 1. +

+

+ Definition paragraph 2. +

+
+
+ Term +
+
+

+ Definition +

+
+
+

+ + + 4.1.3. + + Option Lists + + + ¶ + +

+

+ For listing command-line options: +

+
+
+ + + -a + + +
+
+

+ command-line option “a” +

+
+
+ + + -b + + file + + + +
+
+

+ options can have arguments +and long descriptions +

+
+
+ + + --long + + +
+
+

+ options can be long also +

+
+
+ + + --input= + + file + + + +
+
+

+ long options can also have +arguments +

+
+
+ + + --very-long-option + + +
+
+

+ The description can also start on the next line. +

+

+ The description may contain multiple body elements, +regardless of where it starts. +

+
+
+ + + -x + + , + + -y + + , + + -z + + +
+
+

+ Multiple options are an “option group”. +

+
+
+ + + -v + + , + + --verbose + + +
+
+

+ Commonly-seen: short & long options. +

+
+
+ + + -1 + + file + + + , + + --one= + + file + + + , + + --two + + file + + + +
+
+

+ Multiple options with arguments. +

+
+
+ + + /V + + +
+
+

+ DOS/VMS-style options too +

+
+
+

+ There must be at least two spaces between the option and the description. +

+

+ + + 4.1.4. + + Field list + + + ¶ + +

+
+
+ Author +
+
+

+ David Goodger +

+
+
+ Address +
+
+

+ 123 Example Street +Example, EX Canada +A1B 2C3 +

+
+
+ Contact +
+
+

+ + docutils-develop + + @ + + lists + + . + + sourceforge + + . + + net + +

+
+
+ Authors +
+
+

+ Me; Myself; I +

+
+
+ organization +
+
+

+ humankind +

+
+
+ date +
+
+

+ $Date: 2012-01-03 19:23:53 +0000 (Tue, 03 Jan 2012) $ +

+
+
+ status +
+
+

+ This is a “work in progress” +

+
+
+ revision +
+
+

+ $Revision: 7302 $ +

+
+
+ version +
+
+

+ 1 +

+
+
+ copyright +
+
+

+ This document has been placed in the public domain. You +may do with it as you wish. You may copy, modify, +redistribute, reattribute, sell, buy, rent, lease, +destroy, or improve it, quote it at length, excerpt, +incorporate, collate, fold, staple, or mutilate it, or do +anything else to it that your or anyone else’s heart +desires. +

+
+
+ field name +
+
+

+ This is a generic bibliographic field. +

+
+
+ field name 2 +
+
+

+ Generic bibliographic fields may contain multiple body elements. +

+

+ Like this. +

+
+
+ Dedication +
+
+

+ For Docutils users & co-developers. +

+
+
+ abstract +
+
+

+ This document is a demonstration of the reStructuredText markup +language, containing examples of all basic reStructuredText +constructs and many advanced constructs. +

+
+
+

+ + + 4.1.5. + + Bullet Lists + + + ¶ + +

+
    +
  • +

    + A bullet list +

    +
      +
    • +

      + Nested bullet list. +

      +
    • +
    • +

      + Nested item 2. +

      +
    • +
    +
  • +
  • +

    + Item 2. +

    +

    + Paragraph 2 of item 2. +

    +
      +
    • +

      + Nested bullet list. +

      +
    • +
    • +

      + Nested item 2. +

      +
        +
      • +

        + Third level. +

        +
      • +
      • +

        + Item 2. +

        +
      • +
      +
    • +
    • +

      + Nested item 3. +

      +
    • +
    +
  • +
  • +

    + + + inline + + + literall + + +

    +
  • +
  • +

    + + + inline + + + literall + + +

    +
  • +
  • +

    + + + inline + + + literall + + +

    +
  • +
+

+ + + 4.1.5.1. + + Second list level + + + ¶ + +

+
    +
  • +

    + here is a list in a second-level section. +

    +
  • +
  • +

    + + yahoo + +

    +
  • +
  • +

    + + yahoo + +

    +
      +
    • +

      + + yahoo + +

      +
    • +
    • +

      + here is an inner bullet + + + oh + + +

      +
        +
      • +

        + one more + + + with + + + an + + + inline + + + literally + + + . + + yahoo + +

        +

        + heh heh. child. try to beat this embed: +

        +
        + + + + + +
        +
        +
         1
        + 2
        + 3
        + 4
        + 5
        + 6
        + 7
        + 8
        + 9
        +10
        +
        +
        +
        +
        # -*- coding: utf-8 -*-
        +"""Test Module for sphinx_rtd_theme."""
        +
        +
        +class Foo:
        +
        +    """Docstring for class Foo.
        +
        +    This text tests for the formatting of docstrings generated from output
        +    ``sphinx.ext.autodoc``. Which contain reST, but sphinx nests it in the
        +
        +
        +
        +
        +
      • +
      +
    • +
    • +

      + and another. + + yahoo + +

      +
    • +
    • +

      + + yahoo + +

      +
    • +
    • +

      + + + hi + + +

      +
    • +
    +
  • +
  • +

    + and hehe +

    +
  • +
+
+ + + 4.1.5.1.1. + + But deeper down the rabbit hole + + + ¶ + +
+
    +
  • +

    + I kept saying that, “deeper down the rabbit hole”. + + yahoo + +

    + +
  • +
  • +

    + I’m so lonely here in GZ + + + guangzhou + + +

    +
  • +
  • +

    + A man of python destiny, hopes and dreams. + + yahoo + +

    + +
  • +
+

+ + + 4.1.6. + + Hlists + + + ¶ + +

+ + + + + +
+
    +
  • +

    + First item +

    +
  • +
  • +

    + Second item +

    +
  • +
  • +

    + Third item +

    +
  • +
+
+
    +
  • +

    + Forth item +

    +
  • +
  • +

    + Fifth item +

    +
  • +
  • +

    + Sixths item +

    +
  • +
+
+

+ Hlist with images +

+ + + + + +
+
    +
  • +
    + ../../../../_images/yi_jing_01_chien.jpg +

    + + This is a short caption for a figure. + + + ¶ + +

    +
    +
  • +
+
+
    +
  • +
    + ../../../../_images/yi_jing_01_chien.jpg +

    + + This is a long caption for a figure. Lorem ipsum dolor sit amet, consectetur adipiscing elit. +Donec porttitor dolor in odio posuere, vitae ornare libero mattis. In lobortis justo vestibulum nibh aliquet, non. + + + ¶ + +

    +
    +
  • +
+
+

+ + + 4.1.7. + + Numbered List + + + ¶ + +

+
    +
  1. +

    + One, +

    +
  2. +
  3. +

    + Two. +

    +
  4. +
  5. +

    + Three with long text. Lorem ipsum dolor sit amet, consectetur adipiscing elit. +Sed feugiat sagittis neque quis eleifend. Duis rutrum lectus sit amet mattis suscipit. +

    +
  6. +
+
    +
  • +
      +
    1. +

      + Using bullets and letters. (A) +

      +
    2. +
    +
  • +
  • +
      +
    1. +

      + Using bullets and letters. (B) +

      +
    2. +
    +
  • +
  • +
      +
    1. +

      + Using bullets and letters. (C) +

      +
    2. +
    +
  • +
+

+ + + 4.2. + + Tables + + + ¶ + +

+

+ + + 4.2.1. + + Grid Tables + + + ¶ + +

+

+ Here’s a grid table followed by a simple table: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Header row, column 1 +(header rows optional) +

+
+

+ Header 2 +

+
+

+ Header 3 +

+
+

+ Header 4 +

+
+

+ body row 1, column 1 +

+
+

+ column 2 +

+
+

+ column 3 +

+
+

+ column 4 +

+
+

+ body row 2 +

+
+

+ Cells may span columns. +

+
+

+ body row 3 +

+
+

+ Cells may +span rows. +

+
+
    +
  • +

    + Table cells +

    +
  • +
  • +

    + contain +

    +
  • +
  • +

    + body elements. +

    +
  • +
+
+

+ body row 4 +

+
+

+ body row 5 +

+
+

+ Cells may also be +empty: + + + --> + + +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Inputs +

+
+

+ Output +

+
+

+ A +

+
+

+ B +

+
+

+ A or B +

+
+

+ False +

+
+

+ False +

+
+

+ False +

+
+

+ True +

+
+

+ False +

+
+

+ True +

+
+

+ False +

+
+

+ True +

+
+

+ True +

+
+

+ True +

+
+

+ True +

+
+

+ True +

+
+

+ + + 4.2.1.1. + + Giant Tables + + + ¶ + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Header 1 +

+
+

+ Header 2 +

+
+

+ Header 3 +

+
+

+ Header 1 +

+
+

+ Header 2 +

+
+

+ Header 3 +

+
+

+ Header 1 +

+
+

+ Header 2 +

+
+

+ Header 3 +

+
+

+ Header 1 +

+
+

+ Header 2 +

+
+

+ Header 3 +

+
+

+ body row 1 +

+
+

+ column 2 +

+
+

+ column 3 +

+
+

+ body row 1 +

+
+

+ column 2 +

+
+

+ column 3 +

+
+

+ body row 1 +

+
+

+ column 2 +

+
+

+ column 3 +

+
+

+ body row 1 +

+
+

+ column 2 +

+
+

+ column 3 +

+
+

+ body row 1 +

+
+

+ column 2 +

+
+

+ column 3 +

+
+

+ body row 1 +

+
+

+ column 2 +

+
+

+ column 3 +

+
+

+ body row 1 +

+
+

+ column 2 +

+
+

+ column 3 +

+
+

+ body row 1 +

+
+

+ column 2 +

+
+

+ column 3 +

+
+

+ body row 1 +

+
+

+ column 2 +

+
+

+ column 3 +

+
+

+ body row 1 +

+
+

+ column 2 +

+
+

+ column 3 +

+
+

+ body row 1 +

+
+

+ column 2 +

+
+

+ column 3 +

+
+

+ body row 1 +

+
+

+ column 2 +

+
+

+ column 3 +

+
+

+ body row 1 +

+
+

+ column 2 +

+
+

+ column 3 +

+
+

+ body row 1 +

+
+

+ column 2 +

+
+

+ column 3 +

+
+

+ body row 1 +

+
+

+ column 2 +

+
+

+ column 3 +

+
+

+ body row 1 +

+
+

+ column 2 +

+
+

+ column 3 +

+
+

+ + + 4.2.2. + + List Tables + + + ¶ + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + List tables can have captions like this one. + + + ¶ + +
+

+ List table +

+
+

+ Header 1 +

+
+

+ Header 2 +

+
+

+ Header 3 long. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet mauris arcu. +

+
+

+ Stub Row 1 +

+
+

+ Row 1 +

+
+

+ Column 2 +

+
+

+ Column 3 long. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet mauris arcu. +

+
+

+ Stub Row 2 +

+
+

+ Row 2 +

+
+

+ Column 2 +

+
+

+ Column 3 long. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet mauris arcu. +

+
+

+ Stub Row 3 +

+
+

+ Row 3 +

+
+

+ Column 2 +

+
+

+ Column 3 long. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet mauris arcu. +

+
+ + + + + + + + + + + + +
+ + This is a list table with images in it. + + + ¶ + +
+
+ ../../../../_images/yi_jing_01_chien.jpg +

+ + This is a short caption for a figure. + + + ¶ + +

+
+
+
+ ../../../../_images/yi_jing_01_chien.jpg +

+ + This is a long caption for a figure. Lorem ipsum dolor sit amet, consectetur adipiscing elit. +Donec porttitor dolor in odio posuere, vitae ornare libero mattis. In lobortis justo vestibulum nibh aliquet, non. + + + ¶ + +

+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/src/pytorch-sphinx-theme/docs/demo/long.html b/docs/v1.1.1/src/pytorch-sphinx-theme/docs/demo/long.html new file mode 100644 index 0000000000..5fab2cf098 --- /dev/null +++ b/docs/v1.1.1/src/pytorch-sphinx-theme/docs/demo/long.html @@ -0,0 +1,1543 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + 1. Long Sticky Nav — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+

+ + + 1. + + Long Sticky Nav + + + ¶ + +

+ +

+ This section demonstrates how the ‘sticky_navigation’ setting behaves when the menu is very long. +When this section is selected, it will make the menu and the main area scroll when you are at the top of the page. +

+

+ + + 1.1. + + Example Menu 1 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.2. + + Example Menu 2 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.3. + + Example Menu 3 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.4. + + Example Menu 4 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.5. + + Example Menu 5 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.6. + + Example Menu 6 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.7. + + Example Menu 7 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.8. + + Example Menu 8 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.9. + + Example Menu 9 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.10. + + Example Menu 10 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.11. + + Example Menu 11 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.12. + + Example Menu 12 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.13. + + Example Menu 13 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.14. + + Example Menu 14 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.15. + + Example Menu 15 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.16. + + Example Menu 16 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.17. + + Example Menu 17 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.18. + + Example Menu 18 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.19. + + Example Menu 19 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.20. + + Example Menu 20 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.21. + + Example Submenu 1 + + + ¶ + +

+

+ Just a place holder… +

+ +

+ Just a place holder… +

+

+ + + 1.21.1.1. + + Subsubmenu 1 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.21.1.2. + + Subsubmenu 2 + + + ¶ + +

+

+ Just a place holder… +

+ +

+ Just a place holder… +

+

+ + + 1.21.2.1. + + Subsubmenu 1 + + + ¶ + +

+

+ Just a place holder… +

+ +

+ Just a place holder… +

+ +

+ Just a place holder… +

+ +

+ Just a place holder… +

+

+ + + 1.22. + + Example Submenu 2 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.22.1. + + Submenu 1 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.22.1.1. + + Subsubmenu 1 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.22.2. + + Submenu 2 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.22.2.1. + + Subsubmenu 1 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.22.3. + + Submenu 3 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.22.4. + + Submenu 4 + + + ¶ + +

+

+ Just a place holder… +

+

+ + + 1.22.5. + + Submenu 5 + + + ¶ + +

+

+ Just a place holder… +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/src/pytorch-sphinx-theme/docs/demo/structure.html b/docs/v1.1.1/src/pytorch-sphinx-theme/docs/demo/structure.html new file mode 100644 index 0000000000..5fe511a29e --- /dev/null +++ b/docs/v1.1.1/src/pytorch-sphinx-theme/docs/demo/structure.html @@ -0,0 +1,818 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + 1. Structural Elements — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+

+ + + 1. + + Structural Elements + + + ¶ + +

+ +

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec lorem neque, interdum in ipsum nec, +finibus dictum velit. Ut eu efficitur arcu, id aliquam erat. In sit amet diam gravida, imperdiet tellus eu, +gravida nisl. Praesent aliquet odio eget libero elementum, quis rhoncus tellus tincidunt. +Suspendisse quis volutpat ipsum. Sed lobortis scelerisque tristique. Aenean condimentum risus tellus, +quis accumsan ipsum laoreet ut. Integer porttitor maximus suscipit. Mauris in posuere sapien. +Aliquam accumsan feugiat ligula, nec fringilla libero commodo sed. Proin et erat pharetra. +

+
+

+ Etiam turpis ante, luctus sed velit tristique, finibus volutpat dui. Nam sagittis vel ante nec malesuada. +Praesent dignissim mi nec ornare elementum. Nunc eu augue vel sem dignissim cursus sed et nulla. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Pellentesque dictum dui sem, non placerat tortor rhoncus in. Sed placerat nulla at rhoncus iaculis. +

+

+ + + 1.1. + + Document Section + + + ¶ + +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum nulla vel neque venenatis, +nec placerat lorem placerat. Cras purus eros, gravida vitae tincidunt id, vehicula nec nulla. +Fusce aliquet auctor cursus. Phasellus ex neque, vestibulum non est vitae, viverra fringilla tortor. +Donec vestibulum convallis justo, a faucibus lorem vulputate vel. Aliquam cursus odio eu felis sodales aliquet. +Aliquam erat volutpat. Maecenas eget dictum mauris. Suspendisse arcu eros, condimentum eget risus sed, +luctus efficitur arcu. Cras ut dictum mi. Nulla congue interdum lorem, semper semper enim commodo nec. +

+

+ + + 1.1.1. + + Document Subsection + + + ¶ + +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam efficitur in eros et blandit. Nunc maximus, +nisl at auctor vestibulum, justo ex sollicitudin ligula, id faucibus urna orci tristique nisl. +Duis auctor rutrum orci, in ornare lacus condimentum quis. Quisque arcu velit, facilisis quis interdum ac, +hendrerit auctor mauris. Curabitur urna nibh, porttitor at ante sit amet, vestibulum interdum dolor. +Duis dictum elit orci, tincidunt imperdiet sem pellentesque et. In vehicula pellentesque varius. +Phasellus a turpis sollicitudin, bibendum massa et, imperdiet neque. Integer quis sapien in magna rutrum bibendum. +Integer cursus ex sed magna vehicula finibus. Proin tempus orci quis dolor tempus, nec condimentum odio vestibulum. +Etiam efficitur sollicitudin libero, tincidunt volutpat ligula interdum sed. +

+

+ + + 1.1.1.1. + + Document Subsubsection + + + ¶ + +

+

+ Donec non rutrum lorem. Aenean sagittis metus at pharetra fringilla. Nunc sapien dolor, cursus sed nisi at, +pretium tristique lectus. Sed pellentesque leo lectus, et convallis ipsum euismod a. +Integer at leo vitae felis pretium aliquam fringilla quis odio. Sed pharetra enim accumsan feugiat pretium. +Maecenas at pharetra tortor. Morbi semper eget mi vel finibus. Cras rutrum nulla eros, id feugiat arcu pellentesque ut. +Sed finibus tortor ac nisi ultrices viverra. Duis feugiat malesuada sapien, at commodo ante porttitor ac. +Curabitur posuere mauris mi, vel ornare orci scelerisque sit amet. Suspendisse nec fringilla dui. +

+
+ + + 1.1.1.1.1. + + Document Paragraph + + + ¶ + +
+

+ Pellentesque nec est in odio ultrices elementum. Vestibulum et hendrerit sapien, quis vulputate turpis. +Suspendisse potenti. Curabitur tristique sit amet lectus non viverra. Phasellus rutrum dapibus turpis sed imperdiet. +Mauris maximus viverra ante. Donec eu egestas mauris. Morbi vulputate tincidunt euismod. Integer vel porttitor neque. +Donec at lacus suscipit, lacinia lectus vel, sagittis lectus. +

+

+ + + 2. + + Structural Elements 2 + + + ¶ + +

+

+ Etiam turpis ante, luctus sed velit tristique, finibus volutpat dui. Nam sagittis vel ante nec malesuada. +Praesent dignissim mi nec ornare elementum. Nunc eu augue vel sem dignissim cursus sed et nulla. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Pellentesque dictum dui sem, non placerat tortor rhoncus in. Sed placerat nulla at rhoncus iaculis. +

+

+ + + 2.1. + + Document Section + + + ¶ + +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum nulla vel neque venenatis, +nec placerat lorem placerat. Cras purus eros, gravida vitae tincidunt id, vehicula nec nulla. +Fusce aliquet auctor cursus. Phasellus ex neque, vestibulum non est vitae, viverra fringilla tortor. +Donec vestibulum convallis justo, a faucibus lorem vulputate vel. Aliquam cursus odio eu felis sodales aliquet. +Aliquam erat volutpat. Maecenas eget dictum mauris. Suspendisse arcu eros, condimentum eget risus sed, +luctus efficitur arcu. Cras ut dictum mi. Nulla congue interdum lorem, semper semper enim commodo nec. +

+

+ + + 2.1.1. + + Document Subsection + + + ¶ + +

+
+ ../../../../_images/yi_jing_01_chien.jpg +

+ + This is a caption for a figure. Text should wrap around the caption. + + + ¶ + +

+
+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam efficitur in eros et blandit. Nunc maximus, +nisl at auctor vestibulum, justo ex sollicitudin ligula, id faucibus urna orci tristique nisl. +Duis auctor rutrum orci, in ornare lacus condimentum quis. Quisque arcu velit, facilisis quis interdum ac, +hendrerit auctor mauris. Curabitur urna nibh, porttitor at ante sit amet, vestibulum interdum dolor. +Duis dictum elit orci, tincidunt imperdiet sem pellentesque et. In vehicula pellentesque varius. +Phasellus a turpis sollicitudin, bibendum massa et, imperdiet neque. Integer quis sapien in magna rutrum bibendum. +Integer cursus ex sed magna vehicula finibus. Proin tempus orci quis dolor tempus, nec condimentum odio vestibulum. +Etiam efficitur sollicitudin libero, tincidunt volutpat ligula interdum sed. Praesent congue sagittis nisl et suscipit. +Vivamus sagittis risus et egestas commodo.Cras venenatis arcu in pharetra interdum. +Donec quis metus porttitor tellus cursus lobortis. Quisque et orci magna. Fusce rhoncus mi mi, +at vehicula massa rhoncus quis. Mauris augue leo, pretium eget molestie vitae, efficitur nec nulla. +In hac habitasse platea dictumst. Sed sit amet imperdiet purus. +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/src/pytorch-sphinx-theme/docs/index.html b/docs/v1.1.1/src/pytorch-sphinx-theme/docs/index.html new file mode 100644 index 0000000000..824a3a3571 --- /dev/null +++ b/docs/v1.1.1/src/pytorch-sphinx-theme/docs/index.html @@ -0,0 +1,849 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + <no title> — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + + +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/src/pytorch-sphinx-theme/docs/installing.html b/docs/v1.1.1/src/pytorch-sphinx-theme/docs/installing.html new file mode 100644 index 0000000000..775ccfb56e --- /dev/null +++ b/docs/v1.1.1/src/pytorch-sphinx-theme/docs/installing.html @@ -0,0 +1,559 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Installation — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

+ Installation + + ¶ + +

+

+ Via Git or Download + + ¶ + +

+

+ Symlink or subtree the + + + pytorch_sphinx_theme + + + repository into your documentation at + + + docs/_themes/pytorch_sphinx_theme + + + then add the following two settings to your Sphinx + + + conf.py + + + file: +

+
+
+
html_theme = "pytorch_sphinx_theme"
+html_theme_path = ["_themes", ]
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/tutorials/creating_torchscript_module_in_python.html b/docs/v1.1.1/tutorials/creating_torchscript_module_in_python.html new file mode 100644 index 0000000000..cc79e2f3c1 --- /dev/null +++ b/docs/v1.1.1/tutorials/creating_torchscript_module_in_python.html @@ -0,0 +1,845 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Creating a TorchScript Module — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Creating a TorchScript Module + + ¶ + +

+

+ TorchScript is a way to create serializable and optimizable models from PyTorch code. +PyTorch has detailed documentation on how to do this + + https://pytorch.org/tutorials/beginner/Intro_to_TorchScript_tutorial.html + + but briefly here is the +here is key background information and the process: +

+

+ PyTorch programs are based around + + + Module + + + s which can be used to compose higher level modules. + + + Modules + + + contain a constructor to set up the modules, parameters and sub-modules +and a forward function which describes how to use the parameters and submodules when the module is invoked. +

+

+ For example, we can define a LeNet module like this: +

+
+ + + + + +
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+
+
+
+
import torch.nn as nn
+import torch.nn.functional as F
+
+class LeNetFeatExtractor(nn.Module):
+    def __init__(self):
+        super(LeNetFeatExtractor, self).__init__()
+        self.conv1 = nn.Conv2d(1, 6, 3)
+        self.conv2 = nn.Conv2d(6, 16, 3)
+
+    def forward(self, x):
+        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
+        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
+        return x
+
+class LeNetClassifier(nn.Module):
+    def __init__(self):
+        super(LeNetClassifier, self).__init__()
+        self.fc1 = nn.Linear(16 * 6 * 6, 120)
+        self.fc2 = nn.Linear(120, 84)
+        self.fc3 = nn.Linear(84, 10)
+
+    def forward(self, x):
+        x = torch.flatten(x,1)
+        x = F.relu(self.fc1(x))
+        x = F.relu(self.fc2(x))
+        x = self.fc3(x)
+        return x
+
+class LeNet(nn.Module):
+    def __init__(self):
+        super(LeNet, self).__init__()
+        self.feat = LeNetFeatExtractor()
+        self.classifer = LeNetClassifier()
+
+    def forward(self, x):
+        x = self.feat(x)
+        x = self.classifer(x)
+        return x
+
+
+
+
+

+ . +

+
+
+

+ Obviously you may want to consolidate such a simple model into a single module but we can see the composability of PyTorch here +

+
+
+

+ From here are two pathways for going from PyTorch Python code to TorchScript code: Tracing and Scripting. +

+

+ Tracing follows the path of execution when the module is called and records what happens. +To trace an instance of our LeNet module, we can call + + + torch.jit.trace + + + with an example input. +

+
+
+
import torch
+
+model = LeNet()
+input_data = torch.empty([1,1,32,32])
+traced_model = torch.jit.trace(model, input_data)
+
+
+
+

+ Scripting actually inspects your code with a compiler and generates an equivalent TorchScript program. The difference is that since tracing +is following the execution of your module, it cannot pick up control flow for instance. By working from the Python code, the compiler can +include these components. We can run the script compiler on our LeNet module by calling + + + torch.jit.script + + +

+
+
+
import torch
+
+model = LeNet()
+script_model = torch.jit.script(model)
+
+
+
+

+ There are reasons to use one path or another, the PyTorch documentation has information on how to choose. From a Torch-TensorRT prespective, there is +better support (i.e your module is more likely to compile) for traced modules because it doesn’t include all the complexities of a complete +programming language, though both paths supported. +

+

+ After scripting or tracing your module, you are given back a TorchScript Module. This contains the code and parameters used to run the module stored +in a intermediate representation that Torch-TensorRT can consume. +

+

+ Here is what the LeNet traced module IR looks like: +

+
+
+
graph(%self.1 : __torch__.___torch_mangle_10.LeNet,
+    %input.1 : Float(1, 1, 32, 32)):
+    %129 : __torch__.___torch_mangle_9.LeNetClassifier = prim::GetAttr[name="classifer"](%self.1)
+    %119 : __torch__.___torch_mangle_5.LeNetFeatExtractor = prim::GetAttr[name="feat"](%self.1)
+    %137 : Tensor = prim::CallMethod[name="forward"](%119, %input.1)
+    %138 : Tensor = prim::CallMethod[name="forward"](%129, %137)
+    return (%138)
+
+
+
+

+ and the LeNet scripted module IR: +

+
+
+
graph(%self : __torch__.LeNet,
+    %x.1 : Tensor):
+    %2 : __torch__.LeNetFeatExtractor = prim::GetAttr[name="feat"](%self)
+    %x.3 : Tensor = prim::CallMethod[name="forward"](%2, %x.1) # x.py:38:12
+    %5 : __torch__.LeNetClassifier = prim::GetAttr[name="classifer"](%self)
+    %x.5 : Tensor = prim::CallMethod[name="forward"](%5, %x.3) # x.py:39:12
+    return (%x.5)
+
+
+
+

+ You can see that the IR preserves the module structure we have in our python code. +

+ + +

+ Working with TorchScript in Python + + ¶ + +

+

+ TorchScript Modules are run the same way you run normal PyTorch modules. You can run the forward pass using the + + + forward + + + method or just calling the module + + + torch_scirpt_module(in_tensor) + + + The JIT compiler will compile +and optimize the module on the fly and then returns the results. +

+

+ Saving TorchScript Module to Disk + + ¶ + +

+

+ For either traced or scripted modules, you can save the module to disk with the following command +

+
+
+
import torch
+
+model = LeNet()
+script_model = torch.jit.script(model)
+script_model.save("lenet_scripted.ts")
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/tutorials/getting_started_with_cpp_api.html b/docs/v1.1.1/tutorials/getting_started_with_cpp_api.html new file mode 100644 index 0000000000..f8a8d7ef68 --- /dev/null +++ b/docs/v1.1.1/tutorials/getting_started_with_cpp_api.html @@ -0,0 +1,1280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Getting Started with C++ — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Getting Started with C++ + + ¶ + +

+

+ If you haven’t already, acquire a tarball of the library by following the instructions in + + + Installation + + +

+

+ Using Torch-TensorRT in C++ + + ¶ + +

+

+ Torch-TensorRT C++ API accepts TorchScript modules (generated either from + + + torch.jit.script + + + or + + + torch.jit.trace + + + ) as an input and returns +a Torchscript module (optimized using TensorRT). This requires users to use Pytorch (in python) to generate torchscript modules beforehand. +Please refer to + + Creating TorchScript modules in Python + + section to generate torchscript graphs. +

+ + +

+ [Torch-TensorRT Quickstart] Compiling TorchScript Modules with + + + torchtrtc + + + + ¶ + +

+

+ An easy way to get started with Torch-TensorRT and to check if your model can be supported without extra work is to run it through + + + torchtrtc + + + , which supports almost all features of the compiler from the command line including post training quantization +(given a previously created calibration cache). For example we can compile our lenet model by setting our preferred operating +precision and input size. This new TorchScript file can be loaded into Python (note: you need to + + + import + + + torch_tensorrt + + + before loading +these compiled modules because the compiler extends the PyTorch the deserializer and runtime to execute compiled modules). +

+
+
+
❯ torchtrtc -p f16 lenet_scripted.ts trt_lenet_scripted.ts "(1,1,32,32)"
+
+❯ python3
+Python 3.6.9 (default, Apr 18 2020, 01:56:04)
+[GCC 8.4.0] on linux
+Type "help", "copyright", "credits" or "license" for more information.
+>>> import torch
+>>> import torch_tensorrt
+>>> ts_model = torch.jit.load(“trt_lenet_scripted.ts”)
+>>> ts_model(torch.randn((1,1,32,32)).to(“cuda”).half())
+
+
+
+

+ You can learn more about + + + torchtrtc + + + usage here: + + + torchtrtc + + +

+ + +

+ Working with TorchScript in C++ + + ¶ + +

+

+ If we are developing an application to deploy with C++, we can save either our traced or scripted module using + + + torch.jit.save + + + which will serialize the TorchScript code, weights and other information into a package. This is also where our dependency on Python ends. +

+
+
+
torch_script_module.save("lenet.jit.pt")
+
+
+
+

+ From here we can now load our TorchScript module in C++ +

+
+
+
#include <torch/script.h> // One-stop header.
+
+#include <iostream>
+#include <memory>
+
+int main(int argc, const char* argv[]) {
+    torch::jit::Module module;
+    try {
+        // Deserialize the ScriptModule from a file using torch::jit::load().
+        module = torch::jit::load("<PATH TO SAVED TS MOD>");
+    }
+    catch (const c10::Error& e) {
+        std::cerr << "error loading the model\n";
+        return -1;
+    }
+
+    std::cout << "ok\n";
+
+
+
+

+ You can do full training and inference in C++ with PyTorch / LibTorch if you would like, you can even define your modules in C++ and +have access to the same powerful tensor library that backs PyTorch. (For more information: + + https://pytorch.org/cppdocs/ + + ). +For instance we can do inference with our LeNet module like this: +

+
+
+
mod.eval();
+torch::Tensor in = torch::randn({1, 1, 32, 32});
+auto out = mod.forward(in);
+
+
+
+

+ and to run on the GPU: +

+
+
+
mod.eval();
+mod.to(torch::kCUDA);
+torch::Tensor in = torch::randn({1, 1, 32, 32}, torch::kCUDA);
+auto out = mod.forward(in);
+
+
+
+

+ As you can see it is pretty similar to the Python API. When you call the + + + forward + + + method, you invoke the PyTorch JIT compiler, which will optimize and run your TorchScript code. +

+ + +

+ Compiling with Torch-TensorRT in C++ + + ¶ + +

+

+ We are also at the point were we can compile and optimize our module with Torch-TensorRT, but instead of in a JIT fashion we must do it ahead-of-time (AOT) i.e. before we start doing actual inference work +since it takes a bit of time to optimize the module, it would not make sense to do this every time you run the module or even the first time you run it. +

+

+ With our module loaded, we can feed it into the Torch-TensorRT compiler. When we do so we must provide some information on the expected input size and also configure any additional settings. +

+
+
+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+...
+
+    mod.to(at::kCUDA);
+    mod.eval();
+
+    auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA});
+    auto trt_mod = torch_tensorrt::CompileGraph(mod, std::vector<torch_tensorrt::CompileSpec::InputRange>{{in.sizes()}});
+    auto out = trt_mod.forward({in});
+
+
+
+

+ Thats it! Now the graph runs primarily not with the JIT compiler but using TensorRT (though we execute the graph using the JIT runtime). +

+

+ We can also set settings like operating precision to run in FP16. +

+
+
+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+...
+
+    mod.to(at::kCUDA);
+    mod.eval();
+
+    auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}).to(torch::kHALF);
+    auto input_sizes = std::vector<torch_tensorrt::CompileSpec::InputRange>({in.sizes()});
+    torch_tensorrt::CompileSpec info(input_sizes);
+    info.enable_precisions.insert(torch::kHALF);
+    auto trt_mod = torch_tensorrt::CompileGraph(mod, info);
+    auto out = trt_mod.forward({in});
+
+
+
+

+ And now we are running the module in FP16 precision. You can then save the module to load later. +

+
+
+
trt_mod.save("<PATH TO SAVED TRT/TS MOD>")
+
+
+
+

+ Torch-TensorRT compiled TorchScript modules are loaded in the same way as normal TorchScript module. Make sure your deployment application is linked against + + + libtorchtrt.so + + +

+
+
+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+
+int main(int argc, const char* argv[]) {
+    torch::jit::Module module;
+    try {
+        // Deserialize the ScriptModule from a file using torch::jit::load().
+        module = torch::jit::load("<PATH TO SAVED TRT/TS MOD>");
+    }
+    catch (const c10::Error& e) {
+        std::cerr << "error loading the model\n";
+        return -1;
+    }
+
+    torch::Tensor in = torch::randn({1, 1, 32, 32}, torch::kCUDA);
+    auto out = mod.forward(in);
+
+    std::cout << "ok\n";
+}
+
+
+
+

+ If you want to save the engine produced by Torch-TensorRT to use in a TensorRT application you can use the + + + ConvertGraphToTRTEngine + + + API. +

+
+
+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+...
+
+    mod.to(at::kCUDA);
+    mod.eval();
+
+    auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}).to(torch::kHALF);
+    auto input_sizes = std::vector<torch_tensorrt::CompileSpec::InputRange>({in.sizes()});
+    torch_tensorrt::CompileSpec info(input_sizes);
+    info.enabled_precisions.insert(torch::kHALF);
+    auto trt_mod = torch_tensorrt::ConvertGraphToTRTEngine(mod, "forward", info);
+    std::ofstream out("/tmp/engine_converted_from_jit.trt");
+    out << engine;
+    out.close();
+
+
+
+ + +

+ Under The Hood + + ¶ + +

+

+ When a module is provided to Torch-TensorRT, the compiler starts by mapping a graph like you saw above to a graph like this: +

+
+
+
graph(%input.2 : Tensor):
+    %2 : Float(84, 10) = prim::Constant[value=<Tensor>]()
+    %3 : Float(120, 84) = prim::Constant[value=<Tensor>]()
+    %4 : Float(576, 120) = prim::Constant[value=<Tensor>]()
+    %5 : int = prim::Constant[value=-1]() # x.py:25:0
+    %6 : int[] = prim::Constant[value=annotate(List[int], [])]()
+    %7 : int[] = prim::Constant[value=[2, 2]]()
+    %8 : int[] = prim::Constant[value=[0, 0]]()
+    %9 : int[] = prim::Constant[value=[1, 1]]()
+    %10 : bool = prim::Constant[value=1]() # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0
+    %11 : int = prim::Constant[value=1]() # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0
+    %12 : bool = prim::Constant[value=0]() # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0
+    %self.classifer.fc3.bias : Float(10) = prim::Constant[value= 0.0464  0.0383  0.0678  0.0932  0.1045 -0.0805 -0.0435 -0.0818  0.0208 -0.0358 [ CUDAFloatType{10} ]]()
+    %self.classifer.fc2.bias : Float(84) = prim::Constant[value=<Tensor>]()
+    %self.classifer.fc1.bias : Float(120) = prim::Constant[value=<Tensor>]()
+    %self.feat.conv2.weight : Float(16, 6, 3, 3) = prim::Constant[value=<Tensor>]()
+    %self.feat.conv2.bias : Float(16) = prim::Constant[value=<Tensor>]()
+    %self.feat.conv1.weight : Float(6, 1, 3, 3) = prim::Constant[value=<Tensor>]()
+    %self.feat.conv1.bias : Float(6) = prim::Constant[value= 0.0530 -0.1691  0.2802  0.1502  0.1056 -0.1549 [ CUDAFloatType{6} ]]()
+    %input0.4 : Tensor = aten::_convolution(%input.2, %self.feat.conv1.weight, %self.feat.conv1.bias, %9, %8, %9, %12, %8, %11, %12, %12, %10) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0
+    %input0.5 : Tensor = aten::relu(%input0.4) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0
+    %input1.2 : Tensor = aten::max_pool2d(%input0.5, %7, %6, %8, %9, %12) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0
+    %input0.6 : Tensor = aten::_convolution(%input1.2, %self.feat.conv2.weight, %self.feat.conv2.bias, %9, %8, %9, %12, %8, %11, %12, %12, %10) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0
+    %input2.1 : Tensor = aten::relu(%input0.6) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0
+    %x.1 : Tensor = aten::max_pool2d(%input2.1, %7, %6, %8, %9, %12) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0
+    %input.1 : Tensor = aten::flatten(%x.1, %11, %5) # x.py:25:0
+    %27 : Tensor = aten::matmul(%input.1, %4)
+    %28 : Tensor = trt::const(%self.classifer.fc1.bias)
+    %29 : Tensor = aten::add_(%28, %27, %11)
+    %input0.2 : Tensor = aten::relu(%29) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0
+    %31 : Tensor = aten::matmul(%input0.2, %3)
+    %32 : Tensor = trt::const(%self.classifer.fc2.bias)
+    %33 : Tensor = aten::add_(%32, %31, %11)
+    %input1.1 : Tensor = aten::relu(%33) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0
+    %35 : Tensor = aten::matmul(%input1.1, %2)
+    %36 : Tensor = trt::const(%self.classifer.fc3.bias)
+    %37 : Tensor = aten::add_(%36, %35, %11)
+    return (%37)
+(CompileGraph)
+
+
+
+

+ The graph has now been transformed from a collection of modules, each managing their own parameters into a single graph with the parameters inlined +into the graph and all of the operations laid out. Torch-TensorRT has also executed a number of optimizations and mappings to make the graph easier to translate to TensorRT. +From here the compiler can assemble the TensorRT engine by following the dataflow through the graph. +

+

+ When the graph construction phase is complete, Torch-TensorRT produces a serialized TensorRT engine. From here depending on the API, this engine is returned +to the user or moves into the graph construction phase. Here Torch-TensorRT creates a JIT Module to execute the TensorRT engine which will be instantiated and managed +by the Torch-TensorRT runtime. +

+

+ Here is the graph that you get back after compilation is complete: +

+
+
+
graph(%self_1 : __torch__.lenet, %input_0 : Tensor):
+    %1 : ...trt.Engine = prim::GetAttr[name="lenet"](%self_1)
+    %3 : Tensor[] = prim::ListConstruct(%input_0)
+    %4 : Tensor[] = trt::execute_engine(%3, %1)
+    %5 : Tensor = prim::ListUnpack(%4)
+    return (%5)
+
+
+
+

+ You can see the call where the engine is executed, after extracting the attribute containing the engine and constructing a list of inputs, then returns the tensors back to the user. +

+ + +

+ Working with Unsupported Operators + + ¶ + +

+

+ Torch-TensorRT is a new library and the PyTorch operator library is quite large, so there will be ops that aren’t supported natively by the compiler. You can either use the composition techinques +shown above to make modules are fully Torch-TensorRT supported and ones that are not and stitch the modules together in the deployment application or you can register converters for missing ops. +

+
+
+

+ You can check support without going through the full compilation pipleine using the + + + torch_tensorrt::CheckMethodOperatorSupport(const + + + torch::jit::Module& + + + module, + + + std::string + + + method_name) + + + api +to see what operators are not supported. + + + torchtrtc + + + automatically checks modules with this method before starting compilation and will print out a list of operators that are not supported. +

+
+
+ + +

+ Registering Custom Converters + + ¶ + +

+

+ Operations are mapped to TensorRT through the use of modular converters, a function that takes a node from a the JIT graph and produces an equivalent layer or subgraph in TensorRT. +Torch-TensorRT ships with a library of these converters stored in a registry, that will be executed depending on the node being parsed. For instance a + + + aten::relu(%input0.4) + + + instruction will trigger +the relu converter to be run on it, producing an activation layer in the TensorRT graph. But since this library is not exhaustive you may need to write your own to get Torch-TensorRT +to support your module. +

+

+ Shipped with the Torch-TensorRT distribution are the internal core API headers. You can therefore access the converter registry and add a converter for the op you need. +

+

+ For example, if we try to compile a graph with a build of Torch-TensorRT that doesn’t support the flatten operation ( + + + aten::flatten + + + ) you may see this error: +

+
+
+
terminate called after throwing an instance of 'torch_tensorrt::Error'
+what():  [enforce fail at core/conversion/conversion.cpp:109] Expected converter to be true but got false
+Unable to convert node: %input.1 : Tensor = aten::flatten(%x.1, %11, %5) # x.py:25:0 (conversion.AddLayer)
+Schema: aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor)
+Converter for aten::flatten requested, but no such converter was found.
+If you need a converter for this operator, you can try implementing one yourself
+or request a converter: https://www.github.com/NVIDIA/Torch-TensorRT/issues
+
+
+
+

+ We can register a converter for this operator in our application. All of the tools required to build a converter can be imported by including + + + torch_tensorrt/core/conversion/converters/converters.h + + + . +We start by creating an instance of the self-registering class + + + torch_tensorrt::core::conversion::converters::RegisterNodeConversionPatterns() + + + which will register converters +in the global converter registry, associating a function schema like + + + aten::flatten.using_ints(Tensor + + + self, + + + int + + + start_dim=0, + + + int + + + end_dim=-1) + + + -> + + + (Tensor) + + + with a lambda that +will take the state of the conversion, the node/operation in question to convert and all of the inputs to the node and produces as a side effect a new layer in the TensorRT network. +Arguments are passed as a vector of inspectable unions of TensorRT + + + ITensors + + + and Torch + + + IValues + + + in the order arguments are listed in the schema. +

+

+ Below is a implementation of a + + + aten::flatten + + + converter that we can use in our application. You have full access to the Torch and TensorRT libraries in the converter implementation. So +for example we can quickly get the output size by just running the operation in PyTorch instead of implementing the full calculation outself like we do below for this flatten converter. +

+
+
+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+#include "torch_tensorrt/core/conversion/converters/converters.h"
+
+static auto flatten_converter = torch_tensorrt::core::conversion::converters::RegisterNodeConversionPatterns()
+    .pattern({
+        "aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor)",
+        [](torch_tensorrt::core::conversion::ConversionCtx* ctx,
+           const torch::jit::Node* n,
+           torch_tensorrt::core::conversion::converters::args& args) -> bool {
+            auto in = args[0].ITensor();
+            auto start_dim = args[1].unwrapToInt();
+            auto end_dim = args[2].unwrapToInt();
+            auto in_shape = torch_tensorrt::core::util::toVec(in->getDimensions());
+            auto out_shape = torch::flatten(torch::rand(in_shape), start_dim, end_dim).sizes();
+
+            auto shuffle = ctx->net->addShuffle(*in);
+            shuffle->setReshapeDimensions(torch_tensorrt::core::util::toDims(out_shape));
+            shuffle->setName(torch_tensorrt::core::util::node_info(n).c_str());
+
+            auto out_tensor = ctx->AssociateValueAndTensor(n->outputs()[0], shuffle->getOutput(0));
+            return true;
+        }
+    });
+
+int main() {
+    ...
+
+
+
+

+ To use this converter in Python, it is recommended to use PyTorch’s + + C++ / CUDA Extention + + template to wrap your library of converters into a + + + .so + + + that you can load with + + + ctypes.CDLL() + + + in your Python application. +

+

+ You can find more information on all the details of writing converters in the contributors documentation ( + + + Writing Converters + + + ). +If you find yourself with a large library of converter implementations, do consider upstreaming them, PRs are welcome and it would be great for the community to benefit as well. +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/tutorials/getting_started_with_fx_path.html b/docs/v1.1.1/tutorials/getting_started_with_fx_path.html new file mode 100644 index 0000000000..24a04fde69 --- /dev/null +++ b/docs/v1.1.1/tutorials/getting_started_with_fx_path.html @@ -0,0 +1,912 @@ + + + + + + + + + + + + + Torch-TensorRT (FX Frontend) User Guide — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Torch-TensorRT (FX Frontend) User Guide
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Torch-TensorRT (FX Frontend) User Guide

+

Torch-TensorRT (FX Frontend) is a tool that can convert a PyTorch model through torch.fx to an +TensorRT engine optimized targeting running on Nvidia GPUs. TensorRT is the inference engine +developed by NVIDIA which composed of various kinds of optimization including kernel fusion, +graph optimization, low precision, etc.. This tool is developed in Python environment which allows this +workflow to be very accessible to researchers and engineers. There are a few stages that a +user want to use this tool and we will introduce them here.

+

> Torch-TensorRT (FX Frontend) is in Beta and currently it is recommended to work with PyTorch nightly.

+
# Test an example by
+$ python py/torch_tensorrt/fx/example/lower_example.py
+
+
+
+

Converting a PyTorch Model to TensorRT Engine

+

In general, users are welcome to use the compile() to finish the conversion from a model to tensorRT engine. It is a +wrapper API that consists of the major steps needed to finish this converison. Please refer to lower_example.py file in examples/fx.

+

In this section, we will go through an example to illustrate the major steps that fx path uses. +Users can refer to fx2trt_example.py file in examples/fx.

+
    +
  • Step 1: Trace the model with acc_tracer

  • +
+

Acc_tracer is a tracer inheritated from FX tracer. It comes with args normalizer to convert all args to kwargs and pass to TRT converters.

+
import torch_tensorrt.fx.tracer.acc_tracer.acc_tracer as acc_tracer
+
+# Build the model which needs to be a PyTorch nn.Module.
+my_pytorch_model = build_model()
+
+# Prepare inputs to the model. Inputs have to be a List of Tensors
+inputs = [Tensor, Tensor, ...]
+
+# Trace the model with acc_tracer.
+acc_mod = acc_tracer.trace(my_pytorch_model, inputs)
+
+
+

Common Errors:

+

symbolically traced variables cannot be used as inputs to control flow +This means the model contains dynamic control flow. Please refer to section “Dynamic Control Flow” in FX guide.

+
    +
  • Step 2: Build TensorRT engine

  • +
+

There are two different modes for how TensorRT handles batch dimension, explicit batch dimension and implicit batch dimension. This mode was used by early versions of TensorRT, and is now deprecated but continues to be supported for backwards compatibility. In explicit batch mode, all dimensions are explicit and can be dynamic, that is their length can change at execution time. Many new features, such as dynamic shapes and loops, are available only in this mode. User can still choose to use implicit batch mode when they set explicit_batch_dimension=False in compile(). We do not recommend to use it since it will lack of support in future TensorRT versions.

+

Explicit batch is the default mode and it must be set for dynamic shape. For most of vision task, user can choose to enable dynamic_batch in compile() if they want to get the similar effects as implicit mode where only batch dimension changes. It has some requirements: +1. Shapes of inputs, outputs and activations are fixed except batch dimension. +2. Inputs, outputs and activations have batch dimension as the major dimension. +3. All the operators in the model do not modify batch dimension (permute, transpose, split, etc.) or compute over batch dimension (sum, softmax, etc.).

+

For examples of the last path, if we have a 3D tensor t shaped as (batch, sequence, dimension), operations such as torch.transpose(0, 2). If any of these three are not satisfied, we’ll need to specify InputTensorSpec as inputs with dynamic range.

+
import deeplearning.trt.fx2trt.converter.converters
+from torch.fx.experimental.fx2trt.fx2trt import InputTensorSpec, TRTInterpreter
+
+# InputTensorSpec is a dataclass we use to store input information.
+# There're two ways we can build input_specs.
+# Option 1, build it manually.
+input_specs = [
+  InputTensorSpec(shape=(1, 2, 3), dtype=torch.float32),
+  InputTensorSpec(shape=(1, 4, 5), dtype=torch.float32),
+]
+# Option 2, build it using sample_inputs where user provide a sample
+inputs = [
+torch.rand((1,2,3), dtype=torch.float32),
+torch.rand((1,4,5), dtype=torch.float32),
+]
+input_specs = InputTensorSpec.from_tensors(inputs)
+
+# IMPORTANT: If dynamic shape is needed, we need to build it slightly differently.
+input_specs = [
+    InputTensorSpec(
+        shape=(-1, 2, 3),
+        dtype=torch.float32,
+        # Currently we only support one set of dynamic range. User may set other dimensions but it is not promised to work for any models
+        # (min_shape, optimize_target_shape, max_shape)
+        # For more information refer to fx/input_tensor_spec.py
+        shape_ranges = [
+            ((1, 2, 3), (4, 2, 3), (100, 2, 3)),
+        ],
+    ),
+    InputTensorSpec(shape=(1, 4, 5), dtype=torch.float32),
+]
+
+# Build a TRT interpreter. Set explicit_batch_dimension accordingly.
+interpreter = TRTInterpreter(
+    acc_mod, input_specs, explicit_batch_dimension=True/False
+)
+
+# The output of TRTInterpreter run() is wrapped as TRTInterpreterResult.
+# The TRTInterpreterResult contains required parameter to build TRTModule,
+# and other informational output from TRTInterpreter run.
+class TRTInterpreterResult(NamedTuple):
+    engine: Any
+    input_names: Sequence[str]
+    output_names: Sequence[str]
+    serialized_cache: bytearray
+
+#max_batch_size: set accordingly for maximum batch size you will use.
+#max_workspace_size: set to the maximum size we can afford for temporary buffer
+#lower_precision: the precision model layers are running on (TensorRT will choose the best perforamnce precision).
+#sparse_weights: allow the builder to examine weights and use optimized functions when weights have suitable sparsity
+#force_fp32_output: force output to be fp32
+#strict_type_constraints: Usually we should set it to False unless we want to control the precision of certain layer for numeric #reasons.
+#algorithm_selector: set up algorithm selection for certain layer
+#timing_cache: enable timing cache for TensorRT
+#profiling_verbosity: TensorRT logging level
+trt_interpreter_result = interpreter.run(
+    max_batch_size=64,
+    max_workspace_size=1 << 25,
+    sparse_weights=False,
+    force_fp32_output=False,
+    strict_type_constraints=False,
+    algorithm_selector=None,
+    timing_cache=None,
+    profiling_verbosity=None,
+)
+
+
+

Common Errors:

+

RuntimeError: Conversion of function xxx not currently supported! +- This means we don’t have the support for this xxx operator. Please refer to section “How to add a missing op” below for further instructions.

+
    +
  • Step 3: Run the model

  • +
+

One way is using TRTModule, which is basically a PyTorch nn.Module.

+
from torch_tensorrt.fx import TRTModule
+mod = TRTModule(
+    trt_interpreter_result.engine,
+    trt_interpreter_result.input_names,
+    trt_interpreter_result.output_names)
+# Just like all other PyTorch modules
+outputs = mod(*inputs)
+torch.save(mod, "trt.pt")
+reload_trt_mod = torch.load("trt.pt")
+reload_model_output = reload_trt_mod(*inputs)
+
+
+

So far, we give a detailed explanation of major steps in convterting a PyTorch model into TensorRT engine. Users are welcome to refer to the source code for some parameters explanations. In the converting scheme, there are two important actions in it. One is acc tracer which helps us to convert a PyTorch model to acc graph. The other is FX path converter which helps to convert the acc graph’s operation to corresponding TensorRT operation and build up the TensoRT engine for it.

+
+
+

Acc Tracer

+

Acc tracer is a custom FX symbolic tracer. It does a couple more things compare to the vanilla FX symbolic tracer. We mainly depend on it to convert PyTorch ops or builtin ops to acc ops. There are two main purposes for fx2trt to use acc ops:

+
    +
  1. there’re many ops that do similar things in PyTorch ops and builtin ops such like torch.add, builtin.add and torch.Tensor.add. Using acc tracer, we normalize these three ops to a single acc_ops.add. This helps reduce the number of converters we need to write.

  2. +
  3. acc ops only have kwargs which makes writing converter easier as we don’t need to add additional logic to find arguments in args and kwargs.

  4. +
+
+
+

FX2TRT

+

After symbolic tracing, we have the graph representation of a PyTorch model. fx2trt leverages the power of fx.Interpreter. fx.Interpreter goes through the whole graph node by node and calls the function that node represents. fx2trt overrides the original behavior of calling the function with invoking corresponding converts for each node. Each converter function adds corresponding TensorRT layer(s).

+

Below is an example of a converter function. The decorator is used to register this converter function with the corresponding node. In this example, we register this converter to a fx node whose target is acc_ops.sigmoid.

+
@tensorrt_converter(acc_ops.sigmoid)
+def acc_ops_sigmoid(network, target, args, kwargs, name):
+    """
+    network: TensorRT network. We'll be adding layers to it.
+
+    The rest arguments are attributes of fx node.
+    """
+    input_val = kwargs['input']
+
+    if not isinstance(input_val, trt.tensorrt.ITensor):
+        raise RuntimeError(f'Sigmoid received input {input_val} that is not part '
+                        'of the TensorRT region!')
+
+    layer = network.add_activation(input=input_val, type=trt.ActivationType.SIGMOID)
+    layer.name = name
+    return layer.get_output(0)
+
+
+
+

How to Add a Missing Op

+

You can actually add it wherever you want just need to remember import the file so that all acc ops and mapper will be registered before tracing with acc_tracer.

+
    +
  • Step 1. Add a new acc op

  • +
+

TODO: Need to explain more on the logistic of acc op like when we want to break down an op and when we want to reuse other ops.

+

In acc tracer, we convert nodes in the graph to acc ops if there’s a mapping registered for the node to an acc op.

+

In order to make the conversion to acc ops to happen, there’re two things required. One is that there should be an acc op function defined and the other is there should be a mapping registered.

+

Defining an acc op is simple, we first just need a function and register the function as an acc op via this decorator acc_normalizer.py. e.g. the following code adds an acc op named foo() which adds two given inputs.

+
# NOTE: all acc ops should only take kwargs as inputs, therefore we need the "*"
+# at the beginning.
+@register_acc_op
+def foo(*, input, other, alpha):
+    return input + alpha * other
+
+
+

There’re two ways to register a mapping. One is register_acc_op_mapping(). Let’s register a mapping from torch.add to foo() we just created above. We need to add decorator register_acc_op_mapping to it.

+
this_arg_is_optional = True
+
+@register_acc_op_mapping(
+    op_and_target=("call_function", torch.add),
+    arg_replacement_tuples=[
+        ("input", "input"),
+        ("other", "other"),
+        ("alpha", "alpha", this_arg_is_optional),
+    ],
+)
+@register_acc_op
+def foo(*, input, other, alpha=1.0):
+    return input + alpha * other
+
+
+

op_and_target determines which node will trigger this mapping. op and target are the attributes of FX node. In acc_normalization when we see a node with the same op and target as set in the op_and_target, we will trigger the mapping. Since we want to map from torch.add, then op would be call_function and target would be torch.add. arg_replacement_tuples determines how we construct kwargs for new acc op node using args and kwargs from original node. Each tuple in arg_replacement_tuples represents one argument mapping rule. It contains two or three elements. The third element is a boolean variable that determines whether this kwarg is optional in original node. We only need to specify the third element if it’s True. The first element is the argument name in original node which will be used as the acc op node’s argument whose name is the second element in the tuple. The sequence of the tuples does matter because the position of the tuple determines where the argument is in original node’s args. We use this information to map args from original node to kwargs in acc op node. +We don’t have to specify arg_replacement_tuples if none of the followings are true.

+
    +
  1. kwargs of original nodes and acc op nodes have different name.

  2. +
  3. there’re optional arguments.

  4. +
+

The other way to register a mapping is through register_custom_acc_mapper_fn(). This one is designed to reduce the redundant op registration as it allows you to use a function to map to one or more existing acc ops throught some combinations. In the function, you can do basically whatever you want. Let’s use an example to explain how it works.

+
@register_acc_op
+def foo(*, input, other, alpha=1.0):
+    return input + alpha * other
+
+@register_custom_acc_mapper_fn(
+    op_and_target=("call_function", torch.add),
+    arg_replacement_tuples=[
+        ("input", "input"),
+        ("other", "other"),
+        ("alpha", "alpha", this_arg_is_optional),
+    ],
+)
+def custom_mapper(node: torch.fx.Node, _: nn.Module) -> torch.fx.Node:
+    """
+    `node` is original node, which is a call_function node with target
+    being torch.add.
+    """
+    alpha = 1
+    if "alpha" in node.kwargs:
+        alpha = node.kwargs["alpha"]
+    foo_kwargs = {"input": node["input"], "other": node["other"], "alpha": alpha}
+    with node.graph.inserting_before(node):
+        foo_node = node.graph.call_function(foo, kwargs=foo_kwargs)
+        foo_node.meta = node.meta.copy()
+        return foo_node
+
+
+

In the custom mapper function, we construct an acc op node and return it. The node we returns here would take over all the children nodes of original nodes acc_normalizer.py.

+

The last step would be adding unit test for the new acc op or mapper function we added. The place to add the unit test is here test_acc_tracer.py.

+
    +
  • Step 2. Add a new converter

  • +
+

All the developed converters for acc ops are all in acc_op_converter.py. It could give you a good example of how the converter is added.

+

Essentially, the converter is the mapping mechanism that maps the acc ops to a TensorRT layer. If we are able to find all the TensorRT layers we need we can get start to add a converter for the node using TensorRT APIs.

+
@tensorrt_converter(acc_ops.sigmoid)
+def acc_ops_sigmoid(network, target, args, kwargs, name):
+    """
+    network: TensorRT network. We'll be adding layers to it.
+
+    The rest arguments are attributes of fx node.
+    """
+    input_val = kwargs['input']
+
+    if not isinstance(input_val, trt.tensorrt.ITensor):
+        raise RuntimeError(f'Sigmoid received input {input_val} that is not part '
+                        'of the TensorRT region!')
+
+    layer = network.add_activation(input=input_val, type=trt.ActivationType.SIGMOID)
+    layer.name = name
+    return layer.get_output(0)
+
+
+

We need to use tensorrt_converter decorator to register the converter. The argument for the decorator is the target of the fx node that we need to convert. In the converter, we can find the inputs to the fx node in kwargs. As in the example, the original node is acc_ops.sigmoid which only has one argument “input” in acc_ops.py. We get the input and check if it’s a TensorRT tensor. After that, we add a sigmoid layer to TensorRT network and return the output of the layer. The output we returned will be passed to the children nodes of acc_ops.sigmoid by fx.Interpreter.

+

What if we can not find corresponding layers in TensorRT that do the same thing as the node.

+

In this case, we would need to do a bit more work. TensorRT provides plugins which serves as custom layers. We have not implement this feature yet. We will update once it is enabled.

+

Last step would be adding the unit test for the new converter we added. User could add corresponding unit test in this folder.

+
+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/tutorials/getting_started_with_python_api.html b/docs/v1.1.1/tutorials/getting_started_with_python_api.html new file mode 100644 index 0000000000..e063850389 --- /dev/null +++ b/docs/v1.1.1/tutorials/getting_started_with_python_api.html @@ -0,0 +1,654 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Using Torch-TensorRT in Python — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ Using Torch-TensorRT in Python + + ¶ + +

+

+ Torch-TensorRT Python API accepts a + + + `torch.nn.Module + + + as an input. Under the hood, it uses + + + torch.jit.script + + + to convert the input module into a +TorchScript module. To compile your input + + + `torch.nn.Module + + + with Torch-TensorRT, all you need to do is provide the module and inputs +to Torch-TensorRT and you will be returned an optimized TorchScript module to run or add into another PyTorch module. Inputs +is a list of + + + torch_tensorrt.Input + + + classes which define input’s shape, datatype and memory format. You can also specify settings such as +operating precision for the engine or target device. After compilation you can save the module just like any other module +to load in a deployment application. In order to load a TensorRT/TorchScript module, make sure you first import + + + torch_tensorrt + + + . +

+
+
+
import torch_tensorrt
+
+...
+
+model = MyModel().eval() # torch module needs to be in eval (not training) mode
+
+inputs = [torch_tensorrt.Input(
+            min_shape=[1, 1, 16, 16],
+            opt_shape=[1, 1, 32, 32],
+            max_shape=[1, 1, 64, 64],
+            dtype=torch.half,
+        )]
+enabled_precisions = {torch.float, torch.half} # Run with fp16
+
+trt_ts_module = torch_tensorrt.compile(model, inputs=inputs, enabled_precisions=enabled_precisions)
+
+input_data = input_data.to('cuda').half()
+result = trt_ts_module(input_data)
+torch.jit.save(trt_ts_module, "trt_ts_module.ts")
+
+
+
+
+
+
# Deployment application
+import torch
+import torch_tensorrt
+
+trt_ts_module = torch.jit.load("trt_ts_module.ts")
+input_data = input_data.to('cuda').half()
+result = trt_ts_module(input_data)
+
+
+
+

+ Torch-TensorRT python API also provides + + + torch_tensorrt.ts.compile + + + which accepts a TorchScript module as input. +The torchscript module can be obtained via scripting or tracing (refer to + + creating_torchscript_module_in_python + + ). + + + torch_tensorrt.ts.compile + + + accepts a Torchscript module +and a list of + + + torch_tensorrt.Input + + + classes. +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/tutorials/installation.html b/docs/v1.1.1/tutorials/installation.html new file mode 100644 index 0000000000..2a810c0419 --- /dev/null +++ b/docs/v1.1.1/tutorials/installation.html @@ -0,0 +1,1813 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Installation — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Installation + + ¶ + +

+

+ Precompiled Binaries + + ¶ + +

+

+ Dependencies + + ¶ + +

+

+ You need to have either PyTorch or LibTorch installed based on if you are using Python or C++ +and you must have CUDA, cuDNN and TensorRT installed. +

+
+ +
+

+ Python Package + + ¶ + +

+

+ You can install the python package using +

+
+
+
pip3 install torch-tensorrt -f https://github.com/NVIDIA/Torch-TensorRT/releases
+
+
+
+ + +

+ C++ Binary Distribution + + ¶ + +

+

+ Precompiled tarballs for releases are provided here: + + https://github.com/NVIDIA/Torch-TensorRT/releases + +

+ + +

+ Compiling From Source + + ¶ + +

+ + +

+ Dependencies for Compilation + + ¶ + +

+

+ Torch-TensorRT is built with Bazel, so begin by installing it. +

+
+
+ +
+
+
export BAZEL_VERSION=$(cat <PATH_TO_TORCHTRT_ROOT>/.bazelversion)
+mkdir bazel
+cd bazel
+curl -fSsL -O https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-dist.zip
+unzip bazel-$BAZEL_VERSION-dist.zip
+bash ./compile.sh
+cp output/bazel /usr/local/bin/
+
+
+
+
+
+

+ You will also need to have CUDA installed on the system (or if running in a container, the system must have +the CUDA driver installed and the container must have CUDA) +

+

+ The correct LibTorch version will be pulled down for you by bazel. +

+
+
+

+ NOTE: For best compatability with official PyTorch, use torch==1.10.0+cuda113, TensorRT 8.0 and cuDNN 8.2 for CUDA 11.3 however Torch-TensorRT itself supports +TensorRT and cuDNN for other CUDA versions for usecases such as using NVIDIA compiled distributions of PyTorch that use other versions of CUDA +e.g. aarch64 or custom compiled version of PyTorch. +

+
+
+ + +

+ Choosing the Right ABI + + ¶ + +

+

+ Likely the most complicated thing about compiling Torch-TensorRT is selecting the correct ABI. There are two options +which are incompatible with each other, pre-cxx11-abi and the cxx11-abi. The complexity comes from the fact that while +the most popular distribution of PyTorch (wheels downloaded from pytorch.org/pypi directly) use the pre-cxx11-abi, most +other distributions you might encounter (e.g. ones from NVIDIA - NGC containers, and builds for Jetson as well as certain +libtorch builds and likely if you build PyTorch from source) use the cxx11-abi. It is important you compile Torch-TensorRT +using the correct ABI to function properly. Below is a table with general pairings of PyTorch distribution sources and the +recommended commands: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ PyTorch Source +

+
+

+ Recommended C++ Compilation Command +

+
+

+ Recommended Python Compilation Command +

+
+

+ PyTorch whl file from PyTorch.org +

+
+

+ bazel build //:libtorchtrt -c opt –config pre_cxx11_abi +

+
+

+ python3 setup.py bdist_wheel +

+
+

+ libtorch-shared-with-deps- + + + * + + + .zip from PyTorch.org +

+
+

+ bazel build //:libtorchtrt -c opt –config pre_cxx11_abi +

+
+

+ python3 setup.py bdist_wheel +

+
+

+ libtorch-cxx11-abi-shared-with-deps- + + + * + + + .zip from PyTorch.org +

+
+

+ bazel build //:libtorchtrt -c opt +

+
+

+ python3 setup.py bdist_wheel –use-cxx11-abi +

+
+

+ PyTorch preinstalled in an NGC container +

+
+

+ bazel build //:libtorchtrt -c opt +

+
+

+ python3 setup.py bdist_wheel –use-cxx11-abi +

+
+

+ PyTorch from the NVIDIA Forums for Jetson +

+
+

+ bazel build //:libtorchtrt -c opt +

+
+

+ python3 setup.py bdist_wheel –jetpack-version 4.6 –use-cxx11-abi +

+
+

+ PyTorch built from Source +

+
+

+ bazel build //:libtorchtrt -c opt +

+
+

+ python3 setup.py bdist_wheel –use-cxx11-abi +

+
+
+
+

+ NOTE: For all of the above cases you must correctly declare the source of PyTorch you intend to use in your WORKSPACE file for both Python and C++ builds. See below for more information +

+
+
+

+ You then have two compilation options: +

+ + +

+ + Building using cuDNN & TensorRT tarball distributions + + + ¶ + +

+
+
+

+ This is recommended so as to build Torch-TensorRT hermetically and insures any compilation errors are not caused by version issues +

+

+ Make sure when running Torch-TensorRT that these versions of the libraries are prioritized in your + + + $LD_LIBRARY_PATH + + +

+
+
+
+
+ You need to download the tarball distributions of TensorRT and cuDNN from the NVIDIA website. +
+
+ +
+
+

+ Place these files in a directory (the directories + + + third_party/distdir/[x86_64-linux-gnu + + + | + + + aarch64-linux-gnu] + + + exist for this purpose) +

+

+ Then compile referencing the directory with the tarballs +

+
+
+

+ If you get errors regarding the packages, check their sha256 hashes and make sure they match the ones listed in + + + WORKSPACE + + +

+
+
+

+ Release Build + + ¶ + +

+
+
+
bazel build //:libtorchtrt -c opt --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu]
+
+
+
+

+ A tarball with the include files and library can then be found in + + + bazel-bin + + +

+ + +

+ Debug Build + + ¶ + +

+

+ To build with debug symbols use the following command +

+
+
+
bazel build //:libtorchtrt -c dbg --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu]
+
+
+
+

+ A tarball with the include files and library can then be found in + + + bazel-bin + + +

+

+ Pre CXX11 ABI Build + + ¶ + +

+

+ To build using the pre-CXX11 ABI use the + + + pre_cxx11_abi + + + config +

+
+
+
bazel build //:libtorchtrt --config pre_cxx11_abi -c [dbg/opt] --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu]
+
+
+
+

+ A tarball with the include files and library can then be found in + + + bazel-bin + + +

+ + +

+ + Building using locally installed cuDNN & TensorRT + + + ¶ + +

+
+
+

+ If you encounter bugs and you compiled using this method please disclose that you used local sources in the issue (an ldd dump would be nice too) +

+
+
+

+ Install TensorRT, CUDA and cuDNN on the system before starting to compile. +

+

+ In WORKSPACE comment out: +

+
+
+
# Downloaded distributions to use with --distdir
+http_archive(
+    name = "cudnn",
+    urls = ["<URL>",],
+
+    build_file = "@//third_party/cudnn/archive:BUILD",
+    sha256 = "<TAR SHA256>",
+    strip_prefix = "cuda"
+)
+
+http_archive(
+    name = "tensorrt",
+    urls = ["<URL>",],
+
+    build_file = "@//third_party/tensorrt/archive:BUILD",
+    sha256 = "<TAR SHA256>",
+    strip_prefix = "TensorRT-<VERSION>"
+)
+
+
+
+

+ and uncomment +

+
+
+
# Locally installed dependencies
+new_local_repository(
+    name = "cudnn",
+    path = "/usr/",
+    build_file = "@//third_party/cudnn/local:BUILD"
+)
+
+new_local_repository(
+name = "tensorrt",
+path = "/usr/",
+build_file = "@//third_party/tensorrt/local:BUILD"
+)
+
+
+
+

+ Release Build + + ¶ + +

+

+ Compile using: +

+
+
+
bazel build //:libtorchtrt -c opt
+
+
+
+

+ A tarball with the include files and library can then be found in + + + bazel-bin + + +

+ + +

+ Debug Build + + ¶ + +

+

+ To build with debug symbols use the following command +

+
+
+
bazel build //:libtorchtrt -c dbg
+
+
+
+

+ A tarball with the include files and library can then be found in + + + bazel-bin + + +

+

+ Pre CXX11 ABI Build + + ¶ + +

+

+ To build using the pre-CXX11 ABI use the + + + pre_cxx11_abi + + + config +

+
+
+
bazel build //:libtorchtrt --config pre_cxx11_abi -c [dbg/opt]
+
+
+
+

+ + Building the Python package + + + ¶ + +

+

+ Begin by installing + + + ninja + + +

+

+ You can build the Python package using + + + setup.py + + + (this will also build the correct version of + + + libtorchtrt.so + + + ) +

+
+
+
python3 setup.py [install/bdist_wheel]
+
+
+
+

+ Debug Build + + ¶ + +

+
+
+
python3 setup.py develop [--user]
+
+
+
+

+ This also compiles a debug build of + + + libtorchtrt.so + + +

+

+ + Building Natively on aarch64 (Jetson) + + + ¶ + +

+

+ Prerequisites + + ¶ + +

+

+ Install or compile a build of PyTorch/LibTorch for aarch64 +

+

+ NVIDIA hosts builds the latest release branch for Jetson here: +

+
+ +
+

+ Enviorment Setup + + ¶ + +

+

+ To build natively on aarch64-linux-gnu platform, configure the + + + WORKSPACE + + + with local available dependencies. +

+
    +
  1. +

    + Disable the rules with + + + http_archive + + + for x86_64 by commenting the following rules: +

    +
  2. +
+
+
+
#http_archive(
+#    name = "libtorch",
+#    build_file = "@//third_party/libtorch:BUILD",
+#    strip_prefix = "libtorch",
+#    urls = ["https://download.pytorch.org/libtorch/cu102/libtorch-cxx11-abi-shared-with-deps-1.5.1.zip"],
+#    sha256 = "cf0691493d05062fe3239cf76773bae4c5124f4b039050dbdd291c652af3ab2a"
+#)
+
+#http_archive(
+#    name = "libtorch_pre_cxx11_abi",
+#    build_file = "@//third_party/libtorch:BUILD",
+#    strip_prefix = "libtorch",
+#    sha256 = "818977576572eadaf62c80434a25afe44dbaa32ebda3a0919e389dcbe74f8656",
+#    urls = ["https://download.pytorch.org/libtorch/cu102/libtorch-shared-with-deps-1.5.1.zip"],
+#)
+
+# Download these tarballs manually from the NVIDIA website
+# Either place them in the distdir directory in third_party and use the --distdir flag
+# or modify the urls to "file:///<PATH TO TARBALL>/<TARBALL NAME>.tar.gz
+
+#http_archive(
+#    name = "cudnn",
+#    urls = ["https://developer.nvidia.com/compute/machine-learning/cudnn/secure/8.0.1.13/10.2_20200626/cudnn-10.2-linux-x64-v8.0.1.13.tgz"],
+#    build_file = "@//third_party/cudnn/archive:BUILD",
+#    sha256 = "0c106ec84f199a0fbcf1199010166986da732f9b0907768c9ac5ea5b120772db",
+#    strip_prefix = "cuda"
+#)
+
+#http_archive(
+#    name = "tensorrt",
+#    urls = ["https://developer.nvidia.com/compute/machine-learning/tensorrt/secure/7.1/tars/TensorRT-7.1.3.4.Ubuntu-18.04.x86_64-gnu.cuda-10.2.cudnn8.0.tar.gz"],
+#    build_file = "@//third_party/tensorrt/archive:BUILD",
+#    sha256 = "9205bed204e2ae7aafd2e01cce0f21309e281e18d5bfd7172ef8541771539d41",
+#    strip_prefix = "TensorRT-7.1.3.4"
+#)
+
+NOTE: You may also need to configure the CUDA version to 10.2 by setting the path for the cuda new_local_repository
+
+
+
+
    +
  1. +

    + Configure the correct paths to directory roots containing local dependencies in the + + + new_local_repository + + + rules: +

    +
    +
    +

    + NOTE: If you installed PyTorch using a pip package, the correct path is the path to the root of the python torch package. +In the case that you installed with + + + sudo + + + pip + + + install + + + this will be + + + /usr/local/lib/python3.6/dist-packages/torch + + + . +In the case you installed with + + + pip + + + install + + + --user + + + this will be + + + $HOME/.local/lib/python3.6/site-packages/torch + + + . +

    +
    +
    +
  2. +
+

+ In the case you are using NVIDIA compiled pip packages, set the path for both libtorch sources to the same path. This is because unlike +PyTorch on x86_64, NVIDIA aarch64 PyTorch uses the CXX11-ABI. If you compiled for source using the pre_cxx11_abi and only would like to +use that library, set the paths to the same path but when you compile make sure to add the flag + + + --config=pre_cxx11_abi + + +

+
+
+
new_local_repository(
+    name = "libtorch",
+    path = "/usr/local/lib/python3.6/dist-packages/torch",
+    build_file = "third_party/libtorch/BUILD"
+)
+
+new_local_repository(
+    name = "libtorch_pre_cxx11_abi",
+    path = "/usr/local/lib/python3.6/dist-packages/torch",
+    build_file = "third_party/libtorch/BUILD"
+)
+
+new_local_repository(
+    name = "cudnn",
+    path = "/usr/",
+    build_file = "@//third_party/cudnn/local:BUILD"
+)
+
+new_local_repository(
+    name = "tensorrt",
+    path = "/usr/",
+    build_file = "@//third_party/tensorrt/local:BUILD"
+)
+
+
+
+

+ Compile C++ Library and Compiler CLI + + ¶ + +

+
+
+

+ NOTE: Due to shifting dependency locations between Jetpack 4.5 and 4.6 there is a now a flag to inform bazel of the Jetpack version +

+
+
+
--platforms //toolchains:jetpack_4.x
+
+
+
+
+
+

+ Compile Torch-TensorRT library using bazel command: +

+
+
+
bazel build //:libtorchtrt --platforms //toolchains:jetpack_4.6
+
+
+
+

+ Compile Python API + + ¶ + +

+
+
+

+ NOTE: Due to shifting dependencies locations between Jetpack 4.5 and Jetpack 4.6 there is now a flag for + + + setup.py + + + which sets the jetpack version (default: 4.6) +

+
+
+

+ Compile the Python API using the following command from the + + + //py + + + directory: +

+
+
+
python3 setup.py install --use-cxx11-abi
+
+
+
+

+ If you have a build of PyTorch that uses Pre-CXX11 ABI drop the + + + --use-cxx11-abi + + + flag +

+

+ If you are building for Jetpack 4.5 add the + + + --jetpack-version + + + 4.5 + + + flag +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/tutorials/notebooks.html b/docs/v1.1.1/tutorials/notebooks.html new file mode 100644 index 0000000000..2c50d64563 --- /dev/null +++ b/docs/v1.1.1/tutorials/notebooks.html @@ -0,0 +1,795 @@ + + + + + + + + + + + + + Example notebooks — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Example notebooks
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Example notebooks

+

There exists a number of notebooks which cover specific using specific features and models +with Torch-TensorRT

+
+

Notebooks

+
+

Compiling CitriNet with Torch-TensorRT

+

Citrinet is an acoustic model used for the speech to text recognition task. It is a version +of QuartzNet that extends ContextNet, utilizing subword encoding (via Word Piece tokenization) +and Squeeze-and-Excitation(SE) mechanism and are therefore smaller than QuartzNet models. CitriNet +models take in audio segments and transcribe them to letter, byte pair, or word piece sequences.

+

This notebook demonstrates the steps for optimizing a pretrained CitriNet model with Torch-TensorRT, +and running it to test the speedup obtained.

+ +
+
+

Compiling EfficentNet with Torch-TensorRT

+

EfficentNet is a feedforward CNN designed to achieve better performance and accuracy than alternative architectures +by using a “scaling method that uniformly scales all dimensions of depth/width/resolution using a simple yet highly effective compound coefficient”.

+

This notebook demonstrates the steps for optimizing a pretrained EfficentNet model with Torch-TensorRT, +and running it to test the speedup obtained.

+ +
+
+

Masked Language Modeling (MLM) with Hugging Face BERT Transformer accelerated by Torch-TensorRT

+

“BERT is a transformer model pretrained on a large corpus of English data in a self-supervised fashion. +This way, the model learns an inner representation of the English language that can then be used to extract +features useful for downstream tasks: if you have a dataset of labeled sentences for instance, you can train +a standard classifier using the features produced by the BERT model as inputs.” (https://huggingface.co/bert-base-uncased)

+

This notebook demonstrates the steps for optimizing a pretrained EfficentNet model with Torch-TensorRT, +and running it to test the speedup obtained.

+ +
+
+

Serving a model in C++ using Torch-TensorRT

+

This example shows how you can load a pretrained ResNet-50 model, convert it to a Torch-TensorRT +optimized model (via the Torch-TensorRT Python API), save the model as a torchscript module, and +then finally load and serve the model with the PyTorch C++ API.

+ +
+
+

Compiling ResNet50 with Torch-TensorRT

+

This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a +pretrained ResNet-50 network, and running it to test the speedup obtained.

+ +
+
+

Using Dynamic Shapes with Torch-TensorRT

+

Making use of Dynamic Shaped Tensors in Torch TensorRT is quite simple. Let’s say you are +using the torch_tensorrt.compile(...) function to compile a torchscript module. One +of the args in this function in this function is input: which defines an input to a +module in terms of expected shape, data type and tensor format: torch_tensorrt.Input.

+

For the purposes of this walkthrough we just need three kwargs: min_shape, opt_shape` and max_shape.

+
torch_tensorrt.Input(
+        min_shape=(1, 224, 224, 3),
+        opt_shape=(1, 512, 512, 3),
+        max_shape=(1, 1024, 1024, 3),
+        dtype=torch.int32
+        format=torch.channel_last
+    )
+...
+
+
+

In this example, we are going to use a simple ResNet model to demonstrate the use of the API.

+ +
+
+

Using the FX Frontend with Torch-TensorRT

+

The purpose of this example is to demostrate the overall flow of lowering a PyTorch model to TensorRT +conveniently with using FX.

+ +
+
+

Compiling a PyTorch model using FX Frontend with Torch-TensorRT

+

The purpose of this example is to demonstrate the overall flow of lowering a PyTorch +model to TensorRT via FX with existing FX based tooling

+ +
+
+

Compiling LeNet with Torch-TensorRT

+

This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a simple LeNet network.

+ +
+
+

Accelerate Deep Learning Models using Quantization in Torch-TensorRT

+

Model Quantization is a popular way of optimization which reduces the size of models thereby +accelerating inference, also opening up the possibilities of deployments on devices with lower +computation power such as Jetson. Simply put, quantization is a process of mapping input values

+
+

from a larger set to output values in a smaller set. In this notebook, we illustrate the workflow +that you can adopt while quantizing a deep learning model in Torch-TensorRT. The notebook takes +you through an example of Mobilenetv2 for a classification task on a subset of Imagenet Dataset +called Imagenette which has 10 classes.

+
+ +
+
+

Object Detection with Torch-TensorRT (SSD)

+

This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained SSD network, and running it to test the speedup obtained.

+ +
+
+

Deploying Quantization Aware Trained models in INT8 using Torch-TensorRT

+

Quantization Aware training (QAT) simulates quantization during training by +quantizing weights and activation layers. This will help to reduce the loss in +accuracy when we convert the network trained in FP32 to INT8 for faster inference. +QAT introduces additional nodes in the graph which will be used to learn the dynamic +ranges of weights and activation layers. In this notebook, we illustrate the following +steps from training to inference of a QAT model in Torch-TensorRT.

+ +
+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/tutorials/ptq.html b/docs/v1.1.1/tutorials/ptq.html new file mode 100644 index 0000000000..3de05ab124 --- /dev/null +++ b/docs/v1.1.1/tutorials/ptq.html @@ -0,0 +1,1040 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Post Training Quantization (PTQ) — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Post Training Quantization (PTQ) + + ¶ + +

+

+ Post Training Quantization (PTQ) is a technique to reduce the required computational resources for inference +while still preserving the accuracy of your model by mapping the traditional FP32 activation space to a reduced +INT8 space. TensorRT uses a calibration step which executes your model with sample data from the target domain +and track the activations in FP32 to calibrate a mapping to INT8 that minimizes the information loss between +FP32 inference and INT8 inference. +

+

+ Users writing TensorRT applications are required to setup a calibrator class which will provide sample data to +the TensorRT calibrator. With Torch-TensorRT we look to leverage existing infrastructure in PyTorch to make implementing +calibrators easier. +

+

+ LibTorch provides a + + + DataLoader + + + and + + + Dataset + + + API which steamlines preprocessing and batching input data. +These APIs are exposed via both C++ and Python interface which makes it easier for the end user. +For C++ interface, we use + + + torch::Dataset + + + and + + + torch::data::make_data_loader + + + objects to construct and perform pre-processing on datasets. +The equivalent functionality in python interface uses + + + torch.utils.data.Dataset + + + and + + + torch.utils.data.DataLoader + + + . +This section of the PyTorch documentation has more information + + https://pytorch.org/tutorials/advanced/cpp_frontend.html#loading-data + + and + + https://pytorch.org/tutorials/recipes/recipes/loading_data_recipe.html + + . +Torch-TensorRT uses Dataloaders as the base of a generic calibrator implementation. So you will be able to reuse or quickly +implement a + + + torch::Dataset + + + for your target domain, place it in a DataLoader and create a INT8 Calibrator +which you can provide to Torch-TensorRT to run INT8 Calibration during compliation of your module. +

+ + +

+ How to create your own PTQ application in C++ + + ¶ + +

+

+ Here is an example interface of a + + + torch::Dataset + + + class for CIFAR10: +

+
+ + + + + +
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+
+
+
+
//cpp/ptq/datasets/cifar10.h
+#pragma once
+
+#include "torch/data/datasets/base.h"
+#include "torch/data/example.h"
+#include "torch/types.h"
+
+#include <cstddef>
+#include <string>
+
+namespace datasets {
+// The CIFAR10 Dataset
+class CIFAR10 : public torch::data::datasets::Dataset<CIFAR10> {
+public:
+    // The mode in which the dataset is loaded
+    enum class Mode { kTrain, kTest };
+
+    // Loads CIFAR10 from un-tarred file
+    // Dataset can be found https://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz
+    // Root path should be the directory that contains the content of tarball
+    explicit CIFAR10(const std::string& root, Mode mode = Mode::kTrain);
+
+    // Returns the pair at index in the dataset
+    torch::data::Example<> get(size_t index) override;
+
+    // The size of the dataset
+    c10::optional<size_t> size() const override;
+
+    // The mode the dataset is in
+    bool is_train() const noexcept;
+
+    // Returns all images stacked into a single tensor
+    const torch::Tensor& images() const;
+
+    // Returns all targets stacked into a single tensor
+    const torch::Tensor& targets() const;
+
+    // Trims the dataset to the first n pairs
+    CIFAR10&& use_subset(int64_t new_size);
+
+
+private:
+    Mode mode_;
+    torch::Tensor images_, targets_;
+};
+} // namespace datasets
+
+
+
+
+

+ This class’s implementation reads from the binary distribution of the CIFAR10 dataset and builds two tensors which hold the images and labels. +

+

+ We use a subset of the dataset to use for calibration, since we don’t need the the full dataset for effective calibration and calibration does +some take time, then define the preprocessing to apply to the images in the dataset and create a DataLoader from the dataset which will batch the data: +

+
+
+
auto calibration_dataset = datasets::CIFAR10(data_dir, datasets::CIFAR10::Mode::kTest)
+                                    .use_subset(320)
+                                    .map(torch::data::transforms::Normalize<>({0.4914, 0.4822, 0.4465},
+                                                                            {0.2023, 0.1994, 0.2010}))
+                                    .map(torch::data::transforms::Stack<>());
+auto calibration_dataloader = torch::data::make_data_loader(std::move(calibration_dataset),
+                                                            torch::data::DataLoaderOptions().batch_size(32)
+                                                                                            .workers(2));
+
+
+
+

+ Next we create a calibrator from the + + + calibration_dataloader + + + using the calibrator factory (found in + + + torch_tensorrt/ptq.h + + + ): +

+
+
+
#include "torch_tensorrt/ptq.h"
+...
+
+auto calibrator = torch_tensorrt::ptq::make_int8_calibrator(std::move(calibration_dataloader), calibration_cache_file, true);
+
+
+
+

+ Here we also define a location to write a calibration cache file to which we can use to reuse the calibration data without needing the dataset and whether or not +we should use the cache file if it exists. There also exists a + + + torch_tensorrt::ptq::make_int8_cache_calibrator + + + factory which creates a calibrator that uses the cache +only for cases where you may do engine building on a machine that has limited storage (i.e. no space for a full dataset) or to have a simpiler deployment application. +

+

+ The calibrator factories create a calibrator that inherits from a + + + nvinfer1::IInt8Calibrator + + + virtual class ( + + + nvinfer1::IInt8EntropyCalibrator2 + + + by default) which +defines the calibration algorithm used when calibrating. You can explicitly make the selection of calibration algorithm like this: +

+
+
+
// MinMax Calibrator is geared more towards NLP tasks
+auto calibrator = torch_tensorrt::ptq::make_int8_calibrator<nvinfer1::IInt8MinMaxCalibrator>(std::move(calibration_dataloader), calibration_cache_file, true);
+
+
+
+

+ Then all thats required to setup the module for INT8 calibration is to set the following compile settings in the + + torch_tensorrt::CompileSpec + + struct and compiling the module: +

+
+
+
std::vector<std::vector<int64_t>> input_shape = {{32, 3, 32, 32}};
+/// Configure settings for compilation
+auto compile_spec = torch_tensorrt::CompileSpec({input_shape});
+/// Set operating precision to INT8
+compile_spec.enabled_precisions.insert(torch::kF16);
+compile_spec.enabled_precisions.insert(torch::kI8);
+/// Use the TensorRT Entropy Calibrator
+compile_spec.ptq_calibrator = calibrator;
+/// Set a larger workspace (you may get better performace from doing so)
+compile_spec.workspace_size = 1 << 28;
+
+auto trt_mod = torch_tensorrt::CompileGraph(mod, compile_spec);
+
+
+
+

+ If you have an existing Calibrator implementation for TensorRT you may directly set the + + + ptq_calibrator + + + field with a pointer to your calibrator and it will work as well. +From here not much changes in terms of how to execution works. You are still able to fully use LibTorch as the sole interface for inference. Data should remain +in FP32 precision when it’s passed into + + trt_mod.forward + + . There exists an example application in the Torch-TensorRT demo that takes you from training a VGG16 network on +CIFAR10 to deploying in INT8 with Torch-TensorRT here: + + https://github.com/NVIDIA/Torch-TensorRT/tree/master/cpp/ptq + +

+ + +

+ How to create your own PTQ application in Python + + ¶ + +

+

+ Torch-TensorRT Python API provides an easy and convenient way to use pytorch dataloaders with TensorRT calibrators. + + + DataLoaderCalibrator + + + class can be used to create +a TensorRT calibrator by providing desired configuration. The following code demonstrates an example on how to use it +

+
+
+
testing_dataset = torchvision.datasets.CIFAR10(root='./data',
+                                                        train=False,
+                                                        download=True,
+                                                        transform=transforms.Compose([
+                                                            transforms.ToTensor(),
+                                                            transforms.Normalize((0.4914, 0.4822, 0.4465),
+                                                                                 (0.2023, 0.1994, 0.2010))
+                                                        ]))
+
+testing_dataloader = torch.utils.data.DataLoader(testing_dataset,
+                                                      batch_size=1,
+                                                      shuffle=False,
+                                                      num_workers=1)
+calibrator = torch_tensorrt.ptq.DataLoaderCalibrator(testing_dataloader,
+                                              cache_file='./calibration.cache',
+                                              use_cache=False,
+                                              algo_type=torch_tensorrt.ptq.CalibrationAlgo.ENTROPY_CALIBRATION_2,
+                                              device=torch.device('cuda:0'))
+
+compile_spec = {
+         "inputs": [torch_tensorrt.Input((1, 3, 32, 32))],
+         "enabled_precisions": {torch.float, torch.half, torch.int8},
+         "calibrator": calibrator,
+         "device": {
+             "device_type": torch_tensorrt.DeviceType.GPU,
+             "gpu_id": 0,
+             "dla_core": 0,
+             "allow_gpu_fallback": False,
+             "disable_tf32": False
+         }
+     }
+trt_mod = torch_tensorrt.compile(model, compile_spec)
+
+
+
+

+ In the cases where there is a pre-existing calibration cache file that users want to use, + + + CacheCalibrator + + + can be used without any dataloaders. The following example demonstrates how +to use + + + CacheCalibrator + + + to use in INT8 mode. +

+
+
+
calibrator = torch_tensorrt.ptq.CacheCalibrator("./calibration.cache")
+
+compile_settings = {
+      "inputs": [torch_tensorrt.Input([1, 3, 32, 32])],
+      "enabled_precisions": {torch.float, torch.half, torch.int8},
+      "calibrator": calibrator,
+  }
+
+trt_mod = torch_tensorrt.compile(model, compile_settings)
+
+
+
+

+ If you already have an existing calibrator class (implemented directly using TensorRT API), you can directly set the calibrator field to your class which can be very convenient. +For a demo on how PTQ can be performed on a VGG network using Torch-TensorRT API, you can refer to + + https://github.com/NVIDIA/Torch-TensorRT/blob/master/tests/py/test_ptq_dataloader_calibrator.py + + and + + https://github.com/NVIDIA/Torch-TensorRT/blob/master/tests/py/test_ptq_trt_calibrator.py + +

+

+ Citations + + ¶ + +

+

+ Krizhevsky, A., & Hinton, G. (2009). Learning multiple layers of features from tiny images. +

+

+ Simonyan, K., & Zisserman, A. (2014). Very deep convolutional networks for large-scale image recognition. arXiv preprint arXiv:1409.1556. +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/tutorials/runtime.html b/docs/v1.1.1/tutorials/runtime.html new file mode 100644 index 0000000000..941d1ec6bf --- /dev/null +++ b/docs/v1.1.1/tutorials/runtime.html @@ -0,0 +1,764 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Deploying Torch-TensorRT Programs — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Deploying Torch-TensorRT Programs + + ¶ + +

+

+ After compiling and saving Torch-TensorRT programs there is no longer a strict dependency on the full +Torch-TensorRT library. All that is required to run a compiled program is the runtime. There are therfore a couple +options to deploy your programs other than shipping the full Torch-TensorRT compiler with your applications. +

+

+ Torch-TensorRT package / libtorchtrt.so + + ¶ + +

+

+ Once a program is compiled, you run it using the standard PyTorch APIs. All that is required is that the package +must be imported in python or linked in C++. +

+

+ Runtime Library + + ¶ + +

+

+ Distributed with the C++ distribution is + + + libtorchtrt_runtime.so + + + . This library only contains the components +necessary to run Torch-TensorRT programs. Instead of linking + + + libtorchtrt.so + + + or importing + + + torch_tensorrt + + + you can +link + + + libtorchtrt_runtime.so + + + in your deployment programs or use + + + DL_OPEN + + + or + + + LD_PRELOAD + + + . For python +you can load the runtime with + + + torch.ops.load_library("libtorchtrt_runtime.so") + + + . You can then continue to use +programs just as you would otherwise via PyTorch API. +

+
+

+ Note +

+

+ If you are using the standard distribution of PyTorch in Python on x86, likely you will need the pre-cxx11-abi variant of + + + libtorchtrt_runtime.so + + + , check + + + Installation + + + documentation for more details. +

+
+
+

+ Note +

+

+ If you are linking + + + libtorchtrt_runtime.so + + + , likely using the following flags will help + + + -Wl,--no-as-needed + + + -ltorchtrt + + + -Wl,--as-needed + + + as theres no direct symbol dependency to anything in the Torch-TensorRT runtime for most Torch-TensorRT runtime applications +

+
+

+ An example of how to use + + + libtorchtrt_runtime.so + + + can be found here: + + https://github.com/NVIDIA/Torch-TensorRT/tree/master/examples/torchtrt_example + +

+

+ Plugin Library + + ¶ + +

+

+ In the case you use Torch-TensorRT as a converter to a TensorRT engine and your engine uses plugins provided by Torch-TensorRT, Torch-TensorRT +ships the library + + + libtorchtrt_plugins.so + + + which contains the implementation of the TensorRT plugins used by Torch-TensorRT during +compilation. This library can be + + + DL_OPEN + + + or + + + LD_PRELOAD + + + similar to other TensorRT plugin libraries. +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/tutorials/serving_torch_tensorrt_with_triton.html b/docs/v1.1.1/tutorials/serving_torch_tensorrt_with_triton.html new file mode 100644 index 0000000000..16029d002c --- /dev/null +++ b/docs/v1.1.1/tutorials/serving_torch_tensorrt_with_triton.html @@ -0,0 +1,826 @@ + + + + + + + + + + + + + Serving a Torch-TensorRT model with Triton — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Serving a Torch-TensorRT model with Triton
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Serving a Torch-TensorRT model with Triton

+

Optimization and deployment go hand in hand in a discussion about Machine +Learning infrastructure. Once network level optimzation are done +to get the maximum performance, the next step would be to deploy it.

+

However, serving this optimized model comes with it’s own set of considerations +and challenges like: building an infrastructure to support concorrent model +executions, supporting clients over HTTP or gRPC and more.

+

The Triton Inference Server +solves the aforementioned and more. Let’s discuss step-by-step, the process of +optimizing a model with Torch-TensorRT, deploying it on Triton Inference +Server, and building a client to query the model.

+
+

Step 1: Optimize your model with Torch-TensorRT

+

Most Torch-TensorRT users will be familiar with this step. For the purpose of +this demonstration, we will be using a ResNet50 model from Torchhub.

+

Let’s first pull the NGC PyTorch Docker container. You may need to create +an account and get the API key from here. +Sign up and login with your key (follow the instructions +here after signing up).

+
# <xx.xx> is the yy:mm for the publishing tag for NVIDIA's Pytorch
+# container; eg. 22.04
+
+docker run -it --gpus all -v ${PWD}:/scratch_space nvcr.io/nvidia/pytorch:<xx.xx>-py3
+cd /scratch_space
+
+
+

Once inside the container, we can proceed to download a ResNet model from +Torchhub and optimize it with Torch-TensorRT.

+
import torch
+import torch_tensorrt
+torch.hub._validate_not_a_forked_repo=lambda a,b,c: True
+
+# load model
+model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True).eval().to("cuda")
+
+# Compile with Torch TensorRT;
+trt_model = torch_tensorrt.compile(model,
+    inputs= [torch_tensorrt.Input((1, 3, 224, 224))],
+    enabled_precisions= { torch.half} # Run with FP32
+)
+
+# Save the model
+torch.jit.save(trt_model, "model.pt")
+
+
+

After copying the model, exit the container. The next step in the process +is to set up a Triton Inference Server.

+
+
+

Step 2: Set Up Triton Inference Server

+

If you are new to the Triton Inference Server and want to learn more, we +highly recommend to checking our Github +Repository.

+

To use Triton, we need to make a model repository. A model repository, as the +name suggested, is a repository of the models the Inference server hosts. While +Triton can serve models from multiple repositories, in this example, we will +discuss the simplest possible form of the model repository.

+

The structure of this repository should look something like this:

+
model_repository
+|
++-- resnet50
+    |
+    +-- config.pbtxt
+    +-- 1
+        |
+        +-- model.pt
+
+
+

There are two files that Triton requires to serve the model: the model itself +and a model configuration file which is typically provided in config.pbtxt. +For the model we prepared in step 1, the following configuration can be used:

+
name: "resnet50"
+platform: "pytorch_libtorch"
+max_batch_size : 0
+input [
+  {
+    name: "input__0"
+    data_type: TYPE_FP32
+    dims: [ 3, 224, 224 ]
+    reshape { shape: [ 1, 3, 224, 224 ] }
+  }
+]
+output [
+  {
+    name: "output__0"
+    data_type: TYPE_FP32
+    dims: [ 1, 1000 ,1, 1]
+    reshape { shape: [ 1, 1000 ] }
+  }
+]
+
+
+

The config.pbtxt file is used to describe the exact model configuration +with details like the names and shapes of the input and output layer(s), +datatypes, scheduling and batching details and more. If you are new to Triton, +we highly encourage you to check out this section of our +documentation +for more details.

+

With the model repository setup, we can proceed to launch the Triton server +with the docker command below. Refer this page for the pull tag for the container.

+
# Make sure that the TensorRT version in the Triton container
+# and TensorRT version in the environment used to optimize the model
+# are the same.
+
+docker run --gpus all --rm -p 8000:8000 -p 8001:8001 -p 8002:8002 -v /full/path/to/the_model_repository/model_repository:/models nvcr.io/nvidia/tritonserver:<xx.yy>-py3 tritonserver --model-repository=/models
+
+
+

This should spin up a Triton Inference server. Next step, building a simple +http client to query the server.

+
+
+

Step 3: Building a Triton Client to Query the Server

+

Before proceeding, make sure to have a sample image on hand. If you don’t +have one, download an example image to test inference. In this section, we +will be going over a very basic client. For a variety of more fleshed out +examples, refer to the Triton Client Repository

+
wget  -O img1.jpg "https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg"
+
+
+

We then need to install dependencies for building a python client. These will +change from client to client. For a full list of all languages supported by Triton, +please refer to Triton’s client repository.

+
pip install torchvision
+pip install attrdict
+pip install nvidia-pyindex
+pip install tritonclient[all]
+
+
+

Let’s jump into the client. Firstly, we write a small preprocessing function to +resize and normalize the query image.

+
import numpy as np
+from torchvision import transforms
+from PIL import Image
+import tritonclient.http as httpclient
+from tritonclient.utils import triton_to_np_dtype
+
+# preprocessing function
+def rn50_preprocess(img_path="img1.jpg"):
+    img = Image.open(img_path)
+    preprocess = transforms.Compose([
+        transforms.Resize(256),
+        transforms.CenterCrop(224),
+        transforms.ToTensor(),
+        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
+    ])
+    return preprocess(img).numpy()
+
+transformed_img = rn50_preprocess()
+
+
+

Building a client requires three basic points. Firstly, we setup a connection +with the Triton Inference Server.

+
# Setting up client
+client = httpclient.InferenceServerClient(url="localhost:8000")
+
+
+

Secondly, we specify the names of the input and output layer(s) of our model.

+
inputs = httpclient.InferInput("input__0", transformed_img.shape, datatype="FP32")
+inputs.set_data_from_numpy(transformed_img, binary_data=True)
+
+outputs = httpclient.InferRequestedOutput("output__0", binary_data=True, class_count=1000)
+
+
+

Lastly, we send an inference request to the Triton Inference Server.

+
# Querying the server
+results = client.infer(model_name="resnet50", inputs=[inputs], outputs=[outputs])
+inference_output = results.as_numpy('output__0')
+print(inference_output[:5])
+
+
+

The output of the same should look like below:

+
[b'12.468750:90' b'11.523438:92' b'9.664062:14' b'8.429688:136'
+ b'8.234375:11']
+
+
+

The output format here is <confidence_score>:<classification_index>. +To learn how to map these to the label names and more, refer to Triton Inference Server’s +documentation.

+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.1.1/tutorials/torchtrtc.html b/docs/v1.1.1/tutorials/torchtrtc.html new file mode 100644 index 0000000000..10fa7cc302 --- /dev/null +++ b/docs/v1.1.1/tutorials/torchtrtc.html @@ -0,0 +1,700 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + torchtrtc — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ torchtrtc + + ¶ + +

+

+ + + torchtrtc + + + is a CLI application for using the Torch-TensorRT compiler. It serves as an easy way to compile a +TorchScript Module with Torch-TensorRT from the command-line to quickly check support or as part of +a deployment pipeline. All basic features of the compiler are supported including post training +quantization (though you must already have a calibration cache file to use the PTQ feature). The compiler can +output two formats, either a TorchScript program with the TensorRT engine embedded or +the TensorRT engine itself as a PLAN file. +

+

+ All that is required to run the program after compilation is for C++ linking against + + + libtorchtrt.so + + + or in Python importing the torch_tensorrt package. All other aspects of using compiled modules are identical +to standard TorchScript. Load with + + + torch.jit.load() + + + and run like you would run any other module. +

+
+
+
torchtrtc [input_file_path] [output_file_path]
+  [input_specs...] {OPTIONS}
+
+  torchtrtc is a compiler for TorchScript, it will compile and optimize
+  TorchScript programs to run on NVIDIA GPUs using TensorRT
+
+OPTIONS:
+
+    -h, --help                        Display this help menu
+    Verbiosity of the compiler
+      -v, --verbose                     Dumps debugging information about the
+                                        compilation process onto the console
+      -w, --warnings                    Disables warnings generated during
+                                        compilation onto the console (warnings
+                                        are on by default)
+      --i, --info                       Dumps info messages generated during
+                                        compilation onto the console
+    --build-debuggable-engine         Creates a debuggable engine
+    --allow-gpu-fallback              (Only used when targeting DLA
+                                      (device-type)) Lets engine run layers on
+                                      GPU if they are not supported on DLA
+    --require-full-compilation        Require that the model should be fully
+                                      compiled to TensorRT or throw an error
+    --check-method-support=[method_name]
+                                      Check the support for end to end
+                                      compilation of a specified method in the
+                                      TorchScript module
+    --disable-tf32                    Prevent Float32 layers from using the
+                                      TF32 data format
+    --sparse-weights                  Enable sparsity for weights of conv and
+                                      FC layers
+    -p[precision...],
+    --enable-precision=[precision...] (Repeatable) Enabling an operating
+                                      precision for kernels to use when
+                                      building the engine (Int8 requires a
+                                      calibration-cache argument) [ float |
+                                      float32 | f32 | fp32 | half | float16 |
+                                      f16 | fp16 | int8 | i8 | char ]
+                                      (default: float)
+    -d[type], --device-type=[type]    The type of device the engine should be
+                                      built for [ gpu | dla ] (default: gpu)
+    --gpu-id=[gpu_id]                 GPU id if running on multi-GPU platform
+                                      (defaults to 0)
+    --dla-core=[dla_core]             DLACore id if running on available DLA
+                                      (defaults to 0)
+    --engine-capability=[capability]  The type of device the engine should be
+                                      built for [ standard | safety |
+                                      dla_standalone ]
+    --calibration-cache-file=[file_path]
+                                      Path to calibration cache file to use
+                                      for post training quantization
+    --teo=[op_name...],
+    --torch-executed-op=[op_name...]  (Repeatable) Operator in the graph that
+                                      should always be run in PyTorch for
+                                      execution (partial compilation must be
+                                      enabled)
+    --tem=[module_name...],
+    --torch-executed-mod=[module_name...]
+                                      (Repeatable) Module that should always
+                                      be run in Pytorch for execution (partial
+                                      compilation must be enabled)
+    --mbs=[num_ops],
+    --min-block-size=[num_ops]        Minimum number of contiguous TensorRT
+                                      supported ops to compile a subgraph to
+                                      TensorRT
+    --embed-engine                    Whether to treat input file as a
+                                      serialized TensorRT engine and embed it
+                                      into a TorchScript module (device spec
+                                      must be provided)
+    --num-min-timing-iter=[num_iters] Number of minimization timing iterations
+                                      used to select kernels
+    --num-avg-timing-iters=[num_iters]
+                                      Number of averaging timing iterations
+                                      used to select kernels
+    --workspace-size=[workspace_size] Maximum size of workspace given to
+                                      TensorRT
+    -t[threshold],
+    --threshold=[threshold]           Maximum acceptable numerical deviation
+                                      from standard torchscript output
+                                      (default 2e-5)
+    --no-threshold-check              Skip checking threshold compliance
+    --truncate-long-double,
+    --truncate, --truncate-64bit      Truncate weights that are provided in
+                                      64bit to 32bit (Long, Double to Int,
+                                      Float)
+    --save-engine                     Instead of compiling a full a
+                                      TorchScript program, save the created
+                                      engine to the path specified as the
+                                      output path
+    input_file_path                   Path to input TorchScript file
+    output_file_path                  Path for compiled TorchScript (or
+                                      TensorRT engine) file
+    input_specs...                    Specs for inputs to engine, can either
+                                      be a single size or a range defined by
+                                      Min, Optimal, Max sizes, e.g.
+                                      "(N,..,C,H,W)"
+                                      "[(MIN_N,..,MIN_C,MIN_H,MIN_W);(OPT_N,..,OPT_C,OPT_H,OPT_W);(MAX_N,..,MAX_C,MAX_H,MAX_W)]".
+                                      Data Type and format can be specified by
+                                      adding an "@" followed by dtype and "%"
+                                      followed by format to the end of the
+                                      shape spec. e.g. "(3, 3, 32,
+                                      32)@f16%NHWC"
+    "--" can be used to terminate flag options and force all following
+    arguments to be treated as positional options
+
+
+
+

+ e.g. +

+
+
+
torchtrtc tests/modules/ssd_traced.jit.pt ssd_trt.ts "[(1,3,300,300); (1,3,512,512); (1, 3, 1024, 1024)]@f16%contiguous" -p f16
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/tutorials/use_from_pytorch.html b/docs/v1.1.1/tutorials/use_from_pytorch.html new file mode 100644 index 0000000000..cfe1d6d790 --- /dev/null +++ b/docs/v1.1.1/tutorials/use_from_pytorch.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Using Torch-TensorRT Directly From PyTorch — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ Using Torch-TensorRT Directly From PyTorch + + ¶ + +

+

+ You will now be able to directly access TensorRT from PyTorch APIs. The process to use this feature +is very similar to the compilation workflow described in + + + Using Torch-TensorRT in Python + + +

+

+ Start by loading + + + torch_tensorrt + + + into your application. +

+
+
+
import torch
+import torch_tensorrt
+
+
+
+

+ Then given a TorchScript module, you can compile it with TensorRT using the + + + torch._C._jit_to_backend("tensorrt", + + + ...) + + + API. +

+
+
+
import torchvision.models as models
+
+model = models.mobilenet_v2(pretrained=True)
+script_model = torch.jit.script(model)
+
+
+
+

+ Unlike the + + + compile + + + API in Torch-TensorRT which assumes you are trying to compile the + + + forward + + + function of a module +or the + + + convert_method_to_trt_engine + + + which converts a specified function to a TensorRT engine, the backend API +will take a dictionary which maps names of functions to compile to Compilation Spec objects which wrap the same +sort of dictionary you would provide to + + + compile + + + . For more information on the compile spec dictionary take a look +at the documentation for the Torch-TensorRT + + + TensorRTCompileSpec + + + API. +

+
+
+
spec = {
+    "forward":
+        torch_tensorrt.ts.TensorRTCompileSpec({
+            "inputs": [torch_tensorrt.Input([1, 3, 300, 300])],
+            "enabled_precisions": {torch.float, torch.half},
+            "refit": False,
+            "debug": False,
+            "device": {
+                "device_type": torch_tensorrt.DeviceType.GPU,
+                "gpu_id": 0,
+                "dla_core": 0,
+                "allow_gpu_fallback": True
+            },
+            "capability": torch_tensorrt.EngineCapability.default,
+            "num_min_timing_iters": 2,
+            "num_avg_timing_iters": 1,
+        })
+    }
+
+
+
+

+ Now to compile with Torch-TensorRT, provide the target module objects and the spec dictionary to + + + torch._C._jit_to_backend("tensorrt", + + + ...) + + +

+
+
+
trt_model = torch._C._jit_to_backend("tensorrt", script_model, spec)
+
+
+
+

+ To run explicitly call the function of the method you want to run (vs. how you can just call on the module itself in standard PyTorch) +

+
+
+
input = torch.randn((1, 3, 300, 300)).to("cuda").to(torch.half)
+print(trt_model.forward(input))
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.1.1/tutorials/using_dla.html b/docs/v1.1.1/tutorials/using_dla.html new file mode 100644 index 0000000000..bfedeaf910 --- /dev/null +++ b/docs/v1.1.1/tutorials/using_dla.html @@ -0,0 +1,620 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + DLA — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ DLA + + ¶ + +

+

+ + + DLA + + + NVIDIA Deep Learning Accelerator is a fixed-function accelerator engine targeted for deep learning operations. DLA is designed to do full hardware acceleration of convolutional neural networks. DLA supports various layers such as convolution, deconvolution, fully-connected, activation, pooling, batch normalization, etc. + + + torch_tensorrt + + + supports compilation of TorchScript Module and deployment pipeline on the DLA hardware available on NVIDIA embedded platforms. +

+

+ NOTE: DLA supports fp16 and int8 precision only. +

+

+ Using DLA with torchtrtc +

+
+
+
torchtrtc [input_file_path] [output_file_path] [input_shapes...] -p f16 -d dla {OPTIONS}
+
+
+
+

+ Using DLA in a C++ application +

+
+
+
std::vector<std::vector<int64_t>> input_shape = {{32, 3, 32, 32}};
+auto compile_spec = torch_tensorrt::CompileSpec({input_shape});
+
+# Set a precision. DLA supports fp16 or int8 only
+compile_spec.enabled_precisions = {torch::kF16};
+compile_spec.device.device_type = torch_tensorrt::CompileSpec::DeviceType::kDLA;
+
+# Make sure the gpu id is set to Xavier id for DLA
+compile_spec.device.gpu_id = 0;
+
+# Set the DLA core id
+compile_spec.device.dla_core = 1;
+
+# If a layer fails to run on DLA it will fallback to GPU
+compile_spec.device.allow_gpu_fallback = true;
+
+# Set the workspace size
+compile_spec.workspace_size = 1 << 28;
+
+
+
+

+ Using DLA in a python application +

+
+
+
compile_spec = {
+    "inputs": [torch_tensorrt.Input(self.input.shape)],
+    "device": torch_tensorrt.Device("dla:0", allow_gpu_fallback=True),
+    "enalbed_precisions": {torch.half}
+}
+
+trt_mod = torch_tensorrt.compile(self.scripted_model, compile_spec)
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.2.0/.nojekyll b/docs/v1.2.0/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/v1.2.0/_cpp_api/class_view_hierarchy.html b/docs/v1.2.0/_cpp_api/class_view_hierarchy.html new file mode 100644 index 0000000000..fceda59a56 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/class_view_hierarchy.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + Class Hierarchy — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+ + +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/classtorch__tensorrt_1_1DataType.html b/docs/v1.2.0/_cpp_api/classtorch__tensorrt_1_1DataType.html new file mode 100644 index 0000000000..46030d46d5 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/classtorch__tensorrt_1_1DataType.html @@ -0,0 +1,843 @@ + + + + + + + + + + + + + Class DataType — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Class DataType

+ +
+

Class Documentation

+
+
+class torch_tensorrt::DataType
+

Supported Data Types that can be used with TensorRT engines

+

This class is compatable with c10::DataTypes (but will check for TRT support) so there should not be a reason that you need to use this type explictly.

+
+

Public Types

+
+
+enum Value
+

Underlying enum class to support the DataType Class

+

In the case that you need to use the DataType class itself, interface using this enum vs. normal instatination

+

ex. torch_tensorrt::DataType type = DataType::kFloat;

+

Values:

+
+
+enumerator kFloat
+

FP32.

+
+ +
+
+enumerator kHalf
+

FP16.

+
+ +
+
+enumerator kChar
+

INT8.

+
+ +
+
+enumerator kInt
+

INT.

+
+ +
+
+enumerator kBool
+

Bool.

+
+ +
+
+enumerator kUnknown
+

Sentinel value.

+
+ +
+ +
+
+

Public Functions

+
+
+DataType() = default
+

Construct a new Data Type object.

+
+ +
+
+inline constexpr DataType(Value t)
+

DataType constructor from enum.

+
+ +
+
+TORCHTRT_API DataType(c10::ScalarType t)
+

Construct a new Data Type object from torch type enums.

+
+
Parameters
+

t

+
+
+
+ +
+
+inline operator Value() const
+

Get the enum value of the DataType object.

+
+
Returns
+

Value

+
+
+
+ +
+
+explicit operator bool() = delete
+
+ +
+
+inline constexpr bool operator==(DataType other) const
+

Comparision operator for DataType.

+
+
Parameters
+

other

+
+
Returns
+

true

+
+
Returns
+

false

+
+
+
+ +
+
+inline constexpr bool operator==(DataType::Value other) const
+

Comparision operator for DataType.

+
+
Parameters
+

other

+
+
Returns
+

true

+
+
Returns
+

false

+
+
+
+ +
+
+inline constexpr bool operator!=(DataType other) const
+

Comparision operator for DataType.

+
+
Parameters
+

other

+
+
Returns
+

true

+
+
Returns
+

false

+
+
+
+ +
+
+inline constexpr bool operator!=(DataType::Value other) const
+

Comparision operator for DataType.

+
+
Parameters
+

other

+
+
Returns
+

true

+
+
Returns
+

false

+
+
+
+ +
+
+ +
+
+ + +
+ +
+ + +
+
+ +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/classtorch__tensorrt_1_1Device_1_1DeviceType.html b/docs/v1.2.0/_cpp_api/classtorch__tensorrt_1_1Device_1_1DeviceType.html new file mode 100644 index 0000000000..5900d36f42 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/classtorch__tensorrt_1_1Device_1_1DeviceType.html @@ -0,0 +1,792 @@ + + + + + + + + + + + + + Class Device::DeviceType — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Class Device::DeviceType

+ +
+

Nested Relationships

+

This class is a nested type of Struct Device.

+
+
+

Class Documentation

+
+
+class torch_tensorrt::Device::DeviceType
+

Supported Device Types that can be used with TensorRT engines

+

This class is compatable with c10::DeviceTypes (but will check for TRT support) but the only applicable value is at::kCUDA, which maps to DeviceType::kGPU

+

To use the DataType class itself, interface using the enum vs. normal instatination

+

ex. torch_tensorrt::DeviceType type = DeviceType::kGPU;

+
+

Public Types

+
+
+enum Value
+

Underlying enum class to support the DeviceType Class

+

In the case that you need to use the DeviceType class itself, interface using this enum vs. normal instatination

+

ex. torch_tensorrt::DeviceType type = DeviceType::kGPU;

+

Values:

+
+
+enumerator kGPU
+

Target GPU to run engine.

+
+ +
+
+enumerator kDLA
+

Target DLA to run engine.

+
+ +
+ +
+
+

Public Functions

+
+
+DeviceType() = default
+

Construct a new Device Type object.

+
+ +
+
+inline constexpr DeviceType(Value t)
+

Construct a new Device Type object from internal enum.

+
+ +
+
+DeviceType(c10::DeviceType t)
+

Construct a new Device Type object from torch device enums Note: The only valid value is torch::kCUDA (torch::kCPU is not supported)

+
+
Parameters
+

t

+
+
+
+ +
+
+inline operator Value() const
+

Get the internal value from the Device object.

+
+
Returns
+

Value

+
+
+
+ +
+
+explicit operator bool() = delete
+
+ +
+
+inline constexpr bool operator==(DeviceType other) const
+

Comparison operator for DeviceType.

+
+
Parameters
+

other

+
+
Returns
+

true

+
+
Returns
+

false

+
+
+
+ +
+
+inline constexpr bool operator!=(DeviceType other) const
+

Comparison operator for DeviceType.

+
+
Parameters
+

other

+
+
Returns
+

true

+
+
Returns
+

false

+
+
+
+ +
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/classtorch__tensorrt_1_1TensorFormat.html b/docs/v1.2.0/_cpp_api/classtorch__tensorrt_1_1TensorFormat.html new file mode 100644 index 0000000000..c407f12c8e --- /dev/null +++ b/docs/v1.2.0/_cpp_api/classtorch__tensorrt_1_1TensorFormat.html @@ -0,0 +1,824 @@ + + + + + + + + + + + + + Class TensorFormat — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Class TensorFormat

+ +
+

Class Documentation

+
+
+class torch_tensorrt::TensorFormat
+

TensorFormat is an enum class which defines the memeory layout used to store Tensor Data.

+
+

Public Types

+
+
+enum Value
+

Underlying enum class to support the TensorFormat Class

+

In the case that you need to use the TensorFormat class itself, interface using this enum vs. normal instatination

+

ex. torch_tensorrt::TensorFormat type = TensorFormat::kContiguous;

+

Values:

+
+
+enumerator kContiguous
+

Contiguous / NCHW / Linear.

+
+ +
+
+enumerator kChannelsLast
+

Channel Last / NHWC.

+
+ +
+
+enumerator kUnknown
+

Sentinel value.

+
+ +
+ +
+
+

Public Functions

+
+
+TensorFormat() = default
+

Construct a new TensorFormat object.

+
+ +
+
+inline constexpr TensorFormat(Value t)
+

TensorFormat constructor from enum.

+
+ +
+
+TORCHTRT_API TensorFormat(at::MemoryFormat t)
+

Construct a new TensorFormat object from torch type enums.

+
+
Parameters
+

t

+
+
+
+ +
+
+inline operator Value() const
+

Get the enum value of the TensorFormat object.

+
+
Returns
+

Value

+
+
+
+ +
+
+explicit operator bool() = delete
+
+ +
+
+inline constexpr bool operator==(TensorFormat other) const
+

Comparision operator for TensorFormat.

+
+
Parameters
+

other

+
+
Returns
+

true

+
+
Returns
+

false

+
+
+
+ +
+
+inline constexpr bool operator==(TensorFormat::Value other) const
+

Comparision operator for TensorFormat.

+
+
Parameters
+

other

+
+
Returns
+

true

+
+
Returns
+

false

+
+
+
+ +
+
+inline constexpr bool operator!=(TensorFormat other) const
+

Comparision operator for TensorFormat.

+
+
Parameters
+

other

+
+
Returns
+

true

+
+
Returns
+

false

+
+
+
+ +
+
+inline constexpr bool operator!=(TensorFormat::Value other) const
+

Comparision operator for TensorFormat.

+
+
Parameters
+

other

+
+
Returns
+

true

+
+
Returns
+

false

+
+
+
+ +
+
+ +
+
+ + +
+ +
+ + +
+
+ +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator.html b/docs/v1.2.0/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator.html new file mode 100644 index 0000000000..d200c82382 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator.html @@ -0,0 +1,788 @@ + + + + + + + + + + + + + Template Class Int8CacheCalibrator — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Template Class Int8CacheCalibrator

+ +
+

Inheritance Relationships

+
+

Base Type

+
    +
  • private Algorithm

  • +
+
+
+
+

Class Documentation

+
+
+template<typename Algorithm>
class torch_tensorrt::ptq::Int8CacheCalibrator : private Algorithm
+

Generic Int8Calibrator implementation based on a specified TensorRT calibration algorithm that only reads from a calibration file.

+
+
Template Parameters
+

Algorithm – class nvinfer1::IInt8Calibrator (Default: nvinfer1::IInt8EntropyCalibrator2) - Algorithm to use

+
+
+
+

Public Functions

+
+
+inline Int8CacheCalibrator(const std::string &cache_file_path)
+

Construct a new Int 8 Cache Calibrator object.

+
+
Parameters
+

cache_file_path

+
+
+
+ +
+
+inline int getBatchSize() const noexcept override
+

Get the Batch Size for the next batch (always 1 due to issues with TRT and explicit batch)

+
+
Returns
+

int

+
+
+
+ +
+
+inline bool getBatch(void *bindings[], const char *names[], int nbBindings) noexcept override
+

Get the next Batch.

+

Not used always returns false

+
+
Parameters
+
    +
  • bindings – void*[] - An array of binding pointers (fed in from TensorRT calibrator), these buffers should be filed with batch data for each input

  • +
  • names – const char*[] - Names of bindings

  • +
  • nbBindings – int - Number of bindings

  • +
+
+
Returns
+

false

+
+
+
+ +
+
+inline const void *readCalibrationCache(size_t &length) noexcept override
+

Read calibration cache.

+

How to read from the calibration cache, only enabled if use_cache is set

+
+
Parameters
+

length

+
+
Returns
+

const void* - Pointer to cache data

+
+
+
+ +
+
+inline void writeCalibrationCache(const void *cache, size_t length) noexcept override
+

Write calibration cache.

+

Write a the calibration cache provided by TensorRT to a specified file

+
+
Parameters
+
    +
  • cache – const void* - cache data

  • +
  • length – size_t - length of cache

  • +
+
+
+
+ +
+
+inline operator nvinfer1::IInt8Calibrator*()
+

operator to cast to nvinfer1::IInt8Calibrator*

+

Convience function to convert to a IInt8Calibrator* to easily be assigned to the ptq_calibrator field in CompileSpec

+
+
Returns
+

nvinfer1::IInt8Calibrator*

+
+
+
+ +
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8Calibrator.html b/docs/v1.2.0/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8Calibrator.html new file mode 100644 index 0000000000..2c9710a636 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8Calibrator.html @@ -0,0 +1,798 @@ + + + + + + + + + + + + + Template Class Int8Calibrator — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Template Class Int8Calibrator

+ +
+

Inheritance Relationships

+
+

Base Type

+
    +
  • private Algorithm

  • +
+
+
+
+

Class Documentation

+
+
+template<typename Algorithm, typename DataLoaderUniquePtr>
class torch_tensorrt::ptq::Int8Calibrator : private Algorithm
+

Generic Int8Calibrator implementation based on a specified TensorRT calibration algorithm and a LibTorch DataLoader.

+
+
Template Parameters
+
    +
  • Algorithm – class nvinfer1::IInt8Calibrator (Default: nvinfer1::IInt8EntropyCalibrator2) - Algorithm to use

  • +
  • DataLoaderUniquePtr – std::unique_ptr<torch::data::DataLoader> - DataLoader type

  • +
+
+
+
+

Public Functions

+
+
+inline Int8Calibrator(DataLoaderUniquePtr dataloader, const std::string &cache_file_path, bool use_cache)
+

Construct a new Int8Calibrator object.

+

Using the provided DataLoader, construct a calibrator that can be used for PTQ with Torch-TensorRT

+
+
Parameters
+
    +
  • dataloader – std::unqiue_ptr<torch::data::DataLoader> - A unique pointer to the DataLoader, should be what is returned from the make_data_loader factory

  • +
  • cache_file_path – const std::string& - A path to store / find the calibration cache

  • +
  • use_cache – : bool - Whether to use the cache (if it exists)

  • +
+
+
+
+ +
+
+inline int getBatchSize() const noexcept override
+

Get the Batch Size for the next batch (always 1 due to issues with TRT and explicit batch)

+
+
Returns
+

int

+
+
+
+ +
+
+inline bool getBatch(void *bindings[], const char *names[], int nbBindings) noexcept override
+

Get the next Batch.

+
+
Parameters
+
    +
  • bindings – void*[] - An array of binding pointers (fed in from TensorRT calibrator), these buffers should be filed with batch data for each input

  • +
  • names – const char*[] - Names of bindings

  • +
  • nbBindings – int - Number of bindings

  • +
+
+
Returns
+

true - There is a new batch for the calibrator to consume

+
+
Returns
+

false - There is not a new batch for the calibrator to consume

+
+
+
+ +
+
+inline const void *readCalibrationCache(size_t &length) noexcept override
+

Read calibration cache.

+

How to read from the calibration cache, only enabled if use_cache is set

+
+
Parameters
+

length

+
+
Returns
+

const void* - Pointer to cache data

+
+
+
+ +
+
+inline void writeCalibrationCache(const void *cache, size_t length) noexcept override
+

Write calibration cache.

+

Write a the calibration cache provided by TensorRT to a specified file

+
+
Parameters
+
    +
  • cache – const void* - cache data

  • +
  • length – size_t - length of cache

  • +
+
+
+
+ +
+
+inline operator nvinfer1::IInt8Calibrator*()
+

operator to cast to nvinfer1::IInt8Calibrator*

+

Convience function to convert to a IInt8Calibrator* to easily be assigned to the ptq_calibrator field in CompileSpec

+
+
Returns
+

nvinfer1::IInt8Calibrator*

+
+
+
+ +
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/define_macros_8h_1a18d295a837ac71add5578860b55e5502.html b/docs/v1.2.0/_cpp_api/define_macros_8h_1a18d295a837ac71add5578860b55e5502.html new file mode 100644 index 0000000000..678c779e61 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/define_macros_8h_1a18d295a837ac71add5578860b55e5502.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + Define STR — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Define STR

+ +
+

Define Documentation

+
+
+STR(x)
+
+ +
+
+ + +
+ +
+ + +
+
+ +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268.html b/docs/v1.2.0/_cpp_api/define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268.html new file mode 100644 index 0000000000..6f72d85730 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + Define TORCH_TENSORRT_PATCH_VERSION — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Define TORCH_TENSORRT_PATCH_VERSION

+ +
+

Define Documentation

+
+
+TORCH_TENSORRT_PATCH_VERSION
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e.html b/docs/v1.2.0/_cpp_api/define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e.html new file mode 100644 index 0000000000..62f24353ff --- /dev/null +++ b/docs/v1.2.0/_cpp_api/define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + Define TORCH_TENSORRT_MAJOR_VERSION — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Define TORCH_TENSORRT_MAJOR_VERSION

+ +
+

Define Documentation

+
+
+TORCH_TENSORRT_MAJOR_VERSION
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827.html b/docs/v1.2.0/_cpp_api/define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827.html new file mode 100644 index 0000000000..a3ebbd8aed --- /dev/null +++ b/docs/v1.2.0/_cpp_api/define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + Define TORCH_TENSORRT_MINOR_VERSION — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Define TORCH_TENSORRT_MINOR_VERSION

+ +
+

Define Documentation

+
+
+TORCH_TENSORRT_MINOR_VERSION
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b.html b/docs/v1.2.0/_cpp_api/define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b.html new file mode 100644 index 0000000000..6114774d30 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + Define TORCHTRT_API — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Define TORCHTRT_API

+ +
+

Define Documentation

+
+
+TORCHTRT_API
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da.html b/docs/v1.2.0/_cpp_api/define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da.html new file mode 100644 index 0000000000..6575db57ee --- /dev/null +++ b/docs/v1.2.0/_cpp_api/define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + Define XSTR — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Define XSTR

+ +
+

Define Documentation

+
+
+XSTR(x)
+
+ +
+
+ + +
+ +
+ + +
+
+ +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/define_macros_8h_1ad19939408f7be171a74a89928b36eb59.html b/docs/v1.2.0/_cpp_api/define_macros_8h_1ad19939408f7be171a74a89928b36eb59.html new file mode 100644 index 0000000000..69c328af13 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/define_macros_8h_1ad19939408f7be171a74a89928b36eb59.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + Define TORCHTRT_HIDDEN — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Define TORCHTRT_HIDDEN

+ +
+

Define Documentation

+
+
+TORCHTRT_HIDDEN
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883.html b/docs/v1.2.0/_cpp_api/define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883.html new file mode 100644 index 0000000000..c679a9d995 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + Define TORCH_TENSORRT_VERSION — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Define TORCH_TENSORRT_VERSION

+ +
+

Define Documentation

+
+
+TORCH_TENSORRT_VERSION
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/dir_cpp.html b/docs/v1.2.0/_cpp_api/dir_cpp.html new file mode 100644 index 0000000000..9152c1e559 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/dir_cpp.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + Directory cpp — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+ + +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/dir_cpp_include.html b/docs/v1.2.0/_cpp_api/dir_cpp_include.html new file mode 100644 index 0000000000..3b269944bb --- /dev/null +++ b/docs/v1.2.0/_cpp_api/dir_cpp_include.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + Directory include — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Directory include
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+ + +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/dir_cpp_include_torch_tensorrt.html b/docs/v1.2.0/_cpp_api/dir_cpp_include_torch_tensorrt.html new file mode 100644 index 0000000000..16de3053b1 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/dir_cpp_include_torch_tensorrt.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + Directory torch_tensorrt — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Directory torch_tensorrt
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+ + +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558.html b/docs/v1.2.0/_cpp_api/enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558.html new file mode 100644 index 0000000000..f1b850d7a6 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558.html @@ -0,0 +1,721 @@ + + + + + + + + + + + + + Enum Level — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Enum Level

+ +
+

Enum Documentation

+
+
+enum torch_tensorrt::logging::Level
+

Emum for setting message severity

+

Values:

+
+
+enumerator kINTERNAL_ERROR
+

Only print messages for internal errors.

+
+ +
+
+enumerator kERROR
+

Print all internal errors and errors (default)

+
+ +
+
+enumerator kWARNING
+

Print warnings and errors.

+
+ +
+
+enumerator kINFO
+

Print all info, warnings and errors.

+
+ +
+
+enumerator kDEBUG
+

Print all debug info, info, warnings and errors.

+
+ +
+
+enumerator kGRAPH
+

Print everything including the intermediate graphs of the lowering phase.

+
+ +
+ +
+
+ + +
+ +
+ + +
+
+ +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb.html b/docs/v1.2.0/_cpp_api/enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb.html new file mode 100644 index 0000000000..b18cb1e03f --- /dev/null +++ b/docs/v1.2.0/_cpp_api/enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb.html @@ -0,0 +1,700 @@ + + + + + + + + + + + + + Enum EngineCapability — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Enum EngineCapability

+ +
+

Enum Documentation

+
+
+enum torch_tensorrt::EngineCapability
+

Emum for selecting engine capability

+

Values:

+
+
+enumerator kSTANDARD
+
+ +
+
+enumerator kSAFETY
+
+ +
+
+enumerator kDLA_STANDALONE
+
+ +
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/file_cpp_include_torch_tensorrt_logging.h.html b/docs/v1.2.0/_cpp_api/file_cpp_include_torch_tensorrt_logging.h.html new file mode 100644 index 0000000000..b26881d350 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/file_cpp_include_torch_tensorrt_logging.h.html @@ -0,0 +1,722 @@ + + + + + + + + + + + + + File logging.h — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

File logging.h

+

Parent directory (cpp/include/torch_tensorrt)

+ +
+

Definition (cpp/include/torch_tensorrt/logging.h)

+ +
+
+

Includes

+ +
+
+

Included By

+ +
+
+

Namespaces

+ +
+
+

Enums

+ +
+
+

Functions

+ +
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/file_cpp_include_torch_tensorrt_macros.h.html b/docs/v1.2.0/_cpp_api/file_cpp_include_torch_tensorrt_macros.h.html new file mode 100644 index 0000000000..7dffb0a36c --- /dev/null +++ b/docs/v1.2.0/_cpp_api/file_cpp_include_torch_tensorrt_macros.h.html @@ -0,0 +1,708 @@ + + + + + + + + + + + + + File macros.h — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

File macros.h

+

Parent directory (cpp/include/torch_tensorrt)

+ +
+

Definition (cpp/include/torch_tensorrt/macros.h)

+ +
+
+

Included By

+ +
+
+

Namespaces

+ +
+
+

Defines

+ +
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/file_cpp_include_torch_tensorrt_ptq.h.html b/docs/v1.2.0/_cpp_api/file_cpp_include_torch_tensorrt_ptq.h.html new file mode 100644 index 0000000000..45886bc98f --- /dev/null +++ b/docs/v1.2.0/_cpp_api/file_cpp_include_torch_tensorrt_ptq.h.html @@ -0,0 +1,719 @@ + + + + + + + + + + + + + File ptq.h — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

File ptq.h

+

Parent directory (cpp/include/torch_tensorrt)

+ +
+

Definition (cpp/include/torch_tensorrt/ptq.h)

+ +
+
+

Includes

+
    +
  • NvInfer.h

  • +
  • fstream

  • +
  • iostream

  • +
  • iterator

  • +
  • memory

  • +
  • sstream

  • +
  • string

  • +
  • torch/torch.h

  • +
  • torch_tensorrt/logging.h (File logging.h)

  • +
  • torch_tensorrt/macros.h (File macros.h)

  • +
  • vector

  • +
+
+
+

Namespaces

+ +
+
+

Classes

+ +
+
+

Functions

+ +
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/file_cpp_include_torch_tensorrt_torch_tensorrt.h.html b/docs/v1.2.0/_cpp_api/file_cpp_include_torch_tensorrt_torch_tensorrt.h.html new file mode 100644 index 0000000000..ce9e2172b1 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/file_cpp_include_torch_tensorrt_torch_tensorrt.h.html @@ -0,0 +1,734 @@ + + + + + + + + + + + + + File torch_tensorrt.h — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • File torch_tensorrt.h
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

File torch_tensorrt.h

+

Parent directory (cpp/include/torch_tensorrt)

+ +
+

Definition (cpp/include/torch_tensorrt/torch_tensorrt.h)

+ +
+
+

Includes

+
    +
  • cuda_runtime.h

  • +
  • iostream

  • +
  • memory

  • +
  • set

  • +
  • string

  • +
  • torch/custom_class.h

  • +
  • torch_tensorrt/macros.h (File macros.h)

  • +
  • vector

  • +
+
+
+

Namespaces

+ +
+
+

Classes

+ +
+
+

Enums

+ +
+
+

Functions

+ +
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/file_view_hierarchy.html b/docs/v1.2.0/_cpp_api/file_view_hierarchy.html new file mode 100644 index 0000000000..e7c708ff3f --- /dev/null +++ b/docs/v1.2.0/_cpp_api/file_view_hierarchy.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + File Hierarchy — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+ + +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/function_logging_8h_1a0593f776f469c20469e2f729fc7861a3.html b/docs/v1.2.0/_cpp_api/function_logging_8h_1a0593f776f469c20469e2f729fc7861a3.html new file mode 100644 index 0000000000..70221f90e3 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/function_logging_8h_1a0593f776f469c20469e2f729fc7861a3.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + Function torch_tensorrt::logging::get_logging_prefix — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Function torch_tensorrt::logging::get_logging_prefix

+ +
+

Function Documentation

+
+
+TORCHTRT_API std::string torch_tensorrt::logging::get_logging_prefix()
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/function_logging_8h_1a0c012cb374addd90eb1f42eaec570650.html b/docs/v1.2.0/_cpp_api/function_logging_8h_1a0c012cb374addd90eb1f42eaec570650.html new file mode 100644 index 0000000000..7e6afb628c --- /dev/null +++ b/docs/v1.2.0/_cpp_api/function_logging_8h_1a0c012cb374addd90eb1f42eaec570650.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Function torch_tensorrt::logging::get_reportable_log_level — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Function torch_tensorrt::logging::get_reportable_log_level

+ +
+

Function Documentation

+
+
+TORCHTRT_API Level torch_tensorrt::logging::get_reportable_log_level()
+

Get the current reportable log level.

+
+
Returns
+

TORCHTRT_API get_reportable_log_level

+
+
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a.html b/docs/v1.2.0/_cpp_api/function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a.html new file mode 100644 index 0000000000..5d162fa2e6 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Function torch_tensorrt::logging::get_is_colored_output_on — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Function torch_tensorrt::logging::get_is_colored_output_on

+ +
+

Function Documentation

+
+
+TORCHTRT_API bool torch_tensorrt::logging::get_is_colored_output_on()
+

Is colored output enabled?

+
+
Returns
+

TORCHTRT_API get_is_colored_output_on

+
+
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2.html b/docs/v1.2.0/_cpp_api/function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2.html new file mode 100644 index 0000000000..44e30565c7 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Function torch_tensorrt::logging::set_reportable_log_level — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Function torch_tensorrt::logging::set_reportable_log_level

+ +
+

Function Documentation

+
+
+TORCHTRT_API void torch_tensorrt::logging::set_reportable_log_level(Level lvl)
+

Sets the level that logging information needs to be to be added to the log.

+
+
Parameters
+

lvl – torch_tensorrt::logging::Level - Level that messages need to be at or above to be added to the log

+
+
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8.html b/docs/v1.2.0/_cpp_api/function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8.html new file mode 100644 index 0000000000..f2a441072a --- /dev/null +++ b/docs/v1.2.0/_cpp_api/function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + Function torch_tensorrt::logging::log — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Function torch_tensorrt::logging::log

+ +
+

Function Documentation

+
+
+TORCHTRT_API void torch_tensorrt::logging::log(Level lvl, std::string msg)
+

Adds a message to the global log.

+
+
Parameters
+
    +
  • lvl – torch_tensorrt::logging::Level - Severity of the message

  • +
  • msg – std::string - Message to be logged

  • +
+
+
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5.html b/docs/v1.2.0/_cpp_api/function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5.html new file mode 100644 index 0000000000..a2c31c3be7 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Function torch_tensorrt::logging::set_is_colored_output_on — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Function torch_tensorrt::logging::set_is_colored_output_on

+ +
+

Function Documentation

+
+
+TORCHTRT_API void torch_tensorrt::logging::set_is_colored_output_on(bool colored_output_on)
+

Sets if logging prefix will be colored (helpful when debugging but not always supported by terminal)

+
+
Parameters
+

colored_output_on – bool - If the output will be colored or not

+
+
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/function_logging_8h_1af8f3443813315af7901903d25dd495cc.html b/docs/v1.2.0/_cpp_api/function_logging_8h_1af8f3443813315af7901903d25dd495cc.html new file mode 100644 index 0000000000..78c8e517ec --- /dev/null +++ b/docs/v1.2.0/_cpp_api/function_logging_8h_1af8f3443813315af7901903d25dd495cc.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + Function torch_tensorrt::logging::set_logging_prefix — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Function torch_tensorrt::logging::set_logging_prefix

+ +
+

Function Documentation

+
+
+TORCHTRT_API void torch_tensorrt::logging::set_logging_prefix(std::string prefix)
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c.html b/docs/v1.2.0/_cpp_api/function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c.html new file mode 100644 index 0000000000..58e95d8871 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c.html @@ -0,0 +1,698 @@ + + + + + + + + + + + + + Template Function torch_tensorrt::ptq::make_int8_cache_calibrator — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Template Function torch_tensorrt::ptq::make_int8_cache_calibrator

+ +
+

Function Documentation

+
+
+template<typename Algorithm = nvinfer1::IInt8EntropyCalibrator2>
inline Int8CacheCalibrator<Algorithm> torch_tensorrt::ptq::make_int8_cache_calibrator(const std::string &cache_file_path)
+

A factory to build a post training quantization calibrator from a torch dataloader that only uses the calibration cache.

+

Creates a calibrator to use for post training quantization which reads from a previously created calibration cache, therefore you can have a calibration cache generating program that requires a dataloader and a dataset, then save the cache to use later in a different program that needs to calibrate from scratch and not have the dataset dependency. However, the network should also be recalibrated if its structure changes, or the input data set changes, and it is the responsibility of the application to ensure this.

+

By default the returned calibrator uses TensorRT Entropy v2 algorithm to perform calibration. This is recommended for feed forward networks You can override the algorithm selection (such as to use the MinMax Calibrator recomended for NLP tasks) by calling make_int8_calibrator with the calibrator class as a template parameter.

+

e.g. torch_tensorrt::ptq::make_int8_cache_calibrator<nvinfer1::IInt8MinMaxCalibrator>(calibration_cache_file);

+
+
Template Parameters
+

Algorithm – class nvinfer1::IInt8Calibrator (Default: nvinfer1::IInt8EntropyCalibrator2) - Algorithm to use

+
+
Parameters
+

cache_file_path – const std::string& - Path to read/write calibration cache

+
+
Returns
+

Int8CacheCalibrator<Algorithm>

+
+
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178.html b/docs/v1.2.0/_cpp_api/function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178.html new file mode 100644 index 0000000000..977d3e83ae --- /dev/null +++ b/docs/v1.2.0/_cpp_api/function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178.html @@ -0,0 +1,704 @@ + + + + + + + + + + + + + Template Function torch_tensorrt::ptq::make_int8_calibrator — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Template Function torch_tensorrt::ptq::make_int8_calibrator

+ +
+

Function Documentation

+
+
+template<typename Algorithm = nvinfer1::IInt8EntropyCalibrator2, typename DataLoader>
inline Int8Calibrator<Algorithm, DataLoader> torch_tensorrt::ptq::make_int8_calibrator(DataLoader dataloader, const std::string &cache_file_path, bool use_cache)
+

A factory to build a post training quantization calibrator from a torch dataloader.

+

Creates a calibrator to use for post training quantization. By default the returned calibrator uses TensorRT Entropy v2 algorithm to perform calibration. This is recommended for feed forward networks. You can override the algorithm selection (such as to use the MinMax Calibrator recomended for NLP tasks) by calling make_int8_calibrator with the calibrator class as a template parameter.

+

e.g. torch_tensorrt::ptq::make_int8_calibrator<nvinfer1::IInt8MinMaxCalibrator>(std::move(calibration_dataloader), calibration_cache_file, use_cache);

+
+
Template Parameters
+
    +
  • Algorithm – class nvinfer1::IInt8Calibrator (Default: nvinfer1::IInt8EntropyCalibrator2) - Algorithm to use

  • +
  • DataLoader – std::unique_ptr<torch::data::DataLoader> - DataLoader type

  • +
+
+
Parameters
+
    +
  • dataloader – std::unique_ptr<torch::data::DataLoader> - DataLoader containing data

  • +
  • cache_file_path – const std::string& - Path to read/write calibration cache

  • +
  • use_cache – bool - use calibration cache

  • +
+
+
Returns
+

Int8Calibrator<Algorithm, DataLoader>

+
+
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039.html b/docs/v1.2.0/_cpp_api/function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039.html new file mode 100644 index 0000000000..450dda4117 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039.html @@ -0,0 +1,691 @@ + + + + + + + + + + + + + Template Function torch_tensorrt::ptq::make_int8_calibrator — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Template Function torch_tensorrt::ptq::make_int8_calibrator
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Template Function torch_tensorrt::ptq::make_int8_calibrator

+ +
+

Function Documentation

+
+
+template<typename Algorithm = nvinfer1::IInt8EntropyCalibrator2, typename DataLoader>
inline Int8Calibrator<Algorithm, DataLoader> torch_tensorrt::ptq::make_int8_calibrator(DataLoader dataloader, const std::string &cache_file_path, bool use_cache)
+

A factory to build a post training quantization calibrator from a torch dataloader.

+

Creates a calibrator to use for post training quantization. By default the returned calibrator uses TensorRT Entropy v2 algorithm to perform calibration. This is recommended for feed forward networks. You can override the algorithm selection (such as to use the MinMax Calibrator recomended for NLP tasks) by calling make_int8_calibrator with the calibrator class as a template parameter.

+

e.g. torch_tensorrt::ptq::make_int8_calibrator<nvinfer1::IInt8MinMaxCalibrator>(std::move(calibration_dataloader), calibration_cache_file, use_cache);

+
+
Template Parameters
+
    +
  • Algorithm – class nvinfer1::IInt8Calibrator (Default: nvinfer1::IInt8EntropyCalibrator2) - Algorithm to use

  • +
  • DataLoader – std::unique_ptr<torch::data::DataLoader> - DataLoader type

  • +
+
+
Parameters
+
    +
  • dataloader – std::unique_ptr<torch::data::DataLoader> - DataLoader containing data

  • +
  • cache_file_path – const std::string& - Path to read/write calibration cache

  • +
  • use_cache – bool - use calibration cache

  • +
+
+
Returns
+

Int8Calibrator<Algorithm, DataLoader>

+
+
+
+ +
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa.html b/docs/v1.2.0/_cpp_api/function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa.html new file mode 100644 index 0000000000..d83f45f049 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa.html @@ -0,0 +1,685 @@ + + + + + + + + + + + + + Template Function torch_tensorrt::ptq::make_int8_cache_calibrator — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Template Function torch_tensorrt::ptq::make_int8_cache_calibrator
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Template Function torch_tensorrt::ptq::make_int8_cache_calibrator

+ +
+

Function Documentation

+
+
+template<typename Algorithm = nvinfer1::IInt8EntropyCalibrator2>
inline Int8CacheCalibrator<Algorithm> torch_tensorrt::ptq::make_int8_cache_calibrator(const std::string &cache_file_path)
+

A factory to build a post training quantization calibrator from a torch dataloader that only uses the calibration cache.

+

Creates a calibrator to use for post training quantization which reads from a previously created calibration cache, therefore you can have a calibration cache generating program that requires a dataloader and a dataset, then save the cache to use later in a different program that needs to calibrate from scratch and not have the dataset dependency. However, the network should also be recalibrated if its structure changes, or the input data set changes, and it is the responsibility of the application to ensure this.

+

By default the returned calibrator uses TensorRT Entropy v2 algorithm to perform calibration. This is recommended for feed forward networks You can override the algorithm selection (such as to use the MinMax Calibrator recomended for NLP tasks) by calling make_int8_calibrator with the calibrator class as a template parameter.

+

e.g. torch_tensorrt::ptq::make_int8_cache_calibrator<nvinfer1::IInt8MinMaxCalibrator>(calibration_cache_file);

+
+
Template Parameters
+

Algorithm – class nvinfer1::IInt8Calibrator (Default: nvinfer1::IInt8EntropyCalibrator2) - Algorithm to use

+
+
Parameters
+

cache_file_path – const std::string& - Path to read/write calibration cache

+
+
Returns
+

Int8CacheCalibrator<Algorithm>

+
+
+
+ +
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797.html b/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797.html new file mode 100644 index 0000000000..53c7e39139 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797.html @@ -0,0 +1,698 @@ + + + + + + + + + + + + + Function torch_tensorrt::torchscript::check_method_operator_support — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Function torch_tensorrt::torchscript::check_method_operator_support

+ +
+

Function Documentation

+
+
+TORCHTRT_API bool torch_tensorrt::torchscript::check_method_operator_support(const torch::jit::Module &module, std::string method_name)
+

Check to see if a module is fully supported by the compiler.

+

+Takes a module and a method name and checks if the method graph contains purely convertable operators

+

Will print out a list of unsupported operators if the graph is unsupported

+
+
Parameters
+
    +
  • module – torch::jit::script::Module - Existing TorchScript module

  • +
  • method_name – std::string - Name of method to compile

  • +
+
+
Returns
+

bool: Method is supported by Torch-TensorRT.TorchScript

+
+
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9.html b/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9.html new file mode 100644 index 0000000000..c6c749026e --- /dev/null +++ b/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9.html @@ -0,0 +1,698 @@ + + + + + + + + + + + + + Function torch_tensorrt::torchscript::compile — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Function torch_tensorrt::torchscript::compile

+ +
+

Function Documentation

+
+
+TORCHTRT_API torch::jit::Module torch_tensorrt::torchscript::compile(const torch::jit::Module &module, CompileSpec info)
+

Compile a TorchScript module for NVIDIA GPUs using TensorRT.

+

+Takes a existing TorchScript module and a set of settings to configure the compiler and will convert methods to JIT Graphs which call equivalent TensorRT engines

+

Converts specifically the forward method of a TorchScript Module

+
+
Parameters
+
    +
  • module – torch::jit::Module - Existing TorchScript module

  • +
  • info – torch_tensorrt::CompileSpec - Compilation settings

  • +
+
+
Returns
+

: A new module trageting a TensorRT engine

+
+
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef.html b/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef.html new file mode 100644 index 0000000000..93b5d98730 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef.html @@ -0,0 +1,702 @@ + + + + + + + + + + + + + Function torch_tensorrt::torchscript::embed_engine_in_new_module — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Function torch_tensorrt::torchscript::embed_engine_in_new_module

+ +
+

Function Documentation

+
+
+TORCHTRT_API torch::jit::Module torch_tensorrt::torchscript::embed_engine_in_new_module(const std::string &engine, Device device)
+

Take a previously created TensorRT engine and embed it in in a TorchScript module.

+

+Takes a pre-built serialized TensorRT engine and embeds it in a TorchScript module. Registers execution of the engine as the forward method of the module Forward is defined as: forward(Tensor[]) -> Tensor[]

+

TensorRT bindings must have names with the following format:

    +
  • [symbol].[index in input / output array] ex.

  • +
  • [x.0, x.1, x.2] -> [y.0]

  • +
+

+
+
Parameters
+
    +
  • engine – std::string - Pre-built serialized TensorRT engine

  • +
  • device – CompileSepc::Device - Device information

  • +
+
+
Returns
+

: A new module targeting a TensorRT engine

+
+
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528.html b/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528.html new file mode 100644 index 0000000000..9ee514173e --- /dev/null +++ b/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Function torch_tensorrt::get_build_info — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Function torch_tensorrt::get_build_info

+ +
+

Function Documentation

+
+
+TORCHTRT_API std::string torch_tensorrt::get_build_info()
+

Get the build information for the library including the dependency versions.

+
+
Returns
+

std::string

+
+
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384.html b/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384.html new file mode 100644 index 0000000000..29a130f6b2 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Function torch_tensorrt::set_device — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Function torch_tensorrt::set_device

+ +
+

Function Documentation

+
+
+TORCHTRT_API void torch_tensorrt::set_device(const int gpu_id)
+

Set gpu device id.

+
+
Parameters
+

gpu_id – Sets gpu id using cudaSetDevice

+
+
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1.html b/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1.html new file mode 100644 index 0000000000..95b359f2da --- /dev/null +++ b/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1.html @@ -0,0 +1,684 @@ + + + + + + + + + + + + + Function torch_tensorrt::dump_build_info — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Function torch_tensorrt::dump_build_info

+ +
+

Function Documentation

+
+
+TORCHTRT_API void torch_tensorrt::dump_build_info()
+

Dump the version information for Torch-TensorRT including base libtorch and TensorRT versions to stdout.

+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2.html b/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2.html new file mode 100644 index 0000000000..d943b24bcc --- /dev/null +++ b/docs/v1.2.0/_cpp_api/function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2.html @@ -0,0 +1,698 @@ + + + + + + + + + + + + + Function torch_tensorrt::torchscript::convert_method_to_trt_engine — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Function torch_tensorrt::torchscript::convert_method_to_trt_engine

+ +
+

Function Documentation

+
+
+TORCHTRT_API std::string torch_tensorrt::torchscript::convert_method_to_trt_engine(const torch::jit::Module &module, std::string method_name, CompileSpec info)
+

Compile a TorchScript method for NVIDIA GPUs using TensorRT.

+

+Takes a existing TorchScript module and a set of settings to configure the compiler and will convert selected method to a serialized TensorRT engine which can be run with TensorRT

+
+
Parameters
+
    +
  • module – torch::jit::Module - Existing TorchScript module

  • +
  • method_name – std::string - Name of method to compile

  • +
  • info – torch_tensorrt::CompileSpec - Compilation settings

  • +
+
+
Returns
+

: std::string: Serialized TensorRT engine equivilant to the method graph

+
+
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/namespace_torch_tensorrt.html b/docs/v1.2.0/_cpp_api/namespace_torch_tensorrt.html new file mode 100644 index 0000000000..5b2c613541 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/namespace_torch_tensorrt.html @@ -0,0 +1,717 @@ + + + + + + + + + + + + + Namespace torch_tensorrt — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Namespace torch_tensorrt

+
+

Contents

+ +
+
+

Namespaces

+ +
+
+

Classes

+ +
+
+

Enums

+ +
+
+

Functions

+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/namespace_torch_tensorrt__logging.html b/docs/v1.2.0/_cpp_api/namespace_torch_tensorrt__logging.html new file mode 100644 index 0000000000..6f14d2a36d --- /dev/null +++ b/docs/v1.2.0/_cpp_api/namespace_torch_tensorrt__logging.html @@ -0,0 +1,698 @@ + + + + + + + + + + + + + Namespace torch_tensorrt::logging — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/namespace_torch_tensorrt__ptq.html b/docs/v1.2.0/_cpp_api/namespace_torch_tensorrt__ptq.html new file mode 100644 index 0000000000..6707e36528 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/namespace_torch_tensorrt__ptq.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + Namespace torch_tensorrt::ptq — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+ + +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/namespace_torch_tensorrt__torchscript.html b/docs/v1.2.0/_cpp_api/namespace_torch_tensorrt__torchscript.html new file mode 100644 index 0000000000..9717a7785c --- /dev/null +++ b/docs/v1.2.0/_cpp_api/namespace_torch_tensorrt__torchscript.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + Namespace torch_tensorrt::torchscript — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+ + +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_logging.h.html b/docs/v1.2.0/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_logging.h.html new file mode 100644 index 0000000000..73a1ad2dd6 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_logging.h.html @@ -0,0 +1,698 @@ + + + + + + + + + + + + + Program Listing for File logging.h — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Program Listing for File logging.h
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Program Listing for File logging.h

+

Return to documentation for file (cpp/include/torch_tensorrt/logging.h)

+
/*
+ * Copyright (c) NVIDIA Corporation.
+ * All rights reserved.
+ *
+ * This library is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+#pragma once
+
+#include <string>
+#include "torch_tensorrt/macros.h"
+
+namespace torch_tensorrt {
+namespace logging {
+enum Level {
+  kINTERNAL_ERROR,
+  kERROR,
+  kWARNING,
+  kINFO,
+  kDEBUG,
+  kGRAPH,
+};
+
+// Are these ones necessary for the user?
+TORCHTRT_API std::string get_logging_prefix();
+TORCHTRT_API void set_logging_prefix(std::string prefix);
+
+TORCHTRT_API void set_reportable_log_level(Level lvl);
+
+TORCHTRT_API void set_is_colored_output_on(bool colored_output_on);
+
+TORCHTRT_API Level get_reportable_log_level();
+
+TORCHTRT_API bool get_is_colored_output_on();
+
+// Dont know if we want this?
+TORCHTRT_API void log(Level lvl, std::string msg);
+} // namespace logging
+} // namespace torch_tensorrt
+
+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_macros.h.html b/docs/v1.2.0/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_macros.h.html new file mode 100644 index 0000000000..f4316b51cf --- /dev/null +++ b/docs/v1.2.0/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_macros.h.html @@ -0,0 +1,697 @@ + + + + + + + + + + + + + Program Listing for File macros.h — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Program Listing for File macros.h
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Program Listing for File macros.h

+

Return to documentation for file (cpp/include/torch_tensorrt/macros.h)

+
/*
+ * Copyright (c) NVIDIA Corporation.
+ * All rights reserved.
+ *
+ * This library is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+#pragma once
+
+#if defined(USE_CMAKE_GENERATED_EXPORT_HEADER)
+#include <torch_tensorrt_export.h>
+#else
+#if defined(__GNUC__)
+#define TORCHTRT_API __attribute__((__visibility__("default")))
+#define TORCHTRT_HIDDEN __attribute__((__visibility__("hidden")))
+#else
+#define TORCHTRT_API
+#define TORCHTRT_HIDDEN
+#endif // defined(__GNUC__)
+#endif // defined(USE_CMAKE_GENERATED_EXPORT_HEADER)
+
+// Does this need to be gaurded or something?
+#define XSTR(x) #x
+#define STR(x) XSTR(x)
+
+#define TORCH_TENSORRT_MAJOR_VERSION 1
+#define TORCH_TENSORRT_MINOR_VERSION 2
+#define TORCH_TENSORRT_PATCH_VERSION 0
+#define TORCH_TENSORRT_VERSION      \
+  STR(TORCH_TENSORRT_MAJOR_VERSION) \
+  "." STR(TORCH_TENSORRT_MINOR_VERSION) "." STR(TORCH_TENSORRT_PATCH_VERSION)
+
+// Setup namespace aliases for ease of use
+namespace torch_tensorrt {
+namespace torchscript {}
+namespace ts = torchscript;
+} // namespace torch_tensorrt
+namespace torchtrt = torch_tensorrt;
+
+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_ptq.h.html b/docs/v1.2.0/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_ptq.h.html new file mode 100644 index 0000000000..79a470355d --- /dev/null +++ b/docs/v1.2.0/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_ptq.h.html @@ -0,0 +1,837 @@ + + + + + + + + + + + + + Program Listing for File ptq.h — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Program Listing for File ptq.h
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Program Listing for File ptq.h

+

Return to documentation for file (cpp/include/torch_tensorrt/ptq.h)

+
/*
+ * Copyright (c) NVIDIA Corporation.
+ * All rights reserved.
+ *
+ * This library is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+#pragma once
+
+#include <fstream>
+#include <iostream>
+#include <iterator>
+#include <memory>
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include "NvInfer.h"
+#include "torch/torch.h"
+#include "torch_tensorrt/logging.h"
+#include "torch_tensorrt/macros.h"
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+namespace nvinfer1 {
+class IInt8Calibrator;
+class IInt8EntropyCalibrator2;
+} // namespace nvinfer1
+
+namespace torch_tensorrt {
+namespace ptq {
+TORCHTRT_API bool get_batch_impl(void* bindings[], const char* names[], int nbBindings, torch::Tensor& data);
+}
+} // namespace torch_tensorrt
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+
+namespace torch_tensorrt {
+namespace ptq {
+
+template <typename Algorithm, typename DataLoaderUniquePtr>
+class Int8Calibrator : Algorithm {
+  using DataLoader = typename DataLoaderUniquePtr::element_type;
+  using Batch = typename DataLoader::super::BatchType;
+
+ public:
+  Int8Calibrator(DataLoaderUniquePtr dataloader, const std::string& cache_file_path, bool use_cache)
+      : dataloader_(dataloader.get()), cache_file_path_(cache_file_path), use_cache_(use_cache) {
+    for (auto batch : *dataloader_) {
+      batched_data_.push_back(batch.data);
+    }
+    it_ = batched_data_.begin();
+  }
+
+  int getBatchSize() const noexcept override {
+    // HACK: Torch-TensorRT only uses explict batch sizing, INT8 Calibrator does not
+    // work when reporting the batch size here and having explicity batching.
+    // So we just report batch size 1 (warnings will still be printed out).
+    return 1;
+    // return static_cast<int>(dataloader_->options().batch_size);
+  }
+
+  bool getBatch(void* bindings[], const char* names[], int nbBindings) noexcept override {
+    if (it_ != batched_data_.end()) {
+      auto status = get_batch_impl(bindings, names, nbBindings, *it_);
+      it_ = ++it_;
+      return status;
+    } else {
+      // Reset iterator if incase calibrator is going to be used again
+      it_ = batched_data_.begin();
+      return false;
+    }
+  }
+
+  const void* readCalibrationCache(size_t& length) noexcept override {
+    if (use_cache_) {
+      std::stringstream ss;
+      ss << "Reading Calibration Cache from " << cache_file_path_;
+      logging::log(logging::Level::kINFO, ss.str());
+
+      cache_.clear();
+      std::ifstream input(cache_file_path_, std::ios::binary);
+      input >> std::noskipws;
+      if (input.good()) {
+        std::copy(std::istream_iterator<char>(input), std::istream_iterator<char>(), std::back_inserter(cache_));
+        logging::log(logging::Level::kDEBUG, "Cache read");
+      }
+      length = cache_.size();
+      return length ? cache_.data() : nullptr;
+    }
+    return nullptr;
+  }
+
+  void writeCalibrationCache(const void* cache, size_t length) noexcept override {
+    std::ofstream cache_file(cache_file_path_, std::ios::binary);
+    cache_file.write(reinterpret_cast<const char*>(cache), length);
+    std::stringstream ss;
+    ss << "Saved Calibration Cache to " << cache_file_path_;
+    logging::log(logging::Level::kINFO, ss.str());
+  }
+
+  operator nvinfer1::IInt8Calibrator*() {
+    return reinterpret_cast<nvinfer1::IInt8Calibrator*>(this);
+  }
+
+ private:
+  DataLoader* dataloader_;
+  const std::string& cache_file_path_;
+  size_t cache_size_ = 0;
+  bool use_cache_;
+  std::vector<char> cache_;
+  std::vector<torch::Tensor> batched_data_;
+  std::vector<torch::Tensor>::iterator it_;
+};
+
+template <typename Algorithm>
+class Int8CacheCalibrator : Algorithm {
+ public:
+  Int8CacheCalibrator(const std::string& cache_file_path) : cache_file_path_(cache_file_path) {}
+
+  int getBatchSize() const noexcept override {
+    // HACK: Torch-TensorRT only uses explict batch sizing, INT8 Calibrator does not
+    // work when reporting the batch size here and having explicity batching.
+    // So we just report batch size 1 (warnings will still be printed out).
+    return 1;
+  }
+
+  bool getBatch(void* bindings[], const char* names[], int nbBindings) noexcept override {
+    return false;
+  }
+
+  const void* readCalibrationCache(size_t& length) noexcept override {
+    std::stringstream ss;
+    ss << "Reading Calibration Cache from " << cache_file_path_;
+    logging::log(logging::Level::kINFO, ss.str());
+
+    cache_.clear();
+    std::ifstream input(cache_file_path_, std::ios::binary);
+    input >> std::noskipws;
+    if (input.good()) {
+      std::copy(std::istream_iterator<char>(input), std::istream_iterator<char>(), std::back_inserter(cache_));
+      logging::log(logging::Level::kDEBUG, "Cache read");
+    }
+    length = cache_.size();
+    return length ? cache_.data() : nullptr;
+  }
+
+  void writeCalibrationCache(const void* cache, size_t length) noexcept override {
+    std::ofstream cache_file(cache_file_path_, std::ios::binary);
+    cache_file.write(reinterpret_cast<const char*>(cache), length);
+    std::stringstream ss;
+    ss << "Saved Calibration Cache to " << cache_file_path_;
+    logging::log(logging::Level::kINFO, ss.str());
+  }
+
+  operator nvinfer1::IInt8Calibrator*() {
+    return reinterpret_cast<nvinfer1::IInt8Calibrator*>(this);
+  }
+
+ private:
+  const std::string& cache_file_path_;
+  size_t cache_size_ = 0;
+  std::vector<char> cache_;
+};
+
+template <typename Algorithm = nvinfer1::IInt8EntropyCalibrator2, typename DataLoader>
+inline Int8Calibrator<Algorithm, DataLoader> make_int8_calibrator(
+    DataLoader dataloader,
+    const std::string& cache_file_path,
+    bool use_cache) {
+  return Int8Calibrator<Algorithm, DataLoader>(std::move(dataloader), cache_file_path, use_cache);
+}
+
+template <typename Algorithm = nvinfer1::IInt8EntropyCalibrator2>
+inline Int8CacheCalibrator<Algorithm> make_int8_cache_calibrator(const std::string& cache_file_path) {
+  return Int8CacheCalibrator<Algorithm>(cache_file_path);
+}
+
+} // namespace ptq
+} // namespace torch_tensorrt
+
+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h.html b/docs/v1.2.0/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h.html new file mode 100644 index 0000000000..dc8a9926c8 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h.html @@ -0,0 +1,941 @@ + + + + + + + + + + + + + Program Listing for File torch_tensorrt.h — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Program Listing for File torch_tensorrt.h
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Program Listing for File torch_tensorrt.h

+

Return to documentation for file (cpp/include/torch_tensorrt/torch_tensorrt.h)

+
/*
+ * Copyright (c) NVIDIA Corporation.
+ * All rights reserved.
+ *
+ * This library is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#pragma once
+
+#include <cuda_runtime.h>
+#include <iostream>
+#include <memory>
+#include <set>
+#include <string>
+#include <vector>
+#include "torch/custom_class.h"
+
+#include "torch_tensorrt/macros.h"
+
+// Just include the .h?
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+namespace torch {
+namespace jit {
+struct Graph;
+struct Module;
+} // namespace jit
+} // namespace torch
+
+namespace c10 {
+enum class DeviceType : int8_t;
+enum class ScalarType : int8_t;
+template <class>
+class ArrayRef;
+} // namespace c10
+
+namespace nvinfer1 {
+class IInt8Calibrator;
+}
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+
+namespace torch_tensorrt {
+class DataType {
+ public:
+  enum Value : int8_t {
+    kFloat,
+    kHalf,
+    kChar,
+    kInt,
+    kBool,
+    kUnknown
+  };
+
+  DataType() = default;
+  constexpr DataType(Value t) : value(t) {}
+  TORCHTRT_API DataType(c10::ScalarType t);
+  operator Value() const {
+    return value;
+  }
+  explicit operator bool() = delete;
+  constexpr bool operator==(DataType other) const {
+    return value == other.value;
+  }
+  constexpr bool operator==(DataType::Value other) const {
+    return value == other;
+  }
+  constexpr bool operator!=(DataType other) const {
+    return value != other.value;
+  }
+  constexpr bool operator!=(DataType::Value other) const {
+    return value != other;
+  }
+
+ private:
+  friend TORCHTRT_API std::ostream& operator<<(std::ostream& os, const DataType& dtype);
+  Value value;
+};
+
+struct Device {
+  class DeviceType {
+   public:
+    enum Value : int8_t {
+      kGPU,
+      kDLA,
+    };
+
+    DeviceType() = default;
+    constexpr DeviceType(Value t) : value(t) {}
+    DeviceType(c10::DeviceType t);
+    operator Value() const {
+      return value;
+    }
+    explicit operator bool() = delete;
+    constexpr bool operator==(DeviceType other) const {
+      return value == other.value;
+    }
+    constexpr bool operator!=(DeviceType other) const {
+      return value != other.value;
+    }
+
+   private:
+    Value value;
+  };
+
+  DeviceType device_type;
+
+  /*
+   * Target gpu id
+   */
+  int64_t gpu_id;
+
+  /*
+   * When using DLA core on NVIDIA AGX platforms gpu_id should be set as Xavier device
+   */
+  int64_t dla_core;
+
+  bool allow_gpu_fallback;
+
+  Device() : device_type(DeviceType::kGPU), gpu_id(0), dla_core(0), allow_gpu_fallback(false) {}
+};
+
+enum class EngineCapability : int8_t {
+  kSTANDARD,
+  kSAFETY,
+  kDLA_STANDALONE,
+};
+
+class TensorFormat {
+ public:
+  enum Value : int8_t {
+    kContiguous,
+    kChannelsLast,
+    kUnknown,
+  };
+
+  TensorFormat() = default;
+  constexpr TensorFormat(Value t) : value(t) {}
+  TORCHTRT_API TensorFormat(at::MemoryFormat t);
+  operator Value() const {
+    return value;
+  }
+  explicit operator bool() = delete;
+  constexpr bool operator==(TensorFormat other) const {
+    return value == other.value;
+  }
+  constexpr bool operator==(TensorFormat::Value other) const {
+    return value == other;
+  }
+  constexpr bool operator!=(TensorFormat other) const {
+    return value != other.value;
+  }
+  constexpr bool operator!=(TensorFormat::Value other) const {
+    return value != other;
+  }
+
+ private:
+  friend TORCHTRT_API std::ostream& operator<<(std::ostream& os, const TensorFormat& format);
+  Value value;
+};
+
+struct Input : torch::CustomClassHolder {
+  std::vector<int64_t> min_shape;
+  std::vector<int64_t> opt_shape;
+  std::vector<int64_t> max_shape;
+  std::vector<int64_t> shape;
+  DataType dtype;
+  TensorFormat format;
+
+  Input() {}
+  TORCHTRT_API Input(std::vector<int64_t> shape, TensorFormat format = TensorFormat::kContiguous);
+
+  TORCHTRT_API Input(std::vector<int64_t> shape, DataType dtype, TensorFormat format = TensorFormat::kContiguous);
+
+  TORCHTRT_API Input(c10::ArrayRef<int64_t> shape, TensorFormat format = TensorFormat::kContiguous);
+
+  TORCHTRT_API Input(c10::ArrayRef<int64_t> shape, DataType dtype, TensorFormat format = TensorFormat::kContiguous);
+
+  TORCHTRT_API Input(
+      std::vector<int64_t> min_shape,
+      std::vector<int64_t> opt_shape,
+      std::vector<int64_t> max_shape,
+      TensorFormat format = TensorFormat::kContiguous);
+
+  TORCHTRT_API Input(
+      std::vector<int64_t> min_shape,
+      std::vector<int64_t> opt_shape,
+      std::vector<int64_t> max_shape,
+      DataType dtype,
+      TensorFormat format = TensorFormat::kContiguous);
+
+  TORCHTRT_API Input(
+      c10::ArrayRef<int64_t> min_shape,
+      c10::ArrayRef<int64_t> opt_shape,
+      c10::ArrayRef<int64_t> max_shape,
+      TensorFormat format = TensorFormat::kContiguous);
+
+  TORCHTRT_API Input(
+      c10::ArrayRef<int64_t> min_shape,
+      c10::ArrayRef<int64_t> opt_shape,
+      c10::ArrayRef<int64_t> max_shape,
+      DataType dtype,
+      TensorFormat format = TensorFormat::kContiguous);
+
+  TORCHTRT_API Input(at::Tensor tensor);
+
+ private:
+  friend TORCHTRT_API std::ostream& operator<<(std::ostream& os, const Input& input);
+  bool input_is_dynamic;
+};
+
+struct GraphInputs {
+  torch::jit::IValue input_signature; // nested Input, full input spec
+  std::vector<Input> inputs; // flatten input spec
+};
+
+TORCHTRT_API std::string get_build_info();
+
+TORCHTRT_API void dump_build_info();
+
+TORCHTRT_API void set_device(const int gpu_id);
+
+namespace torchscript {
+struct CompileSpec {
+  TORCHTRT_API CompileSpec(std::vector<std::vector<int64_t>> fixed_sizes);
+
+  TORCHTRT_API CompileSpec(std::vector<c10::ArrayRef<int64_t>> fixed_sizes);
+
+  TORCHTRT_API CompileSpec(std::vector<Input> inputs);
+
+  TORCHTRT_API CompileSpec(torch::jit::IValue input_signature);
+  // Defaults should reflect TensorRT defaults for BuilderConfig
+
+  GraphInputs graph_inputs;
+  std::set<DataType> enabled_precisions = {DataType::kFloat};
+
+  bool disable_tf32 = false;
+
+  bool sparse_weights = false;
+
+  bool refit = false;
+
+  bool debug = false;
+
+  bool truncate_long_and_double = false;
+
+  Device device;
+
+  EngineCapability capability = EngineCapability::kSTANDARD;
+
+  uint64_t num_avg_timing_iters = 1;
+
+  uint64_t workspace_size = 0;
+
+  uint64_t dla_sram_size = 1048576;
+
+  uint64_t dla_local_dram_size = 1073741824;
+
+  uint64_t dla_global_dram_size = 536870912;
+
+  nvinfer1::IInt8Calibrator* ptq_calibrator = nullptr;
+
+  bool require_full_compilation = false;
+
+  uint64_t min_block_size = 3;
+
+  std::vector<std::string> torch_executed_ops;
+
+  std::vector<std::string> torch_executed_modules;
+};
+
+TORCHTRT_API bool check_method_operator_support(const torch::jit::Module& module, std::string method_name);
+
+TORCHTRT_API torch::jit::Module compile(const torch::jit::Module& module, CompileSpec info);
+
+TORCHTRT_API std::string convert_method_to_trt_engine(
+    const torch::jit::Module& module,
+    std::string method_name,
+    CompileSpec info);
+
+TORCHTRT_API torch::jit::Module embed_engine_in_new_module(const std::string& engine, Device device);
+} // namespace torchscript
+} // namespace torch_tensorrt
+
+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/structtorch__tensorrt_1_1Device.html b/docs/v1.2.0/_cpp_api/structtorch__tensorrt_1_1Device.html new file mode 100644 index 0000000000..59a0881709 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/structtorch__tensorrt_1_1Device.html @@ -0,0 +1,840 @@ + + + + + + + + + + + + + Struct Device — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Struct Device

+ +
+

Nested Relationships

+
+

Nested Types

+ +
+
+
+

Struct Documentation

+
+
+struct torch_tensorrt::Device
+

Setting data structure for Target device.

+
+

Public Functions

+
+
+inline Device()
+

Constructor for Device structure

+
+ +
+
+

Public Members

+
+
+DeviceType device_type
+

Setting data structure for device This struct will hold Target device related parameters such as device_type, gpu_id, dla_core.

+
+ +
+
+int64_t gpu_id
+
+ +
+
+int64_t dla_core
+
+ +
+
+bool allow_gpu_fallback
+

(Only used when targeting DLA (device)) Lets engine run layers on GPU if they are not supported on DLA

+
+ +
+
+
+class DeviceType
+

Supported Device Types that can be used with TensorRT engines

+

This class is compatable with c10::DeviceTypes (but will check for TRT support) but the only applicable value is at::kCUDA, which maps to DeviceType::kGPU

+

To use the DataType class itself, interface using the enum vs. normal instatination

+

ex. torch_tensorrt::DeviceType type = DeviceType::kGPU;

+
+

Public Types

+
+
+enum Value
+

Underlying enum class to support the DeviceType Class

+

In the case that you need to use the DeviceType class itself, interface using this enum vs. normal instatination

+

ex. torch_tensorrt::DeviceType type = DeviceType::kGPU;

+

Values:

+
+
+enumerator kGPU
+

Target GPU to run engine.

+
+ +
+
+enumerator kDLA
+

Target DLA to run engine.

+
+ +
+ +
+
+

Public Functions

+
+
+DeviceType() = default
+

Construct a new Device Type object.

+
+ +
+
+inline constexpr DeviceType(Value t)
+

Construct a new Device Type object from internal enum.

+
+ +
+
+DeviceType(c10::DeviceType t)
+

Construct a new Device Type object from torch device enums Note: The only valid value is torch::kCUDA (torch::kCPU is not supported)

+
+
Parameters
+

t

+
+
+
+ +
+
+inline operator Value() const
+

Get the internal value from the Device object.

+
+
Returns
+

Value

+
+
+
+ +
+
+explicit operator bool() = delete
+
+ +
+
+inline constexpr bool operator==(DeviceType other) const
+

Comparison operator for DeviceType.

+
+
Parameters
+

other

+
+
Returns
+

true

+
+
Returns
+

false

+
+
+
+ +
+
+inline constexpr bool operator!=(DeviceType other) const
+

Comparison operator for DeviceType.

+
+
Parameters
+

other

+
+
Returns
+

true

+
+
Returns
+

false

+
+
+
+ +
+
+ +
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/structtorch__tensorrt_1_1GraphInputs.html b/docs/v1.2.0/_cpp_api/structtorch__tensorrt_1_1GraphInputs.html new file mode 100644 index 0000000000..7f59d7979e --- /dev/null +++ b/docs/v1.2.0/_cpp_api/structtorch__tensorrt_1_1GraphInputs.html @@ -0,0 +1,698 @@ + + + + + + + + + + + + + Struct GraphInputs — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Struct GraphInputs

+ +
+

Struct Documentation

+
+
+struct torch_tensorrt::GraphInputs
+

A struct to hold complex inputs.

+

This struct can either hold a complex inputs of shape or a flattened one,

+
+

Public Members

+
+
+torch::jit::IValue input_signature
+
+ +
+
+std::vector<Input> inputs
+
+ +
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/structtorch__tensorrt_1_1Input.html b/docs/v1.2.0/_cpp_api/structtorch__tensorrt_1_1Input.html new file mode 100644 index 0000000000..2f98921cd7 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/structtorch__tensorrt_1_1Input.html @@ -0,0 +1,881 @@ + + + + + + + + + + + + + Struct Input — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Struct Input

+ +
+

Inheritance Relationships

+
+

Base Type

+
    +
  • public CustomClassHolder

  • +
+
+
+
+

Struct Documentation

+
+
+struct torch_tensorrt::Input : public CustomClassHolder
+

A struct to hold an input range (used by TensorRT Optimization profile)

+

This struct can either hold a single vector representing an input shape, signifying a static input shape or a set of three input shapes representing the min, optiminal and max input shapes allowed for the engine.

+
+

Public Functions

+
+
+inline Input()
+
+ +
+
+TORCHTRT_API Input(std::vector<int64_t> shape, TensorFormat format = TensorFormat::kContiguous)
+

Construct a new Input spec object for static input size from vector, optional arguments allow the user to configure expected input shape tensor format. dtype (Expected data type for the input) defaults to PyTorch / traditional TRT convection (FP32 for FP32 only, FP16 for FP32 and FP16, FP32 for Int8)

+
+
Parameters
+
    +
  • shapeInput tensor shape

  • +
  • format – Expected tensor format for the input (Defaults to contiguous)

  • +
+
+
+
+ +
+
+TORCHTRT_API Input(std::vector<int64_t> shape, DataType dtype, TensorFormat format = TensorFormat::kContiguous)
+

Construct a new Input spec object for static input size from vector, optional arguments allow the user to configure expected input shape tensor format.

+
+
Parameters
+
    +
  • shapeInput tensor shape

  • +
  • dtype – Expected data type for the input (Defaults to the type of the weights in the first tensor calculation if detectable else Float32)

  • +
  • format – Expected tensor format for the input (Defaults to contiguous)

  • +
+
+
+
+ +
+
+TORCHTRT_API Input(c10::ArrayRef<int64_t> shape, TensorFormat format = TensorFormat::kContiguous)
+

Construct a new Input spec object for static input size from c10::ArrayRef (the type produced by tensor.sizes()), vector, optional arguments allow the user to configure expected input shape tensor format dtype (Expected data type for the input) defaults to PyTorch / traditional TRT convection (FP32 for FP32 only, FP16 for FP32 and FP16, FP32 for Int8)

+
+
Parameters
+
    +
  • shapeInput tensor shape

  • +
  • format – Expected tensor format for the input (Defaults to contiguous)

  • +
+
+
+
+ +
+
+TORCHTRT_API Input(c10::ArrayRef<int64_t> shape, DataType dtype, TensorFormat format = TensorFormat::kContiguous)
+

Construct a new Input spec object for static input size from c10::ArrayRef (the type produced by tensor.sizes()), vector, optional arguments allow the user to configure expected input shape tensor format.

+
+
Parameters
+
    +
  • shapeInput tensor shape

  • +
  • dtype – Expected data type for the input (Defaults to the type of the weights in the first tensor calculation if detectable else Float32)

  • +
  • format – Expected tensor format for the input (Defaults to contiguous)

  • +
+
+
+
+ +
+
+TORCHTRT_API Input(std::vector<int64_t> min_shape, std::vector<int64_t> opt_shape, std::vector<int64_t> max_shape, TensorFormat format = TensorFormat::kContiguous)
+

Construct a new Input spec object dynamic input size from c10::ArrayRef (the type produced by tensor.sizes()) for min, opt, and max supported sizes. dtype (Expected data type for the input) defaults to PyTorch / traditional TRT convection (FP32 for FP32 only, FP16 for FP32 and FP16, FP32 for Int8)

+
+
Parameters
+
    +
  • min_shape – Minimum shape for input tensor

  • +
  • opt_shape – Target optimization shape for input tensor

  • +
  • max_shape – Maximum acceptible shape for input tensor

  • +
  • format – Expected tensor format for the input (Defaults to contiguous)

  • +
+
+
+
+ +
+
+TORCHTRT_API Input(std::vector<int64_t> min_shape, std::vector<int64_t> opt_shape, std::vector<int64_t> max_shape, DataType dtype, TensorFormat format = TensorFormat::kContiguous)
+

Construct a new Input spec object for a dynamic input size from vectors for minimum shape, optimal shape, and max shape supported sizes optional arguments allow the user to configure expected input shape tensor format.

+
+
Parameters
+
    +
  • min_shape – Minimum shape for input tensor

  • +
  • opt_shape – Target optimization shape for input tensor

  • +
  • max_shape – Maximum acceptible shape for input tensor

  • +
  • dtype – Expected data type for the input (Defaults to the type of the weights in the first tensor calculation if detectable else Float32)

  • +
  • format – Expected tensor format for the input (Defaults to contiguous)

  • +
+
+
+
+ +
+
+TORCHTRT_API Input(c10::ArrayRef<int64_t> min_shape, c10::ArrayRef<int64_t> opt_shape, c10::ArrayRef<int64_t> max_shape, TensorFormat format = TensorFormat::kContiguous)
+

Construct a new Input spec object dynamic input size from c10::ArrayRef (the type produced by tensor.sizes()) for min, opt, and max supported sizes. dtype (Expected data type for the input) defaults to PyTorch / traditional TRT convection (FP32 for FP32 only, FP16 for FP32 and FP16, FP32 for Int8)

+
+
Parameters
+
    +
  • min_shape – Minimum shape for input tensor

  • +
  • opt_shape – Target optimization shape for input tensor

  • +
  • max_shape – Maximum acceptible shape for input tensor

  • +
  • format – Expected tensor format for the input (Defaults to contiguous)

  • +
+
+
+
+ +
+
+TORCHTRT_API Input(c10::ArrayRef<int64_t> min_shape, c10::ArrayRef<int64_t> opt_shape, c10::ArrayRef<int64_t> max_shape, DataType dtype, TensorFormat format = TensorFormat::kContiguous)
+

Construct a new Input spec object dynamic input size from c10::ArrayRef (the type produced by tensor.sizes()) for min, opt, and max supported sizes.

+
+
Parameters
+
    +
  • min_shape – Minimum shape for input tensor

  • +
  • opt_shape – Target optimization shape for input tensor

  • +
  • max_shape – Maximum acceptible shape for input tensor

  • +
  • dtype – Expected data type for the input (Defaults to the type of the weights in the first tensor calculation if detectable else Float32)

  • +
  • format – Expected tensor format for the input (Defaults to contiguous)

  • +
+
+
+
+ +
+
+TORCHTRT_API Input(at::Tensor tensor)
+

Construct a new Input spec object using a torch tensor as an example The tensor’s shape, type and layout inform the spec’s values.

+

Note: You cannot set dynamic shape through this method, you must use an alternative constructor

+
+
Parameters
+

tensor – Reference tensor to set shape, type and layout

+
+
+
+ +
+
+

Public Members

+
+
+std::vector<int64_t> min_shape
+

Minimum acceptable input size into the engine.

+
+ +
+
+std::vector<int64_t> opt_shape
+

Optimal input size into the engine (size optimized for given kernels accept any size in min max range)

+
+ +
+
+std::vector<int64_t> max_shape
+

Maximum acceptable input size into the engine.

+
+ +
+
+std::vector<int64_t> shape
+

Input shape to be fed to TensorRT, in the event of a dynamic shape, -1’s will hold the place of variable dimensions

+
+ +
+
+DataType dtype
+

Expected data type for the input.

+
+ +
+
+TensorFormat format
+

Expected tensor format for the input.

+
+ +
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/structtorch__tensorrt_1_1torchscript_1_1CompileSpec.html b/docs/v1.2.0/_cpp_api/structtorch__tensorrt_1_1torchscript_1_1CompileSpec.html new file mode 100644 index 0000000000..0d9c4b301a --- /dev/null +++ b/docs/v1.2.0/_cpp_api/structtorch__tensorrt_1_1torchscript_1_1CompileSpec.html @@ -0,0 +1,852 @@ + + + + + + + + + + + + + Struct CompileSpec — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Struct CompileSpec

+ +
+

Struct Documentation

+
+
+struct torch_tensorrt::torchscript::CompileSpec
+

Settings data structure for Torch-TensorRT TorchScript compilation

+
+

Public Functions

+
+
+TORCHTRT_API CompileSpec(std::vector<std::vector<int64_t>> fixed_sizes)
+

Construct a new Compile Spec object Convienence constructor to set fixed input size from vectors describing size of input tensors. Each entry in the vector represents a input and should be provided in call order.

+

This constructor should be use as a convience in the case that all inputs are static sized and you are okay with default input dtype and formats (FP32 for FP32 and INT8 weights, FP16 for FP16 weights, contiguous)

+
+
Parameters
+

fixed_sizes

+
+
+
+ +
+
+TORCHTRT_API CompileSpec(std::vector<c10::ArrayRef<int64_t>> fixed_sizes)
+

Construct a new Compile Spec object Convienence constructor to set fixed input size from c10::ArrayRef’s (the output of tensor.sizes()) describing size of input tensors. Each entry in the vector represents a input and should be provided in call order.

+

This constructor should be use as a convience in the case that all inputs are static sized and you are okay with default input dtype and formats (FP32 for FP32 and INT8 weights, FP16 for FP16 weights, contiguous)

+
+
Parameters
+

fixed_sizes

+
+
+
+ +
+
+TORCHTRT_API CompileSpec(std::vector<Input> inputs)
+

Construct a new Compile Spec object from input ranges. Each entry in the vector represents a input and should be provided in call order.

+

Use this constructor to define inputs with dynamic shape, specific input types or tensor formats

+
+
Parameters
+

inputs

+
+
+
+ +
+
+TORCHTRT_API CompileSpec(torch::jit::IValue input_signature)
+

Construct a new Compile Spec object from IValue which represents the nesting of input tensors for a module.

+
+
Parameters
+

input_signature

+
+
+
+ +
+
+

Public Members

+
+
+GraphInputs graph_inputs
+

Specifications for inputs to the engine, can store a IValue which has stored complex Input or a flatened Input.

+
+ +
+
+std::set<DataType> enabled_precisions = {DataType::kFloat}
+

The set of precisions TensorRT is allowed to use for kernels during compilation.

+
+ +
+
+bool disable_tf32 = false
+

Prevent Float32 layers from using TF32 data format

+

TF32 computes inner products by rounding the inputs to 10-bit mantissas before multiplying, but accumulates the sum using 23-bit mantissas. This is the behavior of FP32 layers by default.

+
+ +
+
+bool sparse_weights = false
+

Enable sparsity for weights of conv and FC layers

+
+ +
+
+bool refit = false
+

Build a refitable engine

+
+ +
+
+bool debug = false
+

Build a debugable engine

+
+ +
+
+bool truncate_long_and_double = false
+

Truncate long/double type to int/float type

+
+ +
+
+Device device
+

Target Device

+
+ +
+
+EngineCapability capability = EngineCapability::kSTANDARD
+

Sets the restrictions for the engine (CUDA Safety)

+
+ +
+
+uint64_t num_avg_timing_iters = 1
+

Number of averaging timing iterations used to select kernels

+
+ +
+
+uint64_t workspace_size = 0
+

Maximum size of workspace given to TensorRT

+
+ +
+
+uint64_t dla_sram_size = 1048576
+

Fast software managed RAM used by DLA to communicate within a layer.

+
+ +
+
+uint64_t dla_local_dram_size = 1073741824
+

Host RAM used by DLA to share intermediate tensor data across operations

+
+ +
+
+uint64_t dla_global_dram_size = 536870912
+

host RAM used by DLA to store weights and metadata for execution

+
+ +
+
+nvinfer1::IInt8Calibrator *ptq_calibrator = nullptr
+

Calibration dataloaders for each input for post training quantizatiom

+
+ +
+
+bool require_full_compilation = false
+

Require the full module be compiled to TensorRT instead of potentially running unsupported operations in PyTorch

+
+ +
+
+uint64_t min_block_size = 3
+

Minimum number of contiguous supported operators to compile a subgraph to TensorRT

+
+ +
+
+std::vector<std::string> torch_executed_ops
+

List of aten operators that must be run in PyTorch. An error will be thrown if this list is not empty but require_full_compilation is True

+
+ +
+
+std::vector<std::string> torch_executed_modules
+

List of modules that must be run in PyTorch. An error will be thrown if this list is not empty but require_full_compilation is True

+
+ +
+
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/torch_tensort_cpp.html b/docs/v1.2.0/_cpp_api/torch_tensort_cpp.html new file mode 100644 index 0000000000..f0abfaaaa6 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/torch_tensort_cpp.html @@ -0,0 +1,1060 @@ + + + + + + + + + + + + + Torch-TensorRT C++ API — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Torch-TensorRT C++ API
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Torch-TensorRT C++ API

+
+

Class Hierarchy

+
+
+

File Hierarchy

+
+
+

Full API

+
+

Namespaces

+ + + + +
+
+

Classes and Structs

+ + + + + + + + + +
+
+

Enums

+ + +
+
+

Functions

+ + + + + + + + + + + + + + + + +
+
+

Defines

+ + + + + + + + +
+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/unabridged_api.html b/docs/v1.2.0/_cpp_api/unabridged_api.html new file mode 100644 index 0000000000..9747f4c070 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/unabridged_api.html @@ -0,0 +1,1015 @@ + + + + + + + + + + + + + Full API — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Full API

+
+

Namespaces

+ + + + +
+
+

Classes and Structs

+ + + + + + + + +
+
+

Enums

+ + +
+
+

Functions

+ + + + + + + + + + + + + + + + +
+
+

Defines

+ + + + + + + + +
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_cpp_api/unabridged_orphan.html b/docs/v1.2.0/_cpp_api/unabridged_orphan.html new file mode 100644 index 0000000000..362eeede77 --- /dev/null +++ b/docs/v1.2.0/_cpp_api/unabridged_orphan.html @@ -0,0 +1,755 @@ + + + + + + + + + + + + + Full API — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+ + +
+
+
+ + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_downloads/26d49aeeb9c710e27197fda28b7c3516/yi_jing_01_chien.jpg b/docs/v1.2.0/_downloads/26d49aeeb9c710e27197fda28b7c3516/yi_jing_01_chien.jpg new file mode 100644 index 0000000000..523dc2b8b8 Binary files /dev/null and b/docs/v1.2.0/_downloads/26d49aeeb9c710e27197fda28b7c3516/yi_jing_01_chien.jpg differ diff --git a/docs/v1.2.0/_images/_notebooks_EfficientNet-example_12_0.png b/docs/v1.2.0/_images/_notebooks_EfficientNet-example_12_0.png new file mode 100644 index 0000000000..a308a0d7dd Binary files /dev/null and b/docs/v1.2.0/_images/_notebooks_EfficientNet-example_12_0.png differ diff --git a/docs/v1.2.0/_images/_notebooks_EfficientNet-example_16_2.png b/docs/v1.2.0/_images/_notebooks_EfficientNet-example_16_2.png new file mode 100644 index 0000000000..923e9af7ad Binary files /dev/null and b/docs/v1.2.0/_images/_notebooks_EfficientNet-example_16_2.png differ diff --git a/docs/v1.2.0/_images/_notebooks_Resnet50-example_12_0.png b/docs/v1.2.0/_images/_notebooks_Resnet50-example_12_0.png new file mode 100644 index 0000000000..918517c79a Binary files /dev/null and b/docs/v1.2.0/_images/_notebooks_Resnet50-example_12_0.png differ diff --git a/docs/v1.2.0/_images/_notebooks_Resnet50-example_16_1.png b/docs/v1.2.0/_images/_notebooks_Resnet50-example_16_1.png new file mode 100644 index 0000000000..67ce9b8c77 Binary files /dev/null and b/docs/v1.2.0/_images/_notebooks_Resnet50-example_16_1.png differ diff --git a/docs/v1.2.0/_images/_notebooks_dynamic-shapes_14_1.png b/docs/v1.2.0/_images/_notebooks_dynamic-shapes_14_1.png new file mode 100644 index 0000000000..90cc8518bb Binary files /dev/null and b/docs/v1.2.0/_images/_notebooks_dynamic-shapes_14_1.png differ diff --git a/docs/v1.2.0/_images/_notebooks_dynamic-shapes_8_0.png b/docs/v1.2.0/_images/_notebooks_dynamic-shapes_8_0.png new file mode 100644 index 0000000000..a308a0d7dd Binary files /dev/null and b/docs/v1.2.0/_images/_notebooks_dynamic-shapes_8_0.png differ diff --git a/docs/v1.2.0/_images/_notebooks_ssd-object-detection-demo_18_0.png b/docs/v1.2.0/_images/_notebooks_ssd-object-detection-demo_18_0.png new file mode 100644 index 0000000000..1510b460b6 Binary files /dev/null and b/docs/v1.2.0/_images/_notebooks_ssd-object-detection-demo_18_0.png differ diff --git a/docs/v1.2.0/_images/_notebooks_ssd-object-detection-demo_18_1.png b/docs/v1.2.0/_images/_notebooks_ssd-object-detection-demo_18_1.png new file mode 100644 index 0000000000..45a206ae1c Binary files /dev/null and b/docs/v1.2.0/_images/_notebooks_ssd-object-detection-demo_18_1.png differ diff --git a/docs/v1.2.0/_images/_notebooks_ssd-object-detection-demo_18_2.png b/docs/v1.2.0/_images/_notebooks_ssd-object-detection-demo_18_2.png new file mode 100644 index 0000000000..ae7a6c8850 Binary files /dev/null and b/docs/v1.2.0/_images/_notebooks_ssd-object-detection-demo_18_2.png differ diff --git a/docs/v1.2.0/_images/_notebooks_ssd-object-detection-demo_35_0.png b/docs/v1.2.0/_images/_notebooks_ssd-object-detection-demo_35_0.png new file mode 100644 index 0000000000..1510b460b6 Binary files /dev/null and b/docs/v1.2.0/_images/_notebooks_ssd-object-detection-demo_35_0.png differ diff --git a/docs/v1.2.0/_images/_notebooks_ssd-object-detection-demo_35_1.png b/docs/v1.2.0/_images/_notebooks_ssd-object-detection-demo_35_1.png new file mode 100644 index 0000000000..45a206ae1c Binary files /dev/null and b/docs/v1.2.0/_images/_notebooks_ssd-object-detection-demo_35_1.png differ diff --git a/docs/v1.2.0/_images/_notebooks_ssd-object-detection-demo_35_2.png b/docs/v1.2.0/_images/_notebooks_ssd-object-detection-demo_35_2.png new file mode 100644 index 0000000000..7189e0c703 Binary files /dev/null and b/docs/v1.2.0/_images/_notebooks_ssd-object-detection-demo_35_2.png differ diff --git a/docs/v1.2.0/_images/yi_jing_01_chien.jpg b/docs/v1.2.0/_images/yi_jing_01_chien.jpg new file mode 100644 index 0000000000..523dc2b8b8 Binary files /dev/null and b/docs/v1.2.0/_images/yi_jing_01_chien.jpg differ diff --git a/docs/v1.2.0/_modules/index.html b/docs/v1.2.0/_modules/index.html new file mode 100644 index 0000000000..a0940e5fed --- /dev/null +++ b/docs/v1.2.0/_modules/index.html @@ -0,0 +1,659 @@ + + + + + + + + + + + + Overview: module code — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+ + +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_modules/torch_tensorrt/_Device.html b/docs/v1.2.0/_modules/torch_tensorrt/_Device.html new file mode 100644 index 0000000000..5b5708f480 --- /dev/null +++ b/docs/v1.2.0/_modules/torch_tensorrt/_Device.html @@ -0,0 +1,781 @@ + + + + + + + + + + + + torch_tensorrt._Device — Torch-TensorRT v1.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt._Device

+import torch
+
+from torch_tensorrt import _enums
+from torch_tensorrt import logging
+from torch_tensorrt import _C
+
+import warnings
+
+
+
[docs]class Device(object): + """ + Defines a device that can be used to specify target devices for engines + + Attributes: + device_type (torch_tensorrt.DeviceType): Target device type (GPU or DLA). Set implicitly based on if dla_core is specified. + gpu_id (int): Device ID for target GPU + dla_core (int): Core ID for target DLA core + allow_gpu_fallback (bool): Whether falling back to GPU if DLA cannot support an op should be allowed + """ + + device_type = None #: (torch_tensorrt.DeviceType): Target device type (GPU or DLA). Set implicitly based on if dla_core is specified. + gpu_id = -1 #: (int) Device ID for target GPU + dla_core = -1 #: (int) Core ID for target DLA core + allow_gpu_fallback = False #: (bool) Whether falling back to GPU if DLA cannot support an op should be allowed + +
[docs] def __init__(self, *args, **kwargs): + """__init__ Method for torch_tensorrt.Device + + Device accepts one of a few construction patterns + + Args: + spec (str): String with device spec e.g. "dla:0" for dla, core_id 0 + + Keyword Arguments: + gpu_id (int): ID of target GPU (will get overrided if dla_core is specified to the GPU managing DLA). If specified, no positional arguments should be provided + dla_core (int): ID of target DLA core. If specified, no positional arguments should be provided. + allow_gpu_fallback (bool): Allow TensorRT to schedule operations on GPU if they are not supported on DLA (ignored if device type is not DLA) + + Examples: + - Device("gpu:1") + - Device("cuda:1") + - Device("dla:0", allow_gpu_fallback=True) + - Device(gpu_id=0, dla_core=0, allow_gpu_fallback=True) + - Device(dla_core=0, allow_gpu_fallback=True) + - Device(gpu_id=1) + """ + if len(args) == 1: + if not isinstance(args[0], str): + raise TypeError( + "When specifying Device through positional argument, argument must be str" + ) + else: + (self.device_type, id) = Device._parse_device_str(args[0]) + if self.device_type == _enums.DeviceType.GPU: + self.gpu_id = id + else: + self.dla_core = id + self.gpu_id = 0 + logging.log( + logging.Level.Warning, + "Setting GPU id to 0 for device because device 0 manages DLA on Xavier", + ) + + elif len(args) == 0: + if "gpu_id" in kwargs or "dla_core" in kwargs: + if "dla_core" in kwargs: + self.device_type = _enums.DeviceType.DLA + self.dla_core = kwargs["dla_core"] + if "gpu_id" in kwargs: + self.gpu_id = kwargs["gpu_id"] + else: + self.gpu_id = 0 + logging.log( + logging.Level.Warning, + "Setting GPU id to 0 for device because device 0 manages DLA on Xavier", + ) + else: + self.gpu_id = kwargs["gpu_id"] + self.device_type = _enums.DeviceType.GPU + else: + raise ValueError( + "Either gpu_id or dla_core or both must be defined if no string with device specs is provided as an arg" + ) + + else: + raise ValueError( + "Unexpected number of positional arguments for class Device \n Found {} arguments, expected either zero or a single positional arguments".format( + len(args) + ) + ) + + if "allow_gpu_fallback" in kwargs: + if not isinstance(kwargs["allow_gpu_fallback"], bool): + raise TypeError("allow_gpu_fallback must be a bool") + self.allow_gpu_fallback = kwargs["allow_gpu_fallback"]
+ + def __str__(self) -> str: + return ( + "Device(type={}, gpu_id={}".format(self.device_type, self.gpu_id) + ")" + if self.device_type == _enums.DeviceType.GPU + else ", dla_core={}, allow_gpu_fallback={}".format( + self.dla_core, self.allow_gpu_fallback + ) + ) + + def _to_internal(self) -> _C.Device: + internal_dev = _C.Device() + internal_dev.device_type = self.device_type + internal_dev.gpu_id = self.gpu_id + internal_dev.dla_core = self.dla_core + internal_dev.allow_gpu_fallback = self.allow_gpu_fallback + return internal_dev + + @classmethod + def _from_torch_device(cls, torch_dev: torch.device): + if torch_dev.type != "cuda": + raise ValueError('Torch Device specs must have type "cuda"') + gpu_id = torch_dev.index + return cls(gpu_id=gpu_id) + + @classmethod + def _current_device(cls): + try: + dev = _C._get_current_device() + except RuntimeError: + logging.log(logging.Level.Error, "Cannot get current device") + return None + return cls(gpu_id=dev.gpu_id) + + @staticmethod + def _parse_device_str(s): + s = s.lower() + spec = s.split(":") + if spec[0] == "gpu" or spec[0] == "cuda": + return (_enums.DeviceType.GPU, int(spec[1])) + elif spec[0] == "dla": + return (_enums.DeviceType.DLA, int(spec[1]))
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2022, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_modules/torch_tensorrt/_Input.html b/docs/v1.2.0/_modules/torch_tensorrt/_Input.html new file mode 100644 index 0000000000..6d60bb5295 --- /dev/null +++ b/docs/v1.2.0/_modules/torch_tensorrt/_Input.html @@ -0,0 +1,925 @@ + + + + + + + + + + + + torch_tensorrt._Input — Torch-TensorRT v1.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt._Input

+from enum import Enum
+from typing import List, Dict, Any
+
+import torch
+
+from torch_tensorrt import _enums
+from torch_tensorrt import _C
+
+
+
[docs]class Input(object): + """ + Defines an input to a module in terms of expected shape, data type and tensor format. + + Attributes: + shape_mode (torch_tensorrt.Input._ShapeMode): Is input statically or dynamically shaped + shape (Tuple or Dict): Either a single Tuple or a dict of tuples defining the input shape. + Static shaped inputs will have a single tuple. Dynamic inputs will have a dict of the form + ``{ + "min_shape": Tuple, + "opt_shape": Tuple, + "max_shape": Tuple + }`` + dtype (torch_tensorrt.dtype): The expected data type of the input tensor (default: torch_tensorrt.dtype.float32) + format (torch_tensorrt.TensorFormat): The expected format of the input tensor (default: torch_tensorrt.TensorFormat.NCHW) + """ + + class _ShapeMode(Enum): + STATIC = 0 + DYNAMIC = 1 + + shape_mode = None #: (torch_tensorrt.Input._ShapeMode): Is input statically or dynamically shaped + shape = None #: (Tuple or Dict): Either a single Tuple or a dict of tuples defining the input shape. Static shaped inputs will have a single tuple. Dynamic inputs will have a dict of the form ``{ "min_shape": Tuple, "opt_shape": Tuple, "max_shape": Tuple }`` + dtype = ( + _enums.dtype.unknown + ) #: The expected data type of the input tensor (default: torch_tensorrt.dtype.float32) + _explicit_set_dtype = False + format = ( + _enums.TensorFormat.contiguous + ) #: The expected format of the input tensor (default: torch_tensorrt.TensorFormat.NCHW) + +
[docs] def __init__(self, *args, **kwargs): + """__init__ Method for torch_tensorrt.Input + + Input accepts one of a few construction patterns + + Args: + shape (Tuple or List, optional): Static shape of input tensor + + Keyword Arguments: + shape (Tuple or List, optional): Static shape of input tensor + min_shape (Tuple or List, optional): Min size of input tensor's shape range + Note: All three of min_shape, opt_shape, max_shape must be provided, there must be no positional arguments, shape must not be defined and implictly this sets Input's shape_mode to DYNAMIC + opt_shape (Tuple or List, optional): Opt size of input tensor's shape range + Note: All three of min_shape, opt_shape, max_shape must be provided, there must be no positional arguments, shape must not be defined and implictly this sets Input's shape_mode to DYNAMIC + max_shape (Tuple or List, optional): Max size of input tensor's shape range + Note: All three of min_shape, opt_shape, max_shape must be provided, there must be no positional arguments, shape must not be defined and implictly this sets Input's shape_mode to DYNAMIC + dtype (torch.dtype or torch_tensorrt.dtype): Expected data type for input tensor (default: torch_tensorrt.dtype.float32) + format (torch.memory_format or torch_tensorrt.TensorFormat): The expected format of the input tensor (default: torch_tensorrt.TensorFormat.NCHW) + + Examples: + - Input([1,3,32,32], dtype=torch.float32, format=torch.channel_last) + - Input(shape=(1,3,32,32), dtype=torch_tensorrt.dtype.int32, format=torch_tensorrt.TensorFormat.NCHW) + - Input(min_shape=(1,3,32,32), opt_shape=[2,3,32,32], max_shape=(3,3,32,32)) #Implicitly dtype=torch_tensorrt.dtype.float32, format=torch_tensorrt.TensorFormat.NCHW + """ + if len(args) == 1: + if not Input._supported_input_size_type(args[0]): + raise TypeError( + "Input shape specifications for inputs are required to be a List, tuple or torch.Size, found type: " + + str(type(args[0])) + ) + if any(k in kwargs for k in ["min_shape", "opt_shape", "max_shape"]): + raise ValueError( + "Found that both shape (as a positional argument), and one or more of min_shape, opt_shape, max_shape were specified\nclass Input expects that only either shape or all three of min_shape, opt_shape, max_shape are defined" + ) + self.shape = tuple(args[0]) + self.shape_mode = Input._ShapeMode.STATIC + + elif len(args) == 0: + if not ("shape" in kwargs) and not ( + all(k in kwargs for k in ["min_shape", "opt_shape", "max_shape"]) + ): + raise ValueError( + "Missing required arguments for class Input\nEither shape or all three of min_shape, opt_shape, max_shape must be defined" + ) + elif ("shape" in kwargs) and all( + k in kwargs for k in ["min_shape", "opt_shape", "max_shape"] + ): + raise ValueError( + "Found that both shape, and one or more of min_shape, opt_shape, max_shape were specified\nclass Input expects that only either shape or all three of min_shape, opt_shape, max_shape are defined" + ) + + if "shape" in kwargs: + if not Input._supported_input_size_type(kwargs["shape"]): + raise TypeError( + "Input shape specifications for inputs are required to be a List, tuple or torch.Size, found type: " + + str(type(kwargs["shape"])) + ) + self.shape = tuple(kwargs["shape"]) + self.shape_mode = Input._ShapeMode.STATIC + else: + if not Input._supported_input_size_type(kwargs["min_shape"]): + raise TypeError( + "Input shape specifications for inputs are required to be a List, tuple or torch.Size, found type: " + + str(type(kwargs["min_shape"])) + + " for min_shape" + ) + if not Input._supported_input_size_type(kwargs["opt_shape"]): + raise TypeError( + "Input shape specifications for inputs are required to be a List, tuple or torch.Size, found type: " + + str(type(kwargs["opt_shape"])) + + " for opt_shape" + ) + if not Input._supported_input_size_type(kwargs["max_shape"]): + raise TypeError( + "Input shape specifications for inputs are required to be a List, tuple or torch.Size, found type: " + + str(type(kwargs["max_shape"])) + + " for max_shape" + ) + + self.shape = { + "min_shape": tuple(kwargs["min_shape"]), + "opt_shape": tuple(kwargs["opt_shape"]), + "max_shape": tuple(kwargs["max_shape"]), + } + self.shape_mode = Input._ShapeMode.DYNAMIC + + else: + raise ValueError( + "Unexpected number of positional arguments for class Input \n Found {} arguments, expected either zero or a single positional arguments".format( + len(args) + ) + ) + + if "dtype" in kwargs: + self.dtype = Input._parse_dtype(kwargs["dtype"]) + self._explicit_set_dtype = True + + if "format" in kwargs: + self.format = Input._parse_format(kwargs["format"])
+ + def __str__(self) -> str: + if self.shape_mode == Input._ShapeMode.STATIC: + return "Input(shape={}, dtype={}, format={})".format( + self.shape, str(self.dtype), str(self.format) + ) + elif self.shape_mode == Input._ShapeMode.DYNAMIC: + return "Input(min_shape={}, opt_shape={}, max_shape={}, dtype={}, format={})".format( + self.shape["min_shape"], + self.shape["opt_shape"], + self.shape["max_shape"], + str(self.dtype), + str(self.format), + ) + else: + raise RuntimeError("Unknown input shape mode") + + def _to_internal(self) -> _C.Input: + internal_in = _C.Input() + if self.shape_mode == Input._ShapeMode.DYNAMIC: + if not Input._supported_input_size_type(self.shape["min_shape"]): + raise TypeError( + "Input shape specifications for inputs are required to be a List, tuple or torch.Size, found type: " + + str(type(self.shape["min_shape"])) + + " for min_shape" + ) + else: + internal_in.min = self.shape["min_shape"] + + if not Input._supported_input_size_type(self.shape["opt_shape"]): + raise TypeError( + "Input shape specifications for inputs are required to be a List, tuple or torch.Size, found type: " + + str(type(self.shape["opt_shape"])) + + " for opt_shape" + ) + else: + internal_in.opt = self.shape["opt_shape"] + + if not Input._supported_input_size_type(self.shape["max_shape"]): + raise TypeError( + "Input shape specifications for inputs are required to be a List, tuple or torch.Size, found type: " + + str(type(self.shape["max_shape"])) + + " for max_shape" + ) + else: + internal_in.max = self.shape["max_shape"] + internal_in.input_is_dynamic = True + else: + if not Input._supported_input_size_type(self.shape): + raise TypeError( + "Input shape specifications for inputs are required to be a List, tuple or torch.Size, found type: " + + str(type(self.shape)) + + " for shape" + ) + else: + internal_in.opt = self.shape + internal_in.input_is_dynamic = False + + if self.dtype != _enums.dtype.unknown: + self._explicit_set_dtype = True + else: + self._explicit_set_dtype = False + + internal_in.dtype = Input._parse_dtype(self.dtype) + internal_in._explicit_set_dtype = self._explicit_set_dtype + internal_in.format = Input._parse_format(self.format) + return internal_in + + @staticmethod + def _supported_input_size_type(input_size: Any) -> bool: + if isinstance(input_size, torch.Size): + return True + elif isinstance(input_size, tuple): + return True + elif isinstance(input_size, list): + return True + else: + return False + + @staticmethod + def _parse_dtype(dtype: Any) -> _enums.dtype: + if isinstance(dtype, torch.dtype): + if dtype == torch.int32: + return _enums.dtype.int32 + elif dtype == torch.half: + return _enums.dtype.half + elif dtype == torch.float: + return _enums.dtype.float + elif dtype == torch.bool: + return _enums.dtype.bool + else: + raise TypeError( + "Provided an unsupported data type as an input data type (support: bool, int32, half, float), got: " + + str(dtype) + ) + + elif isinstance(dtype, _enums.dtype): + return dtype + + else: + raise TypeError( + "Input data type needs to be specified with a torch.dtype or a torch_tensorrt.dtype, got: " + + str(type(dtype)) + ) + + @staticmethod + def _parse_format(format: Any) -> _enums.TensorFormat: + if isinstance(format, torch.memory_format): + if format == torch.contiguous_format: + return _enums.TensorFormat.contiguous + elif format == torch.channels_last: + return _enums.TensorFormat.channels_last + else: + raise ValueError( + "Provided an unsupported tensor format (support: NHCW/contiguous_format, NHWC/channel_last)" + ) + + elif isinstance(format, _enums.TensorFormat): + return format + + else: + raise TypeError( + "Tensor format needs to be specified with either torch.memory_format or torch_tensorrt.TensorFormat" + ) + + @classmethod + def _from_tensor(cls, t: torch.Tensor): + if not any( + [ + t.is_contiguous(memory_format=torch.contiguous_format), + t.is_contiguous(memory_format=torch.channels_last), + ] + ): + raise ValueError( + "Tensor does not have a supported contiguous memory format, supported formats are contiguous or channel_last" + ) + frmt = ( + torch.contiguous_format + if t.is_contiguous(memory_format=torch.contiguous_format) + else torch.channels_last + ) + return cls(shape=t.shape, dtype=t.dtype, format=frmt)
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2022, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_modules/torch_tensorrt/_compile.html b/docs/v1.2.0/_modules/torch_tensorrt/_compile.html new file mode 100644 index 0000000000..dfe66cbf3c --- /dev/null +++ b/docs/v1.2.0/_modules/torch_tensorrt/_compile.html @@ -0,0 +1,856 @@ + + + + + + + + + + + + torch_tensorrt._compile — Torch-TensorRT v1.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt._compile

+from typing import List, Dict, Any
+from torch_tensorrt import _enums
+import torch_tensorrt.ts
+from torch_tensorrt import logging
+import torch
+import torch.fx
+from enum import Enum
+
+import torch_tensorrt.fx
+from torch_tensorrt.fx.utils import LowerPrecision
+
+
+class _IRType(Enum):
+    """Enum to set the minimum required logging level to print a message to stdout"""
+
+    ts = 0
+    fx = 1
+
+
+class _ModuleType(Enum):
+    """Enum to set the minimum required logging level to print a message to stdout"""
+
+    nn = 0
+    ts = 1
+    fx = 2
+
+
+def _parse_module_type(module: Any) -> _ModuleType:
+    if any(
+        isinstance(module, t)
+        for t in [torch.jit.ScriptModule, torch.jit.ScriptFunction]
+    ):
+        return _ModuleType.ts
+    elif isinstance(module, torch.fx.GraphModule):
+        return _ModuleType.fx
+    elif isinstance(module, torch.nn.Module):
+        return _ModuleType.nn
+    else:
+        raise RuntimeError("Module is an unknown format")
+
+
+def _get_target_ir(module_type: _ModuleType, ir: str) -> _IRType:
+    module_is_tsable = any([module_type == t for t in [_ModuleType.nn, _ModuleType.ts]])
+    module_is_fxable = any([module_type == t for t in [_ModuleType.nn, _ModuleType.fx]])
+
+    ir_targets_torchscript = any([ir == opt for opt in ["torchscript", "ts"]])
+    ir_targets_fx = ir == "fx"
+
+    if module_is_tsable and ir_targets_torchscript:
+        return _IRType.ts
+    elif module_is_fxable and ir_targets_fx:
+        return _IRType.fx
+    else:
+        if ir == "default":
+            # Options are listed in order of preference
+            if module_is_tsable:
+                logging.log(
+                    logging.Level.Info, "ir was set to default, using TorchScript as ir"
+                )
+                return _IRType.ts
+            elif module_is_fxable:
+                raise ValueError(
+                    "Was given a torch.fx.GraphModule, fx is not currently supported by Torch-TensorRT"
+                )
+                # logging.log(logging.Level.Info, "ir was set to default, using TorchScript as fx")
+                # return _IRType.fx
+            else:
+                raise ValueError("Module was provided with in an unsupported format")
+        else:
+            raise ValueError("Unknown ir was requested")
+
+
+
[docs]def compile( + module: Any, + ir="default", + inputs=[], + enabled_precisions=set([_enums.dtype.float]), + **kwargs, +): + """Compile a PyTorch module for NVIDIA GPUs using TensorRT + + Takes a existing PyTorch module and a set of settings to configure the compiler + and using the path specified in ``ir`` lower and compile the module to TensorRT + returning a PyTorch Module back + + Converts specifically the forward method of a Module + + Arguments: + module (Union(torch.nn.Module,torch.jit.ScriptModule): Source module + + Keyword Arguments: + inputs (List[Union(torch_tensorrt.Input, torch.Tensor)]): **Required** List of specifications of input shape, dtype and memory layout for inputs to the module. This argument is required. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using + torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum + to select device type. :: + + input=[ + torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1 + torch_tensorrt.Input( + min_shape=(1, 224, 224, 3), + opt_shape=(1, 512, 512, 3), + max_shape=(1, 1024, 1024, 3), + dtype=torch.int32 + format=torch.channel_last + ), # Dynamic input shape for input #2 + torch.randn((1, 3, 224, 244)) # Use an example tensor and let torch_tensorrt infer settings + ] + + enabled_precision (Set(Union(torch.dtype, torch_tensorrt.dtype))): The set of datatypes that TensorRT can use when selecting kernels + ir (str): The requested strategy to compile. (Options: default - Let Torch-TensorRT decide, ts - TorchScript with scripting path) + **kwargs: Additional settings for the specific requested strategy (See submodules for more info) + + Returns: + torch.nn.Module: Compiled Module, when run it will execute via TensorRT + """ + module_type = _parse_module_type(module) + target_ir = _get_target_ir(module_type, ir) + if target_ir == _IRType.ts: + ts_mod = module + if module_type == _ModuleType.nn: + logging.log( + logging.Level.Info, + "Module was provided as a torch.nn.Module, trying to script the module with torch.jit.script. In the event of a failure please preconvert your module to TorchScript", + ) + ts_mod = torch.jit.script(module) + return torch_tensorrt.ts.compile( + ts_mod, inputs=inputs, enabled_precisions=enabled_precisions, **kwargs + ) + elif target_ir == _IRType.fx: + if ( + torch.float16 in enabled_precisions + or torch_tensorrt.dtype.half in enabled_precisions + ): + lower_precision = LowerPrecision.FP16 + elif ( + torch.float32 in enabled_precisions + or torch_tensorrt.dtype.float in enabled_precisions + ): + lower_precision = LowerPrecision.FP32 + else: + raise ValueError(f"Precision {enabled_precisions} not supported on FX") + + return torch_tensorrt.fx.compile( + module, + inputs, + lower_precision=lower_precision, + max_batch_size=inputs[0].size(0), + explicit_batch_dimension=True, + dynamic_batch=False, + ) + else: + raise RuntimeError("Module is an unknown format or the ir requested is unknown")
+ + +
[docs]def convert_method_to_trt_engine( + module: Any, + method_name: str, + ir="default", + inputs=[], + enabled_precisions=set([_enums.dtype.float]), + **kwargs, +): + """Convert a TorchScript module method to a serialized TensorRT engine + + Converts a specified method of a module to a serialized TensorRT engine given a dictionary of conversion settings + + Arguments: + module (Union(torch.nn.Module,torch.jit.ScriptModule): Source module + + Keyword Arguments: + inputs (List[Union(torch_tensorrt.Input, torch.Tensor)]): **Required** List of specifications of input shape, dtype and memory layout for inputs to the module. This argument is required. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using + torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum + to select device type. :: + + input=[ + torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1 + torch_tensorrt.Input( + min_shape=(1, 224, 224, 3), + opt_shape=(1, 512, 512, 3), + max_shape=(1, 1024, 1024, 3), + dtype=torch.int32 + format=torch.channel_last + ), # Dynamic input shape for input #2 + torch.randn((1, 3, 224, 244)) # Use an example tensor and let torch_tensorrt infer settings + ] + + enabled_precision (Set(Union(torch.dtype, torch_tensorrt.dtype))): The set of datatypes that TensorRT can use when selecting kernels + ir (str): The requested strategy to compile. (Options: default - Let Torch-TensorRT decide, ts - TorchScript with scripting path) + **kwargs: Additional settings for the specific requested strategy (See submodules for more info) + Returns: + bytes: Serialized TensorRT engine, can either be saved to a file or deserialized via TensorRT APIs + """ + module_type = _parse_module_type(module) + target_ir = _get_target_ir(module_type, ir) + if target_ir == _IRType.ts: + ts_mod = module + if module_type == _ModuleType.nn: + logging.log( + logging.Level.Info, + "Module was provided as a torch.nn.Module, trying to script the module with torch.jit.script. In the event of a failure please preconvert your module to TorchScript", + ) + ts_mod = torch.jit.script(module) + return torch_tensorrt.ts.convert_method_to_trt_engine( + ts_mod, + method_name, + inputs=inputs, + enabled_precisions=enabled_precisions, + **kwargs, + ) + elif target_ir == _IRType.fx: + raise RuntimeError("fx is currently not supported") + else: + raise RuntimeError("Module is an unknown format or the ir requested is unknown")
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2022, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_modules/torch_tensorrt/_util.html b/docs/v1.2.0/_modules/torch_tensorrt/_util.html new file mode 100644 index 0000000000..0098653b0f --- /dev/null +++ b/docs/v1.2.0/_modules/torch_tensorrt/_util.html @@ -0,0 +1,676 @@ + + + + + + + + + + + + torch_tensorrt._util — Torch-TensorRT v1.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt._util

+from torch_tensorrt import __version__
+from torch_tensorrt import _C
+
+import torch
+
+
+
[docs]def dump_build_info(): + """Prints build information about the torch_tensorrt distribution to stdout""" + print(get_build_info())
+ + +
[docs]def get_build_info() -> str: + """Returns a string containing the build information of torch_tensorrt distribution + + Returns: + str: String containing the build information for torch_tensorrt distribution + """ + build_info = _C.get_build_info() + build_info = ( + "Torch-TensorRT Version: " + + str(__version__) + + "\n" + + "Using PyTorch Version: " + + str(torch.__version__) + + "\n" + + build_info + ) + return build_info
+ + +
[docs]def set_device(gpu_id): + _C.set_device(gpu_id)
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2022, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_modules/torch_tensorrt/fx/fx2trt.html b/docs/v1.2.0/_modules/torch_tensorrt/fx/fx2trt.html new file mode 100644 index 0000000000..99468887bf --- /dev/null +++ b/docs/v1.2.0/_modules/torch_tensorrt/fx/fx2trt.html @@ -0,0 +1,1019 @@ + + + + + + + + + + + + torch_tensorrt.fx.fx2trt — Torch-TensorRT v1.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt.fx.fx2trt

+import logging
+import warnings
+from datetime import datetime
+from typing import Any, Callable, Dict, List, NamedTuple, Optional, Sequence
+
+import numpy
+
+# @manual=//deeplearning/trt/python:py_tensorrt
+import tensorrt as trt
+import torch
+import torch.fx
+from torch.fx.node import _get_qualified_name
+from torch.fx.passes.shape_prop import TensorMetadata
+
+from .converter_registry import CONVERTERS
+from .input_tensor_spec import InputTensorSpec
+from .observer import Observer
+from .utils import get_dynamic_dims, LowerPrecision, torch_dtype_to_trt
+
+_LOGGER: logging.Logger = logging.getLogger(__name__)
+
+TRT_INTERPRETER_CALL_PRE_OBSERVER: Observer[
+    Callable[[torch.fx.GraphModule], None]
+] = Observer("TRT_INTERPRETER_CALL_PRE_OBSERVER")
+
+
+
[docs]class TRTInterpreterResult(NamedTuple): + engine: Any + input_names: Sequence[str] + output_names: Sequence[str] + serialized_cache: bytearray
+ + +
[docs]class TRTInterpreter(torch.fx.Interpreter): + def __init__( + self, + module: torch.fx.GraphModule, + input_specs: List[InputTensorSpec], + explicit_batch_dimension: bool = False, + explicit_precision: bool = False, + logger_level=None, + ): + super().__init__(module) + + self.logger = trt.Logger(logger_level or trt.Logger.WARNING) + self.builder = trt.Builder(self.logger) + + flag = 0 + if explicit_batch_dimension: + EXPLICIT_BATCH = 1 << (int)( + trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH + ) + flag |= EXPLICIT_BATCH + + if explicit_precision: + EXPLICIT_PRECISION = 1 << (int)( + trt.NetworkDefinitionCreationFlag.EXPLICIT_PRECISION + ) + flag |= EXPLICIT_PRECISION + self.network = self.builder.create_network(flag) + + missing_ops = self.validate_conversion() + if missing_ops: + warnings.warn( + "Interpretation will fail due to missing operations \n" + + "\n".join(f"{i}" for i in missing_ops) + ) + + self.optimization_profiles: Optional[List] = None + self.input_specs = input_specs + self.input_specs_iter = 0 + self.validate_input_specs() + self._cur_node_name: Optional[str] = None + self._input_names: List[str] = [] + self._output_names: List[str] = [] + self._itensor_to_tensor_meta: Dict[ + trt.tensorrt.ITensor, TensorMetadata + ] = dict() + + def validate_input_specs(self): + for shape, _, _, shape_ranges, has_batch_dim in self.input_specs: + if not self.network.has_implicit_batch_dimension: + assert ( + has_batch_dim + ), "It's required to specify batch dimension when it's explicit in TensorRT network." + + dynamic_dims = get_dynamic_dims(shape) + if len(dynamic_dims): + assert not self.network.has_implicit_batch_dimension, ( + "Can't have dynamic dim when " + f"batch dim is implicit, got {shape}." + ) + assert len( + shape_ranges + ), "shape_ranges must be provided when shape has dynamic dim." + + if self.optimization_profiles: + assert len(shape_ranges) == len(self.optimization_profiles), ( + "Number of optimization " + f"profiles {len(self.optimization_profiles)} doesn't match with the number of shape_range" + f" {len(shape_ranges)} provided." + ) + else: + self.optimization_profiles = [ + self.builder.create_optimization_profile() + for _ in range(len(shape_ranges)) + ] + + for shape_range in shape_ranges: + assert ( + len(shape_range) == 3 + ), f"Expect three elements in shape_range, got {len(shape_range)}" + assert all(len(s) == len(shape) for s in shape_range), ( + "Expect elements in shape_range" + f" {shape_range} have the same number of dimension as the provided shape {len(shape)}" + ) + + for i in range(len(shape)): + if i in dynamic_dims: + assert all( + shape_range[j][i] <= shape_range[j + 1][i] + for j in range(2) + ), ( + "Expect dynamic dim" + f" {i} to have incremental value for shapes in shape_range {shape_range}." + ) + else: + assert all(s[i] == shape[i] for s in shape_range), ( + f"Expect non dynamic dim {i} to be the same" + f" for all shapes in shape_range {shape_range}." + ) + else: + assert ( + len(shape_ranges) == 0 + ), "shape_ranges are provided for input that doesn't have dynamic dim." + + def validate_conversion(self): + missing_converter = set() + + for node in self.module.graph.nodes: + if node.op == "call_function" and not CONVERTERS.get(node.target): + missing_converter.add(f"{node.op} {_get_qualified_name(node.target)}") + elif node.op == "call_method" and not CONVERTERS.get(node.target): + missing_converter.add(f"{node.op} torch.Tensor.{node.target}") + elif node.op == "call_module": + submod = self.fetch_attr(node.target) + submod_type = getattr(submod, "_base_class_origin", type(submod)) + if not CONVERTERS.get(submod_type): + missing_converter.add(f"{node.op} {torch.typename(submod_type)}") + + return missing_converter + + def run( + self, + max_batch_size=64, + max_workspace_size=1 << 25, + lower_precision=LowerPrecision.FP16, + sparse_weights=False, + force_fp32_output=False, + strict_type_constraints=False, + algorithm_selector=None, + timing_cache=None, + profiling_verbosity=None, + tactic_sources=None, + ) -> TRTInterpreterResult: + """ + Build TensorRT engine with some configs. + Args: + max_batch_size: set accordingly for maximum batch size you will use. + max_workspace_size: set to the maximum size we can afford for temporary buffer + lower_precision: the precision model layers are running on (TensorRT will choose the best perforamnce precision). + sparse_weights: allow the builder to examine weights and use optimized functions when weights have suitable sparsity + force_fp32_output: force output to be fp32 + strict_type_constraints: Usually we should set it to False unless we want to control the precision of certain layer for numeric reasons. + algorithm_selector: set up algorithm selection for certain layer + timing_cache: enable timing cache for TensorRT + profiling_verbosity: TensorRT logging level + Return: + TRTInterpreterResult + """ + TRT_INTERPRETER_CALL_PRE_OBSERVER.observe(self.module) + + # For float outputs, we set their dtype to fp16 only if lower_precision == LowerPrecision.FP16 and + # force_fp32_output=False. + self.output_fp16 = ( + not force_fp32_output and lower_precision == LowerPrecision.FP16 + ) + + if ( + lower_precision == LowerPrecision.INT8 + and not self.builder.platform_has_fast_int8 + ): + raise RuntimeError("Current platform doesn't support fast native int8!") + + if ( + lower_precision == LowerPrecision.FP16 + and not self.builder.platform_has_fast_fp16 + ): + warnings.warn("Current platform doesn't support fast native fp16!") + + self.input_specs_iter = 0 + run_module_start_time = datetime.now() + super().run() + _LOGGER.info( + f"Run Module elapsed time: {datetime.now() - run_module_start_time}" + ) + build_engine_start_time = datetime.now() + + self.builder.max_batch_size = max_batch_size + builder_config = self.builder.create_builder_config() + builder_config.max_workspace_size = max_workspace_size + + cache = None + if timing_cache: + cache_file = numpy.array(timing_cache) + cache = builder_config.create_timing_cache(cache_file.tobytes()) + else: + cache = builder_config.create_timing_cache(b"") + builder_config.set_timing_cache(cache, False) + + if trt.__version__ >= "8.2": + builder_config.profiling_verbosity = ( + profiling_verbosity + if profiling_verbosity + else trt.ProfilingVerbosity.LAYER_NAMES_ONLY + ) + if lower_precision == LowerPrecision.FP16: + builder_config.set_flag(trt.BuilderFlag.FP16) + + if lower_precision == LowerPrecision.INT8: + builder_config.set_flag(trt.BuilderFlag.INT8) + + if sparse_weights: + builder_config.set_flag(trt.BuilderFlag.SPARSE_WEIGHTS) + + if strict_type_constraints: + builder_config.set_flag(trt.BuilderFlag.STRICT_TYPES) + + if self.optimization_profiles: + for optimization_profile in self.optimization_profiles: + builder_config.add_optimization_profile(optimization_profile) + + if algorithm_selector: + builder_config.set_flag(trt.BuilderFlag.DISABLE_TIMING_CACHE) + builder_config.algorithm_selector = algorithm_selector + + if tactic_sources is not None: + builder_config.set_tactic_sources(tactic_sources=tactic_sources) + + engine = self.builder.build_engine(self.network, builder_config) + assert engine + + serialized_cache = ( + bytearray(cache.serialize()) + if builder_config.get_timing_cache() + else bytearray() + ) + _LOGGER.info( + f"Build TRT engine elapsed time: {datetime.now() - build_engine_start_time}" + ) + + return TRTInterpreterResult( + engine, self._input_names, self._output_names, serialized_cache + ) + + def run_node(self, n): + self._cur_node_name = str(n) + # add "_itensor_to_tensor_meta" + kwargs = dict(n.kwargs) + kwargs["_itensor_to_tensor_meta"] = self._itensor_to_tensor_meta + n.kwargs = kwargs + + # run the node + trt_node = super().run_node(n) + + # remove "_itensor_to_tensor_meta" + kwargs = dict(n.kwargs) + del kwargs["_itensor_to_tensor_meta"] + n.kwargs = kwargs + + if isinstance(trt_node, trt.tensorrt.ITensor): + self._itensor_to_tensor_meta[trt_node] = n.meta.get("tensor_meta") + + return trt_node + + def placeholder(self, target, args, kwargs): + self._input_names.append(target) + shape, dtype, _, shape_ranges, has_batch_dim = self.input_specs[ + self.input_specs_iter + ] + self.input_specs_iter += 1 + + if self.network.has_implicit_batch_dimension: + if has_batch_dim: + shape = shape[1:] + else: + for i, shape_range in enumerate(shape_ranges): + assert self.optimization_profiles + self.optimization_profiles[i].set_shape(target, *shape_range) + + return self.network.add_input( + name=target, shape=tuple(shape), dtype=torch_dtype_to_trt(dtype) + ) + + def call_module(self, target, args, kwargs): + assert isinstance(target, str) + submod = self.fetch_attr(target) + submod_type = getattr(submod, "_base_class_origin", type(submod)) + converter = CONVERTERS.get(submod_type) + + if not converter: + raise RuntimeError( + f"Conversion of module of type {submod_type} not currently supported!" + ) + + assert self._cur_node_name is not None + return converter(self.network, submod, args, kwargs, self._cur_node_name) + + def call_function(self, target, args, kwargs): + converter = CONVERTERS.get(target) + + if not converter: + raise RuntimeError( + f"Conversion of function {torch.typename(target)} not currently supported!" + ) + + assert self._cur_node_name is not None + return converter(self.network, target, args, kwargs, self._cur_node_name) + + def call_method(self, target, args, kwargs): + assert isinstance(target, str) + converter = CONVERTERS.get(target) + + if not converter: + raise RuntimeError( + f"Conversion of method {target} not currently supported!" + ) + + assert self._cur_node_name is not None + return converter(self.network, target, args, kwargs, self._cur_node_name) + + def output(self, target, args, kwargs): + assert len(args) == 1 + outputs = args[0] if isinstance(args[0], tuple) else (args[0],) + + if not all(isinstance(output, trt.tensorrt.ITensor) for output in outputs): + raise RuntimeError("TensorRT requires all outputs to be Tensor!") + + for i, output in enumerate(outputs): + if any( + op_name in output.name.split("_") + for op_name in ( + "eq", + "gt", + "lt", + "or", + "xor", + "and", + "not", + "ne", + "isinf", + "any", + ) + ): + output_bool = True + else: + output_bool = False + name = f"output{i}" + output.name = name + self.network.mark_output(output) + if output_bool: + output.dtype = trt.bool + elif self.output_fp16 and output.dtype == trt.float32: + output.dtype = trt.float16 + self._output_names.append(name)
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2022, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_modules/torch_tensorrt/fx/input_tensor_spec.html b/docs/v1.2.0/_modules/torch_tensorrt/fx/input_tensor_spec.html new file mode 100644 index 0000000000..e3abdc42c5 --- /dev/null +++ b/docs/v1.2.0/_modules/torch_tensorrt/fx/input_tensor_spec.html @@ -0,0 +1,829 @@ + + + + + + + + + + + + torch_tensorrt.fx.input_tensor_spec — Torch-TensorRT v1.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt.fx.input_tensor_spec

+from typing import Iterable, List, NamedTuple, Optional, Sequence, Tuple
+
+import torch
+
+from .types import Shape, ShapeRange
+from .utils import get_dynamic_dims
+
+
+def generate_input_specs(inputs, lower_setting, additional_inputs=None):
+    # dynamic_batch is TRT only flag.
+    if (
+        not lower_setting.explicit_batch_dimension
+        or lower_setting.dynamic_batch is False
+    ):
+        return InputTensorSpec.from_tensors(inputs)
+
+    # If we don't have additional inputs, we assume the first dimension
+    # is the dynamic batch dimension. Otherwise, we use the additional
+    # inputs to determine the batch dimension.
+    if additional_inputs is None:
+        return InputTensorSpec.from_tensors_with_dynamic_batch_size(
+            inputs,
+            (
+                0,
+                lower_setting.max_batch_size,
+                lower_setting.max_batch_size,
+            ),
+            lower_setting.opt_profile_replica,
+        )
+    else:
+        batch_dims = []
+
+        for i, j in zip(inputs, additional_inputs):
+            found_batch_dim = False
+
+            for idx, values in enumerate(zip(i.shape, j.shape)):
+                if values[0] != values[1]:
+                    assert (
+                        found_batch_dim is False
+                    ), f"We've already found a batch dim, {i.shape}, {j.shape}."
+                    batch_dims.append(idx)
+                    found_batch_dim = True
+
+            if not found_batch_dim:
+                raise RuntimeError(
+                    f"Failed to find batch dimension because shapes are the same, {i.shape}"
+                )
+
+        return InputTensorSpec.from_tensors_with_dynamic_batch_size(
+            inputs,
+            (
+                0,
+                lower_setting.max_batch_size,
+                lower_setting.max_batch_size,
+            ),
+            lower_setting.opt_profile_replica,
+            batch_dims,
+        )
+
+
+
[docs]class InputTensorSpec(NamedTuple): + """ + This class contains the information of a input tensor. + + shape: shape of the tensor. + + dtype: dtyep of the tensor. + + device: device of the tensor. This is only used to generate inputs to the given model + in order to run shape prop. For TensorRT engine, inputs have to be on cuda device. + + shape_ranges: If dynamic shape is needed (shape has dimensions of -1), then this field + has to be provided (default is empty list). Every shape_range is a tuple of three + tuples ((min_input_shape), (optimized_input_shape), (max_input_shape)). Each shape_range + is used to populate a TensorRT optimization profile. + e.g. If the input shape varies from (1, 224) to (100, 224) and we want to optimize + for (25, 224) because it's the most common input shape, then we set shape_ranges to + ((1, 224), (25, 225), (100, 224)). + + has_batch_dim: Whether the shape includes batch dimension. Batch dimension has to be provided + if the engine want to run with dynamic shape. + """ + + shape: Shape + dtype: torch.dtype + device: torch.device = torch.device("cpu") + shape_ranges: List[ShapeRange] = [] + has_batch_dim: bool = True + + @classmethod + def from_tensor(cls, tensor: torch.Tensor) -> "InputTensorSpec": + """ + Produce an InputTenosrSpec named tuple which contains the + information of the given PyTorch tensor. + + Args: + tensor (torch.Tensor): A PyTorch tensor. + + Returns: + An InputTensorSpec named tuple. + """ + return cls(tensor.shape, tensor.dtype, tensor.device) + + @classmethod + def from_tensors(cls, tensors: Sequence[torch.Tensor]) -> List["InputTensorSpec"]: + """ + Produce a list of InputTenosrSpec named tuples which contain + the information of all the given PyTorch tensors. + + Args: + tensors (Iterable[torch.Tensor]): A list of PyTorch tensors. + + Returns: + A list of InputTensorSpec named tuples. + """ + assert isinstance(tensors, (list, tuple)) + return [cls.from_tensor(t) for t in tensors] + + @classmethod + def from_tensors_with_dynamic_batch_size( + cls, + tensors: Sequence[torch.Tensor], + batch_size_range: Tuple[int, int, int], + opt_profile_replica: int = 1, + batch_dims: Optional[List[int]] = None, + ) -> List["InputTensorSpec"]: + """ + Produce a list of InputTenosrSpec named tuples which would contain + the information of all the given PyTorch tensors. The produced input + tensor specs will treat all tensors' first dimension as batch dimension + and mark them as dynmaic. + + Args: + tensors (Sequence[torch.Tensor]): A list of PyTorch tensors. + batch_size_range (Tuple[int, int, int]): The first integer indicates + the smallest batch size allowed. The second integer indiceates + the batch size that we'll optimize for. The third integer indicates + the largest batch size allowed. + opt_profile_replica (int): If dynamic shape is enabled, each execution + context requires a different optimization profile. This arg determines + how many optimization profile replicas we want to produce. + batch_dims (Optional[List[int]]): The batch dim might not be the leading dim + and allow user to specify the batch dims using this arg. Default we treat + dim 0 as the batch dim. + + Returns: + A list of InputTensorSpec named tuples with dynamic ranges. + """ + if batch_dims is None: + batch_dims = [0] * len(tensors) + + input_specs = [] + batch_size = tensors[0].size(batch_dims[0]) + + for i, tensor in enumerate(tensors): + batch_dim = batch_dims[i] + assert batch_size == tensor.size( + batch_dim + ), f"The {i}th tensor (shape: {tensor.shape}) doesn't have the correct batch size: {batch_size}." + shape = list(tensor.shape) + shape[batch_dim] = -1 + shape_ranges: List[ShapeRange] = [tuple(tuple(shape[0:batch_dim] + [bs] + shape[batch_dim + 1 :]) for bs in batch_size_range)] * opt_profile_replica # type: ignore[list-item] + input_specs.append( + cls(tuple(shape), tensor.dtype, tensor.device, shape_ranges) + ) + + return input_specs + + def to_random_tensor(self): + shape = tuple(self.shape) + if len(get_dynamic_dims(shape)): + shape = tuple(self.shape_ranges[0][1]) + elif not self.has_batch_dim: + shape = (1,) + tuple(shape) + + return torch.randn(shape).to(dtype=self.dtype, device=self.device) + + @staticmethod + def create_inputs_from_specs(input_specs: Iterable["InputTensorSpec"]): + inputs = [] + + for spec in input_specs: + inputs.append(spec.to_random_tensor()) + + return inputs
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2022, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_modules/torch_tensorrt/fx/lower.html b/docs/v1.2.0/_modules/torch_tensorrt/fx/lower.html new file mode 100644 index 0000000000..b3ebfbf1cb --- /dev/null +++ b/docs/v1.2.0/_modules/torch_tensorrt/fx/lower.html @@ -0,0 +1,893 @@ + + + + + + + + + + + + torch_tensorrt.fx.lower — Torch-TensorRT v1.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt.fx.lower

+import dataclasses as dc
+import logging
+from typing import Any, Callable, Optional, Sequence
+
+# @manual=//deeplearning/trt/python:py_tensorrt
+import tensorrt as trt
+import torch
+import torch.fx as fx
+import torch.nn as nn
+from torch.fx.passes.splitter_base import SplitResult
+
+from .fx2trt import TRTInterpreter, TRTInterpreterResult
+from .lower_setting import LowerSetting
+from .passes.lower_pass_manager_builder import LowerPassManagerBuilder
+from .passes.pass_utils import decorate_method, PassFunc, validate_inference
+from .tools.timing_cache_utils import TimingCacheManager
+from .tools.trt_splitter import TRTSplitter, TRTSplitterSetting
+
+from .tracer.acc_tracer import acc_tracer
+from .trt_module import TRTModule
+from .utils import LowerPrecision
+
+logger = logging.getLogger(__name__)
+
+Input = Sequence[Any]
+
+
+
[docs]def compile( + module: nn.Module, + input, + max_batch_size: int = 2048, + max_workspace_size=1 << 25, + explicit_batch_dimension=False, + lower_precision=LowerPrecision.FP16, + verbose_log=False, + timing_cache_prefix="", + save_timing_cache=False, + cuda_graph_batch_size=-1, + dynamic_batch=True, +) -> nn.Module: + """ + Takes in original module, input and lowering setting, run lowering workflow to turn module + into lowered module, or so called TRTModule. + + Args: + module: Original module for lowering. + input: Input for module. + max_batch_size: Maximum batch size (must be >= 1 to be set, 0 means not set) + max_workspace_size: Maximum size of workspace given to TensorRT. + explicit_batch_dimension: Use explicit batch dimension in TensorRT if set True, otherwise use implicit batch dimension. + lower_precision: lower_precision config given to TRTModule. + verbose_log: Enable verbose log for TensorRT if set True. + timing_cache_prefix: Timing cache file name for timing cache used by fx2trt. + save_timing_cache: Update timing cache with current timing cache data if set to True. + cuda_graph_batch_size: Cuda graph batch size, default to be -1. + dynamic_batch: batch dimension (dim=0) is dynamic. + Returns: + A torch.nn.Module lowered by TensorRT. + """ + lower_setting = LowerSetting( + max_batch_size=max_batch_size, + max_workspace_size=max_workspace_size, + explicit_batch_dimension=explicit_batch_dimension, + lower_precision=lower_precision, + verbose_log=verbose_log, + timing_cache_prefix=timing_cache_prefix, + save_timing_cache=save_timing_cache, + cuda_graph_batch_size=cuda_graph_batch_size, + dynamic_batch=dynamic_batch, + ) + lowerer = Lowerer.create(lower_setting=lower_setting) + return lowerer(module, input)
+ + +@dc.dataclass +class LowerTrtInterpreter: + lower_setting: LowerSetting + timing_cache_manager: TimingCacheManager + + @classmethod + def create(cls, lower_setting): + timing_cache_manager = TimingCacheManager( + lower_setting.timing_cache_prefix, lower_setting.save_timing_cache + ) + return LowerTrtInterpreter(lower_setting, timing_cache_manager) + + def __call__(self, mod, input, split_name) -> TRTInterpreterResult: + assert self.lower_setting.input_specs, "Can't find input specs for lowering!" + logger.info( + f"split_name={split_name}, input_specs={self.lower_setting.input_specs}" + ) + + # Prepare algorithm selector and timing_cache for TRTInterpreter + algo_selector = None + if self.lower_setting.algo_selector: + algo_selector = self.lower_setting.algo_selector(f"{split_name}.json") + cache_data = None + if self.timing_cache_manager: + try: + cache_data = self.timing_cache_manager.get_timing_cache_trt(split_name) + except Exception as e: + logger.warning(f"Cannot load timing cache for {split_name}: {str(e)}") + cache_data = None + + interpreter = TRTInterpreter( + mod, + input_specs=self.lower_setting.input_specs, + explicit_batch_dimension=self.lower_setting.explicit_batch_dimension, + explicit_precision=self.lower_setting.explicit_precision, + logger_level=trt.Logger.VERBOSE + if self.lower_setting.verbose_log + else trt.Logger.WARNING, + ) + + interp_result: TRTInterpreterResult = interpreter.run( + max_batch_size=self.lower_setting.max_batch_size, + max_workspace_size=self.lower_setting.max_workspace_size, + lower_precision=self.lower_setting.lower_precision, + strict_type_constraints=self.lower_setting.strict_type_constraints, + algorithm_selector=algo_selector, + timing_cache=cache_data, + profiling_verbosity=trt.ProfilingVerbosity.DETAILED + if self.lower_setting.verbose_profile + else trt.ProfilingVerbosity.LAYER_NAMES_ONLY, + tactic_sources=self.lower_setting.tactic_sources, + ) + + # Update timing cache file if needed + timing_cache = interp_result.serialized_cache + if timing_cache and self.timing_cache_manager: + self.timing_cache_manager.update_timing_cache(split_name, timing_cache) + + return interp_result + + +def default_split_function( + model: fx.GraphModule, inputs: Input, lower_setting: LowerSetting +) -> SplitResult: + splitter_setting = TRTSplitterSetting() + splitter_setting.use_implicit_batch_dim = not lower_setting.explicit_batch_dimension + splitter_setting.min_acc_module_size = lower_setting.min_acc_module_size + splitter = TRTSplitter(model, inputs, settings=splitter_setting) + splitter.node_support_preview() + return splitter.generate_split_results() + + +def create_lower_trt_interpreter(lower_setting: LowerSetting) -> LowerTrtInterpreter: + return LowerTrtInterpreter.create(lower_setting) + + +def default_lower_pass( + create_trt_interpreter: Callable[[LowerSetting], LowerTrtInterpreter], +) -> PassFunc: + def lower_pass( + mod: nn.Module, input: Input, lower_setting: LowerSetting, module_name: str + ) -> nn.Module: + """ + Create a module transformation pass which lowers an `fx.GraphModule` into a + `TRTModule` + """ + interpreter = create_trt_interpreter(lower_setting) + interp_res: TRTInterpreterResult = interpreter(mod, input, module_name) + trt_module = TRTModule( + engine=interp_res.engine, + input_names=interp_res.input_names, + output_names=interp_res.output_names, + cuda_graph_batch_size=lower_setting.cuda_graph_batch_size, + ) + return trt_module + + return lower_pass + + +@dc.dataclass(frozen=True) +class Lowerer: + """Lowers a module using fx2trt. + + This is a composable class to facilitate fx2trt. A normal fx2trt process + composes of the following passes to transform an `fx.GraphModule`: + + 1. trace - use torch.fx to trace the module so we can get the graph + representation of the model. + 2. split - the graph module is split into several submodules, + running either via TensorRT, or via regular CUDA. + + For each split that need to run via TRT, the following passes are + invoked: + + 3. `TRTInterpreter` - build the TRT engine for the submodule that + can be supported through `TRTInterpreter`. + 4. Wraps the executable TRT engine into `TRTModule`, which is an `nn.Module`. + 5. The converted submodule is then set back onto the top-level module + + """ + + lower_pass_manager_builder: LowerPassManagerBuilder + + @classmethod + def create( + cls, + lower_setting: LowerSetting, + interpreter_builder: Callable = create_lower_trt_interpreter, + split_func: Callable = default_split_function, + ) -> "Lowerer": + """Instantiate a `Lowerer` instance.""" + + return cls( + lower_pass_manager_builder=LowerPassManagerBuilder( + lower_setting=lower_setting, + trace_func=lambda module, inputs: acc_tracer.trace( + module, + inputs, # type: ignore[arg-type] + ast_rewriter_allow_list=lower_setting.ast_rewriter_allow_list, + leaf_module_list=lower_setting.leaf_module_list, + ), + split_func=split_func, + lower_func=default_lower_pass(interpreter_builder), + ) + ) + + def __call__( + self, + module: nn.Module, + inputs: Input, + additional_inputs: Optional[Input] = None, + ) -> nn.Module: + lower_setting = self.lower_pass_manager_builder.lower_setting + atol = lower_setting.correctness_atol + rtol = lower_setting.correctness_rtol + + @validate_inference(atol=atol, rtol=rtol) + def do_lower(module: nn.Module, inputs: Input) -> nn.Module: + module.eval() + if ( + self.lower_pass_manager_builder.lower_setting.lower_precision + == LowerPrecision.FP16 + ): + module.half() + inputs = tuple( + x.half() if x is not None and x.dtype == torch.float32 else x + for x in inputs + ) + pm = self.lower_pass_manager_builder.build_trt_lower_pipeline( + inputs, additional_inputs + ) + lower_result = pm(module) + return lower_result + + return do_lower(module, inputs) +
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2022, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_modules/torch_tensorrt/fx/trt_module.html b/docs/v1.2.0/_modules/torch_tensorrt/fx/trt_module.html new file mode 100644 index 0000000000..05c275a0cb --- /dev/null +++ b/docs/v1.2.0/_modules/torch_tensorrt/fx/trt_module.html @@ -0,0 +1,883 @@ + + + + + + + + + + + + torch_tensorrt.fx.trt_module — Torch-TensorRT v1.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt.fx.trt_module

+from typing import Any, List, Sequence
+
+# @manual=//deeplearning/trt/python:py_tensorrt
+import tensorrt as trt
+import torch
+
+from .utils import torch_dtype_from_trt
+
+
+
[docs]class TRTModule(torch.nn.Module): + def __init__( + self, engine=None, input_names=None, output_names=None, cuda_graph_batch_size=-1 + ): + super(TRTModule, self).__init__() + self._register_state_dict_hook(TRTModule._on_state_dict) + self.engine = engine + self.input_names = input_names + self.output_names = output_names + self.cuda_graph_batch_size = cuda_graph_batch_size + self.initialized = False + + if engine: + self._initialize() + + def _initialize(self): + self.initialized = True + self.context = self.engine.create_execution_context() + + # Indices of inputs/outputs in the trt engine bindings, in the order + # as they are in the original PyTorch model. + self.input_binding_indices_in_order: Sequence[int] = [ + self.engine.get_binding_index(name) for name in self.input_names + ] + self.output_binding_indices_in_order: Sequence[int] = [ + self.engine.get_binding_index(name) for name in self.output_names + ] + primary_input_outputs = set() + primary_input_outputs.update(self.input_binding_indices_in_order) + primary_input_outputs.update(self.output_binding_indices_in_order) + self.hidden_output_binding_indices_in_order: Sequence[int] = [] + self.hidden_output_names: Sequence[str] = [] + for i in range( + self.engine.num_bindings // self.engine.num_optimization_profiles + ): + if i not in primary_input_outputs: + self.hidden_output_binding_indices_in_order.append(i) + self.hidden_output_names.append(self.engine.get_binding_name(i)) + + assert (self.engine.num_bindings // self.engine.num_optimization_profiles) == ( + len(self.input_names) + + len(self.output_names) + + len(self.hidden_output_names) + ) + + self.input_dtypes: Sequence[torch.dtype] = [ + torch_dtype_from_trt(self.engine.get_binding_dtype(idx)) + for idx in self.input_binding_indices_in_order + ] + self.input_shapes: Sequence[Sequence[int]] = [ + tuple(self.engine.get_binding_shape(idx)) + for idx in self.input_binding_indices_in_order + ] + self.output_dtypes: Sequence[torch.dtype] = [ + torch_dtype_from_trt(self.engine.get_binding_dtype(idx)) + for idx in self.output_binding_indices_in_order + ] + self.output_shapes = [ + tuple(self.engine.get_binding_shape(idx)) + if self.engine.has_implicit_batch_dimension + else tuple() + for idx in self.output_binding_indices_in_order + ] + self.hidden_output_dtypes: Sequence[torch.dtype] = [ + torch_dtype_from_trt(self.engine.get_binding_dtype(idx)) + for idx in self.hidden_output_binding_indices_in_order + ] + self.hidden_output_shapes = [ + tuple(self.engine.get_binding_shape(idx)) + if self.engine.has_implicit_batch_dimension + else tuple() + for idx in self.hidden_output_binding_indices_in_order + ] + + def _check_initialized(self): + if not self.initialized: + raise RuntimeError("TRTModule is not initialized.") + + def _on_state_dict(self, state_dict, prefix, local_metadata): + self._check_initialized() + state_dict[prefix + "engine"] = bytearray(self.engine.serialize()) + state_dict[prefix + "input_names"] = self.input_names + state_dict[prefix + "output_names"] = self.output_names + state_dict[prefix + "cuda_graph_batch_size"] = self.cuda_graph_batch_size + + def _load_from_state_dict( + self, + state_dict, + prefix, + local_metadata, + strict, + missing_keys, + unexpected_keys, + error_msgs, + ): + engine_bytes = state_dict[prefix + "engine"] + + logger = trt.Logger() + runtime = trt.Runtime(logger) + self.engine = runtime.deserialize_cuda_engine(engine_bytes) + + self.input_names = state_dict[prefix + "input_names"] + self.output_names = state_dict[prefix + "output_names"] + self._initialize() + + def __getstate__(self): + state = self.__dict__.copy() + state["engine"] = bytearray(self.engine.serialize()) + state.pop("context", None) + return state + + def __setstate__(self, state): + logger = trt.Logger() + runtime = trt.Runtime(logger) + state["engine"] = runtime.deserialize_cuda_engine(state["engine"]) + self.__dict__.update(state) + if self.engine: + self.context = self.engine.create_execution_context() + + def forward(self, *inputs): + with torch.autograd.profiler.record_function("TRTModule:Forward"): + self._check_initialized() + + with torch.autograd.profiler.record_function("TRTModule:ProcessInputs"): + assert len(inputs) == len( + self.input_names + ), f"Wrong number of inputs, expect {len(self.input_names)} get {len(inputs)}." + + # This is only used when the trt engine is using implicit batch dim. + batch_size = inputs[0].shape[0] + contiguous_inputs: List[torch.Tensor] = [i.contiguous() for i in inputs] + bindings: List[Any] = [None] * ( + len(self.input_names) + + len(self.output_names) + + len(self.hidden_output_names) + ) + + for i, input_name in enumerate(self.input_names): + assert inputs[ + i + ].is_cuda, f"{i}th input({input_name}) is not on cuda device." + assert ( + inputs[i].dtype == self.input_dtypes[i] + ), f"Dtype mismatch for {i}th input({input_name}). Expect {self.input_dtypes[i]}, got {inputs[i].dtype}." + + idx = self.input_binding_indices_in_order[i] + bindings[idx] = contiguous_inputs[i].data_ptr() + + if not self.engine.has_implicit_batch_dimension: + self.context.set_binding_shape( + idx, tuple(contiguous_inputs[i].shape) + ) + else: + assert inputs[i].size()[1:] == self.input_shapes[i], ( + f"Shape mismatch for {i}th input({input_name}). " + f"Expect {self.input_shapes[i]}, got {inputs[i].size()[1:]}." + ) + + with torch.autograd.profiler.record_function("TRTModule:ProcessOutputs"): + # create output tensors + outputs: List[torch.Tensor] = [] + + for i, idx in enumerate(self.output_binding_indices_in_order): + if self.engine.has_implicit_batch_dimension: + shape = (batch_size,) + self.output_shapes[i] + else: + shape = tuple(self.context.get_binding_shape(idx)) + + output = torch.empty( # type: ignore[call-overload] + size=shape, + dtype=self.output_dtypes[i], + device=torch.cuda.current_device(), + ) + outputs.append(output) + bindings[idx] = output.data_ptr() + + for i, idx in enumerate(self.hidden_output_binding_indices_in_order): + if self.engine.has_implicit_batch_dimension: + shape = (batch_size,) + self.hidden_output_shapes[i] + else: + shape = tuple(self.context.get_binding_shape(idx)) + + output = torch.empty( # type: ignore[call-overload] + size=shape, + dtype=self.hidden_output_dtypes[i], + device=torch.cuda.current_device(), + ) + bindings[idx] = output.data_ptr() + + with torch.autograd.profiler.record_function("TRTModule:TensorRTRuntime"): + if self.engine.has_implicit_batch_dimension: + self.context.execute_async( + batch_size, bindings, torch.cuda.current_stream().cuda_stream + ) + else: + self.context.execute_async_v2( + bindings, torch.cuda.current_stream().cuda_stream + ) + + if len(outputs) == 1: + return outputs[0] + + return tuple(outputs) + + def enable_profiling(self, profiler: "trt.IProfiler" = None): + """ + Enable TensorRT profiling. After calling this function, TensorRT will report + time spent on each layer in stdout for each forward run. + """ + self._check_initialized() + + if not self.context.profiler: + self.context.profiler = trt.Profiler() if profiler is None else profiler + + def disable_profiling(self): + """ + Disable TensorRT profiling. + """ + self._check_initialized() + + torch.cuda.synchronize() + del self.context + self.context = self.engine.create_execution_context() + + def get_layer_info(self) -> str: + """ + Get layer info of the engine. Only support for TRT > 8.2. + """ + inspector = self.engine.create_engine_inspector() + return inspector.get_engine_information(trt.LayerInformationFormat.JSON)
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2022, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_modules/torch_tensorrt/logging.html b/docs/v1.2.0/_modules/torch_tensorrt/logging.html new file mode 100644 index 0000000000..ed2e053a7a --- /dev/null +++ b/docs/v1.2.0/_modules/torch_tensorrt/logging.html @@ -0,0 +1,858 @@ + + + + + + + + + + + + torch_tensorrt.logging — Torch-TensorRT v1.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt.logging

+from enum import Enum
+from torch_tensorrt._C import (
+    _get_logging_prefix,
+    _set_logging_prefix,
+    _get_reportable_log_level,
+    _set_reportable_log_level,
+    _get_is_colored_output_on,
+    _set_is_colored_output_on,
+    _log,
+    LogLevel,
+)
+
+
+
[docs]class Level(Enum): + """Enum to set the minimum required logging level to print a message to stdout""" + + InternalError = LogLevel.INTERNAL_ERROR + Error = LogLevel.ERROR + Warning = LogLevel.WARNING + Info = LogLevel.INFO + Debug = LogLevel.DEBUG + Graph = LogLevel.GRAPH + + @staticmethod + def _to_internal_level(external) -> LogLevel: + if external == Level.InternalError: + return LogLevel.INTERNAL_ERROR + if external == Level.Error: + return LogLevel.ERROR + if external == Level.Warning: + return LogLevel.WARNING + if external == Level.Info: + return LogLevel.INFO + if external == Level.Debug: + return LogLevel.DEBUG + if external == Level.Graph: + return LogLevel.GRAPH
+ + +
[docs]def get_logging_prefix() -> str: + """Get the prefix set for logging messages + + Returns: + str: Prefix used for logger + """ + return _get_logging_prefix()
+ + +
[docs]def set_logging_prefix(prefix: str): + """Set the prefix used when logging messages + + Args: + prefix (str): Prefix to use for logging messages + """ + _set_logging_prefix(prefix)
+ + +
[docs]def get_reportable_log_level() -> Level: + """Get the level required for a message to be printed in the log + + Returns: + torch_tensorrt.logging.Level: The enum representing the level required to print + """ + return Level(_get_reportable_log_level())
+ + +
[docs]def set_reportable_log_level(level: Level): + """Set the level required for a message to be printed to the log + + Args: + level (torch_tensorrt.logging.Level): The enum representing the level required to print + """ + _set_reportable_log_level(Level._to_internal_level(level))
+ + +
[docs]def get_is_colored_output_on() -> bool: + """Get if colored output is enabled for logging + + Returns: + bool: If colored output is one + """ + return _get_is_colored_output_on()
+ + +
[docs]def set_is_colored_output_on(colored_output_on: bool): + """Enable or disable color in the log output + + Args: + colored_output_on (bool): If colored output should be enabled or not + """ + _set_is_colored_output_on(colored_output_on)
+ + +
[docs]def log(level: Level, msg: str): + """Add a new message to the log + + Adds a new message to the log at a specified level. The message + will only get printed out if Level > reportable_log_level + + Args: + level (torch_tensorrt.logging.Level): Severity of the message + msg (str): Actual message text + """ + _log(Level._to_internal_level(level), msg) + + InternalError = LogLevel.INTERNAL_ERROR + Error = LogLevel.ERROR + Warning = LogLevel.WARNING + Info = LogLevel.INFO + Debug = LogLevel.DEBUG + Graph = LogLevel.GRAPH
+ + +
[docs]class internal_errors: + """Context-manager to limit displayed log messages to just internal errors + + Example:: + + with torch_tensorrt.logging.internal_errors(): + outputs = model_torchtrt(inputs) + """ + + def __enter__(self): + self.external_lvl = get_reportable_log_level() + set_reportable_log_level(Level.InternalError) + + def __exit__(self, exc_type, exc_value, exc_tb): + set_reportable_log_level(self.external_lvl)
+ + +
[docs]class errors: + """Context-manager to limit displayed log messages to just errors and above + + Example:: + + with torch_tensorrt.logging.errors(): + outputs = model_torchtrt(inputs) + """ + + def __enter__(self): + self.external_lvl = get_reportable_log_level() + set_reportable_log_level(Level.Error) + + def __exit__(self, exc_type, exc_value, exc_tb): + set_reportable_log_level(self.external_lvl)
+ + +
[docs]class warnings: + """Context-manager to limit displayed log messages to just warnings and above + + Example:: + + with torch_tensorrt.logging.warnings(): + model_trt = torch_tensorrt.compile(model, **spec) + """ + + def __enter__(self): + self.external_lvl = get_reportable_log_level() + set_reportable_log_level(Level.Warning) + + def __exit__(self, exc_type, exc_value, exc_tb): + set_reportable_log_level(self.external_lvl)
+ + +
[docs]class info: + """Context-manager to display all info and greater severity messages + + Example:: + + with torch_tensorrt.logging.info(): + model_trt = torch_tensorrt.compile(model, **spec) + """ + + def __enter__(self): + self.external_lvl = get_reportable_log_level() + set_reportable_log_level(Level.Info) + + def __exit__(self, exc_type, exc_value, exc_tb): + set_reportable_log_level(self.external_lvl)
+ + +
[docs]class debug: + """Context-manager to display full debug information through the logger + + Example:: + + with torch_tensorrt.logging.debug(): + model_trt = torch_tensorrt.compile(model, **spec) + """ + + def __enter__(self): + self.external_lvl = get_reportable_log_level() + set_reportable_log_level(Level.Debug) + + def __exit__(self, exc_type, exc_value, exc_tb): + set_reportable_log_level(self.external_lvl)
+ + +
[docs]class graphs: + """Context-manager to display the results of intermediate lowering passes + as well as full debug information through the logger + + Example:: + + with torch_tensorrt.logging.graphs(): + model_trt = torch_tensorrt.compile(model, **spec) + """ + + def __enter__(self): + self.external_lvl = get_reportable_log_level() + set_reportable_log_level(Level.Graph) + + def __exit__(self, exc_type, exc_value, exc_tb): + set_reportable_log_level(self.external_lvl)
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2022, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_modules/torch_tensorrt/ptq.html b/docs/v1.2.0/_modules/torch_tensorrt/ptq.html new file mode 100644 index 0000000000..6c5ae50570 --- /dev/null +++ b/docs/v1.2.0/_modules/torch_tensorrt/ptq.html @@ -0,0 +1,850 @@ + + + + + + + + + + + + torch_tensorrt.ptq — Torch-TensorRT v1.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt.ptq

+from typing import List, Dict, Any
+import torch
+import os
+
+from torch_tensorrt import _C
+from torch_tensorrt._version import __version__
+from torch_tensorrt.logging import *
+from types import FunctionType
+from enum import Enum
+
+
+
[docs]class CalibrationAlgo(Enum): + ENTROPY_CALIBRATION = _C.CalibrationAlgo.ENTROPY_CALIBRATION + ENTROPY_CALIBRATION_2 = _C.CalibrationAlgo.ENTROPY_CALIBRATION_2 + LEGACY_CALIBRATION = _C.CalibrationAlgo.LEGACY_CALIBRATION + MINMAX_CALIBRATION = _C.CalibrationAlgo.MINMAX_CALIBRATION
+ + +
[docs]def get_cache_mode_batch(self): + return None
+ + +
[docs]def get_batch_size(self): + return 1
+ + +
[docs]def get_batch(self, names): + if self.current_batch_idx + self.batch_size > len(self.data_loader.dataset): + return None + + batch = next(self.dataset_iterator) + self.current_batch_idx += self.batch_size + inputs_gpu = [] + if isinstance(batch, list): + for example in batch: + inputs_gpu.append(example.to(self.device).data_ptr()) + else: + inputs_gpu.append(batch.to(self.device).data_ptr()) + return inputs_gpu
+ + +
[docs]def read_calibration_cache(self): + if self.cache_file and self.use_cache: + if os.path.exists(self.cache_file): + with open(self.cache_file, "rb") as f: + return f.read() + else: + return b""
+ + +
[docs]def write_calibration_cache(self, cache): + if self.cache_file: + with open(self.cache_file, "wb") as f: + f.write(cache) + else: + return b""
+ + +# deepcopy (which involves pickling) is performed on the compile_spec internally during compilation. +# We register this __reduce__ function for pickler to identity the calibrator object returned by DataLoaderCalibrator during deepcopy. +# This should be the object's local name relative to the module https://docs.python.org/3/library/pickle.html#object.__reduce__ +def __reduce__(self): + return self.__class__.__name__ + + +
[docs]class DataLoaderCalibrator(object): + """ + Constructs a calibrator class in TensorRT and uses pytorch dataloader to load/preproces + data which is passed during calibration. + Args: + dataloader: an instance of pytorch dataloader which iterates through a given dataset. + algo_type: choice of calibration algorithm. + cache_file: path to cache file. + use_cache: flag which enables usage of pre-existing cache. + device: device on which calibration data is copied to. + """ + +
[docs] def __init__(self, **kwargs): + pass
+ + def __new__(cls, *args, **kwargs): + dataloader = args[0] + algo_type = kwargs.get("algo_type", CalibrationAlgo.ENTROPY_CALIBRATION_2) + cache_file = kwargs.get("cache_file", None) + use_cache = kwargs.get("use_cache", False) + device = kwargs.get("device", torch.device("cuda:0")) + + if not isinstance(dataloader, torch.utils.data.DataLoader): + log( + Level.Error, + "Dataloader : {} is not a valid instance of torch.utils.data.DataLoader".format( + dataloader + ), + ) + + if not cache_file: + if use_cache: + log( + Level.Debug, + "Using existing cache_file {} for calibration".format(cache_file), + ) + else: + log(Level.Debug, "Overwriting existing calibration cache file.") + else: + if use_cache: + log( + Level.Error, + "Input cache file is None but use_cache is set to True in INT8 mode.", + ) + + # Define attributes and member functions for the calibrator class + attribute_mapping = { + "data_loader": dataloader, + "current_batch_idx": 0, + "batch_size": dataloader.batch_size, + "dataset_iterator": iter(dataloader), + "cache_file": cache_file, + "device": device, + "use_cache": use_cache, + "get_batch_size": get_batch_size, + "get_batch": get_cache_mode_batch if use_cache else get_batch, + "read_calibration_cache": read_calibration_cache, + "write_calibration_cache": write_calibration_cache, + "__reduce__": __reduce__, # used when you deepcopy the DataLoaderCalibrator object + } + + # Using type metaclass to construct calibrator class based on algorithm type + if algo_type == CalibrationAlgo.ENTROPY_CALIBRATION: + return type( + "Int8EntropyCalibrator", (_C.IInt8EntropyCalibrator,), attribute_mapping + )() + elif algo_type == CalibrationAlgo.ENTROPY_CALIBRATION_2: + return type( + "Int8EntropyCalibrator2", + (_C.IInt8EntropyCalibrator2,), + attribute_mapping, + )() + elif algo_type == CalibrationAlgo.LEGACY_CALIBRATION: + return type( + "Int8LegacyCalibrator", (_C.IInt8LegacyCalibrator,), attribute_mapping + )() + elif algo_type == CalibrationAlgo.MINMAX_CALIBRATION: + return type( + "Int8MinMaxCalibrator", (_C.IInt8MinMaxCalibrator,), attribute_mapping + )() + else: + log( + Level.Error, + "Invalid calibration algorithm type. Please select among ENTROPY_CALIBRATION, ENTROPY_CALIBRATION, LEGACY_CALIBRATION or MINMAX_CALIBRATION", + )
+ + +
[docs]class CacheCalibrator(object): + """ + Constructs a calibrator class in TensorRT which directly uses pre-existing cache file for calibration. + Args: + cache_file: path to cache file. + algo_type: choice of calibration algorithm. + """ + +
[docs] def __init__(self, **kwargs): + pass
+ + def __new__(cls, *args, **kwargs): + cache_file = args[0] + algo_type = kwargs.get("algo_type", CalibrationAlgo.ENTROPY_CALIBRATION_2) + + if os.path.isfile(cache_file): + log( + Level.Debug, + "Using existing cache_file {} for calibration".format(cache_file), + ) + else: + log(Level.Error, "Invalid calibration cache file.") + + # Define attributes and member functions for the calibrator class + attribute_mapping = { + "use_cache": True, + "cache_file": cache_file, + "get_batch_size": get_batch_size, + "get_batch": get_cache_mode_batch, + "read_calibration_cache": read_calibration_cache, + "write_calibration_cache": write_calibration_cache, + } + # Using type metaclass to construct calibrator class based on algorithm type + if algo_type == CalibrationAlgo.ENTROPY_CALIBRATION: + return type( + "DataLoaderCalibrator", (_C.IInt8EntropyCalibrator,), attribute_mapping + )() + elif algo_type == CalibrationAlgo.ENTROPY_CALIBRATION_2: + return type( + "DataLoaderCalibrator", (_C.IInt8MinMaxCalibrator,), attribute_mapping + )() + elif algo_type == CalibrationAlgo.LEGACY_CALIBRATION: + return type( + "DataLoaderCalibrator", (_C.IInt8LegacyCalibrator,), attribute_mapping + )() + elif algo_type == CalibrationAlgo.MINMAX_CALIBRATION: + return type( + "DataLoaderCalibrator", (_C.IInt8MinMaxCalibrator,), attribute_mapping + )() + else: + log( + Level.Error, + "Invalid calibration algorithm type. Please select among ENTROPY_CALIBRATION, ENTROPY_CALIBRATION, LEGACY_CALIBRATION or MINMAX_CALIBRATION", + )
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2022, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_modules/torch_tensorrt/ts/_compile_spec.html b/docs/v1.2.0/_modules/torch_tensorrt/ts/_compile_spec.html new file mode 100644 index 0000000000..245455aaeb --- /dev/null +++ b/docs/v1.2.0/_modules/torch_tensorrt/ts/_compile_spec.html @@ -0,0 +1,1132 @@ + + + + + + + + + + + + torch_tensorrt.ts._compile_spec — Torch-TensorRT v1.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt.ts._compile_spec

+from typing import List, Dict, Any, Set
+import torch
+from torch_tensorrt import _C
+import torch_tensorrt._C.ts as _ts_C
+from torch_tensorrt import _enums
+from torch_tensorrt._Input import Input
+from torch_tensorrt._Device import Device
+from torch_tensorrt.logging import Level, log
+from typing import Tuple, List, Dict
+import warnings
+from copy import deepcopy
+
+
+def _internal_input_to_torch_class_input(i: _C.Input) -> torch.classes.tensorrt._Input:
+    clone = torch.classes.tensorrt._Input()
+    clone._set_min(i.min)
+    clone._set_opt(i.opt)
+    clone._set_max(i.max)
+    clone._set_dtype(i.dtype)
+    clone._set_format(i.format)
+    clone._set_input_is_dynamic(i.input_is_dynamic)
+    clone._set_explicit_set_dtype(i._explicit_set_dtype)
+    return clone
+
+
+def _supported_input_size_type(input_size: Any) -> bool:
+    if isinstance(input_size, torch.Size):
+        return True
+    elif isinstance(input_size, tuple):
+        return True
+    elif isinstance(input_size, list):
+        return True
+    else:
+        raise TypeError(
+            "Input sizes for inputs are required to be a List, tuple or torch.Size or a Dict of three sizes (min, opt, max), found type: "
+            + str(type(input_size))
+        )
+
+
+def _parse_input_ranges(input_sizes: List) -> List:
+
+    if any(
+        not isinstance(i, dict) and not _supported_input_size_type(i)
+        for i in input_sizes
+    ):
+        raise KeyError(
+            "An input size must either be a static size or a range of three sizes (min, opt, max) as Dict"
+        )
+
+    parsed_input_sizes = []
+    for i in input_sizes:
+        if isinstance(i, dict):
+            if all(k in i for k in ["min", "opt", "min"]):
+                parsed_input_sizes.append(
+                    Input(
+                        min_shape=i["min"], opt_shape=i["opt"], max_shape=i["max"]
+                    )._to_internal()
+                )
+
+            elif "opt" in i:
+                parsed_input_sizes.append(Input(shape=i["opt"])._to_internal())
+
+            else:
+                raise KeyError(
+                    "An input size must either be a static size or a range of three sizes (min, opt, max) as Dict"
+                )
+
+        elif isinstance(i, list):
+            parsed_input_sizes.append(Input(shape=i)._to_internal())
+
+        elif isinstance(i, tuple):
+            parsed_input_sizes.append(Input(shape=i)._to_internal())
+
+        elif isinstance(i, torch.Size):
+            parsed_input_sizes.append(Input(shape=i)._to_internal())
+
+    return parsed_input_sizes
+
+
+def _parse_op_precision(precision: Any) -> _enums.dtype:
+    if isinstance(precision, torch.dtype):
+        if precision == torch.int8:
+            return _enums.dtype.int8
+        elif precision == torch.half:
+            return _enums.dtype.half
+        elif precision == torch.float:
+            return _enums.dtype.float
+        else:
+            raise TypeError(
+                "Provided an unsupported dtype as operating precision (support: int8, half, float), got: "
+                + str(precision)
+            )
+
+    elif isinstance(precision, _enums.dtype):
+        return precision
+
+    else:
+        raise TypeError(
+            "Op precision type needs to be specified with a torch.dtype or a torch_tensorrt.dtype, got: "
+            + str(type(precision))
+        )
+
+
+def _parse_enabled_precisions(precisions: Any) -> Set:
+    parsed_precisions = set()
+    if any([isinstance(precisions, type) for type in [list, tuple, set]]):
+        for p in precisions:
+            parsed_precisions.add(_parse_op_precision(p))
+    else:
+        parsed_precisions.add(_parse_op_precision(precisions))
+    return parsed_precisions
+
+
+def _parse_device_type(device: Any) -> _enums.DeviceType:
+    if isinstance(device, torch.device):
+        if device.type == "cuda":
+            return _enums.DeviceType.gpu
+        else:
+            ValueError(
+                "Got a device type other than GPU or DLA (type: "
+                + str(device.type)
+                + ")"
+            )
+    elif isinstance(device, _enums.DeviceType):
+        return device
+    elif isinstance(device, str):
+        if device == "gpu" or device == "GPU":
+            return _enums.DeviceType.gpu
+        elif device == "dla" or device == "DLA":
+            return _enums.DeviceType.dla
+        else:
+            ValueError(
+                "Got a device type other than GPU or DLA (type: " + str(device) + ")"
+            )
+    else:
+        raise TypeError(
+            "Device specification must be of type torch.device, string or torch_tensorrt.DeviceType, but got: "
+            + str(type(device))
+        )
+
+
+def _parse_device(device_info: Any) -> _C.Device:
+    if isinstance(device_info, dict):
+        info = _C.Device()
+        if "device_type" not in device_info:
+            raise KeyError("Device type is required parameter")
+        else:
+            assert isinstance(device_info["device_type"], _enums.DeviceType)
+            info.device_type = _parse_device_type(device_info["device_type"])
+
+        if "gpu_id" in device_info:
+            assert isinstance(device_info["gpu_id"], int)
+            info.gpu_id = device_info["gpu_id"]
+
+        if "dla_core" in device_info:
+            assert isinstance(device_info["dla_core"], int)
+            info.dla_core = device_info["dla_core"]
+
+        if "allow_gpu_fallback" in device_info:
+            assert isinstance(device_info["allow_gpu_fallback"], bool)
+            info.allow_gpu_fallback = device_info["allow_gpu_fallback"]
+
+        return info
+    elif isinstance(device_info, Device):
+        return device_info._to_internal()
+    elif isinstance(device_info, torch.device):
+        return (Device._from_torch_device(device_info))._to_internal()
+    else:
+        raise ValueError(
+            "Unsupported data for device specification. Expected either a dict, torch_tensorrt.Device or torch.Device"
+        )
+
+
+def _parse_torch_fallback(fallback_info: Dict[str, Any]) -> _ts_C.TorchFallback:
+    info = _ts_C.TorchFallback()
+    if "enabled" not in fallback_info:
+        raise KeyError("Enabled is required parameter")
+    else:
+        assert isinstance(fallback_info["enabled"], bool)
+        info.enabled = fallback_info["enabled"]
+    if "min_block_size" in fallback_info:
+        assert isinstance(fallback_info["min_block_size"], int)
+        info.min_block_size = fallback_info["min_block_size"]
+
+    if "forced_fallback_ops" in fallback_info:
+        assert isinstance(fallback_info["forced_fallback_ops"], list)
+        info.forced_fallback_operators = fallback_info["forced_fallback_ops"]
+
+    if "forced_fallback_modules" in fallback_info:
+        assert isinstance(fallback_info["forced_fallback_modules"], list)
+        info.forced_fallback_modules = fallback_info["forced_fallback_modules"]
+
+    return info
+
+
+def _parse_input_signature(input_signature: Any):
+    if isinstance(input_signature, tuple):
+        input_list = []
+        for item in input_signature:
+            input = _parse_input_signature(item)
+            input_list.append(input)
+        return tuple(input_list)
+    elif isinstance(input_signature, list):
+        input_list = []
+        for item in input_signature:
+            input = _parse_input_signature(item)
+            input_list.append(input)
+        return input_list
+    elif isinstance(input_signature, Input) or isinstance(
+        input_signature, torch.Tensor
+    ):
+        i = (
+            Input._from_tensor(input_signature)
+            if isinstance(input_signature, torch.Tensor)
+            else input_signature
+        )
+        clone = _internal_input_to_torch_class_input(i._to_internal())
+        return clone
+    else:
+        raise KeyError(
+            "Input signature contains an unsupported type {}".format(
+                type(input_signature)
+            )
+        )
+
+
+def _parse_compile_spec(compile_spec_: Dict[str, Any]) -> _ts_C.CompileSpec:
+    # TODO: Use deepcopy to support partial compilation of collections
+    compile_spec = deepcopy(compile_spec_)
+    info = _ts_C.CompileSpec()
+
+    if len(compile_spec["inputs"]) > 0:
+        if not all(
+            [
+                isinstance(i, torch.Tensor) or isinstance(i, Input)
+                for i in compile_spec["inputs"]
+            ]
+        ):
+            raise KeyError(
+                "Input specs should be either torch_tensorrt.Input or torch.Tensor, found types: {}".format(
+                    [type(i) for i in compile_spec["inputs"]]
+                )
+            )
+
+        inputs = [
+            Input._from_tensor(i) if isinstance(i, torch.Tensor) else i
+            for i in compile_spec["inputs"]
+        ]
+        info.inputs = [i._to_internal() for i in inputs]
+
+    elif compile_spec["input_signature"] is not None:
+        log(
+            Level.Warning,
+            "Input signature parsing is an experimental feature, behavior and APIs may change",
+        )
+        signature = _parse_input_signature(compile_spec["input_signature"])
+        info.input_signature = _C.InputSignature(signature)  # py_object
+
+        if not compile_spec["torch_fallback"]["enabled"]:
+            raise ValueError(
+                "Grouped inputs currently requires partial compilation to be enabled, this restriction will be relaxed in a future release"
+            )
+
+        log(
+            Level.Debug,
+            "Grouped inputs currently requires additional settings to enable the feature",
+        )
+        log(
+            Level.Debug,
+            """Adding the following ops to torch_executed_ops:
+    - aten::__getitem__
+    - prim::ListConstruct
+    - prim::ListUnpack
+    - prim::TupleIndex
+    - prim::TupleConstruct
+    - prim::TupleUnpack
+""",
+        )
+        compile_spec["torch_fallback"]["forced_fallback_ops"].append(
+            "aten::__getitem__"
+        )
+        compile_spec["torch_fallback"]["forced_fallback_ops"].append(
+            "prim::ListConstruct"
+        )
+        compile_spec["torch_fallback"]["forced_fallback_ops"].append("prim::ListUnpack")
+        compile_spec["torch_fallback"]["forced_fallback_ops"].append("prim::TupleIndex")
+        compile_spec["torch_fallback"]["forced_fallback_ops"].append(
+            "prim::TupleConstruct"
+        )
+        compile_spec["torch_fallback"]["forced_fallback_ops"].append(
+            "prim::TupleUnpack"
+        )
+
+    else:
+        raise KeyError(
+            'Module input definitions are requried to compile module. Provide a list of torch_tensorrt.Input keyed to "inputs" in the compile spec'
+        )
+
+    if "enabled_precisions" in compile_spec:
+        info.enabled_precisions = _parse_enabled_precisions(
+            compile_spec["enabled_precisions"]
+        )
+
+    if "calibrator" in compile_spec and compile_spec["calibrator"]:
+        info.ptq_calibrator = compile_spec["calibrator"]
+
+    if "sparse_weights" in compile_spec:
+        assert isinstance(compile_spec["sparse_weights"], bool)
+        info.sparse_weights = compile_spec["sparse_weights"]
+
+    if "disable_tf32" in compile_spec:
+        assert isinstance(compile_spec["disable_tf32"], bool)
+        info.disable_tf32 = compile_spec["disable_tf32"]
+
+    if "refit" in compile_spec:
+        assert isinstance(compile_spec["refit"], bool)
+        info.refit = compile_spec["refit"]
+
+    if "debug" in compile_spec:
+        assert isinstance(compile_spec["debug"], bool)
+        info.debug = compile_spec["debug"]
+
+    if "device" in compile_spec:
+        info.device = _parse_device(compile_spec["device"])
+
+    if "capability" in compile_spec:
+        assert isinstance(compile_spec["capability"], _enums.EngineCapability)
+        info.capability = compile_spec["capability"]
+
+    if "num_avg_timing_iters" in compile_spec:
+        assert type(compile_spec["num_avg_timing_iters"]) is int
+        info.num_avg_timing_iters = compile_spec["num_avg_timing_iters"]
+
+    if "workspace_size" in compile_spec:
+        assert type(compile_spec["workspace_size"]) is int
+        info.workspace_size = compile_spec["workspace_size"]
+
+    if "dla_sram_size" in compile_spec:
+        assert type(compile_spec["dla_sram_size"]) is int
+        info.dla_sram_size = compile_spec["dla_sram_size"]
+
+    if "dla_local_dram_size" in compile_spec:
+        assert type(compile_spec["dla_local_dram_size"]) is int
+        info.dla_local_dram_size = compile_spec["dla_local_dram_size"]
+
+    if "dla_global_dram_size" in compile_spec:
+        assert type(compile_spec["dla_global_dram_size"]) is int
+        info.dla_global_dram_size = compile_spec["dla_global_dram_size"]
+
+    if "truncate_long_and_double" in compile_spec:
+        assert type(compile_spec["truncate_long_and_double"]) is bool
+        info.truncate_long_and_double = compile_spec["truncate_long_and_double"]
+
+    if "torch_fallback" in compile_spec:
+        info.torch_fallback = _parse_torch_fallback(compile_spec["torch_fallback"])
+
+    log(Level.Debug, str(info))
+
+    return info
+
+
+
[docs]def TensorRTCompileSpec( + inputs=[], + input_signature=None, + device=Device._current_device(), + disable_tf32=False, + sparse_weights=False, + enabled_precisions=set(), + refit=False, + debug=False, + capability=_enums.EngineCapability.default, + num_avg_timing_iters=1, + workspace_size=0, + dla_sram_size=1048576, + dla_local_dram_size=1073741824, + dla_global_dram_size=536870912, + truncate_long_and_double=False, + calibrator=None, +) -> torch.classes.tensorrt.CompileSpec: + """Utility to create a formated spec dictionary for using the PyTorch TensorRT backend + + Keyword Args: + inputs (List[Union(torch_tensorrt.Input, torch.Tensor)]): **Required** List of specifications of input shape, dtype and memory layout for inputs to the module. This argument is required. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using + torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum + to select device type. :: + + input=[ + torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1 + torch_tensorrt.Input( + min_shape=(1, 224, 224, 3), + opt_shape=(1, 512, 512, 3), + max_shape=(1, 1024, 1024, 3), + dtype=torch.int32 + format=torch.channel_last + ), # Dynamic input shape for input #2 + torch.randn((1, 3, 224, 244)) # Use an example tensor and let torch_tensorrt infer settings + ] + + device (Union(torch_tensorrt.Device, torch.device, dict)): Target device for TensorRT engines to run on :: + + device=torch_tensorrt.Device("dla:1", allow_gpu_fallback=True) + + disable_tf32 (bool): Force FP32 layers to use traditional as FP32 format vs the default behavior of rounding the inputs to 10-bit mantissas before multiplying, but accumulates the sum using 23-bit mantissas + sparse_weights (bool): Enable sparsity for convolution and fully connected layers. + enabled_precision (Set(Union(torch.dtype, torch_tensorrt.dtype))): The set of datatypes that TensorRT can use when selecting kernels + refit (bool): Enable refitting + debug (bool): Enable debuggable engine + capability (torch_tensorrt.EngineCapability): Restrict kernel selection to safe gpu kernels or safe dla kernels + num_avg_timing_iters (int): Number of averaging timing iterations used to select kernels + workspace_size (int): Maximum size of workspace given to TensorRT + truncate_long_and_double (bool): Truncate weights provided in int64 or double (float64) to int32 and float32 + calibrator (Union(torch_tensorrt._C.IInt8Calibrator, tensorrt.IInt8Calibrator)): Calibrator object which will provide data to the PTQ system for INT8 Calibration + + Returns: + torch.classes.tensorrt.CompileSpec: List of methods and formated spec objects to be provided to ``torch._C._jit_to_tensorrt`` + """ + + compile_spec = { + "inputs": inputs, + # "input_signature": input_signature, + "device": device, + "disable_tf32": disable_tf32, # Force FP32 layers to use traditional as FP32 format vs the default behavior of rounding the inputs to 10-bit mantissas before multiplying, but accumulates the sum using 23-bit mantissas + "sparse_weights": sparse_weights, # Enable sparsity for convolution and fully connected layers. + "enabled_precisions": enabled_precisions, # Enabling FP16 kernels + "refit": refit, # enable refit + "debug": debug, # enable debuggable engine + "capability": capability, # Restrict kernel selection to safe gpu kernels or safe dla kernels + "num_avg_timing_iters": num_avg_timing_iters, # Number of averaging timing iterations used to select kernels + "workspace_size": workspace_size, # Maximum size of workspace given to TensorRT + "dla_sram_size": dla_sram_size, # Fast software managed RAM used by DLA to communicate within a layer. + "dla_local_dram_size": dla_local_dram_size, # Host RAM used by DLA to share intermediate tensor data across operations + "dla_global_dram_size": dla_global_dram_size, # Host RAM used by DLA to store weights and metadata for execution + "calibrator": calibrator, + "truncate_long_and_double": truncate_long_and_double, + } + + parsed_spec = _parse_compile_spec(compile_spec) + + backend_spec = torch.classes.tensorrt.CompileSpec() + + if input_signature is not None: + raise ValueError( + "Input signature parsing is not currently supported in the TorchScript backend integration" + ) + + for i in parsed_spec.inputs: + clone = _internal_input_to_torch_class_input(i) + backend_spec._append_input(clone) + + d = torch.classes.tensorrt._Device() + d._set_device_type(int(parsed_spec.device.device_type)) + d._set_gpu_id(parsed_spec.device.gpu_id) + d._set_dla_core(parsed_spec.device.dla_core) + d._set_allow_gpu_fallback(parsed_spec.device.allow_gpu_fallback) + + if parsed_spec.torch_fallback.enabled: + raise RuntimeError( + "Partial module compilation is not currently supported via the PyTorch TensorRT backend. If you need partial compilation, use torch_tensorrt.compile" + ) + + torch_fallback = torch.classes.tensorrt._TorchFallback() + torch_fallback._set_enabled(parsed_spec.torch_fallback.enabled) + torch_fallback._set_min_block_size(parsed_spec.torch_fallback.min_block_size) + torch_fallback._set_forced_fallback_operators( + parsed_spec.torch_fallback.forced_fallback_operators + ) + torch_fallback._set_forced_fallback_modules( + parsed_spec.torch_fallback.forced_fallback_modules + ) + + backend_spec._set_device(d) + backend_spec._set_torch_fallback(torch_fallback) + backend_spec._set_precisions([int(i) for i in parsed_spec.enabled_precisions]) + + backend_spec._set_disable_tf32(parsed_spec.disable_tf32) + backend_spec._set_refit(parsed_spec.refit) + backend_spec._set_debug(parsed_spec.debug) + backend_spec._set_refit(parsed_spec.refit) + backend_spec._set_capability(int(parsed_spec.capability)) + backend_spec._set_num_avg_timing_iters(parsed_spec.num_avg_timing_iters) + backend_spec._set_workspace_size(parsed_spec.workspace_size) + backend_spec._set_dla_sram_size(parsed_spec.dla_sram_size) + backend_spec._set_dla_local_dram_size(parsed_spec.dla_local_dram_size) + backend_spec._set_dla_global_dram_size(parsed_spec.dla_global_dram_size) + backend_spec._set_truncate_long_and_double(parsed_spec.truncate_long_and_double) + backend_spec._set_ptq_calibrator(parsed_spec._get_calibrator_handle()) + + return backend_spec
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2022, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_modules/torch_tensorrt/ts/_compiler.html b/docs/v1.2.0/_modules/torch_tensorrt/ts/_compiler.html new file mode 100644 index 0000000000..c894f81933 --- /dev/null +++ b/docs/v1.2.0/_modules/torch_tensorrt/ts/_compiler.html @@ -0,0 +1,934 @@ + + + + + + + + + + + + torch_tensorrt.ts._compiler — Torch-TensorRT v1.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +

Source code for torch_tensorrt.ts._compiler

+from typing import List, Dict, Any
+import torch
+from torch import nn
+
+import torch_tensorrt._C.ts as _C
+from torch_tensorrt import _enums
+from torch_tensorrt.ts._compile_spec import _parse_compile_spec, _parse_device
+from torch_tensorrt._Device import Device
+from types import FunctionType
+
+
+
[docs]def compile( + module: torch.jit.ScriptModule, + inputs=[], + input_signature=None, + device=Device._current_device(), + disable_tf32=False, + sparse_weights=False, + enabled_precisions=set(), + refit=False, + debug=False, + capability=_enums.EngineCapability.default, + num_avg_timing_iters=1, + workspace_size=0, + dla_sram_size=1048576, + dla_local_dram_size=1073741824, + dla_global_dram_size=536870912, + calibrator=None, + truncate_long_and_double=False, + require_full_compilation=False, + min_block_size=3, + torch_executed_ops=[], + torch_executed_modules=[], +) -> torch.jit.ScriptModule: + """Compile a TorchScript module for NVIDIA GPUs using TensorRT + + Takes a existing TorchScript module and a set of settings to configure the compiler + and will convert methods to JIT Graphs which call equivalent TensorRT engines + + Converts specifically the forward method of a TorchScript Module + + Arguments: + module (torch.jit.ScriptModule): Source module, a result of tracing or scripting a PyTorch + ``torch.nn.Module`` + + Keyword Arguments: + inputs (List[Union(torch_tensorrt.Input, torch.Tensor)]): **Required** List of specifications of input shape, dtype and memory layout for inputs to the module. This argument is required. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using + torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum + to select device type. :: + + input=[ + torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1 + torch_tensorrt.Input( + min_shape=(1, 224, 224, 3), + opt_shape=(1, 512, 512, 3), + max_shape=(1, 1024, 1024, 3), + dtype=torch.int32 + format=torch.channel_last + ), # Dynamic input shape for input #2 + torch.randn((1, 3, 224, 244)) # Use an example tensor and let torch_tensorrt infer settings + ] + + input_signature Union(List, Tuple, torch_tensorrt.Input, torch.Tensor): A formatted collection of input specifications for the module. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using + torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum to select device type. **This API should be considered beta-level stable and may change in the future** :: + + input_signature=([ + torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1 + torch_tensorrt.Input( + min_shape=(1, 224, 224, 3), + opt_shape=(1, 512, 512, 3), + max_shape=(1, 1024, 1024, 3), + dtype=torch.int32 + format=torch.channel_last + ), # Dynamic input shape for input #2 + ], torch.randn((1, 3, 224, 244))) # Use an example tensor and let torch_tensorrt infer settings for input #3 + device (Union(torch_tensorrt.Device, torch.device, dict)): Target device for TensorRT engines to run on :: + + device=torch_tensorrt.Device("dla:1", allow_gpu_fallback=True) + + disable_tf32 (bool): Force FP32 layers to use traditional as FP32 format vs the default behavior of rounding the inputs to 10-bit mantissas before multiplying, but accumulates the sum using 23-bit mantissas + sparse_weights (bool): Enable sparsity for convolution and fully connected layers. + enabled_precision (Set(Union(torch.dtype, torch_tensorrt.dtype))): The set of datatypes that TensorRT can use when selecting kernels + refit (bool): Enable refitting + debug (bool): Enable debuggable engine + capability (torch_tensorrt.EngineCapability): Restrict kernel selection to safe gpu kernels or safe dla kernels + num_avg_timing_iters (int): Number of averaging timing iterations used to select kernels + workspace_size (int): Maximum size of workspace given to TensorRT + dla_sram_size (int): Fast software managed RAM used by DLA to communicate within a layer. + dla_local_dram_size (int): Host RAM used by DLA to share intermediate tensor data across operations + dla_global_dram_size (int): Host RAM used by DLA to store weights and metadata for execution + truncate_long_and_double (bool): Truncate weights provided in int64 or double (float64) to int32 and float32 + calibrator (Union(torch_tensorrt._C.IInt8Calibrator, tensorrt.IInt8Calibrator)): Calibrator object which will provide data to the PTQ system for INT8 Calibration + require_full_compilation (bool): Require modules to be compiled end to end or return an error as opposed to returning a hybrid graph where operations that cannot be run in TensorRT are run in PyTorch + min_block_size (int): The minimum number of contiguous TensorRT convertable operations in order to run a set of operations in TensorRT + torch_executed_ops (List[str]): List of aten operators that must be run in PyTorch. An error will be thrown if this list is not empty but ``require_full_compilation`` is True + torch_executed_modules (List[str]): List of modules that must be run in PyTorch. An error will be thrown if this list is not empty but ``require_full_compilation`` is True + + Returns: + torch.jit.ScriptModule: Compiled TorchScript Module, when run it will execute via TensorRT + """ + + if isinstance(module, torch.jit.ScriptFunction): + raise TypeError( + "torch.jit.ScriptFunction currently is not directly supported, wrap the function in a module to compile" + ) + + if require_full_compilation and ( + len(torch_executed_modules) > 0 or len(torch_executed_ops) > 0 + ): + raise ValueError( + f"require_full_compilation is enabled however the list of modules and ops to run in torch is not empty. Found: torch_executed_ops: {torch_executed_ops}, torch_executed_modules: {torch_executed_modules}" + ) + + spec = { + "inputs": inputs, + "input_signature": input_signature, + "device": device, + "disable_tf32": disable_tf32, # Force FP32 layers to use traditional as FP32 format + "sparse_weights": sparse_weights, # Enable sparsity for convolution and fully connected layers. + "enabled_precisions": enabled_precisions, # Enabling FP16 kernels + "refit": refit, # enable refit + "debug": debug, # enable debuggable engine + "capability": capability, # Restrict kernel selection to safe gpu kernels or safe dla kernels + "num_avg_timing_iters": num_avg_timing_iters, # Number of averaging timing iterations used to select kernels + "workspace_size": workspace_size, # Maximum size of workspace given to TensorRT + "calibrator": calibrator, + "truncate_long_and_double": truncate_long_and_double, + "torch_fallback": { + "enabled": not require_full_compilation, + "forced_fallback_ops": torch_executed_ops, + "forced_fallback_modules": torch_executed_modules, + "min_block_size": min_block_size, + }, + } + + compiled_cpp_mod = _C.compile_graph(module._c, _parse_compile_spec(spec)) + compiled_module = torch.jit._recursive.wrap_cpp_module(compiled_cpp_mod) + return compiled_module
+ + +
[docs]def convert_method_to_trt_engine( + module: torch.jit.ScriptModule, + method_name: str, + inputs=[], + device=Device._current_device(), + disable_tf32=False, + sparse_weights=False, + enabled_precisions=set(), + refit=False, + debug=False, + capability=_enums.EngineCapability.default, + num_avg_timing_iters=1, + workspace_size=0, + dla_sram_size=1048576, + dla_local_dram_size=1073741824, + dla_global_dram_size=536870912, + truncate_long_and_double=False, + calibrator=None, +) -> str: + """Convert a TorchScript module method to a serialized TensorRT engine + + Converts a specified method of a module to a serialized TensorRT engine given a dictionary of conversion settings + + Arguments: + module (torch.jit.ScriptModule): Source module, a result of tracing or scripting a PyTorch + ``torch.nn.Module`` + method_name (str): Name of method to convert + + Keyword Args: + inputs (List[Union(torch_tensorrt.Input, torch.Tensor)]): **Required** List of specifications of input shape, dtype and memory layout for inputs to the module. This argument is required. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using + torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum + to select device type. :: + + input=[ + torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1 + torch_tensorrt.Input( + min_shape=(1, 224, 224, 3), + opt_shape=(1, 512, 512, 3), + max_shape=(1, 1024, 1024, 3), + dtype=torch.int32 + format=torch.channel_last + ), # Dynamic input shape for input #2 + torch.randn((1, 3, 224, 244)) # Use an example tensor and let torch_tensorrt infer settings + ] + + input_signature Union(List, Tuple, torch_tensorrt.Input, torch.Tensor): A formatted collection of input specifications for the module. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using + torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum to select device type. **This API should be considered beta-level stable and may change in the future** :: + + input_signature=([ + torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1 + torch_tensorrt.Input( + min_shape=(1, 224, 224, 3), + opt_shape=(1, 512, 512, 3), + max_shape=(1, 1024, 1024, 3), + dtype=torch.int32 + format=torch.channel_last + ), # Dynamic input shape for input #2 + ], torch.randn((1, 3, 224, 244))) # Use an example tensor and let torch_tensorrt infer settings for input #3 + + device (Union(torch_tensorrt.Device, torch.device, dict)): Target device for TensorRT engines to run on :: + + device=torch_tensorrt.Device("dla:1", allow_gpu_fallback=True) + + disable_tf32 (bool): Force FP32 layers to use traditional as FP32 format vs the default behavior of rounding the inputs to 10-bit mantissas before multiplying, but accumulates the sum using 23-bit mantissas + sparse_weights (bool): Enable sparsity for convolution and fully connected layers. + enabled_precision (Set(Union(torch.dtype, torch_tensorrt.dtype))): The set of datatypes that TensorRT can use when selecting kernels + refit (bool): Enable refitting + debug (bool): Enable debuggable engine + capability (torch_tensorrt.EngineCapability): Restrict kernel selection to safe gpu kernels or safe dla kernels + num_avg_timing_iters (int): Number of averaging timing iterations used to select kernels + workspace_size (int): Maximum size of workspace given to TensorRT + dla_sram_size (int): Fast software managed RAM used by DLA to communicate within a layer. + dla_local_dram_size (int): Host RAM used by DLA to share intermediate tensor data across operations + dla_global_dram_size (int): Host RAM used by DLA to store weights and metadata for execution + truncate_long_and_double (bool): Truncate weights provided in int64 or double (float64) to int32 and float32 + calibrator (Union(torch_tensorrt._C.IInt8Calibrator, tensorrt.IInt8Calibrator)): Calibrator object which will provide data to the PTQ system for INT8 Calibration + + Returns: + bytes: Serialized TensorRT engine, can either be saved to a file or deserialized via TensorRT APIs + """ + if isinstance(module, torch.jit.ScriptFunction): + raise TypeError( + "torch.jit.ScriptFunctions currently are not directly supported, wrap the function in a module to compile" + ) + + compile_spec = { + "inputs": inputs, + "device": device, + "disable_tf32": disable_tf32, # Force FP32 layers to use traditional as FP32 format vs the default behavior of rounding the inputs to 10-bit mantissas before multiplying, but accumulates the sum using 23-bit mantissas + "sparse_weights": sparse_weights, # Enable sparsity for convolution and fully connected layers. + "enabled_precisions": enabled_precisions, # Enabling FP16 kernels + "refit": refit, # enable refit + "debug": debug, # enable debuggable engine + "capability": capability, # Restrict kernel selection to safe gpu kernels or safe dla kernels + "num_avg_timing_iters": num_avg_timing_iters, # Number of averaging timing iterations used to select kernels + "workspace_size": workspace_size, # Maximum size of workspace given to TensorRT + "calibrator": calibrator, + "truncate_long_and_double": truncate_long_and_double, + } + + return _C.convert_graph_to_trt_engine( + module._c, method_name, _parse_compile_spec(compile_spec) + )
+ + +
[docs]def embed_engine_in_new_module( + serialized_engine: bytes, device=Device._current_device() +) -> torch.jit.ScriptModule: + """Takes a pre-built serialized TensorRT engine and embeds it within a TorchScript module + + Takes a pre-built serialied TensorRT engine (as bytes) and embeds it within a TorchScript module. + Registers the forward method to execute the TensorRT engine with the function signature: + + forward(Tensor[]) -> Tensor[] + + TensorRT bindings must have names with the following format: + - [symbol].[index in input / output array] + ex. + - [x.0, x.1, x.2] -> [y.0] + + Module can be save with engine embedded with torch.jit.save and moved / loaded according to torch_tensorrt portability rules + + Arguments: + serialized_engine (bytes): Serialized TensorRT engine from either torch_tensorrt or TensorRT APIs + + Keyword Arguments: + device (Union(torch_tensorrt.Device, torch.device, dict)): Target device to run engine on. Must be compatible with engine provided. Default: Current active device + + Returns: + torch.jit.ScriptModule: New TorchScript module with engine embedded + """ + cpp_mod = _C.embed_engine_in_new_module(serialized_engine, _parse_device(device)) + return torch.jit._recursive.wrap_cpp_module(cpp_mod)
+ + +
[docs]def check_method_op_support(module: torch.jit.ScriptModule, method_name: str) -> bool: + """Checks to see if a method is fully supported by torch_tensorrt + + Checks if a method of a TorchScript module can be compiled by torch_tensorrt, if not, a list of operators + that are not supported are printed out and the function returns false, else true. + + Arguments: + module (torch.jit.ScriptModule): Source module, a result of tracing or scripting a PyTorch + ``torch.nn.Module`` + method_name (str): Name of method to check + + Returns: + bool: True if supported Method + """ + return _C.check_method_op_support(module._c, method_name)
+
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2022, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_notebooks/CitriNet-example.html b/docs/v1.2.0/_notebooks/CitriNet-example.html new file mode 100644 index 0000000000..8c4ae285bf --- /dev/null +++ b/docs/v1.2.0/_notebooks/CitriNet-example.html @@ -0,0 +1,1753 @@ + + + + + + + + + + + + + Torch-TensorRT Getting Started - CitriNet — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Torch-TensorRT Getting Started - CitriNet
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ + + +
+
[1]:
+
+
+
# Copyright 2019 NVIDIA Corporation. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
+
+

198e4deb2921411abba2a37241da72ab

+
+

Torch-TensorRT Getting Started - CitriNet

+
+

Overview

+

Citrinet is an acoustic model used for the speech to text recognition task. It is a version of QuartzNet that extends ContextNet, utilizing subword encoding (via Word Piece tokenization) and Squeeze-and-Excitation(SE) mechanism and are therefore smaller than QuartzNet models.

+

CitriNet models take in audio segments and transcribe them to letter, byte pair, or word piece sequences.

+

alt

+
+

Learning objectives

+

This notebook demonstrates the steps for optimizing a pretrained CitriNet model with Torch-TensorRT, and running it to test the speedup obtained.

+
+
+
+

Content

+
    +
  1. Requirements

  2. +
  3. Download Citrinet model

  4. +
  5. Create Torch-TensorRT modules

  6. +
  7. Benchmark Torch-TensorRT models

  8. +
  9. Conclusion

  10. +
+

## 1. Requirements

+

Follow the steps in README to prepare a Docker container, within which you can run this notebook. This notebook assumes that you are within a Jupyter environment in a docker container with Torch-TensorRT installed, such as an NGC monthly release of nvcr.io/nvidia/pytorch:<yy.mm>-py3 (where yy indicates the last two numbers of a calendar year, and mm indicates the month in two-digit numerical form)

+

Now that you are in the docker, the next step is to install the required dependencies.

+
+
[2]:
+
+
+
# Install dependencies
+!pip install wget
+!apt-get update && DEBIAN_FRONTEND=noninteractive  apt-get install -y libsndfile1 ffmpeg
+!pip install Cython
+
+## Install NeMo
+!pip install nemo_toolkit[all]==1.5.1
+
+
+
+
+
+
+
+
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Requirement already satisfied: wget in /opt/conda/lib/python3.8/site-packages (3.2)
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+Hit:1 http://security.ubuntu.com/ubuntu focal-security InRelease
+Hit:2 http://archive.ubuntu.com/ubuntu focal InRelease
+Hit:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease
+Hit:4 http://archive.ubuntu.com/ubuntu focal-backports InRelease
+Reading package lists... Done
+Reading package lists... Done
+Building dependency tree
+Reading state information... Done
+libsndfile1 is already the newest version (1.0.28-7ubuntu0.1).
+ffmpeg is already the newest version (7:4.2.4-1ubuntu0.1).
+0 upgraded, 0 newly installed, 0 to remove and 22 not upgraded.
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Requirement already satisfied: Cython in /opt/conda/lib/python3.8/site-packages (0.29.28)
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Requirement already satisfied: nemo_toolkit[all]==1.5.1 in /opt/conda/lib/python3.8/site-packages (1.5.1)
+Requirement already satisfied: numpy>=1.18.2 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.22.3)
+Requirement already satisfied: onnx>=1.7.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.10.1)
+Requirement already satisfied: python-dateutil in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.8.2)
+Requirement already satisfied: tqdm>=4.41.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.63.0)
+Requirement already satisfied: sentencepiece<1.0.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.96)
+Requirement already satisfied: wget in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.2)
+Requirement already satisfied: numba in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.53.1)
+Requirement already satisfied: torch in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.12.0a0+2c916ef)
+Requirement already satisfied: unidecode in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.3.4)
+Requirement already satisfied: frozendict in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.3.2)
+Requirement already satisfied: wrapt in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.14.0)
+Requirement already satisfied: scikit-learn in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.24.2)
+Requirement already satisfied: ruamel.yaml in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.17.21)
+Requirement already satisfied: pesq in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.0.3)
+Requirement already satisfied: torchvision in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.13.0a0)
+Requirement already satisfied: gdown in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.4.0)
+Requirement already satisfied: editdistance in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.6.0)
+Requirement already satisfied: boto3 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.21.45)
+Requirement already satisfied: isort[requirements]<5 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.3.21)
+Requirement already satisfied: hydra-core>=1.1.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.1.2)
+Requirement already satisfied: youtokentome>=1.0.5 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.0.6)
+Requirement already satisfied: pytorch-lightning>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.6.1)
+Requirement already satisfied: jieba in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.42.1)
+Requirement already satisfied: fasttext in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.9.2)
+Requirement already satisfied: soundfile in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.10.3.post1)
+Requirement already satisfied: kaldiio in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.17.2)
+Requirement already satisfied: pangu in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.0.6.1)
+Requirement already satisfied: kaldi-python-io in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.2.2)
+Requirement already satisfied: parameterized in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.8.1)
+Requirement already satisfied: h5py in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.6.0)
+Requirement already satisfied: rapidfuzz in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.10)
+Requirement already satisfied: marshmallow in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.15.0)
+Requirement already satisfied: opencc in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.1.3)
+Requirement already satisfied: braceexpand in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.7)
+Requirement already satisfied: omegaconf>=2.1.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.1.2)
+Requirement already satisfied: sphinx in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.4.0)
+Requirement already satisfied: pillow in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (9.0.0)
+Requirement already satisfied: wordninja==2.0.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.0)
+Requirement already satisfied: torch-stft in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.4)
+Requirement already satisfied: sox in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.4.1)
+Requirement already satisfied: librosa in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.9.1)
+Requirement already satisfied: regex in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2022.3.15)
+Requirement already satisfied: sacrebleu[ja] in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.0)
+Requirement already satisfied: black==19.10b0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (19.10b0)
+Requirement already satisfied: pydub in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.25.1)
+Requirement already satisfied: sphinxcontrib-bibtex in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.4.2)
+Requirement already satisfied: inflect in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (5.5.2)
+Requirement already satisfied: pyannote.core in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.4)
+Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (21.3)
+Requirement already satisfied: kaldi-io in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.9.4)
+Requirement already satisfied: pyannote.metrics in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.2)
+Requirement already satisfied: g2p-en in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.1.0)
+Requirement already satisfied: matplotlib in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.5.1)
+Requirement already satisfied: torchmetrics>=0.4.1rc0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.8.0)
+Requirement already satisfied: nltk>=3.6.5 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.7)
+Requirement already satisfied: pyyaml<6 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (5.4.1)
+Requirement already satisfied: scipy in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.6.3)
+Requirement already satisfied: ipywidgets in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (7.7.0)
+Requirement already satisfied: pytest in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (6.2.5)
+Requirement already satisfied: pandas in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.3.5)
+Requirement already satisfied: pytest-runner in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (6.0.0)
+Requirement already satisfied: transformers>=4.0.1 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.18.0)
+Requirement already satisfied: sacremoses>=0.0.43 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.0.49)
+Requirement already satisfied: pystoi in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.3.3)
+Requirement already satisfied: attrdict in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.1)
+Requirement already satisfied: webdataset<=0.1.62,>=0.1.48 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.62)
+Requirement already satisfied: wandb in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.12.15)
+Requirement already satisfied: pypinyin in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.46.0)
+Requirement already satisfied: attrs>=18.1.0 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (21.4.0)
+Requirement already satisfied: appdirs in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (1.4.4)
+Requirement already satisfied: typed-ast>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (1.5.3)
+Requirement already satisfied: pathspec<1,>=0.6 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (0.9.0)
+Requirement already satisfied: click>=6.5 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (8.0.4)
+Requirement already satisfied: toml>=0.9.4 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (0.10.2)
+Requirement already satisfied: antlr4-python3-runtime==4.8 in /opt/conda/lib/python3.8/site-packages (from hydra-core>=1.1.0->nemo_toolkit[all]==1.5.1) (4.8)
+Requirement already satisfied: importlib-resources<5.3 in /opt/conda/lib/python3.8/site-packages (from hydra-core>=1.1.0->nemo_toolkit[all]==1.5.1) (5.2.3)
+Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources<5.3->hydra-core>=1.1.0->nemo_toolkit[all]==1.5.1) (3.7.0)
+Requirement already satisfied: pip-api in /opt/conda/lib/python3.8/site-packages (from isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.0.29)
+Requirement already satisfied: pipreqs in /opt/conda/lib/python3.8/site-packages (from isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.4.11)
+Requirement already satisfied: fonttools>=4.22.0 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (4.31.2)
+Requirement already satisfied: kiwisolver>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (1.4.0)
+Requirement already satisfied: pyparsing>=2.2.1 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (3.0.7)
+Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (0.11.0)
+Requirement already satisfied: joblib in /opt/conda/lib/python3.8/site-packages (from nltk>=3.6.5->nemo_toolkit[all]==1.5.1) (1.1.0)
+Requirement already satisfied: typing-extensions>=3.6.2.1 in /opt/conda/lib/python3.8/site-packages (from onnx>=1.7.0->nemo_toolkit[all]==1.5.1) (4.1.1)
+Requirement already satisfied: six in /opt/conda/lib/python3.8/site-packages (from onnx>=1.7.0->nemo_toolkit[all]==1.5.1) (1.16.0)
+Requirement already satisfied: protobuf>=3.12.2 in /opt/conda/lib/python3.8/site-packages (from onnx>=1.7.0->nemo_toolkit[all]==1.5.1) (3.19.4)
+Requirement already satisfied: pyDeprecate<0.4.0,>=0.3.1 in /opt/conda/lib/python3.8/site-packages (from pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.3.2)
+Requirement already satisfied: tensorboard>=2.2.0 in /opt/conda/lib/python3.8/site-packages (from pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.8.0)
+Requirement already satisfied: fsspec[http]!=2021.06.0,>=2021.05.0 in /opt/conda/lib/python3.8/site-packages (from pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2022.2.0)
+Requirement already satisfied: requests in /opt/conda/lib/python3.8/site-packages (from fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.27.1)
+Requirement already satisfied: aiohttp in /opt/conda/lib/python3.8/site-packages (from fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.8.1)
+Requirement already satisfied: werkzeug>=0.11.15 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.0.3)
+Requirement already satisfied: markdown>=2.6.8 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.3.6)
+Requirement already satisfied: setuptools>=41.0.0 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (59.5.0)
+Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.4.6)
+Requirement already satisfied: google-auth<3,>=1.6.3 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.6.2)
+Requirement already satisfied: wheel>=0.26 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.37.1)
+Requirement already satisfied: grpcio>=1.24.3 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.44.0)
+Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.6.1)
+Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.8.1)
+Requirement already satisfied: absl-py>=0.4 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.0.0)
+Requirement already satisfied: cachetools<6.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (5.0.0)
+Requirement already satisfied: pyasn1-modules>=0.2.1 in /opt/conda/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.2.8)
+Requirement already satisfied: rsa<5,>=3.1.4 in /opt/conda/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (4.8)
+Requirement already satisfied: requests-oauthlib>=0.7.0 in /opt/conda/lib/python3.8/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.3.1)
+Requirement already satisfied: importlib-metadata>=4.4 in /opt/conda/lib/python3.8/site-packages (from markdown>=2.6.8->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (4.11.3)
+Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /opt/conda/lib/python3.8/site-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.4.8)
+Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.0.12)
+Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2021.10.8)
+Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.3)
+Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.26.8)
+Requirement already satisfied: oauthlib>=3.0.0 in /opt/conda/lib/python3.8/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.2.0)
+Requirement already satisfied: huggingface-hub<1.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from transformers>=4.0.1->nemo_toolkit[all]==1.5.1) (0.5.1)
+Requirement already satisfied: tokenizers!=0.11.3,<0.13,>=0.11.1 in /opt/conda/lib/python3.8/site-packages (from transformers>=4.0.1->nemo_toolkit[all]==1.5.1) (0.12.1)
+Requirement already satisfied: filelock in /opt/conda/lib/python3.8/site-packages (from transformers>=4.0.1->nemo_toolkit[all]==1.5.1) (3.6.0)
+Requirement already satisfied: frozenlist>=1.1.1 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.3.0)
+Requirement already satisfied: yarl<2.0,>=1.0 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.7.2)
+Requirement already satisfied: async-timeout<5.0,>=4.0.0a3 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (4.0.2)
+Requirement already satisfied: multidict<7.0,>=4.5 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (6.0.2)
+Requirement already satisfied: aiosignal>=1.1.2 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.2.0)
+Requirement already satisfied: s3transfer<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from boto3->nemo_toolkit[all]==1.5.1) (0.5.2)
+Requirement already satisfied: botocore<1.25.0,>=1.24.45 in /opt/conda/lib/python3.8/site-packages (from boto3->nemo_toolkit[all]==1.5.1) (1.24.45)
+Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /opt/conda/lib/python3.8/site-packages (from boto3->nemo_toolkit[all]==1.5.1) (1.0.0)
+Requirement already satisfied: pybind11>=2.2 in /opt/conda/lib/python3.8/site-packages (from fasttext->nemo_toolkit[all]==1.5.1) (2.9.1)
+Requirement already satisfied: distance>=0.1.3 in /opt/conda/lib/python3.8/site-packages (from g2p-en->nemo_toolkit[all]==1.5.1) (0.1.3)
+Requirement already satisfied: beautifulsoup4 in /opt/conda/lib/python3.8/site-packages (from gdown->nemo_toolkit[all]==1.5.1) (4.10.0)
+Requirement already satisfied: soupsieve>1.2 in /opt/conda/lib/python3.8/site-packages (from beautifulsoup4->gdown->nemo_toolkit[all]==1.5.1) (2.3.1)
+Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.0)
+Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (8.1.1)
+Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (6.9.2)
+Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (1.1.0)
+Requirement already satisfied: widgetsnbextension~=3.6.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (3.6.0)
+Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (5.1.1)
+Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (5.2.0)
+Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (7.1.2)
+Requirement already satisfied: psutil in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (5.9.0)
+Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (6.1)
+Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (1.5.1)
+Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (1.5.4)
+Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (0.1.3)
+Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.7.5)
+Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (5.1.1)
+Requirement already satisfied: pygments>=2.4.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.11.2)
+Requirement already satisfied: stack-data in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.0)
+Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (3.0.27)
+Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.0)
+Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.18.1)
+Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (4.8.0)
+Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.8.3)
+Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (0.4)
+Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (22.3.0)
+Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (4.9.2)
+Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets->nemo_toolkit[all]==1.5.1) (4.4.0)
+Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.18.1)
+Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.7.0)
+Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.5)
+Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (6.4.1)
+Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (1.8.0)
+Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.13.1)
+Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.13.3)
+Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (3.0.3)
+Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (6.4.4)
+Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (21.3.0)
+Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (21.2.0)
+Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (1.15.0)
+Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.21)
+Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.1.1)
+Requirement already satisfied: resampy>=0.2.2 in /opt/conda/lib/python3.8/site-packages (from librosa->nemo_toolkit[all]==1.5.1) (0.2.2)
+Requirement already satisfied: pooch>=1.0 in /opt/conda/lib/python3.8/site-packages (from librosa->nemo_toolkit[all]==1.5.1) (1.6.0)
+Requirement already satisfied: audioread>=2.1.5 in /opt/conda/lib/python3.8/site-packages (from librosa->nemo_toolkit[all]==1.5.1) (2.1.9)
+Requirement already satisfied: llvmlite<0.37,>=0.36.0rc1 in /opt/conda/lib/python3.8/site-packages (from numba->nemo_toolkit[all]==1.5.1) (0.36.0)
+Requirement already satisfied: threadpoolctl>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from scikit-learn->nemo_toolkit[all]==1.5.1) (3.1.0)
+Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.7.1)
+Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.5.13)
+Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (4.1.0)
+Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.8.4)
+Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (1.5.0)
+Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.6.0)
+Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.1.2)
+Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.5.1)
+Requirement already satisfied: pytz>=2017.3 in /opt/conda/lib/python3.8/site-packages (from pandas->nemo_toolkit[all]==1.5.1) (2021.3)
+Requirement already satisfied: pip in /opt/conda/lib/python3.8/site-packages (from pip-api->isort[requirements]<5->nemo_toolkit[all]==1.5.1) (21.2.4)
+Requirement already satisfied: yarg in /opt/conda/lib/python3.8/site-packages (from pipreqs->isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.1.9)
+Requirement already satisfied: docopt in /opt/conda/lib/python3.8/site-packages (from pipreqs->isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.6.2)
+Requirement already satisfied: simplejson>=3.8.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.core->nemo_toolkit[all]==1.5.1) (3.17.6)
+Requirement already satisfied: sortedcontainers>=2.0.4 in /opt/conda/lib/python3.8/site-packages (from pyannote.core->nemo_toolkit[all]==1.5.1) (2.4.0)
+Requirement already satisfied: tabulate>=0.7.7 in /opt/conda/lib/python3.8/site-packages (from pyannote.metrics->nemo_toolkit[all]==1.5.1) (0.8.9)
+Requirement already satisfied: pyannote.database>=4.0.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.metrics->nemo_toolkit[all]==1.5.1) (4.1.3)
+Requirement already satisfied: sympy>=1.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.metrics->nemo_toolkit[all]==1.5.1) (1.10.1)
+Requirement already satisfied: typer[all]>=0.2.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (0.4.0)
+Requirement already satisfied: mpmath>=0.19 in /opt/conda/lib/python3.8/site-packages (from sympy>=1.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (1.2.1)
+Requirement already satisfied: colorama<0.5.0,>=0.4.3 in /opt/conda/lib/python3.8/site-packages (from typer[all]>=0.2.1->pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (0.4.4)
+Requirement already satisfied: shellingham<2.0.0,>=1.3.0 in /opt/conda/lib/python3.8/site-packages (from typer[all]>=0.2.1->pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (1.4.0)
+Requirement already satisfied: py>=1.8.2 in /opt/conda/lib/python3.8/site-packages (from pytest->nemo_toolkit[all]==1.5.1) (1.11.0)
+Requirement already satisfied: iniconfig in /opt/conda/lib/python3.8/site-packages (from pytest->nemo_toolkit[all]==1.5.1) (1.1.1)
+Requirement already satisfied: pluggy<2.0,>=0.12 in /opt/conda/lib/python3.8/site-packages (from pytest->nemo_toolkit[all]==1.5.1) (1.0.0)
+Requirement already satisfied: jarowinkler<1.1.0,>=1.0.2 in /opt/conda/lib/python3.8/site-packages (from rapidfuzz->nemo_toolkit[all]==1.5.1) (1.0.2)
+Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.7.1)
+Requirement already satisfied: ruamel.yaml.clib>=0.2.6 in /opt/conda/lib/python3.8/site-packages (from ruamel.yaml->nemo_toolkit[all]==1.5.1) (0.2.6)
+Requirement already satisfied: portalocker in /opt/conda/lib/python3.8/site-packages (from sacrebleu[ja]->nemo_toolkit[all]==1.5.1) (2.4.0)
+Requirement already satisfied: ipadic<2.0,>=1.0 in /opt/conda/lib/python3.8/site-packages (from sacrebleu[ja]->nemo_toolkit[all]==1.5.1) (1.0.0)
+Requirement already satisfied: mecab-python3==1.0.3 in /opt/conda/lib/python3.8/site-packages (from sacrebleu[ja]->nemo_toolkit[all]==1.5.1) (1.0.3)
+Requirement already satisfied: sphinxcontrib-htmlhelp>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (2.0.0)
+Requirement already satisfied: alabaster<0.8,>=0.7 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (0.7.12)
+Requirement already satisfied: babel>=1.3 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (2.9.1)
+Requirement already satisfied: sphinxcontrib-serializinghtml>=1.1.5 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.1.5)
+Requirement already satisfied: sphinxcontrib-devhelp in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.2)
+Requirement already satisfied: sphinxcontrib-jsmath in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.1)
+Requirement already satisfied: sphinxcontrib-qthelp in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.3)
+Requirement already satisfied: snowballstemmer>=1.1 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (2.2.0)
+Requirement already satisfied: imagesize in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.3.0)
+Requirement already satisfied: sphinxcontrib-applehelp in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.2)
+Requirement already satisfied: docutils<0.18,>=0.14 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (0.17.1)
+Requirement already satisfied: pybtex-docutils>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from sphinxcontrib-bibtex->nemo_toolkit[all]==1.5.1) (1.0.1)
+Requirement already satisfied: pybtex>=0.24 in /opt/conda/lib/python3.8/site-packages (from sphinxcontrib-bibtex->nemo_toolkit[all]==1.5.1) (0.24.0)
+Requirement already satisfied: latexcodec>=1.0.4 in /opt/conda/lib/python3.8/site-packages (from pybtex>=0.24->sphinxcontrib-bibtex->nemo_toolkit[all]==1.5.1) (2.0.1)
+Requirement already satisfied: pure-eval in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.2)
+Requirement already satisfied: asttokens in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.0.5)
+Requirement already satisfied: executing in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.8.3)
+Requirement already satisfied: pathtools in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (0.1.2)
+Requirement already satisfied: setproctitle in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (1.2.3)
+Requirement already satisfied: GitPython>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (3.1.27)
+Requirement already satisfied: sentry-sdk>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (1.5.10)
+Requirement already satisfied: shortuuid>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (1.0.8)
+Requirement already satisfied: docker-pycreds>=0.4.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (0.4.0)
+Requirement already satisfied: promise<3,>=2.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (2.3)
+Requirement already satisfied: gitdb<5,>=4.0.1 in /opt/conda/lib/python3.8/site-packages (from GitPython>=1.0.0->wandb->nemo_toolkit[all]==1.5.1) (4.0.9)
+Requirement already satisfied: smmap<6,>=3.0.1 in /opt/conda/lib/python3.8/site-packages (from gitdb<5,>=4.0.1->GitPython>=1.0.0->wandb->nemo_toolkit[all]==1.5.1) (5.0.0)
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+
+
+

## 2. Download Citrinet model

+

Next, we download a pretrained Nemo Citrinet model and convert it to a Torchscript module:

+
+
[3]:
+
+
+
import nemo
+import torch
+
+import nemo.collections.asr as nemo_asr
+from nemo.core import typecheck
+typecheck.set_typecheck_enabled(False)
+
+
+
+
+
[4]:
+
+
+
variant = 'stt_en_citrinet_256'
+
+print(f"Downloading and saving {variant}...")
+asr_model = nemo_asr.models.EncDecCTCModelBPE.from_pretrained(model_name=variant)
+asr_model.export(f"{variant}.ts")
+
+
+
+
+
+
+
+
+Downloading and saving stt_en_citrinet_256...
+[NeMo I 2022-04-21 23:12:45 cloud:56] Found existing object /root/.cache/torch/NeMo/NeMo_1.5.1/stt_en_citrinet_256/91a9cc5850784b2065e8a0aa3d526fd9/stt_en_citrinet_256.nemo.
+[NeMo I 2022-04-21 23:12:45 cloud:62] Re-using file from: /root/.cache/torch/NeMo/NeMo_1.5.1/stt_en_citrinet_256/91a9cc5850784b2065e8a0aa3d526fd9/stt_en_citrinet_256.nemo
+[NeMo I 2022-04-21 23:12:45 common:728] Instantiating model from pre-trained checkpoint
+[NeMo I 2022-04-21 23:12:46 mixins:146] Tokenizer SentencePieceTokenizer initialized with 1024 tokens
+
+
+
+
+
+
+
+[NeMo W 2022-04-21 23:12:47 modelPT:130] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.
+    Train config :
+    manifest_filepath: null
+    sample_rate: 16000
+    batch_size: 32
+    trim_silence: true
+    max_duration: 16.7
+    shuffle: true
+    is_tarred: false
+    tarred_audio_filepaths: null
+    use_start_end_token: false
+
+[NeMo W 2022-04-21 23:12:47 modelPT:137] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s).
+    Validation config :
+    manifest_filepath: null
+    sample_rate: 16000
+    batch_size: 32
+    shuffle: false
+    use_start_end_token: false
+
+[NeMo W 2022-04-21 23:12:47 modelPT:143] Please call the ModelPT.setup_test_data() or ModelPT.setup_multiple_test_data() method and provide a valid configuration file to setup the test data loader(s).
+    Test config :
+    manifest_filepath: null
+    sample_rate: 16000
+    batch_size: 32
+    shuffle: false
+    use_start_end_token: false
+
+
+
+
+
+
+
+
+[NeMo I 2022-04-21 23:12:47 features:265] PADDING: 16
+[NeMo I 2022-04-21 23:12:47 features:282] STFT using torch
+
+
+
+
+
+
+
+[NeMo W 2022-04-21 23:12:47 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/nemo/collections/asr/parts/preprocessing/features.py:315: FutureWarning: Pass sr=16000, n_fft=512 as keyword args. From version 0.10 passing these as positional arguments will result in an error
+      librosa.filters.mel(sample_rate, self.n_fft, n_mels=nfilt, fmin=lowfreq, fmax=highfreq), dtype=torch.float
+
+
+
+
+
+
+
+
+[NeMo I 2022-04-21 23:12:49 save_restore_connector:149] Model EncDecCTCModelBPE was successfully restored from /root/.cache/torch/NeMo/NeMo_1.5.1/stt_en_citrinet_256/91a9cc5850784b2065e8a0aa3d526fd9/stt_en_citrinet_256.nemo.
+
+
+
+
+
+
+
+[NeMo W 2022-04-21 23:12:49 export_utils:198] Swapped 0 modules
+[NeMo W 2022-04-21 23:12:49 conv_asr:73] Turned off 235 masked convolutions
+[NeMo W 2022-04-21 23:12:49 export_utils:198] Swapped 0 modules
+[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/jit/_trace.py:916: UserWarning: `optimize` is deprecated and has no effect. Use `with torch.jit.optimized_execution() instead
+      warnings.warn(
+
+[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:668: LightningDeprecationWarning: The `LightningModule.model_size` property was deprecated in v1.5 and will be removed in v1.7. Please use the `pytorch_lightning.utilities.memory.get_model_size_mb`.
+      if hasattr(mod, name):
+
+[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:669: LightningDeprecationWarning: The `LightningModule.model_size` property was deprecated in v1.5 and will be removed in v1.7. Please use the `pytorch_lightning.utilities.memory.get_model_size_mb`.
+      item = getattr(mod, name)
+
+[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:668: LightningDeprecationWarning: `LightningModule.use_amp` was deprecated in v1.6 and will be removed in v1.8. Please use `Trainer.amp_backend`.
+      if hasattr(mod, name):
+
+[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:669: LightningDeprecationWarning: `LightningModule.use_amp` was deprecated in v1.6 and will be removed in v1.8. Please use `Trainer.amp_backend`.
+      item = getattr(mod, name)
+
+
+
+
+
[4]:
+
+
+
+
+(['stt_en_citrinet_256.ts'],
+ ['nemo.collections.asr.models.ctc_bpe_models.EncDecCTCModelBPE exported to ONNX'])
+
+
+
+

Benchmark utility

+

Let us define a helper benchmarking function, then benchmark the original Pytorch model.

+
+
[5]:
+
+
+
from __future__ import print_function
+from __future__ import absolute_import
+from __future__ import division
+
+import argparse
+import timeit
+import numpy as np
+import torch
+import torch_tensorrt as trtorch
+import torch.backends.cudnn as cudnn
+
+def benchmark(model, input_tensor, num_loops, model_name, batch_size):
+    def timeGraph(model, input_tensor, num_loops):
+        print("Warm up ...")
+        with torch.no_grad():
+            for _ in range(20):
+                features = model(input_tensor)
+
+        torch.cuda.synchronize()
+        print("Start timing ...")
+        timings = []
+        with torch.no_grad():
+            for i in range(num_loops):
+                start_time = timeit.default_timer()
+                features = model(input_tensor)
+                torch.cuda.synchronize()
+                end_time = timeit.default_timer()
+                timings.append(end_time - start_time)
+                # print("Iteration {}: {:.6f} s".format(i, end_time - start_time))
+        return timings
+    def printStats(graphName, timings, batch_size):
+        times = np.array(timings)
+        steps = len(times)
+        speeds = batch_size / times
+        time_mean = np.mean(times)
+        time_med = np.median(times)
+        time_99th = np.percentile(times, 99)
+        time_std = np.std(times, ddof=0)
+        speed_mean = np.mean(speeds)
+        speed_med = np.median(speeds)
+        msg = ("\n%s =================================\n"
+                "batch size=%d, num iterations=%d\n"
+                "  Median samples/s: %.1f, mean: %.1f\n"
+                "  Median latency (s): %.6f, mean: %.6f, 99th_p: %.6f, std_dev: %.6f\n"
+                ) % (graphName,
+                    batch_size, steps,
+                    speed_med, speed_mean,
+                    time_med, time_mean, time_99th, time_std)
+        print(msg)
+    timings = timeGraph(model, input_tensor, num_loops)
+    printStats(model_name, timings, batch_size)
+
+precisions_str = 'fp32' # Precision (default=fp32, fp16)
+variant = 'stt_en_citrinet_256' # Nemo Citrinet variant
+batch_sizes = [1, 8, 32, 128] # Batch sizes (default=1,8,32,128)
+trt = False # If True, infer with Torch-TensorRT engine. Else, infer with Pytorch model.
+precision = torch.float32 if precisions_str =='fp32' else torch.float16
+
+for batch_size in batch_sizes:
+    if trt:
+        model_name = f"{variant}_bs{batch_size}_{precision}.torch-tensorrt"
+    else:
+        model_name = f"{variant}.ts"
+
+    print(f"Loading model: {model_name}")
+    # Load traced model to CPU first
+    model = torch.jit.load(model_name).cuda()
+    cudnn.benchmark = True
+    # Create random input tensor of certain size
+    torch.manual_seed(12345)
+    input_shape=(batch_size, 80, 1488)
+    input_tensor = torch.randn(input_shape).cuda()
+
+    # Timing graph inference
+    benchmark(model, input_tensor, 50, model_name, batch_size)
+
+
+
+
+
+
+
+
+Loading model: stt_en_citrinet_256.ts
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256.ts =================================
+batch size=1, num iterations=50
+  Median samples/s: 102.0, mean: 102.0
+  Median latency (s): 0.009802, mean: 0.009803, 99th_p: 0.009836, std_dev: 0.000014
+
+Loading model: stt_en_citrinet_256.ts
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256.ts =================================
+batch size=8, num iterations=50
+  Median samples/s: 429.1, mean: 429.1
+  Median latency (s): 0.018642, mean: 0.018643, 99th_p: 0.018670, std_dev: 0.000014
+
+Loading model: stt_en_citrinet_256.ts
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256.ts =================================
+batch size=32, num iterations=50
+  Median samples/s: 551.3, mean: 551.2
+  Median latency (s): 0.058047, mean: 0.058053, 99th_p: 0.058375, std_dev: 0.000106
+
+Loading model: stt_en_citrinet_256.ts
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256.ts =================================
+batch size=128, num iterations=50
+  Median samples/s: 594.1, mean: 594.1
+  Median latency (s): 0.215434, mean: 0.215446, 99th_p: 0.215806, std_dev: 0.000116
+
+
+
+

Confirming the GPU we are using here:

+
+
[6]:
+
+
+
!nvidia-smi
+
+
+
+
+
+
+
+
+Thu Apr 21 23:13:32 2022
++-----------------------------------------------------------------------------+
+| NVIDIA-SMI 510.47.03    Driver Version: 510.47.03    CUDA Version: 11.6     |
+|-------------------------------+----------------------+----------------------+
+| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
+| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
+|                               |                      |               MIG M. |
+|===============================+======================+======================|
+|   0  NVIDIA TITAN V      On   | 00000000:17:00.0 Off |                  N/A |
+| 38%   55C    P2    42W / 250W |   2462MiB / 12288MiB |      0%      Default |
+|                               |                      |                  N/A |
++-------------------------------+----------------------+----------------------+
+|   1  NVIDIA TITAN V      On   | 00000000:65:00.0 Off |                  N/A |
+| 28%   39C    P8    26W / 250W |    112MiB / 12288MiB |      0%      Default |
+|                               |                      |                  N/A |
++-------------------------------+----------------------+----------------------+
+
++-----------------------------------------------------------------------------+
+| Processes:                                                                  |
+|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
+|        ID   ID                                                   Usage      |
+|=============================================================================|
+|    0   N/A  N/A      3909      G                                       4MiB |
+|    0   N/A  N/A      6047      C                                    2453MiB |
+|    1   N/A  N/A      3909      G                                      39MiB |
+|    1   N/A  N/A      4161      G                                      67MiB |
++-----------------------------------------------------------------------------+
+
+
+

## 3. Create Torch-TensorRT modules

+

In this step, we optimize the Citrinet Torchscript module with Torch-TensorRT with various precisions and batch sizes.

+
+
[10]:
+
+
+
import torch
+import torch.nn as nn
+import torch_tensorrt as torchtrt
+import argparse
+
+variant = "stt_en_citrinet_256"
+precisions = [torch.float, torch.half]
+batch_sizes = [1,8,32,128]
+
+model = torch.jit.load(f"{variant}.ts")
+
+for precision in precisions:
+    for batch_size in batch_sizes:
+        compile_settings = {
+            "inputs": [torchtrt.Input(shape=[batch_size, 80, 1488])],
+            "enabled_precisions": {precision},
+            "workspace_size": 2000000000,
+            "truncate_long_and_double": True,
+        }
+        print(f"Generating Torchscript-TensorRT module for batchsize {batch_size} precision {precision}")
+        trt_ts_module = torchtrt.compile(model, **compile_settings)
+        torch.jit.save(trt_ts_module, f"{variant}_bs{batch_size}_{precision}.torch-tensorrt")
+
+
+
+
+
+
+
+
+Generating Torchscript-TensorRT module for batchsize 1 precision torch.float32
+Generating Torchscript-TensorRT module for batchsize 8 precision torch.float32
+Generating Torchscript-TensorRT module for batchsize 32 precision torch.float32
+Generating Torchscript-TensorRT module for batchsize 128 precision torch.float32
+Generating Torchscript-TensorRT module for batchsize 1 precision torch.float16
+Generating Torchscript-TensorRT module for batchsize 8 precision torch.float16
+Generating Torchscript-TensorRT module for batchsize 32 precision torch.float16
+Generating Torchscript-TensorRT module for batchsize 128 precision torch.float16
+
+
+

## 4. Benchmark Torch-TensorRT models

+

Finally, we are ready to benchmark the Torch-TensorRT optimized Citrinet models.

+
+
+

FP32 (single precision)

+
+
[13]:
+
+
+
precisions_str = 'fp32' # Precision (default=fp32, fp16)
+batch_sizes = [1, 8, 32, 128] # Batch sizes (default=1,8,32,128)
+precision = torch.float32 if precisions_str =='fp32' else torch.float16
+trt = True
+
+for batch_size in batch_sizes:
+    if trt:
+        model_name = f"{variant}_bs{batch_size}_{precision}.torch-tensorrt"
+    else:
+        model_name = f"{variant}.ts"
+
+    print(f"Loading model: {model_name}")
+    # Load traced model to CPU first
+    model = torch.jit.load(model_name).cuda()
+    cudnn.benchmark = True
+    # Create random input tensor of certain size
+    torch.manual_seed(12345)
+    input_shape=(batch_size, 80, 1488)
+    input_tensor = torch.randn(input_shape).cuda()
+
+    # Timing graph inference
+    benchmark(model, input_tensor, 50, model_name, batch_size)
+
+
+
+
+
+
+
+
+Loading model: stt_en_citrinet_256_bs1_torch.float32.torch-tensorrt
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256_bs1_torch.float32.torch-tensorrt =================================
+batch size=1, num iterations=50
+  Median samples/s: 242.2, mean: 218.0
+  Median latency (s): 0.004128, mean: 0.004825, 99th_p: 0.008071, std_dev: 0.001270
+
+Loading model: stt_en_citrinet_256_bs8_torch.float32.torch-tensorrt
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256_bs8_torch.float32.torch-tensorrt =================================
+batch size=8, num iterations=50
+  Median samples/s: 729.9, mean: 709.0
+  Median latency (s): 0.010961, mean: 0.011388, 99th_p: 0.016114, std_dev: 0.001256
+
+Loading model: stt_en_citrinet_256_bs32_torch.float32.torch-tensorrt
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256_bs32_torch.float32.torch-tensorrt =================================
+batch size=32, num iterations=50
+  Median samples/s: 955.6, mean: 953.4
+  Median latency (s): 0.033488, mean: 0.033572, 99th_p: 0.035722, std_dev: 0.000545
+
+Loading model: stt_en_citrinet_256_bs128_torch.float32.torch-tensorrt
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256_bs128_torch.float32.torch-tensorrt =================================
+batch size=128, num iterations=50
+  Median samples/s: 1065.8, mean: 1069.4
+  Median latency (s): 0.120097, mean: 0.119708, 99th_p: 0.121618, std_dev: 0.001260
+
+
+
+
+
+

FP16 (half precision)

+
+
[14]:
+
+
+
precisions_str = 'fp16' # Precision (default=fp32, fp16)
+batch_sizes = [1, 8, 32, 128] # Batch sizes (default=1,8,32,128)
+precision = torch.float32 if precisions_str =='fp32' else torch.float16
+
+for batch_size in batch_sizes:
+    if trt:
+        model_name = f"{variant}_bs{batch_size}_{precision}.torch-tensorrt"
+    else:
+        model_name = f"{variant}.ts"
+
+    print(f"Loading model: {model_name}")
+    # Load traced model to CPU first
+    model = torch.jit.load(model_name).cuda()
+    cudnn.benchmark = True
+    # Create random input tensor of certain size
+    torch.manual_seed(12345)
+    input_shape=(batch_size, 80, 1488)
+    input_tensor = torch.randn(input_shape).cuda()
+
+    # Timing graph inference
+    benchmark(model, input_tensor, 50, model_name, batch_size)
+
+
+
+
+
+
+
+
+Loading model: stt_en_citrinet_256_bs1_torch.float16.torch-tensorrt
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256_bs1_torch.float16.torch-tensorrt =================================
+batch size=1, num iterations=50
+  Median samples/s: 288.9, mean: 272.9
+  Median latency (s): 0.003462, mean: 0.003774, 99th_p: 0.006846, std_dev: 0.000820
+
+Loading model: stt_en_citrinet_256_bs8_torch.float16.torch-tensorrt
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256_bs8_torch.float16.torch-tensorrt =================================
+batch size=8, num iterations=50
+  Median samples/s: 1201.0, mean: 1190.9
+  Median latency (s): 0.006661, mean: 0.006733, 99th_p: 0.008453, std_dev: 0.000368
+
+Loading model: stt_en_citrinet_256_bs32_torch.float16.torch-tensorrt
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256_bs32_torch.float16.torch-tensorrt =================================
+batch size=32, num iterations=50
+  Median samples/s: 1538.2, mean: 1516.4
+  Median latency (s): 0.020804, mean: 0.021143, 99th_p: 0.024492, std_dev: 0.000973
+
+Loading model: stt_en_citrinet_256_bs128_torch.float16.torch-tensorrt
+Warm up ...
+Start timing ...
+
+stt_en_citrinet_256_bs128_torch.float16.torch-tensorrt =================================
+batch size=128, num iterations=50
+  Median samples/s: 1792.0, mean: 1777.0
+  Median latency (s): 0.071428, mean: 0.072057, 99th_p: 0.076796, std_dev: 0.001351
+
+
+
+

## 5. Conclusion

+

In this notebook, we have walked through the complete process of optimizing the Citrinet model with Torch-TensorRT. On an A100 GPU, with Torch-TensorRT, we observe a speedup of ~2.4X with FP32, and ~2.9X with FP16 at batchsize of 128.

+
+
+

What’s next

+

Now it’s time to try Torch-TensorRT on your own model. Fill out issues at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.

+
+
[ ]:
+
+
+

+
+
+
+
+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_notebooks/CitriNet-example.ipynb b/docs/v1.2.0/_notebooks/CitriNet-example.ipynb new file mode 100644 index 0000000000..0573af0176 --- /dev/null +++ b/docs/v1.2.0/_notebooks/CitriNet-example.ipynb @@ -0,0 +1,964 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Torch-TensorRT Getting Started - CitriNet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "[Citrinet](https://docs.nvidia.com/deeplearning/nemo/user-guide/docs/en/main/asr/models.html#citrinet) is an acoustic model used for the speech to text recognition task. It is a version of [QuartzNet](https://arxiv.org/pdf/1910.10261.pdf) that extends [ContextNet](https://arxiv.org/pdf/2005.03191.pdf), utilizing subword encoding (via Word Piece tokenization) and Squeeze-and-Excitation(SE) mechanism and are therefore smaller than QuartzNet models.\n", + "\n", + "CitriNet models take in audio segments and transcribe them to letter, byte pair, or word piece sequences. \n", + "\n", + "\"alt\"\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for optimizing a pretrained CitriNet model with Torch-TensorRT, and running it to test the speedup obtained.\n", + "\n", + "## Content\n", + "1. [Requirements](#1)\n", + "1. [Download Citrinet model](#2)\n", + "1. [Create Torch-TensorRT modules](#3)\n", + "1. [Benchmark Torch-TensorRT models](#4)\n", + "1. [Conclusion](#5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "Follow the steps in [README](README.md) to prepare a Docker container, within which you can run this notebook. \n", + "This notebook assumes that you are within a Jupyter environment in a docker container with Torch-TensorRT installed, such as an NGC monthly release of `nvcr.io/nvidia/pytorch:-py3` (where `yy` indicates the last two numbers of a calendar year, and `mm` indicates the month in two-digit numerical form)\n", + "\n", + "Now that you are in the docker, the next step is to install the required dependencies." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: wget in /opt/conda/lib/python3.8/site-packages (3.2)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Hit:1 http://security.ubuntu.com/ubuntu focal-security InRelease\n", + "Hit:2 http://archive.ubuntu.com/ubuntu focal InRelease\n", + "Hit:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease\n", + "Hit:4 http://archive.ubuntu.com/ubuntu focal-backports InRelease\n", + "Reading package lists... Done\n", + "Reading package lists... Done\n", + "Building dependency tree \n", + "Reading state information... Done\n", + "libsndfile1 is already the newest version (1.0.28-7ubuntu0.1).\n", + "ffmpeg is already the newest version (7:4.2.4-1ubuntu0.1).\n", + "0 upgraded, 0 newly installed, 0 to remove and 22 not upgraded.\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: Cython in /opt/conda/lib/python3.8/site-packages (0.29.28)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: nemo_toolkit[all]==1.5.1 in /opt/conda/lib/python3.8/site-packages (1.5.1)\n", + "Requirement already satisfied: numpy>=1.18.2 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.22.3)\n", + "Requirement already satisfied: onnx>=1.7.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.10.1)\n", + "Requirement already satisfied: python-dateutil in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.8.2)\n", + "Requirement already satisfied: tqdm>=4.41.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.63.0)\n", + "Requirement already satisfied: sentencepiece<1.0.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.96)\n", + "Requirement already satisfied: wget in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.2)\n", + "Requirement already satisfied: numba in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.53.1)\n", + "Requirement already satisfied: torch in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.12.0a0+2c916ef)\n", + "Requirement already satisfied: unidecode in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.3.4)\n", + "Requirement already satisfied: frozendict in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.3.2)\n", + "Requirement already satisfied: wrapt in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.14.0)\n", + "Requirement already satisfied: scikit-learn in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.24.2)\n", + "Requirement already satisfied: ruamel.yaml in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.17.21)\n", + "Requirement already satisfied: pesq in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.0.3)\n", + "Requirement already satisfied: torchvision in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.13.0a0)\n", + "Requirement already satisfied: gdown in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.4.0)\n", + "Requirement already satisfied: editdistance in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.6.0)\n", + "Requirement already satisfied: boto3 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.21.45)\n", + "Requirement already satisfied: isort[requirements]<5 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.3.21)\n", + "Requirement already satisfied: hydra-core>=1.1.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.1.2)\n", + "Requirement already satisfied: youtokentome>=1.0.5 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.0.6)\n", + "Requirement already satisfied: pytorch-lightning>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.6.1)\n", + "Requirement already satisfied: jieba in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.42.1)\n", + "Requirement already satisfied: fasttext in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.9.2)\n", + "Requirement already satisfied: soundfile in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.10.3.post1)\n", + "Requirement already satisfied: kaldiio in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.17.2)\n", + "Requirement already satisfied: pangu in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.0.6.1)\n", + "Requirement already satisfied: kaldi-python-io in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.2.2)\n", + "Requirement already satisfied: parameterized in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.8.1)\n", + "Requirement already satisfied: h5py in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.6.0)\n", + "Requirement already satisfied: rapidfuzz in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.10)\n", + "Requirement already satisfied: marshmallow in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.15.0)\n", + "Requirement already satisfied: opencc in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.1.3)\n", + "Requirement already satisfied: braceexpand in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.7)\n", + "Requirement already satisfied: omegaconf>=2.1.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.1.2)\n", + "Requirement already satisfied: sphinx in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.4.0)\n", + "Requirement already satisfied: pillow in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (9.0.0)\n", + "Requirement already satisfied: wordninja==2.0.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.0)\n", + "Requirement already satisfied: torch-stft in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.4)\n", + "Requirement already satisfied: sox in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.4.1)\n", + "Requirement already satisfied: librosa in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.9.1)\n", + "Requirement already satisfied: regex in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2022.3.15)\n", + "Requirement already satisfied: sacrebleu[ja] in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.0)\n", + "Requirement already satisfied: black==19.10b0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (19.10b0)\n", + "Requirement already satisfied: pydub in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.25.1)\n", + "Requirement already satisfied: sphinxcontrib-bibtex in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.4.2)\n", + "Requirement already satisfied: inflect in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (5.5.2)\n", + "Requirement already satisfied: pyannote.core in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.4)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (21.3)\n", + "Requirement already satisfied: kaldi-io in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.9.4)\n", + "Requirement already satisfied: pyannote.metrics in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.2)\n", + "Requirement already satisfied: g2p-en in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.1.0)\n", + "Requirement already satisfied: matplotlib in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.5.1)\n", + "Requirement already satisfied: torchmetrics>=0.4.1rc0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.8.0)\n", + "Requirement already satisfied: nltk>=3.6.5 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.7)\n", + "Requirement already satisfied: pyyaml<6 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (5.4.1)\n", + "Requirement already satisfied: scipy in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.6.3)\n", + "Requirement already satisfied: ipywidgets in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (7.7.0)\n", + "Requirement already satisfied: pytest in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (6.2.5)\n", + "Requirement already satisfied: pandas in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.3.5)\n", + "Requirement already satisfied: pytest-runner in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (6.0.0)\n", + "Requirement already satisfied: transformers>=4.0.1 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.18.0)\n", + "Requirement already satisfied: sacremoses>=0.0.43 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.0.49)\n", + "Requirement already satisfied: pystoi in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.3.3)\n", + "Requirement already satisfied: attrdict in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.1)\n", + "Requirement already satisfied: webdataset<=0.1.62,>=0.1.48 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.62)\n", + "Requirement already satisfied: wandb in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.12.15)\n", + "Requirement already satisfied: pypinyin in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.46.0)\n", + "Requirement already satisfied: attrs>=18.1.0 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (21.4.0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: appdirs in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (1.4.4)\n", + "Requirement already satisfied: typed-ast>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (1.5.3)\n", + "Requirement already satisfied: pathspec<1,>=0.6 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (0.9.0)\n", + "Requirement already satisfied: click>=6.5 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (8.0.4)\n", + "Requirement already satisfied: toml>=0.9.4 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (0.10.2)\n", + "Requirement already satisfied: antlr4-python3-runtime==4.8 in /opt/conda/lib/python3.8/site-packages (from hydra-core>=1.1.0->nemo_toolkit[all]==1.5.1) (4.8)\n", + "Requirement already satisfied: importlib-resources<5.3 in /opt/conda/lib/python3.8/site-packages (from hydra-core>=1.1.0->nemo_toolkit[all]==1.5.1) (5.2.3)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources<5.3->hydra-core>=1.1.0->nemo_toolkit[all]==1.5.1) (3.7.0)\n", + "Requirement already satisfied: pip-api in /opt/conda/lib/python3.8/site-packages (from isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.0.29)\n", + "Requirement already satisfied: pipreqs in /opt/conda/lib/python3.8/site-packages (from isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.4.11)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (4.31.2)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (1.4.0)\n", + "Requirement already satisfied: pyparsing>=2.2.1 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (3.0.7)\n", + "Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (0.11.0)\n", + "Requirement already satisfied: joblib in /opt/conda/lib/python3.8/site-packages (from nltk>=3.6.5->nemo_toolkit[all]==1.5.1) (1.1.0)\n", + "Requirement already satisfied: typing-extensions>=3.6.2.1 in /opt/conda/lib/python3.8/site-packages (from onnx>=1.7.0->nemo_toolkit[all]==1.5.1) (4.1.1)\n", + "Requirement already satisfied: six in /opt/conda/lib/python3.8/site-packages (from onnx>=1.7.0->nemo_toolkit[all]==1.5.1) (1.16.0)\n", + "Requirement already satisfied: protobuf>=3.12.2 in /opt/conda/lib/python3.8/site-packages (from onnx>=1.7.0->nemo_toolkit[all]==1.5.1) (3.19.4)\n", + "Requirement already satisfied: pyDeprecate<0.4.0,>=0.3.1 in /opt/conda/lib/python3.8/site-packages (from pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.3.2)\n", + "Requirement already satisfied: tensorboard>=2.2.0 in /opt/conda/lib/python3.8/site-packages (from pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.8.0)\n", + "Requirement already satisfied: fsspec[http]!=2021.06.0,>=2021.05.0 in /opt/conda/lib/python3.8/site-packages (from pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2022.2.0)\n", + "Requirement already satisfied: requests in /opt/conda/lib/python3.8/site-packages (from fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.27.1)\n", + "Requirement already satisfied: aiohttp in /opt/conda/lib/python3.8/site-packages (from fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.8.1)\n", + "Requirement already satisfied: werkzeug>=0.11.15 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.0.3)\n", + "Requirement already satisfied: markdown>=2.6.8 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.3.6)\n", + "Requirement already satisfied: setuptools>=41.0.0 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (59.5.0)\n", + "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.4.6)\n", + "Requirement already satisfied: google-auth<3,>=1.6.3 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.6.2)\n", + "Requirement already satisfied: wheel>=0.26 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.37.1)\n", + "Requirement already satisfied: grpcio>=1.24.3 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.44.0)\n", + "Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.6.1)\n", + "Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.8.1)\n", + "Requirement already satisfied: absl-py>=0.4 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.0.0)\n", + "Requirement already satisfied: cachetools<6.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (5.0.0)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in /opt/conda/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.2.8)\n", + "Requirement already satisfied: rsa<5,>=3.1.4 in /opt/conda/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (4.8)\n", + "Requirement already satisfied: requests-oauthlib>=0.7.0 in /opt/conda/lib/python3.8/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.3.1)\n", + "Requirement already satisfied: importlib-metadata>=4.4 in /opt/conda/lib/python3.8/site-packages (from markdown>=2.6.8->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (4.11.3)\n", + "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /opt/conda/lib/python3.8/site-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.4.8)\n", + "Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.0.12)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2021.10.8)\n", + "Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.3)\n", + "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.26.8)\n", + "Requirement already satisfied: oauthlib>=3.0.0 in /opt/conda/lib/python3.8/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.2.0)\n", + "Requirement already satisfied: huggingface-hub<1.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from transformers>=4.0.1->nemo_toolkit[all]==1.5.1) (0.5.1)\n", + "Requirement already satisfied: tokenizers!=0.11.3,<0.13,>=0.11.1 in /opt/conda/lib/python3.8/site-packages (from transformers>=4.0.1->nemo_toolkit[all]==1.5.1) (0.12.1)\n", + "Requirement already satisfied: filelock in /opt/conda/lib/python3.8/site-packages (from transformers>=4.0.1->nemo_toolkit[all]==1.5.1) (3.6.0)\n", + "Requirement already satisfied: frozenlist>=1.1.1 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.3.0)\n", + "Requirement already satisfied: yarl<2.0,>=1.0 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.7.2)\n", + "Requirement already satisfied: async-timeout<5.0,>=4.0.0a3 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (4.0.2)\n", + "Requirement already satisfied: multidict<7.0,>=4.5 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (6.0.2)\n", + "Requirement already satisfied: aiosignal>=1.1.2 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.2.0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: s3transfer<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from boto3->nemo_toolkit[all]==1.5.1) (0.5.2)\n", + "Requirement already satisfied: botocore<1.25.0,>=1.24.45 in /opt/conda/lib/python3.8/site-packages (from boto3->nemo_toolkit[all]==1.5.1) (1.24.45)\n", + "Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /opt/conda/lib/python3.8/site-packages (from boto3->nemo_toolkit[all]==1.5.1) (1.0.0)\n", + "Requirement already satisfied: pybind11>=2.2 in /opt/conda/lib/python3.8/site-packages (from fasttext->nemo_toolkit[all]==1.5.1) (2.9.1)\n", + "Requirement already satisfied: distance>=0.1.3 in /opt/conda/lib/python3.8/site-packages (from g2p-en->nemo_toolkit[all]==1.5.1) (0.1.3)\n", + "Requirement already satisfied: beautifulsoup4 in /opt/conda/lib/python3.8/site-packages (from gdown->nemo_toolkit[all]==1.5.1) (4.10.0)\n", + "Requirement already satisfied: soupsieve>1.2 in /opt/conda/lib/python3.8/site-packages (from beautifulsoup4->gdown->nemo_toolkit[all]==1.5.1) (2.3.1)\n", + "Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.0)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (8.1.1)\n", + "Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (6.9.2)\n", + "Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (1.1.0)\n", + "Requirement already satisfied: widgetsnbextension~=3.6.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (3.6.0)\n", + "Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (5.1.1)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (5.2.0)\n", + "Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (7.1.2)\n", + "Requirement already satisfied: psutil in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (5.9.0)\n", + "Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (6.1)\n", + "Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (1.5.1)\n", + "Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (1.5.4)\n", + "Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (0.1.3)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.7.5)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (5.1.1)\n", + "Requirement already satisfied: pygments>=2.4.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.11.2)\n", + "Requirement already satisfied: stack-data in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.0)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (3.0.27)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.0)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.18.1)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (4.8.0)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.8.3)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (0.4)\n", + "Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (22.3.0)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (4.9.2)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets->nemo_toolkit[all]==1.5.1) (4.4.0)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.18.1)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.5)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (6.4.1)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (1.8.0)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.13.1)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.13.3)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (3.0.3)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (6.4.4)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (21.3.0)\n", + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.21)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.1.1)\n", + "Requirement already satisfied: resampy>=0.2.2 in /opt/conda/lib/python3.8/site-packages (from librosa->nemo_toolkit[all]==1.5.1) (0.2.2)\n", + "Requirement already satisfied: pooch>=1.0 in /opt/conda/lib/python3.8/site-packages (from librosa->nemo_toolkit[all]==1.5.1) (1.6.0)\n", + "Requirement already satisfied: audioread>=2.1.5 in /opt/conda/lib/python3.8/site-packages (from librosa->nemo_toolkit[all]==1.5.1) (2.1.9)\n", + "Requirement already satisfied: llvmlite<0.37,>=0.36.0rc1 in /opt/conda/lib/python3.8/site-packages (from numba->nemo_toolkit[all]==1.5.1) (0.36.0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: threadpoolctl>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from scikit-learn->nemo_toolkit[all]==1.5.1) (3.1.0)\n", + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.7.1)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.5.13)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (4.1.0)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.8.4)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (1.5.0)\n", + "Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.6.0)\n", + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.1.2)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.5.1)\n", + "Requirement already satisfied: pytz>=2017.3 in /opt/conda/lib/python3.8/site-packages (from pandas->nemo_toolkit[all]==1.5.1) (2021.3)\n", + "Requirement already satisfied: pip in /opt/conda/lib/python3.8/site-packages (from pip-api->isort[requirements]<5->nemo_toolkit[all]==1.5.1) (21.2.4)\n", + "Requirement already satisfied: yarg in /opt/conda/lib/python3.8/site-packages (from pipreqs->isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.1.9)\n", + "Requirement already satisfied: docopt in /opt/conda/lib/python3.8/site-packages (from pipreqs->isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.6.2)\n", + "Requirement already satisfied: simplejson>=3.8.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.core->nemo_toolkit[all]==1.5.1) (3.17.6)\n", + "Requirement already satisfied: sortedcontainers>=2.0.4 in /opt/conda/lib/python3.8/site-packages (from pyannote.core->nemo_toolkit[all]==1.5.1) (2.4.0)\n", + "Requirement already satisfied: tabulate>=0.7.7 in /opt/conda/lib/python3.8/site-packages (from pyannote.metrics->nemo_toolkit[all]==1.5.1) (0.8.9)\n", + "Requirement already satisfied: pyannote.database>=4.0.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.metrics->nemo_toolkit[all]==1.5.1) (4.1.3)\n", + "Requirement already satisfied: sympy>=1.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.metrics->nemo_toolkit[all]==1.5.1) (1.10.1)\n", + "Requirement already satisfied: typer[all]>=0.2.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (0.4.0)\n", + "Requirement already satisfied: mpmath>=0.19 in /opt/conda/lib/python3.8/site-packages (from sympy>=1.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (1.2.1)\n", + "Requirement already satisfied: colorama<0.5.0,>=0.4.3 in /opt/conda/lib/python3.8/site-packages (from typer[all]>=0.2.1->pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (0.4.4)\n", + "Requirement already satisfied: shellingham<2.0.0,>=1.3.0 in /opt/conda/lib/python3.8/site-packages (from typer[all]>=0.2.1->pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (1.4.0)\n", + "Requirement already satisfied: py>=1.8.2 in /opt/conda/lib/python3.8/site-packages (from pytest->nemo_toolkit[all]==1.5.1) (1.11.0)\n", + "Requirement already satisfied: iniconfig in /opt/conda/lib/python3.8/site-packages (from pytest->nemo_toolkit[all]==1.5.1) (1.1.1)\n", + "Requirement already satisfied: pluggy<2.0,>=0.12 in /opt/conda/lib/python3.8/site-packages (from pytest->nemo_toolkit[all]==1.5.1) (1.0.0)\n", + "Requirement already satisfied: jarowinkler<1.1.0,>=1.0.2 in /opt/conda/lib/python3.8/site-packages (from rapidfuzz->nemo_toolkit[all]==1.5.1) (1.0.2)\n", + "Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.7.1)\n", + "Requirement already satisfied: ruamel.yaml.clib>=0.2.6 in /opt/conda/lib/python3.8/site-packages (from ruamel.yaml->nemo_toolkit[all]==1.5.1) (0.2.6)\n", + "Requirement already satisfied: portalocker in /opt/conda/lib/python3.8/site-packages (from sacrebleu[ja]->nemo_toolkit[all]==1.5.1) (2.4.0)\n", + "Requirement already satisfied: ipadic<2.0,>=1.0 in /opt/conda/lib/python3.8/site-packages (from sacrebleu[ja]->nemo_toolkit[all]==1.5.1) (1.0.0)\n", + "Requirement already satisfied: mecab-python3==1.0.3 in /opt/conda/lib/python3.8/site-packages (from sacrebleu[ja]->nemo_toolkit[all]==1.5.1) (1.0.3)\n", + "Requirement already satisfied: sphinxcontrib-htmlhelp>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (2.0.0)\n", + "Requirement already satisfied: alabaster<0.8,>=0.7 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (0.7.12)\n", + "Requirement already satisfied: babel>=1.3 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (2.9.1)\n", + "Requirement already satisfied: sphinxcontrib-serializinghtml>=1.1.5 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.1.5)\n", + "Requirement already satisfied: sphinxcontrib-devhelp in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.2)\n", + "Requirement already satisfied: sphinxcontrib-jsmath in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.1)\n", + "Requirement already satisfied: sphinxcontrib-qthelp in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.3)\n", + "Requirement already satisfied: snowballstemmer>=1.1 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (2.2.0)\n", + "Requirement already satisfied: imagesize in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.3.0)\n", + "Requirement already satisfied: sphinxcontrib-applehelp in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.2)\n", + "Requirement already satisfied: docutils<0.18,>=0.14 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (0.17.1)\n", + "Requirement already satisfied: pybtex-docutils>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from sphinxcontrib-bibtex->nemo_toolkit[all]==1.5.1) (1.0.1)\n", + "Requirement already satisfied: pybtex>=0.24 in /opt/conda/lib/python3.8/site-packages (from sphinxcontrib-bibtex->nemo_toolkit[all]==1.5.1) (0.24.0)\n", + "Requirement already satisfied: latexcodec>=1.0.4 in /opt/conda/lib/python3.8/site-packages (from pybtex>=0.24->sphinxcontrib-bibtex->nemo_toolkit[all]==1.5.1) (2.0.1)\n", + "Requirement already satisfied: pure-eval in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.2)\n", + "Requirement already satisfied: asttokens in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.0.5)\n", + "Requirement already satisfied: executing in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.8.3)\n", + "Requirement already satisfied: pathtools in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (0.1.2)\n", + "Requirement already satisfied: setproctitle in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (1.2.3)\n", + "Requirement already satisfied: GitPython>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (3.1.27)\n", + "Requirement already satisfied: sentry-sdk>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (1.5.10)\n", + "Requirement already satisfied: shortuuid>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (1.0.8)\n", + "Requirement already satisfied: docker-pycreds>=0.4.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (0.4.0)\n", + "Requirement already satisfied: promise<3,>=2.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (2.3)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: gitdb<5,>=4.0.1 in /opt/conda/lib/python3.8/site-packages (from GitPython>=1.0.0->wandb->nemo_toolkit[all]==1.5.1) (4.0.9)\n", + "Requirement already satisfied: smmap<6,>=3.0.1 in /opt/conda/lib/python3.8/site-packages (from gitdb<5,>=4.0.1->GitPython>=1.0.0->wandb->nemo_toolkit[all]==1.5.1) (5.0.0)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "# Install dependencies\n", + "!pip install wget\n", + "!apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y libsndfile1 ffmpeg\n", + "!pip install Cython\n", + "\n", + "## Install NeMo\n", + "!pip install nemo_toolkit[all]==1.5.1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 2. Download Citrinet model\n", + "\n", + "Next, we download a pretrained Nemo Citrinet model and convert it to a Torchscript module:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import nemo\n", + "import torch\n", + "\n", + "import nemo.collections.asr as nemo_asr\n", + "from nemo.core import typecheck\n", + "typecheck.set_typecheck_enabled(False) " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading and saving stt_en_citrinet_256...\n", + "[NeMo I 2022-04-21 23:12:45 cloud:56] Found existing object /root/.cache/torch/NeMo/NeMo_1.5.1/stt_en_citrinet_256/91a9cc5850784b2065e8a0aa3d526fd9/stt_en_citrinet_256.nemo.\n", + "[NeMo I 2022-04-21 23:12:45 cloud:62] Re-using file from: /root/.cache/torch/NeMo/NeMo_1.5.1/stt_en_citrinet_256/91a9cc5850784b2065e8a0aa3d526fd9/stt_en_citrinet_256.nemo\n", + "[NeMo I 2022-04-21 23:12:45 common:728] Instantiating model from pre-trained checkpoint\n", + "[NeMo I 2022-04-21 23:12:46 mixins:146] Tokenizer SentencePieceTokenizer initialized with 1024 tokens\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[NeMo W 2022-04-21 23:12:47 modelPT:130] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.\n", + " Train config : \n", + " manifest_filepath: null\n", + " sample_rate: 16000\n", + " batch_size: 32\n", + " trim_silence: true\n", + " max_duration: 16.7\n", + " shuffle: true\n", + " is_tarred: false\n", + " tarred_audio_filepaths: null\n", + " use_start_end_token: false\n", + " \n", + "[NeMo W 2022-04-21 23:12:47 modelPT:137] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s). \n", + " Validation config : \n", + " manifest_filepath: null\n", + " sample_rate: 16000\n", + " batch_size: 32\n", + " shuffle: false\n", + " use_start_end_token: false\n", + " \n", + "[NeMo W 2022-04-21 23:12:47 modelPT:143] Please call the ModelPT.setup_test_data() or ModelPT.setup_multiple_test_data() method and provide a valid configuration file to setup the test data loader(s).\n", + " Test config : \n", + " manifest_filepath: null\n", + " sample_rate: 16000\n", + " batch_size: 32\n", + " shuffle: false\n", + " use_start_end_token: false\n", + " \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[NeMo I 2022-04-21 23:12:47 features:265] PADDING: 16\n", + "[NeMo I 2022-04-21 23:12:47 features:282] STFT using torch\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[NeMo W 2022-04-21 23:12:47 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/nemo/collections/asr/parts/preprocessing/features.py:315: FutureWarning: Pass sr=16000, n_fft=512 as keyword args. From version 0.10 passing these as positional arguments will result in an error\n", + " librosa.filters.mel(sample_rate, self.n_fft, n_mels=nfilt, fmin=lowfreq, fmax=highfreq), dtype=torch.float\n", + " \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[NeMo I 2022-04-21 23:12:49 save_restore_connector:149] Model EncDecCTCModelBPE was successfully restored from /root/.cache/torch/NeMo/NeMo_1.5.1/stt_en_citrinet_256/91a9cc5850784b2065e8a0aa3d526fd9/stt_en_citrinet_256.nemo.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[NeMo W 2022-04-21 23:12:49 export_utils:198] Swapped 0 modules\n", + "[NeMo W 2022-04-21 23:12:49 conv_asr:73] Turned off 235 masked convolutions\n", + "[NeMo W 2022-04-21 23:12:49 export_utils:198] Swapped 0 modules\n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/jit/_trace.py:916: UserWarning: `optimize` is deprecated and has no effect. Use `with torch.jit.optimized_execution() instead\n", + " warnings.warn(\n", + " \n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:668: LightningDeprecationWarning: The `LightningModule.model_size` property was deprecated in v1.5 and will be removed in v1.7. Please use the `pytorch_lightning.utilities.memory.get_model_size_mb`.\n", + " if hasattr(mod, name):\n", + " \n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:669: LightningDeprecationWarning: The `LightningModule.model_size` property was deprecated in v1.5 and will be removed in v1.7. Please use the `pytorch_lightning.utilities.memory.get_model_size_mb`.\n", + " item = getattr(mod, name)\n", + " \n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:668: LightningDeprecationWarning: `LightningModule.use_amp` was deprecated in v1.6 and will be removed in v1.8. Please use `Trainer.amp_backend`.\n", + " if hasattr(mod, name):\n", + " \n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:669: LightningDeprecationWarning: `LightningModule.use_amp` was deprecated in v1.6 and will be removed in v1.8. Please use `Trainer.amp_backend`.\n", + " item = getattr(mod, name)\n", + " \n" + ] + }, + { + "data": { + "text/plain": [ + "(['stt_en_citrinet_256.ts'],\n", + " ['nemo.collections.asr.models.ctc_bpe_models.EncDecCTCModelBPE exported to ONNX'])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "variant = 'stt_en_citrinet_256'\n", + "\n", + "print(f\"Downloading and saving {variant}...\")\n", + "asr_model = nemo_asr.models.EncDecCTCModelBPE.from_pretrained(model_name=variant)\n", + "asr_model.export(f\"{variant}.ts\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Benchmark utility\n", + "\n", + "Let us define a helper benchmarking function, then benchmark the original Pytorch model." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading model: stt_en_citrinet_256.ts\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256.ts =================================\n", + "batch size=1, num iterations=50\n", + " Median samples/s: 102.0, mean: 102.0\n", + " Median latency (s): 0.009802, mean: 0.009803, 99th_p: 0.009836, std_dev: 0.000014\n", + "\n", + "Loading model: stt_en_citrinet_256.ts\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256.ts =================================\n", + "batch size=8, num iterations=50\n", + " Median samples/s: 429.1, mean: 429.1\n", + " Median latency (s): 0.018642, mean: 0.018643, 99th_p: 0.018670, std_dev: 0.000014\n", + "\n", + "Loading model: stt_en_citrinet_256.ts\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256.ts =================================\n", + "batch size=32, num iterations=50\n", + " Median samples/s: 551.3, mean: 551.2\n", + " Median latency (s): 0.058047, mean: 0.058053, 99th_p: 0.058375, std_dev: 0.000106\n", + "\n", + "Loading model: stt_en_citrinet_256.ts\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256.ts =================================\n", + "batch size=128, num iterations=50\n", + " Median samples/s: 594.1, mean: 594.1\n", + " Median latency (s): 0.215434, mean: 0.215446, 99th_p: 0.215806, std_dev: 0.000116\n", + "\n" + ] + } + ], + "source": [ + "from __future__ import print_function\n", + "from __future__ import absolute_import\n", + "from __future__ import division\n", + "\n", + "import argparse\n", + "import timeit\n", + "import numpy as np\n", + "import torch\n", + "import torch_tensorrt as trtorch\n", + "import torch.backends.cudnn as cudnn\n", + "\n", + "def benchmark(model, input_tensor, num_loops, model_name, batch_size):\n", + " def timeGraph(model, input_tensor, num_loops):\n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(20):\n", + " features = model(input_tensor)\n", + "\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(num_loops):\n", + " start_time = timeit.default_timer()\n", + " features = model(input_tensor)\n", + " torch.cuda.synchronize()\n", + " end_time = timeit.default_timer()\n", + " timings.append(end_time - start_time)\n", + " # print(\"Iteration {}: {:.6f} s\".format(i, end_time - start_time))\n", + " return timings\n", + " def printStats(graphName, timings, batch_size):\n", + " times = np.array(timings)\n", + " steps = len(times)\n", + " speeds = batch_size / times\n", + " time_mean = np.mean(times)\n", + " time_med = np.median(times)\n", + " time_99th = np.percentile(times, 99)\n", + " time_std = np.std(times, ddof=0)\n", + " speed_mean = np.mean(speeds)\n", + " speed_med = np.median(speeds)\n", + " msg = (\"\\n%s =================================\\n\"\n", + " \"batch size=%d, num iterations=%d\\n\"\n", + " \" Median samples/s: %.1f, mean: %.1f\\n\"\n", + " \" Median latency (s): %.6f, mean: %.6f, 99th_p: %.6f, std_dev: %.6f\\n\"\n", + " ) % (graphName,\n", + " batch_size, steps,\n", + " speed_med, speed_mean,\n", + " time_med, time_mean, time_99th, time_std)\n", + " print(msg)\n", + " timings = timeGraph(model, input_tensor, num_loops)\n", + " printStats(model_name, timings, batch_size)\n", + "\n", + "precisions_str = 'fp32' # Precision (default=fp32, fp16)\n", + "variant = 'stt_en_citrinet_256' # Nemo Citrinet variant\n", + "batch_sizes = [1, 8, 32, 128] # Batch sizes (default=1,8,32,128)\n", + "trt = False # If True, infer with Torch-TensorRT engine. Else, infer with Pytorch model.\n", + "precision = torch.float32 if precisions_str =='fp32' else torch.float16\n", + "\n", + "for batch_size in batch_sizes:\n", + " if trt:\n", + " model_name = f\"{variant}_bs{batch_size}_{precision}.torch-tensorrt\"\n", + " else:\n", + " model_name = f\"{variant}.ts\"\n", + "\n", + " print(f\"Loading model: {model_name}\") \n", + " # Load traced model to CPU first\n", + " model = torch.jit.load(model_name).cuda()\n", + " cudnn.benchmark = True\n", + " # Create random input tensor of certain size\n", + " torch.manual_seed(12345)\n", + " input_shape=(batch_size, 80, 1488)\n", + " input_tensor = torch.randn(input_shape).cuda()\n", + "\n", + " # Timing graph inference\n", + " benchmark(model, input_tensor, 50, model_name, batch_size)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Confirming the GPU we are using here:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Thu Apr 21 23:13:32 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 510.47.03 Driver Version: 510.47.03 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA TITAN V On | 00000000:17:00.0 Off | N/A |\n", + "| 38% 55C P2 42W / 250W | 2462MiB / 12288MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + "| 1 NVIDIA TITAN V On | 00000000:65:00.0 Off | N/A |\n", + "| 28% 39C P8 26W / 250W | 112MiB / 12288MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| 0 N/A N/A 3909 G 4MiB |\n", + "| 0 N/A N/A 6047 C 2453MiB |\n", + "| 1 N/A N/A 3909 G 39MiB |\n", + "| 1 N/A N/A 4161 G 67MiB |\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 3. Create Torch-TensorRT modules\n", + "\n", + "In this step, we optimize the Citrinet Torchscript module with Torch-TensorRT with various precisions and batch sizes." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating Torchscript-TensorRT module for batchsize 1 precision torch.float32\n", + "Generating Torchscript-TensorRT module for batchsize 8 precision torch.float32\n", + "Generating Torchscript-TensorRT module for batchsize 32 precision torch.float32\n", + "Generating Torchscript-TensorRT module for batchsize 128 precision torch.float32\n", + "Generating Torchscript-TensorRT module for batchsize 1 precision torch.float16\n", + "Generating Torchscript-TensorRT module for batchsize 8 precision torch.float16\n", + "Generating Torchscript-TensorRT module for batchsize 32 precision torch.float16\n", + "Generating Torchscript-TensorRT module for batchsize 128 precision torch.float16\n" + ] + } + ], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "import torch_tensorrt as torchtrt\n", + "import argparse\n", + "\n", + "variant = \"stt_en_citrinet_256\"\n", + "precisions = [torch.float, torch.half]\n", + "batch_sizes = [1,8,32,128]\n", + "\n", + "model = torch.jit.load(f\"{variant}.ts\")\n", + "\n", + "for precision in precisions:\n", + " for batch_size in batch_sizes:\n", + " compile_settings = {\n", + " \"inputs\": [torchtrt.Input(shape=[batch_size, 80, 1488])],\n", + " \"enabled_precisions\": {precision},\n", + " \"workspace_size\": 2000000000,\n", + " \"truncate_long_and_double\": True,\n", + " }\n", + " print(f\"Generating Torchscript-TensorRT module for batchsize {batch_size} precision {precision}\")\n", + " trt_ts_module = torchtrt.compile(model, **compile_settings)\n", + " torch.jit.save(trt_ts_module, f\"{variant}_bs{batch_size}_{precision}.torch-tensorrt\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 4. Benchmark Torch-TensorRT models\n", + "\n", + "Finally, we are ready to benchmark the Torch-TensorRT optimized Citrinet models." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP32 (single precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading model: stt_en_citrinet_256_bs1_torch.float32.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs1_torch.float32.torch-tensorrt =================================\n", + "batch size=1, num iterations=50\n", + " Median samples/s: 242.2, mean: 218.0\n", + " Median latency (s): 0.004128, mean: 0.004825, 99th_p: 0.008071, std_dev: 0.001270\n", + "\n", + "Loading model: stt_en_citrinet_256_bs8_torch.float32.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs8_torch.float32.torch-tensorrt =================================\n", + "batch size=8, num iterations=50\n", + " Median samples/s: 729.9, mean: 709.0\n", + " Median latency (s): 0.010961, mean: 0.011388, 99th_p: 0.016114, std_dev: 0.001256\n", + "\n", + "Loading model: stt_en_citrinet_256_bs32_torch.float32.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs32_torch.float32.torch-tensorrt =================================\n", + "batch size=32, num iterations=50\n", + " Median samples/s: 955.6, mean: 953.4\n", + " Median latency (s): 0.033488, mean: 0.033572, 99th_p: 0.035722, std_dev: 0.000545\n", + "\n", + "Loading model: stt_en_citrinet_256_bs128_torch.float32.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs128_torch.float32.torch-tensorrt =================================\n", + "batch size=128, num iterations=50\n", + " Median samples/s: 1065.8, mean: 1069.4\n", + " Median latency (s): 0.120097, mean: 0.119708, 99th_p: 0.121618, std_dev: 0.001260\n", + "\n" + ] + } + ], + "source": [ + "precisions_str = 'fp32' # Precision (default=fp32, fp16)\n", + "batch_sizes = [1, 8, 32, 128] # Batch sizes (default=1,8,32,128)\n", + "precision = torch.float32 if precisions_str =='fp32' else torch.float16\n", + "trt = True\n", + "\n", + "for batch_size in batch_sizes:\n", + " if trt:\n", + " model_name = f\"{variant}_bs{batch_size}_{precision}.torch-tensorrt\"\n", + " else:\n", + " model_name = f\"{variant}.ts\"\n", + "\n", + " print(f\"Loading model: {model_name}\") \n", + " # Load traced model to CPU first\n", + " model = torch.jit.load(model_name).cuda()\n", + " cudnn.benchmark = True\n", + " # Create random input tensor of certain size\n", + " torch.manual_seed(12345)\n", + " input_shape=(batch_size, 80, 1488)\n", + " input_tensor = torch.randn(input_shape).cuda()\n", + "\n", + " # Timing graph inference\n", + " benchmark(model, input_tensor, 50, model_name, batch_size)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP16 (half precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading model: stt_en_citrinet_256_bs1_torch.float16.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs1_torch.float16.torch-tensorrt =================================\n", + "batch size=1, num iterations=50\n", + " Median samples/s: 288.9, mean: 272.9\n", + " Median latency (s): 0.003462, mean: 0.003774, 99th_p: 0.006846, std_dev: 0.000820\n", + "\n", + "Loading model: stt_en_citrinet_256_bs8_torch.float16.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs8_torch.float16.torch-tensorrt =================================\n", + "batch size=8, num iterations=50\n", + " Median samples/s: 1201.0, mean: 1190.9\n", + " Median latency (s): 0.006661, mean: 0.006733, 99th_p: 0.008453, std_dev: 0.000368\n", + "\n", + "Loading model: stt_en_citrinet_256_bs32_torch.float16.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs32_torch.float16.torch-tensorrt =================================\n", + "batch size=32, num iterations=50\n", + " Median samples/s: 1538.2, mean: 1516.4\n", + " Median latency (s): 0.020804, mean: 0.021143, 99th_p: 0.024492, std_dev: 0.000973\n", + "\n", + "Loading model: stt_en_citrinet_256_bs128_torch.float16.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs128_torch.float16.torch-tensorrt =================================\n", + "batch size=128, num iterations=50\n", + " Median samples/s: 1792.0, mean: 1777.0\n", + " Median latency (s): 0.071428, mean: 0.072057, 99th_p: 0.076796, std_dev: 0.001351\n", + "\n" + ] + } + ], + "source": [ + "precisions_str = 'fp16' # Precision (default=fp32, fp16)\n", + "batch_sizes = [1, 8, 32, 128] # Batch sizes (default=1,8,32,128)\n", + "precision = torch.float32 if precisions_str =='fp32' else torch.float16\n", + "\n", + "for batch_size in batch_sizes:\n", + " if trt:\n", + " model_name = f\"{variant}_bs{batch_size}_{precision}.torch-tensorrt\"\n", + " else:\n", + " model_name = f\"{variant}.ts\"\n", + "\n", + " print(f\"Loading model: {model_name}\") \n", + " # Load traced model to CPU first\n", + " model = torch.jit.load(model_name).cuda()\n", + " cudnn.benchmark = True\n", + " # Create random input tensor of certain size\n", + " torch.manual_seed(12345)\n", + " input_shape=(batch_size, 80, 1488)\n", + " input_tensor = torch.randn(input_shape).cuda()\n", + "\n", + " # Timing graph inference\n", + " benchmark(model, input_tensor, 50, model_name, batch_size)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 5. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of optimizing the Citrinet model with Torch-TensorRT. On an A100 GPU, with Torch-TensorRT, we observe a speedup of ~**2.4X** with FP32, and ~**2.9X** with FP16 at batchsize of 128.\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. Fill out issues at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.2.0/_notebooks/EfficientNet-example.html b/docs/v1.2.0/_notebooks/EfficientNet-example.html new file mode 100644 index 0000000000..62900356fa --- /dev/null +++ b/docs/v1.2.0/_notebooks/EfficientNet-example.html @@ -0,0 +1,1463 @@ + + + + + + + + + + + + + Torch-TensorRT Getting Started - EfficientNet-B0 — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Torch-TensorRT Getting Started - EfficientNet-B0
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ + + +
+
[1]:
+
+
+
# Copyright 2019 NVIDIA Corporation. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
+
+

219a0350e192474794f36336bd8c82ef

+
+

Torch-TensorRT Getting Started - EfficientNet-B0

+
+

Overview

+

In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the +best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch’s JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new +world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.

+

When deploying on NVIDIA GPUs TensorRT, NVIDIA’s Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA’s Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that +perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.

+

Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch.

+
+

Learning objectives

+

This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained EfficientNet network, and running it to test the speedup obtained.

+
+
+
+

Content

+
    +
  1. Requirements

  2. +
  3. EfficientNet Overview

  4. +
  5. Running the model without optimizations

  6. +
  7. Accelerating with Torch-TensorRT

  8. +
  9. Conclusion

  10. +
+
+
[1]:
+
+
+
!pip install timm==0.4.12
+!nvidia-smi
+
+
+
+
+
+
+
+
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Collecting timm==0.4.12
+  Downloading timm-0.4.12-py3-none-any.whl (376 kB)
+     |████████████████████████████████| 376 kB 11.9 MB/s eta 0:00:01
+Requirement already satisfied: torch>=1.4 in /opt/conda/lib/python3.8/site-packages (from timm==0.4.12) (1.11.0a0+bfe5ad2)
+Requirement already satisfied: torchvision in /opt/conda/lib/python3.8/site-packages (from timm==0.4.12) (0.12.0a0)
+Requirement already satisfied: typing_extensions in /opt/conda/lib/python3.8/site-packages (from torch>=1.4->timm==0.4.12) (4.0.1)
+Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in /opt/conda/lib/python3.8/site-packages (from torchvision->timm==0.4.12) (8.2.0)
+Requirement already satisfied: numpy in /opt/conda/lib/python3.8/site-packages (from torchvision->timm==0.4.12) (1.22.0)
+Installing collected packages: timm
+Successfully installed timm-0.4.12
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+Fri Feb  4 21:29:36 2022
++-----------------------------------------------------------------------------+
+| NVIDIA-SMI 510.39.01    Driver Version: 510.39.01    CUDA Version: 11.6     |
+|-------------------------------+----------------------+----------------------+
+| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
+| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
+|                               |                      |               MIG M. |
+|===============================+======================+======================|
+|   0  NVIDIA GeForce ...  On   | 00000000:65:00.0 Off |                  N/A |
+| 30%   28C    P8    11W / 350W |      0MiB / 24576MiB |      0%      Default |
+|                               |                      |                  N/A |
++-------------------------------+----------------------+----------------------+
+
++-----------------------------------------------------------------------------+
+| Processes:                                                                  |
+|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
+|        ID   ID                                                   Usage      |
+|=============================================================================|
+|  No running processes found                                                 |
++-----------------------------------------------------------------------------+
+
+
+

## 1. Requirements

+

NVIDIA’s NGC provides PyTorch Docker Container which contains PyTorch and Torch-TensorRT. We can make use of latest pytorch container to run this notebook.

+

Otherwise, you can follow the steps in notebooks/README to prepare a Docker container yourself, within which you can run this demo notebook.

+

## 2. EfficientNet Overview

+

PyTorch has a model repository called timm, which is a source for high quality implementations of computer vision models. We can get our EfficientNet model from there pretrained on ImageNet.

+
+

Model Description

+

This model is based on the EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks paper.

+

alt

+

## 3. Running the model without optimizations

+

PyTorch has a model repository called timm, which is a source for high quality implementations of computer vision models. We can get our EfficientNet model from there pretrained on ImageNet.

+
+
[4]:
+
+
+
import torch
+import torch_tensorrt
+import timm
+import time
+import numpy as np
+import torch.backends.cudnn as cudnn
+from timm.data import resolve_data_config
+from timm.data.transforms_factory import create_transform
+import json
+
+efficientnet_b0_model = timm.create_model('efficientnet_b0',pretrained=True)
+model = efficientnet_b0_model.eval().to("cuda")
+
+
+
+

With our model loaded, let’s proceed to downloading some images!

+
+
[5]:
+
+
+
!mkdir -p ./data
+!wget  -O ./data/img0.JPG "https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630"
+!wget  -O ./data/img1.JPG "https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg"
+!wget  -O ./data/img2.JPG "https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg"
+!wget  -O ./data/img3.JPG "https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg"
+
+!wget  -O ./data/imagenet_class_index.json "https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json"
+
+
+
+
+
+
+
+
+--2022-02-04 21:30:07--  https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630
+Resolving d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)... 18.65.227.127, 18.65.227.37, 18.65.227.99, ...
+Connecting to d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)|18.65.227.127|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 24112 (24K) [image/jpeg]
+Saving to: ‘./data/img0.JPG’
+
+./data/img0.JPG     100%[===================>]  23.55K  --.-KB/s    in 0.004s
+
+2022-02-04 21:30:07 (6.40 MB/s) - ‘./data/img0.JPG’ saved [24112/24112]
+
+--2022-02-04 21:30:07--  https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg
+Resolving www.hakaimagazine.com (www.hakaimagazine.com)... 164.92.73.117
+Connecting to www.hakaimagazine.com (www.hakaimagazine.com)|164.92.73.117|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 452718 (442K) [image/jpeg]
+Saving to: ‘./data/img1.JPG’
+
+./data/img1.JPG     100%[===================>] 442.11K  --.-KB/s    in 0.06s
+
+2022-02-04 21:30:07 (6.83 MB/s) - ‘./data/img1.JPG’ saved [452718/452718]
+
+--2022-02-04 21:30:08--  https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg
+Resolving www.artis.nl (www.artis.nl)... 94.75.225.20
+Connecting to www.artis.nl (www.artis.nl)|94.75.225.20|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 361413 (353K) [image/jpeg]
+Saving to: ‘./data/img2.JPG’
+
+./data/img2.JPG     100%[===================>] 352.94K   246KB/s    in 1.4s
+
+2022-02-04 21:30:10 (246 KB/s) - ‘./data/img2.JPG’ saved [361413/361413]
+
+--2022-02-04 21:30:10--  https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg
+Resolving www.familyhandyman.com (www.familyhandyman.com)... 104.18.202.107, 104.18.201.107, 2606:4700::6812:ca6b, ...
+Connecting to www.familyhandyman.com (www.familyhandyman.com)|104.18.202.107|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 90994 (89K) [image/jpeg]
+Saving to: ‘./data/img3.JPG’
+
+./data/img3.JPG     100%[===================>]  88.86K  --.-KB/s    in 0.006s
+
+2022-02-04 21:30:10 (14.4 MB/s) - ‘./data/img3.JPG’ saved [90994/90994]
+
+--2022-02-04 21:30:11--  https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json
+Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.216.133.45
+Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.216.133.45|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 35363 (35K) [application/octet-stream]
+Saving to: ‘./data/imagenet_class_index.json’
+
+./data/imagenet_cla 100%[===================>]  34.53K  --.-KB/s    in 0.07s
+
+2022-02-04 21:30:11 (474 KB/s) - ‘./data/imagenet_class_index.json’ saved [35363/35363]
+
+
+
+

All pre-trained models expect input images normalized in the same way, i.e. mini-batches of 3-channel RGB images of shape (3 x H x W), where H and W are expected to be at least 224. The images have to be loaded in to a range of [0, 1] and then normalized using mean = [0.485, 0.456, 0.406] and std = [0.229, 0.224, 0.225].

+

Here’s a sample execution.

+
+
[6]:
+
+
+
from PIL import Image
+from torchvision import transforms
+import matplotlib.pyplot as plt
+
+fig, axes = plt.subplots(nrows=2, ncols=2)
+
+for i in range(4):
+    img_path = './data/img%d.JPG'%i
+    img = Image.open(img_path)
+    preprocess = transforms.Compose([
+        transforms.Resize(256),
+        transforms.CenterCrop(224),
+        transforms.ToTensor(),
+        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
+    ])
+    input_tensor = preprocess(img)
+    plt.subplot(2,2,i+1)
+    plt.imshow(img)
+    plt.axis('off')
+
+# loading labels
+with open("./data/imagenet_class_index.json") as json_file:
+    d = json.load(json_file)
+
+
+
+
+
+
+
+../_images/_notebooks_EfficientNet-example_12_0.png +
+
+

Throughout this tutorial, we will be making use of some utility functions; efficientnet_preprocess for preprocessing input images, predict to use the model for prediction and benchmark to benchmark the inference. You do not need to understand/go through these utilities to make use of Torch TensorRT, but are welecomed to do so if you choose.

+
+
[7]:
+
+
+
cudnn.benchmark = True
+
+def efficientnet_preprocess():
+    config = resolve_data_config({}, model=model)
+    transform = create_transform(**config)
+    return transform
+
+# decode the results into ([predicted class, description], probability)
+def predict(img_path, model):
+    img = Image.open(img_path)
+    preprocess = efficientnet_preprocess()
+    input_tensor = preprocess(img)
+    input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model
+
+    # move the input and model to GPU for speed if available
+    if torch.cuda.is_available():
+        input_batch = input_batch.to('cuda')
+        model.to('cuda')
+
+    with torch.no_grad():
+        output = model(input_batch)
+        # Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes
+        sm_output = torch.nn.functional.softmax(output[0], dim=0)
+
+    ind = torch.argmax(sm_output)
+    return d[str(ind.item())], sm_output[ind] #([predicted class, description], probability)
+
+def benchmark(model, input_shape=(1024, 1, 224, 224), dtype='fp32', nwarmup=50, nruns=10000):
+    input_data = torch.randn(input_shape)
+    input_data = input_data.to("cuda")
+    if dtype=='fp16':
+        input_data = input_data.half()
+
+    print("Warm up ...")
+    with torch.no_grad():
+        for _ in range(nwarmup):
+            features = model(input_data)
+    torch.cuda.synchronize()
+    print("Start timing ...")
+    timings = []
+    with torch.no_grad():
+        for i in range(1, nruns+1):
+            start_time = time.time()
+            features = model(input_data)
+            torch.cuda.synchronize()
+            end_time = time.time()
+            timings.append(end_time - start_time)
+            if i%10==0:
+                print('Iteration %d/%d, avg batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))
+
+    print("Input shape:", input_data.size())
+    print("Output features size:", features.size())
+    print('Average throughput: %.2f images/second'%(input_shape[0]/np.mean(timings)))
+
+
+
+

With the model downloaded and the util functions written, let’s just quickly see some predictions, and benchmark the model in its current un-optimized state.

+
+
[8]:
+
+
+
for i in range(4):
+    img_path = './data/img%d.JPG'%i
+    img = Image.open(img_path)
+
+    pred, prob = predict(img_path, efficientnet_b0_model)
+    print('{} - Predicted: {}, Probablility: {}'.format(img_path, pred, prob))
+
+    plt.subplot(2,2,i+1)
+    plt.imshow(img);
+    plt.axis('off');
+    plt.title(pred[1])
+
+
+
+
+
+
+
+
+/opt/conda/lib/python3.8/site-packages/torchvision/transforms/transforms.py:321: UserWarning: Argument interpolation should be of type InterpolationMode instead of int. Please, use InterpolationMode enum.
+  warnings.warn(
+
+
+
+
+
+
+
+./data/img0.JPG - Predicted: ['n02109961', 'Eskimo_dog'], Probablility: 0.3987298309803009
+./data/img1.JPG - Predicted: ['n01537544', 'indigo_bunting'], Probablility: 0.23344755172729492
+./data/img2.JPG - Predicted: ['n02481823', 'chimpanzee'], Probablility: 0.9695423245429993
+./data/img3.JPG - Predicted: ['n01739381', 'vine_snake'], Probablility: 0.227739155292511
+
+
+
+
+
+
+../_images/_notebooks_EfficientNet-example_16_2.png +
+
+
+
[9]:
+
+
+
# Model benchmark without Torch-TensorRT
+benchmark(model, input_shape=(128, 3, 224, 224), nruns=100)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, avg batch time 37.62 ms
+Iteration 20/100, avg batch time 37.66 ms
+Iteration 30/100, avg batch time 37.65 ms
+Iteration 40/100, avg batch time 37.66 ms
+Iteration 50/100, avg batch time 37.70 ms
+Iteration 60/100, avg batch time 37.70 ms
+Iteration 70/100, avg batch time 37.70 ms
+Iteration 80/100, avg batch time 37.71 ms
+Iteration 90/100, avg batch time 37.72 ms
+Iteration 100/100, avg batch time 37.72 ms
+Input shape: torch.Size([128, 3, 224, 224])
+Output features size: torch.Size([128, 1000])
+Average throughput: 3393.46 images/second
+
+
+

## 4. Accelerating with Torch-TensorRT

+

Onwards to the next step, accelerating with Torch TensorRT. In these examples we showcase the results for FP32 (single precision) and FP16 (half precision). We do not demonstrat specific tuning, just showcase the simplicity of usage. If you want to learn more about the possible customizations, visit our documentation.

+
+
+

FP32 (single precision)

+
+
[11]:
+
+
+
# The compiled module will have precision as specified by "op_precision".
+# Here, it will have FP32 precision.
+trt_model_fp32 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.float32)],
+    enabled_precisions = torch.float32, # Run with FP32
+    workspace_size = 1 << 22
+)
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+
+
+
+
[12]:
+
+
+
# Obtain the average time taken by a batch of input
+benchmark(trt_model_fp32, input_shape=(128, 3, 224, 224), nruns=100)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, avg batch time 27.86 ms
+Iteration 20/100, avg batch time 27.71 ms
+Iteration 30/100, avg batch time 27.99 ms
+Iteration 40/100, avg batch time 27.95 ms
+Iteration 50/100, avg batch time 27.89 ms
+Iteration 60/100, avg batch time 27.85 ms
+Iteration 70/100, avg batch time 28.00 ms
+Iteration 80/100, avg batch time 27.97 ms
+Iteration 90/100, avg batch time 27.95 ms
+Iteration 100/100, avg batch time 27.92 ms
+Input shape: torch.Size([128, 3, 224, 224])
+Output features size: torch.Size([128, 1000])
+Average throughput: 4584.06 images/second
+
+
+
+
+

FP16 (half precision)

+
+
[17]:
+
+
+
# The compiled module will have precision as specified by "op_precision".
+# Here, it will have FP16 precision.
+trt_model_fp16 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.half)],
+    enabled_precisions = {torch.half}, # Run with FP32
+    workspace_size = 1 << 22
+)
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float
+The compiler is going to use the user setting Float16
+This conflict may cause an error at runtime due to partial compilation being enabled and therefore
+compatibility with PyTorch's data type convention is required.
+If you do indeed see errors at runtime either:
+- Remove the dtype spec for x.1
+- Disable partial compilation by setting require_full_compilation to True
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT] - Mean converter disregards dtype
+WARNING: [Torch-TensorRT TorchScript Conversion Context] - Tensor DataType is determined at build time for tensors not marked as input or output.
+WARNING: [Torch-TensorRT TorchScript Conversion Context] - Tensor DataType is determined at build time for tensors not marked as input or output.
+
+
+
+
[18]:
+
+
+
# Obtain the average time taken by a batch of input
+benchmark(trt_model_fp16, input_shape=(128, 3, 224, 224), dtype='fp16', nruns=100)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, avg batch time 12.05 ms
+Iteration 20/100, avg batch time 12.56 ms
+Iteration 30/100, avg batch time 12.39 ms
+Iteration 40/100, avg batch time 12.34 ms
+Iteration 50/100, avg batch time 12.33 ms
+Iteration 60/100, avg batch time 12.32 ms
+Iteration 70/100, avg batch time 12.30 ms
+Iteration 80/100, avg batch time 12.28 ms
+Iteration 90/100, avg batch time 12.35 ms
+Iteration 100/100, avg batch time 12.35 ms
+Input shape: torch.Size([128, 3, 224, 224])
+Output features size: torch.Size([128, 1000])
+Average throughput: 10362.23 images/second
+
+
+

## 5. Conclusion

+

In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT for EfficientNet-B0 model and test the performance impact of the optimization. With Torch-TensorRT, we observe a speedup of 1.35x with FP32, and 3.13x with FP16 on an NVIDIA 3090 GPU. These acceleration numbers will vary from GPU to GPU(as well as implementation to implementation based on the ops used) and we encorage you to try out latest generation of Data center compute +cards for maximum acceleration.

+
+
+

What’s next

+

Now it’s time to try Torch-TensorRT on your own model. If you run into any issues, you can fill them at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.

+
+
[ ]:
+
+
+

+
+
+
+
+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_notebooks/EfficientNet-example.ipynb b/docs/v1.2.0/_notebooks/EfficientNet-example.ipynb new file mode 100644 index 0000000000..31a3dad874 --- /dev/null +++ b/docs/v1.2.0/_notebooks/EfficientNet-example.ipynb @@ -0,0 +1,693 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Torch-TensorRT Getting Started - EfficientNet-B0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch's JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.\n", + "\n", + "When deploying on NVIDIA GPUs TensorRT, NVIDIA's Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA's Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.\n", + "\n", + "Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained EfficientNet network, and running it to test the speedup obtained.\n", + "\n", + "## Content\n", + "1. [Requirements](#1)\n", + "1. [EfficientNet Overview](#2)\n", + "1. [Running the model without optimizations](#3)\n", + "1. [Accelerating with Torch-TensorRT](#4)\n", + "1. [Conclusion](#5)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting timm==0.4.12\n", + " Downloading timm-0.4.12-py3-none-any.whl (376 kB)\n", + "\u001b[K |████████████████████████████████| 376 kB 11.9 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: torch>=1.4 in /opt/conda/lib/python3.8/site-packages (from timm==0.4.12) (1.11.0a0+bfe5ad2)\n", + "Requirement already satisfied: torchvision in /opt/conda/lib/python3.8/site-packages (from timm==0.4.12) (0.12.0a0)\n", + "Requirement already satisfied: typing_extensions in /opt/conda/lib/python3.8/site-packages (from torch>=1.4->timm==0.4.12) (4.0.1)\n", + "Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in /opt/conda/lib/python3.8/site-packages (from torchvision->timm==0.4.12) (8.2.0)\n", + "Requirement already satisfied: numpy in /opt/conda/lib/python3.8/site-packages (from torchvision->timm==0.4.12) (1.22.0)\n", + "Installing collected packages: timm\n", + "Successfully installed timm-0.4.12\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Fri Feb 4 21:29:36 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 510.39.01 Driver Version: 510.39.01 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA GeForce ... On | 00000000:65:00.0 Off | N/A |\n", + "| 30% 28C P8 11W / 350W | 0MiB / 24576MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!pip install timm==0.4.12\n", + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "NVIDIA's NGC provides PyTorch Docker Container which contains PyTorch and Torch-TensorRT. We can make use of [latest pytorch](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch) container to run this notebook.\n", + "\n", + "Otherwise, you can follow the steps in `notebooks/README` to prepare a Docker container yourself, within which you can run this demo notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 2. EfficientNet Overview\n", + "\n", + "\n", + "PyTorch has a model repository called `timm`, which is a source for high quality implementations of computer vision models. We can get our EfficientNet model from there pretrained on ImageNet.\n", + "\n", + "### Model Description\n", + "\n", + "This model is based on the [EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks](https://arxiv.org/abs/1905.11946) paper.\n", + "\n", + "\"alt\"\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 3. Running the model without optimizations\n", + "\n", + "\n", + "PyTorch has a model repository called `timm`, which is a source for high quality implementations of computer vision models. We can get our EfficientNet model from there pretrained on ImageNet." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "import torch\n", + "import torch_tensorrt\n", + "import timm\n", + "import time\n", + "import numpy as np\n", + "import torch.backends.cudnn as cudnn\n", + "from timm.data import resolve_data_config\n", + "from timm.data.transforms_factory import create_transform\n", + "import json \n", + "\n", + "efficientnet_b0_model = timm.create_model('efficientnet_b0',pretrained=True)\n", + "model = efficientnet_b0_model.eval().to(\"cuda\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our model loaded, let's proceed to downloading some images!" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2022-02-04 21:30:07-- https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\n", + "Resolving d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)... 18.65.227.127, 18.65.227.37, 18.65.227.99, ...\n", + "Connecting to d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)|18.65.227.127|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 24112 (24K) [image/jpeg]\n", + "Saving to: ‘./data/img0.JPG’\n", + "\n", + "./data/img0.JPG 100%[===================>] 23.55K --.-KB/s in 0.004s \n", + "\n", + "2022-02-04 21:30:07 (6.40 MB/s) - ‘./data/img0.JPG’ saved [24112/24112]\n", + "\n", + "--2022-02-04 21:30:07-- https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\n", + "Resolving www.hakaimagazine.com (www.hakaimagazine.com)... 164.92.73.117\n", + "Connecting to www.hakaimagazine.com (www.hakaimagazine.com)|164.92.73.117|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 452718 (442K) [image/jpeg]\n", + "Saving to: ‘./data/img1.JPG’\n", + "\n", + "./data/img1.JPG 100%[===================>] 442.11K --.-KB/s in 0.06s \n", + "\n", + "2022-02-04 21:30:07 (6.83 MB/s) - ‘./data/img1.JPG’ saved [452718/452718]\n", + "\n", + "--2022-02-04 21:30:08-- https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\n", + "Resolving www.artis.nl (www.artis.nl)... 94.75.225.20\n", + "Connecting to www.artis.nl (www.artis.nl)|94.75.225.20|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 361413 (353K) [image/jpeg]\n", + "Saving to: ‘./data/img2.JPG’\n", + "\n", + "./data/img2.JPG 100%[===================>] 352.94K 246KB/s in 1.4s \n", + "\n", + "2022-02-04 21:30:10 (246 KB/s) - ‘./data/img2.JPG’ saved [361413/361413]\n", + "\n", + "--2022-02-04 21:30:10-- https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\n", + "Resolving www.familyhandyman.com (www.familyhandyman.com)... 104.18.202.107, 104.18.201.107, 2606:4700::6812:ca6b, ...\n", + "Connecting to www.familyhandyman.com (www.familyhandyman.com)|104.18.202.107|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 90994 (89K) [image/jpeg]\n", + "Saving to: ‘./data/img3.JPG’\n", + "\n", + "./data/img3.JPG 100%[===================>] 88.86K --.-KB/s in 0.006s \n", + "\n", + "2022-02-04 21:30:10 (14.4 MB/s) - ‘./data/img3.JPG’ saved [90994/90994]\n", + "\n", + "--2022-02-04 21:30:11-- https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\n", + "Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.216.133.45\n", + "Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.216.133.45|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 35363 (35K) [application/octet-stream]\n", + "Saving to: ‘./data/imagenet_class_index.json’\n", + "\n", + "./data/imagenet_cla 100%[===================>] 34.53K --.-KB/s in 0.07s \n", + "\n", + "2022-02-04 21:30:11 (474 KB/s) - ‘./data/imagenet_class_index.json’ saved [35363/35363]\n", + "\n" + ] + } + ], + "source": [ + "!mkdir -p ./data\n", + "!wget -O ./data/img0.JPG \"https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\"\n", + "!wget -O ./data/img1.JPG \"https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\"\n", + "!wget -O ./data/img2.JPG \"https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\"\n", + "!wget -O ./data/img3.JPG \"https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\"\n", + "\n", + "!wget -O ./data/imagenet_class_index.json \"https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All pre-trained models expect input images normalized in the same way,\n", + "i.e. mini-batches of 3-channel RGB images of shape `(3 x H x W)`, where `H` and `W` are expected to be at least `224`.\n", + "The images have to be loaded in to a range of `[0, 1]` and then normalized using `mean = [0.485, 0.456, 0.406]`\n", + "and `std = [0.229, 0.224, 0.225]`.\n", + "\n", + "Here's a sample execution." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from PIL import Image\n", + "from torchvision import transforms\n", + "import matplotlib.pyplot as plt\n", + "\n", + "fig, axes = plt.subplots(nrows=2, ncols=2)\n", + "\n", + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " input_tensor = preprocess(img) \n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img)\n", + " plt.axis('off')\n", + "\n", + "# loading labels\n", + "with open(\"./data/imagenet_class_index.json\") as json_file: \n", + " d = json.load(json_file)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Throughout this tutorial, we will be making use of some utility functions; `efficientnet_preprocess` for preprocessing input images, `predict` to use the model for prediction and `benchmark` to benchmark the inference. You do not need to understand/go through these utilities to make use of Torch TensorRT, but are welecomed to do so if you choose." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "cudnn.benchmark = True\n", + "\n", + "def efficientnet_preprocess():\n", + " config = resolve_data_config({}, model=model)\n", + " transform = create_transform(**config)\n", + " return transform\n", + "\n", + "# decode the results into ([predicted class, description], probability)\n", + "def predict(img_path, model):\n", + " img = Image.open(img_path)\n", + " preprocess = efficientnet_preprocess()\n", + " input_tensor = preprocess(img)\n", + " input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model\n", + " \n", + " # move the input and model to GPU for speed if available\n", + " if torch.cuda.is_available():\n", + " input_batch = input_batch.to('cuda')\n", + " model.to('cuda')\n", + "\n", + " with torch.no_grad():\n", + " output = model(input_batch)\n", + " # Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes\n", + " sm_output = torch.nn.functional.softmax(output[0], dim=0)\n", + " \n", + " ind = torch.argmax(sm_output)\n", + " return d[str(ind.item())], sm_output[ind] #([predicted class, description], probability)\n", + "\n", + "def benchmark(model, input_shape=(1024, 1, 224, 224), dtype='fp32', nwarmup=50, nruns=10000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%10==0:\n", + " print('Iteration %d/%d, avg batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output features size:\", features.size())\n", + " print('Average throughput: %.2f images/second'%(input_shape[0]/np.mean(timings)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the model downloaded and the util functions written, let's just quickly see some predictions, and benchmark the model in its current un-optimized state." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/lib/python3.8/site-packages/torchvision/transforms/transforms.py:321: UserWarning: Argument interpolation should be of type InterpolationMode instead of int. Please, use InterpolationMode enum.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "./data/img0.JPG - Predicted: ['n02109961', 'Eskimo_dog'], Probablility: 0.3987298309803009\n", + "./data/img1.JPG - Predicted: ['n01537544', 'indigo_bunting'], Probablility: 0.23344755172729492\n", + "./data/img2.JPG - Predicted: ['n02481823', 'chimpanzee'], Probablility: 0.9695423245429993\n", + "./data/img3.JPG - Predicted: ['n01739381', 'vine_snake'], Probablility: 0.227739155292511\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " \n", + " pred, prob = predict(img_path, efficientnet_b0_model)\n", + " print('{} - Predicted: {}, Probablility: {}'.format(img_path, pred, prob))\n", + "\n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img);\n", + " plt.axis('off');\n", + " plt.title(pred[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 37.62 ms\n", + "Iteration 20/100, avg batch time 37.66 ms\n", + "Iteration 30/100, avg batch time 37.65 ms\n", + "Iteration 40/100, avg batch time 37.66 ms\n", + "Iteration 50/100, avg batch time 37.70 ms\n", + "Iteration 60/100, avg batch time 37.70 ms\n", + "Iteration 70/100, avg batch time 37.70 ms\n", + "Iteration 80/100, avg batch time 37.71 ms\n", + "Iteration 90/100, avg batch time 37.72 ms\n", + "Iteration 100/100, avg batch time 37.72 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average throughput: 3393.46 images/second\n" + ] + } + ], + "source": [ + "# Model benchmark without Torch-TensorRT\n", + "benchmark(model, input_shape=(128, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 4. Accelerating with Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Onwards to the next step, accelerating with Torch TensorRT. In these examples we showcase the results for FP32 (single precision) and FP16 (half precision). We do not demonstrat specific tuning, just showcase the simplicity of usage. If you want to learn more about the possible customizations, visit our [documentation](https://nvidia.github.io/Torch-TensorRT/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP32 (single precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n" + ] + } + ], + "source": [ + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP32 precision.\n", + "trt_model_fp32 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.float32)],\n", + " enabled_precisions = torch.float32, # Run with FP32\n", + " workspace_size = 1 << 22\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 27.86 ms\n", + "Iteration 20/100, avg batch time 27.71 ms\n", + "Iteration 30/100, avg batch time 27.99 ms\n", + "Iteration 40/100, avg batch time 27.95 ms\n", + "Iteration 50/100, avg batch time 27.89 ms\n", + "Iteration 60/100, avg batch time 27.85 ms\n", + "Iteration 70/100, avg batch time 28.00 ms\n", + "Iteration 80/100, avg batch time 27.97 ms\n", + "Iteration 90/100, avg batch time 27.95 ms\n", + "Iteration 100/100, avg batch time 27.92 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average throughput: 4584.06 images/second\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input\n", + "benchmark(trt_model_fp32, input_shape=(128, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP16 (half precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x.1\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Tensor DataType is determined at build time for tensors not marked as input or output.\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Tensor DataType is determined at build time for tensors not marked as input or output.\n" + ] + } + ], + "source": [ + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP16 precision.\n", + "trt_model_fp16 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.half)],\n", + " enabled_precisions = {torch.half}, # Run with FP32\n", + " workspace_size = 1 << 22\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 12.05 ms\n", + "Iteration 20/100, avg batch time 12.56 ms\n", + "Iteration 30/100, avg batch time 12.39 ms\n", + "Iteration 40/100, avg batch time 12.34 ms\n", + "Iteration 50/100, avg batch time 12.33 ms\n", + "Iteration 60/100, avg batch time 12.32 ms\n", + "Iteration 70/100, avg batch time 12.30 ms\n", + "Iteration 80/100, avg batch time 12.28 ms\n", + "Iteration 90/100, avg batch time 12.35 ms\n", + "Iteration 100/100, avg batch time 12.35 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average throughput: 10362.23 images/second\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input\n", + "benchmark(trt_model_fp16, input_shape=(128, 3, 224, 224), dtype='fp16', nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 5. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT for EfficientNet-B0 model and test the performance impact of the optimization. With Torch-TensorRT, we observe a speedup of **1.35x** with FP32, and **3.13x** with FP16 on an NVIDIA 3090 GPU. These acceleration numbers will vary from GPU to GPU(as well as implementation to implementation based on the ops used) and we encorage you to try out latest generation of Data center compute cards for maximum acceleration.\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. If you run into any issues, you can fill them at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.2.0/_notebooks/Hugging-Face-BERT.html b/docs/v1.2.0/_notebooks/Hugging-Face-BERT.html new file mode 100644 index 0000000000..6a6b51f0fb --- /dev/null +++ b/docs/v1.2.0/_notebooks/Hugging-Face-BERT.html @@ -0,0 +1,1380 @@ + + + + + + + + + + + + + Masked Language Modeling (MLM) with Hugging Face BERT Transformer — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Masked Language Modeling (MLM) with Hugging Face BERT Transformer
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ + + +
+
[1]:
+
+
+
# Copyright 2022 NVIDIA Corporation. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
+
+

05794857f0be4549aac84aed85b14705

+
+

Masked Language Modeling (MLM) with Hugging Face BERT Transformer

+
+

Learning objectives

+

This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained BERT transformer from Hugging Face, and running it to test the speedup obtained.

+
+
+

Contents

+
    +
  1. Requirements

  2. +
  3. BERT Overview

  4. +
  5. Creating TorchScript modules

  6. +
  7. Compiling with Torch-TensorRT

  8. +
  9. Benchmarking

  10. +
  11. Conclusion

  12. +
+

## 1. Requirements

+

NVIDIA’s NGC provides a PyTorch Docker Container which contains PyTorch and Torch-TensorRT. Starting with version 22.05-py3, we can make use of latest pytorch container to run this notebook.

+

Otherwise, you can follow the steps in notebooks/README to prepare a Docker container yourself, within which you can run this demo notebook.

+
+
[2]:
+
+
+
!pip install transformers
+
+
+
+
+
+
+
+
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Requirement already satisfied: transformers in /opt/conda/lib/python3.8/site-packages (4.18.0)
+Requirement already satisfied: tqdm>=4.27 in /opt/conda/lib/python3.8/site-packages (from transformers) (4.63.0)
+Requirement already satisfied: regex!=2019.12.17 in /opt/conda/lib/python3.8/site-packages (from transformers) (2022.3.15)
+Requirement already satisfied: huggingface-hub<1.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from transformers) (0.5.1)
+Requirement already satisfied: tokenizers!=0.11.3,<0.13,>=0.11.1 in /opt/conda/lib/python3.8/site-packages (from transformers) (0.12.1)
+Requirement already satisfied: numpy>=1.17 in /opt/conda/lib/python3.8/site-packages (from transformers) (1.22.3)
+Requirement already satisfied: sacremoses in /opt/conda/lib/python3.8/site-packages (from transformers) (0.0.49)
+Requirement already satisfied: requests in /opt/conda/lib/python3.8/site-packages (from transformers) (2.27.1)
+Requirement already satisfied: pyyaml>=5.1 in /opt/conda/lib/python3.8/site-packages (from transformers) (6.0)
+Requirement already satisfied: filelock in /opt/conda/lib/python3.8/site-packages (from transformers) (3.6.0)
+Requirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.8/site-packages (from transformers) (21.3)
+Requirement already satisfied: typing-extensions>=3.7.4.3 in /opt/conda/lib/python3.8/site-packages (from huggingface-hub<1.0,>=0.1.0->transformers) (4.1.1)
+Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging>=20.0->transformers) (3.0.7)
+Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (1.26.8)
+Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (2.0.12)
+Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (2021.10.8)
+Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (3.3)
+Requirement already satisfied: six in /opt/conda/lib/python3.8/site-packages (from sacremoses->transformers) (1.16.0)
+Requirement already satisfied: click in /opt/conda/lib/python3.8/site-packages (from sacremoses->transformers) (8.0.4)
+Requirement already satisfied: joblib in /opt/conda/lib/python3.8/site-packages (from sacremoses->transformers) (1.1.0)
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+
+
+
+
[3]:
+
+
+
from transformers import BertTokenizer, BertForMaskedLM
+import torch
+import timeit
+import numpy as np
+import torch_tensorrt
+import torch.backends.cudnn as cudnn
+
+
+
+

## 2. BERT Overview

+

Transformers comprise a class of deep learning algorithms employing self-attention; broadly speaking, the models learn large matrices of numbers, each element of which denotes how important one component of input data is to another. Since their introduction in 2017, transformers have enjoyed widespread adoption, particularly in natural language processing, but also in computer vision problems. This is largely because they are easier to parallelize than the sequence models which attention +mechanisms were originally designed to augment.

+

Hugging Face is a company that maintains a huge respository of pre-trained transformer models. The company also provides tools for integrating those models into PyTorch code and running inference with them.

+

One of the most popular transformer models is BERT (Bidirectional Encoder Representations from Transformers). First developed at Google and released in 2018, it has become the backbone of Google’s search engine and a standard benchmark for NLP experiments. BERT was originally trained for next sentence prediction and masked language modeling (MLM), which aims to predict hidden words in sentences. In this notebook, we will use Hugging Face’s bert-base-uncased model (BERT’s smallest and +simplest form, which does not employ text capitalization) for MLM.

+

## 3. Creating TorchScript modules

+

First, create a pretrained BERT tokenizer from the bert-base-uncased model

+
+
[4]:
+
+
+
enc = BertTokenizer.from_pretrained('bert-base-uncased')
+
+
+
+

Create dummy inputs to generate a traced TorchScript model later

+
+
[5]:
+
+
+
batch_size = 4
+
+batched_indexed_tokens = [[101, 64]*64]*batch_size
+batched_segment_ids = [[0, 1]*64]*batch_size
+batched_attention_masks = [[1, 1]*64]*batch_size
+
+tokens_tensor = torch.tensor(batched_indexed_tokens)
+segments_tensor = torch.tensor(batched_segment_ids)
+attention_masks_tensor = torch.tensor(batched_attention_masks)
+
+
+
+

Obtain a BERT masked language model from Hugging Face in the (scripted) TorchScript, then use the dummy inputs to trace it

+
+
[6]:
+
+
+
mlm_model_ts = BertForMaskedLM.from_pretrained('bert-base-uncased', torchscript=True)
+traced_mlm_model = torch.jit.trace(mlm_model_ts, [tokens_tensor, segments_tensor, attention_masks_tensor])
+
+
+
+
+
+
+
+
+Some weights of the model checkpoint at bert-base-uncased were not used when initializing BertForMaskedLM: ['cls.seq_relationship.bias', 'cls.seq_relationship.weight']
+- This IS expected if you are initializing BertForMaskedLM from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).
+- This IS NOT expected if you are initializing BertForMaskedLM from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).
+
+
+

Define 4 masked sentences, with 1 word in each sentence hidden from the model. Fluent English speakers will probably be able to guess the masked words, but just in case, they are 'capital', 'language', 'innings', and 'mathematics'.

+

Also create a list containing the position of the masked word within each sentence. Given Python’s 0-based indexing convention, the numbers are each higher by 1 than might be expected. This is because the token at index 0 in each sentence is a beginning-of-sentence token, denoted [CLS] when entered explicitly.

+
+
[7]:
+
+
+
masked_sentences = ['Paris is the [MASK] of France.',
+                    'The primary [MASK] of the United States is English.',
+                    'A baseball game consists of at least nine [MASK].',
+                    'Topology is a branch of [MASK] concerned with the properties of geometric objects that remain unchanged under continuous transformations.']
+pos_masks = [4, 3, 9, 6]
+
+
+
+

Pass the masked sentences into the (scripted) TorchScript MLM model and verify that the unmasked sentences yield the expected results.

+

Because the sentences are of different lengths, we must specify the padding argument in calling our encoder/tokenizer. There are several possible padding strategies, but we’ll use 'max_length' padding with max_length=128. Later, when we compile an optimized version of the model with Torch-TensorRT, the optimized model will expect inputs of length 128, hence our choice of padding strategy and length here.

+
+
[8]:
+
+
+
encoded_inputs = enc(masked_sentences, return_tensors='pt', padding='max_length', max_length=128)
+outputs = mlm_model_ts(**encoded_inputs)
+most_likely_token_ids = [torch.argmax(outputs[0][i, pos, :]) for i, pos in enumerate(pos_masks)]
+unmasked_tokens = enc.decode(most_likely_token_ids).split(' ')
+unmasked_sentences = [masked_sentences[i].replace('[MASK]', token) for i, token in enumerate(unmasked_tokens)]
+for sentence in unmasked_sentences:
+    print(sentence)
+
+
+
+
+
+
+
+
+Paris is the capital of France.
+The primary language of the United States is English.
+A baseball game consists of at least nine innings.
+Topology is a branch of mathematics concerned with the properties of geometric objects that remain unchanged under continuous transformations.
+
+
+

Pass the masked sentences into the traced MLM model and verify that the unmasked sentences yield the expected results.

+

Note the difference in how the encoded_inputs are passed into the model in the following cell compared to the previous one. If you examine encoded_inputs, you’ll find that it’s a dictionary with 3 keys, 'input_ids', 'token_type_ids', and 'attention_mask', each with a PyTorch tensor as an associated value. The traced model will accept **encoded_inputs as an input, but the Torch-TensorRT-optimized model (to be defined later) will not.

+
+
[9]:
+
+
+
encoded_inputs = enc(masked_sentences, return_tensors='pt', padding='max_length', max_length=128)
+outputs = traced_mlm_model(encoded_inputs['input_ids'], encoded_inputs['token_type_ids'], encoded_inputs['attention_mask'])
+most_likely_token_ids = [torch.argmax(outputs[0][i, pos, :]) for i, pos in enumerate(pos_masks)]
+unmasked_tokens = enc.decode(most_likely_token_ids).split(' ')
+unmasked_sentences = [masked_sentences[i].replace('[MASK]', token) for i, token in enumerate(unmasked_tokens)]
+for sentence in unmasked_sentences:
+    print(sentence)
+
+
+
+
+
+
+
+
+Paris is the capital of France.
+The primary language of the United States is English.
+A baseball game consists of at least nine innings.
+Topology is a branch of mathematics concerned with the properties of geometric objects that remain unchanged under continuous transformations.
+
+
+

## 4. Compiling with Torch-TensorRT

+

Change the logging level to avoid long printouts

+
+
[10]:
+
+
+
new_level = torch_tensorrt.logging.Level.Error
+torch_tensorrt.logging.set_reportable_log_level(new_level)
+
+
+
+

Compile the model

+
+
[11]:
+
+
+
trt_model = torch_tensorrt.compile(traced_mlm_model,
+    inputs= [torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32),  # input_ids
+             torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32),  # token_type_ids
+             torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32)], # attention_mask
+    enabled_precisions= {torch.float32}, # Run with 32-bit precision
+    workspace_size=2000000000,
+    truncate_long_and_double=True
+)
+
+
+
+

Pass the masked sentences into the compiled model and verify that the unmasked sentences yield the expected results.

+
+
[12]:
+
+
+
enc_inputs = enc(masked_sentences, return_tensors='pt', padding='max_length', max_length=128)
+enc_inputs = {k: v.type(torch.int32).cuda() for k, v in enc_inputs.items()}
+output_trt = trt_model(enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])
+most_likely_token_ids_trt = [torch.argmax(output_trt[i, pos, :]) for i, pos in enumerate(pos_masks)]
+unmasked_tokens_trt = enc.decode(most_likely_token_ids_trt).split(' ')
+unmasked_sentences_trt = [masked_sentences[i].replace('[MASK]', token) for i, token in enumerate(unmasked_tokens_trt)]
+for sentence in unmasked_sentences_trt:
+    print(sentence)
+
+
+
+
+
+
+
+
+Paris is the capital of France.
+The primary language of the United States is English.
+A baseball game consists of at least nine innings.
+Topology is a branch of mathematics concerned with the properties of geometric objects that remain unchanged under continuous transformations.
+
+
+

Compile the model again, this time with 16-bit precision

+
+
[13]:
+
+
+
trt_model_fp16 = torch_tensorrt.compile(traced_mlm_model,
+    inputs= [torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32),  # input_ids
+             torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32),  # token_type_ids
+             torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32)], # attention_mask
+    enabled_precisions= {torch.half}, # Run with 16-bit precision
+    workspace_size=2000000000,
+    truncate_long_and_double=True
+)
+
+
+
+

## 5. Benchmarking

+

In developing this notebook, we conducted our benchmarking on a single NVIDIA A100 GPU. Your results may differ from those shown, particularly on a different GPU.

+

This function passes the inputs into the model and runs inference num_loops times, then returns a list of length containing the amount of time in seconds that each instance of inference took.

+
+
[14]:
+
+
+
def timeGraph(model, input_tensor1, input_tensor2, input_tensor3, num_loops=50):
+    print("Warm up ...")
+    with torch.no_grad():
+        for _ in range(20):
+            features = model(input_tensor1, input_tensor2, input_tensor3)
+
+    torch.cuda.synchronize()
+
+    print("Start timing ...")
+    timings = []
+    with torch.no_grad():
+        for i in range(num_loops):
+            start_time = timeit.default_timer()
+            features = model(input_tensor1, input_tensor2, input_tensor3)
+            torch.cuda.synchronize()
+            end_time = timeit.default_timer()
+            timings.append(end_time - start_time)
+            # print("Iteration {}: {:.6f} s".format(i, end_time - start_time))
+
+    return timings
+
+
+
+

This function prints the number of input batches the model is able to process each second and summary statistics of the model’s latency.

+
+
[15]:
+
+
+
def printStats(graphName, timings, batch_size):
+    times = np.array(timings)
+    steps = len(times)
+    speeds = batch_size / times
+    time_mean = np.mean(times)
+    time_med = np.median(times)
+    time_99th = np.percentile(times, 99)
+    time_std = np.std(times, ddof=0)
+    speed_mean = np.mean(speeds)
+    speed_med = np.median(speeds)
+
+    msg = ("\n%s =================================\n"
+            "batch size=%d, num iterations=%d\n"
+            "  Median text batches/second: %.1f, mean: %.1f\n"
+            "  Median latency: %.6f, mean: %.6f, 99th_p: %.6f, std_dev: %.6f\n"
+            ) % (graphName,
+                batch_size, steps,
+                speed_med, speed_mean,
+                time_med, time_mean, time_99th, time_std)
+    print(msg)
+
+
+
+
+
[16]:
+
+
+
cudnn.benchmark = True
+
+
+
+

Benchmark the (scripted) TorchScript model on GPU

+
+
[17]:
+
+
+
timings = timeGraph(mlm_model_ts.cuda(), enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])
+
+printStats("BERT", timings, batch_size)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+
+BERT =================================
+batch size=4, num iterations=50
+  Median text batches/second: 599.1, mean: 597.6
+  Median latency: 0.006677, mean: 0.006693, 99th_p: 0.006943, std_dev: 0.000059
+
+
+
+

Benchmark the traced model on GPU

+
+
[18]:
+
+
+
timings = timeGraph(traced_mlm_model.cuda(), enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])
+
+printStats("BERT", timings, batch_size)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+
+BERT =================================
+batch size=4, num iterations=50
+  Median text batches/second: 951.2, mean: 951.0
+  Median latency: 0.004205, mean: 0.004206, 99th_p: 0.004256, std_dev: 0.000015
+
+
+
+

Benchmark the compiled FP32 model on GPU

+
+
[19]:
+
+
+
timings = timeGraph(trt_model, enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])
+
+printStats("BERT", timings, batch_size)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+
+BERT =================================
+batch size=4, num iterations=50
+  Median text batches/second: 1216.9, mean: 1216.4
+  Median latency: 0.003287, mean: 0.003289, 99th_p: 0.003317, std_dev: 0.000007
+
+
+
+

Benchmark the compiled FP16 model on GPU

+
+
[20]:
+
+
+
timings = timeGraph(trt_model_fp16, enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])
+
+printStats("BERT", timings, batch_size)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+
+BERT =================================
+batch size=4, num iterations=50
+  Median text batches/second: 1776.7, mean: 1771.1
+  Median latency: 0.002251, mean: 0.002259, 99th_p: 0.002305, std_dev: 0.000015
+
+
+
+

## 6. Conclusion

+

In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT for Masked Language Modeling with Hugging Face’s bert-base-uncased transformer and testing the performance impact of the optimization. With Torch-TensorRT on an NVIDIA A100 GPU, we observe the speedups indicated below. These acceleration numbers will vary from GPU to GPU (as well as implementation to implementation based on the ops used) and we encorage you to try out latest +generation of Data center compute cards for maximum acceleration.

+

Scripted (GPU): 1.0x Traced (GPU): 1.62x Torch-TensorRT (FP32): 2.14x Torch-TensorRT (FP16): 3.15x

+
+

What’s next

+

Now it’s time to try Torch-TensorRT on your own model. If you run into any issues, you can fill them at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.

+
+
[ ]:
+
+
+

+
+
+
+
+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_notebooks/Hugging-Face-BERT.ipynb b/docs/v1.2.0/_notebooks/Hugging-Face-BERT.ipynb new file mode 100644 index 0000000000..9b027b473e --- /dev/null +++ b/docs/v1.2.0/_notebooks/Hugging-Face-BERT.ipynb @@ -0,0 +1,714 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "9369b63c", + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2022 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "id": "d0a97ac5", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Masked Language Modeling (MLM) with Hugging Face BERT Transformer" + ] + }, + { + "cell_type": "markdown", + "id": "83f47edb", + "metadata": {}, + "source": [ + "## Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained BERT transformer from Hugging Face, and running it to test the speedup obtained.\n", + "\n", + "## Contents\n", + "1. [Requirements](#1)\n", + "2. [BERT Overview](#2)\n", + "3. [Creating TorchScript modules](#3)\n", + "4. [Compiling with Torch-TensorRT](#4)\n", + "5. [Benchmarking](#5)\n", + "6. [Conclusion](#6)" + ] + }, + { + "cell_type": "markdown", + "id": "596fa151", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "NVIDIA's NGC provides a PyTorch Docker Container which contains PyTorch and Torch-TensorRT. Starting with version `22.05-py3`, we can make use of [latest pytorch](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch) container to run this notebook.\n", + "\n", + "Otherwise, you can follow the steps in `notebooks/README` to prepare a Docker container yourself, within which you can run this demo notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "58e687d1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: transformers in /opt/conda/lib/python3.8/site-packages (4.18.0)\n", + "Requirement already satisfied: tqdm>=4.27 in /opt/conda/lib/python3.8/site-packages (from transformers) (4.63.0)\n", + "Requirement already satisfied: regex!=2019.12.17 in /opt/conda/lib/python3.8/site-packages (from transformers) (2022.3.15)\n", + "Requirement already satisfied: huggingface-hub<1.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from transformers) (0.5.1)\n", + "Requirement already satisfied: tokenizers!=0.11.3,<0.13,>=0.11.1 in /opt/conda/lib/python3.8/site-packages (from transformers) (0.12.1)\n", + "Requirement already satisfied: numpy>=1.17 in /opt/conda/lib/python3.8/site-packages (from transformers) (1.22.3)\n", + "Requirement already satisfied: sacremoses in /opt/conda/lib/python3.8/site-packages (from transformers) (0.0.49)\n", + "Requirement already satisfied: requests in /opt/conda/lib/python3.8/site-packages (from transformers) (2.27.1)\n", + "Requirement already satisfied: pyyaml>=5.1 in /opt/conda/lib/python3.8/site-packages (from transformers) (6.0)\n", + "Requirement already satisfied: filelock in /opt/conda/lib/python3.8/site-packages (from transformers) (3.6.0)\n", + "Requirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.8/site-packages (from transformers) (21.3)\n", + "Requirement already satisfied: typing-extensions>=3.7.4.3 in /opt/conda/lib/python3.8/site-packages (from huggingface-hub<1.0,>=0.1.0->transformers) (4.1.1)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging>=20.0->transformers) (3.0.7)\n", + "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (1.26.8)\n", + "Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (2.0.12)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (2021.10.8)\n", + "Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (3.3)\n", + "Requirement already satisfied: six in /opt/conda/lib/python3.8/site-packages (from sacremoses->transformers) (1.16.0)\n", + "Requirement already satisfied: click in /opt/conda/lib/python3.8/site-packages (from sacremoses->transformers) (8.0.4)\n", + "Requirement already satisfied: joblib in /opt/conda/lib/python3.8/site-packages (from sacremoses->transformers) (1.1.0)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install transformers" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "1104c4f1", + "metadata": {}, + "outputs": [], + "source": [ + "from transformers import BertTokenizer, BertForMaskedLM\n", + "import torch\n", + "import timeit\n", + "import numpy as np\n", + "import torch_tensorrt\n", + "import torch.backends.cudnn as cudnn" + ] + }, + { + "cell_type": "markdown", + "id": "acf67a5e", + "metadata": {}, + "source": [ + "\n", + "## 2. BERT Overview\n", + "\n", + "Transformers comprise a class of deep learning algorithms employing self-attention; broadly speaking, the models learn large matrices of numbers, each element of which denotes how important one component of input data is to another. Since their introduction in 2017, transformers have enjoyed widespread adoption, particularly in natural language processing, but also in computer vision problems. This is largely because they are easier to parallelize than the sequence models which attention mechanisms were originally designed to augment. \n", + "\n", + "Hugging Face is a company that maintains a huge respository of pre-trained transformer models. The company also provides tools for integrating those models into PyTorch code and running inference with them. \n", + "\n", + "One of the most popular transformer models is BERT (Bidirectional Encoder Representations from Transformers). First developed at Google and released in 2018, it has become the backbone of Google's search engine and a standard benchmark for NLP experiments. BERT was originally trained for next sentence prediction and masked language modeling (MLM), which aims to predict hidden words in sentences. In this notebook, we will use Hugging Face's `bert-base-uncased` model (BERT's smallest and simplest form, which does not employ text capitalization) for MLM." + ] + }, + { + "cell_type": "markdown", + "id": "19e711c0", + "metadata": {}, + "source": [ + "\n", + "## 3. Creating TorchScript modules " + ] + }, + { + "cell_type": "markdown", + "id": "81d4c6f6", + "metadata": {}, + "source": [ + "First, create a pretrained BERT tokenizer from the `bert-base-uncased` model" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c7c8721e", + "metadata": {}, + "outputs": [], + "source": [ + "enc = BertTokenizer.from_pretrained('bert-base-uncased')" + ] + }, + { + "cell_type": "markdown", + "id": "b7c1c679", + "metadata": {}, + "source": [ + "Create dummy inputs to generate a traced TorchScript model later" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c3827087", + "metadata": {}, + "outputs": [], + "source": [ + "batch_size = 4\n", + "\n", + "batched_indexed_tokens = [[101, 64]*64]*batch_size\n", + "batched_segment_ids = [[0, 1]*64]*batch_size\n", + "batched_attention_masks = [[1, 1]*64]*batch_size\n", + "\n", + "tokens_tensor = torch.tensor(batched_indexed_tokens)\n", + "segments_tensor = torch.tensor(batched_segment_ids)\n", + "attention_masks_tensor = torch.tensor(batched_attention_masks)" + ] + }, + { + "cell_type": "markdown", + "id": "7e31b27f", + "metadata": {}, + "source": [ + "Obtain a BERT masked language model from Hugging Face in the (scripted) TorchScript, then use the dummy inputs to trace it" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "a3cd5a35", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Some weights of the model checkpoint at bert-base-uncased were not used when initializing BertForMaskedLM: ['cls.seq_relationship.bias', 'cls.seq_relationship.weight']\n", + "- This IS expected if you are initializing BertForMaskedLM from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n", + "- This IS NOT expected if you are initializing BertForMaskedLM from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n" + ] + } + ], + "source": [ + "mlm_model_ts = BertForMaskedLM.from_pretrained('bert-base-uncased', torchscript=True)\n", + "traced_mlm_model = torch.jit.trace(mlm_model_ts, [tokens_tensor, segments_tensor, attention_masks_tensor])" + ] + }, + { + "cell_type": "markdown", + "id": "d8d2217a", + "metadata": {}, + "source": [ + "Define 4 masked sentences, with 1 word in each sentence hidden from the model. Fluent English speakers will probably be able to guess the masked words, but just in case, they are `'capital'`, `'language'`, `'innings'`, and `'mathematics'`.\n", + "\n", + "Also create a list containing the position of the masked word within each sentence. Given Python's 0-based indexing convention, the numbers are each higher by 1 than might be expected. This is because the token at index 0 in each sentence is a beginning-of-sentence token, denoted `[CLS]` when entered explicitly. " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "4d1af982", + "metadata": {}, + "outputs": [], + "source": [ + "masked_sentences = ['Paris is the [MASK] of France.', \n", + " 'The primary [MASK] of the United States is English.', \n", + " 'A baseball game consists of at least nine [MASK].', \n", + " 'Topology is a branch of [MASK] concerned with the properties of geometric objects that remain unchanged under continuous transformations.']\n", + "pos_masks = [4, 3, 9, 6]" + ] + }, + { + "cell_type": "markdown", + "id": "4d89b4c8", + "metadata": {}, + "source": [ + "Pass the masked sentences into the (scripted) TorchScript MLM model and verify that the unmasked sentences yield the expected results. \n", + "\n", + "Because the sentences are of different lengths, we must specify the `padding` argument in calling our encoder/tokenizer. There are several possible padding strategies, but we'll use `'max_length'` padding with `max_length=128`. Later, when we compile an optimized version of the model with Torch-TensorRT, the optimized model will expect inputs of length 128, hence our choice of padding strategy and length here. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "d2d7546b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Paris is the capital of France.\n", + "The primary language of the United States is English.\n", + "A baseball game consists of at least nine innings.\n", + "Topology is a branch of mathematics concerned with the properties of geometric objects that remain unchanged under continuous transformations.\n" + ] + } + ], + "source": [ + "encoded_inputs = enc(masked_sentences, return_tensors='pt', padding='max_length', max_length=128)\n", + "outputs = mlm_model_ts(**encoded_inputs)\n", + "most_likely_token_ids = [torch.argmax(outputs[0][i, pos, :]) for i, pos in enumerate(pos_masks)]\n", + "unmasked_tokens = enc.decode(most_likely_token_ids).split(' ')\n", + "unmasked_sentences = [masked_sentences[i].replace('[MASK]', token) for i, token in enumerate(unmasked_tokens)]\n", + "for sentence in unmasked_sentences:\n", + " print(sentence)" + ] + }, + { + "cell_type": "markdown", + "id": "b0b423ff", + "metadata": {}, + "source": [ + "Pass the masked sentences into the traced MLM model and verify that the unmasked sentences yield the expected results. \n", + "\n", + "Note the difference in how the `encoded_inputs` are passed into the model in the following cell compared to the previous one. If you examine `encoded_inputs`, you'll find that it's a dictionary with 3 keys, `'input_ids'`, `'token_type_ids'`, and `'attention_mask'`, each with a PyTorch tensor as an associated value. The traced model will accept `**encoded_inputs` as an input, but the Torch-TensorRT-optimized model (to be defined later) will not. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "683a4a73", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Paris is the capital of France.\n", + "The primary language of the United States is English.\n", + "A baseball game consists of at least nine innings.\n", + "Topology is a branch of mathematics concerned with the properties of geometric objects that remain unchanged under continuous transformations.\n" + ] + } + ], + "source": [ + "encoded_inputs = enc(masked_sentences, return_tensors='pt', padding='max_length', max_length=128)\n", + "outputs = traced_mlm_model(encoded_inputs['input_ids'], encoded_inputs['token_type_ids'], encoded_inputs['attention_mask'])\n", + "most_likely_token_ids = [torch.argmax(outputs[0][i, pos, :]) for i, pos in enumerate(pos_masks)]\n", + "unmasked_tokens = enc.decode(most_likely_token_ids).split(' ')\n", + "unmasked_sentences = [masked_sentences[i].replace('[MASK]', token) for i, token in enumerate(unmasked_tokens)]\n", + "for sentence in unmasked_sentences:\n", + " print(sentence)" + ] + }, + { + "cell_type": "markdown", + "id": "7a31b545", + "metadata": {}, + "source": [ + "\n", + "## 4. Compiling with Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "id": "413d8b4f", + "metadata": {}, + "source": [ + "Change the logging level to avoid long printouts" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "42862893", + "metadata": {}, + "outputs": [], + "source": [ + "new_level = torch_tensorrt.logging.Level.Error\n", + "torch_tensorrt.logging.set_reportable_log_level(new_level)" + ] + }, + { + "cell_type": "markdown", + "id": "121d6d59", + "metadata": {}, + "source": [ + "Compile the model" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "eab90150", + "metadata": {}, + "outputs": [], + "source": [ + "trt_model = torch_tensorrt.compile(traced_mlm_model, \n", + " inputs= [torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32), # input_ids\n", + " torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32), # token_type_ids\n", + " torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32)], # attention_mask\n", + " enabled_precisions= {torch.float32}, # Run with 32-bit precision\n", + " workspace_size=2000000000,\n", + " truncate_long_and_double=True\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a96751ce", + "metadata": {}, + "source": [ + "Pass the masked sentences into the compiled model and verify that the unmasked sentences yield the expected results." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "097ea381", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Paris is the capital of France.\n", + "The primary language of the United States is English.\n", + "A baseball game consists of at least nine innings.\n", + "Topology is a branch of mathematics concerned with the properties of geometric objects that remain unchanged under continuous transformations.\n" + ] + } + ], + "source": [ + "enc_inputs = enc(masked_sentences, return_tensors='pt', padding='max_length', max_length=128)\n", + "enc_inputs = {k: v.type(torch.int32).cuda() for k, v in enc_inputs.items()}\n", + "output_trt = trt_model(enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "most_likely_token_ids_trt = [torch.argmax(output_trt[i, pos, :]) for i, pos in enumerate(pos_masks)] \n", + "unmasked_tokens_trt = enc.decode(most_likely_token_ids_trt).split(' ')\n", + "unmasked_sentences_trt = [masked_sentences[i].replace('[MASK]', token) for i, token in enumerate(unmasked_tokens_trt)]\n", + "for sentence in unmasked_sentences_trt:\n", + " print(sentence)" + ] + }, + { + "cell_type": "markdown", + "id": "a398271d", + "metadata": {}, + "source": [ + "Compile the model again, this time with 16-bit precision" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "a063dee2", + "metadata": {}, + "outputs": [], + "source": [ + "trt_model_fp16 = torch_tensorrt.compile(traced_mlm_model, \n", + " inputs= [torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32), # input_ids\n", + " torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32), # token_type_ids\n", + " torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32)], # attention_mask\n", + " enabled_precisions= {torch.half}, # Run with 16-bit precision\n", + " workspace_size=2000000000,\n", + " truncate_long_and_double=True\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a926334a", + "metadata": {}, + "source": [ + "\n", + "## 5. Benchmarking\n", + "\n", + "In developing this notebook, we conducted our benchmarking on a single NVIDIA A100 GPU. Your results may differ from those shown, particularly on a different GPU." + ] + }, + { + "cell_type": "markdown", + "id": "976c6fb9", + "metadata": {}, + "source": [ + "This function passes the inputs into the model and runs inference `num_loops` times, then returns a list of length containing the amount of time in seconds that each instance of inference took." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "b72a091e", + "metadata": {}, + "outputs": [], + "source": [ + "def timeGraph(model, input_tensor1, input_tensor2, input_tensor3, num_loops=50):\n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(20):\n", + " features = model(input_tensor1, input_tensor2, input_tensor3)\n", + "\n", + " torch.cuda.synchronize()\n", + "\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(num_loops):\n", + " start_time = timeit.default_timer()\n", + " features = model(input_tensor1, input_tensor2, input_tensor3)\n", + " torch.cuda.synchronize()\n", + " end_time = timeit.default_timer()\n", + " timings.append(end_time - start_time)\n", + " # print(\"Iteration {}: {:.6f} s\".format(i, end_time - start_time))\n", + "\n", + " return timings" + ] + }, + { + "cell_type": "markdown", + "id": "0b44dcf8", + "metadata": {}, + "source": [ + "This function prints the number of input batches the model is able to process each second and summary statistics of the model's latency." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "2ef71ab7", + "metadata": {}, + "outputs": [], + "source": [ + "def printStats(graphName, timings, batch_size):\n", + " times = np.array(timings)\n", + " steps = len(times)\n", + " speeds = batch_size / times\n", + " time_mean = np.mean(times)\n", + " time_med = np.median(times)\n", + " time_99th = np.percentile(times, 99)\n", + " time_std = np.std(times, ddof=0)\n", + " speed_mean = np.mean(speeds)\n", + " speed_med = np.median(speeds)\n", + "\n", + " msg = (\"\\n%s =================================\\n\"\n", + " \"batch size=%d, num iterations=%d\\n\"\n", + " \" Median text batches/second: %.1f, mean: %.1f\\n\"\n", + " \" Median latency: %.6f, mean: %.6f, 99th_p: %.6f, std_dev: %.6f\\n\"\n", + " ) % (graphName,\n", + " batch_size, steps,\n", + " speed_med, speed_mean,\n", + " time_med, time_mean, time_99th, time_std)\n", + " print(msg)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "afe97b9b", + "metadata": {}, + "outputs": [], + "source": [ + "cudnn.benchmark = True" + ] + }, + { + "cell_type": "markdown", + "id": "eba98b24", + "metadata": {}, + "source": [ + "Benchmark the (scripted) TorchScript model on GPU" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "bab5fa8f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "\n", + "BERT =================================\n", + "batch size=4, num iterations=50\n", + " Median text batches/second: 599.1, mean: 597.6\n", + " Median latency: 0.006677, mean: 0.006693, 99th_p: 0.006943, std_dev: 0.000059\n", + "\n" + ] + } + ], + "source": [ + "timings = timeGraph(mlm_model_ts.cuda(), enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "\n", + "printStats(\"BERT\", timings, batch_size)" + ] + }, + { + "cell_type": "markdown", + "id": "bc79c452", + "metadata": {}, + "source": [ + "Benchmark the traced model on GPU" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "5c0bd8e9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "\n", + "BERT =================================\n", + "batch size=4, num iterations=50\n", + " Median text batches/second: 951.2, mean: 951.0\n", + " Median latency: 0.004205, mean: 0.004206, 99th_p: 0.004256, std_dev: 0.000015\n", + "\n" + ] + } + ], + "source": [ + "timings = timeGraph(traced_mlm_model.cuda(), enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "\n", + "printStats(\"BERT\", timings, batch_size)" + ] + }, + { + "cell_type": "markdown", + "id": "41db22a1", + "metadata": {}, + "source": [ + "Benchmark the compiled FP32 model on GPU" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "ade7b508", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "\n", + "BERT =================================\n", + "batch size=4, num iterations=50\n", + " Median text batches/second: 1216.9, mean: 1216.4\n", + " Median latency: 0.003287, mean: 0.003289, 99th_p: 0.003317, std_dev: 0.000007\n", + "\n" + ] + } + ], + "source": [ + "timings = timeGraph(trt_model, enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "\n", + "printStats(\"BERT\", timings, batch_size)" + ] + }, + { + "cell_type": "markdown", + "id": "57b696de", + "metadata": {}, + "source": [ + "Benchmark the compiled FP16 model on GPU" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "f61b83fd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "\n", + "BERT =================================\n", + "batch size=4, num iterations=50\n", + " Median text batches/second: 1776.7, mean: 1771.1\n", + " Median latency: 0.002251, mean: 0.002259, 99th_p: 0.002305, std_dev: 0.000015\n", + "\n" + ] + } + ], + "source": [ + "timings = timeGraph(trt_model_fp16, enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "\n", + "printStats(\"BERT\", timings, batch_size)" + ] + }, + { + "cell_type": "markdown", + "id": "43f67ba3", + "metadata": {}, + "source": [ + "\n", + "## 6. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT for Masked Language Modeling with Hugging Face's `bert-base-uncased` transformer and testing the performance impact of the optimization. With Torch-TensorRT on an NVIDIA A100 GPU, we observe the speedups indicated below. These acceleration numbers will vary from GPU to GPU (as well as implementation to implementation based on the ops used) and we encorage you to try out latest generation of Data center compute cards for maximum acceleration.\n", + "\n", + "Scripted (GPU): 1.0x\n", + "Traced (GPU): 1.62x\n", + "Torch-TensorRT (FP32): 2.14x\n", + "Torch-TensorRT (FP16): 3.15x\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. If you run into any issues, you can fill them at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4ebd152d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/v1.2.0/_notebooks/Resnet50-example.html b/docs/v1.2.0/_notebooks/Resnet50-example.html new file mode 100644 index 0000000000..232a1e38d9 --- /dev/null +++ b/docs/v1.2.0/_notebooks/Resnet50-example.html @@ -0,0 +1,1674 @@ + + + + + + + + + + + + + Torch-TensorRT Getting Started - ResNet 50 — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Torch-TensorRT Getting Started - ResNet 50
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ + + +
+
[1]:
+
+
+
# Copyright 2019 NVIDIA Corporation. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
+
+

72eea9f56ee749e080dacfcd4ab2364a

+
+

Torch-TensorRT Getting Started - ResNet 50

+
+

Overview

+

In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the +best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch’s JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new +world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.

+

When deploying on NVIDIA GPUs TensorRT, NVIDIA’s Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA’s Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that +perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.

+

Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch.

+
+

Learning objectives

+

This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained ResNet-50 network, and running it to test the speedup obtained.

+
+
+
+

Content

+
    +
  1. Requirements

  2. +
  3. ResNet-50 Overview

  4. +
  5. Running the model without optimizations

  6. +
  7. Accelerating with Torch-TensorRT

  8. +
  9. Conclusion

  10. +
+
+
[2]:
+
+
+
!nvidia-smi
+!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org
+
+
+
+
+
+
+
+
+Tue Feb  8 19:16:53 2022
++-----------------------------------------------------------------------------+
+| NVIDIA-SMI 510.39.01    Driver Version: 510.39.01    CUDA Version: 11.6     |
+|-------------------------------+----------------------+----------------------+
+| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
+| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
+|                               |                      |               MIG M. |
+|===============================+======================+======================|
+|   0  NVIDIA GeForce ...  On   | 00000000:65:00.0 Off |                  N/A |
+| 30%   29C    P8    15W / 350W |      0MiB / 24576MiB |      0%      Default |
+|                               |                      |                  N/A |
++-------------------------------+----------------------+----------------------+
+
++-----------------------------------------------------------------------------+
+| Processes:                                                                  |
+|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
+|        ID   ID                                                   Usage      |
+|=============================================================================|
+|  No running processes found                                                 |
++-----------------------------------------------------------------------------+
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Collecting ipywidgets
+  Downloading ipywidgets-7.6.5-py2.py3-none-any.whl (121 kB)
+     |████████████████████████████████| 121 kB 5.3 MB/s eta 0:00:01
+Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)
+Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.7.0)
+Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.3)
+Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (7.31.0)
+Collecting jupyterlab-widgets>=1.0.0
+  Downloading jupyterlab_widgets-1.0.2-py3-none-any.whl (243 kB)
+     |████████████████████████████████| 243 kB 2.6 MB/s eta 0:00:01
+Collecting widgetsnbextension~=3.5.0
+  Downloading widgetsnbextension-3.5.2-py2.py3-none-any.whl (1.6 MB)
+     |████████████████████████████████| 1.6 MB 3.5 MB/s eta 0:00:01
+Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)
+Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.1.2)
+Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)
+Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.4)
+Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.1)
+Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)
+Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)
+Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)
+Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)
+Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.0)
+Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.24)
+Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)
+Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)
+Requirement already satisfied: pygments in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.1)
+Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)
+Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (0.3)
+Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (22.3.0)
+Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (2.8.2)
+Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (4.9.1)
+Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)
+Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.4.0)
+Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (5.4.0)
+Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.18.1)
+Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.7.0)
+Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)
+Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)
+Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (1.16.0)
+Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.5.0->ipywidgets) (6.4.1)
+Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.8.0)
+Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.3)
+Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3.0)
+Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.13.0)
+Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.12.1)
+Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (6.4.0)
+Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.2.0)
+Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.15.0)
+Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.21)
+Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.0.1)
+Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.1.2)
+Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.7.1)
+Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (4.1.0)
+Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.10)
+Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.0)
+Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.5.0)
+Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.8.4)
+Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3)
+Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.1)
+Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.6)
+Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets
+Successfully installed ipywidgets-7.6.5 jupyterlab-widgets-1.0.2 widgetsnbextension-3.5.2
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+
+
+

## 1. Requirements

+

NVIDIA’s NGC provides PyTorch Docker Container which contains PyTorch and Torch-TensorRT. We can make use of latest pytorch container to run this notebook.

+

Otherwise, you can follow the steps in notebooks/README to prepare a Docker container yourself, within which you can run this demo notebook.

+

## 2. ResNet-50 Overview

+

PyTorch has a model repository called the PyTorch Hub, which is a source for high quality implementations of common models. We can get our ResNet-50 model from there pretrained on ImageNet.

+
+

Model Description

+

This ResNet-50 model is based on the Deep Residual Learning for Image Recognition paper, which describes ResNet as “a method for detecting objects in images using a single deep neural network”. The input size is fixed to 32x32.

+

alt

+

## 3. Running the model without optimizations

+

PyTorch has a model repository called timm, which is a source for high quality implementations of computer vision models. We can get our EfficientNet model from there pretrained on ImageNet.

+
+
[3]:
+
+
+
import torch
+import torchvision
+
+torch.hub._validate_not_a_forked_repo=lambda a,b,c: True
+
+resnet50_model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)
+resnet50_model.eval()
+
+
+
+
+
+
+
+
+Downloading: "https://github.com/pytorch/vision/archive/v0.10.0.zip" to /root/.cache/torch/hub/v0.10.0.zip
+Downloading: "https://download.pytorch.org/models/resnet50-0676ba61.pth" to /root/.cache/torch/hub/checkpoints/resnet50-0676ba61.pth
+
+
+
+
+
+
+
+
+
+
[3]:
+
+
+
+
+ResNet(
+  (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
+  (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+  (relu): ReLU(inplace=True)
+  (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
+  (layer1): Sequential(
+    (0): Bottleneck(
+      (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+      (downsample): Sequential(
+        (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      )
+    )
+    (1): Bottleneck(
+      (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (2): Bottleneck(
+      (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+  )
+  (layer2): Sequential(
+    (0): Bottleneck(
+      (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+      (downsample): Sequential(
+        (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)
+        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      )
+    )
+    (1): Bottleneck(
+      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (2): Bottleneck(
+      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (3): Bottleneck(
+      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+  )
+  (layer3): Sequential(
+    (0): Bottleneck(
+      (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+      (downsample): Sequential(
+        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)
+        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      )
+    )
+    (1): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (2): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (3): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (4): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (5): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+  )
+  (layer4): Sequential(
+    (0): Bottleneck(
+      (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+      (downsample): Sequential(
+        (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)
+        (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      )
+    )
+    (1): Bottleneck(
+      (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (2): Bottleneck(
+      (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+  )
+  (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))
+  (fc): Linear(in_features=2048, out_features=1000, bias=True)
+)
+
+
+

With our model loaded, let’s proceed to downloading some images!

+
+
[4]:
+
+
+
!mkdir -p ./data
+!wget  -O ./data/img0.JPG "https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630"
+!wget  -O ./data/img1.JPG "https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg"
+!wget  -O ./data/img2.JPG "https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg"
+!wget  -O ./data/img3.JPG "https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg"
+
+!wget  -O ./data/imagenet_class_index.json "https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json"
+
+
+
+
+
+
+
+
+--2022-02-08 19:17:19--  https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630
+Resolving d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)... 18.65.227.99, 18.65.227.37, 18.65.227.223, ...
+Connecting to d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)|18.65.227.99|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 24112 (24K) [image/jpeg]
+Saving to: ‘./data/img0.JPG’
+
+./data/img0.JPG     100%[===================>]  23.55K  --.-KB/s    in 0.002s
+
+2022-02-08 19:17:19 (14.6 MB/s) - ‘./data/img0.JPG’ saved [24112/24112]
+
+--2022-02-08 19:17:19--  https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg
+Resolving www.hakaimagazine.com (www.hakaimagazine.com)... 164.92.73.117
+Connecting to www.hakaimagazine.com (www.hakaimagazine.com)|164.92.73.117|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 452718 (442K) [image/jpeg]
+Saving to: ‘./data/img1.JPG’
+
+./data/img1.JPG     100%[===================>] 442.11K  2.40MB/s    in 0.2s
+
+2022-02-08 19:17:19 (2.40 MB/s) - ‘./data/img1.JPG’ saved [452718/452718]
+
+--2022-02-08 19:17:20--  https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg
+Resolving www.artis.nl (www.artis.nl)... 94.75.225.20
+Connecting to www.artis.nl (www.artis.nl)|94.75.225.20|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 361413 (353K) [image/jpeg]
+Saving to: ‘./data/img2.JPG’
+
+./data/img2.JPG     100%[===================>] 352.94K   366KB/s    in 1.0s
+
+2022-02-08 19:17:24 (366 KB/s) - ‘./data/img2.JPG’ saved [361413/361413]
+
+--2022-02-08 19:17:24--  https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg
+Resolving www.familyhandyman.com (www.familyhandyman.com)... 104.18.201.107, 104.18.202.107, 2606:4700::6812:ca6b, ...
+Connecting to www.familyhandyman.com (www.familyhandyman.com)|104.18.201.107|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 94328 (92K) [image/jpeg]
+Saving to: ‘./data/img3.JPG’
+
+./data/img3.JPG     100%[===================>]  92.12K  --.-KB/s    in 0.005s
+
+2022-02-08 19:17:25 (16.8 MB/s) - ‘./data/img3.JPG’ saved [94328/94328]
+
+--2022-02-08 19:17:25--  https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json
+Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.217.41.222
+Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.217.41.222|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 35363 (35K) [application/octet-stream]
+Saving to: ‘./data/imagenet_class_index.json’
+
+./data/imagenet_cla 100%[===================>]  34.53K  --.-KB/s    in 0.07s
+
+2022-02-08 19:17:26 (481 KB/s) - ‘./data/imagenet_class_index.json’ saved [35363/35363]
+
+
+
+

All pre-trained models expect input images normalized in the same way, i.e. mini-batches of 3-channel RGB images of shape (3 x H x W), where H and W are expected to be at least 224. The images have to be loaded in to a range of [0, 1] and then normalized using mean = [0.485, 0.456, 0.406] and std = [0.229, 0.224, 0.225].

+

Here’s a sample execution.

+
+
[5]:
+
+
+
from PIL import Image
+from torchvision import transforms
+import matplotlib.pyplot as plt
+import json
+
+fig, axes = plt.subplots(nrows=2, ncols=2)
+
+for i in range(4):
+    img_path = './data/img%d.JPG'%i
+    img = Image.open(img_path)
+    preprocess = transforms.Compose([
+        transforms.Resize(256),
+        transforms.CenterCrop(224),
+        transforms.ToTensor(),
+        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
+    ])
+    input_tensor = preprocess(img)
+    plt.subplot(2,2,i+1)
+    plt.imshow(img)
+    plt.axis('off')
+
+# loading labels
+with open("./data/imagenet_class_index.json") as json_file:
+    d = json.load(json_file)
+
+
+
+
+
+
+
+../_images/_notebooks_Resnet50-example_12_0.png +
+
+

Throughout this tutorial, we will be making use of some utility functions; rn50_preprocess for preprocessing input images, predict to use the model for prediction and benchmark to benchmark the inference. You do not need to understand/go through these utilities to make use of Torch TensorRT, but are welecomed to do so if you choose.

+
+
[6]:
+
+
+
import numpy as np
+import time
+import torch.backends.cudnn as cudnn
+cudnn.benchmark = True
+
+def rn50_preprocess():
+    preprocess = transforms.Compose([
+        transforms.Resize(256),
+        transforms.CenterCrop(224),
+        transforms.ToTensor(),
+        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
+    ])
+    return preprocess
+
+# decode the results into ([predicted class, description], probability)
+def predict(img_path, model):
+    img = Image.open(img_path)
+    preprocess = rn50_preprocess()
+    input_tensor = preprocess(img)
+    input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model
+
+    # move the input and model to GPU for speed if available
+    if torch.cuda.is_available():
+        input_batch = input_batch.to('cuda')
+        model.to('cuda')
+
+    with torch.no_grad():
+        output = model(input_batch)
+        # Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes
+        sm_output = torch.nn.functional.softmax(output[0], dim=0)
+
+    ind = torch.argmax(sm_output)
+    return d[str(ind.item())], sm_output[ind] #([predicted class, description], probability)
+
+def benchmark(model, input_shape=(1024, 1, 224, 224), dtype='fp32', nwarmup=50, nruns=10000):
+    input_data = torch.randn(input_shape)
+    input_data = input_data.to("cuda")
+    if dtype=='fp16':
+        input_data = input_data.half()
+
+    print("Warm up ...")
+    with torch.no_grad():
+        for _ in range(nwarmup):
+            features = model(input_data)
+    torch.cuda.synchronize()
+    print("Start timing ...")
+    timings = []
+    with torch.no_grad():
+        for i in range(1, nruns+1):
+            start_time = time.time()
+            features = model(input_data)
+            torch.cuda.synchronize()
+            end_time = time.time()
+            timings.append(end_time - start_time)
+            if i%10==0:
+                print('Iteration %d/%d, ave batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))
+
+    print("Input shape:", input_data.size())
+    print("Output features size:", features.size())
+    print('Average batch time: %.2f ms'%(np.mean(timings)*1000))
+
+
+
+

With the model downloaded and the util functions written, let’s just quickly see some predictions, and benchmark the model in its current un-optimized state.

+
+
[7]:
+
+
+
for i in range(4):
+    img_path = './data/img%d.JPG'%i
+    img = Image.open(img_path)
+
+    pred, prob = predict(img_path, resnet50_model)
+    print('{} - Predicted: {}, Probablility: {}'.format(img_path, pred, prob))
+
+    plt.subplot(2,2,i+1)
+    plt.imshow(img);
+    plt.axis('off');
+    plt.title(pred[1])
+
+
+
+
+
+
+
+
+./data/img0.JPG - Predicted: ['n02110185', 'Siberian_husky'], Probablility: 0.49785590171813965
+./data/img1.JPG - Predicted: ['n01820546', 'lorikeet'], Probablility: 0.6445754766464233
+./data/img2.JPG - Predicted: ['n02481823', 'chimpanzee'], Probablility: 0.9899807572364807
+./data/img3.JPG - Predicted: ['n01749939', 'green_mamba'], Probablility: 0.39485082030296326
+
+
+
+
+
+
+../_images/_notebooks_Resnet50-example_16_1.png +
+
+
+
[8]:
+
+
+
# Model benchmark without Torch-TensorRT
+model = resnet50_model.eval().to("cuda")
+benchmark(model, input_shape=(128, 3, 224, 224), nruns=100)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, ave batch time 75.34 ms
+Iteration 20/100, ave batch time 75.33 ms
+Iteration 30/100, ave batch time 75.35 ms
+Iteration 40/100, ave batch time 75.37 ms
+Iteration 50/100, ave batch time 75.38 ms
+Iteration 60/100, ave batch time 75.38 ms
+Iteration 70/100, ave batch time 75.39 ms
+Iteration 80/100, ave batch time 75.39 ms
+Iteration 90/100, ave batch time 75.40 ms
+Iteration 100/100, ave batch time 75.41 ms
+Input shape: torch.Size([128, 3, 224, 224])
+Output features size: torch.Size([128, 1000])
+Average batch time: 75.41 ms
+
+
+

## 4. Accelerating with Torch-TensorRT

+

Onwards to the next step, accelerating with Torch TensorRT. In these examples we showcase the results for FP32 (single precision) and FP16 (half precision). We do not demonstrat specific tuning, just showcase the simplicity of usage. If you want to learn more about the possible customizations, visit our documentation.

+
+
+

FP32 (single precision)

+
+
[9]:
+
+
+
import torch_tensorrt
+
+# The compiled module will have precision as specified by "op_precision".
+# Here, it will have FP32 precision.
+trt_model_fp32 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.float32)],
+    enabled_precisions = torch.float32, # Run with FP32
+    workspace_size = 1 << 22
+)
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+
+
+
+
[10]:
+
+
+
# Obtain the average time taken by a batch of input
+benchmark(trt_model_fp32, input_shape=(128, 3, 224, 224), nruns=100)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, ave batch time 41.02 ms
+Iteration 20/100, ave batch time 41.12 ms
+Iteration 30/100, ave batch time 41.22 ms
+Iteration 40/100, ave batch time 41.14 ms
+Iteration 50/100, ave batch time 41.20 ms
+Iteration 60/100, ave batch time 41.20 ms
+Iteration 70/100, ave batch time 41.19 ms
+Iteration 80/100, ave batch time 41.23 ms
+Iteration 90/100, ave batch time 41.20 ms
+Iteration 100/100, ave batch time 41.21 ms
+Input shape: torch.Size([128, 3, 224, 224])
+Output features size: torch.Size([128, 1000])
+Average batch time: 41.21 ms
+
+
+
+
+

FP16 (half precision)

+
+
[11]:
+
+
+
import torch_tensorrt
+
+# The compiled module will have precision as specified by "op_precision".
+# Here, it will have FP16 precision.
+trt_model_fp16 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.half)],
+    enabled_precisions = {torch.half}, # Run with FP32
+    workspace_size = 1 << 22
+)
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float
+The compiler is going to use the user setting Float16
+This conflict may cause an error at runtime due to partial compilation being enabled and therefore
+compatibility with PyTorch's data type convention is required.
+If you do indeed see errors at runtime either:
+- Remove the dtype spec for x.1
+- Disable partial compilation by setting require_full_compilation to True
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+
+
+
+
[13]:
+
+
+
# Obtain the average time taken by a batch of input
+benchmark(trt_model_fp16, input_shape=(128, 3, 224, 224), dtype='fp16', nruns=100)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, ave batch time 14.48 ms
+Iteration 20/100, ave batch time 14.58 ms
+Iteration 30/100, ave batch time 14.72 ms
+Iteration 40/100, ave batch time 14.73 ms
+Iteration 50/100, ave batch time 14.70 ms
+Iteration 60/100, ave batch time 14.79 ms
+Iteration 70/100, ave batch time 14.73 ms
+Iteration 80/100, ave batch time 14.69 ms
+Iteration 90/100, ave batch time 14.68 ms
+Iteration 100/100, ave batch time 14.69 ms
+Input shape: torch.Size([128, 3, 224, 224])
+Output features size: torch.Size([128, 1000])
+Average batch time: 14.69 ms
+
+
+

## 5. Conclusion

+

In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT for EfficientNet-B0 model and test the performance impact of the optimization. With Torch-TensorRT, we observe a speedup of 1.84x with FP32, and 5.2x with FP16 on an NVIDIA 3090 GPU. These acceleration numbers will vary from GPU to GPU(as well as implementation to implementation based on the ops used) and we encorage you to try out latest generation of Data center compute +cards for maximum acceleration.

+
+
+

What’s next

+

Now it’s time to try Torch-TensorRT on your own model. If you run into any issues, you can fill them at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.

+
+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_notebooks/Resnet50-example.ipynb b/docs/v1.2.0/_notebooks/Resnet50-example.ipynb new file mode 100644 index 0000000000..f020662c73 --- /dev/null +++ b/docs/v1.2.0/_notebooks/Resnet50-example.ipynb @@ -0,0 +1,925 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Torch-TensorRT Getting Started - ResNet 50" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch's JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.\n", + "\n", + "When deploying on NVIDIA GPUs TensorRT, NVIDIA's Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA's Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.\n", + "\n", + "Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained ResNet-50 network, and running it to test the speedup obtained.\n", + "\n", + "## Content\n", + "1. [Requirements](#1)\n", + "1. [ResNet-50 Overview](#2)\n", + "1. [Running the model without optimizations](#3)\n", + "1. [Accelerating with Torch-TensorRT](#4)\n", + "1. [Conclusion](#5)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tue Feb 8 19:16:53 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 510.39.01 Driver Version: 510.39.01 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA GeForce ... On | 00000000:65:00.0 Off | N/A |\n", + "| 30% 29C P8 15W / 350W | 0MiB / 24576MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting ipywidgets\n", + " Downloading ipywidgets-7.6.5-py2.py3-none-any.whl (121 kB)\n", + "\u001b[K |████████████████████████████████| 121 kB 5.3 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)\n", + "Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.7.0)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.3)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (7.31.0)\n", + "Collecting jupyterlab-widgets>=1.0.0\n", + " Downloading jupyterlab_widgets-1.0.2-py3-none-any.whl (243 kB)\n", + "\u001b[K |████████████████████████████████| 243 kB 2.6 MB/s eta 0:00:01\n", + "\u001b[?25hCollecting widgetsnbextension~=3.5.0\n", + " Downloading widgetsnbextension-3.5.2-py2.py3-none-any.whl (1.6 MB)\n", + "\u001b[K |████████████████████████████████| 1.6 MB 3.5 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)\n", + "Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.1.2)\n", + "Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)\n", + "Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.4)\n", + "Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.1)\n", + "Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)\n", + "Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.0)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.24)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)\n", + "Requirement already satisfied: pygments in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.1)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (0.3)\n", + "Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (22.3.0)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (2.8.2)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (4.9.1)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)\n", + "Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.4.0)\n", + "Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (5.4.0)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.7.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (1.16.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.5.0->ipywidgets) (6.4.1)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.8.0)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.3)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3.0)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.13.0)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.12.1)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (6.4.0)\n", + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.21)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.0.1)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.1.2)\n", + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.7.1)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (4.1.0)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.10)\n", + "Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.0)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.5.0)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.8.4)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.1)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.6)\n", + "Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets\n", + "Successfully installed ipywidgets-7.6.5 jupyterlab-widgets-1.0.2 widgetsnbextension-3.5.2\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "!nvidia-smi\n", + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "NVIDIA's NGC provides PyTorch Docker Container which contains PyTorch and Torch-TensorRT. We can make use of [latest pytorch](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch) container to run this notebook.\n", + "\n", + "Otherwise, you can follow the steps in `notebooks/README` to prepare a Docker container yourself, within which you can run this demo notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 2. ResNet-50 Overview\n", + "\n", + "\n", + "PyTorch has a model repository called the PyTorch Hub, which is a source for high quality implementations of common models. We can get our ResNet-50 model from there pretrained on ImageNet.\n", + "\n", + "### Model Description\n", + "\n", + "This ResNet-50 model is based on the [Deep Residual Learning for Image Recognition](https://arxiv.org/pdf/1512.03385.pdf) paper, which describes ResNet as “a method for detecting objects in images using a single deep neural network\". The input size is fixed to 32x32.\n", + "\n", + "\"alt\"\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 3. Running the model without optimizations\n", + "\n", + "\n", + "PyTorch has a model repository called `timm`, which is a source for high quality implementations of computer vision models. We can get our EfficientNet model from there pretrained on ImageNet." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Downloading: \"https://github.com/pytorch/vision/archive/v0.10.0.zip\" to /root/.cache/torch/hub/v0.10.0.zip\n", + "Downloading: \"https://download.pytorch.org/models/resnet50-0676ba61.pth\" to /root/.cache/torch/hub/checkpoints/resnet50-0676ba61.pth\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a7036a6122874340b14aaef7b8319260", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0.00/97.8M [00:00] 23.55K --.-KB/s in 0.002s \n", + "\n", + "2022-02-08 19:17:19 (14.6 MB/s) - ‘./data/img0.JPG’ saved [24112/24112]\n", + "\n", + "--2022-02-08 19:17:19-- https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\n", + "Resolving www.hakaimagazine.com (www.hakaimagazine.com)... 164.92.73.117\n", + "Connecting to www.hakaimagazine.com (www.hakaimagazine.com)|164.92.73.117|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 452718 (442K) [image/jpeg]\n", + "Saving to: ‘./data/img1.JPG’\n", + "\n", + "./data/img1.JPG 100%[===================>] 442.11K 2.40MB/s in 0.2s \n", + "\n", + "2022-02-08 19:17:19 (2.40 MB/s) - ‘./data/img1.JPG’ saved [452718/452718]\n", + "\n", + "--2022-02-08 19:17:20-- https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\n", + "Resolving www.artis.nl (www.artis.nl)... 94.75.225.20\n", + "Connecting to www.artis.nl (www.artis.nl)|94.75.225.20|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 361413 (353K) [image/jpeg]\n", + "Saving to: ‘./data/img2.JPG’\n", + "\n", + "./data/img2.JPG 100%[===================>] 352.94K 366KB/s in 1.0s \n", + "\n", + "2022-02-08 19:17:24 (366 KB/s) - ‘./data/img2.JPG’ saved [361413/361413]\n", + "\n", + "--2022-02-08 19:17:24-- https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\n", + "Resolving www.familyhandyman.com (www.familyhandyman.com)... 104.18.201.107, 104.18.202.107, 2606:4700::6812:ca6b, ...\n", + "Connecting to www.familyhandyman.com (www.familyhandyman.com)|104.18.201.107|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 94328 (92K) [image/jpeg]\n", + "Saving to: ‘./data/img3.JPG’\n", + "\n", + "./data/img3.JPG 100%[===================>] 92.12K --.-KB/s in 0.005s \n", + "\n", + "2022-02-08 19:17:25 (16.8 MB/s) - ‘./data/img3.JPG’ saved [94328/94328]\n", + "\n", + "--2022-02-08 19:17:25-- https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\n", + "Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.217.41.222\n", + "Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.217.41.222|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 35363 (35K) [application/octet-stream]\n", + "Saving to: ‘./data/imagenet_class_index.json’\n", + "\n", + "./data/imagenet_cla 100%[===================>] 34.53K --.-KB/s in 0.07s \n", + "\n", + "2022-02-08 19:17:26 (481 KB/s) - ‘./data/imagenet_class_index.json’ saved [35363/35363]\n", + "\n" + ] + } + ], + "source": [ + "!mkdir -p ./data\n", + "!wget -O ./data/img0.JPG \"https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\"\n", + "!wget -O ./data/img1.JPG \"https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\"\n", + "!wget -O ./data/img2.JPG \"https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\"\n", + "!wget -O ./data/img3.JPG \"https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\"\n", + "\n", + "!wget -O ./data/imagenet_class_index.json \"https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All pre-trained models expect input images normalized in the same way,\n", + "i.e. mini-batches of 3-channel RGB images of shape `(3 x H x W)`, where `H` and `W` are expected to be at least `224`.\n", + "The images have to be loaded in to a range of `[0, 1]` and then normalized using `mean = [0.485, 0.456, 0.406]`\n", + "and `std = [0.229, 0.224, 0.225]`.\n", + "\n", + "Here's a sample execution." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAADnCAYAAAC9roUQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOz9WbBnyX3fiX0y86z//e639qV3dLMbDRAEARIkRYmklhmt1ihmFKMJTThke+wXP9mPEw6Hww92+M12hB22R7akkWStExxRJEVxARcQaKDRDfRa3V171d3v/e//s2T6ITPPOf9bVY0GOQWhwpXdt+7/nv9Z8uTyze9vTWGM4Wl5Wp6Wp+Vp+dEU+R+6Ak/L0/K0PC3//1Segu7T8rQ8LU/Lj7A8Bd2n5Wl5Wp6WH2F5CrpPy9PytDwtP8LyFHSflqflaXlafoQleBw3/Ue/9x0znU6rv4UQCCEAkFKitUZrvXSNP0cIgTGm+mkeF1KAEEgpMRrKUlPqkqTVIQwiDCWBCkjTDkmSEAQBSoWEYYCUCikMKgAhQWDA3VcJgTEarZvPMygpCAT2Oimqei4V5/0hDCDw/9Rfu0MGKAFjTH3w9LkNTxL7HONubD8adyNjDKUBo0FrqnaSUoAAXRqKLKfIC/IiRwBhHCMAnRcs5nNmeUZh6j449VYPFlOf49ug2Ra/+OK5H3iLp+VpeVoeE+gqpQjD8FO/V0oBNWD44j83QdcfN8Ie11ojkCgpLWgqRRCGSBkQhiFJkhCGIUHgwFYKpIRQCZQEhFkCciGgLEEpgUA4AAPpQFSIh4BtXWFbXwesmAe+cmAqHkA2+37V2QhRYfgPLELYZ1ZtYwzGgEBgtAFtMGVJvsjQWmO0QUpJkedkRc5ndRX05/l2afaPf7aUTwWmp+Vp+azlsYDup03CJnj9oIl/ekKbJjNzQIMQSCEJVIAKII5iwjAkDEOUUkhpma1yPxZAqY7be4HxnwGJsUy4OmKx1Ne8+c0Db9AAVrP054N/2XfydfAg9pCbPKJtxKkTtLb11kWBLgqKPMeUJQLIFwvHkA2l0RjLmx91+8brCLdeiAcWR98/j1yQnpan5Wl5oDwW0P20Sdhkr6dBVwgPdcKJ/tKCoxAWUIwBx4CRFsQCFSKEREmIVEAoA0IlCAOJklZNIISwrLUC3BpAhDAIrIrBCfC+NhaAHRiaZcz8k7SK1RRUaNsAPGEa4CdOPeYhDz3Vvl4qACiKEp3nFHlOWRTVe2oPuLqstRuNJ1QA2riv1h6cxUP7tMl8n5an5Wn5bOWxgK4vTd3tkm62obc9PWntdwKtNUEgkFK5c+x9jNEVwGhjCJRCBQqlJFJYlYOUElkBgkc6K48bLCOUjvVakdw44Flm6FJ4FcPD9K3u82doB/tOy+ca4eHVU92a9TZF9+r801KBAXOKpxpjKMuCvCgoygLdWKRKYyjQjbZgSePh1TRN2C0pl/qvWYenDPdpeVr+ZOWxgK4xhqIoKMuyPihqDndab2sNXsqCMPXkVkqhwggQ6LJAYDClrq4VWHYWqMCxYolU6gH1htcDG6RjuYBTIUhnnHuYoG1YZpFV3R3trXSqn6E9HqZaeOBh1QevODBL3zXroc2D97UqB7fYBJJSl+hCY7S2cCuWkX9pEWi0efUMrR8A26c63KflafnTlccCumVZMyRPqgBwzPa054LWusGcLJAIIQnChDhJLGBmgrIsKzZq0AilKt2mMJZ9KSkt8Ph7G1PBmKwYLU7VULNh4Rixv59GoI3n1/Zuyj74tHR/Slv7qGIqnvlgEY1/qR5gmlzWgDZWzeLPEXYZWmpHjcEIkFIRBIbCmIaXwiNq6bBYGAgCVfVRWcqqr5qeJHU1nzLdp+Vp+WHLYwHdxWIBOF2sqaFDCFlN3NPA64sxhrIoUUGEkMp5Hyi0NpiyqCz+xgiEssxWSIlwlrESgzAajEDoEuN0ul6fKyQIKZDSuoE5/F0yFgkck2TZJctIgRKmuqYygvGgqO/fv3ovGp5iS6d+CnA5FYIxouEe5u+9/IyyLCnLsmKlUghQyrJVbdnuw57kVRxCCGuAjEKEEBRFgWjohP2zTgPv04RJT8vT8sOVx6ZeiKLIivXGoB3TUlKhpHS6x3JZjdBwIVNOReANPF7fWKoQg0CXGik1KlDEcUwUxagwQgQBQgWgrOgvpEQ23MOktF4LUnl9rUGaUzyzYeAyBoy2jLcyvDklr1pyMDA/kOl6MP/hQcrqg/1lWludtpcMvH+uV8809eRe4vDqntN+z9UTnJQQhqHToXupQWGUNyQu65lPq4ielqflafls5bGAbhRFS8Yy7X578R9qZtYE1eYEDgJF064lhEAFgWXJUiOkIE5ikjgliiJUEKBU4AxqoJREKeu1UFnnhXb+twYlbDjeaRctI7AiurFgp42pDG/GWAC2J9ZsUzZUKPZ2Xj3QKJ8JmJbB23sOSAFa+LpodKkxUiOUtAuUECglEcLqxr0Bs6mPrQC/wej9F8JgdeHKLkz+FaQSKFSjQvVbnmbxT8vT8rR8tvJYQNcGJcgadB3b8seFEOR5vsSa/Plaa5QSKClRgSJwYByFIRJDKVywglTEcUIURQRBQBA0giACVbNaalbmAx6EcxUwS0aiWo9ag26DqRuJ0BYWtXR63IYjgGygZRM4PQh73fLpsmykqmvhrzVeL+EMZ0ZryjynMAYZBBCDEEHD7cu/q6wWNitFmCXgP81YpfP6qNUW1rXOGPHQ8wU2sEQ59c7T8rQ8LZ+tPFamCzwAuqd9dE8baPznIAwIg9Alh3B6YAEicOJ9YKPPLOhKhLQgIYXVu0oHztLpcYEldygjKtOZwyLjnBKcZ0IjxLaKghOBra92umHHkmt9rXDGtoe7wv0gtmuMdyV70DMBgNJ6b+iiJMsyZOBUAY1Fq3pWoy0rj4NHuHxVUX1B4BizB3B1KjS6qd819X2egu7T8rR85vKYQDekMi8ZMFpjjBX5eYSPblMdgRAWAKSf7KCNtsCKQEjp1Af1jw+i8EazKmeBaN7fA6WpwNZo736Fd9oFvI+xVS04TLZGOp+3oVoswEgwso4Qk04x/DA9r3nggzPCmeUYuKp+rlperaCLkrIo0E5fW6gA6dQMVSCEflAPK4UEYVU8QRCggtrzA+EkC6UqHXgQyMpwV7ebb8slv4qnoPu0PC0/RHksoBtHEeBZrsHoWqfrj4vAgbArVWCAQyslFcIYO8FNiTEFAu9aZnXDgRSVblY6OV9gMMKgjXUdQxvH3Grg0Mb+o52hrNTaBRLU76CNdvWuagiA0B59SusFIaTThVqPCA1IZAOkmuz2FAw7TwbtdMdGi4pB+hM8yy4LTVEUFEVOWdaqmSLPkLnCSwNC1MY2nEeCD5+2KhdVLVSV1IHXe1u3OF8H7aWB0yuF8OEkT275V//wf2eM86ypu965F/pX88edSsr2buNL0fB+qVf3uj2b96R+xnJwjaju3xwfVlKT1rf6tLFXehWZldgwBlElDLTvpCqfmtql0nv+2Mwl7r5esjMVFam8Zqxnu+9/gzEaUdld7J01ujlAcDMQV21KYT9rR3asK6YLVzcCIzTCWCnW3te9R3VP41Rc2jWixN/c9o12rVi3MEJiTOmO2xlpRF0n13sYNBLbHrbW1h6kAWGac8O2rhESYyRClBhj29DgRV4XuVnVQ/Cf/p3/+qGT5LGAbuJ8ay07q9ULS4YdKSqvBjgteRuEsFFltuttg3tx3npDqSVH/lpdge0fYY1flauYqCdJxSwN6BJKTWXsA88U68FVP6NpnLJ1FI49SmmQynWQsN/Vda4nV5M22gXFLky61JZZat8CNSu3oFtSZBlFntl7uJcrnWeCcEwVfD2s2G8XOoN0BjlfL9kMlFgykNW9UOWm8Kf4geje4Ul2WvCg0vxbOVCAxjjxYeDVUWt5FKeyojYNk6fFmcotDztxbZEIoavvhZCNZ9aTVxjriaOofcYrNZnwgGG7RjpwCyo9vKzBoaq6Vb9VeqyqBu4NRQ3Owgi0A+LaQ0dU49YIgTASY40dNcD793DjrhT2LiXYUH43tyyWC7TwwGqqt3ww66xw429Zgq0bXNg29co+IbF5/URlF6kXVgviDk5cF9t5oo0lTc0et5PC3lmK0rWJxIg6JsAsV+pTy2MB3W63S57n5HlOWdj0i17FUIGuEciGSN0cBAKQQiKEwghTuW0Zn1XMhQYbrTENg10TeCuvCCFcJrGmTtKL4TYNovUKsOJ66TJyQb3ye5WFcanE/IARnqE45i28igOv5qhZtmX1xgGxrDrTOMAty5KyMOR5WXke+Gu1saCrdYE0hjAIUFFs2aqLZ1YqsO2itGVJUjgvDjvoJMK6xwnf3DXAVkuLWWb2xtfRHa8Gr3FTw0snD9M//9gXywbLairWXAUa7WAcJFVzuwasaiGl2bD1YgmnLK5LwAUgbVrRZrWEd5Wsp71np4ADYYOsALEGfCEcIAvHUKkB11ajZnwCC3bCWKCyAKrdiRpjPBDTACZwPNDWo6q5wAhFrhUloJAYkxPI0r2DcZzQLWrGVNBaW4obg3EJSJut4445hlx1UtVYjVwhACj7t/BAX/e0BWVd9YVBV6CunSwAVpK1c90tKW4u2WcptwD5VnDk0MjlPj1VHhPTjQjDgKKIyLKMLMssk3NynE3NWFvG64Z2lRfN7FUGLQW6rNZiB2xW3EGXlLhwYyMr3axn1mUFQNaVodZ76hqsyxKtS4qisOqQJaZSG5K8R8Npg9XDXLHqHLcSqSAMVeVZUEXBVYBmo+3yLCcvCmx+Cft8T4wF1rgYRSFRFBKGyvoMa0VelMznGZgcbUqyPKPISqQ0pGlEmqbEkSKJrc4WA1pYw5qBJeCpNNPGDu7KWOiYggdfW0fLAPSnjbAf01KxOFPBYzUMmxoe4Wi+qEiBZ3MOeAVgvMTlEbcx9YVjVh6kXVvLCrAt4zVu8lcATy2s+qtk9Z2ygCgsYEo31qxYbNll9STPmo2VGCXSpUgF2WSOph4DVXy7O15DoHDc1aAFFCbiqFzh5nSLg6zL7jTGFAU5AlMuWA3nXGjtcnXliE4wsXcx7l2N58KeI5YYo7DqAsfw/bJSLXQWJP24q20LdiGqWsx4UKR+J/cU359+znq+YIyVUHUlJThpRjiOa04rgOp11p7XWDhOjaHT5TGldrRszmfz0lpTihJRmorF2Up7EaJemyrvBecGhnDidelyORhpI9WE10tp68olLAgbbUNlfd6HCvikRKgm0NVqD12WaBft5vV8otG8tVuXbHymOl+4OjYXbGtoUwihUNp6VjQnp6Go7uPbI4wC4iSs2sWraLznRxha7wIV2MEwGs5YLEqKogShybIZu7t7nJyMwQiOxxOuX7/BpfMXWMwzLl2+wHNXL3D2zCpBI+ihNJqd+4d8+P4dvvyVl4mTOheyF/s8u7dGvZpkaA1lc5I+IUVXv2u9pTe2AhYfHCJLBzKW+Qg3oUQ1MY3wZKvOkue1N7qah14NIByANyU752mDtDpad9ROXuNrCLhIw4oIWFblmbWXnvwdpFsofJ6SWs1Ro4K3HVdDd0mXWi9GtilMtUBMzAq/f/gy741XuDvWxHlGK4CFDhlnObNFgNY9ZouEvtjkz1055mcv3iKQmdO3esit2asFXlkx44ole91Is/41Bavu5QP9RQW4xq2D9lojrBrRNq+ujgl8NkGvTvBd4KNPhfssMFUOWE2lvffqleb68Clj7zGldqzHlAlsQnOtDYg6GMKeV4OvFPU6EoYhcRwThJ6+W/DJ85yicEpsd420o9WqCEpDWXWXLU3Vgym9jsf63lq/V+MGAdbvVEpnFLN8wetbS+fNQD1Mlt41UAKfdKcZKWajxaTLaaCqEa51rTfyi5O/Vko3eSux3tQBEMoGluzsnXByMmZl0KHXgsU8Yz6f0Y1Dzj93hcODY44P9nnpykU+/xMvcP/eHv/gH/1T1rY3+erPfpVz5y9wcjzk1s0bZJM5rXbCiy89Zxl0xdap3rduz6qX3QIHjbRGT1BpqqNqsdL3rJ9AiIaE5VieVzfJapLb+wkcSPr8IMKBpPHfO6G/mpS1gcYDr3Hn2TvIKrWo191CXR/pJngN9A0EtYf829TgX51i1Ql2Ia1DxJtwBqZSq1TAZSSjPOa7e2f46Djkjd0xk/GCJArIhCA0kAaGeWHQiykLJAeZ4v/+/bN8/6DLf/7y+3TisZ1bPhuJse/qua/9UVTSrH9v4xccp/4Q9rxKTYAGoXxzO5yulCwOzD1DXpY83IhoqCBtSzeoV9WgwgO8F2ywGGZtT8K90sPTHMDjYrqOwmvnfqSCkNCAyTIKk6NCa0EPfLivqFUJBlAqIAqtdwJCYpCUxgYDqDyn1Noa0qq0jxY8i0JDXtjMWl48lk48WjLaGevV4BmDlAShrCLaPJMwxqAL48JpS4qGasH7xtqQZQuI0nkE2Ny9jcnoFodaTeHusyTGOuAVGp8D2BoZLGsKjaEUhsPhjLff/oDeoMvWap9erDBlwTxfsNLrIGWPyWzG0eEeV7e3iOOQYjZjc32F2eiYj/Z32bt7g/XtCwwnCy5sDPilX/oFtrfWSdsxsXI8wy35VVBHk7YZO3l9Ap8nULuA548l1AY146L/PGd1beBZbKXXq0iCceKqcOBsZ6HnahWhdH3oOdpS1mIhlwJ4rL3XMVNTqyashrH2PrDMUDvw9X3m+WytEnAPcXDfUCG4PrZivHCU18Gem79erEYKSg3DMbx/Y4gINfPb/1+ufbckUy+RRc+QGU0ic/7j1WPmh9cZiBb/OvkiE5Fi4pDCwNfvdjmevMDf++I11tJjaNTTqj5qacpUTNLXt8Dzbss2/dvVemM3SKt+acJp1RJOv+u9EyRWzeQXqAqYG1faOsrq+xq863pYbbVTQzT0vA8rjyefrtd5gt21IRCATaQSRaFLx1i7LQnP7FyxAQ4QeLYsBMoISgGBFBXza65KGuNAU6GKgrKs+b43btE43z9HuCg25dmtA0rcL59CUbv0iODYraFWobgkOkJ4sdLU53kApmmPdfrhpWlRsyfRGADSlCAk2gju7w75/W99j6PDQ37xa1+k305QlGSFIVABMlAMj47o9Hq0woD/7p/9c175/E/wE194jVs3bnC4v4PWmps3PuTihT3+yt/6W2wMuuzcvclKP2VzY2D5RQNQpdeBY2VNYdyLOA8eIVw++SetGCgrJl9xUCt+VkzIZ7Rziymmag9bvJHFTvZKMBf2O0cRHYt1i3XFjH1j0niSHeP2o+e19diAhlZV+OtqEVk0dfDOYLakq62ehmNjnvNSM1rcNaaOANo/nHP91oSVwQoXzp3jmeef4923ND91519z7f63eO/wCkkwZVv1efvWTcTKJuNrb/ILv7zFv5hdRecCI9uYcs47xzH/xz/+HP/rL79NNx0tkaGa02q3GFAvCP4thDtTeAnFzTfpvRS84cx/V8No86hpqJIqG0t1RZPv++tqplsx7sYyVi1yolZcPao8noQ3+AlpmUNQiduhraDb6UG55AfSMwL/XtL73tYTWguX40A47zgv8hj7XekHnlDIQKJLoDHYfcPadvNigj2u3L1rxXj9HpZVgDGyamIvClbv2LimoSWp71Uxl0YbPaBpd9N86Vo7wbQRHAynfOt7H/DJjZv84s99kfV+i0hBnhVMpxNKbcjmGZ1Oizs3b/D7v/3bnAxPSDptPvroI373d7+OknB8uM/6+iYr6ytonfF7v/3bfPVnfprtzQ0SF9RSDXFHxn27aGz+Ya3rd5JN7HiCijHe79agwOlSDbXRzLsUiRqIHOOt12/j9LDGAZ7wNM0toJ5zagfc7rz6CO4RtrgETLKh0rBepjVvNR7o7QVOsG4a+qgZKjW7tezOM0k32YRXLQh3Zn2uERKzKNjfOebgOzd5KYoY//G3WRQFN3/5ddaSFf7nf+ev8uZ3f59/8eY+OyczevM9vnd4yMnN6zy72uZCdp/B4GVOTIo+mdmsd6Xg+gH8P751mf/qK+8TBXNniPXP1g1ANEugXAGiEbhQpWrB8N4UjqRX/r/VClPdX1RtUUkp1bf1zK+nca3YwX/y48DZbTBNBVuJ+QGbrD8W0HXOFLUVVRiUNBjp120Lhj42woJuk/WBf0GJndQSD7q2UaWsG0DjBqqyng6lEbXNqoGAsmFkEMJU10tjlkS8JdR09be90uCqov4tGoO45idmqZv98333amqf5SXNUcW+vJZLsD+a8403P+SjT67z/DPnWO0mhFJa391CM1/Mabd6tBPFdDFiOhnz9ltvs3NwTPpHbzBdTFhkMxbzGbOTE9rdDiJq89233iNE8Mxzz9BJ0woErDuZ03cDRrt+E3aBs4uRbUNZL/Gnh8GPdTGidDhqgcsYkEJXi7Ifvd66rZqGiqaCQDieKrT1k3XHMKYC8iVx1S/W7t96TIjGteDVU7Umt/JAdYu8/abE38/d3wm6Vh/afGGo7+a8AnTtBuUNQH5xkQjk927ypd/+Q9LhDpO9EbNWi/sXz5D31wnTguNbnxDv3uFXLvf51fc6DDnhb/9sm2k246eSl/mN6AqtMqMoSuRKyImJ0SdzQPKt4xV+9f2L/OWXriHcAqcr10PvpeAr7t/OL15Uf+NJkSNz/rhfOKlQyC5GfmadjlhtNBJeKl6SgYTEbqTogy7AWfCrFscjljl93+Xy2NQLHhwrNinrQQNOJ+o+e1CtW9MJFkIg61zo1deefTUh0hok7MFHuTCJpc81y6jDYRsVbF7UNEc2G9QfrthQ4zvn1F7driF7WtBqMIuG9V+4FbzQgsks52g44Y+/831OxjO2N1Z45tJ5umkLhHUzWywWSKlIWhGLxYw7O/f5nW98k/aZS3z+lZ8kL0qEFkQq5MzlZyi1JGn3EFGKiju0kgAZd20eh1Ov79vF92Xtp1tnjrPs7skLA66ZlLAM04GUz0rndbh2saknlMKzTx/Z5YDO+bU2xXtvaRG4nByNRc2ySVE9C6gNYUI29Mj22caYxrBzxxxhsAPx1CJvGsPZi8MVAfbA5sDKq7pcBwsjkGXJ5T/4Ptsne7Bxhdalgna6xuWXXuOTL/0FVJoSBQEj+X9g5/230eGXua6njI7us722zdvlBRYzRdgTbAUFkyBilmcsAg3YnB6/eus8l9I9XrmwTxDIpXrZKCHPQhts0+iqvRoiAl4hVi9wtd+txQvXh8avMP56L1M0Jq9YcrqryVjD39qCq4+OkwhRWJc3HLh/ikfPY1Mv+NVHGid+Czd5XZ09g/XFu8AADdHb0NBVL7GLJj+sVxlOnfiwmlWwv3SvT71WnPpw6hq/jtaAu4zc9qmGUtc313Lpyup2JZJZrvnk1j7f/u67HJ8cMhoPuXzpHC8+e4mNlT6htIEh3i1usLJClhd8cO0Ov/eH3ybTCWvblzg43McYw9aZs5w7v4ESgg+3z7C7u8/WhUvMZgXjecbb71znmQvbRPJUOz74KktCKFCFeD9pTFf4SeoHmABh6lgk6ZTXfuFpSkl1Kk/n+Wp8OKkbi84rYMnmIAwI6SZcrTaop7FlVxUvM1Tqs1IYAvd0r/sFGu3eEI4barBKleAlKj+vlvrUuWdVeOQWg9mU+RvfRj93gWQ0JV69xIIS8d3f4dv5jHxtjTSV3H3vGm/d7TINtyiSi9zVBXfDlF4kWC3HtOcjZkjCIqMddBGRZIGGMGVawj/9+DmeOTOjLcdWVPfAaFvtVK/Z961A2Ph280DtPROMa78G1zFeRmjey/2uhq9vH7/4+UPm1DUCKKsHCGGjQEtZQC5PXfNgeTzeCw1tlhFOrSCw+qyGka05WCReLyUqNlhBwAN46lvDuOd9+pQ3zbEmHnZmwz/TU4T6L2pezHLnPKpUz9AVC9I+isn4Hz+AoNAlo1HGZLrgxt0Drt24w5079zC6YD49YTDosrU2YKXXIpSG6WxGFEUUeUlmBLv39/nw2idc++QOWrWYTA6YjI4YnxwTt1IGgzY/9YWfYNDr0mm1uHV7l1e/+Brff+cTbly7SVYUVnVQBdrXDWCc5FAKnyNC1AwX56r3aabaH/NS81azNDZq4BUoUYOv734tHLM1tRjvPVNqX17HobzXQwWyPsTAVDNFiHocV6EVriuUqUd99cHU53ojYLUkOsJTTREBOMnEM3PrfVKDybKLk6Fstzhab9P75BbrnZiwyGCtw/Gzqwj5Eff/6Nc4GilOxori7F+mGyhanVWKg2PkYoGJEwoCBhR0VMFdo5kYQdJpoVHElCxkwN3FgH954zX+9nPfRFBU+mbjfYxrOYB69tcMFVFSq3sqKu/ucZoMlJUeV4hGG7nr6kXSyTHemGeWPRWsd4IfM/YZRSHQ4Qzd0USmS6vdeeSYezx+un5VrqJEqvo2xIQGUxUNVmAa14jlJqvIYSUa1Pf7VJ7lG7iuxtKnB5cAls6qr3z40x5Y2Kp+t4MhcDcxaEqsG1imYTpZcP/+AW++9SG/9wdvECcps3zC6mqf6fiYo4N9VgY9Ll/cJk0iyjyjUIpFWTAezjEaFmXBZDyi3+3wk59/hWuf3ORwb4fNrVXSJGBldZXXXnqRFy5eQCrJlcsX6Q/WeOnZi+zdO2HaP+Y/+jM/SSSN1YX7Nm+8jxfcjF8MRQ28Uj6ZEWkAtQvXsutQgKhE/+YU9+DmdZA+eKDEs19T6YcFzbFvyYQfZabycrGrsOPU1JKU9aJQDXWbtYPUaoamt0EFnS422/9XGZL8ABXUoCaM8+l3XjmNnB/oAmTA7H/2N/jk//QPCRYTWvs3uV0MuPM//Sucyec8e38PjOCa7PKv9vcZXfk8CQWTOGRqIlZGhygzZ8qMTCnuD55HLOZkSQfVCgnDmBRBnEhuzSO+f/AiL6++jbeo13PKq2Ga6pO6XeqoSerrPFAvhejWc9z3iahUMqK61p5lgbypVfQ2UqDhsiaWfHVV3kKUM8rBAYvkR8x0qSrvxCVTH2mu0t541XTT8sdxh/ylAirLrz1klu/5KexziTU/9ITaCdwhND53QiO2pbLmN6gNVO/hv/ecwTEhDCWCRV4ymWUcHg25v3PAt998l2984w12d/cIQ8WZs+dotyQhObt3btiQXZMxHh3R7SREgUTnBTPmHI9Hjj2XbK6scHZthXbaIlCKL/3EC5yMv0KUxBwcnRDGKWv9FmkEhYbFdM6gm7LWTXj9c8/xyz/zKqu9FG940afIgVkSE5rO46L6/qHCw4958Yu6Mk4ag8oDwfu72n61s0oKbIY5pxi149Ht6OHu6JmTdrkPcPeugdughSDAg7RAGEHwkPaT1SxoQIxb6Cr965KtwTNE/7fzzqjcm6yU6ff+owJo8D65puKVwiL4lUuM/+v/Ce/t7tE/uEt85x4agQpj4gsvcGH/+6xzxEfpIb+ZlwyFQAeKIrP67gPZIj35mHnnImb3DgUxuruFWECqIJYFl1qCQay4MbnC+fYO3ehexcz9u9kgEKdSEALMabVD1aNUYIhx0Xqmbrvm0laxOt8g9UK5TOiEbSxv0KieUYkQS3UQZQxHiozDh9TRlscHuk1XMD9BK4x0XStANEQv3wbNMbj0mmJZ1KgNa59OtcQjPlfPaOCIqJYue0/pY+epRR3LTHwYoeVI3h1HA9N5wfBkxp07uwyHM/aHE27fvcf+zn2OD4945+23yXRBb6VPf7XF8z/xKu12l+OjA1hMyRcLxsdDtjbWODo+5PBgj7NnN1mEAePplNwY9g+PGQy6rPa7tMOAQCkEgqQTsdpdozCag3s7/F//L3+fF154jv/i7/x1FouM+TRjY3ud8bhkdaXNhbM9axMwyy5tvlRBAK59jAEjhU3Us2Ruf8KKcOkPqwVbIKQLzmmM1yo/c20VroIWtMTlOqBmoHiJ0wKsdPexRi9HFkQd61RLFrJiXsKcHqX1SugBt9YanBKxhKH2irH/CpfCxYOF8AuNqVmxv2flu2ks4QhWumQrA3a5itAF2mik0GTnz9L91rcxa8/zRXGZ320PWOiQMAkx0xHz4Q5Z3EHGWwxFh0gawiQkHn9Mv9fi4uKIC+khz/Qm/MSZKaKn2Ly8x/gk5O6dmGzu2b1szG+32FAbvqyxWrt3sovmkq2oBh37S1iJrfKld0RpyUh/6lmIJg+ulybwWQfr1rbTJUAe9x859B6TeqGCxeplT0vfPjKkpr4NDwJ37ek8B7rBLE8/71N47EOLz5lgH91wdG5UQhiB0II6yto4v3HDdFGwyAuOT0YMTybki4yD/UO+8Udv8P1334coREtY294GIbhz/Rrjk2Nm8wX9wSorcczGmTNcuHIVESiEKZieHHB8cEC+mJPEIbdufEKrlXDvzm3OnjvDdDwhLwobDo0kmkQUhUZEXudo/QaNsS5Ozz17kT//Sz/L+x9+RF7YpEOXL55DCMn33/6Qr3zlBUJlV3Lv/1m1aUPdo0Q9SP3C8kM2949d8TpV5UJ5EbWaATwhcAoCu8pWoqxnh9I4DukmZWnqMV/fx+14ggUEm/VL1J4K1YB3umX/Z9OuIU5JHNVArXvMg4cXyZZhFwcgPgVjo1SLhXWLMqZ217JSm8H6nmogAKPRBibtGKEUwcH3eGF9wOv9lJuLiMOpQIspetBlPb3D1vAGl/qKi9036cfHtM9KyuhZtrbHdDbfI+1mtLua1dUOa501dJbz0su/wPvv9bj1SUlRONe5SsdLDZiNNJC1K55rj6V/ar9b0+jDiuw2BnPlqNBovVpOMY1VFddOzdasJeDiU+wcj43pLlXiITP0f8g523y/psX40072lmGvq8RY3WSel8zmGcfHY0bjKTfv7HJ4PCUvS3YPDsjyHK1hb+eQ6XjC7s59xuMjRif7CFMwPLzHbDokSrtcvvIs09EJW2cv0O90MeWM7bNbHA9HhJHg6tULbJzd5PatW9y5eYPdO3fZuXubOApZWVtlMZuiywXHRwccHuwTpy1OToZkWUa/v8Z8VvDGd9/hJz//OXrthEhaAUo7AEmTiF/+pa/xtZ//CnEcoNqSJI3RSJ45d4Zupxkw6iP3Ti2QDeOQMU7U43Rk+ZOKwC6KXtQqIRf1SvOdLBN1LdOQxKqJa/ySJSviXE1s47ODnbZviDqgAlONR+8dapYmtjvHLCsBvN62UoEZ6smwJA77qgsrmjsQP82SLeB6Ebt0l9ssw/b60o0Ug5Gwf2GVC5M5O5liOJkShAU/u/VvOXv133EmvcH2mRntRKAKQVHkbJ+FOBUU+R1UaEgSkJlBlFCOh5Sxoiwk6H/Jq69e5eqV13jrO13292yD2kVR1jkbGhBbLVHG92tD8qhaq+6TKljK81qvujHLGCIaY6EiZs72wSlS6IljKQy/ceM3+Nv8708POOAxgq5fKSs1gKlXG/8ila/tQ4GyQfkb1nLf6V4V01z5/Llg0FqQFSWT6ZwsK8izgvFoyiLLOTwckmtNWRSURcFsvmBv74jj4zH37+8xm8/4+MYtToYnpElAu9MlTlrIOKCVtmh12syzGWknoVumRC1odSIO9+7RXd2k21/h5HCHD9/+Fq1On9loH6MEvcEq1979Pv1+l97WOqtrKwhKpuMR4+GQxWyC1AXDoyFxFJKmKQd799lJYsaTKUGUsHPvHkeHR2xszTh78TL39/a59vF1nr1ykUE7AYnNqgbYPwyt2G6triT0WpHd+VeCMorS67xOtX1dlg04NWOozzkNUk9GcXkuKrA0VQCEDXZojM8lAG6YdGocxuuAG4IwIJyKob7eu9svnyUaF9bMuXnctrlu+Nkuj3xj/L4WHpRNdYY/x6VkqdQKdf3rz00gEdQ7Q/iautmFETC+8grXb2/xvwl/jlj8Jv/LL/43nDu/Q3cA2QwWC0ErhTgxXP9EMJkaytLQTSRJakhbIUWRkSjItWFv/4AkbaGyGeOTd+it3OMXf+m/4M3vTPjoPY02sjLO+7b0QRA+oaWXNHxmsqZm3AeSuBMeii8yEFWAWR1OfGrHkMYvMJwmtR+cvMcnh2/yqPKYma4tVf5ZTB1NI5anabVmNVcQt7r5UFzv36yNZ/gGb1DQQpAtcj75+DZvvPku337zHW7d2aEUEbnOGE6OMGXJxsYGV5+9SpykxHFEmc05ORpy9+5dDJrxaEi33+fln/wcaadNFARkWcF0MuVgb5f5+JiynKNNyXw+IoliiiBABCFnLz/DbDZFGrjw7Isc7N0nm08J45jB2irT6YxOq0XSSrn87BUClyvhcH+fxXQGBkIVMi8N0+EYISAKI452DzjcP+J4OGR/b4/h4TGLRUHcajPodxiOpuzuHSLMCv12anNWONFYCeGs4M7pXViHPmWkFXsbYqwXw2pxtKlPs5OtNjLgjfJPpCHNpgWVlU2hjkh06oHKfVdUJNczRB/x5flV7XPrPQtOQbWonNLqCD4HnhVxEO4vF1EjaWbdasiMxoFeddTULNwDrcbu29e8EMdshX+vBvj6laPmsdU1QKX/pfrWMsLjtZ/iHxytcSX6B/yNv/b/IewVTKaCIFCEWtPtAYUlQFsphErSGmjMrESMYToJWFuTzIdz0tBACMfjnNWeJBKa+cl9iuTXefWVLTqtS7z9XUlZBhWj9Ab4umZ1G1YkTVARNKt+W2a9tlE9WJcUayPktI0Yh7XKZmmhO10aKif391ayxtfOf/kh59ry2FI7Pqx+otFYgkerAioANjWzAn/PhvOHMeQlHI1m/PbvfoPf/q3f5xvf+CZFPmE2GwGaMGqztnWGsxevcOn5q1y+cp5OJ6bX6dFKUspswY1bt7nw3AXGozHHxyekrZTVtVU63TZCSO7euU9RZuzfu818OCZsJahQsZjNCMIQLRVnzp2nFIK1M2eQQlCanPPPP8N0PCIJJLc++ZjpyRFJkrJ9/iIXLpyjKAqOjw6598nHTCcTwjhhsL6OigJmkymT8ZgkSRgeHfPB997i0nPPkSYp42DE+PiI4fEJK/0+02wOUrB/eECZd1lZXbW7Rsg6YQ3Q2JHi1IpHk7k+qGKoT6p7qAKJJxFxgSp3hAdLb1PwASJeTPWGmQYrrLIfuDaTbmLKJYlXVOQCaESf2XO8sc3u5uDZricnNZQ0mWgzMste7rxuaBiYTelyF9QuYzXYmuWOXQJ/U4ezN76uzhGW9fphktPjH3/QYm/4r/nSa/+U6cJwMYJIGcbzElMKyhm0kpjjYUaSGIQWrG8p9ndKxkeQLWYY3SZqhZT3croJtFTG/o5ic73HYjbnqPwe/Y0Tzq3u0fmZV/nmNyIWWYRo5KCoMrk1GthK+35BopEAyPcPVd8Zp0s3CPKTjHn7Pt32ZYJJsrzaQUPqE1W/6NKGwwdRTJEXrAabbKxsPHLoPTZD2rJcVH/8THPUTwB3XSN4C78qC6BA8HtvXOM7737C7s5dovV1Xv/5r2G04WBvjygMSbst4jhga2ud3qDHfDpBUVIsFixaqc12FsDR3V1GowkgCRSgc4TOmU7mfHLtfSbjGUJqolaICgXT8TF7d+6Sdrt0eivMRiN0EHLu/DlanZhWFDCfzpgNT/jg7e9z/+Z12p0OvQsDXnz5ZaSUlGXG8OSYg/t3mUwmbJ6/xOrZLVbPbjIdjjg5OiKfZ7S7XW5+9BGmtEaYoiiYTSZMxxOm0xlJegapAjpJytFwhApjwiCkncYI1Uy8blgscsIwRDrjW7Xx4ZKbjBOqmgPUneM8qNxcFcuT+Akq0m1dA6oymiG8V80pUdL7A7pp7idcpQKoJDGxdKzWG7rgHxoJbIRmyYXJo7FnYd6LxhiMtATDG5eFqPvJs/FKzykagF3xuYrq1ZZ2/z6mkYuWWtbxi4KtC1XbWKNgwMc3zvLxje8xePWfMzMDvvfRLqXSlBIWE0Eaw1pfMFca2ob5BERo2Ns3dDci9nZzZjPD0f6YbkfRTSU3P5BcPV8SFwJuGFZW+4hxiNpuU2xrusU7fPG1i3zjjQ2b0EoImjF6zaxjlarBlWaiIeH+Ni5KsI4ZECSLNXJzzFH4LudWf4riuKTUpW+E6n5+oTZaM/rwHjwTs739Mvf/4T/lxmHCTz136ZFj7zFFpC2r+6V4MGrM9/0PNHz54gaTZ79Fafj9b3/I1//4PTbPrnCpfZ47d+9SaMNiMefspYsopYhixZXL50liRaQUYRAwm89RUjAajQA43D9k5849tDYcHB7SWxtw5swZkjhmni1ASLLFgm6vy/HhIfPZlOO9HYpsQpHHzOZzDg8PWNvaZjGfsbExgLIgyzMW8xmT8QhjDEVZsFjMGQx6rK6scGt0y+qV8wX5fIIQ0Or22d7aYDQ84ca1a4yOTpjNDTKIuHfnNt3BgDBNIMDurEFBURRgDEoquv0Bk9mcTjuwkWYycCuzwWjBNNOU2ZT1ICBxuzPrajI6vWRDovAZMl0XWEOdsamjETZS7VMMtT+2RQu/k7QBr8OlZqRLPkSVPC7wG0VCTR6rHXUd82/IFoAD2dM6RqfKsAa2ppbXA7VrWPeQ5eP+dqbWDFCrAHzUpzEPssCl7Tj9O1GDkbsTni36u2vHqoWAhV7je9+5wdtv/GP+3i9vcfFcCnKX63cisjInm0K/A6U0TBYFaRvmBjolLEaGtJ2ztqE4zkvSNcP0umZ+oAiF4d2vS157uUURlZj3FSocUB6EpLsRer1DmA+40hV8dFy7htWJbryax6rBTpFa+1YN1wWBbDYxoZIURtDNn0GYe5wkH7B97nOc3JuhC91I2WAIhaJFwPxoyMnqHuurZ/jg5lv8t//i23RiSTG+x998xNj7keh0gQZb+GGuqT96IDCiRAu4vTfl99+8QW89JMsy7t67zvDwmNmsYP3MFlGouHBum3YnIYlCYrfVzXA4ZLGYcXg4YTweMZvNGJ+MGA1PSNMWk+EQpSSLlRWm0yndXodLly4gjKFczFEYrr33DvPxkMJIOv1VuivrdAd9jDB02ylKQGk0Os9Jo5goimi1WsznU2aTMbPJiDDcotNp026nhEnM7M6YyckQrUGGIecunCUMBJ98+AnFzi4mbTEcDgnzgqsvXaIscgKl6XZSssWU4+EJaM1gdUAripFSUpRAVuvohuM57374CfNsxhdefp6L22sVGNSsSNTd1fjGHqvdxZf66AkEXa9awGetarojembvZTbPOj3DdAxQG1EFObj/HY412rHZWg09hWl84zWMS/65QjeCcSyke1nam8k8AakzPYMP9PFbWFXPqLwVBPV2OfU13nhXvb7LZ1BrJLxyQ5CP1zCjd9GjAya3f4V9OWHzwg7IfSSwkIaP9wR39gSdLkQSjDJ0JQz6gsVtuzB0OpDsKC693OGdb07odiQb2wauZaSbLdgUyOMAM40odtrIiYBixnPRCocy4IgFmMIterLOWyE8xbOt41rPHbHSol8mfS9JAUEgKfMCIUK6xTmmh7e5n32flc3z6GGEngm6cUwrz5hPxyxKwb3ZITfMNxGHL7CYR1z63AptCiZh/six95h0uj+YvS6d0ViSHnblshpKMJoU/Kt//XvkxQgxTxDM0GXO/bt36HbXuHj5Aqu9Fiu9NoaC6WTGycmEsiyYTEZobQgCRRRFTCYTsmzObDqiyDKy2ZRFFHF8dIRSijPBFkkS0e12uHWwz9HOHcZHB+iiYHX7EoP1beJ2CyMEg0GXIBDoIufk6JCTo0P2dnaRUpKVBbrI0WXBaHjCwcE+WhdcuHCOja1Ndj++znw8ZjgcoYKItJ1y5sI5ikJjypLjw2OkiukMurQ6HdbWVomVIgyl3R2iLNFSssgyjArQoqTdajHPcoyxjPXXf/N3+fv/r39EkqT8lb/yF/mv/sd/o9oO5oE2N/WP75fTZ4pHHH8SSuXi5dibBR4nqlYuQV7qF7W3TBXBJBCi3mC1NtLwgEO+1yfWygmvylhmk7VZy9S5sKHBeGkwabNk4PLn+QxXHnC9a5OH+ipbWXWZrvyGfS2orvedbyqyL4A7731MPtshTltM71/i/tERu7de4tkv/BFJb46KDWECsxHkC4HWkjDQDLVgnIGaSEwmaAlJT2uiWUG00uHoRNKZ5SgBo0lCMusSLFpMRprOokAVfVpiQj6+y1dbF/lOa5N74j7G2JwKNmmPN29WtNS1uleV1Hr2OsDCIFDMs4I//J3f5LlnXmHj/HkSeR49yTicntBrC85vpxzcm3EnF5gggRBYbXHz6wfk999g6+xZfv6nf5rhcMR4Pnzk2HuMwRFNmuqOn7Kw1Xuk8UAk2oPFiTla8Gu/9QZ3jg7ZPrfKycmQ+WzK0c4h2Tzn6hcuY7IpQgcIYjK3r9rB4THD4QlCGKI4IAoDgkDSaiUUWYfhyTHZbIZUAqEkk/EEpRS6KFjf3CRMQorFnLsfvc98kXPmyoucuXiFVn9AksaUZUZ/0CUvFhyfzNnb2eHk8IgyzxCAkorWyjpr29skrTZlntvVNZRcfvZZPnrrTcYn+0xPjtGFIYpSOu0W2SJjdHLMbD5HRoL1zW0uXrzAYKVLEkVEQcTw5AQB9PoDlAwIgpAoVESBoJO2OTgeUZaG1dU10rTD1vYan3/1RZQXL13D23nu95GzQSEVcLgfjRVFtYvsqUTXJ6zUjgoNdYIzfpkKlZxetuGDWUUjVaAsaqbsTeX4e7v7GG/0sfcy0sFABaaVd24FxJ69CtPQs9LkJ2JJteCBeclnvTK01fX2XNaI0t7bBU34/BoWXQ3eTcwDuxfWNYr50T7FYsy5jTMcHoz53GrKvfcvMooPMduf0N8Y0Y5h0DOMDgR6ZuhtGkYngnkJWWDQuWY2TRgVkrFRaBlyWG5zGYWe54gy5qSMSFRAoEPm0xItp4h2iAk6tCYHfDHXvN/vc41j2z7GB5fURq7KYImHXt0Y875dXSJ6ITnzzFX+5a/+E7pBDxUHhJcFul3y0y9cQKtz5MUVEHb/tkSmTPduwKTF9cmMNDmhi8SEC175/OuPHHuPL+GNaK7fNWN64NzmwIeqcx9yU8Bw+/4Jv/MH32JlYxUlJHs7OxRlTtqJ+U//9v+I9a11DvcPuXvvDovFDIPdXWE+nzOfLwhCiZAwm06JwpAwDAkju/ttURTEcYTWBTrPONjd4eTwkOloxPHREXc+fpf5ImPz7BXWz1/kyovP0+51yeczyiKj2+2gAml3cihLTk5OKIsCIwRpu03aSml3O4xHYzrtlCSJicKQrQtn6a6vM75+h707t9m9f5+1tR6ttE2SpsTtFptntxgOZ0RJQqvTY3V1hSgIiIKQPC84Ojomjlus9nruvRRxIGlFgtZ6n6woWP/5L/K1L75Ep53S66TgggKkEdXOHH7/LV8aRMzl0BXV5NZaPDwM/gkoAsvuKmND5WJkWB6CDsyo2V4l8os64YmhVjtUm6wKU4N29eBaZVEH6HgnNLBb0Zg6AU0FHDT6pQbEitD5ulY1NA13Kc+fPQNsMGt3j2pfOK9kcAxZUzNgz8qDXNEVBdNuj+noY9TgKhfEgvKtc8y/s6Dz5T3K/hyZZER7XaKNKcWiRMuA3sqc27cDdFszywv6Zo18PyCchhRG8Vsf9fmLHQimBiVK5hJEoRGEULbQBMQpLOYFmRa8bDTZoMMtM0aLEuGCuKuWcuHejTfDA7QRdXpNXH9cufQsvS88S/Fexnj3iNGtMZe/nHLxxVe5fftD1sVVhNFEQUJX9Hjl8udJwy3eeu/3uHf7HZ7/ouH82k85FcfDy2PX6VYDYont1n9XzeOZQ3Xe8l0MkOeG/+6//30KYUgSyc3r161P7Lmz/JmvfZkz66tkRU6Z5dy6XXL77j3arZTFPLebVmJQUqKkZF4ULOZzgiCg2+2SJAmjo2MQEqkEh3u76CJndHzIR6VmMhpT5CWbl57n/HMvMFhZp5W26CQxJg5I04QoDjg8OiRbLFgsFrTabQDyxdRtrx7T7fXJs4zpbIpSEq01SRzR6vaR0S7ZdMLBzg7D89tEkf1+sLpC2m6hohPanS5hGNPvD5DGECjF5tYWRVHSbnWwG4EqgkARhIF9H2FIw4AkVKx0IsD6NWsE0ouVBu8iig9drXZCaDIqrxkzFnCfRCMaOC4kmywVl/S/Dvus2SvVpGx6MTRZhHefk43x7NmoJyFNSiFq2b/WOjq/2Sr9aU1rq0f6Y82YQH+tPU83VBBWdDbabxHuYwkdBLmON9U9rJFNe/cqYceHRlQbeApj2OiEHLnv7sqAT4Z3eCFJWA8LinGf6NsxZVujVYacr7MnNdHVXTobc+azE7KsoBjnhMLALCAaZyyyPQ5251y/p7g/XfD3vnCOdDbH6JBQKVAKNS9RwRbZcEaU5EzLCe+OIi6FqxTtgnssGn3jSmX4tOzXRwcuyQ8NTxGB5PXLL/PNb/4WLTmjvxLwc3/pNfYne7YdgV5nnVh30UXBjVv3WcwyzicJzz3/K+RMqSL/HlEeO+guDc1Gewio9j/7LGoFMLx/7TZvfv9d+hsDJtMx+/v32dza5M//2a9xdmOAKQ1FltFOY86fP8d0OmM6GRO0I46OhwRhSBhEHO0fMJtPkUrSbrcRrZD5bE62mBN1O8StFmEYMzk5YTGdMp1O2b54kSDucvXFF1g7s4U0hu2tNVrtGLA+sJPJmEAqpJCsbW3S6kwpsozJWFHmGXEco5Tk5PiY3koHoSwrVmHA1eeeY/fGXbr9LqOTA8ajEe1Oi8UiJwgj4iSl2xtwfDRiNpsTqYReu4XA0GtppFSkaUqaJBhjiKUkErIyQNp8CcsM1nrciGqTSTQEos7BIIVGG0HpBqTdH825GDnWpTH1LsFPUBHCOxtZ8V/gtvV2sKkbulPwxKFBK70k7hcqvGqiAdr+Dh6A/aVN4PSRUU7UXwpGER6c7YOa4b84sdkAQrvvjT6lwquB1IOqzz5mwVs3GKCu9b9uMSgbagW7p5hBkHH+TIvknQPm7cv8q2zMKOrzph7yUhQi22ukJkfMY0opOUoS5uUB4laffKckzBJWe4asoyENyIsFB1rTjRLObrSZ3g94dzTl//a9Q/4X59sE0lCaCKVDEIpimgMKoQ0r7ZyMjPd3Si72WxTrIXvYcDK/oDQjCJd7xYNwDbz2tUue37zE4K/9AidHH7Hy+grd1RVu3H+PLXWVlfQSg6TDrRu3ONg/4GjvA1Qw5vLrnyeIu9zf+4j54og46j9y7P0IvBeag4CKMYjGtz+oGEAXgn/2z36NolwQRnDn7l22tjb5a3/5L3LhzCYBJXNdMFvMyLKMMAhYW1uj1+0AhsGgy71797h39z4CQakNMlC0uz067Q6hChkeD9nu9VgZDAiUYtrtkHTarG1s0Bv0KbKSwdoKYRzRShOEhPl8gS5LxpMJRZ6jlMIYQxiGmFYKaUKchghtyPIMFVpVxtHhEWEYEgQBoZRM51OiNCHtdYnimCLPmIxHTKYTiqLgzJltVgZ9nr0aUxYl89mctcEAhWE2m9FqpyRJYndaloI4aGwQI2hM+WUu0BQlm196a7mPpPKBkMr5NRqBjXrSoqmNeIKKqH585qkmI/CBDl7311Q71Hpf97dotGvVfo1IpVofYc/XlmV7Pa5FPsuOJNYNb2nPPuE5mY3PrBZMV5ZVIk4mMdYP2D663hzK6nIFhqKWXhxLtuTbApCVdPzG4tqqGYxlyuqs4vn1Fh8ND7gsFboVM1InvJ9OiFsKOQ8pyoKWLogikFFAwD7j/IQkyUnKgvZUgJozac3Jdcp0done3QFfXBU801vnuwcL/t93FvzdcwoZzhGBscnkS43JIie+p2zICOYnHIaSraOU0WDBXOraWUr4kdtYLR3rt29vrBrIYHdBcYvm+sULdD5nKJOM8aSkyCcMkpdYHE64V+xz5/q7LGZ3WT1/lu7G84BEm4L11Qvsn7zBevjFR468HwHoNunsg7JocxV6AILd6BIYbly/y+99/Q944QsvYzBsnTnPL/2Zn+PSmS1iockWOdPpjEWes8gW7O7u0un22NpcIwwkwpQMuglRoDg6GVOeGPorKwRhTJK2OP/MM4ymUwIJeTanvbrCmXNnGI9GTifbYjZdoE1JGkdgSqIoJFsUDIcT5vMZUiqGw2OyLMNv2y6kQChlF4s4IowjkiQhSSPSNCUMQ6aTKWmrTdrt0FlZZX1zCyFhkc0py5IoitjcWGdjtUen06csDaaEosiJ04SEFO237xHQCiOUoMG6HtbyP6DLxPI1wqkiwE5M1QCRJ1GtK52sXo0/IR3ggAVIWY0/z2TBmpxEA/VE9T21SsGV6lbu+mWNmlMnVABgXJt7UGjMCB9Z5Zh2M0esfbZNpV6Z+ip8MfgkNvZAlY6eGopMrUGp6ldijJcDLORqX19KxumQtStnWXn/kAujOW/tTojPrWEGE2R7HzkrCDJYzBTdJKLQGSQQRZJpviDuhcymOaPckLQgY47cC5ClJMcwEBm/eDbinUnEv8ki/noaks2HmHaMCCKINEUhSUtBKTWLecTiZA95ts+5do8b8by5pFT9vSRHGNPob9vWgTDksSCPJmStI4piiMkMJ9N9ImWYHxTkw4/Zv3uLMJ1w9uWXUXHLefkYhEv1mCQtsmL8yLH3I/PTbW5xDlT6Q6ih9uGEyVAaza/+239P0m8RJglp2mF7a4tLZzZIAmsAW+QFUipaSYtOe0GcJEwnUyaTmJVeh27aIlYB+YWzxOkhUkpa7S537t1FCMnW9hlWVvq045jRaMTh8RGz+Yw4juj1OkymE5QsKfOSvZ17BJFkb3cXYxRFqcmzBUIYptMpWmuUUsRJUol7URwhtCGKIlbXVuh0u4RhgDCadprS6XV5/tVX2Dp/kc2tLfJ8ThgF9HpdVgd9zp/ZoN9p0Uo7SBmiS5jPZggEYRyCMeT5gnarSxSHf4IeqhWGtcbL9Z0x1VY9nv1aA9yndtyPddHCbb3uhe+G2quybjuPBsv4oHLzmk0QrU4tHVQqBjuRpTtglr6DimXhoc8xzEqv7heAhjrD65UrpkmDUmNVBpVfqicwFjQdP22I2P75pjq3FKC8D29lb5H2nYWNdNNGYyjBRfEVZOw9e5Hu8YTzwzGHWvM7f/Qx0Zbk4i8k9LZ26ZQzilyymHdIkylZNgIlCVuSnTKjNZCEGg6mAVL1SNKEbJAymc5YjGEDzedXYV8kfC9IeTmbkk+OkCsB2ayDNF1MFpGEKavRhF+/dpPudJ8rwSXa5/qcyIzaT6/RdtQSxOkw9txo5vEOs+SIEAlKYjJJUZ4QZwMm+zvs7Nxk++I67a3n7R10bWrUWoCQxOEVjsbvPXLsPV7Q9YOIOqPPw3x4zfK718Up/g+Pp3zru+/xwsufYzyfsCpKnn/2Iv22ZZyLPGeeZ9YGLOwuuUJKoigijmPKUlMUBePxkHwxY321T6fdYTyZc/H8RfK8ICsWrK30ee7KZaaTKXuHB+zs7mKMIc8zDvf3OTo8soxPBshQkqRt4ih1DHtBq9Wi1W6hNURRRBgGSCWI477dN0trWu2Efr9Lp9tHGI0pC7JFxmBlwOb2Nuvrm3S6HaYzq67o9bpcPH+OjdUV0jhGSoUUISYQhIFCa40UEEcxGEMSBFXi7AeSYTcXvdrr/cEvl3QP/sNDpBBz+oInp9iE4ZIqSbbR7jPVQukZbt1M9j0LMSOghd01Vla5ce23Eh8K5q+tGGW1lDXavgG4D5NG6mtqycX3nXbzqmKzwuOMqwOWfdWCtA+rMA6IauzOxjuozhqBCNDCqhe0sQY4UbkPuucKw6ijCV46z+YHn/DFUcGdC5f47ltv0jbnSf/sJtng+4TRFNkeIkxC3ArReorUBj0NGE+7IBShVkR3P0dvLmlFBbqniTuGe9Oc+6OQpFXwT3aP+KutiC+0VhCLFiYEMsEi10gj6CcDrpzf5p/c/4SfuX2XFV0iLvaw2ces3lxX6iS/wEjXZF6vbVsomg6Yx3MWxRwl4GB8HYDhnYjJzodceuUnCNPUqVtcDmRTmUIRRqNkhOFHHBzx0PKQefsDL3Hs6ne//ib9jW2yfI4pM1YGLZLAIE1JkZfMswXzfMZ8kVNqKIoSKWWl4wQoS402Je00ptXqUgJ3ij1Goyk+FPKFZ67QayWsdTtsb66x0m9zeHzMbDZHCUlv0CfPS0ajMcPjIwKprIfDyQlBFBElA+KkRa/bIwhChDB0OilBIJESRKmJk5A0jVEywJQFpdCUheDs2W16/QGrq2sESjJftJhNp2ysrrO1ukIripBKolSA3/I8CEKOj09QgSIOQlpxQhpEjVDez9YvS/71P/B043IyOEgSPrXjk1X81uu1Jtflv/MqAuHDTJuuVwACmUjyckYUdNwRW3wyFBCVMwFeMez9aB3Y1UERDe+BpqqiQsRmqm7RqE+9bbwvwlhjmveCsIuJM5zhI9xM9Qzj9NlWJ6X4aOff8uyZv1hn8AOnXLARbM1t4Euh2d9ucealc6y8c53Pj94hf/kV9u/eonjvEsMzKTI8Ieq8DatHdtcMGaDLkjgtGO1KVg5+ip5WKJMynw+ZjYasDgSd1JB2F0zKjLuHmjyN+PtHBVG4wusRpGIVnURI2hTTCUXY5VeeeZ37ccR7szs8fzIk2QkItxMb8FJ5EtTKhno5831mdcZxtMJY3iYvpmQLSVkcEAcDklaf7S8+i5GhdZ304E1R3drepUSYgH763CPH3uMHXWMQsiG5NL76wXNVMJ4s+PXf+Dqr5zc4OTxk0B+wsb5GuxWCKcnLHKGEdb8yJcPRiNmioJXGZIsF85lhYTRlFBKFEWWpKXWJVCFRGGJ0ye7ePs9cOU+33aKdxkRxRJZlPPfMFWbzOVlWcnh4zCTPmcwWTCYzbt28xfDkkPliisEazqIoIopCgjAgjkN6nQ6tVgJogkDSbSUARFGIznOKPKcsAsqi5MzmBoOVVVqtFtpoOu2ErNWi2+7QTltEUUStv/MbQhrSJEaqgCSM6Max3Z69nrkPbeWlHTnc70pIWtLlekd9lgIlvI7ydGTPk1QqsDElCKtoqF/QQVK1A2xtAUcYpGgx0iNCOlVkWxX6W9HSGtrs/w/ZTty5d9Ws1H72br4gEabecW9Z54tTpvv7+pwDXo1QiyLCMz27E6VzExSUwqDcYhCqAeP8Ojvjt9juvFrpKev7N5Qi/tWE5OBLz7C9t8OFj3dI73yTb599mShbcHgzwRQxw/sv8OqXW0zkNVqJIs9CZqMUWUj0ccYEzXqqbb4CmTLeGzLpQX8DVjpzopU5O0ddht0V/lWhiUSLl+MVGA9J9XXM0W0Ua6gw4z85+zz/5304Sqaom/uc65+D1Iec1Gy03jvOvlWgFOv9dQarz3Nz9gllPkGXiuPR+0RBiJaa1a1zmNway+pwRYPVfyugBKPcOCgJ5Y94N2BfrBHA7ZWG+YzzsnmS4drHt/ngww+4YMbs3P4YVMyLLz7DdDoh73Qdu9AYrZES0nZK2o2YzeacHB+TZwvarYQszzA6ZJEVaJGRtmM63S5ZfhulJL1u2wJmEJHlBVIpeu027U4HjKTXG3A8HHE0HDOf3ieOUwZrG2idMToZksYJaZpY41igaKcx6yt9kjhGSkGShKRRaKeoEOTZnMlkQhgEhGFEGEZ0Oh2iKAKsnjoJYlppilQBQigb59/IFaocmw+kopMmFnBdEy4ZRj5jWbLIN66v3ebd5KfeSeKHfcaPT3Esh3qc+tQvNcurWwC8eC8RIqYMdhtGNFPdo+lnaxrXLakTHOP0Envl+oVXw3l26lUgNSO2GOmB3NTuucJUAE2DRTvZxJ20vLAaFxJhF9CIQbzJzujbtOI+aXDBRR02WLOgYbyz4yBrxez+yk+z+S9/m+5wSjD8mN3jdxAbV9htbxP31jBHa7SLAePxEVJrWkmfPC8g1gi9YJRltClpY+gmKaPxlN2hILkc0Vqdce7iEb05nIxjflOlrMxmXJ5eBwFRp4tUHfTwBu0s42+uX+T/ebRDxgHqnUPOvL5WE4lGvwghacUJm2uXWOufY14U7Ozf5K75XXKhOT7aQZYFffMCgUiJ4gCdObUMfjES+J2BbZ8W1e4en2ZefsxM14svf5JiNz78+u9/l/WNVUxZIAUMD/d4+9vf4erFMxRFDthUh14007oky6bkeY5SArRiNpuRxjGT+ZzJbEY3iijyAmOg1WqhVEAcxYRhSKvVptAlSikQhsC5RfVVSBgGtFptJuMZO3u7xCqhLAOMHtLudFhZWSGOYzbW1ul2UnrtDmkYowKBlBCFoTVKGMPC7fBgvQ4MaWpdvgROOV9qpBJIaVMz+ggm4YwmSkmrOjGGVhQSBfX+BL7F/zTcs5lf90FkXb5zLbA+OcUIkEZjhPJHgEZggZfMPIAJn+zHYFDE0lDqnEBG1NBrHKh6tknFZB22OgJqMG4bd6orG1nKTG38qnLcNrwZ7L20+6CdJqLufV3pKR1LrhZhu6hoqJ7h6ymlYGvlp9m5/8+4N/wmV1ZaQB8Pz/56G8Ulq/fRwKwT0/ra68S/8zZbKuRKd4XZ4oBv7Ay5sfk8pQxJojaqGFGYgtlwn07SYjEzlFHIwgimZc5ELxhITS8J6ZuIg3sltw6he1Gyed6Q9k7YH3X4d0XEfyY3aBW7LDII4wgMBPMFV/uavzQ4y68mCTevf0Lr9ojehTZenSCFpN9ZYWv9Mq14ldHJEfeuv8fh/nXGbUOxOmQ6HmMWIy7Gv0hkVjGLEpPpJUNm5dvr2twY7+yusCoGP64eLI8FdH2HQEMP5b/wIk/TciZOX20n/Wiy4Nr12yTtmNHwgNl4jKJkNp1QasN8kdmQy8ppH3ycuBSG6XSMLksCJdHETOcLZvOMTl8gpKQo58RJzGDQZ3VlQBKnSGX1o8a9hFBugkroyA5RVPLcs1fZ3Nrk2kcfc3B4wAGC6WTK1nZIK0npd9us9nqkcUyoAlQgkdWWAdgUjwiSJLW+gca4wI0A3ECOwsi+k6jZq/1lUEoRBAFKCKIgIFY1UDyoy20cMMsTt9FbDzmO06k3DTx1OKU5baR7AkuVjaARCCHcJmnVqBXVxkd4XbpA0DUtJpwQskkFsE2QBOeKVRvQ7AjV9eYvpuqS6pgFMrf5jPBQYVVJwoF1re5oihreEaypz63TnttrTX2Jy+eLAS000kAan6Eddphm9zkcfpOV/i+4d7a5NqQxVUBJc6E1GA4ubbL2E5eJvn8HNZyx1Q74j0PNB/vf5V7rC5wEKTIMKMZ2Z5WDoyGdNARato4yYaI1C5GT5YaugI0opCvb3Lme8+Fhxsb5FTb6XfYPSn47KvmVvE8cHVMWNmQ41yXR9Igvxau8u3/IW9029z7ap7vdIoxDVnobbG1eQRFTTEfsHl7j/r3r3L99g/v3r3P2F89Q5oLF9Jjz0VeJWLHv5xdLr4+nrFUMzbngdeqioY56SHnM6oU6o1G1Vj5krj5wyBkRPvzkLiKCuBUjVQ+dzRgeH3L//n2Oj064cvYMSRgxLzKUUjYwQWvyLKMoCvJsgZSK0XhCEMVkRYk2EEcJYRShRxMGgx6DXoetzXWSOCGOwqpGdmsWgxbOIV0FgGR10CeNI6QpyS6d5cXnnmU0GtHtdmm3W2yurdJOYgK3INQLjG54DQibmEaFCAFFWVIWpT1XCMIoZJFl1oIscHRFooQgVIIgECQqJKioz8MA9+FtfPo0U51hTh0X9QR2RwyS0vi38fvEPnkAXOWZrTfScWoZgXZ+sZWngL2idisTIOQaU32LjtjEJrTRFWD6LdorN1Dq+H7PYZtqBSOEc7/zTNcBr6mSOFZ3qe9TOSpVPed9af1f1a4Y/h2q53uWXFYLjgGUkZztfon3D/4tu9xGJu/Qj16p4PX06Kji45z70eGrl1kfTYk+3iUnZO3cWV7ev8Pmvbd4L1plp71CHsUUWUYnSRnOZoj5IavdHkJEZKrFSEIuc0pZUCLpCMGVtM9BHnD7u3O6mwYVx9xYTbkxvc5Fs0YcSERpCJgyzwISdZ+/sdrlrT/+I4ZrbU52cr76Cz+L1Irp4S5H+zuMxyfcvv0BRTGhtbbClbOvkbdOmIz3OBt8nph1C6ZGV31oP+jqd9WsWC8RO4Z8zoX/gGHAPh+9wSW+/oylNJCbgN6gjTZTpEjob64hAzDakC8WLOYLQqmqQIT5bOZcw8YcHx+T5zkyiCm0YTKbs8gyAhVQliWTyRxdGlpxxLmtTVb6PdIkJA4CKkd4xzS1LjHGUBjH0AWgIy6cO8N0MWcxyMmyjDRNicOQMFBEYVCHcILVOxsL5FmWMRyNaKctOmstABZZRpZlgFU7RJFlukbbd8PgANcmuYkDVU+ExnM+c1L4qoiHTChfmoDrjpjay1Nj0MaqgZ489UJzMXR6U6EAUfkfN3dvqNkw7uUDSjOnICMwAQ1TJD6/LlVLCWrY8uoC2Ty78kjwWd48KNtTXEIcp5LwwE614NUZyewx43ivWXqqcMuoVz74BceyM3tGr/0c7P4Ow8WIYPgd0hVBHD6P1gojNbEImBXeYm8wosQFUVMqycFPv8j5eUF5f0hxdEiv1AStlDTIuHv0IZ8EK+wIKGVMJ47IS8P+cAQSummfPEnJdcDcFGy2FHkQkBrBRhrSayfslzmZANNK+Wh9QHTvPhGGVnvDBitNj9nTkvODbf5Xr7/G//Y7f8xbb39Mf3CWTrHLweiAo5N9Sjlh5exF2oNnQCq++40PufXWPV7cbJE+t+VUehq/JX0lQRiXZ++USGjX8Notjx+1eqGqC/UkrWPUH35eQwmBEJCX8MmtO9bVShqiKOTkeIEUgnTQQ4YBaZpa30qn71RBQOn0sXme2x10Q+3SO2ryLGdlYJOTh1FCmsSsDrqs9rt0WilJGFbGKAEYpWyDygCDITAQSE2hFZGU5GWJlFbEL+OYOI4JlHLvqiudK0BZGkpdUuQF09mMyXhCp9VCCK8aMZalF7kF5jwDBFEcE6iAUAUkQUAUhkRKVbtz+FI7fNf/PlrEqd3la6L8qLNFbUAxvj+F82hwnfWEAS6AD6m1bSGo86xWsEbtZ+t3qfQ+uPa8WCVMyzFdMaBKz2hq0bt5j8rqT3Nh9CKKRghFzVp9XUz9PLdo4xmyC112HNs9xbOwajP4hhxS0x/TON8b5rRjb0oozvRf4sP9b5PKEQejP+LS6m0OdZfRaMSZwZ+tckVo9zyvI0ZIiijg7tdeZvPffZvpzgHTbELZTog6q7wclmyWu9xWMZ+UEceyg1QpSRwxzTLm5YxsOCWKu6TtDrtFwFRAr9smKXIGSciZKGGsZ8x1RDEcc6s8QRQlg6xEqS0mWUEETMd7XFnZ4O9eucB/sz/h3/37P+DqVkZnXbBy6Sxhq4tQlpkWuWJ/X/PeH73DV//LX8QYiU30fsqoWhGoWrSspRD8ytlgQg8vP4IsY58m2NaldnyxP8NxQWk07XbK/n5Bls8IAsU8y8gWU/YPD8mKkjBSDtwkKggRQhKGIb1ej9F4wnA0RmtYzEta7ZjxZEzabtHrpKx0u6yvDuh2WrSikKDJZvBzq56MCgidq1YRKLKyJAgs+/SbPlpXrprV2ltY4NLGsMgzirJwrm/rRIGiKAxxGBAFirIsKbRmMptSlppet0caxaRhRCsObPy5ofIzbRbx4KGlFq9E5VMvKXQ1/V20ac3BTHUPUfmY+qxTFcQv7cj4ZBQjdGOTHJajJRscVDRA1n/2kNySKxzrIV3Ts/eo+hsLwrKeqF615rnm6RSmtbAOlWduJcE0dwY2S2qKJR4rfB3txPfX1FhtquTkTa2s1yGXjgVv9V7lndtvMgpKEq25M/qIiTb01M+gdSOdj/ALSW1EBEOeRuz8uZ9k67e+SXAvQ81zCCdkSYe1WBMXBSvjO9xTHT5RA4bBClEQEsYJC10wN3P2DuYM1tYoVI/ZBDY3zpKhaYuSQGmCw7ski5xcdDD6hOH0Hl2RUWrDraMZfdNGdFpcvHCRvxTc49dPRtwdtvjpL14hVPWGYiaXvPm77/DNf/+b/PW/+SW6Z89ilWaGOuih6fvs3rfpElhRlrpXEOUjx97j25jSD9Tq6KMB93QpDNzbHzIZj1DKGpyUkkgkcaQ4PDxiNrN5FpI4Qhtc6kZJHLfQzMjLkqIsieOYPLeKb6Ui4jikk8Rs9PvW3zeJaMURkZL1/lWwPAtZBlAlBEpCGEiiQFKEmiy3inxtNJR+vlh9l5TS5aK1RrA0TcEIoihCGMuWwzBESokUVrfYarU4ODwkTUKSKCBxgFuJvqda19axXrQ+tcVPY6R4UGdndc+nxJPGCu6lbmsI/EE9+uNX7O4Qp1rQGOotG5w0UA1mN7n8giQEgU4oxD4lJdIEjTFjVz//jIqlNvRB9fTVLqOZqdtZVPhV8dVa1eN1qLVx2p8jqolf73mmTQOyhX9N7bwQasgurYIAYwRB2KWTdCmCE2bZgqwwmEJx/sxz1aJc77XmXqoxX4yBIgm590tfYv1b79F55yP0eIYJW4SRZNCN6UjDYDRmkO9yx2TstzYYkxIFMYFIUDJjPj8mNyVqfZu9wxHdOGShc8TshI2VPicr6yTX3yYbZeSyB5MFSpX0oi6f3Nqh09vgfrnCYHCBP9e+yx+MFrz7xh1e+cnzCGEoF3B4/y733/n3fPUnz3H55WeQQVD5Jxs/TvAqBfueTRuHHUum8tO2w0PyKbPvRxiR9mnF18/1W65h72jIdDLi8HCP2WxKFMXIQBGImP5gwN7uHifDIZ1W6hLMCIyGvCgYTycUuiRttQiChNlsAQjW1zYYdFPOba6zvrpCO45Io5BEBY3B7Q0mDdGdUxjsvlKACOyGl1EQsCgLcl1SFJaxetC1obqCIAhsFrAgxBtpyqKsWLI3BEohaacpan2NOAyJgoBAWsD1Aqs+VZfl5mwc/EEEtDrVTZ4GgpqHnUadREcASIF59KL+Y1yWCYF9P+lYphX1l9+/MdH8AixtwvsZM9rG5k72Hgt2CNWM2Xuh2O3arfjq9X92oZRYVyPhdjGwi55PhlOzLQ+eGuHyK9i3abBf48G59mbwGceMMwxJz4gx+C3bG4I0a4NN7kxPGC00aSAITAslk0p/78+tF2TjFrH62WUYsPflV5gNWrTf+j7s7aEHPVpCEkYxq/GCVqbYFjPu736fvWiN/fWrnLQGhGmb6WKKETA/3ke1BsyFIM0mtKKARV5QiJJ06woDUo6LKVlp2JQGJSNWVi7wO29e42uf/ypvThYk7U2+crbkg/KE2x/dY3WzTxiUnItjfvav/Vk62+dcv/jUpX6JqxRpVKuhlyLcWlNL86Lhu/0fUL3wWYugFo2nk5zd/T1yPSdOErQuSZKQQMXs7w3pdLusrq3R7fVRUiFVQLnImC0WTKZTptMZWkOWl2isv+7WxiYXtrfodVNW+h3i2PrdRkFQxdoj/JD77KKyr3OoBIG02e/LwKCNtjkftKZ0GcCMDvDO5tYhXdot0p3BLstzDIZYhQggcVuph1KhGghgJ+9yedi6+si19rQo7RM9CwsK2qkQqgneWBSlZ1pI5zz/6QPsx7cY15B1Swo8a/cKBJy9QNdJaYQzRekxO9l9tIJpMKaVtZ0/rDNQGVMlBvNAKitjm9cRN1QYuMQ17jrvAyuhBsQQdGkQ2i+9pn4Pp/et4cGngLS8t1YIG5qeyTQA1+K8W37CkFYIRSFoRQnk7QbfrhegemgI625X6fidKkrA6KVnyda7rP/OH6HHhxCAHCToJKQVaCKlSOWUDTNkPHuPgyPBvk456W4y7W0yB4zOkQWIMIRAosM2i8mY0WzMMAnZFpvcXYw4mE/ZbA1AatbXC77+wUdcef513ji4zX6ouTxQjDoSEUIQRWi5T2frgm13U9aLic/LW40V/066mjO1jbX2JLHjRuKztD2s/NiAri9GwGiW0UojkjRmNp0QBAFBoFgsNCvra4RhSH/QRwpJnhcUZUFeZIxGQ46ODlnkC7KF3Za83+mwvbnJxuoandQq7ZMoIg5CkiiyARRAJTafRqqH4YmoP9QLvdXZhUISSgCJDtwW5tSM1xv9pBDkZclsoZHKgrQQirLMKbRGCo1SgV1UpKwfe0ptU4upP7g0875WopFj9qZiz95IJh4AXLuy1xuGV+5Pjx5fP8bFIVVDP7rk0VAZxAx1msMSoSVGGgQx8dwwVffJWpDJAbGOK9az1EPuo92Lq3TfNHMCuO+NrnZtMK4OWngvBMNoPuWDyTu83v9itQ2Pk81q9oWd+gq/U7F2MFtWTLtePPwC6jpZaNvv+YJesEZ/4xU+vPU9MLn1IadxbmXgoxYDmzlqfb2wvquLjU12f/nnWf3kY4rDGZ28QK1twOiYMtckrRSlDbGAaHFMe3GXyehjjj9MGK1eIvvcC8wmGhVIwnaf2fEh2XRGQE7c7/HBvfv0Ox2OwphxeUxsFBEZ/Y5kf+c6F1cGXD/aZVYGXMpD0tBg5mMWK30qt7DK5mGNlM33rX1CGseqpqh9qv2k+TQnoscWHGHrbqpcnT/4CntWqWG8yCnLHCEF48mYTqdD4TKHtdotJpMJRVEym00pF4KTyQnD8Zij4UmVy1YqydkzZ7h8/jxrK6vOlUsQBSFRENKKbJ6C6ukNsJWV2ICz6jbKkvKzoYIQ9ZFKWBV2/7GqBVStNRaAFJKsKClcGLPVsym0MeS6RAjre9xUqZ5uywpIH6FYfSTbpZ4oBihNrZvVRtj3FjhxySzdSNBM8l0nZHnSis/a5fMaVG3b7N9T+lMjtOtTRT+5RKIHHBT3OFZ7bHN+qf9NpRP3R+11ppqUwgErLj+CPSZPTWzvtNQKUm5NdojDN3m59Xpj3HoFAmhRIis9pMsJTIGNI9OVHruGEA/JurqfUBEb3c+jxQKCDxBSE2ivrzTLE0b4xOrOX8Kd0zC34Vlv1u2x88qr7Beajffe59xUEwcR8zxjXpbIqISkjVg7Q6QixOo6SWeDdaORg3XmWcj7b+8yH0+Q+ZQgCNFCkeUFQTumnxraE82RCimCiKK1Dse7JEJyfABb/VX2J0dcO5ZcDkLaHCPSlo3/EF4K8cBZey5Ug8PUenJRtbpXKVQhLz8Q8B4L6Pr9tWypGdWj6uLFMIlhmhnu7+7brdILQyCU7VclGHQ3yOZzWmnXXmcyZtMZo+GQRVHQSlq0khZJEpEmKSsrK/RaLZIkRkmFknaXhiSJCMMH6VkFJq7aQljtXgVGS4D7qNL013gAIusV0EAgJUoqhKi3zhNyOStSICU+HcsPU8ypxzfZbT22PNI4m7q7qBIajWfB1VyqxFotaoatfmjf4B+DIgzLmxj6yK86p5fFDBeGXTcVPuWoJCBVq6xpxaG8x0ItiMoIv8G7ZTz1hKzHTx2w4D0J/Cef/wq89GHcVjm2li8PXuStg++wlZxnVa5VvNqgLRiYGg7sPZaXxOZTvXubPVdWT/SQoohoqx7zbESiYgfWdapIf55ftKie7DXVTknl9dQGSiEwYcjO515A3log7x5wYkbMB13iV65QIiiVokg6lEGAQKGMzXFw96MDfvPf/PfsT+Ern3+ZV197EVGUzMZD2q0YdXaDZHKLNA/ZOSkpckWwcoZsOmYgjzgY5Wy14WRR8O6dfc4NWvTf3SG6NKDox9RudfrUG7oEOU6aaG5Iatfl2s+Zavl7dPkRqhf81H30BC0x7B6Mmc1mzGYT9vZ26Q76jMcnmNIwGU/QZUm/2+PC2bN00pRcQjCZkqoAKRVxnNBppbRaLZI4Jols1JdSEoEgjkOSMLTDYkncXi51mr6a3Eq/CJ56q6XrTr9frRN44CoBNpJOu3TaphbHBFa9ECjVYBafzmofXupVevk60XDnt9ND412OnFLRuOtE/Z7aMTOfjuUUCX5yituu2xq5apCrzZT1nmGw3INN3gqCVA5o58cMwx1WuVBBrgcpOwRquKu2Rq9AvXTg3wAsoytpQ/pEOsCF9CLX0o/41s4f86UzX2ZVDhBl7YDmQdP+p+u+q4xqVB1mn2nBVhq7gY+HbO9u0UvOsT96m6DTx4a/1r1tXd9kVetK3K6WEfdWDZWJW7IpA8lur0d70eODbEhurnGht0Zt9JPVuM8Xmg+/+zE7Nz/hmQspg9GY+fQW2xdf4d6ORImIla0BZhAxX7uKwLA2z7lzaxfmISYdUOYT2nFOVgb0ggKF4cbxjM1Wh607GelCk2/E9XZ/3vuk0bLWt9IDaz0q/Lvafm7KpQ8vP9J8ugYerutwSFYYzTw3gEYbq6c1ooUBxsMhQgVIpXj++ed5+cUXiclZhCGagFIXBEFEmraIw8DmJlCKUFr9qUQQRyFpbLeyeVip8PEh7dVQEoDxanZ3+ulrHrj/8pfNpUe4NvEg7xXxNqw5qM73uGs+pTM/O/hZ1lUaKqAvjXcv8pjb9CStNVkG4zartC9uAK2bb/RkFLtPX22OqkV9g1TWYOWWWnC7JtRjQ1aAJoxACE1fnmevfJ88mBEVSXWq8EZKBMJopDGUjtE2s4vVvyv6ZAEXq/oB6+ESy5Bz6Rk+Lm7xb6/9c3754p9jPbzopBDP0erINWvw8f3nXdOsDcGfWzNXx62NAGk1ySvtS9w7eJs47ldG4EYrOhuFb6fGW7gh4QG81oeKSmIQccSsyJkXx6y9uFmPMue6J4RidDDmwze+x2g4ZjgakXRafOWVC7zwhS+BDIjTfTorEbIfU4gcYRQG+N7wQ945fptndZeN+Av0eyuYIiMwEp0XdKOMSGlGxrCbhawfaeTomPjiOnlUNNYWX3+shxTLOveHye+eDT+qPBbQlc1+aawGpavI6aTXftAVpWIyW1DqDK1LwjCiLDS6LMkWM1qDFV753Ku8/uqrpJGkLDRBlNDtBTZqK4yQUtp9yYzdnA5pXbHiMCKNApsgp1qp3PPN6Tp/WrHX18akJcmiFiF/AAZ5oBZCoEvjNAq1VVu5XYX97R51S//dQ59xuuZO/+oIbGV99e9T6xmX1x7pKlu6742bF7UW5MkCXKDquKW2FSCMxMiSRTInnsbgPEuqxncBDxY4LBjaCLKAXnmGo/IOm+KqBelKS2uZaxPGPch7Mm2EcbpYVy9nsNSOoToPMoSBy+kV7mbXGc4qTaoDVutlgfcbrYSVhsENHD9tgrRpfAM+WsZgaMUbBCIgibssR2j5AUx1ByFs4FDtlOwbuill1dfooM39/B6L7ojO1nO2/iiQUOaSwzvHfPid72NMjhAlnXbBKz/1OhsXLlp3S6PZ2Fpx47GskMZg+NatN7h9cMQ02uWCKXhGfpVO0ELoguECUhWSyoJuPmEsOtyaSM6mHbL3T0gvdGDgJU7ntrck9brPPgq0YvinQsUfUR4P062sgI1KNDqnOqeyegIGsqwgSgI6nTZZltlMW2XBaDhCCsmrL7/Mz37lp+mmKabMEFIRKEEQRnYbG5cGUbosUUoYwtAm+I6CsAH2D1mdGmPEToS61R5YtXySEGMeaORHEOUHn0eTPbtPnt24JDnWy+Ez3vBRK+updzZmWcsn3UTxeSJK4wXdUw/1IH1qGTD1eHyyStNy2mQ1QkAu0HLCtJORjvrVZLa+1bIhZoKnbQZDLPvI4h5ZNCMuWw6MTQWWXioSDpCNEFZKEPWzq5YXNqdFDdX1mOwGHaQpGHTOkGHdDEu03/uCZcNnw0BWJfLxe6f5d7J38AuwVbnY65QIuLRyiXaQklf3rCeLcIZBD9I2MsgZ3cyycck7PACU+YBP3rxG2JnyzEsX8DIeCCaHC9795ofc//gD2n2FiFK2zm9x5aUvEbT7VsVlCuodnDUQOJC0Y/nLF77IpPw6M53x3ug6ImjzQvvnYC4JA8HdwxPSpM1KBMFiyiJMuV0knI8Djj+ekKwq0ostSrFojJnGWG+qpIRzE6sa/dMn7WN19nmAhXmGZB5eJaUErVZEEAZsbW0SRiGj8Qmj0Yif/Mkv8/Nf+Sr9dogUhVUZSFm5kymlXICB3YI8UpJWEtNNUpIgsBnyH2XhF5ahavGnI20/NPYIL+ay5ErmAfd0VT5NtfCZ6me8KuPRdTaNdqi4iQfl5hWNtfOH0zH/eBRjGvFbwkWOCW8AMqSLVUw+Z9I9rnxXgXqyLemipL2fDFgNXmRc3nWeEe4czzgdqAj3HJ+G1E7ZRlCvmyACy34tA/a/DVob+uEmW4OLjIoxu8WQ37/1azVr9RIJNTAY7ILquar1A16GX29Us/t/1X17rvMF1meZ/d7lg7Z1r7XX9fiQ1SRyHNc3HH5h0fmAm394g5XtkrMvbiCjFJDoMuXOxyP++Nd+n+//0RugDHcPx2xfWuGZ1z+HSrtoXaK1lQyNMdbrx7iFw9jdY7TRvLj+PH/jpb9At9XnxfMX+bnXv8zWMyGH8YK5CBj0u4znY3YWESpMaImSkJy7OgGhuHVzzL3vHmMWbrv3pfzHkmp7p+qzP+7UVp/iR/lYQFebumMr4G04Z/vvq4xVxlYkDKz+rN/v0uv3abUTjCk5c2aLr3z5y6RRZEmGtqKFClSlu0VCqCRpGNJJInrtFq04QXl6uyztLP2cJj268eMFSB/G+zCAMTQFr4c85yHFVyeQAiWsKsEnOBdY8PVRTKL6+fQV4fSrPerJD7tLqQ3NbAS+70pqQ5pwbaWgCoUO1KNJ9o9zET6s0/N+v7mjqc2L7fk6UucsekPXYRoV+Qy1pgJjb/gsi5LDk0Ni02KhRh5vTz3Xiq1+3Al/UiNhjr1nxW/dGKihURjD1eQ5ZvmUUkk+2r9DJ+g1RF+nkmisjB5S/X5ptoO1e2+3YXmlevNQancCXsiYaCRol/7+7n7GJvf0Ok8tmjKUb1dvkHYj2fS4/5191i4H9C8MEFKgS8VimHB0/YR7H3zMtVuHMMr46MNDvvJzr3H1tVctGTCFW5DKagGwgR8lNkGNY+nG1mm7fYb/6Lk/z9ee+3kCGZNxzFH6q+StAtNus7G+gihnHC2gRCKKAiFK9kRIEodc2xlz7Y19inEPYayfsqiMzKcXE6hdA+HB7Znq8nhcxtwKbYTxMqmrXnPlrbqhqrgU0G2nxKFg2u9x5swWmJJ+u0MShRitKR1T8PlzBaCkIFKKJIwIZK1/q+7dEAsehg/m1PGmb/GDk+ZBZmdO3fhR19bf19onJXB6Ztd2xum1GoSybqPPWJpMdsnaLKrx0TjB/vIiISyJxNJ3lBSValM7OdF7MgThE4m6DvCcIciJ+AKBXiwQcYBBkU5XmQ4OyVfnBCctFvEJhDHRLPLModIbzGVClsQkChbmkJg2VNZ9avWBZSEVaFd7mDn/Wns7U6lGhfdqQVcpH1eDFQZ5l810CxMfcanzqmc3eD9T03hWLegbzJJxzRZTxXLLqg7+3yIIuLXa4vlM8G5inEdGbTirs5U1zZIPzgJdJuy9eUzQH9I527PBQPOURHSYjncwMuDbb1/j5PCI1bWU/+Rv/Qyr5886wqOpQ+DdhDZ2i3ghXBi/yynRnPD9eBUhSrQpOBnvMrsz5ePFv+HZzV9Cxqu045TZcMiNwwnbqx0SBKbdZbQY0+62ef/+MVrusXV5g/7GCCMLC+017XVuerVZ1uLvjzgiTTv94KfBRe083aiMFLQjRWACttZWCZVkY3WFQbdLGkeAqaKzVGDTLkopSYOANFQ0/QV/GIz605bGuvInuFYQKMWiyDFaV9FddsKYyqPBM+A/aTGP+Aw0JowtPjm5wJGfB1QdTfHRf3rCgNepTJpZ1TzwyjBgXh5wJI5pxWuEWcq0NaS1ojFlyVycsAhAlQEUYEqDNBELc0wQSEazBWkS0+2UjEe1SsGllEE0dMIWO4TbLNLWw3od2LoIt6I3DWk+2PS55ApTccJakBEHHSrLphNTvPa2AkaopChtakbruXtzM3LtnucNvoWSXC/GnDEt7njPDf8CeN2uqOrt8d8XrVP2v7egEDtsPbNBGq9TTCLMfMTR+B6zWYYoDygK+OrrHZ778k/SP3fG5ZI2VsQ3Gl0FMQv3v3K2Gqfi8BILEk3JIh9x//AG9/ZvUCwKonSV9U7J+bNTFuYMRwcRYRDST9vc3t9jTUVkxdjmeYgjVjZX2VkIzN6C1bUOWh4vgWtF4KuX9eqjRyPCY4tIq0TSylDgmBaV40rFGn0oqjAQSNChopOkhKuKtZUVQqWQwg0EA0GgKjEtVIo4stS/qY99GKjz0CPu+Ckm/MB5ohrL1d+nB9YPC7zeTUxKp4T3SW/wCgX7IN+ej3rAA3poc6rLK9Zsmn/WL+KJg2NEpTaUfpZjma80csljAyxDryfrk1Zc4If2IiP1IJCKhE1WdMQ422NUzNBzyUTdJ4p6iCBAuIQupcgwam7Hm14Qa0GZTInLgPb165QrX2Uqm5PUYFxyG0yt2rJKAS+223nhg49tCp6arfocCQkRs/GCNhp0iRB2HPm8DXau+RBXgRSm6mPfi5p6YcfXi+ohtp0cm59EMZvHC5J2wDyy7+Hj5Rq1s3c3loFKJFo9w2K/4ODw93jta1eJg1Vi2szVmDv3dphMDugOBPH6CqmEi89s0z9zDq39zrvOZ9e490PgfcklgsPxfYo5rK72CIMOmoLRfJeP777Hwc4tWnFC2OnT7nbIygNePffzBNEKLTGkFaaMFy0m04gglkR6wuUrHYxYMJvMKHWCISZUc3K1oOo04/W8finzo8rX8UfMdCsMqKz7rmqNYIQq8YsP63CTQErchoyCKFAEwu4FVhY5Stn0h2WpUUjiMKQVBQ0XnPoZp2ryqUTsYVuSV5c1UFj7ufmwl/1TED0pQLhsXUVhiCOrKPWqMGvc8rbdR9DqRsUMTgWAd9muNX2+6IZOykOxT08nhXT+pO7GhqXrlwz3NIfck1bquC04JbEISNUKCQMKM2G62OeovM5I3iaN2sTZglmckhUZulhgAFVqUtOhJbcJ1DoHScT524fcvrBK0bR2u4fo6phXIfjvHNvEZgPzqgBpas7qBcmV6AxMM4SsRerSGGaHU1przoPCuZD5a7TRVRL8pqrPqySoQNgzEf9bcLMreOHI8O56Ha1YSzoGlQtMOUMnLUTwEq32NjduT7h//2Ne/uLryDxiPl+wP7zJOLvBqNhn++o2gWxx953rvPjSgP5gC1Mx1iZRq5UkHuxOshN+45u/TjGf02612Ny8yGhyQrE4pNdps3Z+hU6SEhjBdvdZDvItijJDGZvuNY4mRPGE1Z7EbBmkShAix9Cm3fN1KPDZ2SzZ87ggq/rYJUhgU4N+Oqw+vuAIJxY9cNg0gKx5qvskrMCAlAIT2O1TvO+hwCeFEgTC0HJb4tTuJn+K6j7gImaq+tonPuT+/wNgjcAao6QQVl/tt+dRtmsehq/LzPa0KGct1AVWR+5FILN0xfLVTZZf7SrrRI+KHZta54tYBvAnsVi/2EZbuPm9LF8IhBSEpkM/7NINL3CQv8tU7GKyMTOdIVH0wy3irEccrdAONvB5vPII7gQ5G3eH7J3tUkpT8UJwbW38bhE10Pp+qPSjDi3nkxFRJ0aYECWcGk8oIqlYOMIhgbRUHI+OaK2lCOFS3RgoZwVSaWQUVukcrWSuXTYzr5ekKUBTu0NpCqXYjUs2piU7bZsVrZwZVBTYUP1DxSJVTORzZHmXe7fvcff2DQ7vXeO1s69S5CP2Du4zntznuHuDMjKUuye0OgFnt7fZeuUqwbzAiIDZZJe0vQLY3WHrzGmaTOfcOrjFH3znmxTzKSIAM52S3fmQza0Oa9trdNqGRCg2k0u04jMIEXImWgdT4HXxRng/a+PUFHY+2F0x/Oio55gR2g2SSnyvc+k6H5TmQv6w8njUC6butqZj+dIAh0oX4g0a7pAVW5VCSInUoIvc+eb54WyIw7D2TKAG80e5L/2gvcOa34vGv9XHBov8zOURjPR0FWWlVijshGuAvh0YzVs6EGwea+h7K+MMXmVQn3OqGtbGbaxhxbIWUd3XM56mrtc3icayqWVVzJPFdgWW7UtRJ5TxKq5KTPaN5CFIhKzGn2PCmHmSckFeRRrJPJzRkimx2gZdc0SBoEwidtcMmzeGjDYCZlFEqWxIQ6vsYEzBRE4aKhrnjmXqvva2CqFnzMsdtnpXYJqBkcxu3OSb795Edu/yhS99GXUy5dgErJ1/hlCF4H1atWZxtI/qSwhsStFSlGhj4+Ok63tLeCS6hPFYIJMCsBsCBJFEiJL9nuK5G2OO4w6LQEJomJ9MufnxCavFgM3PbbHW7pCNbvPJO7/LIk8oipJ33/02YSLorIZsnz9DMJxzv/0JM1HS75yBsM3xvROU2eX+0ZhPbtxBhS1QAd02XFl5ntW1MyAk/+4bv8bt/V3iWHDhQpd+L0HEXeb5HmmroCMlZ5ILdONnkDKs5gNIpIzcOK+pg6n0xo1R7ZC2ERzt0lc2sEa4seIHj1d2/6gNaX74+IyUfjtpj8GVuNqI6PBgYzMlgZHK6qa0ptQlCFWl3pMCwjC0jeFmjHH3abIVX2yDfza4fBh0NJng0l1+wC1P38s0bqYb15duogceAVx9jTCUlIBs6Oke/uxKi+t+KazvaTNL2jIAN/Y5o6E3rhKSi8qXVQsP0A3xFgfSDYPpE1WMn0reEk/FfIXwQQP16T6RjBACsRCcDV4lFCkCQavUHOV7vHPyh7x+9jXSWRtRWA+U+WjOeHzCzr1jLuwIuLxKZAStRZcX7i0oyoL9swnXL2ZInwBJKiIVIGRIqCLQmpIA3b3EvLxDNkzodNYZDifcPrzHaGh49xsfciHtcHx4wMlMc/7Zl+mt9kjbHWRZYnRJZ2UbrQv0eEEYdpmNx5SLGUk6sBuglrntax2ACGH/mBvHc+7d+oSJDNjeaPHScz1MT3J7q8XZayfce2aNeQDBSsKFc5pg1uInrj7HeDxDr7T40k9/kY/2NN+/dh+hPuDcSy9gTACiZKN7lTVzhVwX3Avu0SkizPouxYmmbRIuXOyxWEC+KEkixTi7xezgBkGQsL4ZsXbuHFpltNKUWX5CKId0gxCAy2uvkagNjFF4N0AN1jaEchKGC/H2hMsYlgJf8MAKdeRhQxKkguJapAS0KRGfsg3vY3IZkzXIUv8WpyxRDfbuRCp7HGNckg9BaTwsgJISvw+ZfQ4PzHdh6hxPP/zOuA1gevDWPxzLdeefvqZakJa+EEgl7Q4TFauyQFC6DH0Nu9ZDyunlQCwdau5q6zeY1LisV03FiWncyhgL2jifZfcy9quGI/8Tqmfwslgl1zim7wUzH6Hn837ZawRCS7aDFwlJa2FEhdy5f4/f/eg36eqQ58NtomALspxwMuXO967xvQ9vcX7jDBuR4PzWBpOD64Sbl1g5e4a42+PMah8pbEL+2XTKYj4nK0r2D49YZDPybEF32/DBH75P3F5je/2Y9z+6aQfGaotgQ/Lrb7zD+c0EE0R8eP07iFuavDSIICYKIgKpkCokX9h37iQJSoI2u7QUHB4ckrQSjqcLJhmgAj748C56NmE+nnHltcuIu5rv/cYHXH3l8whOaH/YYqgLttcjnt04S7x2kTu3b5KVhmvvv4P4eIdy0GdyWPLcz71CoXxgg7BkCrglrnGiF6SF4nCxw1ZynpXuBt1Jn3xyTDpYYY9jlA4xYoERmnayQV4MEZSEekGntwY6w4iIxWxEELSxhrcSYaS1x3ibhYVfmwazgkDn52vquWOo3fqoZD4/GeuZ493y7G7SD5v1y+WxgG7pLMKVH7E7LvE2UpYjrhrqB9su1phj3GeE1a1Vr++CBh6gnQ1DnRcnxNJxL/Q1rmlWwB9pWP+bSa0fUDkswfLDnUSaxyoDSCWyNNQq7p20MTb4o9RWgV0a6qi1h9/XHnBDYknmb15gKnVDPSxqr5Fm+kL/vTb1ZiXGUWFvWa9Z7hNavHSEV2+JalIuh6c3+9VgipJQdRtNa9Blyctbr6GEZLp7m/uvnCWSh7TLFlF/jWfPrrL+hRcoJyUr7VXykwn7wynH4Q7rapv8aI+ja2+TmznkY4zO0GiMLohbMZqS/dkuF9QWZy+vIFXJdHKbF35izSa6V9t89c98vvJEqBNL2sQ2Bh9FphGl5s73dvj3v/ldtF6Q5wvOnGnzyleeo301pdNt0zYdhLJS0vYzCSe7exzuHHPz+JB5ueBgcsJgcsLNoyHD4wOunF1nfFASvZ7yh7/zWwznU/TOPrN7x/zsXc1bzx6g46vot24iX71AKcrKkH4cHDEpb4Nc59rJtxnIDVQYIBAMOucw7XMAKB0xyY+ZiZJ5MUcXJ7RUi4HapC/OEqV9NIaJPmFXXGOuj2nRsWxW1Dkqql4XZmnW+3SN9k9nYPRqUqHd9Y1ADwe6RtReG9bXWVUL9qPKYzKkuU43orL4e/9CCTQ3BPQg5MHRszmljVMzSIS0Gzj6BkAE1D6BsNSe1H6HSw8RHuBMrWY2zfDFRhHNWz6i8U4fbiwcj2K3/iSz9J1w64UiSBLyLCfXBk1JBAghyUttrdPUi4Be6lTReHfTyDFhv/NhpcapHJZc6xyw+rFU+ls5v1LtWEk11oyP1jPVNkO1HvRJKroCW7uVji+ikjasYalxhTZ2TzjtnePrb6WUPLf2Mt+490e8d3+MCk+42nmJZ1t/lSgc0EoVs9mMw51b7B3fJb15h+wbb3D4j/81K9M5rV/+HMHPfRklByBdULCwEuMnBzcZFjm99iqoEG00rV6v8fSiohMuULgx5y0ESwkChQkEBRHrAQxeOsfnv/oSUbeDkT5ZjXaSjdUyt1dh65lNjNFMjkbcu7ZHKzbsz4/ZHWdcv3mLlWTKQa65M9xn9XKf8y+dQ5wckZozfDJ8h4Puq0TxgDtvf4/La32Kc20MBVES8/H0m7SSAfN8gZ4eIlqbJEkH8OMQMIJEbpCEW2gzYRwcslMWbKgeq+3P4xSYSKCvOggBx5MbtLtnQQuMCJDO89xLM0uOz1C5TC4BqxsPtV9ulV7I1a9phLYs2JMWIU6jQF0ej3rBq0lEwwdSeGi14oW2SwWeefrIZhdJ54MVq8FtjQsWPGbzBUVhSOIY9/Y0Hfjd4xq9RuMbe25z599Gqlr3tVj+7lOLWf4llkG1OqtxUOAGuF+chO3OVhQzQ5JnGcLgwFZjtDVweOnBTh9nqDRezeLVB6JWy/oloDJsOgbr2Z3PROUNcZ7BVnX2zLZWI9Sh2wJjZPX9k1YqZ7oGqxWNrG6+LPs2N81d7l/jMhAYwf3Dt5lQslEEPNv/82x1fpbZFO7e22Ex2cGUJ7TaAc+8dJb0W98h+/7HhEqwuLrK+JkLrIcJOGZqb69BKD4Yf8D56Dz4nWor5XstDtcumH4BdVpMZxvwK+3KUNFLI87/3Z9B9AfOBdZKV9olvTF4QHHjy3X+xsYq7UEXjGI+FCTfu8FifsS9Mudzn79A9/wG7Y0W0eyQ45U7jPM2ShbMP/yIxeCYyWSHfHcDc66NMZLFPCORXeKgzcH8iJW4hymmzt+YemA1WKUULXoiJU9y2qqD9tF1RmDcrhm94CylnKHlCGUG1Yj2rNff1Af+uGlkB0G1/To1iBiwagU3VExzjHhdhEUx4/a5+7TY+McDuo1seFpWGoJK9q0nqXD/O32JGyzSWdNtjlfX+S7Zq9aGyWyK1jN6vR6RB14HJB5wK9j0DdQA1ib9936sTXboDZLC+BQW9bUs/e3uUbF1UTHBB4tZ+uR1q+DngyAQAiUDFhRkRU6oBOQapRRa2S3YDRJVqW6WI1/MAx3tl+G63UtT77nl1Rv1fepG8vXzuyw3J4HRXr1gjxdPIOhCrWiymrhaOhLG+2Q3IXd5NfUbVQoBUkakrT4XWq9x9fJfIJ8EjI/3uXbjDZAz0k7CynqXMNpCO4Pc/L/8q8ivvUY2H6NffIb1+P/H3n8925bcd57YJ81y2x5/Xd1b3hcKhjAE2WSz2a2WRpppSd0RHTOhGD3qRaE/Qs96UISe+k0zCulBIYVmRqPRqN2wp5tsohsECRBAVQFlrnfHn+2WzUw9ZK619rl161aRmCqQwfMDTt1z9l42V65v/n7fn0vx6bRrXQuEf5GPVo94WV/pVnQXANf/3z+cNEspipI2ntStPXvpLBLJxv6C6anl1qtjlIp8WJT1YG0CgPf7t3OgdUEJctMQZY85vfUGs08+ZDK8xO7VB1z/mmL8nECJM45O3yeVz9G8foVH7h6TU83g4AzOTsl2E3585wFvfvN6eFccmdihsXMmeoC0p54W7ZdEWlBrn4Mv/CPZ4iqizBGZpC8c1PLvio3BK8T1MUYEIFx/N8RagkX7d/cOrOeb9Yts64/qrcSwjWvnUX+8HoWeLl9O9IJnrVvwD4DrENZPJEOrRfYhSV2gTUcs+odiEdjQD03piNEwY5AOcM7RNA1IiYwiCBlTgr5oyJNg2mmj3ff9A21X9W7sQp68bLVoFwy1tVXMv6QiPPAetNZB3q0BXn8djrbWkAOctSHt0nPXjRNUVUMkLXGkUY0jUhBFGuksBjyXJyTiGQ+3C3UJGn97jk6b7TyRT4yHEzjrze420/5cCIcPK/G1Z91fpBbxXx1pQ6Q8wIYSmq1V1SoCIhQQb9MB17InhFREKmVjtItKNqhNxP49zeGjXyLMnNFIsndtExnt+B2cC8XerS9irsC+8RL9gwjx2fj3on2sDoGRJS4atXYizkosDUq2LXYcD1dHfHD2S97ZfIuBjBG2pZUcKRGTgyNKbTm6MqEJFEmfGtFDjbcqWy3a0XW/FQ5jwMw0xcFjtra3ODn9mDd/XzEZDDAHNbd+dpPr33uLSO+BHFNs/ZzBf/IuN040VitGr15mRwYbTXgtPI4i4niT1WLOg+MZL14adk5kf9r2pVx/hxwqSkEPw7E6OO4BFajlFtKK4PsSa1quou+b0o8hrC9W5yG4U97CdfWMsFj/EJDh3r5i0O1iwNZM1V6rX7u5YBa16bDiHEC1TgFYVBWHJ/tsbWyQrwRZmlDkOWnmixILI5BKIxGhqaTo3pHuXVpD3w5mWuUar0G3PJ5Z02o6LVbQAXBQLuhrPYj2Lzp+pOU619C2hzfRm+ngOzE474CsrOV0UTA/O+Pg4X02NzbJEs3mxpTxcAxNjTSW4WRC4SrSLG3n5KfgtzMVA29raEv7uVCYvL8yt7aTC3HhNmi6YQTC93Rhe+ulYP+6ScvQ9RX4RA/ECMoatHDY0O5cS41SCTpKwSqKvMaWcO/khKPjj8iXj6jkPq+88BpxfNkvbM56AOtyuB19MsSa/taaEiFrrH+WluNyxtLMqBLfTKdqHLfvvc/mzpCt0dWwOAiOiyX/7P1/ww/iH7M7vsb2YMJ2OmYSD7hq4HTT8Prum9w6PAGn6YMFu9I44fpa4IX1agwtBWeTAcpZ/tWPPiaJP+Kb397h5OAhk8dbXHvjXbTawjqI9IhETThRv2R4+Tk2N9+kKE4ZJmDc5W4+ZVHEzDbMHuWczR36Uk+Otc+pc5zTKxmhNFFQanyRKA8faxEEApwKioTs41AEPcj68RcQFgGB8NXSHF2YoB+oHlxbpSX0D4FwjXRjJjtn5tPky+kcIXsHVfev9JFr7UsalC9aUlD2qgZSgDF+kJSEZWn55PZjiga0bKjynHsP7vHSiy+hleP55y6zMR37ypaCTmvxcb+91tuhE3T1ldux8iZIO8T9I3HhGtuY4PXr7sOme9Oi5zjbkKvuAzreFQ+ArcZtrKdSamOxxjIZDmjyBdIZtLDMT06xteXgcEm+XDIcpuwZGA9iBmlo+/2UhbXl94QQvTZqg+MsrOQEYG2jElqxHYcLbdQCOB9Fcs6jf95y++siSvoaF62ybytLGiWcnpTMlxX7j86IbMl4OiUdDKhMQ748ZrZYMj855vjWhyhd8s5vfZPJ1phSP2KQaqJ4GGKwW+3Iv5p0i2ygbUTbDj1QBh3ghpENz+1nj35ErBNWtgYsH9/9E4rBHQzPs8EV5nXBx/NH/P9+8QcICbUrOFve4bhQ3I00TdUQO8HvXn8LtfuIWlYkbHSg1caLC9qSq2u0V6flA1JQ6lMWy0Pu3h1w89YdvvX3lywWBRv6BuKF14l0Gu5IYJ1gZ+cdHpV/jNAPOCkOiNQZLhdk6XcRXMcCg3hIUdfs33lELCWRzMLJ115QwriIFuoCISlaKJZ9dbFezaMN4hdr7zXCL4Ydh9gtK2s44VoL2LdI6v06/XctsnSUhnOAd/A/6SN6Ur6c2gst59hqYAKE9JNMhmtvv5fITw0V+Nq4zjlq5xgPhlx//hWEhOFgg+Fkg+HmJpPREO0aJqMhcQDbc5llgaZgbXg6afvehT+7cRX9WtB93gLquXjn/jyfWtPcmubIWmKg68+4Xru2BTgi39/J4rg8vs7bL14L49dv2webie7Ipl1InvRoCbri2OAQzqLDXk3Yto1caPnb9jj9i0fgdMPENEGDsOf3+esmP/vzYwrjWB2fsL23wXC0ReRy7ty8yaOHtzk4O2GYanY2YwbDhGwwIMLx6JOHfHhnn8t7Y/7+f/j7TLYv8d//dz/kdOe/5zde/A/o2q671jpoE3/DQNIzNN3iDN1DcKLPAXROcH3yHB88/jPK/AimrxBvn1Erwbw84p/f+qd8cusWp6bCjhzDNCKNI8pFQdk4dJPxxvg637z6LvF4wrJektmE/fIOe9mNtQQd11lAndLRdX2wCAW5u8PKHpGs3mFrb8B3vnPE9otHjO0bJMPX8VDi1ua+YZBd4Vr8CpW+42tGy2vUTc1SfIS0ZwzEa5SyZpwnxGJFqiRaZK3uGC4uBKp3Oq6f/a0jXmJBrJeAX9+vt848XSA8d9vxs6FgTedMc2vPwXFOc+w4/PA8W8t8jQoi3Lc/z2dD65eaBtxer/+QjmPoAaN3VPWg2xsQDhDKcXUn49r2C8jW+SUENgCRFK7XoNfPR3dA1kelJfDPf3p+fM9v34v9DHwRT/zVAuOnN3z6Aazo79+xDmRtosS6k3AdwLtR+ozrWruWdjGxa7+3lxS8v/1l+m99hf7eYbZuJXRg/OSXf03kX/7Tf4WQsLe9wccffsjmdsKrL2zz4itbvP3Nd4mShDhJQap+ATUGOfu3PPjkLr/3W7/P7x5tIY6OcTcuc3/8O4zUAOFsGC8HTnY91dpWMr6l+rqjznXj663A1iry0PLC9BUune5QVUdY4dCjBDs7YxCPmAwd29uG7WbKL9wxq8YgjOF3zQbTnRe49tw7xCrDCUEjahpriURKvip5YG9xefg80F9v50Rr55Zz6MRRRI9x5RwWI+a/aFgs9tm4WrGZvcEgeQPngknv+nnsRZKorzNQY7LBQxpb0+gNFkWJs3PK6ufIxSYJBZuDiNxA7JK1oj/n55RDhHoiraLWAmNoobSOHF0argfl0PM4AK3oABhh2iWRdtlxnaPN9THs3TXI1vyDDsHaL3ugdk+MxLp86d2AXTeAQcQTf4cPe+sgJFAIwsCokFQh20pzCAGqNXefBPfPELGO7M/e8ukbPsWCf+rh1m/1sy7KrQdmtbv1q1Nf/wCckJyrvP+pY4tzC9pny/lx6hIucN4KEfgGmWvabjeJAzo714OxpxzWAPmvmfzu71xlY7JB01gGkyG7l7bJBqOgVzmaLnrDrXGu8Prf+01eeO0Kv/14i607P8UNDX/HPOYnv/N7nKRJRy145cmFHo8hOWH9VXRtfYV2/Nbpqu5DJPDO9Nt8PHuPJiqoVofEwz0EgoEb8OaVN5noXX4D+Hd3f8JvD69yRe/irvq6EM5Zz99bjTE+F+u5zZf4b97/b/nuqxk78Y7HCtdqqX2lsWggqOMjbNMwr+ak1Qtce/V5fvynf04TL8miN+k7sfa+/tZSbBWCun4VmW8w2HiIkksqW4ItqKqC+OEp9SBinlckcUwsh7R+E//O9eZ8L0/ESYs2Mr+d0cGh1jnVXEcTdlSh8IkMLiyC/YrR3k+7iHT25BOvWdiuw7OWbnBPOO0+LV9aj7R1E7Ubj3ZVQmJduJmn4FIXpBLMByGsH0QsEl+WztMTf1HtqgUe8Zk/7XbnKBKxdgv0hIEMa65c09jb6/q8a3NrP34hCZNE9Ly0FP5RqvD7Zx4xPPh2//Xz9/fWarXh7GG+9AxZy8X3x5ASlBahspu/Wl9xr+eArQ2pyn/N5Jvf+x4vvfU6r339LZ578XniwTDw70Hzs677YU2jF1IxuHqd27c/wEYCcfkF5OEB1/7ov8AvgK22CB6GTAdGbTBY+6JbXD+fAiCIAMbW2c4Re2P4IrP8hMf5e4h4ilYjhJRkyYBGO07MMc+P3+A/ff5/zNX0EuLyKwgrsdbX7LUYbLliNV8hnG8P9dbe2/zXP/7nPCwOAsb1mh1AlCY0Sc68XDBfHBCXcCV6ifF4QpTm7G1sI0jW0sPbhbhduAU+rEAiMFTlFquTV5CMSaIBQw0DdY1s+g2ce5eTU4e2MVEy9vuJsD/QEpP9HF6jzBC9dRDmqN8kAGFY7LrY5nUwDG19bBfJAH0OJv7JOHAh3kq0Cg79dfXnDed0Gvc5sCq+jFTO92a+zIoQ3jssAqhoEWhn1wOZXgOTPorB114QtqcTPH3SrnCfBtzPg9/1GN4n5Wlj0Ff6+qzxedrRAvO5Pg/+gvLUVkBPOec6vWDPbff0u+z802ExNCEWep3TBTDO4qzsj+/wFAM+uqKjG9rjhIy137z219GddiEX8tXLl6LpfhrEgpZEeMlFDxJPbfT4hM0q1kDsr3q+f5fMwZqW3K7Qv5I8/QDngry/oPShSuevtT3ek9ryk9utWzHymSr4hVzIhTwpX15yRJsEsoafbbHf/h1tw6rabQOnteZI8sWE1/f5LH31q5L1c396AZBija39VflO0d+3Wz/o+hUEjmo9Ku3J7/0Xa4dttX4h1oJtwzbnON3wcQimP3cdImTfuScrpl3IhVzIs+RLcqStv7herZW6B6O+yUVPkTgcqt0v/LQUepukdr7O5f8Q2mO42i98oBbwP5t26HmffvO/iHK+fi3PJBoC6LXhLuthZee36+kD1zog1ugdKdecYWunkFJ8phXioKvT21ovF3IhF/LF5EuhF5Tuyei2CPC6J3i9io93xpxXCVuuse1k76z9LIz7Ky3rXOmXepJniji3OFnrQjWpdv8nK5atH3rNgx82Xj+WC46eZ2XfXMiFXMh5+VI03UgL6ga896/Vdtvg4labFd1//d/04Ny+2WvaVKv5/qra7V+2nc9fRNarlH3KqRaiB74oGH8uh70W+vXESdaO0X60dl2uj8RYp0Q84xBooHAf1vYFQtqynC1PbZ1AXai6F3IhX1i+HNAFmvXAWBeCO7owJv9x3yjFb+RBud3nqXEGtJkgzyr08izp8PwLK2efdZ4veP41yrR3Hn7BU39qQ/GprwQ+29x0sPsZ1+UCp946yUIY1BqN212sBKxZz7xZoygCrxAaneAQF5zuhVzIX0C+tOQIRyjpKx2EXOceKJ8sOQFdrB8OIdeqDD1hHnca6V/aaR407C/Etf6KgMunAfdXl/6I68WCPu+yBKDWFrJWOX1aRlsb6udsO96hMIyx57cN1INfKD+7J9SFXMiF9PKlNqaEYIau9ZDpc6o99HpYXScQnoIda7jgHWi9w607z1/iOv8ijEIfMvWE6f6U384nMj95INZG4C8vbUbOueIz6w68c9sKnlzh2v2fnjjjzl2jcyEpAl96EttrvBfRuRdyIX8x+XI03eBgcUJ0xYHbTKv2ZRbBjFXCdSmIXfrCkxxhu5/7NOj9ahe5doJf8UhPBCx0Ytc2ar8TYq3p7l9aBG1PrycjDz5PwuOhrbfalqhzEKpyii7lui+pvbb/ehyyw4cIXsiFXMgXki9J033SeeY/b9Nl29Llnps9X8X9nNn/1HfZH9vaz85O+6xr+gw9+quRAFDQ3l+vof6luhY/je9tvWOfcf5+515T7r5+WkxwF17W672thutTMV1IdL0A3Qu5kC8qX5qm2763UrSc7HqtdddzuK365zjPT0KnebWhr5/S6Frw+B8kaPeznVYQru2JrcS5358G6euFfOg19o5W+RxZX4E6imBtfLpU4CfL53y+rGP2k1TCsxYmIb2a3oWZuc8OObuQC7mQT8uXU8RcrDO3rqMFHHQtUnxR7ae/3H2tSl8jQLqwg2gddOsgd54P/ixZD6Z4yhmf3PpztxKf8fsXlfM1k55+aR6wuwKA63rpeU63W3j+Ytew3r3C/71WHm896qL9Yx2oRc8HX/C6F3IhX1y+lII3F3IhF3IhF/J0+dJKO17IhVzIhVzIp+UCdC/kQi7kQr5CuQDdC7mQC7mQr1AuQPdCLuRCLuQrlAvQvZALuZAL+QrlAnQv5EIu5EK+QrkA3Qu5kAu5kK9QLkD3Qi7kQi7kK5QL0L2QC7mQC/kK5QJ0L+RCLuRCvkK5AN0LuZALuZCvUC5A90Iu5EIu5CuUC9C9kAu5kAv5CuUCdC/kQi7kQr5CuQDdC7mQC7mQr1AuQPdCLuRCLuQrlAvQvZALuZAL+QrlAnQv5EIu5EK+QrkA3Qu5kAu5kK9QvpxuwBdyIX9N5Hv/8HknQmdN0XXYtOFvEEL5H6lQMkIojZQKKaXfvu1k7SSC0ETU+XafInRSdc43Z7W2AWzX0NPRYG3TdXX+9HX4rfo/RfjOH883Em2/suFzB5iwnwNhcc7iMGF7h7UGh8U5g3MG6xqsNVhrEZZzLVC7wwvRXVffV9Gda0oqhEPIJ/fr93WibbGqkFIjhEapCCH8mLb3JoRbG3vR3vq5xquf7u0ouhMKoVHtj1LhR3bNXH1TW4l0Yu1ZSJwNJ3G+9a1vvu1wGPycsGGcz99f/6T8//4f/8cfP7NV6wXoXsjfaFl/eX0XagCHlBKEBOkBQkqNFBqxBrg9IAhkizah83XfOblto+xQSuOcQTgPjgKFw4Ewz7hCDwQCEQBl7ahCemAFWqPVd25WtMDrUcXinMQ6g7MWKcE5QQsf/hBurbN238H7s8aq6/XtngCeJ/5u93M43woc3w7cX6fDWouUFmsFUkqklGuLydpi1J5aPA1wObdwdedbA/zPuranigCw4cm5sJR+agP6Pt79Yuk4D8pPkwvQvZC/0eJfkjVgC9qkkCr8eI1MCAVSIvA/IHCi1ZlEt7cT/bE8EAj/tluHcwKHwGI9WFrh/3Xty8s5ba4FDCHOX1u7nYcC22lwzoGUQdMV/m+/lYFw5U5afx3CghUeB3FYJ3HC9GvEk+Pk3KdAuL/gAMB4zdHftevuxeFv0eG6exFOgAUnHdY6pLTBGqBbSNrxc+19u6dfRw/CYh0DPwXOUq5d0NpV96AZ/nZ+TB147dybFd04P3nvDvsF0dzLBeheyN9ocR3gytYWRiqFUEGjRQXTVyKExEmJFa3WKcIrK5EtAHfg0GtdXhMWOAt2HWMlSCTOqXMA0Zrk/vcebFvQ6DQ3HKC6O1n/1wNVq1EHPVaIQCmAdRIpBda2x/TLgQdofw1PAtyTIPYpDdK1O9Kqzx5sPb72Wnq3GPjrk9hAlzzrOZ3XZJ++ADz9AP14PrnPE2PWft2B63lAbhe+ln5qF7Vz1Mcz7qGVC9C9kL/Z4ryuivSg6vnaVqsVnlek5W8DhyuF/1nTQAODu/bC+rdQBvARznlt2XmAt9bijEN0JGgLKq2G216gCIAv/Clbbe0JjdRhgwkfjoPEYQKQttRHuAd/BdigvYlgQgvRani2WyzOo8inNcynUQniCQBy69fbMgVuDZvD4uC61YgnNMdudDvAfZIH76+vR87+u3UrwRMG/vye6mjR1npuyB/B9Zp6sFtaWwaCFSNku73r+N+n0OGfkgvQvZC/0dJii0AghUIK7f9FdoAohUQIhQtg25nIrQba8qmiff16kO4o14AyMujWxhqskDgjwNYBlPvr6uliGRxKEhkcS05YnHB+HzgPkM527721zlO9ztMLQohgvoPF+sXFghPKQ7NwnjJxTQfi7tzxnybiib8cYg171nTFAGY98Lfg1YKtDXyz/1zgZFjjHHgapd9n3aknOipFdIvaZ4OfCAtS2PwcUPfPqtN6O168vZv2nm33uT+CDUzS56u6F6B7IX+jpaUNvJbrvem9o6x3mPWarneatRqnFLIHX6F6cHIigLkH5JYuDF+CNUhRewrA0AFP60Q6TyuE62u14vBvSwkIIbA+7GDNBPb3FlTJTjv0jiqHFDpwqf7c0imsIWwLFu/ww9nAHHcQzDpInQO9LhSg19rbP70mGBYjJE7IoDtKnOs1ag+8/hqxPeXTRYQ8BUw7M/8zkPY8ELYWytq+a8/M/7OmcdMr6b07zZ0D3DBqTz330+SZoPtP/sn/weEEVV1xfHLG/sEhx2dHyETx1qsv8+rzL7EzmRKJCFM3nJ6e8tGtW/z4/V/w4c27zGYryspQG4MxBuccZs16UGFyaylRSgR2yvNfsp1fa5PfITHOYWyDbQyNsThrsdb5z/2y7c2mMIYuDKZ/8HZtrfKmomzNOan8Cu3arYKjREiGgxFvvvM1NqdT/vbf+l3Oliuy4RDXGKIowmG5tL3DqigRtuHg6JD9g0MePXzIvfu3ee/996nqCicVLlJYrbHSeX7PWpx13bmxBtdYXFPjGotxDmFdoMucd9oI7/eWQuCEpA1Dsu00cF7jsGG2eH5uzQgOGlnrw7HdBOr9137eORAWgfIT0XlnkA2TvPfqurD2h+O2NqSwCCf9dHX9Vqydozp99MVn65cgqtVuuygFFSIXRKAYesagnYuyAz0PwH5/D8RS9MDSRhSIdfQBpLMYazAiOGqEwFqHs3YNNwI4SAlt6JR48hX3L3+HOUH7ap14Uoow5i3vawPPC8bhzePgxJLWeieg8M/aR0bZ3lnofIiZfQqd0N2jCyFzCD+XWbvkjmMIIBs0WT8/wyg7D2zWeWefDPPX4IFdBnB+Gt+8nnLg+eF+iegg1HXDGs7nj2WfBOXzd9guB+Fbtwbv68Dr6LXxZ8szQdfWNRaoqgrnLEor0sGQrZ0pV69c5bkrV9nb2CSLMrCWxWLGdDxiPMwYDjN+8eEdDo7OkFVDLSSN8bGC1vpV2ViLwE84ZQUqcFla+gcjpEAL4QFZahASh8VaidWWumkwjcEYi3LeG2vCqtoOugmPwwmHcfKJMJneTJQIdKRJ0hTnHLt7e+xdvsp4POHS3mW+8fVvsrd7GR3FHnSEREUKWzfESrJcLUBEOOe4FGVcvfoc0W98j4ODx3zw8S/5+KMPufvoPqfLBY0UNM6RlwVNXYPwmoR3yIAQ3qMupPSLVff8RT9pWk1BCHASpEOsza4O/DqHTMARQfe5V2Rcx6+BC6ay8y8e4IS/Jr8IgbMB0Akg1I2jDJBqe5BCdVqK5wq96R3UC++Q+nVLiFDoAFcoD6pS4sKYCiF6aoE1DVcIlNIoGUA3ON88vaA6LRe8+elcNzm9mz5otjYApmufSQCUDuTbmODuWL1m3ALGp51c+HcoKBf9nuBjVL0SYtprFdbPOylwVoWTNB5k2kVWSH8fTwzhU03qXj30M6JVnALgdtpxGz7XLUwBBJ0PI+sjN+gWgPXznudtaRnb7vtz19ZaLO0R1+Zme3LveFzXdHvFYm3wO+A9N4PF2m7PkGeCbl1Xfn6YhjiKmUwmjCZTrl7d5crOJXY2t9ne3CKLUgQwGg1Ik5g4joijlEGS8cEnt3n4+Ih8VVI2II3ACOEdCc5PGisExvrQGyUFTjmUkGg8mEgEWgqUklgk1nmtQAmo8BqztV7rlWFi24AkJgy6dX6ltK5zOQRT0R8bPCC9+fqbvPr6W7z99ltcvXodkCRJjJSSs9MF8/kSpRRWSCKtURIWRckyzzHGUDcNWZrQNJAXS7LBgG997Td46/WvcXp2wmq15N7BA37yi/e4+/ghK0N48Ux42AEgpcTHdNIuyrRLdbdQCK/99ppO//Sf/NzPNX+/SvQT1Mgw0brwwn7CeaCWHQXndep2LG0IDwpjt3Z1HeB3J6b/1LVWnOCLaAVftvTUgudMpVRI5UHHiWBGCq8AiEAl+HhSjWwD76X/ly7KQfiIBxQErVOE4HpvNguENeAinG3jaQN4uTXOUrS0xVoMLt4EbzWr8/rckzfXPx//CGW3vRQ+kkKiMDhkCN3q6WHntV7nr7u9FwF4yuHJ2NXz4lpStF2wvVIdlIQwLtZ/56eeCRanCCaqvz9CVEkXftdabZ+aOr3+CWvabhvudW5Y3Hm07LUahFgbz3ae9jfif1sHaQjqBuFaPx91nwm6VV2DMSAUSRKTZBlpmnL10mV2t3YYD8cMsiFJmgIQRQotdSD8JSrSpFlKkt3iwf19ZvMVdd1gjKABGuuwWHAWE8wIg8QhPYkuQBjnTSxr1zzKIAIIKysRwjsFjBVg/PF8GKRA2uA0wANua7KEBRelFHGk2d7Z5dU33uA7v/E9XnrhZYxtqFY5i8WSoqqCp1ehI01dNzTWMRikICTVasVildPUNUppjo8NVVUyTBOGoxHGNJR1TVM3TAZDvvHKG9y4dJWb9+7w4Z2bfHznNvPFAussCodwntqwzgazvn0R2oU2aEUixDsG7cO1plfQSjtHS5gzCojaV0+IzmCyzoXtWx3ZX4PnJK0Pawoah5AOYbxfnE4bdsGcfEIbgzDhWzN3na98Wt7TVy+tZtsCrpDKUzYeXfw9BueONzBkANvIa7kBeFvQbjlYhMRzmO2CKTsAQ+Izv6xCWt0vuEFhkGHRJVxCqw2uZ4I512ZHrQOuoNXW/J8ixA23c6jVGp23jAhapwvxx0IFnlj0dBLr0QJy7ZkFTf1Zg3vOxBedht6PSdB8bTDiRB+Tu+6APO84exrgnjspnQbhpKfvntB423tqR6xd8NoQu35MwzwV3WxmXb/tDBfh40N6Cu3Z8kzQlVFE3VQI4dDRgDjJGA3GTEYjxoMhaZKidQSR9pqQyMiALWc8Z2UdTgqEkkRacf/hPrPZgrJsEI3AGYO14IzpAvmc9eaWcQKFpUGAaOhi+gJ31r7ISnktpV/9BdbKkIhj2veGFrGs9YAjpUbpiNdef5U3X3udV195nc3NbUzjODw8xDnLarmiqBuauqZoGpx1pGkKQmBsQ6QikiShrmuOjo5oGuu1AxyDQUZZlKzKitEg9hPQNBydnYKEsqrYzCZ85/V32JlO+emHH7JYzClXeeBYLQKJoueYPVi2U991k7VlV0Uw3VsFzbUmfTuzwu9CgCJEZApPDNju1einpleOA78uPOzYAEYuOF0kniboNOuOlnSBgwuLnguB+CHF8wnF5Ncmcj3jTGoEOtwP+BduPSVYIpSnEZSSAXB1oBja1NagoXYvZ3hZgznvnPXPSAis9Fqyk95OsNYDvNe8e8++z959kkZo/4Y+K63l/vvTAgF4A1yEtS/AxDnzXKDCc2xTiNuFGGjjdxFhQWFt1pw/X3de6Cy1MNoQIgfC8tBpkc6Ghbm7HOkViqci7LMmj8M5bz04IXFOduPYOulaaqO9hhZk+wXh08C7Ln0MdeDs2+3FU4fhU/JM0E2TDIyhrkuEsygpkUqilSZSGq00Uqv+KWuQiSYxKaPxmN2dmsI0FFVFbWqQDh0pzs5WVEWFqAWqMdQOGpw3W4LG66z1ky8MhnVeiVXST3avmQikjIKm4ENLtI6ojZ8Mpig8neC85jAej4jihHQwZGNzi52dXb729te4evkqWkVY09BUBYtVjnWWfLXi9GxGnucgJEprzpAhO9RrOJGOQSmKPKdqGmyYkLOzM3CO0WTCapixOfWLlZKCs8WS2ji0kCgp+PrLb/Lqczf4yS/f5/2PPmI+m2GdQEUxQnhrQwrB5sYGw9EI1ziOjg4wTd1pLk4I/14I/6b4hy/6yd29rJ4v9g44Fzjd7s06pzdZ17tgWs1XEVJPpeteqpYn9taFw7q1VEw49zK1FEPP8f56pU09lcIDrp9zMoBtr90JIRFaobQHWimkX/C1RqoILUNYmWgZweAYdn4EnfD+Cw8CwXmqJMJ4sLYWlHSdid1ql9Zanz0maXGPXtt6+vj14+2vX64BQhuL2odKtc6f8FytP1EXmSoCBy8IYIbX4Nvvn+RE166pZ0dl9yNE8Kt0eNpeRw/IXXQG3pIT1oFa02Cfcsf9uLS/OoywCOcd7dbaNY29nX9h73PDGBSITlFrFzJBTzU8IeJTvzxTPh90rQ3AZRHO0dQ1dVODc6j2FbVNeHFt8IZKkiRhOBwwmQzY2dlkUS6omgpwKKmYzxaoQlBWIVrBWE8PWOudSmHCWevnrfc9OIxUKOeII69ntau1UorxZIM33voa2WDA/Qf3efDgIaenJ1Sm8cUtZMzu3lXeeedtXrh+ndFwjBOKsqpppKUqCxaLJas8p25qTGNRUUwsBIvlkuXxGcJZ6rpmMByRDYaMhqBlgrWWpqrJy4pVsaBpDFma0VhDVRas8pzpKGNjMmY6GhLHCdYYtBQ0xpIlQ77++ttsjsd8fO8+R0eHLGdzsJpv/8Z3eev1N3jt5VdZzub88Z/8e/7sz/+Uw8cPvBsa12kUreHeroN+0aLXWixYKQL37RBdXGcL092v3qERUlVbs1NikUJgVatVi/784DVZGzi8c9pCr966oIbLLzZHv1RZB7m+MAu0QNCFbEmfOKGFQomWw40QKkJIDYFSCFZzCLfqwfOcI0x4R7GUPsPNSYVSLQDSO5nwC1pLMbXo1oVpdR+1x3ZPvPdB33b+HesZ4DY1GFqw8+cN4WdOrmmh4bidOttblD78gB61xJPGdbC+UH5shF90vDXQ0x3rIXnrencfprfmn/hsBbfbs6ULcCZEhphO42213fMLVquprqkcT43NJSwI8txl9DbiF1Mingm6Wkl0FBPb4NUUYEzNarWkKAvquiKpK1Qgvp3z6qi1DVY4nBZESUQ2SplsjNhYjSmqHGsNUjnUXCGKElk2qNrQNIbGCYQxfcokDmN8MLmyDqUcDo2SDin8a62k4vkXX+Fv/52/ywvPv8jLL72CE5Kbt27yySefcPv2bWazGZcuX+LGtatMp1vgLGVZczZfMhpkHhgXC2azs8CnSQwedGkaVnnOcrXCNBVKCKbTKdb4AiI45518tmG5OKM2NSqKPSdrDVVZooRgKbwHOFIKhSXSEcbUCCCKE5Ik4+o3LvPyC6d8ePsTHj18wP/8P/iP+OY3v8W//oN/wb/8Z/+UWGnefu11nIQf/tuc07NTz8m2piV4/aJdD3G4EJvjPw8UjiQUXlmbKh5j/fTpHJAW6ySq05D9BqpVVWzQaoNZ6tWY8Lddf0tsoEYC8OK+6Bz9UqWtpeBjWoM2Fj73fK6nFHo6oY0mCE63kMWGUAFI2vsS50ClzfLyjiTrFxzhAddKhRY+JLJHl/ZfjZI+KgdpAu610Sn+POcWtKcMaguV63jS0k8hbgchDF11r7BKi242tVqeCg6y4FxboybWr7rVqrvU6i7RpAfW1hmMCBAm2gvr457X6044XHcP/in15r0/p1hbG4LF4CwO76Q2tuXbFdbZoP235t3aHO1vhw5OO01EdJ89ZSI9oTF/tjwTdE1TAw6tI3Sk0VqBg8ViwcnpMZMsJYoUaeIPY43BWkdZ1+RlQVlXGCxSCeIkYjhMGU8HVLbGSVCRIs4jilVFsawo6xrVNN7JRgiHsR4AGgcGixYCYSyNaZBodBJz9bnr/N7f/j3+5I9/wH/1//ov+O53vsfv/d7fY2tzl+u/+zz5bM6du7epbcNqWfDg4SPKskRIwSAbsFotefR4n7KqWC6XaKUZDkcoqVktV5yeHLFa5pRlhcAipKQoCgaZNzWd8VrycjkPHLhEWEtT1xht0dpRVSVCOAZZhowiojgF5ygrQ1XUUNWkccRysWCaDfjWa2+SffM3eOetrzFMUv7+3/ufMJls8H/7v/5n/Py9n/LNb/4G165fZ5EvacoG0/JY3WSBNmxOBPLXAdI6lHBI6zVO69p6AO0+YT9HZypjvONOKhlKvbRONv+vEfhY4nY/t6ZRObpJ22rF3Uv6V6Kac+v4ajlnrxV6Z62n06RSnlprQVZIVJsq3CVQtE4oOnOhBYvuI9YcUsJH5hCcd53pam3nn+i5QxUiXFz/Zj/xhnsnXYCzp2iDTzri2hjtDthcu29b0Kd1yhLAqz2o7KHnCfXTtdpqd0wZ8CzUrehGnDApgsNMCEQ3c9tF5PxNiPZ8Yl29cF2UhOg+J3wexluYEPFkOh1dhuP0zroedNfHrud223O0Vks3qf9S8kzQLYolUiiU1iRxjJaaxjQslgv2jxTjQUqSxmg1RAiHqS1V01DUFas89yZ5vqJsfJyvjgXZUDMyCQhLnEiKPGaZVKxUyWpVUJYllRAgLE3jg7G9xuQH0hqLFQbTQIXgyt5lvva1b/BP/8v/ko9v3cIIWM7OKMuCr3/z+wyHA7SSzBcrzuZznPPxsXmeMxoNiaKIYpUTxTHz1QqcZTQZIZxiVRacnpyyynNWZUFVV2gpSCKNszAYDjDWUBZLVOBylVDkZY5z1idc4NDRlFgPUUJwdHDAZDxiMpkyGGSMN7dY5QVVVbBcLoh0hKUmiyNeufEi0jlOj485PTrCVQ2bkym3b33CD3/wh7z+1jvk129w89ZNbGXb4IA1I7LVQEKwOXTB+O0rYMN25wLEnZ/MNtRfbYTngFUbLC9BiT6ioQ3X89wZGGc74PXah9f0Ws1GOesjWJ+MtP81iJSi18i6xAYPHlJ62kqqkBosAigJFdKB+0wxKfvMM9dqUQ4CweO5yTZszL/6ICxCSSRRiF1v6YV+0WzfbSlFqPcKfdFa0fGsvXNI0K90/XHafzvga7VeWuANERciXFuwbHwkgyR488IesptZnSYcFh7abD78eLZHCat0d852kRHd4uJaHO6vq1OZz4Ow18W8o7mLIT+3CLm1bQ3WCqyQXQo0+NuT3aJm17ZftzJEd77WwdYqEG0I218Ge58Juk1TIYQiVhKtFZHU4ByLsuTg9Jjt6ZjN6YRhmiAl1E1DWTeUZcWyWHG6XLBYLVmtlpR1jqFCxY5kqHAyJk4USdIQ6ZhIaLSULIVAygofVCZorMGZEJsYzOjGGISAwXDIa6++zr/+gz/g1u07aK2J44h5XvCjH/8ZOh5w9co1pBAcHR+zKEuEEBjTcOXKZdIkYbnKcY0B6xgOBjAYYB3M5wuKsqSoK2rbkGiFqxXGVDSNQgKJjojTjNVyQV3WWNOwXM6oqoqqqUmSFIGnaDY3t4kjzXgyociXzOYLhBRUdU0UJ0RxzMCNmC9X5IsVgyTio08+IUszZrMzzmanPHr4CB3FTDe3qJuGg/19bly5xunpKUeHhz4j7/ycW7OGepoBPN61YNxppP18hO678Go4C07ipEAjfOJASOlwOIwFY51/Xu1EddI7gVz/0rSZcn8FmAWAwBsGIG1BVeITHVSr3fY1dLti2118byhy3tZbAFr3kWuP74Lh7xr8H22SgOtMYSl9EW2vANs+K9K1Wq/swMGJ9jvRnbPVWp+CGeeljYgg5HCtGx9CdgvGOjsrggZ8roQiijaJBwQujINcX7jWNVYRtNgeewOWBn+BCHOlA+Ewbmv311oQrlvCXTe2nxXz7a/ZYGyNsA4lbFhcWItS6bbuLZM2fTosMn6sWw26jWhRXfTIF6m50MozQXcwGFHVBcbVgEUpQWP8lMqLilWRU5cVpq4RWmOspWkayqpmmRcs8iWL1ZJlsaSochrjQ790ZBmqGBNZoihCixhp24kLMlfgSqyooRGIoNkaazHh5ddC8sILL/Po3l0ePHrMcDggyzLidEA6GjEYjDg6OWRjMkFHUSDxHU3dcOnyHlmScHo2Q0rFapUHIJdoJSlXS0zQzuumZrFckC9zqiL3CRHKZ64Za8D5oO75ck7dNFRNTV7m1HVNYyxKx6xWK/b3H3Pj2jV0FLE7vUK+XDI/m6GiCKFyBoOMJMtACJRW1HnB+x+8z+ZkzNliztnpGdPpNleuvsBgsklTlcRKs7ExZXtrl9V8jjGGpmloo0BaL3HP27ambkghps8yM62JKVwwv1oNxnX+BSttp+PYYITi+sSKrv6pwwPy+XihTvMFF2KMv/A8/dKkd+JAq7m0INinBYvus96x5mN1pVBdCGOrvXWpIaK3OsLZuvO2VMz5i3Eh21GEhWrdtPVZcJbzXvjexF9nHMK+HRPRUxxtQsunuV/Ra730z6o/5loJyZAZ6ULGYR/jqzqNvxXZEQdtYSBvxXZYLELqcktl0Wudn6VGnou5dW2MeQugT1IBfuFyzoewImxvqYRr69Pj+2fVF/lpF1LZj2uniLTH//R1PUueCbqbO5dYrRYUxQpnTfACGp+xY0ItzjBJlVBo4dt9FKUH3VVesipyVnlOUeWUTUFtS4SCOFagI5SyCGNxRnYTTWr/8FQhKMqaupHUCKQJLUWED/+6cukS7//sZwyGQ8ajMZPpBhub20w3tkgGGVpFHJ2dIqWPULDOMRmPsXXF8UnF3t4eRV5ydjZnOBqQRhEP9x9jm4Y0iThbnDGfnTA/O8Vai1KSNIkZZymTyYTxeAwItNJMxhMiKSmLAlN7rdeamtXiBFxNohXHJ8ckiyXD4ZDJeIQej8mLFeViSVMVWCE6KsUYy2Rjk7IqyVcFr7z1LulgRL5ccsNaGtuwmM9RSvL66zA7O+Hs5MinqyJC1lhwsD3hjVa0BmSY6CG4u7XmEMG4DHPQCdEl27S8pYAuF94KXzhFWokVFuXaF1d6Z12vP7TKCr3O/esVzwB0rx0AQsoQmijPAW7749N9dcfnStcXummdUz7d2Ycs+UWwBZPWUec9+211Kv9u2U4D6wzsVrttnT1rBXHOv+PnR7PlNNuv3HkEDd+0KdkuXGtIDw6LUGuRCNdq78LPGbGm/XqzoHMutjw/qPA622DxGED7xVz4+Gd/GoUT1hfsEcrXFml507Vb8PMpxNLiA9BaP0V7f/3C13PSPUB6+ksQouLCV6L7aQG1XyCFU74+xTmaZo0K4dML569cZWxzc5skHTCfn2LrgqqqvAOrjZXVkQ8KR6KCuWWso6wqVkVJUZTkZcmqKCjqktrWGFd7T7AUiEhiG0mcOmwtaTMi4yQmjhPiIkIvc/JViRRQSxEy0xSDwZB8tUInKbvDCVsbO2xubTIajtnY3PK586bm9OyEk6NDirpmY2OTxjTMFzUvv/IytjGcnZ6SpglN1XD74SOMM5R5QWNqHj96SFmWpEkMSGKlGAwGTCebxEnCYDDEWOfpgShmNBwTpwPi45jlculBR/gQlcVyjhAOaywb4ylZcoPJdIMkTakGFSdHhz6hxDmWyxUKgZIeGuNsSLnKSeKMq5cvU5sGiWS1mSNNw3Q65e6dT6jLnNVqgbMC5RyNbY0wP1lUpwX4ySLDC2WlV4f7aSeQDowME9v1k7Ofr2Fr0RlgaCXAypChIzs+rtWyO7NWCHqHyK9b2pc7OH+k6OZ378jqgRcZed5yLfOyM0NbbtTvRZuF1ufzt2DZ88HebDfnzWjEued2LhOt/a1z8vSm7Xo92vPaoGiZjPaRhJC2T2/rz+6Lt3dAvZZg0N4ZwlMKCO3jmhGBI/WftckyTiiEc4y3X+fS9d9gvDHFlScc3v+ARwcfY5pVAOQQmujaEMU+4+3p+u7as4Pu+vw4tvUhWu09LHVOYlzjFwHbJll1y1tH9bSj4HncNqtwbcES4jPB9VcG3WwwJIpSpFQs5icsF3OqqgIBUeQB1wkfz2msozaGsq5YlQV5UXjQXeUUZUHZ1FgMSIkWEcJJbGNxTqGlItKSJLYooWisIUkr4iImSWJmesFqmaOrUBxHa567epV4MGI83WSysc10c5vpZEQcJ6yWS06Pjzg+OWZVFmitieKExXLBcDjktVdfoywKTs7mDEdjqqrg3v17lEXJcnHGYrkABEkc8fprr3vNXkqasqKsarIsYzQckCUxMkmxztGUJUVR4NwYIWF7y5CmKY1rOD46oa4qH1ZW1yxWc/YPDyirkuFowmg0wU43WSxmOOeooor7Dx5QFwXD4YAkSTk+OcKZhutXr/Pa2++yubnJtvD560Wx5Pu/9Tuczc4oihyhBHXlY6Jb/c2/KK7XMAUeUIMbW4pWlxBB2+lylp7QBMKr7hyq1YTw2pGSDicDSDs6rVbQphoHEA+Ux1+F2gvQ3rXtONoWcD0IS2+Khjhc0RXGkaGsY6gC1qbt0Zv8bQZab76Cf5kDdeOsP28XuO8B4zxwug5Q3JMg2Vbrco4u6aXdpz3KmvOspdgIzwdChua5yAZ/3HU46vE5zKauf1xYOFA4oUjGu2zuvsyl6+8wGU2xzlIXC+4/fEhzsOLN8YvMasGfPMr5xm/8p3xnKDk5vMPZ7C5nJw85Pr7DqjhFqYg4VsyXx2AKpKvWtOXzch4AQ4RHlzovQy3eNXi2PrEdqZFOdpqqn+Nyba6LdkT7ok4hRtfaTwPrOs3zefJM0BVCESearBnQ1BWr1ZLGGu/NVRonBdb4MnW1MdRVTV6ULHNvEq9WK1arnKKpaZxFKIeWConGOYWnH705IKXzhXLiBIslqRPiOCZLEnSkiWLFallQlzWRjhlkGVVRsbW1x+6Va2RZhqsLjvYf8/HNj1ksFlggywbUxiBUhDOW8WjCwdGxpwrShJOTY+7evct8PqcucpTW7F25xje+/i7f+fa3uLR3GaUjVnmBVJKz2YzDxwc8fPSQIi/BGbIkxsWa7b1ttra22NnZJk1ShsMxKtI0dcXJyQmf3LrD+++9x61PPuHe/Qes8pIrQjEcDplOJzTOcnp6ShzHbGxMefhgyf7+I8q8JE5imqbhzu2bHBwd8N3v/haTzW2KPMeYhheu3eDS5SvsHzxmlee+kEpLBwjRqTnrSU2tudZOyxYkO49z0Ix6OAmmYwDlBhHANWiC9Hn1zrX56D6+UoaIiJ7C+KtBMLSZc14j6iMRfJZa0F6lAtU2pexrNXjtrg35WjueawHX+AUtfHfO6UUActdW+FqvSeBTv1s31TrofioSwT2pXYlzANB9I1prpk2MEd1z6nXJFqF6E7slFixtGUtA+IJP0nm6IBnu8cqbv4+avsTm9h6LVcVhUxIPB5SyYv/gI148fED+8Z9w4+W3+GV+yL/+4H2u3niJN7ff5Y3nvsc8XxAJGCnBJPVKzfHqEZ/c/RF/+Ef/F0x19Klnd37RdoHC6aM5hGvjdc8tQxgrw+iqri5y6/htF0UPwG1SUA/uXsFoTYZzp//Cs/nZBW+qGhXSfJXSaJ2QxL55nURQVTV5WVKUFToSrMqCVV6wylcsliuWyxVlEWJIJaAkkYpRMvYV8513XiHACYuOZdCs/bGTJKIyMToRxIkgSSNWiwJn/AuRpQlCJeTLBU25oljOuXf/Hnfv3CHJMqbTDZq6QmpFU1dsXbuOEIIo0qRJyv7+Y+7cu8PZ7IxYKS5fv8G3vvMd3v36u2ghOTw64ujxe4ynU6rGx9qOhkOGgyHvvvsuTWOYn50iEMRpwnAyRThHWRQUq4L5yT0QktFoSBrFvP3G63ztrTe5dfs2P/jBH/PwwQPu37+LqWsuX7nCdDIhL0pOj4+QSjMajcmylKODfQ4OHntrovTheEWZ8/qb7yKAPM/J4ojNjS2UjMAWmMbPBP+SnM8Uav1bXinqYxDE2otpXeuI8y8oov09HMTi62q0jgzwYWUiBLGHSW+Fz+AMLBwWh0J4HvivQMiYT8m1PrdBhljkrp5uWwSnL/2oOkAOhcyF7ECuB0bf4rxd6DqTvgPdNgkBekdUeFbSa7xWVIETbWOfP0PzDT8txK7zmGBak6KnBtYccO3zJ2jd4RBri3H7sNs45rDoBg1fKMX0+vfZev47/OTuIeXRfXjvI6yKKbd3GPGI4vgQcecB4tEnPLp3G/fjH3JgYg6muzy+85DHO1dIpOGNl17ByAF70w1G0y3QCZM05XvvvspsfsaP/uQ/6yia88+vVxp8FaH1+NvwXERwHbb3jvF1WZDBudfW6w7qhmsBV3bccs8Tt3yz4Auj7BPy7JCxuqRpoK4bn7KqI9J0gDEN1sJ8ueLo9IxISJJ0wKoomOcrlqsVy9WSoqioGoOTnp+MkohEx+AkTRMKXAuf6y2lr/iVJJF3YmhJZDUpGp1AHEmiSKOjiKbwNRzKMudscYgQijSJqcqSR48f0ThLLCVVXdM0NeNkxOWr1xhPJkRak+qIw/3H3PzkJkcnh+g45u23v8Zv/9ZvszGdcHZyyuzsjOVszmy+4OGDuxwcHtAYQ5okXL58lRdfeYVsMKSuG4bDEQ8fPCRKEt5/72c8enAP6WA0TInimJ29K1y6dJXJxhZRpLl2aY9/9L/8h/z7P/kRP/zRD7l99y6L1Yqd3UsMBwMiKTk9O0WhODk9YmNrh8ViycGjh9S1J75v3/6Ek5Mj0jQjTVLSJKOocoyxFHXdaVhtDdK26pj/O4CBC4474TrNwAXKoTdhPT8rQlIFSF9824LPrPKTT0kPviqYdeJpmpgAaYM53xbA+TWLNQalw4vVUgodga098AqNFr6oTR+D6ljPIOvSTp05d7/AWk3i8LcLWll4Br64C2Ghat2b4bl1YXvteey5Z+M13jXqZw0IOg2t/TZQPK1DqXNxtpfr/Da2+2mvr20V72N2PQ4p9O43mY1e46c//RjXLGlqh8tXxNMhy6M76J1NDh4dk+Q1Q0DWNUenSxYbV5lEI9K7HxH/8gfUWvAv/w1w+RXklTfYuv4ir17a4J0rz7HXpPzmt/8x9+/8KY8O/qzjzlkHUdcWhWrjMkJMuPPX3XKyQthugTSuoa8Hoda03LBPuzCGRbFtrS6EQdK2TfrLzblnt+sRgqrKyfMcZwxS+Ow0nKOuK2bzwtdfsDAa1BhnyfOcfLmiyAvq2uDwKbJJosmShFgmNI2hpgLh6+YK7R+2VAqtRGgMCInyXJGOPY2E9JzuwlSUZUFTOmanxzR140Ou0gHG+mPa2iAHgsEwY2Nzh73dXYbZgMl4zEcff8Sj/UPmixkIydtvv833v/dd5qdHzE6OqcqS+/fvc3i4z6OHD3hw/y5lXYJURDri7r3b/OQnf8J0Y5PtvaskUczZ2Yy7dz4iywaczRecnRwxSGK2t7cwBo4ODhmNhjz3wksIfQXpLN/99reRSvGDH/wxB0fHFFXF1uYWk8mYzc0pQjiKcsBiOWd3d5f5bEZ+eozWkjTLKFYLytWKE+fY3NhCJJqqqRDCJyzYAKTtWyVCeVIbOFbhWofDGs8nCLxXoATC90K4zhSzodOFE77Eo6cWvFFsAnDIMNH7LCoPIm3BrL4c5K9XjG1QtvEp2622z3kAbiMYRKvpEcYgtA13LQ9rHaHqEJ/WhPwYtDVrn+RRzxWdwadZOyQG32Gid3q1x1qLCmn/s3ZKf5kynNn2n4YNTBcJHPYNgNtqz62m246Hcu0CEzLStl7iRF/iwa33UYlh8tw2pZXs7DxHJuCsOGRXxWxee4nZ0WWOftRQyYriG8+z8dbfwv7gj0hv/YQIB8+9RjaeYOenbJU/4ocPf8rd51/nZ3fuMc5Sdnev0Exehv0fBypnXQs/P8TnKoWJ4JlfR0cRymsSigk5gZC1L3gkdBhg1dExhJEWa+ewbeaaaHn6tcN/AT/FM0FXBa92UxdYY0PgMyAk1lmKsuZM5kQqoqw87TBfLFgsFhRlgXUNSkkiLYhCYXMlNE3jQnX+UIBcBE+99NWbOgCOhc/YUb72QmMsRdFQV/5lSeKE+WxGYy3YhkhpitxX8NrY2EAryWS8wfVrz5FFmtVqxcnxCUdHR6wWM+qq4qUXX+J73/4uSTbEOcEnn3zEL977Obc++YjZ7Ji6rnx8n5RUjQHhY3JHwxFSx5ycfUBZl2ipWK2W3L9/x4e1SUVd58xmp9y6fRulIybjEVdv3+LGiy/z6iuvUjWG568/z+HRMb94/30ePXpEnhcsV14jLiqDs47JeJOT4wMuX9ojXy1xxpJon0FXlBXWWUaDjJ2NS36u2LYgej9dOmbA2jVXjThHGfh3t1XP+gB9KxxatDSE39LSlsn0cOqcr10sgznXJcEGK1uKDpqCLtIylr9esVisa3Cuxrm4hbFwZZ736xMG2pfdF3FxTnTj0SUxIFlTPDvpKYjQ9iY0i3RrANc62vyIhgw30a6Dtj+maxc02zk8uwgDERFpiYoGpNmUNBnQOEeSZNSmoVzMyKsFq+UR1CtsRz21ziOLwYaaHf7T1mJqt3Iiphw+z2NrGU4rfuutTaaqRrmCjyJJXq34/tYG16Ypm5MrmGbKj69tk43HqMuX+XBmyS/9L3jp1RdJrWD/pXcoxJSHj28x/OinXHZnRHafo49/xrHe4e7yFfaOb6NpQ9rkWnzCedV+LcqYPkyPLpqirT/S+TTwcenW1cHi08F6a/nsvvBpFwpI+2YFZWIt4sF9AfX32ZquE11l/LosvLklVChYo4jTDCcilrWjNgswNbP5jMVqQdPUvvSi0uhIkkYpWkY93xLSL4USXalE4XyAvsUXGlFKIbTDCkncxESJIUpKVOSjEVI96Eo8zlc5xrrAERtOT0/YvbTHxmTq60FUNa5xnJwec3R6zGK55OrlK7z26mtUZcnHH/6S/UePeO+9n3Dzkw85Pj2jKCtMqHomhV840ijGaI01llXRdouoiZPU12AwDXVVU5YljTFdPQrrII5j7j96xMPHjzDGcmlvj/Fkyo3nnuNg/zE3b51y6/ZNLuUrNje3aawjTmKMaRhPNzk82CeOY1Skqaoi0Dy+DF8cJyAUkdbeMg4LY4eh3YIvuvc7MAPBnGo/OLeu0/ZIsy249lMaB1jn40uF895sK3y4mutAJGzrfPNER4vz4q+EphtuAmcN53nM89u0Xv+ubkJbfrANkwLWedGnaTw21FWwYSXqnW6eklnnBmwL3ghP2eCo/cXSaW8OpIoYjy+xsX2DrZ0bPH/jVaJ0EytSJmlGMsj45HTJhpNsDjPyJkdQU8wPeP+jP+XjD/+Yk/1PkK4OdMJaV4h2gjwhzeAyD1czkg34zrWUr0cL9vfnLBclm+KQq8MENaw5mN9itZXzwDV87c3vUSUjFk3C5rhksJjz/N/9nzHYGNMUC+bLmo+GG6zSa7x7opGzE3Z39liYmqPhnNnD+09chWgfzBOfrX3X6fJtfC+dNbM+30W7IArTGQMizN++gH2Yr6JXZdYdnXTP8NPj9aQ8m9M1jXce6BhETt00aO1XiTgZkA18/KpwjrycUy3nzGczyrLAYVAqJo6Vj7uNEpTS2KpBOokSCqssCBtifP2aaq1ENITYP5BCo3weBZFyKFVibcHZfEayNUIrDbbGoCirio3plIeP93E6RilNXVe+l5oxHB4dcf/RA8qqYjKaMB2POT18zJ2PPmC1WnB4eMC9Bw+YLxbM85xlUdBYhxKKKJKUTUOuKrSQxEqjtHcOqZDVJqSiLAqsbWgaS9nUvn5EiJetGm/GmtsfU+YLnr/xAltbu2xdvsJ0OmE4yKjrmkcH+1R1zWg8wYSmnkWxYjCecHx8SKQ1p6cnvo1S7DPj4tjzx5PpFFM35EUe+pn10s0HIeiCyR3eDBMEjj2YTiGhouupRgu6rQc3HNH5Ty3W87TgNQZEaLgpOi3DAiI4z5zriwv+WsWt/9v3HKOlW9r0Z+crrrWxuXJNu2k5YCds4MjpeV8bKl217alsyyuKUNjGa1DrVQV7kT65gjamVwXTVjGebrJ76RXefP27JJPrlEZQN5JjLPunFZvG8jCr+fCjA64hceOUXy5L6ga+Pc7Q2XU2XtjiH7zxd3lw78f84R/931me3PR9yQIQtbh0LnwMxSoasnIl192E1SrlX54eUa9qmtzgGsNVtcfB/Ye8+eJrLH75kCvX3+DjW3cYDIf8eSypJxvIyykH7pTm9vvohweMbt/lzePHiKrhjnPspJvoKGYiar4xGPAjrShLHzbmXK/fdkDaXaN/eJ2z68lH7c09ED65Z32vdtF0+Fq8UlgEkT9WV8bSD4pr/0WsrU1dnuYz5ZmgW5YlcRyhdYTSCcassKbxPaHimHQwRDpNXVWUxZK8qFiucpqmQSrQCqJIkMYJUZTgrKNpbChF6I1UKR1K+QnmrG+/Y1r9y4XV38lw0/7HCf/yirAU6VC13xf1dmxOpzgU1kJtLdPJlIf373P/8SOKsgRncbamrgo+/viXLBczVqsVx0fHnM3nLIqSqrEMhhOklDShBVAifS0IYx2VMMRWoLXqCrzUVekLvxhHVRssgsFgTJLElFVFvlqxKkpwYMxDmrrm+OSIjdNjJtNtnDHEkbcglqsch2U8HNM4X3ZvYzom394hjTSLxZk3fKxjNBwyGg5x0rKxvYGToGcztBCg/MJgQucLhJ9bxvrFwIf8hWydsHS3vJ6UijbsqdMaQqpwy9V6S60lE9oJHDQIWpPOT0TpPFXRmq3qi6gFX7qs6e5ripMHQnEuztO6PskB6JxU/vcQWCdbkxPaYjQuZKQ524JuT/CEnekuYE382hfqL1iH0im7V17n+kvfpdY7RKMhxyLj6ChHKsXduuL+Sc5vWsHN2PHLMmG7MmxNBvxbU0Ad85oQfOhiZouc1GmWeUO9/Tbf/3v/O37+h/9n7tz+IUBIE+cJEPFpEyu7QiUSsTRYKZFFykBGIAqIapbLE9Qo4een+1zevsoDW2OaM9zpbX62fESaJFwTI6qV4uj+Q2ZK8IvZMZvZmHvVjPHWFe6RM5kOuDLZQVpIpKLEnrfYAgXSj9b6r/1s7KJFIKiubeLFeh5itzUO01kh3qGmvbOtpY86LTkksYgQ3eFa1eLZ8kzQnc0XbG1u+D5icYppah+CBURakUQxiKhbxYuqoqprHA6tJDIClUiSWBNJr4kaY7E0IRXQILVEKoGw0Ji1QO6gZTgnsJY1j6pPP05jnzgxHo1YLH3IlxEQRZq9S5c5W+RESUIcxTx4eJ/9gwOKsmB+dkYUScbDjMXijMXpCfv7+yyXS5ZlSVkbyrpGSsVoMGK5WpCmMYPhCFNX1GVJU9ckcYIPsxYoDY2FWAgqaylrT0lo6btNOOuwjSHNYkxjKBuDXeW4w32KumK+XHL5SoPUCrMy5KsZOopYrlZY41sEJVFGvprz+suvsJyf0VQFOEjimMl4SpKmxJOMOM0Ybyu29i6zPZ2wu7dHmsZ+okoR2sAImqqmKHKWqwWr+YK8KLAmgASCsqzIF3OqPMeZhrJqqOrw/AJlYpzzE6jVbB2hEpbtyzgKD0iCwA2H98HSm2W/TjkPtOHfzmHmuVtxjkoQa/u2O/rPpGyLwojOTLdBu6WrxGYg8LMiaM2u1ZTWjt9FJDiHUCnjS6+jr36d6WCX9+cF18ZDHtw/REeKN0bb/H8f3uOhTHm7qPn48pRfRhFbwNcnY95XObke8K5M2Eojblc1W2nG1zc2+PnJPsel5eXxNV76jX/M4/3b5Pn+2l3KcK2u0+pi25A0BUYkPDhY4vKKSGnSWGDqisFQkWhBFhtwh4iHj8lwJE7xzbNT0sZhiPgQi4linLW8e+k6WmhO6oI9EhrtGFLiFjmzKCfPT3iifcZnSE+JdPz82prWWtTOWdomlC073D1XQpw1dLWHhWjDKluNt01ykU9Qcp8/p58JukfHx6RJTJolaK3RUUzdVNRNTeosUgpab6Axhqr2aruKIUoESaKIY43Uwn/f1F5TdBYhDEL5CmNKSZrKBeeA8auRDJX/nI97bIu51LWhaRxnxYLrVyRXr13lzl3fKlqmknQw5NqV57hkavbPzkgjxYP9fU4XMxbzBaau0DpjmKYsl3PKsqCsKsrG0FhL4yzSGTYGGVf2dqjLAbcePCaJIuIoQhjLIPElLeu6IlUaJySVMahIUxQ5br7E5gWpsFy+9gJ7meRnNz9htZgT66irblQVNWdyhgCK5QxkRF3XGFPTmIbhcELdNCQ4kkhw9caLJHHEzTwnTVKcdago5sqVq0it2JhMeOP1N9ifzaiKiuvXrvP8tWvcuP4c440NojjqlABjDXVdsZjPWcxOKaoSH5VSU1cG6xynZ4ecHh2yOD1lPl9wOjtjPvehgBYHyqKj0CAUn2FYlhVlWeGsQycRyWBIlg3QUUSUJKRp5p2MxpAvlp87Qb98aTPoRMvc4V/APiXkvFIqOvO2fZk7qHS9o9HhQdb/iNAgscHH74LoKmCIPjvMSSwK8MDsEGxsvEB87Vv85Myx2rfU7LNbLrk1jDi0Oe8mY/7fCj4aJLxYR6SXRhxPNb+ZbvFWbfh3riEebfKOiNhsBD+o5uzEGS/LiF+cHrLMMq7ECWVZkG9d5Vu/+Y/5oz/4J4BZy1704yHDopC5ChFP0E6SJQkrU9LUS1a58EWqTEQdDahKR2VKzLLAIcltTapiTl3BeDxgNTvkuXhMHI9BaaRMePvSS8hoxDCJKeoZo6hi/6M/pjYrP9YuRE+05S/PPcnO7Rd+TPdNC7jOhogMEVK0xTpcrmnLnSPNdcdzmL4k5pqzDdG3pf+VHWn7h8cMBynbatM7Z6RE6QhTlzSBJ5XCOyGsaTDOoiJFFEVEiSTJfEaZEoraGkxjcLZGSAOqQiqH1EAoSmhtW7czhOoI0Q0u1pvBddNQNw1FXlE3hijWTCdTTF1icESR8u2kDYyHY47P5pyenTKbLSjKUPfWxBwfH+K7R5TUpqa2jadR4pRi6XhuqNlpDvnodEWqIYozhINLV3bZ2tpBaUmxmCGcIC9K5osZw8kUJwRH8iFVfch2arnuHtGsFNoYUq0wQpNlMVif/ukB0DKfz0gGE6QQngqQkqosyLIhzgqM9XUBmrqiKHOSJENrhY4jXn3xBR4fnzIcThhsbFDYO9QDRzIcMZlO2du7zOXLlxgMh72zyEFd1+TLJXXlky2MleR5TlUVCAdlXTA7PebxowecnZxycnrK4fEJs/kCJx1RLBlkGq0ItIqlrgxFUaLimK3tPba2d5lOt5hsbDGdbJJmQ4yDsqiYz04/d4J+2bKeJdY7y85/78IGbWWwvsTf+v59eJVPi7ed4+x8Nlm773nesY3dtQGYo3jIZO8NJjuv86PHllFd8iifUecV48jyi+1rfH9wmQ0MH8eOvzve5dK85L+TZ2yWEc/VNQ+ujKjdioktuTwTPN6LuTaYMl6VNIuK5tIQcXjMxKV8QMFz0wn2xW9x7YN3ePzwJ+BUV/K4zToEQVws0eNdSieZTjbJFESuQVrBqpgjIk2iFKPxFGMrkiihsTW1MWwMNijzUyJb88611xjrCRWC+8sDdkfbvKKHzBtDNtQ0Tc3hgw9oVgfhGtaeCz0U9t/1dULWt1p/NuePsA7QXnret9+qfT4tbdRu2BZ+t6JdBFogfrY8E3SPT07YnGSkiSbLUhS+v5lSGinBmtqT+6bG2QYhHTIK4WGp9mZxHINT1K72HJe0SGUR0hJFChWBbQw+LVEEZ4znCi0GLQIkB61XIhgNh7z64qtcvXqNRw8eMh4MOJ3VTEcjkIplUbAqamaLOVVd+5KLpsY50JFPvqiKHCkFxtREWhNrSzYa49CMBxOWcUxlNDZJ2BolbO3uoaRkc2uT6WSDpjGojR2ssxyfHJENR2QjX/DGrEqsFZwtTrlfJOQNTLevoHQIdRGCYrUgXy2RQtBUFUVZE2XOA25jqGyF1r5ZZl4sUcMxR6e+8JAUkuFwDM6wt3uJX3xyk+HGJienc5xyKCSlraiaylesUpIo9kWE0tibQ9ZamiZmNEjJ8yJEW1h2dwVN40t5lkVBvrPNxuaU06Mjjk7OGD9+zMnZKdYZ0ixikMVo5WsXWGNpal+8Zbp1ma3NPSbjDcabm2xu7jEaTtAq8gtnVVKU+edO0C9f+iwyu8a9OkEf72lDFn7gVy0ghVozY9ttw9/OZzytZ4GtrXVBLNZ6uqelI6yrsM4xGOxgN17h1jLm8PQ+qqq5YwWiaphOhvx8usGLtSPTln81kSRGolcNP9obkWSCiaiYnMFdk3MpqrkSC8RozD9fHCNP5/x9kfFwc8IPHu/zH46HlLOK8UTC8YyFNVy/8Q0eP/gZXXZbqwAF7TwWGh2lxMmAs9MDrm1sEEtoyoqd8QiDZVWXmKYk0wqpGjAV42zEIBowTickKkYLTRaP0Uhem2wziFKWecFoMqaRNQ/3H3E6uwfOO9Zd25k5AFvL7QY89GV3RKuhPplm3hYaakuPEurGiJA0Efj61nEY2tJ3Lew7rlbStqzvoL/Vir9AjC58DuguVznz+YI0URgzJNYREoijGK21V76dxVpfzEZriSFCa59EEccJWsXUtW3nLT4R1CCUQEU+vdLgzVnhY51oWZU2t6Qtbqy1ZjKdsjmNUU6yXC5Jsoy6LNhL9pBSkw4y8qpikZ+RVxV1WbDKl1S5dzZYa/ykKA2R8gVMsnQAKmZraxchJPlqRZSmjMdTLsUJgywLGXkxk/GYycYGdVWTxjFIQTYYYYzxTscoJUJyucxZzM6ItC+GYpuG5WoB1hInKcdKYqxFSf84y6pGr1a+20SkobIYY1mVORvxhHy1RKQp0voY5DhKGGYps9WS2aogGky4tDskHaRc2d3jbLVERApT1zw+OGRV1KRxwiCKcc4yGqSoKKKoSt9+RgiyLCUdxCgpaeoSk2VUwyFRu4AOBqhYk44HNE3FYBAzzmIi7aegcQ22MQyyEePpJYajDQbDCZONTcajDdIk88/bNNR17fnNX7NY63vt9eFcBmMNoguiByGlB+IQa++rjbUaVqAkvB1Oy8O2mmsbqrSu0fZ/mg6ofT89QZTsEG2/yy/PFJFt2M8LXtrcYV6veNUUzIYOuTPmrXiPW5xi3JzXok2eiyQPoxXjpua52vJoJ+b/uTzAnp3yHxdb3MlW/Ky6yR4jnN3jD1YfsECQu4R/S46+t+B6HLOVKQbPvUE22qNYHiBD+UYrI6J4zMbWNTavf4NltsuDk/sM1AMWszM2k4hYRUTGJ92MdYKOBwjhUGLIxnQP6yxpkqGkpMgLSDNsmjKoHdJatJJsX9plURxz8+M/ZH//A6SrOlwLumYYvrWylGE1a+vqdnHVHYfbj38vrlstbduqyD+g4CDz+zxB269RSOsu1RC161y3IDxLngm6q6KkyHOKPCKKHI2OiFSMjjMipZACH9LUVIAl0golNFHkiGIVstfANn7CBqXLm6aRQkWqM9WM9SuqaG84hC5ZvAYihO/AkKaCQTJhPJgghebg6JjGwTBNGA4G5LVlscrBOfI8ZzGfk69Wflikz8Qqq5pYK6SMaGqDUpqhSoiUYjrdpJ54LnU8GofrN0jp414HozFSKCJlsHWFsQZnGoZp6ttxa8Xm1gb2xHWONq0kdVUiI4m0UDW1LwvZ1Ejn06xRito0PqNOx7jKpzBb68tPbmxu4Jxjd/cysVYM0oTTsxMOTk6wQnN86qszXb28w3Q8ZHc0oUFw+PCQWx/fReuY6WSK0IosTYjjyNeESFKUklza22JrZ5Mk9mX5okjiXIpcLRkz8gV0BNTG4CTUTc0g0WwMEyLlE2na4jFpNiIbbjIaTMiGI4ajIekg6SgR01jqquxCpn6d0pr9Leia0H8PFArP0QkbKo05CcrhnOpaendpw5x/rdvqXe05vEbdmp8hlVd4KqINIXPxNveqCY9+8TFiWXHoGjYmO/wkqXk93sDcyDiexnw9b1hlCw53IjJRUjQr/mSww784u0lU5PxDe43o9Dab+T2G+QmRu0YcNXzj+Ba70SbVICcqH/BCPGU5cczK+7y79RofsOStQjHMG15/++9xvDqmaBrGwylbWzeYbN/AxCNWThObikNr+eRwn6s6I2tq4romjjSREDgjkJVD6cQrNQgaDcuqQQrDcLyLVgmmriGJGA2GKCG59+A9PvjlH9CYOXKtM8mnArHculZ7Pp35af5Z7zhbd4KuWydyjZLwz6XlZj0ut/E5IoCreCIkrVsROrrjWfLskLGioqxKpJLEcQw4alMhTLQ2kQzG1L48Y5KA0KjI+NKPQtMY317HYUAYhLJIDTrWRFrhTA+yPi40pPlJkNIPgBSCJE7ASRql0TJGRxFlXmIaQ+0EjanY3LxMdTynaRoWqyV1VVDVvjOvkjYUnxaURYnKUogEURqHAuURSRwjnWOYZJSRoSxXjAYjnDGsyoLr12/4zqxNwSBNQ0KCgEDO18aXfhwMhjTWcXi4z2Q4pChrZmfHxHGM0NrzyEXl+VpT+8VGSt/yBryDLkmZz0+ZTjdxUpAXBaNsBM73J0vTjAcffsDZMmcynmAFlE3NydmCNEkxtmI+X/D46MhzqFXDfeVrVwyygY8LHo+4tLvDSy/e4IXnrzEcxkDIEsRRlAVIi9Yh1jrNSAcDsjJH15JBqskGMXGkfLU/61O4ZRSRpRFJGpEkMVEk0ZFAxwKpBE5KpIhwTfW5E/TLFm/Whx9rME3j66yGlhq2SwX2ZR+NA6e8F1t2fdLWQNetcY2uT6VugbV9QdvOBE5YX8uiGfG4yCjziubhXeTmJps3XuHaaIfDqGFntMd76oxVdkI8eZHKCWaP7rGth7zaxPxI/4LB8fsM8hrHjL0Yvn2yT7WY4fQROYbN1RkTdcR8eJ/tqmJvlLMqcq6amok4RDUz7g12iOucd1/7Hr//yjuc5iWZSjmdFcRpQm0rZnXFe0cPeSAtxfNXuXXzZ8zPZkx0wkApNpIUJRVZptBSY6xDao2Wmigek8W+ZOyiOuVoeQ8WDdGJ4vjoY44Pb+FcTTugnmb0IkO4YvulN//Xi9msWRznQLN7OmvcbOf+DJ/323WHWOuQIQI4t87PPpy7Jb3bBfZXDBnLQ1bVYDRhc2sP5yDPV9RN5Z0tQNPUNMagdESKzzpC+ephjXHUlW8w2diQ7S0kkYxRKkEIHTKdHMpX2/X8l5RoKZHK4qQvkmLwTSmVkKFXGyRJ7AvjRDFGCo5mOYcnp5RlgZCKOMrQusRaQ2MEUinv/NMRKklxzvn0YyV8QfEopW5qiDTOGuIoYjmbMRhPeOml6yRJQqwlly5d8yZ5FLFaFcRaY0KzxbquuP/gEWkS8c7bX+PmzY+p64KdvUucnBxjm5o4jhkkGU1T+u4SqqBqfHF423iTs64rhJQsV0u2traJksQT9hJG4xG3Htzh7v6+L4ATuOqFlKhQNSuOI4oypypLauNjbrEOjPePO2MYZik7u9tsbG1hLKzy0gNoFFFbQ2Mb3wGjMUghQ1foCKmVz6cQDrr6DSI0b/QzuCxXCCURWoIGqzw3L5SmMbZvLcT4cyfplytt1IyPLrC2wdYCExIiOoeuUv3LGEoCOuc7BcsuI+3ca8ynTdo1ESJEOIBzGXcWGQ9OjymcRQ7HVOMh1+qKD8Ux188U1daSZgN28hmRnvELazg8/YTCJizY49uiYvPgBDMvEOaUPIvR+ZLYgs4MZ1XB2AoSWXF4OicWGqEds/KMqUh4tFqxo2IeylOu7l5mZQx3lzOfgekqVKoppWUm4MwY5qll98qY/JMPKaoZj/IckUQ0WlI1ORuDEc1yQVnXjCZTIpmgdMpwMMZgufXwx9y7/SOq8tSzr7Kt6mVAKHxHDa+AOWGw7bOgDc8KAOtDT8JItxxmy+fKboETbZ3nFoBdH6fbAbMLC6jzONXHYbf0w1pES3CgtY/a+2A/X8uFzwPdoqKy3qTe2d5DKc1iteTk5MCnuhY5ta8hSBSnKG2pTY2xFbbxpnxVNFS1r7drhGdppYpQVtE0Ctv4ViU41bV28XUFVRhcf6PGOJJ4QCxSkiglTVLOFgWj8dj3IcsLjk9nWGvQcUxxfMyqKJBSUpWVf3FClEWSZejQ6E9FMYNIYxqDjQXD8cSHlUiHtI6rL77IYDiiKks2J2M2t7ZI04yjw0M2hwO0SnC24eT0hPF45ON5Ldy/f5/5YsGVvSvcf3CHe7dvMRyNSAZDhMWn65JyNjsm0pF/+fBp07EQ5HlDGic0xlLmBePBiFHmm2D+/PF9Hh0e4qxBK0lerJjNNNgmpGKfsgzlNaWKQno0JKnvIbdcLdmoN8mGGUdHR6RpwjCL2NoYo4SgrCpfXKhpKOuaqq5wznPqWTYgTiKoJYlShAYr+KwtH9rnrKUxNuSz+AiUsikRucbiMx1r02CM461Ll77QRP2ypE1c8G2MLdCEYKkG1b6sQmEda22IQAjZl60MDt4QzdunmbJOL7QigzHsY52dVZyuUg7vHaKFZTLeJE0T1JWXGZmau3bO9Rsv893xJkeHn5DnUy6JnEIckZyckpaGqjpCp4qdvKJwgoGWGGdIdcQoSrHOoLRmHGWs6oJIx8Qq4mi+9LVOWLKqG9LxlFhHLDLNmXFcpqGJYpamZi4FBkfuHLUyXJMJ5vYR9w5u05QLJoMJDsjLApWmXfKMxFNRIvYOq5v3fsbjxx+QLx54vTEUf5ddFEHrvAq+HWHoQsE6dPRZfq3e2dE2Tqztu5ay0619Yu0YwZoR7dEFsUyZ6AmjJCM3hquXXuPB4W0OFnfXtO0WXF33LP2T7lONP0+eCbqLvGCxKrFCkg3GDIcjBqMJQjpOjg7JFwvffFHF6MjHjVIrmrKhqRrquqEqGl9VzFoqalTkG/4JFVYSA00JpsZXhwcQisY6RCORWhKpAUSGemWopSXNIsraEGkNtsAZQ1PXzJYLVqslq3yFaWqcczRNqP8bhWI61pGlKYM0pakKkkhjjaFqKp8EohQ7e7tk2dAXrVaSoix57vp1dnd2SJKEJEoRTpBkGUdHxzhTs7OzS5IkOCSTTUjHUx4/vMfNTz5hMt1gMBixKpaYusYYi3SNL7ZiLEiNUBbjfDufqirRceQph6rEAKUx5FWFNRU3799nsVgQxZpBNkDqGGcanDUsFkufmIIvXLfKVz45UQXNTSq0Ur4YUexDziaTMVJKyrrBGHz4i/FArZRAK4Ux3quvpfL98LRGqxitpQ8ZEw5q5+OxTYnQESrS1HWNKHJsvcJgMdaF4kUGPs3UfeXShor57LwaKxSY3jMtrMBKiwhlGxUqVKSKaNOiXWiT0em2n+tMCfy3dZRNxMFxzsw2VLtXmFjD2bUpe+WMX744wTnHJM35o1nOe7d+xLZMWKorvJ0JNlfWO2BxuCoiQmIVREnGss49/aUUZWVIkpRZvkCiiKSiyHOUUljnKwZK45ifHmPTlJM6J7oRkd78kCvPXWFjPGKoFImWnBVLbs5O+OX9u/zy/Z9hZhYayXSU0tQFm/GAYTqisYbRYEwyHKKTlPnikP2P3idfPgZf/n4NDF0/dkHzbEuQStfXoWhrdfTdgp+wJjrNcy1y4Vw3atH5OsOBvHUiBNrFjM0GO8UWz2VXef6Nd3jj9d/jdH7I4+Vt/vzWD/n43s+ZFYcdaWzXFtb+eL+iI22+KjiZLZjNl1SNYSOK0HFEY3ZomoblckFtDINYE0UR1uK76lqBqS11aSmLhqoxlMbSALFVCKUwoXuns2AqsLUjEtLXLEWAUxjjHTc4g3AJOhYM0wF11bBarVgWhqooyIsVVVlgmxIlQuiIEig0oqlRSqFVhDENcRyhhPKxrlr5QH7hH7KKtC/a7jyvKZMYUxteeuklNra2yYuSu/c+5Otfe5fdvV2qyofKSSnY3NxCOMeDB3f52fsf8Npb7/Lqa28wHo748x//KVEcMdH+JSryFdI2YCvi6QStYmarJYenp6jIv/TOmE5LbZoGrSLKuibWGq09p16VNVo3xEJRW8vpyQnGOfIiRwoZQvZSUBoVabT0L1ljKsq65PDomOnWlKOTI4bDhOEgRmoVzO2GvKyoK08f1Y2hqkryIsc01teYVdrXOFZQm8oX9mksVZljxSpUrPKNK72iYnHSt7P2HRqiz52gX770kQbWWoxtoNW7nPVFzJ1DWIuTXsOK2vdd2dC8UILQ3jILxG4fv7ue8usAi7MN1lrqxvHw3gmHc4HSGduRYmc45e5ZzkuTLeThkqUVxOaIg+qUF4uaDWoKcx9ZpFzWmlPpUE6h4iGiqYmVxShHVVVU5ZyTconQEXYJg2Tbp+zbAq0UpWn65qM44khTy4aiqLl37xOaFwV3D2Pk8TG1NRw2DbFUfLJ/j5N7t3DLhk0ZsTPeYBwNiAYbDIRmkI7QaUwymGCsYf/xTUSVs7F1lc2965R15cuHK4EThrxYYm2FaQrqusCZEucaREhBd21djxZrW0uiizqQPf46WE+KaNPWz8fv0j8TJ0hUym52FXEkuPPzW1z55jXeeuG32NnaY3O6xw33Jt954++zv3jMBzd/yPu3f8zH939OXi9pbB0KOYUIii+g6z67c0RecXR8xsNHjzk6PWYyGZOlGVk6ZDTcIM1OqesZQvmKYDhH09RUpc9qqitLVVmKqqYwDY0D4xRN0Lx8QpvDNd4U8WFkvnOv0AorFUongMBZyXSyQRYn2DS0BlqeUhYFdV15jSuUXxTWMMyGmGWORBBlA8rCTzQp8Ykd1oCzaKlRWoMxnJ2deVNDSnQUIUzD5ctX2dzeRUjFxx/9nB/80R8QS8crr7zJcLIJQpENB2gdc//Wh/z8/Z/zpz/+MTu7e0yGA3Z29/jau1/n1q3bOODxw/uUdYkpS+p8gVKKF65dJ82GWOOYlwUmpqvENcgGWGMQ1pHECVW5YjyZ0FQl8+UCZxuMkVgHDT5UTwBlaANfpwaplQ+NUoo4SamSGOMclXOoLOqyDherOZHWDLIErHeQzhZn1GWNMVAUJaaqiJXEOoVScs109qUbGxu6JkiBsbVvZd806Dj2hZOk9KU4HUiVfO4E/bJlvRuDtRZpLcKzz/6FD86wnusLmhFBJ3MWgabtigtPe7kD2DrrOWPrq8+5KgISRlsDGqtRWcTx5oRDu8/h1jVunt5HnD6mzp7j20nGsR5T1AXDSNPgiIUm0ZoKKCPBfPaQ1XKfsphjbdM5ddqC6eXgGoPtV7G2pqpypLEI63z6sjW42iGlZqA0i9WCx7c+wWSPKFzhwwGdQGJwizl6dsq1JEMKzU42xVpNpDKGgxGoiHi4wbff/CZZNKJuLEmWYWqf4CSkQiiJkwKNIdKOSDhWVcFZPmOxnFM1K+bzYx4f3eTw9C7l8ohqeUjdLFF+xfOO+Ta+n7Wyii4QBm0xkXPP2yt70vnC5RLFcxsvcGPwArdvf8zmcIs3336b4vgRj+qaOJsgtCKKEqZyj++/8R/x/Tf/p4ioYVHNeXh8jw9v/YwPbv6YO4cfUJn6c+fcM0HXGMPh8Yy7dx/y6PlHbEzGyK1tEAIdRQxHY28+4svWVXVBkS+8d77x9QaqxlLVjqp2NEJjhaYyCgtoKZDCoRxEQKUMroEkS6mdoKodpqwZZAM2RiOSKMbXYnCczeaYpmY2P6OqSrIkpSpKmqZiY2uLVVExWyxRnvRBS4lWviNuWyhaR6l3BjpBWRQ+rAQYjSY+lCpO2N3d9ZXW4oTtvSsURc1//f/5r3jlxZ/z7jd/kzgbMphs8Od//mf823/zL7h55za7u1cZDkZIqamqkul0iytXKo4Ojtja3OQXv3yfIl9inMEZw8nZGePxhM2tHRqcj2KwNrzsCqskq9XSh41Zy3K5JIojBoyo6xKofbU1Z2mqCi0lZQj499024q7MZGMbhNMUdUHWjDg4OMQ1FQdHB2xNNxlkPoRMK19HdJBFvm1S3dDUNVjjLQnZVoEDKTXKWgy+5KcWGUiJ1DFCarTWpHFKFMUgBI0JqeA6/twJ+tWIB1yD8fVAnC92Y1yfU99prsbrVuvhYs664Aj6LOeZ16RN65g0PjTt4HjG/ZOKaFyTDbYYzWYUuwk3SslkPmNvtk/S1IjyFFcXPJ8mrHRE3hhOmophNCLOFCdHN3n88AHO5LQanJQeYNrQNOdgsbwPG7tw+XXU0QPk2dzXQA4ByKapESH8byQk5WpOvTxBSEcsBJEUKCEp6wobZ2RKkcQpZdP4aJVkwKKyGCu4Ptrhl3cXZBuwPVDc/MUBIkowWkOUoZsK4WBnZwOnDJlSjMSIK1uXyTcNOZJdA6/b0i/csuL0+DYf3v1Tjh+/x8HD93D1wvd7eyIKwXWZLYGWaD1deEpTodlINnn3lW+zMZxy+5Nfcve9W9z9+B6/8+3f5flXv8buc9c5O5pxfHjIyeExZdmQJCmDjSmz0wVvvPMGe9uXuXbjKt95/ruY37f89MMf8Kfv/eBzZ9vn1NOF1bLg4OSY46MDTo42fNfeJEEKR5pmDIdDyjynrgryfEVZ197r7Xz7nTiCqva6vZYxOI1pvCexEQKl/IwQ0pAkCQIoCsNkY4dJHPsan9YyGkwYJBG2qTlczijLiuViSV366ISj4yMkgmQwIsmGzJY5tmmIopimsURaUxa+ueQ4SYljTTYYUKxyhG0YD316apb6AH6tY65du0ocJyit0HHKdDLl1dde5yc/+ff8uz/5Ae998B7f+d5vc/PmhFsf/4J7D+4yHI546+2vsbN3mWzgeWGRpuxJX+/g4PABSZqxWC0BxWA4xFQlVV0zXy6praUsPT0QxTGRiqmtI0kSX9chtFqZzedo5ev65tUKKSRN09A0NU5ItNQMRkMP3tZ6DjbLyAYDX5wnStBCYfKag/KIk8MTppMJ4/EYKQTDQcp4kHAkRGhpowFHLH1dDC2hDhWbfD0XQd14r39oOIYQsY9pdRJrHFb54vXCiOB4Us+cfl+F9DV0fQSDMb64uHT4uRo60Gql/bbGkybmXDcJ67twBJBriwqFM2BsgzE1pq2vbAzGWMpFw/Z4kyQbcCQtcm9CsSx5eLTktd2c72d7nIk5iZRYpWgMJDpCRJpVFDNvTjh99AlNOesWgnWXXUvf4RS+nKFl8eDniOEYhptkq5IYA1WJUK0zKnT0cA0aSxRqYoNFOcdASxYIsuGAeVHQGIOOEo7nK05vnTBfWbY3r/Hg8KeMr1xH3wdpK+6ZIYtBRtZI8qrkuY1dylRTNw07VcFukvHW9jYfFacUCHZ0wiUBjw1YnZDqIenmlL+19TZbI8Of3/p3/Pjn/5LHt/4EVx55usF2lYA7psE52f2N87HW33jpu/yD7/8nvHDtbT76+M9QK8290zvsp8dcuXoD63yy1mR7m7wo+NnBAU4PuL69i04ThsOKs/1H2HpKkiqWpydopbgs9vhH3/9ffe6cezbo4mt+FoUvyl3kK/LVwi/3ThBrRZpm1HVFvlj51ic6YTCMaaqasqyRSnitBh/n6ITysXVSEAmJFL4jRZZodNCgRsMxWscY67v5DpKIKIqJIk1e1zRlQ1WWnJyeYkwTqnE1xOmAYZx4IG5qojgGBEI5ynxFXdckMkZGEZGOENLzl7777iZN5R1+jWnYvrTDZHMTITQqiomUZvfSFb717e8jhOP+3ZvkywVHjx9w5XpCEidcvXKDV157izfe/jqD0ZTaND5MrW7I84IkiSnKkqqq2Nz0HYOFNZi6ZJWvmK9W1I2P9Ih0RDIYsJjPiXSCQNA03uE3n88ocg/MOom6JJVIa6SUvsB7iCPWkQ+vc9ZgKoeNI6RQxEITIRgNxhhryFdn7BcHFEVJMkhZFjnzlSKOJNPRmKKsaGpLGkWhbZMCY2gaSR15J1tZNSCNd6IJhTAKI6GpLJXz5TFdiIWVUqG/YIjNlynW+t5ZMmSdmbajgxC+prPxGUsG03UJttaCab3qIfNMWt/AUvgqeOseG2Prri6yDck0xjiWxmKVI3cNXBoTC58BOjZnlKuUvek2l8cxpTUUVcNpVaNqgxwPqJb3ONr/COfqtcI7a17/JzKrfMEaBxjqm39G9Ny7rKZT6sWcLBYI06CVb9NEcD4rCc4YVDhBYxoqBFVjaBZLnJPcfvCQ5emS41WNibfY2bnCfpFzUqwY4qiiiKVOyHRFNTvE7F7meGPMSaaJTclwLthS8G8w/PjslMtxxNtpyqJZMtcx9xqLyB3v2IhNFfFJZVjGCS/d+Nu8fO03+eWdP+Lf/OF/TrH/IYSSjMpHfNFWxyXwwQ5HIiLevf4tdtPrpMmIy9vXKfYP+Ojkpzx3+Sovv/4GiY44u3eHKMto8hlNviJvKu5WFW+/+xYvvfEyTVmSZBnpaEBdG1+m1DXUy8Xnzrlnt2B31nsPbU8Um8ZQ5Cvf1UHg42mFD51IkpTBIME5SVnkHB0fQ1WjI987S0e+Uq51IKQgiSUYB1YgtCSOYgaDEUXl6+IK5UOMzpY5kSx93y1rMQga60OY8nzpec2m9mXPraOsCqwz+ELuEldXNE2N0oLRYNhnQjkf65skiY+okL5sYRJHKCWp8gKEZrVYMpxsMN7c4tXX3mRzc5MH926Rz2eMxiMePrzP9s4eb731DZ5/6WU2tnY5OT1lPjtBK8ndO7dZzefs7O2g4wQnFZGKGWUDhLPUjWa+mFM2FVL5zhBaa6qiBASL5Zy9QRY4Qf9CNI1BabBl4cskGouQMVFIW07SNMQ1SpI0VInTPjmibGqgIc9XSKmJkoRssIlz3uF5cniAsQ3DNGGQJRzN516LaxqyKCbWmiSOqAYpWeyLueOcLxbvLEQNg2yENoamAeEqmkjQ1H5xoPE8s/z1ZwF3mq61odyodF0vOUxbc8Cbq221SizBD+E1KWu9Fi+EYb2Pmj++X/CsbTrQxRqwjlRHyDjCKMnIRDR5yRtZhs12yZRiZmo2RIQyhqFOMFpRxorTxV3OHn8Qrqltmtj3nHNOYp2v8SqkROmMOB4yGEwZjrcYTbbZ2X2ReLLHe3duc3DvJsXsAF02aGFD6xpLY2uEUlRlSRrFnM3OSKTk5OSUk6NT6lXJ8dkCE49IrlxnY3cHN455/YXXuV8b5iryjknjMDohF4IqUhR1wVYWkzp4QM1DrRiOE35zFHN3/4A/dlM2h1N2tMLahlg6TpclhyPJQsDZ0YpXhgk3xiPeevnvMJk+x7/45/8nTu79O9omksKKgEshnTus78/vvcALl9+hmM0pkkPEYsUnP/8pjx485MaVF9CxJh6OWa0KyqIhHW/wD/7jf4QejDB5SRRH5KslOp5isdSNZePSJZqqQFjDYJB97px7Juha5zDOhnKDvtC1MQ3OOeraoVQceD1JnCYkyZAsHfvmkcsFy2JJWRekSJS1KN22MvBmaRLHUAuMlaRJTJZkSAlJrGhsRd2UFMUC5xSDJAXnMI2lsTCaTFmtVpyenSKlIhukDCdjXyMhkrilQAjti9oEemMwHBElsXcqhdApEbJOyiL3kRc4rl65RpYOkEoxHI7JhmO/6NQ1cZzx3PMvsrW9RV3kNE3N9Rde9vV3R1OiJKPIV6SRZHRpj/l8zqW9SyTPP4+SsHlvhwcPHtE0JaZJiSK/sEipwRriQcKqyImyEfN8RRrFISzJV/RfLpYMB2OKlefvJBBFPsQpjVOixD/0OkRlaKU9/6o80AuhyZIYoRSNaVgt52TOEMUJDYba1pzOzqic4c5+Tpoo4jhGC4GWkY/VjSLG2YBhFjNMY+Io8oVbnKRx1i+oWUmaDrzzr3ZoVaJlFEDLtxGS6tdPL3SarvD1FJy1IU3Hd9HA+GSVVlPyipNDOgmuwTmJCCnE6ynBQE81BnrBhlKP0rvpQMNSVFQDQVV6a+3t0Q02tGRuC5x17C9n4IQvYqQ0L3/zb3Hp+BoHu9dxtqGpS8qqQKsELTVC4kuXDrf83E2HjIdTBsMNEBHG+fZbjXXsL5bsXX2Lld7BnZ2yOnpINT+gXhxxcnCf1ekB5XLuu5AYQzFfghKYSOGyDKkyop0dTBLTbKTkk4x0OuFHj35BMdxmsnWVLE6pa8tRtoGYjHgjS7i5f8DpMOVkusvLg5jp/gN+Vs/5odtm47nrmNWCPz6d8dZE8414zE9dzXwo2ahrZF3ibMy9gyULKYmsYSN7md/5vf8t/+y/OSU/eq/veh0iFrrsMefYGGyyNb3M1nQH4SwDUVNXDVcvvcxv/+3/EciI5WLBfLZgdjZHRxF1A5eev8FgPMKZmuXhQ+LxBjJJEaGH3vLsiMM7nyCl4tKbX3vmnHsm6LpgDpZ5wXyxpChzmmaI1pKyzFGqCi1eHGk6YDAeM8qmOGN9eFakEbJByQYrLUgTiqtopFJkqUCmA0xtiHVGXha+B5hOMXVDmmQ4ITCNz14qK4MJWWTj0Yj5YMDm1gYKQVUbHwMrFbZyPqIigK2U2nPIxiFUhBQNWZrgHKRxSpnnWKlBKTYmU1548QWmW9vMz2bM52cIKYmTFKUimqaExhHrhHQ6CI4khcP6BaGu0UqhZEJT10gcOtLkRc50POaVl17mzq3blKs5whXMFy0AhTRTY2iqkqJYUeU5sdY+5TQ8k7IovRavPEhnaYqOJJPRhEE2RKsY6wx1XVJWVUjYMdi6pHaWWmhUFCF0TJZmpGnqnWYSmqrBCoFzinnuwwSXZY0QOY1pKOqSLPJ94rIkYTzIGMQJkY59ooRSOOFrTSjtw8niJCGNU2IVoXVMorV3XprGp3n/msVZgxMKpEVY6cuCWhdqglgMDQ4fCucjdPBhb75zngddKXHWhowq8AkS3RmwIdPNWd9e3YVW4KmMibUkTQdIlRBnEadNQSZTNmXMolohtV80q9rAtWvceOnrjF+OKZuaoRAUxtM+DgvKOzxN49Aq8gF7TYlUEYd5gXE+MmdZ5szrFUsreDSf46TmXmPRKmNWCSKjKErDg9sPaESDzCKII6KXXySKNSsqkt0rjLausGET7t5/H72doK4OeOX6a9z75BMepCuKXcdrl6/zYpHwn9/8MU2yw0fj63zr6tscP3zAL80x+0XCxqVtXrIVHzQF+8byv97aIs1WvKdhnsJvJQMenM15aCXvJmMWkaZxlsg5toXkrDKMN1/nm7/7v+GP/9v/PS4/wDqQXUqDT6iIZMzu5CrSgDG+hdbRwSGHBye88+73uPLKm6yWS0Rh2N7d4cr15/7/zP3Zj25plt6H/d5hj98Y8xkzTw5VlZWVNfRQ3RRJsSmx1TQtSCJswTDMGxn0haEL+68w4EvbuvCNL3wnSDYEQYJsmKAgqdXsgeyusWvK8cwn5vimPb2jL94dJ7PaZqVgWipuIDMjT5yMjO/E/tZe71rP83uIUrK9ueb5z3/E3uE+IcD12SnZpqXa2+NsvebZZ5/y5OOPUEIwX+7xe19yz31J0U1/67qe9WpL03TM5wbvJX03ELxLy5woUVVBnhdkeY73AaUlSqcX65zBRkMUSVwvdEEkxwwtWgsyXROAPM/o+hatA1IX7MbcMRDYztD0LXmW4Z1nt9mQa8VysWS93mKjJfhAJhNIx7ce4x1K5PiQFkFhtJ9W5YSyrhn6DmMdg7FUdcFib58P3v8G+wdHrNebcT6apcy3GCmKSJQaKeLovFLookgSFCFTbqfQqWu2lqbdYaylKMrxlBB4cO8+v/d7v8ePfvA9ut0N1vQEBOVswbp5hbep++u7NlmBmSWQkErJGzpTbLYNzhlyrZhUJXVVU09nTGb7LBb7TIqcIlNsthtevnpK0/f4eJtmAfhIVLcUrGRuUUJS5iWN6ZhNJjTecNUk56H3ljwrcM6y3myQMgWWZlpTZAW5yih0inXKlCaXyQCT6dRVCZW0rJlSyWYsFIGUF/frvuLIbw5BIuUIHJepc0VGbqNyBLcxL+PICoG4LbxBJLnAFzkMr7veW0auf51AcMvtlZlk5z3DpuW9Nw9Z5CWDNQx4bjabcZ6avm7rHH2mQAd6ASHmPDOGQpZkeUxpJCHi0BgpaIeBQoAVmnZwaJExaIn3gZ2AT/uBlWnoW0vT9ywKiM0AwvD89BP67RnywQFZiMQ8UL/xEHVwj+n8hLtVRhsCl6bH1nN++/2v8+TZY87anj85/4zfeP/b3LMdPx7O2dot+u4dfr/+Gj9yW742zfhf3Nnjs3nB/2X9Kd9ZHHFX1bwvS/7Di6esc80PpORvL07YXjzjuYGX0fO7h0f8sem40AX3kdh+YCEVtRKcGccQBW/e+22efO0PePHD/wgZHb/kXRCCt4/f462jr9G3A1K1eNvxo3/6F0wW9zEmYHvDvUePkDKdXtr1DeurV5R1zersOT/7/p8y+Ixv/s7fwKqM/vIaoSKHD++x/+Ae0+kMa4Yvvee+RL2Qbo5+MFyv1qzWG5aLBVVZ4Bz0w4C3G3ReMi9rlEwb7hgcwbmUjusMTbfBBocQgiwrEbEgzyUh5MSoyfIpxlhsiPgQiU5hBzMWmTwtJ3wguMDl6grrLZNcY52lbQe0ztHOoVTGbD7FDJa23SHEqD8EtMroh7Rtnc4mZFLjhKDpB/K8oJ5M+fa3f4Nvf+c7CCGxLhkwdtttQlkqSd+nYMK8LNBKp+5USax3KCGx1uCsxdoBZxxaKiyKzWYDwHRSU1YVH3zwDR4+fMg/+7M/5enTT7m6vETkBfV8wTBYsqJivV4xqSfJDSaTJTqMkrBENY3MZjPKIs1wq3KSnHaTCcu9EwiW6fKQoqx48vQzjDW4UZssZCob1gyjxAbm0wnBOnRIc8LD+R7OO9Ztw3q3pjM9GZJJWTNYi7WOzligRZJ02tkIgcnQI1FOpbWOkOOR/PP3QCCdon7dV/zC30IIqWu9JY/d7sIjyBBGB5IljhpPwoh4FKM8S34esPp50U1QcjHaVj+HyEekiiyrktnekrxQLKoJpa9o221iZWhFRNIMDus815sNf7474/fvvEPjBcUQcUGwNpY8i4QgGJBYCVaXrIeBC+eYZSVb12FNx1X0fNKtmU1K5gqG0OD7az787KdEHIfBoCqoqoOk5a4K7j98i20MrI6WhJMH/I8ffoeDMucn65c83a55Wx8QspLr7VO88ny4Peffuf8+f3q64p8OW358+Yz/zYP3+eT5Ez62A5/Ynm/s7fPv4bmxAyYM6IMZf83XXIUBJXpOiop/ePcO389WRFGhhOa3RcY/axuM1PxriwWn0pNFyRSDHwaUqvjqB/8WLz/9J8TNZ5/L/WIa333w5u/wla/8LlVRUxYlZy+uufv2B/ytv/8PMH3LfDFjspxj2gFnTNK024FmfcHp9QU/e/yEqGeojz9GRMfq+pJXL55xdXXO+cUlAejalt//d//nv/Ke+5KiOyaZWsf19YqLiyv2FnvJdz6GL/ZdjzSeampTFphPR2xrUrKDs5G+G+jtgM5KhmFHnGqybI4UE4g1Tevoe0NvEjvTmNRFuxjwdpuy04JDS0mz29J3DRsRGboOpRV1WXKwXKTZE3Bxc4kWKgF2gqfIciyWoQ/kWYaSgsEOWOeZzafsLfd55513+eCbHyCEoBu5tnleUFYVfT+wWa/p+54sz6mqGkGKVI9SYYaePMvxztL3KVXDGpvAMFKlTT+C3W6Hs4bZfMbR4RG//3f/Hn/0h/81f3b9R1jrkkpB5nTtDq01CInzjrqu6fpmjAlnlN/JpG9WivlsRlnPmE6nLObLNM9SCq1z9g/u0A89F5fndMMwzo8FWgR8BGt6skzTDpbgTLI363FJikCGmKRlwRGkwBqT5rbjks6N0G/jB4aQlhbiNlGWtEb+YpDgrVcgjlv/X/d1i+mLXyi8o+cUEW5f50jNlZ9rEgLJHjxuhdNMO1FZUpQ3SRYpxS2eZQQQfj5gpFCGYbBMspKTxT7OeC7alma9JgabcJJy/PMLEa5v+NMPP+Q39u/ycDLljIiXOUbByiUljiw8SmrsMKDygq8Vcz6+uuaJcKhaYVDbagAAeDZJREFUEXrDVw/2+d7zn3HhHYUqyM0Vk2OFOV+xjZ7FG++wWl0ziAb25+QP3+KkyGhKz6wsMM2aH708p3Etd3xggmW2ueAt0yOl4j43uOe/YN/s6HLBcb6k3jUs8oKH04rnfc9gV7xdH/BnuzN+FDb82ZXn35/d5T9bPeef+is+jI7/5d4J97aeTvYoJfit5Qw/FSBLLIJJF3hsWr6RFfi8guC5y9vcf/f3eP7954TgYCy9R5P7fPXRb1NWU8x2jYwON/Qsl0v27pywu7ogeI+MkXyUppoYaLqBjz98TNsL7r/xVX7+8cf8Z//5f8q0LJkUJcfHx9zsWp6enhFITsAvu371eAEgCrwPrDZbzs6v2FvO0VpQ5DlaZuRZRRjp98E6vLAYM4xRPgqtSkLQrNcrsixy984jpvVh0s8FgVJpXisBbx390I9bXjEmDBiGoYex+G+2K6xJdt/lfMZilpZcfd8hYmS32WL7IcWjhziqESRKFylCWylcjGhkYgB0hvkbC777u38NN/Sst9sRlKNAwvnZGTFGhq5PbATniFIgBQlVVxR0Q8+kmqAENLuGokyjkVxnyDwfs+Qks+kkFVMS5OfO8SFf+frX+f4Pv8dm2xCkQEtNkRfYosB7n1xlNiX5Wu9ApvGD95HddkuRZbRdT1bMECLDDAOZ88nWHBPk5uDwTnL5mBH8g8Qj8dYiVTam1HqsCwTvED5ZiO8u9pOe1Fl8CHRDj/MWNzIUJIzzzNv5f0p6FjGOaQujE+u1uCq8dtqJz++wX/t1mxb7+cMgaXZVHGVhIj00iWnRJsfCOoYrj0VbwKg7FqSHTnrRo6LgCxnrrw0L0mLsDusNlSrQ2hNjQ8wzYpSp03SJXRKFIG92XL18xv/5h3/MP/z6tzmoKgSRbFowN4ZXPnKvnPDjm1Puz/ZYO8eHu0veP9njcHPNXw7X3F3M8V3Pm1PBbnXD6csVhZpxhwW/MM8IZUaWK95+9CYfDVdM5vuc6IKpg+pizVFoCOGM3dUpNgwUUrFVBXrXsq9TCviy7DHXl7zpe1jlnMxXtOfXzAhstjPqxRFvTo8wXnBpe76elzwUBVkQOF0zzQINgZvWcGPm/N/choeV4d8vK+Z9i88HSjXh7qTElY7eRvKYAZJDOeFb3/77vPjFP4btCxLVsODvfOff5uTgLuuXT7l59Yzz01O6zvA3/83/KX2zxduBTEna3ZYsS7jXpmlYHt/jO793l5ubcz760ffZ31silUZFxR/83X+Tr37rG3zvz/+Y/+A/+D+ybRpmi/0vvd++ZKYbRz9qwBrDzW7F9Tr59PeWexRaI2OJKDRFkfLhvbOJgxAcuc6o8ppMTdCyRcsKbwX49Fbc2g6ahtRLqFGzG9ntNlgXkErjvcUOPcYarBmwxgIisXgj7LY7iqpASZUKtrPoLKPICzZNQ1GUVGVJ9AGrDJnWRB8RWmAHw+HhIf/K3/gbVFXBeujpjGG1WuGsoZpMGEz6/3oXQMiESrRJnua8Qxc5IoLtB/IsI8SIjgmgriaKoW1TKKOUBFciKkmI6YGy2Wy5f/8+X3//m/z5X/wFzhqMt/jgMdYhBAgkbdOglaK3Jr3BQ6S3PVIUGGtpu5aybBjMBNUCZY0gMgSHYEJZVdRlhR0G1rtdUjWIgrqeY53FWctsMkPVirbtaLsmzZO1YplXbOQGLyWyqGitwg5NcgYSET5pI+XnblduwxdHRfpfqa2fH9n/u8RV//d9fQ4aF2MeaiSQwknjOGpBhtctrohq5CePXS23lu3bbnZ8qIgR0BIDfKHg3v4/k5nBUmcDkyLDi8DVds3NdpUIUMS0kB3RkoMb0FoyPXvJJjr+g6bl2/ffZLacUsWMd5dLQtOy8S33pOAn22sOspL72vLD65dU2YT39JT/8vQpN1bxMO6xufyUprmiCRvulEuK+QJk5GFRc1eWDLam7h2HZy8J6wa5PmNlLZ2NXF9cYqzlIkaeouichzpjPqupl4dEmZFVOcobSger9ZZp8MjrnGy2h997wGdZyWEpqSYTjgtPMIJjDLmW7AmYWY8nUqiBKiie7LZUlPxRu+JhGfkDodgjGZuyXvBJ01FmBcd3H7H/4De4+tkrYgzcXdzn3fvv0V1dcvHpp4QAZT3jzhvHiOhp19eEvqWYLxj7R6SWTGYT2s5i+g4hIsv9fd4SirPzS66vr7m5POXHf75ldXXJd3/nu1xeXTOp5196z32pTjdGUJlAVxDkgHENTbsizyVqskCrlOigpSbGkOAoJiU3FEXBfD7lsNujNw197zBDy+Mn18ymC6qqhiAIIgnOBRoRPbNZSdP27HY7tk3D0A+vVQFSBGZVyXRSo7XG+4BWCjN0dG2L1BlCJUeUkjrpiaVAqWx0eCkIge12iw+Rb3zwHd566212uy3DkCLWi5HwtVmt04wZQdO2FEVBZ4YRQZlkRFqqxCRwgZ3fUk9n9MMGM3bpjrQUm04m9MOQmAZs6c2CelJz5/iIv/W3/3U++uQzLs5eEUVSKCghRsmewzlHjCnKPUaPAJTUKXVApG7TWstudYWcOaaTKaZvcLZHj9Ks5WyWFnzOs9ltsCEB48tqivOOXd9xdLCPQiazRt9SlYnmf1DPcMHT7Hb4kOLnB5sAN7dzf+Lt0Tnwmj7yurqOcSaM//5X6/Cv8fql0MIxGy2+julJPFcRAolAmCzoUd4GdMPnr/MWk5P+eznObePnT6L0u1+DcNKvy9CxW71i+vBdjNQMWhOFex113/tAEDAvcza9YeJaJmcXbJqep7s1H2nNV4/e4D9+9gu+ObvDj82Wvz474U+3p7RFwd8ul/zh+hV9zPhr2ZQXuxu2XYc2kqmDKw/T4NjvW8yQ9MTTZkUMCnH5ivVuS9sO9Fdrrq+usV2HHyzejovQ2weITK9eZ4pP64piUjM52uPg5Jj6+A6mKHFlQR4ycufpOsfaRfJaIaoaPznkWVYRdWBSKg7KGUJ6BJ5v5JZD7dnLHR2A6Fj1lp0vuPaKLZavlBP2igzlBMJovv7Nv8d/89EfUdiO9+9/k/3ZAaXM0V9R4AJ3vvoBeVWwPn3J+uI0LXnHU2mE16fkvtnRNS1KZuwd3yUrp/Qu4lxg8A63WrG5WZOrnEIXzMrJl95zXzJeSH+Y1SRjb69gNs9RZQRlcb7HuAKtMlTI8dZguTVPpDe3EJqyyDnYX2B8z263pjMdugh0doULPUVekmU1Ep04DcZjjE0MXpfevIMZiM4gyFL45Hjzt22DEIK2cylOvTcUdXrR1lnyIseHgHMBKcJrKZOPKXsszwvu3r9HXuRkQ3J22WGg6Tp2bZNsxsag8owoEsDdD4mgXxUVTdeRFQUxRsqyZLNeJWlbNyCUxHhLXeQEXeGFwI4PjqzMEdEzqWvyLKOuC5SSdENPVZWvH14xBowxCAQm2FG65LDWsJjN6LsWPxZ3o/sk3O52BGfRWhOCZ7fbEKLAIdFFTW5SKoVxBmM6ohBUZY1CMFjP4d4e1lvatqHru/SgEop5MUHojHZoac0w1tkIzuOM+QI4Bj53EYwfi9t/Bj4PDPyXpuyOwJTx4/SPEYDjQYxAmFtbrxgHJnGcXUtJIIxT3yTsizEQRPo96b/5AnXsdfUFQUBJR9dd8v0Xz4m9g2EgeoMmkitNpmUa/RjHJMvQ3tPuGo58YLve8N7enGZ1icwL3EFLYxqudh2Zb1JaQ+E5aK9wQTBlS312TuxbDoKi2KyxTcMyRMrYk19dsdnd8GLXYXc9V5fXOBtA54lsV8wJxRzpHQwd0ZmU/mEDwTnwDmsC1li2N1tuXp1zPX3G9fEx9dE+1cE+i/0l9cEhqy7SApVX1MZQ9o5TY2llQJaaUC94Ts5OBKpKM62mZDU8i5aT0nKczdFl5FloecwOEe4wj4GDokJUkjcefEC5vM9hu+J3P/hX2d87pLtZYXerlFw+7MimNUpJLl4+Z7k8pChrAKTW5PWUEEAVBcuqwlpLNZkyXx5weHKXi9MzijJnc33NrE8BsPPJdByr/errS2zAEZXDZJazXE7Y36+YzXOmexOW0yWZqLAuYJ2hbXfkOsc4Q9e3I79AJ/uuzijLjMFnoD0+SJQqgAyCxrrULbbdQAwCY9NCLcsLlJRoIn2zJQaPHRKYvAkeHwKm77DWQPQIKdlfLlmtNwidOFAheCKCvu+QOiPLMpq2TV2xVCitqKqM6/P0daazaUqacB5XJlJT8ImHUJVVArpkOX3fE30ky7JkDviCHtg4ixKaUiiE0mS6wJgenamUdDHiE1c3KyKRly9fsdmsidGPryVt9gUihVcKyTD0ZEpizAB4BBlVWUCMeG9xdiC4Aj2ZMpgu6XytQUhFWc5ASrw1yTqcaVrTQ3RgBrIsR2cFvTFse818Nmez3dG0DcImy2okyaJ0XhC9S0kXzqF9pJQSa1zq/mQcifq3qau3ReavEJ8CnxelX+P1OSTt8xnsbT5BEJ7bGBYh5OvJtAgxuR0jIzUrwX/CF3K4IiNtTdzacz+/xBdmvSkkb0cYtpTVCTqAsBLjB/rBjCwHRak1nTVEF5kVJbumpcoU2SpgLge+tdinOb/ivbxgr9zx2bDmTjUjZpfUmwsKIcl0zd7pS0o/UIoMdjvk9pKmtzzvHZcXF2zalhg1kgy7uAN5Ri5zYlHggoEQ0NFTW0vb9/i+xfctOIscElEuJSEnvsR2u2O725G9eMnhnSPCozcRjWFVlqhJReYnZEGzNVs23iEzyTSWFL7jqr9GyMhMw/50jyu55iYMxLqgmJ1wXUSa3LE/VWTS8cwXnNJypAJ7ewsO7n2T+csfUWUFw26HdRZVlezOznj54c+5KJ+wurriFz/5CW+/8xV0pnB1TV5URJVRzubkMzDdwESNrktjcN5RTiuef/QRu92GB2885F5wnL588cvmmH/O9aWOtDwTVJVmNitYLGrmswl7e3uc7N9Bi5q2dbTdlqFrXhdAF6EoCm7xakoKpvUUlQtctBgbsX2JNRnd0NF1G/rB0nfdeJwPaKGJSuKDQ4qI8w4RAirPQESaNs0dtZDIUZ5TTaZAImRlWcau7ZJX3ju6YaCUKfU2AakT4Pzs/JSXp+dkRYYfBvrd5nWY5L17Dzg7OxuP5Q5nky650JpsnJFO65LBpDdXVVdIneMj1HWdEhfQFGVBWeQ0TUuz2XD37h3W2y3zSYXxlpvVGu9H5YP1KV05BpAS4QMmetquZVKWo4IhMVnryZRMK3IlURK8M3TtDiWgNxbjDZnKkSojz3MCkTwvMNaQS0VvBwafHlZCauqRL0xw1EVB1zap046BQim8FJghoHVOFiLB2tFi7dBC4G8ts1KO6c7wutDejhxCQIWEFPzlRIVfz3XrJAPSzHa0kkeSsy5ya5YIIElJGSEiPESZeOdy/BqBz7W5EY8Q8XX3e3uJ/y//IoSjWX9EMT/meuuJw4COnlwoRAwMw4ALPuX4SUnT7ABBKTPW12smWiLcil27pSozrtDUpmFSVNxEzbDbEqTgQmZ0mzXeG7ZRYrctu80NuIhWJbY+Rs8Tm9mojCAUOTATmoZImdfU3rOLhlZZfF4ipjP0YHCmJ/Q9wg7Q7RBu4DYHTiqJc4HTVy/pZU43PSJ2a/ZtzwGCzgquEcRCMmHCTIM3FiEVe7kik1Bax7VpkViKoUI0lk/dc1bLCSeHd5jLyKdix03TsMyWBFly/857yKunXD17gSkajh99hTe/+gj7lsFFSbe6Yj2eZq9ePufw6JDFwRFRSGxvyKdz9OgLkEoiEXjv6DY7ri8vePHqlD/7kz/lN77zHeo8Y29/STX5FxwvQEQJRZYpijKnqiqqqmIynTBfLqmzJWaAq+tzrvqWttliXUCX9WsNa4yKTEnKqgbjGKxmtzW0O8utZzx4x267oW1bhEikr6JMTITBCIwzzKeTFHOuNFEEnEkPBSXS3KwoCkqtEMFTFgVxzOsarE2ErBhxxtCbnlwrlBR07ZbPPvmUNx6+QbvZ0PctXdtxefoyzS37jkIJRF6QaY0xPWVWUNUV3jpO7p4g8wKpHUpp0rhYkGcKIRRlnmGdo2sbrLU8+fQTiqJgubfP0fExz5+/ZHFwyPe/9wOGYUiW4OBv3eJkQuK8xVqbZGwhUOaaTAq8czhnyLIalWkCCXa+221QMrEpIiC0SA/ErqXvWrTWY3CmwwVH2w8gFVlZj5IykZyESpJlGmf6xMdwlqgiSmfUxHSUHIuQHOfPSEXUkjjaqyPx864ujh0iqUip8OsvuOmS42LrFuM44gDDOAqQ8FrDKwRB+DSvDeo1SNvLiJQBH2X6OtGPI4WYPBMiLengFj0zKhxee1Qlvrti+/zPme29jcgOaNY3bPoGbw1agBJgbD9yM5J78WaTkrBVUXC+ukrJ1K3j2nSJUaIHzo2hHXoymUA8XdOCd+xUhpQFy8O3mU4XbF1kZwZyZ8mspSOio0DqyEak8VTIMvZnM/CBo6LGmI5z12CMQzqP6na4dkuYzZF9B9aAHYjRE4WBIFmdPcNlGW/8zX+DOKlYu4F106CVYCEnlIUgOI8vFIuypNAZlcxo7UCe55yokoXK02nVDsxiz77MuXQZ2xLuzuZsEDwJWx7sH/PNv/Fvc3dyjDWBarlkcXwPKVIiuFnuU+8fYIeBVx9/ineRrKxQeUk3DFiT9PdCCprNBmstSiraZsuf/OEf8otPPqMY8QRlkaO1Ji++pKTy30GnKyToLMmY6nLCpJpR5BV5XlJXM6oqLXTaZsdms8Y4NyZAaLRKXnupMqL1SLHH0G+RMZBnin4wtG3HetfgvWdSVeOyK0sFPs+TJEbUr7WOInp2ux1VUTKtazItabsW5yxCRPq+wTgHMsO6pB22pk+FyFnW6xXz6ZRMa7abLR9++AsevfU2jx7e5+byEqQgqyY8ffIYpU45OT6ins1RWYYSgroomFQlLk++/c3VNW3bppSGQrPb9jhnsdZgjOHs/Iy2aajqGfdOTvjGN7+FyjKurq5Y7O9z58EDpovZ6MkXY4coUSTb6XqzGjWvHmcHmuBRIlLojMxHfBC4qChksqDmWcZgDFmWYUa9dDYGblrvkHa05pYVw2DItafrWvKiHheSQEhLuyzLRu10TAYI5/BhwMnA3qRCKIhZQ7QpJbdF0IqEIbw9qsex2ogQkN6jrEMBmfDIf0ki2BMS8XbBF5FBvjbtvxZgxPj6r7T0/WIW2vj5MbvrVvVz2+lLeZvvdft7bz/+4pw30nendMMV9fH7lIcPMOeXRHdDNwz0Q4d3nmwcc7SDwQUSrD8YpPPMtEZ7SR0ylJQpRD4GJmTkUYMQzOdT5osTZgcHzKdzms0Nl9sbht0W4S0DHq8iCEWVl9B1BK0o8wK05nnwSBk50ZJ3732V4vKK62bNttsQsgyhC6SzME33rOx2uGYNpgfviN6xe/mCj/7xf8Z7//Y/oPyN32XV3rA8e8HMtHgpmZc1ZZWjhCCXqehVVUkpUiKwcwEnJfOqZKIVZbPhs+0N+d6SE1nzqtggtGQ/K9nLCoa2p2t6jnWBKnIkAe09sshwZUU1W3C13nL6/IK94/tMDnO0Lggh3bfESN809EOP0skUtVwuWa9WvPvGu3zwnW+x2Jvw+MOf8k//5C/4t/69//WvvOe+VKcrlSLPS2bTJfPZIWU5R5ER/BiZLpN3fDJbkt1c0pn16/8+8UlNgpFbSWcceTah7yUuDOx2A6vVjq7rmNYTqqLAWkMIjq5tcUNPJuHocJ+qrhPTwfZcFxk36w1d37PeGtwwMJvVKJXRdT3Oj5HaPrw+3EUpiT7Qd0lT68ZAzel0SlEWvPv1r3Hnzgl/8of/hMVizsnvfJdXLy94+uQx69VPEzS8rtlfzNBSstlu2O52rLe78U2YijCCJONqO0Cyv3/E+x98i6+8+xVm8wnX19d0/cDR8TFvvvM2n3z2bJwNF5SFxRjojUGQEoHNkObVUmm8NZRC4gEnI9YnDGTXG7SqX8NnUupykhwNbsC7niAUNkSCG7DeUVZT8rLGeIvynr5rUEozneb0g0FLUDJLJhMREB6Uc5Q4tI5UKrKcV6hZTgwepzRbF7joDBvjb1OwklFDiPQanCPXiqkIVCKOqMFf7xVDkgJ+UeIWEK9HVilJNi0Ib40TUoyt8G1hTjHWI7diJH6NLe1toSaOyoXIGJ742ksxys9yZF6z3LvP/sEdjo8ekX37r/OLzz6jefEpu8sz+t0WNdqJZ1VGpnOm0ylSJ6OKzIoxlSLhSoWQ2ChxKiNWM3ReYJ0j6prTzYar63MWMRCFZC+rKQfHhTEEoRDOsptM8PmMIHIO6op9FxBlRjSGs+01f9quiT4yUZq9suBytyPWU2QU5N4wDA1+tiSbzhFDg+9bYrslDD1mfcNP/pP/K4t2xfaD7xD371A2V8xtxwfe8D6aLIIWkmmZUkokis5Y2hDYqyfJjB3gxvTE6Njb7bD6Gj8pOZotWG2uWcfIspyyd3SHoqxStFIMENN+aGgb1jfXPH32lDqvuPfWI/L5nLyaJGPPGJpgjUFJxXw+Z7eDkzsnfPvr7/HeV9/n8N4dvE+nkK7vvvSe+9VFV6RuZz7bZ1bvU2ULclkRvaRvB3LRkuXpxsx10n12XYcP6egbraXrBvreEqOkyCvW6y39MLAZYTLeOQ73D3E+HcOJgTxX7M8X1PWEST3BWsOuablZXbNarzHDgLdDmq1KQT6p0pHZebyzWB/ZNQ1FlWRlhNGCqdJTcrvdJLF5mUEMmN7w8sUps7rgzXfe5NWLV2w3Ow4P93nj0dvsdjsef/IJn3zyEZ989CFd09INHf2o2dUqcWyLvGC+2OP+vQf81m+8wztvf4XpcsF2t+Hy+oxnL9LM+r1vvM9bb7/Lrml59fIFP/jhX7DdbNJr1xrlAqhA03bjQsKiQ0zzXZuSelWeY30aKYQsYJzHBkE+AoLyXGPskNI2hKDbbRmcT3CeEJCqJ4RAnlV0Q0JfWmcTaTM9bhF4JnUJAygnEU5Q6QqyQJVHjiY506pAKEUf4LpzyG1Dd7kiuHFxJkf4SxBoBNM642iSMSsVVfbrj+sRr7vtEd0ox2QRcatY+Dy6O4VJpllukoGNUTGCMRom8RnG2ppsz/ELs+uxsAtB+vpaocp9Dg7f4WD5kLtHb3F4/CZVvUAIyVUz8NWvHfLq3ntcXt/Q7a6Ruyv2hKcHOmdZljnLyYRd12L7nv35DKlrrpqWVdfTRU0+P6BznuH6nJvdhpYNcbfF+IYmOrquIViDUhJVTdjTJVnXcrNrkGVNCD3XKnITPNJGltWEOycPOd11tK5jg6PSEya6xniPUWCtg6xESIEXgSossTcXkJeIriOajjBY1v+v/xw5dIT33qeRsBssZ8OKP7x4SYXh3eWUr072eGeyx8F0RpVn5HlG8JHeGno8pVQsVQbOc3X5gn19j3vlgvnxe9zNLXuzmhgUeZWKrvDJAr+7vuby8pyuaZjPFzhnaTY7Zm2fOvZRtd02Kew2ywsQkuA8cbB87avvsH+YuAw+eHbbHX3bf+k996UQ87KsqPOKXI3fRBBYE9htWtwARTUkj70IlOWEup4zDB1Dn1xMTdfjY8rw2jVpI97sthQ5LGY1oUpbQW89mRRkOmO52KMoJyAU66aj7xqub64Y2i3BOZzpE3RFSxSC6Rib3nUJMNMPlqZtkVmOlpJcSZK3QRMwbJoGrRUH+weUVcVHn37MdD7ha1/7Csd37yJ0xtPHT1htNlxf33B8dMLv/e2/xe//G7+PGUz6IbQt6/WKEAJ1PaEqqxSxXtYIKdltVrSbaz76+Y/Zdg3z+ZK9w0PKomS+2B+3ug3Pnz1laBuGrmEySWYFSHlou6ZFCUWIFucGtNIM1qFznbpqUhCosYY8z7EIBhfpjcGHmLJ0kKM5zGNMj5A6xasjybUiAkVRst6sRxSmZjKZ0I96ZKUkRVZgMcmNZh1FJtmrJhwsag72ZqhcsR0satNhpOS8aTDbnijka8OAjJBrwf685u7BjP15xbz69RfdmKJJ0jx3TE+4xSPcTl8T0AZem3lvs8fGZhc+192K12qH9PvHz46SOYHQBeX0mJM773Hn5G0OD95gsbhDpiuEULRuYN1bNsZxNQS2IXITFU21wFVzxN4xJofOeZoouDAD/c0VYuOQUVLsNDYE5Laja3Z0RcFktaXPNbkS+KIg367QdodwKfjxuJhx1p6yFTBIwQ5HVpdoUaBUyRt1zdnZK0xW0yvF1WDZxg3V5IilXHC9vmSnKmShWRYF6+sr/GRKnEtqCV1zQ+8C4mgKpkV4h2g3uPU5YbMh/Df/iCpa+ve/SpxXBGMZYkkv4C/aNd+/vuYrxZT/0YN3eGexT6YFWZajNExQBBdw1hFRvHPvbQ6Wx0ityPqesshRMuUtZnk+GgsTonZoW0SI3Lt3n3lRM3Q9zWbL1dkVSzLKmSTK0egkFVIKrDXpPTObol3BbtdwfvaC1c2K7WbH7F90kSZEit9WagSVBwgWjHc4ERhag97tqOoahKLICyaTOSGShusyQ8gC7wPtKAkTQrC3V2Osw1iBJqU65ALINJPJlOlin8EY2mbLMAwMQ4cZOiIC48NofEjQ88O9OYOLXN1cE0lHgW3TYJ1nGAzCO6rlAiUExiUG8K5p8QEQkovzM4Zh4L/6R+dUVcnJ0TFVXfPGoze4urjk+dOnPHnyMZ9+8jNypdnfP6SYzMjrmsX+XuJLGMt2u+L64hWbzYZVs0uJv0pSTebMFkt0VTGdzdhtdjRNg3OOFy9fcnl1TV1XSVWhNINJ/OJu6CHGkXLWpqXhKGsKIRKDR4s0e3Qx0vQDZR0gOiIS5yxSaYIcOzWpyFXOYA1RKYwz5FkNUpKFhHlsmw0qS9CiuqwSuMinxAchEsIw2IAbUvqBVJos1+RFiUORF54itxR6jLaJ7nVViiFQFprFfMLR4YKj/QnzSf3fvTr+93R5nzpUKQQiiM+/3yhG1nLq1lN7K8Z7zMOomrldForb7ncszMmhJ5MsTlbU+3d4+OAD3nrzOxwfPWI+OcSN38PgHL0X9M6zHXqEFLTGsusNaxPYbm4QZofZbtldvOCTi1esrSFO93Cq4rCz1FlGXxbYyw2hKCHXzJdzpt7wIKt5uWs5u17jzl7QdxvsdEIIkUoqFvsPeDibjBJBwcXmhk2UmKImaM1L68kOjplnigPvebW6opcTjNkxLXLmQrH2A15Hdr2nqGssYJXEqpx8WWD6DkSG7je4ZoXMlggZoSiJuw3ue99H7k2JX3mLqAvYWUQLWIXy6c/z5W7Dsqg4nNRoEZlkWYq1mkyZTQ+YTPbIVUZQiugD1XxKJhvaZkc52UdIgbOG0A+EALKsyLxnryhYzOesLlc8f/yCcHaJKmtCpgkENustrm9QPThvOH/2govzc3z0XJ++ZLAd282WN998gyL/F7QBpxFXHJ1Q6SYKAaIPxOiILsm5vDNJvpQpqqpMVl3hCVGTEwjCoF1PXQiKomRwA2dnA8FFTLdDhIALjrIssRF0UeBDAtp0w4AxPUQwxhCDZ1JXlJnmYG9BiILV5oYsy9hutjRNm6JlYqTte0SR0fcdeZ6nbtCmqJkQI6ZPnIfV6pqynPD82XPefust1psNeVlwfHICQnBzc83zx0+4bi74+V/+gE3b0lvHtMhpxpyoXGtyrQlCstzb486DN6inU/KiQkrBdr2hyAqmsxmm71ivblivV3z44c8QwpONiaxmMHRdg86y0VfgCSGMDrTRKaVSmm9vDLMypUV0fc+2aZlOEvjDegdYqqqmtw6tC4Ty4EViXUid2MQidXFlUWGsZ+g7vA/kWY6SSSKjdArWCS4Bd5zx2MFiekPbW1AKaw3eufSXTwwHGQVBpFKkYpI8TeqC2WzCbDqjKn/9Eeze+7FojuSwmDrbcDtrhdHLMbrNYgSRuLjItPR8XWS57XLTHCEKwfzobX73t/8t3nnjWxwsD9FCMYTIzjlaE5DBsus6ghDgA93lOTfX13TNmub0BY+ffMTjx5+wajdQ1Mz3jtCLAyblFHt5hS8rLqf7lHsH7AXPYd+y2mzYygwTenb9NacSBg86Ro7mNSJTXERQWY7dXfLR2WeJ6aEL9ucL3jp4m9Vqy+AC59fnbAudjtux4ETnPKxmXLuGNjZswgQ9mTHPMjaXF5jFDJdXLPKM1eUZrpxSLvbJJYl5PdsnypwQDXoyx/U7xHqL3d3AX/yAyb0Zclqz8wOYSOk8d4qCd5aHlCrDktKEG+OYFCXTsmZ//yFBlngp+MuPHrMboCwl7x8oCtkxbFboYs4wGELTYJodIXqazYbrswvyomC6mCKznBCTfDLLUnqMs562bRk2a4osAym4OD/l8aefMnQdRSGxwbBrbvgnf/wJm92G/+3/7v/0K++5L9U3+JDA4X7MwIpBjJBsg3MDuRAIlSDcVVGTa0WWaQYfqKuK6XSO94HLy1dsVtd0fU/XCXY7S9c2ODOQqzRWqOuaqp5junZcODU0bYOzKXAx04rFdMJilv7adkMSaHvHepMWcoNNGWQoSXSWqAVDP6SOXaeEYiUEzgd6m1gMmcpYXV/R7Dacnp4hhGC1uubm5pq6qhiMoZ5NKCYVXkB/fs75i+fstglIE0mR7Y/eeovF/iF929IPPTYEysqxmC8IPiQFgXVUteT6ZoX3ntlsxtX5K1Rd4QMMJpHAfAw4n7LpQvAj7T/BViAtY8LIeNBZQZml4EqpBJOiwpGSPuhbHJLlwSH9kEYULnoGMyT7ttaJvCYkeZFjjMGZDmM6yrrGDoau76jqCWVe0JsUWdJ0lvObFQ7HdJgxBM+m61nvGtouJQ24LxYqItH7MUIljUWGLwcy/fd+heBH62cgRgU+/fkKkey+6TeRRhCCpEqQach7C/cR8vO5b7oEMUoWi/v8wd/4ByyXDwh9z6tX54nt4Qx972iuVzw+/xRrAmFoybzg8ZNP2DYrtqsNzeoS53tkFIg8J+qMJnr0MCCl5qia4HuDN5e4l0+5KhXn9QwtQDvL/nSJmh7wYnMFfQ/dlpeTKi3KlGI5KTguTrhqN4hqSdCaq3bL2XZNJGM2nXLfT7herdjljhB6XhYJ2nR4dIewW7NF4vMSU84o7xb0bkfMNH1eM330Fruuw0RHuVhgdi1BVsjJArob1NAghCZmc6IuiNtL5j/8FPnb77NrLKofKLzhaDJP9245pdQFKsuZFhlVOcPqOT8/7ZkvM27anlUsyaYZV03D01fnmOGCQuUs74GxA+31Dduba3Rdcv7ylCc//QVvfuUrLI9PWBxpDlcdqp4wnU2pZhNC01KWNb7vyIsshXRqzXQxgTDw3nvv8PjpZ3z/Lz5h07b4f1FH2vjcJvjI0Bka2dHnBu87+n6XMp6yjKHTQAK5aJWjtGY6y5gtD5hUM+xgsWag2ba0g2N107Dbbl9bB73UTOspVT0lArvdjma3wRmLcw7jLCIGFrM5Rwf75FnGatvQdgNaSbp+oO16nEvW4YhAS4USoFUqVkpndF2yvRZ5xjBYnLFM6xohIpNJTd/3PH78GVVZsr9cMpRVmt/udggh6LuOwVoOjk9AyvE1bdOWOARsSBSqzXaD95HZfI41HucC+weHRB9YLJf0g2Wz3XJzdcW0rrmK8XUUknXJ9quFZjsYhn6EIt8yDmQaHeRZ8TqtwAwDRVXjSQ9HF9OfgQ2OEJKl+PLyirIo6YEsWkywtF1HlhcEH5nVFYtJpJWCXdclTW+WpDO79oZ+6KjqKVoqnPXsnGO923B2dcl0PkPlOa0LXG1bhj5J9WK4hX4nMdXQG7brhlWtsUOb6Gu/5ivEAMGP4xOV3Gi3fIUvGCdeJ/+qdPKT8lZxGyDc4ivTJaIiKyreefNv8tOPT/HyFb1xxCDZ7Qae2Y62HziuKsqu57Td0vcbsiAojGV7dsEgAjHPwUZkljGpa0ResdAVze6Gpl/TZim5ei8rKboNlzuLK1tcXpDFwHOXRlxonYJXt2u2Z5eYeg71lMDAej5PVtfJjOOipPvFK7ZZRixytt2WrlCUb77Bicw5e/kRXmqcitzs1hwdH6O6hrUUNJOayfSI4uWHtHlGO51xNMlouyf4eo9hsqCqW3oTkUoQzRqnM4IWxDJD6gxdlnQvV7gPHyMXJfeKklwq9vKa+/MD0rlIIoRCZlPE7D5PL7dsrm84e3XORgma7Qp7ccVs/4CZvEYOlzx48A66rMiyAqk1SMnu6ppXz56yWt3wSCuq2ZTZfI43gZv1Fh8C1hr63RZrB4pphes6rl9ecn72ima7wQfDfDnl3eIdzi+2fPzpp7x89eJL77kvmemmWe7QDWw2O/ARnQlcGNLIQCa8nXMDsQuE6KknS7SSTGcz5oslmSowysAVbFvHarVlNaYyVGVB23ryrGRaTxkGR9u1mCF1r8YZrHMQApO6QijNrhswmzYNt5UcM61GuRYiRUJrjRotvj6kpFczmGTPRaB0RlFofPAEH5iOcrTNes3Zq1NO7pww/fZ3uHv/Ps+fPmWxWLBerWi6pCfe7W7GYMicsq5RUnCzXjMMHW3bpFmy2LHcWyZ8pDFE76mnE7bbLT/68Y/QRcn65gYpoChLCGCswfR9io0XJqXtjkCREGPavIoUXu5GK6p1EaRD9D1CRDb9gNpLTj6lNP1gUUoy9C1ST0FpVCZRAUJwOGvQUtJZyyRPMPg8QNc15GVNXU3I85KubWibBiUVw+AQUnF1vaXvdjj1gnw6IaicXYyYkGa4t7SxGMHHSNsOvHp1TjAtdalx/tcPMSeIhCYNyeIrZUCE0dIr1eti+xr/KFLBDSEpFtJ75JbHe8te8OwvHoFYsNltcQouzlt67VBdgsW00fFkc8mbkwnaR4bzCy5Mj7ctOpeIrqfYNnSlpA8RszVk2Yb9ySP2JhNod3TDBm8sF1VBNp+T64rDvODudMnN1SXPLy9xeU6c1Fxmivm9+0yFoPKKPeDTm5dszBpdzmi9IRQFByd3mJhIu77kOot4VWJ0T1xW3Hn0Ho1vWdmOYVLzynoe3H+EHRxNFhlU5OFv/DY3py9YK822mrD/3vtcrncEnZNNFcOLC0I9Q+8fYc2AaHviYKGo0VWO3K4pbzrKWc69vORodoAMEu8sVZ7T9i3brKIPkvOfPOFlFBjpCTc77j84pnA9w3QOwaJcS5GVHNy5QzWbopQkKwuUErx68oRPP/mYWT1lvpecZPnYgDRdT9M0DDi2q2tEDFSTmnWz5tnTJzx+8in9bsXJ4R5D37JcLPid3/lr/Gu///f46c9+8qW33K8sukqQ5BW9pWt6MqUpkERhidrhpQSd4k2MMVgfiFFS1VOKIicTwGhmOL9csdm0dG3S1CkRk0wpeParikwLmrbDDD3D0OGDZ3AOYy2Zkqgspx08N+trlEp6yEylN24+Rqoba5IGUgiUFEmzah15VeGsJXiXlnA6GR2sT2OLsqqw/cDPf/ozDg4PaD9t2N874PjeHbSSnNw5Zr1eUeQlwTrOz89xPrlTgguUVYEQEmcdN+s11lkqOWHX7hBCs39wSFWVXFxeIoXkxbOnGDPQNTu0UtRFwbZJzh5rB0QEJctUaIHbBc6tpVnKHCVIYx5nUEphokFpibWebbOlyPNx657RdDuqoqBvGrJiQoyWoijwQeNDIHqLM9AL8N4hCWR5Qd/tyMZYHqMVzpqUzTZu45VQDL2jNwOrTYeoaqgKQqaJpJ/R6/198PSd53zo2axWaBHxxv3zbr3/Aa8k+wpRvHbOKW4jfNLnX3e5Am6jgoUYTQ+EUcMrkPLWgSfJ1YyPP/6IItecrm+Yl0tunj1lpyR75YQ7zvNye8MvLgIZkaW0NO2awVucCwibopkKoAjytcb3bHUBOiNTOUezOWzWPN9tkuSyqmnFjqbt2D8+4cHeHkpkqMHyUey49oJMZjRKIoeWo85QrBv8dGA7qXkca4SqyOqS49mbhPMLttlAyAIrIttqwuHeXeanT9hmmpDnvOwd94/nmGef4hYHbLzgjb05P9ruGHRBsZxThYG2nBKLktJ7+sFSnRzgzi8QeYFa7cjMwELnTBdLBtux7ycsdcFeVlDrkhAck1yzPzvAFYf89GYgoCkKhbcBYxv86iKFzgbHQimO6ilHB0uWd+9QVAXeOvCebtfw9LOnvDq/5M637lNOysR4yTPq2YR6UnJ+fs6UPYqyIAsaYqAZWi62F7TlwPmrU/b2JlxfXXN+ec0//kf/Fe997QN+7+/+3S+9476UvRBCwBqH6Q2utmRokA4YUuelEy80uIi3A34X8UJQ9QNa9jSt5fGzF1xe3UCwCcHYD6jgIViKLCXNnl9esmt76lxhrWXTtJhhoMoV08kcIRTOdCiZEoEjSeQ8DAlfGMcM1zTrdBR5iYiCLFMJ0BJTEZA6QhytwlEkWhQJUNL2O+KlR6uMi/NTPvz4F7z7zjvcuX+X/f092qYhliWL6ZTL6yuyvMIFi/eesiyoyop+sHiXZrCz6ZLF/t6YNOxo24bHn35G3/dsNtcEH1FSMJvNcZs1w9AzmKTwSI2uR8Rbi22SX0mdpCsxpuVaFGDGwpurHCEiXbNDiCkCS15OEDGBc7CGGBUyy/DRUxQlfd8jlEQqhYiRTOnRoBIJHjbbFUVRIiLorMRbO84wI/v7J1xeX+GjQ8oioSZjfM0uuHV43bq6/Bh02ZqeaA3R/fo73fhXPooxEKL4XEQ/LsSSlTdxGVJHzOvuN35hdh0jCKVZXe+4vrpgVhWsr9dc84KoFG0/MIhzjhZ7VFqh2w7rLZchoOdTpl2P7hvW1tLlGq0ztJIcZTVd17FtdpBpZFFzFQPZZMZk/wjdG0rn2RG4WU7ojEFqzVx4lrs1s8tXdHlJNquJQ8/L+Zz8zfsUWcXdYoZ7/FNsGxF7NU4JznQkf/Q2x0TOH/8YHyJiX7JuJIs3vsKd1QterJ7j1ANCn3Nvf8Fzs+W69bzxxtscqS2XlWNbR37r4CH/rOmwWcVhdszL8xWmmiCvb/BZhTAWqyPrwTEpCma2oNhYDu/UqAjzPONwskddFFi1x0tf0QaLefmck4kmMw4dGq4/ecpalzQXa777r/4WVVWwf+eEvK4TJtWYlJ7cDaw3SV4qtWIwPe1ui5AQZEBm0FxfUkxzJnvLtLRutlxvVlx0p9ja8e5vfkDzvMG4kre+/jXm3/sJH374M77727/7pffcl6YBO+voup7eDoRQIYTAxwElQyq4OoE9VMjBJVuqMZa+7fA2cHW94/z8DBmSCLvpOoZhQIQEqzla1OyGgYubFVVRcLPdsdlt6duWXGnKYkYQMm3VXaKPhRipqppd25IJsHYghIAPyUWVLEIR6yx1meNHmY/WEiUFIniyIiMWIzyn2SXso5QpjaEu+bN/9mcMw0CMgd1uy717d5nUJXmmuNaKO3fu4HziRkwmEy4vL5kvFsTtjpOTY4JLyRAyLzh/dZqOYG3D5fkpN6sbjk9OeHV6SlWWyUUUA9b0iakgzevCx+jmEviksSXRzCAQnCUryteWWz9aFqM3NLvtCC5vESqlZIQoMW5LnS1TQbeWPMsJ3oyOuoCxFi01IVhc8Ay9S59zHi8gz4r0dcyAkIK79x5yev6coBROSWwMaTl1uzy77XVDHFkFIR3NPwd4/ZqvdIoQpAfJaxbaOJaChH6MyJGMlrTqUccxuBJuHWi3IZdKZ9STQ4gdLzdXzBd7nBuDK0sezGDb7jhzA1oo3lweslrfcNGsCAE0AYxBh0gYBqJzOB84mwTy6ZRa1Uyzilk55dN+Q5MlZ18xqZk7T3H+Cms63N4hGYGrrmM1XyAfvsFMZEy3K876lmF/gXWeXe6xwlC++3VqqQirS85FjxcVViuyacWDD34TE+Dy8jFuEOyqJe/s3aPpNrRhy4vW8duP7tE//wTDlHvDnJfbn3CgTvjAlzhzTVUGptNH/MbJG6yUxkXQB3sED5U6oNu1SQOsNUe5Yxg65jHnrZNDtBDUmcaKjJ+/vOayXXGz2TLVsDaBt5dTVmvLbrbHR23g7skDhE70P12WANi2xbY7XN+TZ4Jvfvs97t/fYzop2K5uEELR9R1CS/q+QSiBMQOy3ZFXJUIL+tBSTCf87e/8AW8cvsF/8h//R3z0yce8/f57/L1/53/Cf/of/t+5vNx+6R33peoF5xLf1ntPwBNiSnZVWQLahNFvrnREyRxrA1KkOW/X9ZydXxCsIXjHZrvDDIa+a5AxouuK3gbOrm8QMdJ7R9O1aKDISqq6JkjF0Pc02w1Spkyw6XRKiIHoLE5L+q4jSgVKE28h5ELgRwi7eG3BFLRt8k+rLAHNnXM0TctiuWQxnXNurljfrMdodcnpqzP29/b56KOPePDwPqYfuF7dMKknrDcJN6mznPl8QZYVFFkCc0wP0nLpxauXfPr4Uwqdk5U5N6sbvLcMXUsxWjWbrsOMHbKIEWNTtpOSKa5cyMRqzXUxvqaYYsNjwFlDXk3GyG0gJvuvc56maShKR1mmmbUjcQZM25JXk8SrKGR6mCFwpO461ZwA4yJJkFQsxhkGO1AWFWVR09ueIq/Iqgm9+1yKEEOC23yhhCFCHBMXJFHrJLnyv0zg+nVc4nZW+9p2Nj4qhPilRVr8Qk8shGDcvyHVra53/PUoEaKkazuikgQHG2EwQ09vOnI5Yb7cZ7h6yWAdz9uGyWLBMlgwPTfe0s1miBgpvKUyhsb19GXBIJLsS+Wavbxkv+/Z9gNIi900vCgKsuMDiqxGDwPi9BWXJ8cE4RC2YVAZcVZRxiXeZsRcEczAWqfXoPOc+3v7LPsNbZ3jxcCq6bmpa46WNdWpZSe2lNHzamj54Lc+4Acf/TEqqzjuppj1GrMLbK4f82bb89lPv8+H2WMePTjgneUed9+6y8ODG+rC0sQj1GyLbzpkloMU5KVEjYGuLq+57AMfyEguHTYqfnph+Nn1jjKfcG9vSq4U56eP+WeXl1xdvmKIgmu95NuHMzanL+H+HlmuESEwdBuGZoPtepQKHJ4sKCqPDJroLH3bYIeegGd1eUEUlmAH1pcd5aQiiMiinvMP//7/Ch0if/SHf8jp6RUqdvyTf/Rf8Jt//W/w9//dv0/s1Zfec1+q043W46NDkKJ0pIxILcl1Ih35aDEBMhHJtKKQKS7cW0ez6zFdR5UpHp9dY4eBvu+wZkAKyLIl1+sNzhgyJXEhkEmN0hpdpCOds4aubbHWUhYZQSSCVj+GULphwAeQOsMOHURPpstkZ43gvEsyqxiIPrDrB4osUJaOosghU3R9ix0qnLdIKZhUJRGRjA431/zxn/4xe4sF9WRCUVWc3L1L9IHBWHSuWF9eM5nUVPUMHwNaK2J0DNbw/Nkz1jc3GDvgY6DIC5RQNE1DVmQorRm6lmHoCN5/Tqki4j0ooUblfYo9FzHNdQkOosS4Hik1skwjAoRMeMzg8SJiraDMa4SSuMGQ5wVD3xLEWGAjIFQqyKMeO/V1aeZNiAxSjeL/SLfdEqxjNl1QZAU9AzIv8MHgY0TElA92e+QWY7oAMVG3UqqHAKX+peDpJrUCCS42dq1RCnyMfwXKmB4hrxN9R+davOXvjjFFCQ2UE4DL1Q3Hy0N+3lyxnC+YNC2vJhk703O3mrMKWy61ZNd1zLRmYTNuwkAoCpARN4AZLEVVI3oLtUIqyW53w8fjz73OchaN43GZ4yfJ8DA4yzSDxf6SA+tpVUEIDSbLOZ8tkA/epJwtedMFPn3yl2Br1OEhynhOfUG+d8SjquKT858T8hmSHDm03Hn3PVzf8PTiF/DGHYTrWYqcqSn59MNTZt2Un3/0E546KNotWZFzciTYnZ5xFg27t0659wd/i+/eecipmOLye/z4fI2VGtG9SEkdYUtQEzIpuewsT8+eYnbPWHOXy+m3oJpRB0N/c8VPXr1ivbvkJmYoHdnLZry7zCi2L1DFgsXyAXlVELzB9hv6ZsVmtWV9vcKajn7YUugp1XQfNRL1tts1zWadnKDOgIB2s2VSV7xx9AarlxdMFzOePXvBbDLBGPjxhx/RdS1/7a//TR48+vqX3nNfQhkDH31aGmjQWURnEZUrdKaTrzo4fIh4AlEJCjVBjfOw3XaL1pKb1TrlwQeHHYa0fKonNIOh7Ycxrh1QMh2FY0AJhekahJC0fYeKEY9EC0XTdFjXE2IKs0RluBCwXUeRa/IspzM2Wf1MRCUjVyJdMS5EYiDXioCmbTsyldgJ08qhtOLmOqVAXF+eY50n+sDpy1ccHh1ztbomU2nGZ4xhtlhSFCVN21KXJW3f0VtLXnb0Q8JJOjdaaPMKmeVEIsPgqESGMQPRpUWfUJro/ec8WpmoUmGMp08ISYV3Ay64kQtsCD1kWqN0hoCEZXRuVD54vHHYoRsLRsDtNiids7GWST3BWQ8xgbcnVYUfC6d3hooyGTJ8T4gRNxgatuRFTlFW5DpLQKHXReiLYTbiC3IqCZlAoMbP/PolY+mhM34vQaQbxad/xltQwjiUvk01jiMm7HaGe9sZR1Kg5bTaQ/iKob+gPCrJLi3rYcVBvkBudjg/cNHvqMopehiIwbHb7nDTimo+I7+5wbdrWqWwi3nSUkvBQcxog+FKeaLtkCSaWL634P5guHQ9IZNYY9lk0MwLimrKo9kB5uPHfKw7/ABCS4T2XGrFyVd/AxktZ68+oZ1NiPkcOyiaCIdqyXZaouyK8/Oey/0Fv31c8eLmJe94zXG/TzALfvyDv6C5vmF2vWHfB967/yb333nEt7/5Dd557xuUWcazV8+4WW/Y/eWH3DkfmD16xPe05lkVUd6zzQq+VUS+PvTMl3soJJUP4FdsN1te+j3K0jK/uUR2F/zR6TUxm7LJFshqQs7AfrXgTogslOZ4Pmc2n6EleNNi+oZms+b0xSlXV9dst9fstg1f+9q3ubvYo5xMaDYB79JMX0qJj6C0IsbAfLbk6vQVJlgeP/2Mpy/PefL0KbPZhNOzFbtdy8XlJe+++3N+/3/2LxDBntJeI3kORSHRWTJC6Eynbo4wZglZovBkKh0TtALn3AglD1g3UOaSi6GnH4aELsyylElmhrQxFyBDUhZ4wLaJJeqtRQlBlMlF1lvL0HVoBUiNjxItJcPQpfeHSvwAIRwhCKIWqTDfHsuJSCFH1mlMqRa5JlOSSV0zDAN5kZHlGqUEzhisdzSbNbumYdM+5ulnj3nnnbew1rHcWyAKhY+By8tzqumEZy9eMTQN220zJhlHlFRkmUx4wywtxIZuwJiBtmmwzhDGtAghxHi090iVj1v0FPqZ5Rkg0Log2oFIRAHODsmaGxxlNUkLQiEQQo60N59sq84RAesMZfl5HhSElMXmHS5LiRQ6y9MD0VpCCGNBTYu7MVAcnRfUZYU0Dc6710yIyNjxSka3lkzULSlTt5tCx/5/KZP/f71uHw63TJrbB8EX84pTIvDt7x+zjOP4YIly5DF8/gixg0G4HYv5kifbFUdonhY1m7ri5PqK9eaK1cEeRimObcCsdlwsSqzUxGA5OTgiuJ6WQPAGj8fqDF9XzLMpoVsTQqQPsDUDH8oVZV5wf3aMuN7xGRuMVCm12XZc9StOHr3F0dUrOuEI2tKtzjgr5shu4M29ffZiRtNsyUsojGO7seTTgm/s7/GXT79PPJqyPy+Ydpb7jcQ8ueC//uFT/tajr6GfvkA+ecVsVvOdb3yNb37jGzx8cJ8Hj97CBYMdDMezOXOVM51UNLuG/NVjTnzk9ydT8jsPkW/e50BnHLjfZDopUBJmyz2csfzgo2f8H/7xH3L2F3/MbzxY8kRIWufJ7BaCo2o37N+7z9GwYonl/sk+b7x9j6ou8KbH7tb0zZbN6oZnT55wtd5gvWMx3ef4/kMOju+QFUUaaxhHpnNChCAl3qd4q+XRESpXvHz8FOsjD+7cY1rVdH3D4f6cz5485kcffsZPPn3C//5L7rlf3ekqQVFpqlqTV5KsFGS5Is81Ut7OTAVRBJSSlOWEMqshZtjeIESg63vqssANDus8gQTGcd7T9W2ypAqBHeeAOgq6Zpc29jEtCRKkRdH3Hd6lAipkmWaEUmK9S8sbrZLUzBps8COQO0XlBB/w40bdhUDfD2RaUVWSSVXivUmZSDLFm7sYyZXCFQLTOlSmuTw/5eXpGdY6JpNETNs/2Gc6m+JMT9sNvDo/Z71as91sWK3XKbo9OLI8Z1LVuBjQMeBtmpt2XZPUDUMyRYhEvR7nibdzc/9aqRBHB9QtI8EFB0oS7KiaCB4jJOV0npINiCmtQY+6ZGfT7DuM9FfvGUyKi49jZ+2cR8qQlpNEBjOQ1zUxOJRUSUNth9QFNjtmkymF3jKMuMw4do5Rjl1uEK/XVaj06ygJ8suBz/+DXLeEG3H7wPj8En/1o8jrznc8P/H6E+MvRRlpTENWTmluztkrphTrNV0cmBeaHAGbG/qqZBMli8mEcrVhmGqE0GyGgcnBAQfG0zc3qEnGWkReeYuKgZPZHvPdwDNa2hw8HhMM0nW8fXjE3goufYMsAtH2nO8C52LHfF5wz0o+++wxfl5DtOiiRq0lk6MFR/sL1mcXPLVb7HxBlkfuNBcU/Q0TbdmzCz6zgXuLR3zvR/81WYh875NP6J+csa8Fd/dnDH3Lj378fT799Bcc/uSQYjLl/a99g6HpCMFx6gNCqJSkMvQonbG/WaX3SlWxnkz41re+gxksn/z8OV3b848/vmQjSvqjEz7tLT+4biCr6a0hHNwhUxO+cXTM/e6Ce3Lg29/6Osf375Bl0K6vGLZrumbHbrPl+vqKs6sVOqt4eP+AveMTyukMIQWTxRylNeubFd3QY70nUGL6nvOXT9G64PLikq7dkmWCw8MFUS55+eols9mMXdNwvVp96e32q3W6uaSa5tTTkrLOycuMolDoLHWKMYVhoaIiL0pmswV1vsA7Rd/doLOUEFzkY1R42yOQlHkiv8cQUEqPfn2Hkpqu3ybvfhxTWPMsRco4i/eB6AxZOSUKnbovEdIsl8TejD5iZSpSZGlu6ULEOEcMfrT9ajKdMfQGrRVVVWH7HsYgQOMspdbEsmRoWiKStm3RKqVHDF3PJx99xMHhIZ9+9CGL5QLrHbumBc8oN4o0uy1KjdyCEHEhoRV7Y4nO4Z3H2B5n/eia02l+O27OI3JkA4ysLiEIPlAVVVqa+YAIHhVT9x68I0Q3duc2xYVHj/cOoXX6OlqhpMQrgTMDkpQkLERKo4g+oKQkUxIpk/vHh4AzyUTho0MplZjFwac8OWs5nu3RB0tvhtdSqnR3jEkMt78gJVHI2xL8a78if3V2+8+/fvn7VXwR7Zi+VgJitm1PzGYp/UDnXNWKh/kdrnZrzpXi6K13mV5c0mi41hIv4GBRIy9XXEnPusxohKCYVTysS/pmy8obApogJWtsssO3kr7bEKYK7WG3veHnZUe1v+Stvmb98innc01QEYopfaFQywVv1DPWrseFjl2z4pN+RTRzjpTh0XLK44s/pw4TTuQ97mT3ODr+FleXF/zs1Y/wQ0/QObN1w/b5OVetZV5lHO3NQESMMUwmNUTo+47Tiwt+8fNf8MH7H1Bmiq7teOONt7nZrOm6gZcX5/CXP+bh/TdQSnKwv+C/+E8+5qMPPyEEh5rv8dnkTfTefZazkvPrCxbHR9TVhO3umreLigc68LbYssgMbx3vc3CyRzWpGZobzHaNsyYBucqavb19Tq/WTCdzHj56xHRvLy3lB0+Mkno6S3r5kUuyWt3QrFd89pMfM13ucXhyyP/jH/8/OX35ismkRmlNZ3qur6/puwElvpwn8iuL7i3ApqpLyjJ/DY2RWYKzZLw28qT8pGpGXcwgKJptj9IKrQKQZGdt25FnGSKmohp8wEeHNTbNyVRiGXRdCp/M8zwl2brUySoiWVmS5VlaAkmJ6XqsTbHgLqbjbamSSUCQgOIp6DGMDU3KW1OqRCmN6QcmdZWCHW0qIlpKMqWwSr3uOJ1ztF2fkiicBWC9WuGdpdnuaJod7dCjVE5eZDAex7M8f92JD2YgV2lR6LwnOIMzJv1ZRMiVREqNC4mbIEYzRJbd5s2lGaOxJvnBSYoBJUH6CFqOMKJA33ZUVUVEMBhDIVIRdTZ9PaUcwXlEpmnbljiqHrz3adFZliigGHkM3trEhPB2nNiKdNrxHjsMiEwyr6YQAyak0c4XG8Egb+ejknjL2P2lnvLXcynkyMNNetx/3nckbhvhW+vyCMQRI/QmXRKQyAz6rsMGA85zvlsxySpKAS9DQwiSd5cz5NBzbnc0MknxHh4d0qxXbIcGyhQ5ZaYTqumUvZvrlBNIoO1aPq4ixeGCN2zF8OqUVxOLrWscnn7YMN8/YuHv0dgbhthTigKzHfhF2yDKnPfvvwkvL/nxdEPUA2Um+Nb+e9RWcNJZamHZXK35Lz/8bziZT3l3uke+u2Y/K9Bnp2x+8QJipJ4U1FWG9w4oaLuOtutQmaQsS6qiom07fvKTHzGZzHh49y5t1/Hhhx8RhWS12VJXJdvdmqIo+MEPnvLwwRvcufuQk7sP+HDVcvnyBulroq4Ikxk5OYfC87fu3eHtwrHQEXvzilz01JOcEF0CBp2f0Ww3RME4ckzY0lxnzKczlkeHiV/vbWo28iItd0Wk71uEFlSTin/6x79ARccvPvuMew8eMJ3NeOuNmqIouHvvDsYP/PGf/Qmrze619f1XXV+iXpAopSiLgrq6LbzpGBqEAKmQEaSQFHmNkhl5XmAN5EVBnmm0EljjUkKvTBv43g54b2iGJkWQ6AzvLN7Dbpdi1dW45e6G7vMYGwlapRgaIRTRWKzpU9LtmBSRlhvJDixjmoOqLMOFSKY1fhT/KKnSjFMK+r5n2zSEAFmRQRSYYUAJgZYCkSmMNWzNKiXnqiTXMqZDROh2m5Syq1QCuKelJ0pprEuCbEKOFDKFRYaA9yPsOoQRFXibJJCG+FKmIb61aamWFxlK6VGHm+LBhdZEN4w/aJ/swyGlCafIoERLstYjxUBWlmhdIGM6FVgsPniEjLRdQ5kXCCTWGoSI1HmOlCotHGWaDSunMEMPUmGdJZNJ/jX0HS4aEDLFdcd0yvDjAkrGOLoF45i8wBcJMb/265e+ky/wFn7l7/9iBz9+LKTA+p5icY/dekt1co/l5Skvu5bj5THzi2cI0fEiSA5O7rB83uGVox86XswL5nfvwrOnBBNYuZYndkAVJftHB8xfnHKd9ZhKQ/AMtmGyXDDTb1LtLgl2R17MyBCcbzfEqeJgdp/DVc+r9oatXENWk+s5izIjTmv2r3dkwTJT+3z28hn1bMlvfuX3+fMf/hkXzWdIHdD6iIPZjPerCnN5TWwbfueDtxFSJidcbwje0vYDzqe8QuUD6/Ul8+mUqixpmob95R6nlys++uxlCio4OCTGDffu3WdWV0gl+O7v/DbTyZzrqxsyJbixgqArbFkwnR+geofKCx5VkW8eTzlmh12d8fTyJdIbDveXNKsNTXCcPn7C1eUlUiZ9/tB3nF9f0TUNgpDUVNueWOboPCfLMoaupes72maD94YoFccnx/zxf/vfYoPjk6efMZ3u89d/93eZTwtWq2t+/NMnWOdYLOaUxZczon9l0fU20Lee4CBTJXlWkumkzUWo8UgbEWi0KEeBffKmV1WBznOUzmjajrbt8T6gC5UWxM6PEGhF13VpYRMjmVLp6Ckl1hikUmn2GDxaFbiQPhdCSMyHGNFSp5EcoHSOdxZJ6mhjhOh9gsNIMepY0/KjH35ZW2pHfSxC4oxBjBZYIQJ93xFiREtHpjJk9KN5IXU6ozk0HVWCJ0qVlAPOJfsuCaChpUSPHaKPKWH2ttCmDXpAqQwvDVIKiqLA+RQBo7R63RzGAFlWYIcOFyIhSkqVEXWK8UmyrTEefHy9wQ6UVZK1ERRK5zjnyFRy5TiZNNi5Sq8/aE2uc1AZUkQ6Y1AymSfk+HNy1iIR5FqjXUJvRlKWJaO+mBHwnStJWWUUVYHKFIFff9G9hY0nQUL8lQ+CNJm+LbTyl757IQRSSKRQiOhxtiM4w43bMDc917nimbTcFZpd33ChFatuxZ3JBH/+krNJxrZbc5U3vHE0wZxe46ucmEm8jpjMUy3nVNYxxA6Vg1JwvWu5LKZM99/h682atlnztH2BqwqErtmTmvvH73D54nvUYcc8z5llFeetobp7xHvVb3H29FNe9o6d/RRxFvHLe9ydHyFFzzvHR9ytFtBsOZCRF9sNzbolWIsZLJN5zXw6wQyCYbBorVku51hr6U3PYJJdPsbA1fUVnz45Z7lYEIPjerXiYO+Aptnx1qMHXJy+5MXT52w2Hc4Y7j44obmxlJO7qIP7gKI0W+oq5927C8ruHNee8eLjn/Ps+SnH+8skVV3vaLuGJ89e8tlnnzL0A7NpzaTKWG93SKGYTecJ63qzoqwq9o/28d7SNluasYla7h/y0cc/5/rijOViQTEp+OGPf4IULS9Pn/InTz7m7PwiNTVRsDdffI4D/RXXryy6zkVWq4bzix0nRwOL5QTyZBoQUiBlkqyIUWJhrCWTPVIlSVSeJ6pPyg0ac6aiRwmNM44YAtaktNsQPHmeo1Wa1TprU/yxTxjJPC8QIpGzNArnTMqx1zp1rCGRunSeeALOBYL3aakTwms8ZaZS0bfO47xHCckwOCKCTKfPDSNusreOQmuc64mk7lCJREmSQqYHxygZUkAmIUaFJ6YQAm/hVnaER+i09fYuvXbnPASPzlPUiNYZUaa5rYgpdicrCqR3SKlQKkuSN6WI0aOVIs8rnO3ROvEmhJRoIkWmyXWWvq+iIgabpGRaoaPGhEAg4BxkKvnoUzijJ40O0kNAqjT6kEpTVkl1EAHjLEVZ46yjHwYqPWVWVGxD6na0UriYjDJJcqiYVQV7i5rjgxnzSf0vRdG9fYrdRux8YVP2S9dfpY1JkcYrQvB54q8YR0AYCt1T1wUzJRgKzVQEgmvocshCgZYWiaERnvpgHzUkIti0LFn1LdUbd9kbfMo/ywTr3ZpdqZnslbxlcgoj+FlzRp9lCDWg7Y7j47e5OZUo9xkz2XJQTFnmB6z3S75y8DtMf2bQfsJnVwO7ix8QReAre3eZVnt0l88o9MBRtcdbywNOJhMuV5BLmAdH9IYyy4kH+zztDLPpBKN7JlWBJFDkOXVlyKuK1WrFrumQI6d5GAyz6ZTzqzVN2xCxaKFZLJYsFkvu3b2HVpq95SFDb5hMZggcP3/yhJd2yraLHB/cg3KOnC8o3UDcrAiu4fzZZ3z66Wccntznqx+8z+GD+0TncdbTDAYTIlEpglK0NmAd3Ln7BvcevY0qatp2QKks7WqGju1mQ7PdUZQlKstxxpOrHOd6Lp68RIvAanXOH/3RC6SE1WqDtZ69vX1i8Aj15ff0rx4vxIC3juv1msurNctFRV5Mk/RJyoS3i/q17tI7zxA6hExov6IomE7nWHdKJNK0DWQagsF5k0YKwQEBrdRrM0MEUCl+/BbcrbMMRIJqayUwfYrQIKTQRhcdiITm895iQ3LB3ZK5IiKNJILHukA7GHIlEqMWsN6Ny5/kXEsgkxHXePumjCmqu9A6AVJ0cmrdZmHJEFGSlDgQ4+tkX0aDgHeRLMuxowPMe08IDq1Th6lVQkQikz46bcsqdJ4njqcQaKXJixrjEqYyr2qUSInLSnhiNGiVURYFWVkiSCGF+KQoUFLggyDLCkwMCGlx3qG1xvlAlqVMOVRSGCilU75ZnpOTpGAhRkTXIWIgL3Kk1jTNmqqqmOqca9fifGIsh5iSc8ssYzYtub8/5c27h8zq6l+SVdptcxu/+C/jx7dTEPF6ni7H2biQYiSM3Z5UBFKq9L5AYM0NTkypbM4TOXCSJ47ARwwsphPe9hmddzzr1mzrguN6yrEs+bQ5Y206rqPn4XyPBw08Hc5w/pqgp/TMWNx9i2zjqW8uQF5QS7hbvstHvqN8dI93rixic0M/7PHDZ0+xT39BWSi+u3ibV6eXWFpwG1Se0XVrvjJ/g53fcXe/YlksuVvXSN+zJwJLAr5bp6O2CNw92qcqCpqu48Z0OOfIixohJDfPdmSlJc+zZJzyjvXNiocP7rO3f8jP/ux7TCYlSufszw/5re98l+XhPg/u3WG7veSjTz7i6eMn7C2PMcNArwrk3gmZqui7HXuLAwYTyTNwRJpux2q9YjaZ861vfZN7775Fnhdcnr7i4vyCi8srVptt4ugOHdNqwny65Ktf+zrLoxOKakpWJSmsGQaGvme7XhO8T6RDO1DojOlsxtfee59PP/6Ir3/1PcwwsN1uGILl6dPnnJ6fM5gOqSqUzr/0fvvVOl0tyCcSnQUG17JrdlSTHJ1VY4DfKHKPqU1wzqYuTUq0LimLgkk9RQiVrMTB4azDjtv1NDYISDWOKmJ4HZzog38dmaIyjRRgbI8Qkq6xeOdQuX49S0uAaTmaNTyEtKjTUhNcknwRw+tuMMZkcVYqdW7epeItBfgQMH2HHI0ImJAeKwJciBSFpJAKaSXWpAKpRl2kZBw3hDFdQIDOctwwJIB3jAzWkmXZqHQlDfGVRumcoduSZRVeZTibxivEiBy76RBDGnnIYsx6Cug6LbBECoJjWk+Y1hVeJsVCqRXVdELf90QhkJkikhFiIL9dMBKIAawZKLN04hACqrJOtl6tEEKyV5bJeYYYZ+siEc1iUjGURY4UPT4GvB8B30QyAdNcs6hKlmXFvKoIv/492nil8U0KvpcEEX+54L4uyLy+327Tgm/xp0n7PXa6EgoN9aQgiyVLViyrGt8ZqmgJec+cfVx3QzZpCZlnvjik2EGlLUZb8sqznE0ZSs1ijFGSdYkuD/ik65ktpnx1+nV215+RVXf45HrF1r1CaMXX9u+yDJIXuzXBrSlzSR1rXBy4s9hn214wFDPuTRe8Oz/mKK+I6hjre8Sw47w5pVtfUxlHPZ1RZJpV0/Ls1SmQEnHvP3yAmHtM6MAbohd85b0HnJ5viS4wmZQ0TUsgcHm14qNPnjKdptzD+8cP+Jv/yr/CZFIzX84oC82LZys2Nzd88P7XWe7v0bYdjYHdjWXtO3QxYVYWONMlC7yIdL2lbQ1vPnrE3YcPmM7n7G5uOH91yieffsrLs1e8ePmCruuZVDVvPXiT7/7mX+ONdx8x399DqowYPVKk9/v12Rm7piErc05fvuTq1Svefe/rHN25w89/8kP29+ecX5xxdLDPwzfu8tmTx9y7d0JZV5yenVFVBVn2L2gDLmvNYlmy3CsoagHSJ8KXB3QCr8ioIYxC95A6VW8DJYK6rOnznKIo0gJFqjS8Hnqij/hRo5vlOd45BDLlf43FJNM5MQSKskxZXYC1FmdNWr75dDQPwcE4ughi7CBH8frtsizPM6IP6XgsBdY6gghIodPWOqaIGZ2NIxOpUtEpcjqT1BREXrNUwxhCKNU4Y47pv5FjYkMMyaGXaUWuJCLTo8sldX6ZzrG2QwiJHkPvhhHoI1VaYFobxze3GmVajlyXCMHruaq1FqTC2w4bPFVVcXiwj1aa3nqiFNRVwbSajEYJQdQJOo+3iFik3Dk8WJfCKLOMup5Q5BmzyQQhVYpKIjkRDxaSy5vr9PPwyXihVZIHqgi51HTWjLdEeg3BJW1v27Xs2pb0vPyXo9N9ff2S/vb/4xPjqenzYvv5x7fLz/HXxtOW7ltcVvH28g5ZvkdfR94bPPX0kMu1Z14XvI9mUh7xdBO4qQIHk0dMzIq6PuSTqy1GBd7cu89Bs0RlBT+9aehiw6rb4KcHPCofcbHtCH5Ai0AuFcZ2nBwf02wEvSzxMlConL1qyvFixsRU+DhQa8FJmdN117j2FX13Ru9bgjdor1hfKq5fXlOWOduRD6KzgvW25e7dgsXRnJ+8+Cg5+qSgypYs3/0G12dXKOcokDx/fkap4Wj/kN224avvvsMf/J2/QxTQm5bnP/iM7W5HmWmqquTps6d88ulnbJstSmX0i4f0HZzzU+oq5+DoLrMo6F59zO70JfPJlEdfeZfp3hJ8YH1xydnLV6w2a5q2Yxgc00nN3cNjvvtb3+Vr33ifgzvHKJ1hjSVEzzAMrC4vuD59RcwUnsB8sQcx8PMP/5JXr55CSDmMLgSads29k2POT1+RFSWLWY13e+x2W2T88nv6VxfdScZ8UbG/X7NYlEwWNfPlnDwrCdETg0xHeikJPh09fQxJfyoG8rxEKUFdlXifBOjW9Ijx6J38+ILgU6dog0MJSQgSNaLzsiIfVQmp+/XOpnGBVK91rSEBA9Lya+y4JaSuOUYEikzluJhGCN6nMUGIpAgi0kw4U5EgoCwLrEvFvdaKuijpuwEISNLyMIxvQmTAu7S0UmqUDsWA0qlQZlonfoKKSbI1qjU+f4Omrb71kUwGAiNjYTRJiHHjnxUFgzEEn/LkBJE4OvikVNi+gSjZny9Zzqapi1RpFpznJYNz5FmGi1CVFdaD6TRaenwUKJWhIsQYqPOcQipm9ZQsz6mrCc6lSHipJEUWU5DfZoPS4MaThfMeEQLzYkLv7Njtk9QNg2e7brkAhA+s1xX6y3lL/wNcAVC/NGJIP8UvPBLEreGD18X1dafL+DMaT1C33F0hBM61hN6j5wdkfmB6uOREvUe7atlUBkTGvpriVxYXG5zQhMmCN8tDLpqOrLC4sGXjOh7s36G/blhOYSYLikwwqwqOju4w6Ttys8EJQ1UVHJVzvjq/w3SzxJUST8N+VXNvusBst8hty9nFOXa35vGwwdiWEJO0MtlhAj5qRCaxHWgTsJ3BhwS2ci7QdQMH945RrzJcMEQEje9pRaBfHNDe3KBLwWT/ANUZ3njwJt/9je+wN58yX07487/4PtY4Htx/wMM7D9GF4od/+X3OL6/I8oIsz7m+uWarlsjZHWIcWG0ueXDnmKV3RL/DmoY337rP0d0jdK7YXl9zdXHGerNi12xwzrF3sMfDk31+8zvf4oNvfp3l4T55UeBMT7db0ex2rG9u6DYNfdcRtKK7WdH3La/On/PDH34Pa/3/u70za5Ikua7z5x4ea2bWvnRX790DDDaCEERBJCiCRpleKJF/QH+Iv0Lvkt70IJnM9AiRIClAwACcpdEzPdNdS9deucfq7nq4nlk1JISmGcAhzFC3J7snqyIja/G4cf3cc89hdTAgy1LmVcnlxZS9nV22NrY4Ojmm1+uRpYbp1NL9IySif+mqTzNDvydGgiuDgpXBKuubOxgM0/lYlP+18BUdgmPKcxEVrkqDxhFFiixNRFMgSDA6J2pW1jk8QplaYIkKwRY9SjQEWouzVpKd90RRqC4ioZrpSAe7G0cUSyK31glk4SxK60DRUjS2w3joOkeioQMU0tBK8kRseLouJD9D27UMBgOGkyltY0lMcKQIYjDWeryXKlgpTxRF13J/UYTRGm+twBQQknNEF7i+GoEcrHNExHITU0K81zoK8ItejjZLQzKIr/iOLO2LyaYTc8w4kXMYE5GiiZQRNoIFkxoiJ00uH7Bep6CravKsR6eF4qeVI89SgUxaS61ber0eeZHTVBUzoLYpK4MV5vM5SZTivMIBk9kE72V02wbIQpqGMLUzfN0yvJqiTfRLKVlffCwSKNc3OxZMBXVND1scHRKuXjBPbiTb6/DEpkXbKf31DYrEkG9tcmd1m2I2pFItRVJIA6qecU5DkmesZH02Zw2r7YypL8mzgkG+yrt3n7I9GzF2FVnmGRR9Hva2WI9zzsoJnarpbEmuFbmas1WXzLqK0eiQo9mQ/aak60qsb5Yj8dZZPBbvXXhY0eqgIyoMvta0nVvCXM6Jseu8rCmqmNQUtM2CBeRIsx5x1qfIV0ks+PiIr+3t8Sd/8PuMhpfYrsHWDQ/v7tBZx9npERtfepc0S6jqEm1iNjY3uTw/ZTS8hGiANgW2mlLS0OQJ2caAXlQzeLjL3qN7xGlMO59ydfqG0eiCsprRNC06isiTmHffeYdnz56yvrGGiRVtOWV4dc7p8RtODo8YDickSUZvbZ3ZbM50MuLTz15y+OaIOzuPiE1E25Zoozg8OWY+nXJ8dsbD+3scvjnkcP8zIhOx0ssw5lcdjog0SSJlf54X5L2Mfr9PojK6zjGtx3jZsQtdSknSJVJ0Tce8HNOUnjg2bKyv8mr/DZExuNYG+laY+/eetquJtApuB5o0k/E7rTXetzjElFGkGjV4K5MmCL/V2+vPi/mhDcNdljgyotylZKFFkaazHh0ZamuFUtZaih7gZPxVjBoNjbUY58iSGNs0aAXGiBW8KBFotHK0nbjmRlrjjcIFse9Iaaz2YcLML0n4TdeFalYucuesTJ+hcK7FKzBG2AqxSdFakqVGzmW7BeNYdGpd26CzDBPYHCaKaDpHnBi0jsjjIMZtHTqKiSNHnGW0zpGmooWhjYGuIU8MJjb0ewVxnFI3LbP5XOx7BqtkvT56OGI619jWygWpIzG4jDRX1ZSei/G2wzqHcoLdV7ajLGuwogW8gIz+WUMRph6ET7zk3d6EGYQhtkyq19zcRXMtwA3cSNQhbGSJ/AznpiQ+I/OW7b0dtptNrqopPonYeTDg/qTmuBxT+pY8Tbn3YMDDquGymhDFUrRsxykP6oyrasa0vKSaH3Nx9ZLLrqZsauq2pGsrvG3w3sq15MS52+FwvluKGjnvhfqJD8LtNrh+25CIFWmuWMt3GR5cSSPaA86TJgng0DZmkK8yrUdhACFiZ2WDROV4PSMeXrL3pcd85dkzskQzNZpHT9+hms24OD8hi6FfxMzqEe+/eMX52QnjWcVweEE5n8rw0uQCm+S0cQ9zWsnY8/07bKxnbN+9Q9bPqeZTZsMrhhcn1PVMDGA7se1aX11jZ2uH/mAAwHw6ZHY14fTNMa8PDji/HGK9YnUjw3jPtKyYTMfUdUWSpDy8d5/d3S3eHB/w4uMXFHnBcDThg48/kdHhfsHoYk7TzOlvbpCkv2IjLTIRSZKQZ336xSpZ0sfEhtTkZFnOvJ7gXQdKGlAKaJXDaycYZTVjMqnRQfbROUdiDLVt0Ij2aJgQQClpmHsnjaIowA/eOqkqvRc8VGtx+nUO77qAfyYi4ag1rhMzRhUqS+usDDhoI5WokqpSK03TNMRJSt3WdM7StB6NQBBxbFDao70OCy2liiocXu782oQmkcV2oCJxBFYAnccbQxwnKO8w4YcjIuuiwaW9R+lItubaC2c5OBZ4J0I8nXOSRKMInODTtrMynOIt2ossZZoV2NYSFRG9rEBHskswoTpZ8E+7rsU7MHkf27UkJqUxLc41KAVZ3mM2afHaoOOUpnWkWUzRS5nPp1TjK6xdIU5ier1iCdXUTU1R9KlaEX23SjOrShKv6Lwi0IxlV+Acznqw4LvfhE6aSE6Kyy94taCQhRSqRUtBaR8s16+ZDEKb1KGZdo3vLl6PIEN0ruXq8jOmoyPik5zR7j16+YBYG3RsOIvP0U1H1jXEOJp5xauTGbruaH2LtQ3n9ZzXbY3GhmrUhaGYpWSPPPyNh7sWecJbgQ+Cyhzeowjn8aKO5q1dJmCFYWNlh997+of8tH2P5y8+EAtyPJPxFbar2N3ZIjPFEpqJ8KzGinZc0rMt3/7db7C5vkLbyui4dZ4P3vsRzlnSOIfIMGtrfvC//gezSSlUMSWJLEk0Vd3irEyVDgYFa3lObEtWfMPmyjbZoCcMiZMzTo+POB9eMJ7NqNpWbNQV7G5tkiYxrm0ppyMmwzFnJxccHZ9weHpG6yBJUrxWdLZjc3ODj5//jNl8JhO5RcZ0dMVsMiKKQOOYTkpOT6co79nb3WB1dUBTl0wnU1b0r5h0kyRh0F9jbbBFnq1jdLqUYIwiEdi2gdKlQmdXe/BaeJkuYERJalBBVMR2HTpCBhC8AyvW3EYrNB4fGaKAdaZZiqiVKlpn8X6xffdEKDpvcV1HkffAeaI4oWlq8J4oku68UgaNwoRJKGmaSVJru5YkSZjNZhAZ2rYVdwklbsJKOUA4vmmSkKUpnZWKQJsIEwlsYQOsEAUOsAtiOYmJsbYRAR0rMIe6oa7ltQhhKy8XtNYKHZnQBJSLWpgWHQ7RUu06JXY4ztF5L5KXoWo2YbzYetBWbnxGCe83imJM5Om8lUahiYk7sezxXoRvbOfoD9ZxXYMjou46TN1Q9HL6/QHj8YjZeEhSiMlfnvfoOksXbn6b/S1GUYT1sGk3OLk8DuaTfqlQJipvXsaC/xGcxn/quE6SgHLXCxmBixbVr9JcP24kWKUFz70JSQDXesJhvXlncVS0ruZgfyS6DYj0pvwX9CrCkIZBnEwiFTR8AQHxQpHiQ5Uq74ZfPl/8e+NPgAycdyHJurA9lPUtDEeHc600gRVEUcTdzcd8/dm3qYee5y8+oKoqsYWKYyKt6JoW12o0Maku2C0ecF8VPPnyHTbXB0xHl3RtQxobbDPn4aPHRApefvycSTnl+M0ZhweHuE6ztbXD5tYOz188p+1qmqaiKivK2qGjnF6/z3rsuNcfsLsxoFjtY+KE4fkp+4cHnJ6eMpqOuRgOuZzUOKfY3Nxgc3UAOOaTCaOzU4ajCSdnlxxfDBlOw+4tSZiXJbNyxqBXsHvnLnGccnJ+wgcfvs+/+6M/ZDS6YjicMivnSzroaDRha61PmhtWV1fxRIwm07euuV+adPv9NQbFOlncJ9YZyhnquUVbkWMU5SgXKgB5TaTDr9w5olh0eGOlieMocEQ7vAPrWlHt10oaOVoWrYz/ikNEhEy4tVpBKwsmMYbOtigT49tWtiBdK1tnLTisVbKF9p1QmnDy2ihOUKF69J3MWkfGLDUOGhtgDxSJRswumy64KSjZOrSyMJ0DtApuwwYTSdJz3tM2DUkcVLvQeIL1i4oAG2QXCRWgRStNFBqSUj0LwhgFE0hxkJCvSyuP64QH7bzFa49u6rBTEF0GFORJClqhjQ6yjE6GL1DMqxlJUlD0e6iZJHvbddJoxGCSmM56olgEtq33rPZ7rK1vMp9NSZKYuq6ZdlaclZOUq/EVnXWsbWxLIu5a5r0VXDmlrmusb9FG6Gtay+9kqaf4zxoyS7jgYMvzheNFjEIyrQr8XLQD7T7HXtCLqphFQg6wz0KTYcHbdgK/+UWhIi3c64ZdECrTXoEKtkZ6kcDD1xdoh/7Gz877a9ofyK6JMJG4qGIXfoeC38pNwHtR3rNIdbuQ73Qo0qTgwc5D1le3KPoFg16P6XRKHMesr/Ypspgkiri/+oiEjDsrd9ldvcuD+w8YDHrMZ1MGg1VcW7O/f4BGsfco4vTygtOzE95//iHD8ZiVlTUePnrMaHzJJ5+8YD6bhDVmKLKcNIbIKHaLmDsrBU/u32X77i5JnlPNZ5ydnrL/5pir0ZjT80vOhyOqtmVjsMqgyIi0TGJenJ0wHF4wn3dcjkqqWthSURSRZRkKxfMXLzg4+JR3v/wuf/Cvv8v3v/992nLGyckxDx7s0XaKv/voI4p8hqdiNK64Gs7Z3XpMVU5BObJi5a0r7pcm3V6Sk+oUTQROY1sopxVt1dG6ail07YUkK1WAtBdk62UicZ1twITml3M+CNh4tBEalYkSQpsJpRRJFAlvNeixNlFEhUAPeLvUYtBKLhNx+pWLODIRtm6lEedkO60CBhpFHms7kiShcTIQ0FQVRmvazstNgGtKUBxFGGNEzDiKaDpD5CyRgtaJURHh4nOwpKsppTEmwURgMbLb0zroHGjZ7csdRdTylQyaKBS2a0iSDG2MOESAMDpsR5wV2K4RQfTOCp4YWB8e+d6EPmeEwRFpiKMweOLwKqP1wjTQtiMyKWliaNoGp8W6pfUVRW9AU82AiDjJaFpL2Vh6eUyvP0AhzZThcEQbcKEIxdnFCU3TsLKyDloza+bUbU3dlOR5Qi9LGPQSktSQJIok+k1gL1zHsgGqQ7JULjTQrpPpTVz3/98IvFYeu3H2sOP3cl4IuV19riq+OYnsEShGLY4P1EZuJl0f6H5cJ2PBZkNTzLllleuXlW74vJOdqPVuWTODNHd70Tq2dHz26gVn50d474WeiKfrUuraMxpesbK+zW7+gPube6z0+1TzKeVsSNs6PptMuLe9xaOHjzk9O+avfvC/eXN8DEqxd/8R5vSU2WzEq9ef0DYNk/E05BSB4Tpa1tc2KHorbKQFX33yhAf39yj6OVU54+D1az58/hHnl1cMJ3POh2PGUxFvitaQPkgsmrij0YSr4YTprGTegFUCnRZFQdXW5HnO2kqfn43G/NXf/g3j0ZhvfO1rmAhefvqcy6tznj35Ov/2e9/j4OiI//uTn3B4fMr+2YhHDx27d+7zev8V0/mvWOkKDUYaXi5skTttUTR0rqSjQ2sxLXSRNBI8MqjgQ+VmYo3ynn4vxSiYt8HWheA04Dw6NmF7pUWMJY6J4xijFW3XSQNJaYEiIuHGOifJzeMDE2IhfyhKT0qBNolYK8cpXVuFVS522R6FMoa2rsI4pyRwHUWkcSyaDklM5sSzTG4OEXUNJjJgGyItCW0h5SgKX2C0MBxc2xJFGq0TsdDxHhv4ElrrpRPxomMuNxFJwLGJltW794JBa7xoVDgrWds5THDvtV2LbRuauiYxBov4zHnriWKBS6wXFbckjulsR2xlCtB5S9M0mDijbUXxbWVljdlsirUteZ4yK2c4D/1eQRrLhjfNUpGptDII4m3HbCauqlrBzsYOUZKgrkCrjo21PlsbA9YGOSuDHlnydvzrnzokcUqFK7nuptCjC0iDusZJuX5IEl48v8nbXfbYwusXlfM1ngo3C/3wPv560MjrxWcWUIJ8rXbR3/PXRp9yrgWM4yDof9hQ4fobSVegqe66eeYDcwE5l/eK1f4O3/3mn7Bd3OGj5x/y8uXP5TrSEbaztG1HEmfM65bdLGW7t0KeZ1wOh5R1iTGa+WTOt//Ft8iSjJ9/+FOOTk/ZPzohz3pkec7B61c0XctkMqZparpWiqE8EmcY7zxJnJGlPQbFgC8/eMDe3g5ZL6dtGg5fv+a9937My5evGE2nWBVRVQ3eOVb6fWFLuVZ2ZMpTVhWTyYxZ1WKJUJEmH+QMVleom4aDg31Gowu++c1/wf/54Q/56OcviFTMowd3Ob+85PT8lKPjC+7fe8zjR4/5l9/+NhsH+/zs/Y94dfCG7Z0d9u494vBo/61r7pdbsFsh+uPEA6r1Dtc6vG1xvkIZh06NUEycRovXBNpHQXdVBZEWS1YkxInBT2VIgoBNRSYRWpQxYS3JNmzRgW+7LljWEGhXPuzLRUTGmCxgoB4T+JPGxKA0JvIyHhsZ2jpU4Dg6J80o5YSyZt31tk3Ea8Trax54qULDlA5yWdfESULdCm9RxcJR1gjXFxVR9PtkWYyta+LEgIrDgEHLeHQlWKmRbatTQifTaSRfq4cszUTByYubhPWeNMuXY7WRk6mypmmJuibwlztxj3C5uC0HVwilRXEtDxi2846mlVFhG6fUdS084tB4MUZTl1OKdJ0iy8OWE5Ikx9pWBHJMirUdXdfJyPXC8y7SzGdjWtuysrJGFMVsrGzgfItzJXvbm9y7u87OxhpFkcna+E0K7wP90S3hnJt/locRGm9LvUcXoIQlyBAS7g0IYPHXMnEv3nJR5crLbWiGaU/Ab1me17OoeEOJYa9vBNe0LznO+y7c6KXi9Qhu753F+S5UuzcaaUrWPCi2Bpv87rvf4uHuM9ZX1vm7D39M55xMJTpFYy19k5KkBbubW/TyjNFkJgMPcykA9u5u8eknz7FWKuLz4ZjIxDx++oTz81MuLy+om1quP9tJk1V1mEiTxIbV1Q12tnZY6a/x6MFj7t7bJilSWtdwenTEez/9KT/+2QdcDUUSMklz0jABuzLoUaQpXddyfn5OliZUVU1ZN9SdQ0cGo0Vft+1kruDs+JTxZML9+32ePHxEXZXs3t3BFBleJyiVM5lN+Pjlp+wfHlL0Cu7c3ePf/P53+PFPfsKnrw9490vvsL6x+9Zl9kuT7n/+T//l19rp+Iu/+HWe7TZu49cRn59A8wvWjCI00QgJdnGsX6ZAv6iOQyPqGm4IjbgblLPleRdJV30uRUOAzBRSc6vggil9NSXN1sV5lBynljrR7jrpski61wyHhfKdc/Y6CXsRPFriw34xPWjo5i0/+eHf8tnmK169fs35+Qmz+VzYSV1Hkq6zkuf80b/6Fttbq1yeX9FWJfuvj7h//y7zSc3B60+XRdWr/QNGs4r19TX+8gc/oK7naOVpW8u8qskyoSuORhOU79HLCzY31tnd3ubp42fs7GwTZym2bTg+esXz5y/48KMXnJxd0jlLmhV4D03bUKwUbK2tMsgT2nrG1XAG3tN1shtx2mAiQ5zlmLSH6zpoHU8ePmZlbZ3L4TlZFtE2DeV8zHh4zt0799ja2mM4GlKWc7SW3smnn7zg61//HZ49e8ZwOOTs/JL79x68dcX9ZoFqt3EbX3iESlG8ipaJU+pXaV7pBbMBJfv+JS6wwHUDL8MvGmw3Ob7h/wNWKTWq2EYtcrRevOGNjpr36gYqsaCBLYpl6T8EfA4fKld5pfBxPcI3XzxwXUjE19CGU/I9ehYGm4pIGerS8snHn5EeXnJ6fkakUp4+ekJblRwcf8bThw/4zu98hdVexNXFMUXRo5/FfOnhHqPxkGo2o+gVTCYT3hweMCvnZGkiMKDWxEnO6qDHweERVW2xzlGVQRLUKnZ373D/7h6PHj5ia2cdnUY43/Hpy5c8//nHvDo6ZTQrWVvfEGlRrUnSlEgbelnGoCjYXh/Q1CmnZ2fMyhLbeiIjWs/GxPRWN4jXdtlZLdjpRbz//k/48c9+RK9fcPzmkDzvcefONvsHL0XGQGuaxhKblKLXwyP6uYeHB6R5QVs3zKcVw4vJW1fcbdK9jd/yuJntFpWoNKZuVsAS13jt9fE3n4ePLulxSHZTnz/H5477Bc04D1gVEn5QBRIqolu8q7w2MEAWz4WTG3DcG0l3WWW76wQLMkgUiA5LHkVETKxSkjTl97/7x6R5j/OTC3pxxs8/eo8igz/6vW8SR3Bxds54POXOrsHbhvOLE6bzEtDMzq8o5yVFvsrG1n3G0xHnl6dU1ZzYJGgVc//+Y+LkjOl8zGg8Jo5jtrZ22draYXd3l16/EKXBDk4Oj/jwo+d8dnTGeDLBJBl5VlAkOU3TkCYp2WpCnqWkaYL3oJVB6xjnykBjNcSxoVhZx6xs0hXrzOKE46t9jk4OefnJx/T7PZSK+MpXHnJ4+JrZXGRpT88vA8tObq5N05GnGXt7O0zPxygUTx485cnTd9664m6T7m38locPAxFBcB233NrLFl7JBGQ4Vv52QpW8Tq1LvHXRF2CBx4YGGbBs1iofIToeC8z2xqkWH/KgQ6/Ce8R1w4UqOcACKmC/+GipmbAY5100zqR5tmDoBTNStaiYZUDJhxJaoVDWUE86Xl18hv3L/8nThw/pD+4xWLvL1dUZf/h73yBSlquzc5SK2drYoSgGnF+cc3JyTBQlvPP0MUolbG3tsba5zdlwxI9++h5XM8u3nv0uiVH0Bgk//dmHrK2v0rRzVldylIqIY0Oaipbt5dWQJEmYTEa8fPWa129OOD65oCwr1je30bH8NNbX1un3ByIuZeSbm85K5uWMaVkJ0wfRaDFJTrK6gU16WJNz2mns/hnnF5fc23vAV9/5Ei2OD3/+PvP5jDhJSeIeedqK5omSxn2aSoN9PJ5SV5Z7O4/5xte+wYNnT9664m6T7m38VsciJ6pFYvx7n/uHcZPBED6yrFhdoHXBwu5ShWy6GJJ4W/yDwjjAEn5R8aqgveFEIH5J2wx/JLmqJT1NitzFqC+4hUAU1z29BetIBaNN7z1dZ/n+D/6Kzz59yZ/96X8kigx372zh2znHR5dsr29Qd56N3R32Xx/w0c9fsLm+wZcfP2T/7Jg3pxecjc7pH6/T76/ynW9/i8fjKRcXp7x4/gGnJ/s4h6j9OUuWxWRpQRRp5mXJp5/to6MI23VcDa84vbzi6OyS4XAqei1XQ7ZUTB7ngPixJbEB1zGcjJhNRkxnM9Fj0QIrKAtR1qdVhnkH1bzCaS02SoN1mukVRW+Nsp1SpH3Oji/Y3lkn0oqNjdWgK+KoKidsnyjBuZi9nUf8+//wZ+w9fcLq9vZbf8e3Sfc2fqvD61+cWtWiQ4ZaFqxwA84NeOrimMXRUgBLAlQqVMD+5hlCFazU8mR/H2JYvIWISC3wYH8N74Yk2S00m8O7L5KzNM/8kizhPFgvQv4BGkaqZQKWvfg2hN9jTAydCLSXVU05HdM1M1wHw8spsYF8r8erFy/Yf3PCxsZdMZ18eJ83l+f84Ec/pmpacB9jTMLaxiZ3drc5fHNCax2TyQRnFXFi6FQk+i5ZinagTMRwPGHoZ3ivaLuWeV1yfjni8mKM85AVPbK8TxKnpElKkma0bYftWrquZjyZUE7ndF1HluUkaYZHoU2KU4bKKq4mJZfjGqci1tZSIOZP//zPefTsIT/867/hm1/7HVb7fT7+9GN8YSjLkulsRtM2dJ2nqR15FvHVJ1/ie9/7Y979xldZ29ymKAZvXXO3Sfc2fqsjMFQl8f2CQlTdSKqfjwUdS31+8mzBMFiezC7PdH0+HSCHX4zpwqKRpwINUybNFpjuAoJYVLHAUi7VORew2wU0IRKmYXZ0WTGjbtxACCcLk3ddJ+4tcSSuubPpmPFoxPadRxx9ckyeJewf7PPik5dYr+i6iKdPn3B6esxf/+g9us6xd2eTsiwpS8/hmxOGw0vSLGVeVhRpzMZan5m1lLUnSlNMrEi9GArMywpjUrxX4nlYVYwnc6qqJsky4iRla2uXvZ1dVgd9EVMq52gtRgfzeUlZVuA9/V4iiVAb0TrxIqN6MRlxXLVk/XVeW9gsBpTtlP/+3/4rXWV5cP8+jx8/4Oj0iJOTI7T2VGUJSmOtQuuEr375q3z3D77D42eP6A8GJMET8m2h/jFbntu4jdu4jdv49YR++yG3cRu3cRu38euK26R7G7dxG7fxBcZt0r2N27iN2/gC4zbp3sZt3MZtfIFxm3Rv4zZu4za+wLhNurdxG7dxG19g/D8GDVx+dznetwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from PIL import Image\n", + "from torchvision import transforms\n", + "import matplotlib.pyplot as plt\n", + "import json \n", + "\n", + "fig, axes = plt.subplots(nrows=2, ncols=2)\n", + "\n", + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " input_tensor = preprocess(img) \n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img)\n", + " plt.axis('off')\n", + "\n", + "# loading labels \n", + "with open(\"./data/imagenet_class_index.json\") as json_file: \n", + " d = json.load(json_file)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Throughout this tutorial, we will be making use of some utility functions; `rn50_preprocess` for preprocessing input images, `predict` to use the model for prediction and `benchmark` to benchmark the inference. You do not need to understand/go through these utilities to make use of Torch TensorRT, but are welecomed to do so if you choose." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import time\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "def rn50_preprocess():\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " return preprocess\n", + "\n", + "# decode the results into ([predicted class, description], probability)\n", + "def predict(img_path, model):\n", + " img = Image.open(img_path)\n", + " preprocess = rn50_preprocess()\n", + " input_tensor = preprocess(img)\n", + " input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model\n", + " \n", + " # move the input and model to GPU for speed if available\n", + " if torch.cuda.is_available():\n", + " input_batch = input_batch.to('cuda')\n", + " model.to('cuda')\n", + "\n", + " with torch.no_grad():\n", + " output = model(input_batch)\n", + " # Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes\n", + " sm_output = torch.nn.functional.softmax(output[0], dim=0)\n", + " \n", + " ind = torch.argmax(sm_output)\n", + " return d[str(ind.item())], sm_output[ind] #([predicted class, description], probability)\n", + "\n", + "def benchmark(model, input_shape=(1024, 1, 224, 224), dtype='fp32', nwarmup=50, nruns=10000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%10==0:\n", + " print('Iteration %d/%d, ave batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output features size:\", features.size())\n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the model downloaded and the util functions written, let's just quickly see some predictions, and benchmark the model in its current un-optimized state." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "./data/img0.JPG - Predicted: ['n02110185', 'Siberian_husky'], Probablility: 0.49785590171813965\n", + "./data/img1.JPG - Predicted: ['n01820546', 'lorikeet'], Probablility: 0.6445754766464233\n", + "./data/img2.JPG - Predicted: ['n02481823', 'chimpanzee'], Probablility: 0.9899807572364807\n", + "./data/img3.JPG - Predicted: ['n01749939', 'green_mamba'], Probablility: 0.39485082030296326\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " \n", + " pred, prob = predict(img_path, resnet50_model)\n", + " print('{} - Predicted: {}, Probablility: {}'.format(img_path, pred, prob))\n", + "\n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img);\n", + " plt.axis('off');\n", + " plt.title(pred[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 75.34 ms\n", + "Iteration 20/100, ave batch time 75.33 ms\n", + "Iteration 30/100, ave batch time 75.35 ms\n", + "Iteration 40/100, ave batch time 75.37 ms\n", + "Iteration 50/100, ave batch time 75.38 ms\n", + "Iteration 60/100, ave batch time 75.38 ms\n", + "Iteration 70/100, ave batch time 75.39 ms\n", + "Iteration 80/100, ave batch time 75.39 ms\n", + "Iteration 90/100, ave batch time 75.40 ms\n", + "Iteration 100/100, ave batch time 75.41 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average batch time: 75.41 ms\n" + ] + } + ], + "source": [ + "# Model benchmark without Torch-TensorRT\n", + "model = resnet50_model.eval().to(\"cuda\")\n", + "benchmark(model, input_shape=(128, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 4. Accelerating with Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Onwards to the next step, accelerating with Torch TensorRT. In these examples we showcase the results for FP32 (single precision) and FP16 (half precision). We do not demonstrat specific tuning, just showcase the simplicity of usage. If you want to learn more about the possible customizations, visit our [documentation](https://nvidia.github.io/Torch-TensorRT/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP32 (single precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP32 precision.\n", + "trt_model_fp32 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.float32)],\n", + " enabled_precisions = torch.float32, # Run with FP32\n", + " workspace_size = 1 << 22\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 41.02 ms\n", + "Iteration 20/100, ave batch time 41.12 ms\n", + "Iteration 30/100, ave batch time 41.22 ms\n", + "Iteration 40/100, ave batch time 41.14 ms\n", + "Iteration 50/100, ave batch time 41.20 ms\n", + "Iteration 60/100, ave batch time 41.20 ms\n", + "Iteration 70/100, ave batch time 41.19 ms\n", + "Iteration 80/100, ave batch time 41.23 ms\n", + "Iteration 90/100, ave batch time 41.20 ms\n", + "Iteration 100/100, ave batch time 41.21 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average batch time: 41.21 ms\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input\n", + "benchmark(trt_model_fp32, input_shape=(128, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP16 (half precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x.1\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP16 precision.\n", + "trt_model_fp16 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.half)],\n", + " enabled_precisions = {torch.half}, # Run with FP32\n", + " workspace_size = 1 << 22\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 14.48 ms\n", + "Iteration 20/100, ave batch time 14.58 ms\n", + "Iteration 30/100, ave batch time 14.72 ms\n", + "Iteration 40/100, ave batch time 14.73 ms\n", + "Iteration 50/100, ave batch time 14.70 ms\n", + "Iteration 60/100, ave batch time 14.79 ms\n", + "Iteration 70/100, ave batch time 14.73 ms\n", + "Iteration 80/100, ave batch time 14.69 ms\n", + "Iteration 90/100, ave batch time 14.68 ms\n", + "Iteration 100/100, ave batch time 14.69 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average batch time: 14.69 ms\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input\n", + "benchmark(trt_model_fp16, input_shape=(128, 3, 224, 224), dtype='fp16', nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 5. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT for EfficientNet-B0 model and test the performance impact of the optimization. With Torch-TensorRT, we observe a speedup of **1.84x** with FP32, and **5.2x** with FP16 on an NVIDIA 3090 GPU. These acceleration numbers will vary from GPU to GPU(as well as implementation to implementation based on the ops used) and we encorage you to try out latest generation of Data center compute cards for maximum acceleration.\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. If you run into any issues, you can fill them at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.2.0/_notebooks/dynamic-shapes.html b/docs/v1.2.0/_notebooks/dynamic-shapes.html new file mode 100644 index 0000000000..6cc136aedf --- /dev/null +++ b/docs/v1.2.0/_notebooks/dynamic-shapes.html @@ -0,0 +1,1750 @@ + + + + + + + + + + + + + Torch-TensorRT - Using Dynamic Shapes — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Torch-TensorRT - Using Dynamic Shapes
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ + + +
+
[1]:
+
+
+
# Copyright 2020 NVIDIA Corporation. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
+
+
+

Torch-TensorRT - Using Dynamic Shapes

+

Torch-TensorRT is a compiler for PyTorch/TorchScript, targeting NVIDIA GPUs via NVIDIA’s TensorRT Deep Learning Optimizer and Runtime. Unlike PyTorch’s Just-In-Time (JIT) compiler, Torch-TensorRT is an Ahead-of-Time (AOT) compiler, meaning that before you deploy your TorchScript code, you go through an explicit compile step to convert a standard TorchScript program into an module targeting a TensorRT engine. Torch-TensorRT operates as a PyTorch extention and compiles modules that integrate into +the JIT runtime seamlessly. After compilation using the optimized graph should feel no different than running a TorchScript module. You also have access to TensorRT’s suite of configurations at compile time, so you are able to specify operating precision (FP32/FP16/INT8) and other settings for your module.

+

We highly encorage users to use our NVIDIA’s PyTorch container to run this notebook. It comes packaged with a host of NVIDIA libraries and optimizations to widely used third party libraries. This container is tested and updated on a monthly cadence!

+

This notebook has the following sections: 1. TL;DR Explanation 1. Setting up the model 1. Working with Dynamic shapes in Torch TRT

+

torch_tensorrt.Input( min_shape=(1, 224, 224, 3), opt_shape=(1, 512, 512, 3), max_shape=(1, 1024, 1024, 3), dtype=torch.int32 format=torch.channel_last ) … ``` In this example, we are going to use a simple ResNet model to demonstrate the use of the API. We will be using different batch sizes in the example, but you can use the same method to alter any of the dimensions of the tensor.

+
+
[2]:
+
+
+
!nvidia-smi
+!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org
+
+
+
+
+
+
+
+
+Mon May  2 20:40:30 2022
++-----------------------------------------------------------------------------+
+| NVIDIA-SMI 470.57.02    Driver Version: 470.57.02    CUDA Version: 11.6     |
+|-------------------------------+----------------------+----------------------+
+| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
+| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
+|                               |                      |               MIG M. |
+|===============================+======================+======================|
+|   0  NVIDIA Graphics...  On   | 00000000:01:00.0 Off |                    0 |
+| 41%   51C    P0    62W / 200W |      0MiB / 47681MiB |      0%      Default |
+|                               |                      |             Disabled |
++-------------------------------+----------------------+----------------------+
+
++-----------------------------------------------------------------------------+
+| Processes:                                                                  |
+|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
+|        ID   ID                                                   Usage      |
+|=============================================================================|
+|  No running processes found                                                 |
++-----------------------------------------------------------------------------+
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Requirement already satisfied: ipywidgets in /opt/conda/lib/python3.8/site-packages (7.7.0)
+Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)
+Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.3.0)
+Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.13.0)
+Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)
+Requirement already satisfied: widgetsnbextension~=3.6.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (3.6.0)
+Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (8.2.0)
+Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (1.1.0)
+Requirement already satisfied: psutil in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (5.9.0)
+Requirement already satisfied: tornado>=6.1 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)
+Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (21.3)
+Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.5)
+Requirement already satisfied: matplotlib-inline>=0.1 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)
+Requirement already satisfied: jupyter-client>=6.1.12 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.2.2)
+Requirement already satisfied: debugpy>=1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.6.0)
+Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.1)
+Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)
+Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)
+Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)
+Requirement already satisfied: stack-data in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)
+Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)
+Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)
+Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.29)
+Requirement already satisfied: pygments>=2.4.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.2)
+Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)
+Requirement already satisfied: pyzmq>=22.3 in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (22.3.0)
+Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (0.4)
+Requirement already satisfied: python-dateutil>=2.8.2 in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (2.8.2)
+Requirement already satisfied: jupyter-core>=4.9.2 in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (4.9.2)
+Requirement already satisfied: jsonschema>=2.6 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)
+Requirement already satisfied: fastjsonschema in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (2.15.3)
+Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (0.18.1)
+Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (21.4.0)
+Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (5.7.0)
+Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (3.8.0)
+Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)
+Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)
+Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.8.2->jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (1.16.0)
+Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.6.0->ipywidgets) (6.4.1)
+Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.1.1)
+Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.14.1)
+Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.8.0)
+Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3.0)
+Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (6.5.0)
+Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.3)
+Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.2.0)
+Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.15.0)
+Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.21)
+Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.1.1)
+Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.7.1)
+Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.2.2)
+Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.8.4)
+Requirement already satisfied: nbclient>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.6.0)
+Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (5.0.0)
+Requirement already satisfied: tinycss2 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.1.1)
+Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.5.0)
+Requirement already satisfied: beautifulsoup4 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (4.11.1)
+Requirement already satisfied: soupsieve>1.2 in /opt/conda/lib/python3.8/site-packages (from beautifulsoup4->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.3.1)
+Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.1)
+Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->ipykernel>=4.5.1->ipywidgets) (3.0.8)
+Requirement already satisfied: asttokens in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (2.0.5)
+Requirement already satisfied: pure-eval in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.2.2)
+Requirement already satisfied: executing in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.8.3)
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+
+
+
+
+

Setting up the model

+

In this section, we will: * Get sample data. * Download model from torch hub. * Build simple utility functions

+
+

Getting sample data

+
+
[3]:
+
+
+
!mkdir -p ./data
+!wget  -O ./data/img0.JPG "https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630"
+!wget  -O ./data/img1.JPG "https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg"
+!wget  -O ./data/img2.JPG "https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg"
+!wget  -O ./data/img3.JPG "https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg"
+
+!wget  -O ./data/imagenet_class_index.json "https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json"
+
+
+
+
+
+
+
+
+--2022-05-02 20:40:33--  https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630
+Resolving d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)... 18.65.227.37, 18.65.227.99, 18.65.227.223, ...
+Connecting to d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)|18.65.227.37|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 24112 (24K) [image/jpeg]
+Saving to: ‘./data/img0.JPG’
+
+./data/img0.JPG     100%[===================>]  23.55K  --.-KB/s    in 0.005s
+
+2022-05-02 20:40:33 (4.69 MB/s) - ‘./data/img0.JPG’ saved [24112/24112]
+
+--2022-05-02 20:40:34--  https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg
+Resolving www.hakaimagazine.com (www.hakaimagazine.com)... 164.92.73.117
+Connecting to www.hakaimagazine.com (www.hakaimagazine.com)|164.92.73.117|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 452718 (442K) [image/jpeg]
+Saving to: ‘./data/img1.JPG’
+
+./data/img1.JPG     100%[===================>] 442.11K  --.-KB/s    in 0.02s
+
+2022-05-02 20:40:34 (26.2 MB/s) - ‘./data/img1.JPG’ saved [452718/452718]
+
+--2022-05-02 20:40:34--  https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg
+Resolving www.artis.nl (www.artis.nl)... 94.75.225.20
+Connecting to www.artis.nl (www.artis.nl)|94.75.225.20|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 361413 (353K) [image/jpeg]
+Saving to: ‘./data/img2.JPG’
+
+./data/img2.JPG     100%[===================>] 352.94K   608KB/s    in 0.6s
+
+2022-05-02 20:40:36 (608 KB/s) - ‘./data/img2.JPG’ saved [361413/361413]
+
+--2022-05-02 20:40:37--  https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg
+Resolving www.familyhandyman.com (www.familyhandyman.com)... 104.18.201.107, 104.18.202.107, 2606:4700::6812:c96b, ...
+Connecting to www.familyhandyman.com (www.familyhandyman.com)|104.18.201.107|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 90994 (89K) [image/jpeg]
+Saving to: ‘./data/img3.JPG’
+
+./data/img3.JPG     100%[===================>]  88.86K  --.-KB/s    in 0.006s
+
+2022-05-02 20:40:37 (15.4 MB/s) - ‘./data/img3.JPG’ saved [90994/90994]
+
+--2022-05-02 20:40:37--  https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json
+Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.217.33.238
+Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.217.33.238|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 35363 (35K) [application/octet-stream]
+Saving to: ‘./data/imagenet_class_index.json’
+
+./data/imagenet_cla 100%[===================>]  34.53K  --.-KB/s    in 0.07s
+
+2022-05-02 20:40:38 (489 KB/s) - ‘./data/imagenet_class_index.json’ saved [35363/35363]
+
+
+
+
+
[4]:
+
+
+
# visualizing the downloaded images
+
+from PIL import Image
+from torchvision import transforms
+import matplotlib.pyplot as plt
+import json
+
+fig, axes = plt.subplots(nrows=2, ncols=2)
+
+for i in range(4):
+    img_path = './data/img%d.JPG'%i
+    img = Image.open(img_path)
+    preprocess = transforms.Compose([
+        transforms.Resize(256),
+        transforms.CenterCrop(224),
+        transforms.ToTensor(),
+        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
+    ])
+    input_tensor = preprocess(img)
+    plt.subplot(2,2,i+1)
+    plt.imshow(img)
+    plt.axis('off')
+
+# loading labels
+with open("./data/imagenet_class_index.json") as json_file:
+    d = json.load(json_file)
+
+
+
+
+
+
+
+../_images/_notebooks_dynamic-shapes_8_0.png +
+
+
+
+

Download model from torch hub.

+
+
[5]:
+
+
+
import torch
+
+torch.hub._validate_not_a_forked_repo=lambda a,b,c: True
+
+resnet50_model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)
+resnet50_model.eval()
+
+
+
+
+
+
+
+
+Using cache found in /root/.cache/torch/hub/pytorch_vision_v0.10.0
+
+
+
+
[5]:
+
+
+
+
+ResNet(
+  (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
+  (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+  (relu): ReLU(inplace=True)
+  (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
+  (layer1): Sequential(
+    (0): Bottleneck(
+      (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+      (downsample): Sequential(
+        (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      )
+    )
+    (1): Bottleneck(
+      (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (2): Bottleneck(
+      (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+  )
+  (layer2): Sequential(
+    (0): Bottleneck(
+      (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+      (downsample): Sequential(
+        (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)
+        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      )
+    )
+    (1): Bottleneck(
+      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (2): Bottleneck(
+      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (3): Bottleneck(
+      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+  )
+  (layer3): Sequential(
+    (0): Bottleneck(
+      (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+      (downsample): Sequential(
+        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)
+        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      )
+    )
+    (1): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (2): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (3): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (4): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (5): Bottleneck(
+      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+  )
+  (layer4): Sequential(
+    (0): Bottleneck(
+      (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+      (downsample): Sequential(
+        (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)
+        (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      )
+    )
+    (1): Bottleneck(
+      (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+    (2): Bottleneck(
+      (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
+      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+      (relu): ReLU(inplace=True)
+    )
+  )
+  (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))
+  (fc): Linear(in_features=2048, out_features=1000, bias=True)
+)
+
+
+
+
+

Build simple utility functions

+
+
[6]:
+
+
+
import numpy as np
+import time
+import torch.backends.cudnn as cudnn
+cudnn.benchmark = True
+
+def rn50_preprocess():
+    preprocess = transforms.Compose([
+        transforms.Resize(256),
+        transforms.CenterCrop(224),
+        transforms.ToTensor(),
+        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
+    ])
+    return preprocess
+
+# decode the results into ([predicted class, description], probability)
+def predict(img_path, model):
+    img = Image.open(img_path)
+    preprocess = rn50_preprocess()
+    input_tensor = preprocess(img)
+    input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model
+
+    # move the input and model to GPU for speed if available
+    if torch.cuda.is_available():
+        input_batch = input_batch.to('cuda')
+        model.to('cuda')
+
+    with torch.no_grad():
+        output = model(input_batch)
+        # Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes
+        sm_output = torch.nn.functional.softmax(output[0], dim=0)
+
+    ind = torch.argmax(sm_output)
+    return d[str(ind.item())], sm_output[ind] #([predicted class, description], probability)
+
+# benchmarking models
+def benchmark(model, input_shape=(1024, 1, 224, 224), dtype='fp32', nwarmup=50, nruns=10000):
+    input_data = torch.randn(input_shape)
+    input_data = input_data.to("cuda")
+    if dtype=='fp16':
+        input_data = input_data.half()
+
+    print("Warm up ...")
+    with torch.no_grad():
+        for _ in range(nwarmup):
+            features = model(input_data)
+    torch.cuda.synchronize()
+    print("Start timing ...")
+    timings = []
+    with torch.no_grad():
+        for i in range(1, nruns+1):
+            start_time = time.time()
+            features = model(input_data)
+            torch.cuda.synchronize()
+            end_time = time.time()
+            timings.append(end_time - start_time)
+            if i%10==0:
+                print('Iteration %d/%d, ave batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))
+                print('Images processed per second=', int(1000*input_shape[0]/(np.mean(timings)*1000)))
+    print("Input shape:", input_data.size())
+    print("Output features size:", features.size())
+    print('Average batch time: %.2f ms'%(np.mean(timings)*1000))
+
+
+
+

Let’s test our util functions on the model we have set up, starting with simple predictions

+
+
[7]:
+
+
+
for i in range(4):
+    img_path = './data/img%d.JPG'%i
+    img = Image.open(img_path)
+
+    pred, prob = predict(img_path, resnet50_model)
+    print('{} - Predicted: {}, Probablility: {}'.format(img_path, pred, prob))
+
+    plt.subplot(2,2,i+1)
+    plt.imshow(img);
+    plt.axis('off');
+    plt.title(pred[1])
+
+
+
+
+
+
+
+
+./data/img0.JPG - Predicted: ['n02110185', 'Siberian_husky'], Probablility: 0.49788108468055725
+./data/img1.JPG - Predicted: ['n01820546', 'lorikeet'], Probablility: 0.6442285180091858
+./data/img2.JPG - Predicted: ['n02481823', 'chimpanzee'], Probablility: 0.9899841547012329
+./data/img3.JPG - Predicted: ['n01749939', 'green_mamba'], Probablility: 0.45675724744796753
+
+
+
+
+
+
+../_images/_notebooks_dynamic-shapes_14_1.png +
+
+

Onwards, to benchmarking.

+
+
[8]:
+
+
+
# Model benchmark without Torch-TensorRT
+model = resnet50_model.eval().to("cuda")
+benchmark(model, input_shape=(16, 3, 224, 224), nruns=100)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, ave batch time 10.01 ms
+Images processed per second= 1598
+Iteration 20/100, ave batch time 10.01 ms
+Images processed per second= 1598
+Iteration 30/100, ave batch time 10.21 ms
+Images processed per second= 1566
+Iteration 40/100, ave batch time 10.33 ms
+Images processed per second= 1549
+Iteration 50/100, ave batch time 10.31 ms
+Images processed per second= 1552
+Iteration 60/100, ave batch time 10.25 ms
+Images processed per second= 1560
+Iteration 70/100, ave batch time 10.20 ms
+Images processed per second= 1568
+Iteration 80/100, ave batch time 10.18 ms
+Images processed per second= 1572
+Iteration 90/100, ave batch time 10.16 ms
+Images processed per second= 1574
+Iteration 100/100, ave batch time 10.15 ms
+Images processed per second= 1575
+Input shape: torch.Size([16, 3, 224, 224])
+Output features size: torch.Size([16, 1000])
+Average batch time: 10.15 ms
+
+
+
+
+
+
+

Benchmarking with Torch-TRT (without dynamic shapes)

+
+
[9]:
+
+
+
import torch_tensorrt
+
+trt_model_without_ds = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((32, 3, 224, 224), dtype=torch.float32)],
+    enabled_precisions = torch.float32, # Run with FP32
+    workspace_size = 1 << 33
+)
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+
+
+
+
[10]:
+
+
+
benchmark(trt_model_without_ds, input_shape=(32, 3, 224, 224), nruns=100)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, ave batch time 6.10 ms
+Images processed per second= 5242
+Iteration 20/100, ave batch time 6.12 ms
+Images processed per second= 5231
+Iteration 30/100, ave batch time 6.14 ms
+Images processed per second= 5215
+Iteration 40/100, ave batch time 6.14 ms
+Images processed per second= 5207
+Iteration 50/100, ave batch time 6.15 ms
+Images processed per second= 5202
+Iteration 60/100, ave batch time 6.28 ms
+Images processed per second= 5094
+Iteration 70/100, ave batch time 6.26 ms
+Images processed per second= 5110
+Iteration 80/100, ave batch time 6.25 ms
+Images processed per second= 5118
+Iteration 90/100, ave batch time 6.25 ms
+Images processed per second= 5115
+Iteration 100/100, ave batch time 6.40 ms
+Images processed per second= 5002
+Input shape: torch.Size([32, 3, 224, 224])
+Output features size: torch.Size([32, 1000])
+Average batch time: 6.40 ms
+
+
+

With the baseline ready, we can proceed to the section working discussing dynamic shapes!

+
+
+
+

Working with Dynamic shapes in Torch TRT

+

Enabling “Dynamic Shaped” tensors to be used is essentially enabling the ability to defer defining the shape of tensors until runetime. Torch TensorRT simply leverages TensorRT’s Dynamic shape support. You can read more about TensorRT’s implementation in the TensorRT Documentation.

+

To make use of dynamic shapes, you need to provide three shapes: * min_shape: The minimum size of the tensor considered for optimizations. * opt_shape: The optimizations will be done with an effort to maximize performance for this shape. * min_shape: The maximum size of the tensor considered for optimizations.

+

Generally, users can expect best performance within the specified ranges. Performance for other shapes may be be lower for other shapes (depending on the model ops and GPU used)

+

In the following example, we will showcase varing batch size, which is the zeroth dimension of our input tensors. As Convolution operations require that the channel dimension be a build-time constant, we won’t be changing sizes of other channels in this example, but for models which contain ops conducive to changes in other channels, this functionality can be freely used.

+
+
[11]:
+
+
+
# The compiled module will have precision as specified by "op_precision".
+# Here, it will have FP32 precision.
+trt_model_with_ds = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input(
+        min_shape=(16, 3, 224, 224),
+        opt_shape=(32, 3, 224, 224),
+        max_shape=(64, 3, 224, 224),
+        dtype=torch.float32)],
+    enabled_precisions = torch.float32, # Run with FP32
+    workspace_size = 1 << 33
+)
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+
+
+
+
[12]:
+
+
+
benchmark(trt_model_with_ds, input_shape=(16, 3, 224, 224), nruns=100)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, ave batch time 3.88 ms
+Images processed per second= 4122
+Iteration 20/100, ave batch time 3.89 ms
+Images processed per second= 4116
+Iteration 30/100, ave batch time 3.88 ms
+Images processed per second= 4123
+Iteration 40/100, ave batch time 3.86 ms
+Images processed per second= 4142
+Iteration 50/100, ave batch time 3.85 ms
+Images processed per second= 4156
+Iteration 60/100, ave batch time 3.84 ms
+Images processed per second= 4166
+Iteration 70/100, ave batch time 3.84 ms
+Images processed per second= 4170
+Iteration 80/100, ave batch time 3.83 ms
+Images processed per second= 4172
+Iteration 90/100, ave batch time 3.83 ms
+Images processed per second= 4176
+Iteration 100/100, ave batch time 3.83 ms
+Images processed per second= 4178
+Input shape: torch.Size([16, 3, 224, 224])
+Output features size: torch.Size([16, 1000])
+Average batch time: 3.83 ms
+
+
+
+
[13]:
+
+
+
benchmark(trt_model_with_ds, input_shape=(32, 3, 224, 224), nruns=100)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, ave batch time 6.71 ms
+Images processed per second= 4767
+Iteration 20/100, ave batch time 6.48 ms
+Images processed per second= 4935
+Iteration 30/100, ave batch time 6.39 ms
+Images processed per second= 5005
+Iteration 40/100, ave batch time 6.38 ms
+Images processed per second= 5014
+Iteration 50/100, ave batch time 6.38 ms
+Images processed per second= 5016
+Iteration 60/100, ave batch time 6.37 ms
+Images processed per second= 5020
+Iteration 70/100, ave batch time 6.37 ms
+Images processed per second= 5024
+Iteration 80/100, ave batch time 6.37 ms
+Images processed per second= 5027
+Iteration 90/100, ave batch time 6.37 ms
+Images processed per second= 5026
+Iteration 100/100, ave batch time 6.38 ms
+Images processed per second= 5018
+Input shape: torch.Size([32, 3, 224, 224])
+Output features size: torch.Size([32, 1000])
+Average batch time: 6.38 ms
+
+
+
+
[14]:
+
+
+
benchmark(trt_model_with_ds, input_shape=(64, 3, 224, 224), nruns=100)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, ave batch time 12.31 ms
+Images processed per second= 5197
+Iteration 20/100, ave batch time 12.42 ms
+Images processed per second= 5153
+Iteration 30/100, ave batch time 12.85 ms
+Images processed per second= 4980
+Iteration 40/100, ave batch time 12.71 ms
+Images processed per second= 5033
+Iteration 50/100, ave batch time 12.67 ms
+Images processed per second= 5052
+Iteration 60/100, ave batch time 12.63 ms
+Images processed per second= 5067
+Iteration 70/100, ave batch time 12.58 ms
+Images processed per second= 5088
+Iteration 80/100, ave batch time 12.56 ms
+Images processed per second= 5096
+Iteration 90/100, ave batch time 12.55 ms
+Images processed per second= 5100
+Iteration 100/100, ave batch time 12.57 ms
+Images processed per second= 5091
+Input shape: torch.Size([64, 3, 224, 224])
+Output features size: torch.Size([64, 1000])
+Average batch time: 12.57 ms
+
+
+
+
+

What’s Next?

+

Check out the TensorRT Getting started page for more tutorials, or visit the Torch-TensorRT documentation for more information!

+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_notebooks/dynamic-shapes.ipynb b/docs/v1.2.0/_notebooks/dynamic-shapes.ipynb new file mode 100644 index 0000000000..a0ceaab576 --- /dev/null +++ b/docs/v1.2.0/_notebooks/dynamic-shapes.ipynb @@ -0,0 +1,1023 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "332a2ed8", + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2020 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "id": "18ee9d62", + "metadata": {}, + "source": [ + "# Torch-TensorRT - Using Dynamic Shapes" + ] + }, + { + "cell_type": "markdown", + "id": "73703695", + "metadata": {}, + "source": [ + "Torch-TensorRT is a compiler for PyTorch/TorchScript, targeting NVIDIA GPUs via NVIDIA's TensorRT Deep Learning Optimizer and Runtime. Unlike PyTorch's Just-In-Time (JIT) compiler, Torch-TensorRT is an Ahead-of-Time (AOT) compiler, meaning that before you deploy your TorchScript code, you go through an explicit compile step to convert a standard TorchScript program into an module targeting a TensorRT engine. Torch-TensorRT operates as a PyTorch extention and compiles modules that integrate into the JIT runtime seamlessly. After compilation using the optimized graph should feel no different than running a TorchScript module. You also have access to TensorRT's suite of configurations at compile time, so you are able to specify operating precision (FP32/FP16/INT8) and other settings for your module.\n", + "\n", + "We highly encorage users to use our NVIDIA's [PyTorch container](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch) to run this notebook. It comes packaged with a host of NVIDIA libraries and optimizations to widely used third party libraries. This container is tested and updated on a monthly cadence!\n", + "\n", + "This notebook has the following sections:\n", + "1. [TL;DR Explanation](#1)\n", + "1. [Setting up the model](#2)\n", + "1. [Working with Dynamic shapes in Torch TRT](#3)" + ] + }, + { + "cell_type": "markdown", + "id": "1603028d", + "metadata": {}, + "source": [ + "---\n", + "## TL;DR Explanation\n", + "\n", + "Making use of Dynamic Shaped Tensors in Torch TensorRT is quite simple. Let's say you are using the `torch_tensorrt.compile(...)` function to compile a torchscript module.\n", + "\n", + "One of the `args` in this function in this function is `input`: which defines an input to a module in terms of expected shape, data type and tensor format: `torch_tensorrt.Input`. \n", + "\n", + "For the purposes of this walkthrough we just need three `kwargs`: `min_shape`, `opt_shape` and `max_shape`. \n", + "```\n", + "...\n", + "torch_tensorrt.Input(\n", + " min_shape=(1, 224, 224, 3),\n", + " opt_shape=(1, 512, 512, 3),\n", + " max_shape=(1, 1024, 1024, 3),\n", + " dtype=torch.int32\n", + " format=torch.channel_last\n", + " )\n", + "...\n", + "```\n", + "In this example, we are going to use a simple ResNet model to demonstrate the use of the API. We will be using different batch sizes in the example, but you can use the same method to alter any of the dimensions of the tensor." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "db3493d2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mon May 2 20:40:30 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA Graphics... On | 00000000:01:00.0 Off | 0 |\n", + "| 41% 51C P0 62W / 200W | 0MiB / 47681MiB | 0% Default |\n", + "| | | Disabled |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: ipywidgets in /opt/conda/lib/python3.8/site-packages (7.7.0)\n", + "Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.3.0)\n", + "Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.13.0)\n", + "Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)\n", + "Requirement already satisfied: widgetsnbextension~=3.6.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (3.6.0)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (8.2.0)\n", + "Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (1.1.0)\n", + "Requirement already satisfied: psutil in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (5.9.0)\n", + "Requirement already satisfied: tornado>=6.1 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (21.3)\n", + "Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.5)\n", + "Requirement already satisfied: matplotlib-inline>=0.1 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)\n", + "Requirement already satisfied: jupyter-client>=6.1.12 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.2.2)\n", + "Requirement already satisfied: debugpy>=1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.6.0)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.1)\n", + "Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: stack-data in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.29)\n", + "Requirement already satisfied: pygments>=2.4.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.2)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "Requirement already satisfied: pyzmq>=22.3 in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (22.3.0)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (0.4)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (2.8.2)\n", + "Requirement already satisfied: jupyter-core>=4.9.2 in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (4.9.2)\n", + "Requirement already satisfied: jsonschema>=2.6 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)\n", + "Requirement already satisfied: fastjsonschema in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (2.15.3)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (21.4.0)\n", + "Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (5.7.0)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (3.8.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.8.2->jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (1.16.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.6.0->ipywidgets) (6.4.1)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.1.1)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.14.1)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.8.0)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3.0)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (6.5.0)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.3)\n", + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.21)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.1.1)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.7.1)\n", + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.2.2)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.8.4)\n", + "Requirement already satisfied: nbclient>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.6.0)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (5.0.0)\n", + "Requirement already satisfied: tinycss2 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.1.1)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.5.0)\n", + "Requirement already satisfied: beautifulsoup4 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (4.11.1)\n", + "Requirement already satisfied: soupsieve>1.2 in /opt/conda/lib/python3.8/site-packages (from beautifulsoup4->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.3.1)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.1)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->ipykernel>=4.5.1->ipywidgets) (3.0.8)\n", + "Requirement already satisfied: asttokens in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (2.0.5)\n", + "Requirement already satisfied: pure-eval in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.2.2)\n", + "Requirement already satisfied: executing in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "!nvidia-smi\n", + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org" + ] + }, + { + "cell_type": "markdown", + "id": "0ed1b4f7", + "metadata": {}, + "source": [ + "---\n", + "## Setting up the model\n", + "\n", + "In this section, we will:\n", + "* Get sample data.\n", + "* Download model from torch hub.\n", + "* Build simple utility functions" + ] + }, + { + "cell_type": "markdown", + "id": "5934504f", + "metadata": {}, + "source": [ + "### Getting sample data" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e46814cc", + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2022-05-02 20:40:33-- https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\n", + "Resolving d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)... 18.65.227.37, 18.65.227.99, 18.65.227.223, ...\n", + "Connecting to d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)|18.65.227.37|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 24112 (24K) [image/jpeg]\n", + "Saving to: ‘./data/img0.JPG’\n", + "\n", + "./data/img0.JPG 100%[===================>] 23.55K --.-KB/s in 0.005s \n", + "\n", + "2022-05-02 20:40:33 (4.69 MB/s) - ‘./data/img0.JPG’ saved [24112/24112]\n", + "\n", + "--2022-05-02 20:40:34-- https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\n", + "Resolving www.hakaimagazine.com (www.hakaimagazine.com)... 164.92.73.117\n", + "Connecting to www.hakaimagazine.com (www.hakaimagazine.com)|164.92.73.117|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 452718 (442K) [image/jpeg]\n", + "Saving to: ‘./data/img1.JPG’\n", + "\n", + "./data/img1.JPG 100%[===================>] 442.11K --.-KB/s in 0.02s \n", + "\n", + "2022-05-02 20:40:34 (26.2 MB/s) - ‘./data/img1.JPG’ saved [452718/452718]\n", + "\n", + "--2022-05-02 20:40:34-- https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\n", + "Resolving www.artis.nl (www.artis.nl)... 94.75.225.20\n", + "Connecting to www.artis.nl (www.artis.nl)|94.75.225.20|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 361413 (353K) [image/jpeg]\n", + "Saving to: ‘./data/img2.JPG’\n", + "\n", + "./data/img2.JPG 100%[===================>] 352.94K 608KB/s in 0.6s \n", + "\n", + "2022-05-02 20:40:36 (608 KB/s) - ‘./data/img2.JPG’ saved [361413/361413]\n", + "\n", + "--2022-05-02 20:40:37-- https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\n", + "Resolving www.familyhandyman.com (www.familyhandyman.com)... 104.18.201.107, 104.18.202.107, 2606:4700::6812:c96b, ...\n", + "Connecting to www.familyhandyman.com (www.familyhandyman.com)|104.18.201.107|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 90994 (89K) [image/jpeg]\n", + "Saving to: ‘./data/img3.JPG’\n", + "\n", + "./data/img3.JPG 100%[===================>] 88.86K --.-KB/s in 0.006s \n", + "\n", + "2022-05-02 20:40:37 (15.4 MB/s) - ‘./data/img3.JPG’ saved [90994/90994]\n", + "\n", + "--2022-05-02 20:40:37-- https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\n", + "Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.217.33.238\n", + "Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.217.33.238|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 35363 (35K) [application/octet-stream]\n", + "Saving to: ‘./data/imagenet_class_index.json’\n", + "\n", + "./data/imagenet_cla 100%[===================>] 34.53K --.-KB/s in 0.07s \n", + "\n", + "2022-05-02 20:40:38 (489 KB/s) - ‘./data/imagenet_class_index.json’ saved [35363/35363]\n", + "\n" + ] + } + ], + "source": [ + "!mkdir -p ./data\n", + "!wget -O ./data/img0.JPG \"https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\"\n", + "!wget -O ./data/img1.JPG \"https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\"\n", + "!wget -O ./data/img2.JPG \"https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\"\n", + "!wget -O ./data/img3.JPG \"https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\"\n", + "\n", + "!wget -O ./data/imagenet_class_index.json \"https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7392a8ec", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# visualizing the downloaded images\n", + "\n", + "from PIL import Image\n", + "from torchvision import transforms\n", + "import matplotlib.pyplot as plt\n", + "import json \n", + "\n", + "fig, axes = plt.subplots(nrows=2, ncols=2)\n", + "\n", + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " input_tensor = preprocess(img) \n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img)\n", + " plt.axis('off')\n", + "\n", + "# loading labels \n", + "with open(\"./data/imagenet_class_index.json\") as json_file: \n", + " d = json.load(json_file)" + ] + }, + { + "cell_type": "markdown", + "id": "1374edab", + "metadata": {}, + "source": [ + "### Download model from torch hub." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "659fa798", + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using cache found in /root/.cache/torch/hub/pytorch_vision_v0.10.0\n" + ] + }, + { + "data": { + "text/plain": [ + "ResNet(\n", + " (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n", + " (layer1): Sequential(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (layer2): Sequential(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (3): Bottleneck(\n", + " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (layer3): Sequential(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (3): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (4): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (5): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (layer4): Sequential(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n", + " (fc): Linear(in_features=2048, out_features=1000, bias=True)\n", + ")" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import torch\n", + "\n", + "torch.hub._validate_not_a_forked_repo=lambda a,b,c: True\n", + "\n", + "resnet50_model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)\n", + "resnet50_model.eval()" + ] + }, + { + "cell_type": "markdown", + "id": "0a67e8db", + "metadata": {}, + "source": [ + "### Build simple utility functions" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "60286396", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import time\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "def rn50_preprocess():\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " return preprocess\n", + "\n", + "# decode the results into ([predicted class, description], probability)\n", + "def predict(img_path, model):\n", + " img = Image.open(img_path)\n", + " preprocess = rn50_preprocess()\n", + " input_tensor = preprocess(img)\n", + " input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model\n", + " \n", + " # move the input and model to GPU for speed if available\n", + " if torch.cuda.is_available():\n", + " input_batch = input_batch.to('cuda')\n", + " model.to('cuda')\n", + "\n", + " with torch.no_grad():\n", + " output = model(input_batch)\n", + " # Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes\n", + " sm_output = torch.nn.functional.softmax(output[0], dim=0)\n", + " \n", + " ind = torch.argmax(sm_output)\n", + " return d[str(ind.item())], sm_output[ind] #([predicted class, description], probability)\n", + "\n", + "# benchmarking models\n", + "def benchmark(model, input_shape=(1024, 1, 224, 224), dtype='fp32', nwarmup=50, nruns=10000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%10==0:\n", + " print('Iteration %d/%d, ave batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + " print('Images processed per second=', int(1000*input_shape[0]/(np.mean(timings)*1000)))\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output features size:\", features.size())\n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))" + ] + }, + { + "cell_type": "markdown", + "id": "21402d53", + "metadata": {}, + "source": [ + "Let's test our util functions on the model we have set up, starting with simple predictions" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "bb3e4a0d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "./data/img0.JPG - Predicted: ['n02110185', 'Siberian_husky'], Probablility: 0.49788108468055725\n", + "./data/img1.JPG - Predicted: ['n01820546', 'lorikeet'], Probablility: 0.6442285180091858\n", + "./data/img2.JPG - Predicted: ['n02481823', 'chimpanzee'], Probablility: 0.9899841547012329\n", + "./data/img3.JPG - Predicted: ['n01749939', 'green_mamba'], Probablility: 0.45675724744796753\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " \n", + " pred, prob = predict(img_path, resnet50_model)\n", + " print('{} - Predicted: {}, Probablility: {}'.format(img_path, pred, prob))\n", + "\n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img);\n", + " plt.axis('off');\n", + " plt.title(pred[1])" + ] + }, + { + "cell_type": "markdown", + "id": "2fc7f347", + "metadata": {}, + "source": [ + "Onwards, to benchmarking." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "f182b433", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 10.01 ms\n", + "Images processed per second= 1598\n", + "Iteration 20/100, ave batch time 10.01 ms\n", + "Images processed per second= 1598\n", + "Iteration 30/100, ave batch time 10.21 ms\n", + "Images processed per second= 1566\n", + "Iteration 40/100, ave batch time 10.33 ms\n", + "Images processed per second= 1549\n", + "Iteration 50/100, ave batch time 10.31 ms\n", + "Images processed per second= 1552\n", + "Iteration 60/100, ave batch time 10.25 ms\n", + "Images processed per second= 1560\n", + "Iteration 70/100, ave batch time 10.20 ms\n", + "Images processed per second= 1568\n", + "Iteration 80/100, ave batch time 10.18 ms\n", + "Images processed per second= 1572\n", + "Iteration 90/100, ave batch time 10.16 ms\n", + "Images processed per second= 1574\n", + "Iteration 100/100, ave batch time 10.15 ms\n", + "Images processed per second= 1575\n", + "Input shape: torch.Size([16, 3, 224, 224])\n", + "Output features size: torch.Size([16, 1000])\n", + "Average batch time: 10.15 ms\n" + ] + } + ], + "source": [ + "# Model benchmark without Torch-TensorRT\n", + "model = resnet50_model.eval().to(\"cuda\")\n", + "benchmark(model, input_shape=(16, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "id": "21e56cdf", + "metadata": {}, + "source": [ + "---\n", + "## Benchmarking with Torch-TRT (without dynamic shapes)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8c9ed780", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "trt_model_without_ds = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((32, 3, 224, 224), dtype=torch.float32)],\n", + " enabled_precisions = torch.float32, # Run with FP32\n", + " workspace_size = 1 << 33\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "58a4ba94", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 6.10 ms\n", + "Images processed per second= 5242\n", + "Iteration 20/100, ave batch time 6.12 ms\n", + "Images processed per second= 5231\n", + "Iteration 30/100, ave batch time 6.14 ms\n", + "Images processed per second= 5215\n", + "Iteration 40/100, ave batch time 6.14 ms\n", + "Images processed per second= 5207\n", + "Iteration 50/100, ave batch time 6.15 ms\n", + "Images processed per second= 5202\n", + "Iteration 60/100, ave batch time 6.28 ms\n", + "Images processed per second= 5094\n", + "Iteration 70/100, ave batch time 6.26 ms\n", + "Images processed per second= 5110\n", + "Iteration 80/100, ave batch time 6.25 ms\n", + "Images processed per second= 5118\n", + "Iteration 90/100, ave batch time 6.25 ms\n", + "Images processed per second= 5115\n", + "Iteration 100/100, ave batch time 6.40 ms\n", + "Images processed per second= 5002\n", + "Input shape: torch.Size([32, 3, 224, 224])\n", + "Output features size: torch.Size([32, 1000])\n", + "Average batch time: 6.40 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_model_without_ds, input_shape=(32, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "id": "cd233b85", + "metadata": {}, + "source": [ + "With the baseline ready, we can proceed to the section working discussing dynamic shapes!" + ] + }, + { + "cell_type": "markdown", + "id": "bd5746da", + "metadata": {}, + "source": [ + "---\n", + "## Working with Dynamic shapes in Torch TRT\n", + "\n", + "Enabling \"Dynamic Shaped\" tensors to be used is essentially enabling the ability to defer defining the shape of tensors until runetime. Torch TensorRT simply leverages TensorRT's Dynamic shape support. You can read more about TensorRT's implementation in the [TensorRT Documentation](https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#work_dynamic_shapes).\n", + "\n", + "#### How can you use this feature?\n", + "\n", + "To make use of dynamic shapes, you need to provide three shapes:\n", + "* `min_shape`: The minimum size of the tensor considered for optimizations.\n", + "* `opt_shape`: The optimizations will be done with an effort to maximize performance for this shape.\n", + "* `min_shape`: The maximum size of the tensor considered for optimizations.\n", + "\n", + "Generally, users can expect best performance within the specified ranges. Performance for other shapes may be be lower for other shapes (depending on the model ops and GPU used)\n", + "\n", + "In the following example, we will showcase varing batch size, which is the zeroth dimension of our input tensors. As Convolution operations require that the channel dimension be a build-time constant, we won't be changing sizes of other channels in this example, but for models which contain ops conducive to changes in other channels, this functionality can be freely used." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "9a04007d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n" + ] + } + ], + "source": [ + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP32 precision.\n", + "trt_model_with_ds = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input(\n", + " min_shape=(16, 3, 224, 224),\n", + " opt_shape=(32, 3, 224, 224),\n", + " max_shape=(64, 3, 224, 224),\n", + " dtype=torch.float32)],\n", + " enabled_precisions = torch.float32, # Run with FP32\n", + " workspace_size = 1 << 33\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "f0babc85", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 3.88 ms\n", + "Images processed per second= 4122\n", + "Iteration 20/100, ave batch time 3.89 ms\n", + "Images processed per second= 4116\n", + "Iteration 30/100, ave batch time 3.88 ms\n", + "Images processed per second= 4123\n", + "Iteration 40/100, ave batch time 3.86 ms\n", + "Images processed per second= 4142\n", + "Iteration 50/100, ave batch time 3.85 ms\n", + "Images processed per second= 4156\n", + "Iteration 60/100, ave batch time 3.84 ms\n", + "Images processed per second= 4166\n", + "Iteration 70/100, ave batch time 3.84 ms\n", + "Images processed per second= 4170\n", + "Iteration 80/100, ave batch time 3.83 ms\n", + "Images processed per second= 4172\n", + "Iteration 90/100, ave batch time 3.83 ms\n", + "Images processed per second= 4176\n", + "Iteration 100/100, ave batch time 3.83 ms\n", + "Images processed per second= 4178\n", + "Input shape: torch.Size([16, 3, 224, 224])\n", + "Output features size: torch.Size([16, 1000])\n", + "Average batch time: 3.83 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_model_with_ds, input_shape=(16, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "e86a3541", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 6.71 ms\n", + "Images processed per second= 4767\n", + "Iteration 20/100, ave batch time 6.48 ms\n", + "Images processed per second= 4935\n", + "Iteration 30/100, ave batch time 6.39 ms\n", + "Images processed per second= 5005\n", + "Iteration 40/100, ave batch time 6.38 ms\n", + "Images processed per second= 5014\n", + "Iteration 50/100, ave batch time 6.38 ms\n", + "Images processed per second= 5016\n", + "Iteration 60/100, ave batch time 6.37 ms\n", + "Images processed per second= 5020\n", + "Iteration 70/100, ave batch time 6.37 ms\n", + "Images processed per second= 5024\n", + "Iteration 80/100, ave batch time 6.37 ms\n", + "Images processed per second= 5027\n", + "Iteration 90/100, ave batch time 6.37 ms\n", + "Images processed per second= 5026\n", + "Iteration 100/100, ave batch time 6.38 ms\n", + "Images processed per second= 5018\n", + "Input shape: torch.Size([32, 3, 224, 224])\n", + "Output features size: torch.Size([32, 1000])\n", + "Average batch time: 6.38 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_model_with_ds, input_shape=(32, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "35800f63", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 12.31 ms\n", + "Images processed per second= 5197\n", + "Iteration 20/100, ave batch time 12.42 ms\n", + "Images processed per second= 5153\n", + "Iteration 30/100, ave batch time 12.85 ms\n", + "Images processed per second= 4980\n", + "Iteration 40/100, ave batch time 12.71 ms\n", + "Images processed per second= 5033\n", + "Iteration 50/100, ave batch time 12.67 ms\n", + "Images processed per second= 5052\n", + "Iteration 60/100, ave batch time 12.63 ms\n", + "Images processed per second= 5067\n", + "Iteration 70/100, ave batch time 12.58 ms\n", + "Images processed per second= 5088\n", + "Iteration 80/100, ave batch time 12.56 ms\n", + "Images processed per second= 5096\n", + "Iteration 90/100, ave batch time 12.55 ms\n", + "Images processed per second= 5100\n", + "Iteration 100/100, ave batch time 12.57 ms\n", + "Images processed per second= 5091\n", + "Input shape: torch.Size([64, 3, 224, 224])\n", + "Output features size: torch.Size([64, 1000])\n", + "Average batch time: 12.57 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_model_with_ds, input_shape=(64, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "id": "f87a75bd", + "metadata": {}, + "source": [ + "## What's Next?\n", + "\n", + "Check out the [TensorRT Getting started page](https://developer.nvidia.com/tensorrt-getting-started) for more tutorials, or visit the Torch-TensorRT [documentation](https://nvidia.github.io/Torch-TensorRT/) for more information!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/v1.2.0/_notebooks/lenet-getting-started.html b/docs/v1.2.0/_notebooks/lenet-getting-started.html new file mode 100644 index 0000000000..9d4a4102c2 --- /dev/null +++ b/docs/v1.2.0/_notebooks/lenet-getting-started.html @@ -0,0 +1,1518 @@ + + + + + + + + + + + + + Torch-TensorRT Getting Started - LeNet — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Torch-TensorRT Getting Started - LeNet
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ + + +
+
[1]:
+
+
+
# Copyright 2019 NVIDIA Corporation. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
+
+

6e5fd25e8d6b4ce79aa5fcb073d51b40

+
+

Torch-TensorRT Getting Started - LeNet

+
+

Overview

+

In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the +best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch’s JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new +world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.

+

When deploying on NVIDIA GPUs TensorRT, NVIDIA’s Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA’s Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that +perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.

+

Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch.

+
+

Learning objectives

+

This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a simple LeNet network.

+
+
+
+

Content

+
    +
  1. Requirements

  2. +
  3. Creating TorchScript modules

  4. +
  5. Compiling with Torch-TensorRT

  6. +
+

## 1. Requirements

+

Follow the steps in notebooks/README to prepare a Docker container, within which you can run this notebook.

+
+
[1]:
+
+
+
!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org
+!nvidia-smi
+
+
+
+
+
+
+
+
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Collecting ipywidgets
+  Downloading ipywidgets-7.6.5-py2.py3-none-any.whl (121 kB)
+     |████████████████████████████████| 121 kB 12.7 MB/s eta 0:00:01
+Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)
+Collecting jupyterlab-widgets>=1.0.0
+  Downloading jupyterlab_widgets-1.0.2-py3-none-any.whl (243 kB)
+     |████████████████████████████████| 243 kB 115.0 MB/s eta 0:00:01
+Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)
+Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.3)
+Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.7.0)
+Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (7.31.0)
+Collecting widgetsnbextension~=3.5.0
+  Downloading widgetsnbextension-3.5.2-py2.py3-none-any.whl (1.6 MB)
+     |████████████████████████████████| 1.6 MB 122.5 MB/s eta 0:00:01
+Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)
+Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.1)
+Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.1.2)
+Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.4)
+Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)
+Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)
+Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)
+Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)
+Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)
+Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.24)
+Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)
+Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.0)
+Requirement already satisfied: pygments in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.1)
+Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)
+Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (22.3.0)
+Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (0.3)
+Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (4.9.1)
+Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (2.8.2)
+Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)
+Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.4.0)
+Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (5.4.0)
+Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.18.1)
+Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.7.0)
+Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)
+Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)
+Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (1.16.0)
+Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.5.0->ipywidgets) (6.4.1)
+Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.12.1)
+Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.13.0)
+Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.3)
+Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3.0)
+Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (6.4.0)
+Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.8.0)
+Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.2.0)
+Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.15.0)
+Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.21)
+Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.0.1)
+Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.0)
+Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.7.1)
+Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.1.2)
+Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.10)
+Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (4.1.0)
+Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.5.0)
+Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.8.4)
+Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.1)
+Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3)
+Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.6)
+Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets
+Successfully installed ipywidgets-7.6.5 jupyterlab-widgets-1.0.2 widgetsnbextension-3.5.2
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+Thu Feb 10 22:01:27 2022
++-----------------------------------------------------------------------------+
+| NVIDIA-SMI 510.39.01    Driver Version: 510.39.01    CUDA Version: 11.6     |
+|-------------------------------+----------------------+----------------------+
+| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
+| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
+|                               |                      |               MIG M. |
+|===============================+======================+======================|
+|   0  NVIDIA GeForce ...  On   | 00000000:09:00.0 Off |                  N/A |
+|  0%   42C    P8    20W / 320W |      0MiB / 10240MiB |      0%      Default |
+|                               |                      |                  N/A |
++-------------------------------+----------------------+----------------------+
+
++-----------------------------------------------------------------------------+
+| Processes:                                                                  |
+|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
+|        ID   ID                                                   Usage      |
+|=============================================================================|
+|  No running processes found                                                 |
++-----------------------------------------------------------------------------+
+
+
+

## 2. Creating TorchScript modules

+

Here we create two submodules for a feature extractor and a classifier and stitch them together in a single LeNet module. In this case this is overkill but modules give us granular control over our program including where we decide to optimize and where we don’t. It is also the unit that the TorchScript compiler operates on. So you can decide to only convert/optimize the feature extractor and leave the classifier in standard PyTorch or you can convert the whole thing. When compiling your module +to TorchScript, there are two paths: Tracing and Scripting.

+
+
[2]:
+
+
+
import torch
+from torch import nn
+import torch.nn.functional as F
+
+class LeNetFeatExtractor(nn.Module):
+    def __init__(self):
+        super(LeNetFeatExtractor, self).__init__()
+        self.conv1 = nn.Conv2d(1, 128, 3)
+        self.conv2 = nn.Conv2d(128, 16, 3)
+
+    def forward(self, x):
+        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
+        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
+        return x
+
+class LeNetClassifier(nn.Module):
+    def __init__(self):
+        super(LeNetClassifier, self).__init__()
+        self.fc1 = nn.Linear(16 * 6 * 6, 120)
+        self.fc2 = nn.Linear(120, 84)
+        self.fc3 = nn.Linear(84, 10)
+
+    def forward(self, x):
+        x = torch.flatten(x,1)
+        x = F.relu(self.fc1(x))
+        x = F.relu(self.fc2(x))
+        x = self.fc3(x)
+        return x
+
+class LeNet(nn.Module):
+    def __init__(self):
+        super(LeNet, self).__init__()
+        self.feat = LeNetFeatExtractor()
+        self.classifer = LeNetClassifier()
+
+    def forward(self, x):
+        x = self.feat(x)
+        x = self.classifer(x)
+        return x
+
+
+
+

Let us define a helper function to benchmark a model.

+
+
[3]:
+
+
+
import time
+import numpy as np
+
+import torch.backends.cudnn as cudnn
+cudnn.benchmark = True
+
+def benchmark(model, input_shape=(1024, 1, 32, 32), dtype='fp32', nwarmup=50, nruns=1000):
+    input_data = torch.randn(input_shape)
+    input_data = input_data.to("cuda")
+    if dtype=='fp16':
+        input_data = input_data.half()
+
+    print("Warm up ...")
+    with torch.no_grad():
+        for _ in range(nwarmup):
+            features = model(input_data)
+    torch.cuda.synchronize()
+    print("Start timing ...")
+    timings = []
+    with torch.no_grad():
+        for i in range(1, nruns+1):
+            start_time = time.time()
+            features = model(input_data)
+            torch.cuda.synchronize()
+            end_time = time.time()
+            timings.append(end_time - start_time)
+            if i%100==0:
+                print('Iteration %d/%d, ave batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))
+
+    print("Input shape:", input_data.size())
+    print("Output features size:", features.size())
+
+    print('Average batch time: %.2f ms'%(np.mean(timings)*1000))
+
+
+
+
+

PyTorch model

+
+
[4]:
+
+
+
model = LeNet()
+model.to("cuda").eval()
+
+
+
+
+
[4]:
+
+
+
+
+LeNet(
+  (feat): LeNetFeatExtractor(
+    (conv1): Conv2d(1, 128, kernel_size=(3, 3), stride=(1, 1))
+    (conv2): Conv2d(128, 16, kernel_size=(3, 3), stride=(1, 1))
+  )
+  (classifer): LeNetClassifier(
+    (fc1): Linear(in_features=576, out_features=120, bias=True)
+    (fc2): Linear(in_features=120, out_features=84, bias=True)
+    (fc3): Linear(in_features=84, out_features=10, bias=True)
+  )
+)
+
+
+
+
[5]:
+
+
+
benchmark(model)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 100/1000, ave batch time 5.56 ms
+Iteration 200/1000, ave batch time 5.56 ms
+Iteration 300/1000, ave batch time 5.56 ms
+Iteration 400/1000, ave batch time 5.56 ms
+Iteration 500/1000, ave batch time 5.56 ms
+Iteration 600/1000, ave batch time 5.56 ms
+Iteration 700/1000, ave batch time 5.56 ms
+Iteration 800/1000, ave batch time 5.56 ms
+Iteration 900/1000, ave batch time 5.56 ms
+Iteration 1000/1000, ave batch time 5.56 ms
+Input shape: torch.Size([1024, 1, 32, 32])
+Output features size: torch.Size([1024, 10])
+Average batch time: 5.56 ms
+
+
+

When compiling your module to TorchScript, there are two paths: Tracing and Scripting.

+
+
+

Tracing

+

Tracing follows the path of execution when the module is called and records what happens. This recording is what the TorchScript IR will describe. To trace an instance of our LeNet module, we can call torch.jit.trace with an example input.

+
+
[6]:
+
+
+
traced_model = torch.jit.trace(model, torch.empty([1,1,32,32]).to("cuda"))
+traced_model
+
+
+
+
+
[6]:
+
+
+
+
+LeNet(
+  original_name=LeNet
+  (feat): LeNetFeatExtractor(
+    original_name=LeNetFeatExtractor
+    (conv1): Conv2d(original_name=Conv2d)
+    (conv2): Conv2d(original_name=Conv2d)
+  )
+  (classifer): LeNetClassifier(
+    original_name=LeNetClassifier
+    (fc1): Linear(original_name=Linear)
+    (fc2): Linear(original_name=Linear)
+    (fc3): Linear(original_name=Linear)
+  )
+)
+
+
+
+
[7]:
+
+
+
benchmark(traced_model)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 100/1000, ave batch time 5.56 ms
+Iteration 200/1000, ave batch time 5.56 ms
+Iteration 300/1000, ave batch time 5.56 ms
+Iteration 400/1000, ave batch time 5.56 ms
+Iteration 500/1000, ave batch time 5.56 ms
+Iteration 600/1000, ave batch time 5.56 ms
+Iteration 700/1000, ave batch time 5.56 ms
+Iteration 800/1000, ave batch time 5.56 ms
+Iteration 900/1000, ave batch time 5.56 ms
+Iteration 1000/1000, ave batch time 5.56 ms
+Input shape: torch.Size([1024, 1, 32, 32])
+Output features size: torch.Size([1024, 10])
+Average batch time: 5.56 ms
+
+
+
+
+

Scripting

+

Scripting actually inspects your code with a compiler and generates an equivalent TorchScript program. The difference is that since tracing simply follows the execution of your module, it cannot pick up control flow for instance, it will only follow the code path that a particular input triggers. By working from the Python code, the compiler can include these components. We can run the script compiler on our LeNet module by calling torch.jit.script.

+
+
[8]:
+
+
+
model = LeNet().to("cuda").eval()
+script_model = torch.jit.script(model)
+
+
+
+
+
[9]:
+
+
+
script_model
+
+
+
+
+
[9]:
+
+
+
+
+RecursiveScriptModule(
+  original_name=LeNet
+  (feat): RecursiveScriptModule(
+    original_name=LeNetFeatExtractor
+    (conv1): RecursiveScriptModule(original_name=Conv2d)
+    (conv2): RecursiveScriptModule(original_name=Conv2d)
+  )
+  (classifer): RecursiveScriptModule(
+    original_name=LeNetClassifier
+    (fc1): RecursiveScriptModule(original_name=Linear)
+    (fc2): RecursiveScriptModule(original_name=Linear)
+    (fc3): RecursiveScriptModule(original_name=Linear)
+  )
+)
+
+
+
+
[10]:
+
+
+
benchmark(script_model)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 100/1000, ave batch time 5.56 ms
+Iteration 200/1000, ave batch time 5.56 ms
+Iteration 300/1000, ave batch time 5.56 ms
+Iteration 400/1000, ave batch time 5.56 ms
+Iteration 500/1000, ave batch time 5.56 ms
+Iteration 600/1000, ave batch time 5.56 ms
+Iteration 700/1000, ave batch time 5.56 ms
+Iteration 800/1000, ave batch time 5.56 ms
+Iteration 900/1000, ave batch time 5.56 ms
+Iteration 1000/1000, ave batch time 5.56 ms
+Input shape: torch.Size([1024, 1, 32, 32])
+Output features size: torch.Size([1024, 10])
+Average batch time: 5.56 ms
+
+
+

## 3. Compiling with Torch-TensorRT

+
+
+

TorchScript traced model

+

First, we compile the TorchScript traced model with Torch-TensorRT. Notice the performance impact.

+
+
[13]:
+
+
+
import torch_tensorrt
+
+# We use a batch-size of 1024, and half precision
+trt_ts_module = torch_tensorrt.compile(traced_model, inputs=[torch_tensorrt.Input(
+            min_shape=[1024, 1, 32, 32],
+            opt_shape=[1024, 1, 33, 33],
+            max_shape=[1024, 1, 34, 34],
+            dtype=torch.half
+            )],
+            enabled_precisions = {torch.half})
+
+input_data = torch.randn((1024, 1, 32, 32))
+input_data = input_data.half().to("cuda")
+
+input_data = input_data.half()
+result = trt_ts_module(input_data)
+torch.jit.save(trt_ts_module, "trt_ts_module.ts")
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float
+The compiler is going to use the user setting Float16
+This conflict may cause an error at runtime due to partial compilation being enabled and therefore
+compatibility with PyTorch's data type convention is required.
+If you do indeed see errors at runtime either:
+- Remove the dtype spec for x.1
+- Disable partial compilation by setting require_full_compilation to True
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT TorchScript Conversion Context] - Max value of this profile is not valid
+
+
+
+
[14]:
+
+
+
benchmark(trt_ts_module, input_shape=(1024, 1, 32, 32), dtype="fp16")
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 100/1000, ave batch time 1.41 ms
+Iteration 200/1000, ave batch time 1.40 ms
+Iteration 300/1000, ave batch time 1.40 ms
+Iteration 400/1000, ave batch time 1.39 ms
+Iteration 500/1000, ave batch time 1.40 ms
+Iteration 600/1000, ave batch time 1.40 ms
+Iteration 700/1000, ave batch time 1.40 ms
+Iteration 800/1000, ave batch time 1.40 ms
+Iteration 900/1000, ave batch time 1.40 ms
+Iteration 1000/1000, ave batch time 1.40 ms
+Input shape: torch.Size([1024, 1, 32, 32])
+Output features size: torch.Size([1024, 10])
+Average batch time: 1.40 ms
+
+
+
+
+

TorchScript script model

+

Next, we compile the TorchScript script model with Torch-TensorRT. Notice the performance impact.

+
+
[16]:
+
+
+
import torch_tensorrt
+
+trt_script_module = torch_tensorrt.compile(script_model, inputs = [torch_tensorrt.Input(
+            min_shape=[1024, 1, 32, 32],
+            opt_shape=[1024, 1, 33, 33],
+            max_shape=[1024, 1, 34, 34],
+            dtype=torch.half
+            )],
+            enabled_precisions={torch.half})
+
+input_data = torch.randn((1024, 1, 32, 32))
+input_data = input_data.half().to("cuda")
+
+input_data = input_data.half()
+result = trt_script_module(input_data)
+torch.jit.save(trt_script_module, "trt_script_module.ts")
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float
+The compiler is going to use the user setting Float16
+This conflict may cause an error at runtime due to partial compilation being enabled and therefore
+compatibility with PyTorch's data type convention is required.
+If you do indeed see errors at runtime either:
+- Remove the dtype spec for x.1
+- Disable partial compilation by setting require_full_compilation to True
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT TorchScript Conversion Context] - Max value of this profile is not valid
+
+
+
+
[17]:
+
+
+
benchmark(trt_script_module, input_shape=(1024, 1, 32, 32), dtype="fp16")
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 100/1000, ave batch time 1.43 ms
+Iteration 200/1000, ave batch time 1.41 ms
+Iteration 300/1000, ave batch time 1.40 ms
+Iteration 400/1000, ave batch time 1.42 ms
+Iteration 500/1000, ave batch time 1.42 ms
+Iteration 600/1000, ave batch time 1.41 ms
+Iteration 700/1000, ave batch time 1.41 ms
+Iteration 800/1000, ave batch time 1.40 ms
+Iteration 900/1000, ave batch time 1.40 ms
+Iteration 1000/1000, ave batch time 1.40 ms
+Input shape: torch.Size([1024, 1, 32, 32])
+Output features size: torch.Size([1024, 10])
+Average batch time: 1.40 ms
+
+
+
+
+
+

Conclusion

+

In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT and test the performance impact of the optimization.

+
+

What’s next

+

Now it’s time to try Torch-TensorRT on your own model. Fill out issues at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.

+
+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_notebooks/lenet-getting-started.ipynb b/docs/v1.2.0/_notebooks/lenet-getting-started.ipynb new file mode 100644 index 0000000000..2db954946d --- /dev/null +++ b/docs/v1.2.0/_notebooks/lenet-getting-started.ipynb @@ -0,0 +1,718 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Torch-TensorRT Getting Started - LeNet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch's JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.\n", + "\n", + "When deploying on NVIDIA GPUs TensorRT, NVIDIA's Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA's Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.\n", + "\n", + "Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a simple LeNet network. \n", + "\n", + "## Content\n", + "1. [Requirements](#1)\n", + "1. [Creating TorchScript modules](#2)\n", + "1. [Compiling with Torch-TensorRT](#3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "Follow the steps in `notebooks/README` to prepare a Docker container, within which you can run this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting ipywidgets\n", + " Downloading ipywidgets-7.6.5-py2.py3-none-any.whl (121 kB)\n", + "\u001b[K |████████████████████████████████| 121 kB 12.7 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)\n", + "Collecting jupyterlab-widgets>=1.0.0\n", + " Downloading jupyterlab_widgets-1.0.2-py3-none-any.whl (243 kB)\n", + "\u001b[K |████████████████████████████████| 243 kB 115.0 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.3)\n", + "Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.7.0)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (7.31.0)\n", + "Collecting widgetsnbextension~=3.5.0\n", + " Downloading widgetsnbextension-3.5.2-py2.py3-none-any.whl (1.6 MB)\n", + "\u001b[K |████████████████████████████████| 1.6 MB 122.5 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)\n", + "Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.1)\n", + "Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.1.2)\n", + "Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.4)\n", + "Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)\n", + "Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.24)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.0)\n", + "Requirement already satisfied: pygments in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.1)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (22.3.0)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (0.3)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (4.9.1)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (2.8.2)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)\n", + "Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.4.0)\n", + "Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (5.4.0)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.7.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (1.16.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.5.0->ipywidgets) (6.4.1)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.12.1)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.13.0)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.3)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3.0)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (6.4.0)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.8.0)\n", + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.21)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.0.1)\n", + "Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.0)\n", + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.7.1)\n", + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.1.2)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.10)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (4.1.0)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.5.0)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.8.4)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.1)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.6)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets\n", + "Successfully installed ipywidgets-7.6.5 jupyterlab-widgets-1.0.2 widgetsnbextension-3.5.2\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Thu Feb 10 22:01:27 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 510.39.01 Driver Version: 510.39.01 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA GeForce ... On | 00000000:09:00.0 Off | N/A |\n", + "| 0% 42C P8 20W / 320W | 0MiB / 10240MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org\n", + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 2. Creating TorchScript modules\n", + "\n", + "Here we create two submodules for a feature extractor and a classifier and stitch them together in a single LeNet module. In this case this is overkill but modules give us granular control over our program including where we decide to optimize and where we don't. It is also the unit that the TorchScript compiler operates on. So you can decide to only convert/optimize the feature extractor and leave the classifier in standard PyTorch or you can convert the whole thing. When compiling your module to TorchScript, there are two paths: Tracing and Scripting. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import torch \n", + "from torch import nn\n", + "import torch.nn.functional as F\n", + "\n", + "class LeNetFeatExtractor(nn.Module):\n", + " def __init__(self):\n", + " super(LeNetFeatExtractor, self).__init__()\n", + " self.conv1 = nn.Conv2d(1, 128, 3)\n", + " self.conv2 = nn.Conv2d(128, 16, 3)\n", + "\n", + " def forward(self, x):\n", + " x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))\n", + " x = F.max_pool2d(F.relu(self.conv2(x)), 2)\n", + " return x\n", + "\n", + "class LeNetClassifier(nn.Module):\n", + " def __init__(self):\n", + " super(LeNetClassifier, self).__init__()\n", + " self.fc1 = nn.Linear(16 * 6 * 6, 120)\n", + " self.fc2 = nn.Linear(120, 84)\n", + " self.fc3 = nn.Linear(84, 10)\n", + "\n", + " def forward(self, x):\n", + " x = torch.flatten(x,1)\n", + " x = F.relu(self.fc1(x))\n", + " x = F.relu(self.fc2(x))\n", + " x = self.fc3(x)\n", + " return x\n", + "\n", + "class LeNet(nn.Module):\n", + " def __init__(self):\n", + " super(LeNet, self).__init__()\n", + " self.feat = LeNetFeatExtractor()\n", + " self.classifer = LeNetClassifier()\n", + "\n", + " def forward(self, x):\n", + " x = self.feat(x)\n", + " x = self.classifer(x)\n", + " return x\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let us define a helper function to benchmark a model." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import numpy as np\n", + "\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "def benchmark(model, input_shape=(1024, 1, 32, 32), dtype='fp32', nwarmup=50, nruns=1000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%100==0:\n", + " print('Iteration %d/%d, ave batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output features size:\", features.size())\n", + " \n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### PyTorch model" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LeNet(\n", + " (feat): LeNetFeatExtractor(\n", + " (conv1): Conv2d(1, 128, kernel_size=(3, 3), stride=(1, 1))\n", + " (conv2): Conv2d(128, 16, kernel_size=(3, 3), stride=(1, 1))\n", + " )\n", + " (classifer): LeNetClassifier(\n", + " (fc1): Linear(in_features=576, out_features=120, bias=True)\n", + " (fc2): Linear(in_features=120, out_features=84, bias=True)\n", + " (fc3): Linear(in_features=84, out_features=10, bias=True)\n", + " )\n", + ")" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = LeNet()\n", + "model.to(\"cuda\").eval()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 5.56 ms\n", + "Iteration 200/1000, ave batch time 5.56 ms\n", + "Iteration 300/1000, ave batch time 5.56 ms\n", + "Iteration 400/1000, ave batch time 5.56 ms\n", + "Iteration 500/1000, ave batch time 5.56 ms\n", + "Iteration 600/1000, ave batch time 5.56 ms\n", + "Iteration 700/1000, ave batch time 5.56 ms\n", + "Iteration 800/1000, ave batch time 5.56 ms\n", + "Iteration 900/1000, ave batch time 5.56 ms\n", + "Iteration 1000/1000, ave batch time 5.56 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 5.56 ms\n" + ] + } + ], + "source": [ + "benchmark(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When compiling your module to TorchScript, there are two paths: Tracing and Scripting. \n", + " \n", + "### Tracing\n", + "\n", + "Tracing follows the path of execution when the module is called and records what happens. This recording is what the TorchScript IR will describe. To trace an instance of our LeNet module, we can call torch.jit.trace with an example input. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LeNet(\n", + " original_name=LeNet\n", + " (feat): LeNetFeatExtractor(\n", + " original_name=LeNetFeatExtractor\n", + " (conv1): Conv2d(original_name=Conv2d)\n", + " (conv2): Conv2d(original_name=Conv2d)\n", + " )\n", + " (classifer): LeNetClassifier(\n", + " original_name=LeNetClassifier\n", + " (fc1): Linear(original_name=Linear)\n", + " (fc2): Linear(original_name=Linear)\n", + " (fc3): Linear(original_name=Linear)\n", + " )\n", + ")" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "traced_model = torch.jit.trace(model, torch.empty([1,1,32,32]).to(\"cuda\"))\n", + "traced_model" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 5.56 ms\n", + "Iteration 200/1000, ave batch time 5.56 ms\n", + "Iteration 300/1000, ave batch time 5.56 ms\n", + "Iteration 400/1000, ave batch time 5.56 ms\n", + "Iteration 500/1000, ave batch time 5.56 ms\n", + "Iteration 600/1000, ave batch time 5.56 ms\n", + "Iteration 700/1000, ave batch time 5.56 ms\n", + "Iteration 800/1000, ave batch time 5.56 ms\n", + "Iteration 900/1000, ave batch time 5.56 ms\n", + "Iteration 1000/1000, ave batch time 5.56 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 5.56 ms\n" + ] + } + ], + "source": [ + "benchmark(traced_model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Scripting\n", + "\n", + "Scripting actually inspects your code with a compiler and generates an equivalent TorchScript program. The difference is that since tracing simply follows the execution of your module, it cannot pick up control flow for instance, it will only follow the code path that a particular input triggers. By working from the Python code, the compiler can include these components. We can run the script compiler on our LeNet module by calling torch.jit.script.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "model = LeNet().to(\"cuda\").eval()\n", + "script_model = torch.jit.script(model)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "RecursiveScriptModule(\n", + " original_name=LeNet\n", + " (feat): RecursiveScriptModule(\n", + " original_name=LeNetFeatExtractor\n", + " (conv1): RecursiveScriptModule(original_name=Conv2d)\n", + " (conv2): RecursiveScriptModule(original_name=Conv2d)\n", + " )\n", + " (classifer): RecursiveScriptModule(\n", + " original_name=LeNetClassifier\n", + " (fc1): RecursiveScriptModule(original_name=Linear)\n", + " (fc2): RecursiveScriptModule(original_name=Linear)\n", + " (fc3): RecursiveScriptModule(original_name=Linear)\n", + " )\n", + ")" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "script_model" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 5.56 ms\n", + "Iteration 200/1000, ave batch time 5.56 ms\n", + "Iteration 300/1000, ave batch time 5.56 ms\n", + "Iteration 400/1000, ave batch time 5.56 ms\n", + "Iteration 500/1000, ave batch time 5.56 ms\n", + "Iteration 600/1000, ave batch time 5.56 ms\n", + "Iteration 700/1000, ave batch time 5.56 ms\n", + "Iteration 800/1000, ave batch time 5.56 ms\n", + "Iteration 900/1000, ave batch time 5.56 ms\n", + "Iteration 1000/1000, ave batch time 5.56 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 5.56 ms\n" + ] + } + ], + "source": [ + "benchmark(script_model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 3. Compiling with Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### TorchScript traced model\n", + "\n", + "First, we compile the TorchScript traced model with Torch-TensorRT. Notice the performance impact." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x.1\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Max value of this profile is not valid\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "# We use a batch-size of 1024, and half precision\n", + "trt_ts_module = torch_tensorrt.compile(traced_model, inputs=[torch_tensorrt.Input(\n", + " min_shape=[1024, 1, 32, 32],\n", + " opt_shape=[1024, 1, 33, 33],\n", + " max_shape=[1024, 1, 34, 34],\n", + " dtype=torch.half\n", + " )], \n", + " enabled_precisions = {torch.half})\n", + "\n", + "input_data = torch.randn((1024, 1, 32, 32))\n", + "input_data = input_data.half().to(\"cuda\")\n", + "\n", + "input_data = input_data.half()\n", + "result = trt_ts_module(input_data)\n", + "torch.jit.save(trt_ts_module, \"trt_ts_module.ts\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 1.41 ms\n", + "Iteration 200/1000, ave batch time 1.40 ms\n", + "Iteration 300/1000, ave batch time 1.40 ms\n", + "Iteration 400/1000, ave batch time 1.39 ms\n", + "Iteration 500/1000, ave batch time 1.40 ms\n", + "Iteration 600/1000, ave batch time 1.40 ms\n", + "Iteration 700/1000, ave batch time 1.40 ms\n", + "Iteration 800/1000, ave batch time 1.40 ms\n", + "Iteration 900/1000, ave batch time 1.40 ms\n", + "Iteration 1000/1000, ave batch time 1.40 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 1.40 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_ts_module, input_shape=(1024, 1, 32, 32), dtype=\"fp16\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### TorchScript script model\n", + "\n", + "Next, we compile the TorchScript script model with Torch-TensorRT. Notice the performance impact." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x.1\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Max value of this profile is not valid\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "trt_script_module = torch_tensorrt.compile(script_model, inputs = [torch_tensorrt.Input(\n", + " min_shape=[1024, 1, 32, 32],\n", + " opt_shape=[1024, 1, 33, 33],\n", + " max_shape=[1024, 1, 34, 34],\n", + " dtype=torch.half\n", + " )],\n", + " enabled_precisions={torch.half})\n", + "\n", + "input_data = torch.randn((1024, 1, 32, 32))\n", + "input_data = input_data.half().to(\"cuda\")\n", + "\n", + "input_data = input_data.half()\n", + "result = trt_script_module(input_data)\n", + "torch.jit.save(trt_script_module, \"trt_script_module.ts\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 1.43 ms\n", + "Iteration 200/1000, ave batch time 1.41 ms\n", + "Iteration 300/1000, ave batch time 1.40 ms\n", + "Iteration 400/1000, ave batch time 1.42 ms\n", + "Iteration 500/1000, ave batch time 1.42 ms\n", + "Iteration 600/1000, ave batch time 1.41 ms\n", + "Iteration 700/1000, ave batch time 1.41 ms\n", + "Iteration 800/1000, ave batch time 1.40 ms\n", + "Iteration 900/1000, ave batch time 1.40 ms\n", + "Iteration 1000/1000, ave batch time 1.40 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 1.40 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_script_module, input_shape=(1024, 1, 32, 32), dtype=\"fp16\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT and test the performance impact of the optimization.\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. Fill out issues at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.2.0/_notebooks/ssd-object-detection-demo.html b/docs/v1.2.0/_notebooks/ssd-object-detection-demo.html new file mode 100644 index 0000000000..9ad9fef7cb --- /dev/null +++ b/docs/v1.2.0/_notebooks/ssd-object-detection-demo.html @@ -0,0 +1,1635 @@ + + + + + + + + + + + + + Object Detection with Torch-TensorRT (SSD) — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Object Detection with Torch-TensorRT (SSD)
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ + + +
+
[1]:
+
+
+
# Copyright 2020 NVIDIA Corporation. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
+
+

0651fd225e2f45ecadc9b43b60a4e5ff

+
+

Object Detection with Torch-TensorRT (SSD)

+
+
+

Overview

+

In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the +best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch’s JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new +world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.

+

When deploying on NVIDIA GPUs TensorRT, NVIDIA’s Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA’s Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that +perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.

+

Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch.

+
+

Learning objectives

+

This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained SSD network, and running it to test the speedup obtained.

+
+
+
+

Contents

+
    +
  1. Requirements

  2. +
  3. SSD Overview

  4. +
  5. Creating TorchScript modules

  6. +
  7. Compiling with Torch-TensorRT

  8. +
  9. Running Inference

  10. +
  11. Measuring Speedup

  12. +
  13. Conclusion

  14. +
+
+

## 1. Requirements

+

Follow the steps in notebooks/README to prepare a Docker container, within which you can run this demo notebook.

+

In addition to that, run the following cell to obtain additional libraries specific to this demo.

+
+
[2]:
+
+
+
!pip install scikit-image==0.19.1
+!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org
+
+
+
+
+
+
+
+
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Collecting scikit-image==0.19.1
+  Downloading scikit_image-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.8 MB)
+     |████████████████████████████████| 13.8 MB 8.8 MB/s eta 0:00:01
+Requirement already satisfied: networkx>=2.2 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (2.6.3)
+Collecting tifffile>=2019.7.26
+  Downloading tifffile-2022.3.16-py3-none-any.whl (179 kB)
+     |████████████████████████████████| 179 kB 110.1 MB/s eta 0:00:01
+Requirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (21.3)
+Requirement already satisfied: scipy>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (1.6.3)
+Requirement already satisfied: numpy>=1.17.0 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (1.22.2)
+Collecting imageio>=2.4.1
+  Downloading imageio-2.16.1-py3-none-any.whl (3.3 MB)
+     |████████████████████████████████| 3.3 MB 42.3 MB/s eta 0:00:01
+Requirement already satisfied: pillow!=7.1.0,!=7.1.1,!=8.3.0,>=6.1.0 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (9.0.0)
+Collecting PyWavelets>=1.1.1
+  Downloading PyWavelets-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.9 MB)
+     |████████████████████████████████| 6.9 MB 61.3 MB/s eta 0:00:01
+Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging>=20.0->scikit-image==0.19.1) (3.0.7)
+Installing collected packages: tifffile, PyWavelets, imageio, scikit-image
+Successfully installed PyWavelets-1.3.0 imageio-2.16.1 scikit-image-0.19.1 tifffile-2022.3.16
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com
+Collecting ipywidgets
+  Downloading ipywidgets-7.7.0-py2.py3-none-any.whl (123 kB)
+     |████████████████████████████████| 123 kB 12.1 MB/s eta 0:00:01
+Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.9.0)
+Collecting jupyterlab-widgets>=1.0.0
+  Downloading jupyterlab_widgets-1.1.0-py3-none-any.whl (245 kB)
+     |████████████████████████████████| 245 kB 60.6 MB/s eta 0:00:01
+Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.3)
+Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)
+Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (8.0.1)
+Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)
+Collecting widgetsnbextension~=3.6.0
+  Downloading widgetsnbextension-3.6.0-py2.py3-none-any.whl (1.6 MB)
+     |████████████████████████████████| 1.6 MB 35.2 MB/s eta 0:00:01
+Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.4)
+Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.1.2)
+Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)
+Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)
+Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.1)
+Requirement already satisfied: stack-data in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.1.4)
+Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.26)
+Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)
+Requirement already satisfied: pygments in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.2)
+Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)
+Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.1)
+Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)
+Requirement already satisfied: black in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (22.1.0)
+Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)
+Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)
+Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)
+Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (0.3)
+Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (22.3.0)
+Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (4.9.1)
+Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (2.8.2)
+Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)
+Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.4.0)
+Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.18.1)
+Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (5.4.0)
+Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.7.0)
+Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)
+Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)
+Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (1.16.0)
+Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.6.0->ipywidgets) (6.4.1)
+Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.1)
+Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.8.0)
+Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.1)
+Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.0.3)
+Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (6.4.2)
+Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3.0)
+Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.2.0)
+Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.15.0)
+Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.21)
+Requirement already satisfied: pathspec>=0.9.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (0.9.0)
+Requirement already satisfied: tomli>=1.1.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (2.0.1)
+Requirement already satisfied: mypy-extensions>=0.4.3 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (0.4.3)
+Requirement already satisfied: click>=8.0.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (8.0.3)
+Requirement already satisfied: platformdirs>=2 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (2.4.1)
+Requirement already satisfied: typing-extensions>=3.10.0.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (4.0.1)
+Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.0.1)
+Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.7.1)
+Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.8.4)
+Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.11)
+Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.0)
+Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.1.2)
+Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (4.1.0)
+Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.5.0)
+Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.1)
+Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3)
+Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.0.7)
+Requirement already satisfied: executing in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.8.2)
+Requirement already satisfied: pure-eval in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.2.2)
+Requirement already satisfied: asttokens in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (2.0.5)
+Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets
+Successfully installed ipywidgets-7.7.0 jupyterlab-widgets-1.1.0 widgetsnbextension-3.6.0
+WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
+
+
+
+

## 2. SSD

+
+

Single Shot MultiBox Detector model for object detection

+ ++++ + + + + + + + + + + +

_

_

alt

image1

+

PyTorch has a model repository called the PyTorch Hub, which is a source for high quality implementations of common models. We can get our SSD model pretrained on COCO from there.

+
+
+

Model Description

+

This SSD300 model is based on the SSD: Single Shot MultiBox Detector paper, which describes SSD as “a method for detecting objects in images using a single deep neural network”. The input size is fixed to 300x300.

+

The main difference between this model and the one described in the paper is in the backbone. Specifically, the VGG model is obsolete and is replaced by the ResNet-50 model.

+

From the Speed/accuracy trade-offs for modern convolutional object detectors paper, the following enhancements were made to the backbone: * The conv5_x, avgpool, fc and softmax layers were removed from the original classification model. * All strides in conv4_x are set to 1x1.

+

The backbone is followed by 5 additional convolutional layers. In addition to the convolutional layers, we attached 6 detection heads: * The first detection head is attached to the last conv4_x layer. * The other five detection heads are attached to the corresponding 5 additional layers.

+

Detector heads are similar to the ones referenced in the paper, however, they are enhanced by additional BatchNorm layers after each convolution.

+

More information about this SSD model is available at Nvidia’s “DeepLearningExamples” Github here.

+
+
[3]:
+
+
+
import torch
+torch.hub._validate_not_a_forked_repo=lambda a,b,c: True
+
+
+
+
+
[4]:
+
+
+
# List of available models in PyTorch Hub from Nvidia/DeepLearningExamples
+torch.hub.list('NVIDIA/DeepLearningExamples:torchhub')
+
+
+
+
+
+
+
+
+Downloading: "https://github.com/NVIDIA/DeepLearningExamples/archive/torchhub.zip" to /root/.cache/torch/hub/torchhub.zip
+/root/.cache/torch/hub/NVIDIA_DeepLearningExamples_torchhub/PyTorch/Classification/ConvNets/image_classification/models/efficientnet.py:17: UserWarning: pytorch_quantization module not found, quantization will not be available
+  warnings.warn(
+
+
+
+
[4]:
+
+
+
+
+['nvidia_convnets_processing_utils',
+ 'nvidia_efficientnet',
+ 'nvidia_efficientnet_b0',
+ 'nvidia_efficientnet_b4',
+ 'nvidia_efficientnet_widese_b0',
+ 'nvidia_efficientnet_widese_b4',
+ 'nvidia_resneXt',
+ 'nvidia_resnet50',
+ 'nvidia_resnext101_32x4d',
+ 'nvidia_se_resnext101_32x4d',
+ 'nvidia_ssd',
+ 'nvidia_ssd_processing_utils',
+ 'nvidia_tacotron2',
+ 'nvidia_tts_utils',
+ 'nvidia_waveglow']
+
+
+
+
[5]:
+
+
+
# load SSD model pretrained on COCO from Torch Hub
+precision = 'fp32'
+ssd300 = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_ssd', model_math=precision);
+
+
+
+
+
+
+
+
+Using cache found in /root/.cache/torch/hub/NVIDIA_DeepLearningExamples_torchhub
+Downloading: "https://download.pytorch.org/models/resnet50-0676ba61.pth" to /root/.cache/torch/hub/checkpoints/resnet50-0676ba61.pth
+
+
+
+
+
+
+
+
+
+
+
+
+
+Downloading checkpoint from https://api.ngc.nvidia.com/v2/models/nvidia/ssd_pyt_ckpt_amp/versions/20.06.0/files/nvidia_ssdpyt_amp_200703.pt
+
+
+

Setting precision="fp16" will load a checkpoint trained with mixed precision into architecture enabling execution on Tensor Cores. Handling mixed precision data requires the Apex library.

+
+
+

Sample Inference

+

We can now run inference on the model. This is demonstrated below using sample images from the COCO 2017 Validation set.

+
+
[6]:
+
+
+
# Sample images from the COCO validation set
+uris = [
+    'http://images.cocodataset.org/val2017/000000397133.jpg',
+    'http://images.cocodataset.org/val2017/000000037777.jpg',
+    'http://images.cocodataset.org/val2017/000000252219.jpg'
+]
+
+# For convenient and comprehensive formatting of input and output of the model, load a set of utility methods.
+utils = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_ssd_processing_utils')
+
+# Format images to comply with the network input
+inputs = [utils.prepare_input(uri) for uri in uris]
+tensor = utils.prepare_tensor(inputs, False)
+
+# The model was trained on COCO dataset, which we need to access in order to
+# translate class IDs into object names.
+classes_to_labels = utils.get_coco_object_dictionary()
+
+
+
+
+
+
+
+
+Using cache found in /root/.cache/torch/hub/NVIDIA_DeepLearningExamples_torchhub
+
+
+
+
+
+
+
+Downloading COCO annotations.
+Downloading finished.
+
+
+
+
[7]:
+
+
+
# Next, we run object detection
+model = ssd300.eval().to("cuda")
+detections_batch = model(tensor)
+
+# By default, raw output from SSD network per input image contains 8732 boxes with
+# localization and class probability distribution.
+# Let’s filter this output to only get reasonable detections (confidence>40%) in a more comprehensive format.
+results_per_input = utils.decode_results(detections_batch)
+best_results_per_input = [utils.pick_best(results, 0.40) for results in results_per_input]
+
+
+
+
+
+

Visualize results

+
+
[8]:
+
+
+
from matplotlib import pyplot as plt
+import matplotlib.patches as patches
+
+# The utility plots the images and predicted bounding boxes (with confidence scores).
+def plot_results(best_results):
+    for image_idx in range(len(best_results)):
+        fig, ax = plt.subplots(1)
+        # Show original, denormalized image...
+        image = inputs[image_idx] / 2 + 0.5
+        ax.imshow(image)
+        # ...with detections
+        bboxes, classes, confidences = best_results[image_idx]
+        for idx in range(len(bboxes)):
+            left, bot, right, top = bboxes[idx]
+            x, y, w, h = [val * 300 for val in [left, bot, right - left, top - bot]]
+            rect = patches.Rectangle((x, y), w, h, linewidth=1, edgecolor='r', facecolor='none')
+            ax.add_patch(rect)
+            ax.text(x, y, "{} {:.0f}%".format(classes_to_labels[classes[idx] - 1], confidences[idx]*100), bbox=dict(facecolor='white', alpha=0.5))
+    plt.show()
+
+
+
+
+
[9]:
+
+
+
# Visualize results without Torch-TensorRT
+plot_results(best_results_per_input)
+
+
+
+
+
+
+
+../_images/_notebooks_ssd-object-detection-demo_18_0.png +
+
+
+
+
+
+../_images/_notebooks_ssd-object-detection-demo_18_1.png +
+
+
+
+
+
+../_images/_notebooks_ssd-object-detection-demo_18_2.png +
+
+
+
+

Benchmark utility

+
+
[10]:
+
+
+
import time
+import numpy as np
+
+import torch.backends.cudnn as cudnn
+cudnn.benchmark = True
+
+# Helper function to benchmark the model
+def benchmark(model, input_shape=(1024, 1, 32, 32), dtype='fp32', nwarmup=50, nruns=1000):
+    input_data = torch.randn(input_shape)
+    input_data = input_data.to("cuda")
+    if dtype=='fp16':
+        input_data = input_data.half()
+
+    print("Warm up ...")
+    with torch.no_grad():
+        for _ in range(nwarmup):
+            features = model(input_data)
+    torch.cuda.synchronize()
+    print("Start timing ...")
+    timings = []
+    with torch.no_grad():
+        for i in range(1, nruns+1):
+            start_time = time.time()
+            pred_loc, pred_label  = model(input_data)
+            torch.cuda.synchronize()
+            end_time = time.time()
+            timings.append(end_time - start_time)
+            if i%10==0:
+                print('Iteration %d/%d, avg batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))
+
+    print("Input shape:", input_data.size())
+    print("Output location prediction size:", pred_loc.size())
+    print("Output label prediction size:", pred_label.size())
+    print('Average batch time: %.2f ms'%(np.mean(timings)*1000))
+
+
+
+

We check how well the model performs before we use Torch-TensorRT

+
+
[11]:
+
+
+
# Model benchmark without Torch-TensorRT
+model = ssd300.eval().to("cuda")
+benchmark(model, input_shape=(128, 3, 300, 300), nruns=100)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, avg batch time 165.38 ms
+Iteration 20/100, avg batch time 165.99 ms
+Iteration 30/100, avg batch time 166.04 ms
+Iteration 40/100, avg batch time 166.32 ms
+Iteration 50/100, avg batch time 166.49 ms
+Iteration 60/100, avg batch time 166.74 ms
+Iteration 70/100, avg batch time 166.88 ms
+Iteration 80/100, avg batch time 167.05 ms
+Iteration 90/100, avg batch time 167.18 ms
+Iteration 100/100, avg batch time 167.31 ms
+Input shape: torch.Size([128, 3, 300, 300])
+Output location prediction size: torch.Size([128, 4, 8732])
+Output label prediction size: torch.Size([128, 81, 8732])
+Average batch time: 167.31 ms
+
+
+
+

## 3. Creating TorchScript modules

+

To compile with Torch-TensorRT, the model must first be in TorchScript. TorchScript is a programming language included in PyTorch which removes the Python dependency normal PyTorch models have. This conversion is done via a JIT compiler which given a PyTorch Module will generate an equivalent TorchScript Module. There are two paths that can be used to generate TorchScript: Tracing and Scripting. - Tracing follows execution of PyTorch generating ops in TorchScript corresponding to +what it sees. - Scripting does an analysis of the Python code and generates TorchScript, this allows the resulting graph to include control flow which tracing cannot do.

+

Tracing however due to its simplicity is more likely to compile successfully with Torch-TensorRT (though both systems are supported).

+
+
[12]:
+
+
+
model = ssd300.eval().to("cuda")
+traced_model = torch.jit.trace(model, [torch.randn((1,3,300,300)).to("cuda")])
+
+
+
+

If required, we can also save this model and use it independently of Python.

+
+
[13]:
+
+
+
# This is just an example, and not required for the purposes of this demo
+torch.jit.save(traced_model, "ssd_300_traced.jit.pt")
+
+
+
+
+
[14]:
+
+
+
# Obtain the average time taken by a batch of input with Torchscript compiled modules
+benchmark(traced_model, input_shape=(128, 3, 300, 300), nruns=100)
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, avg batch time 165.53 ms
+Iteration 20/100, avg batch time 166.19 ms
+Iteration 30/100, avg batch time 166.12 ms
+Iteration 40/100, avg batch time 166.16 ms
+Iteration 50/100, avg batch time 166.24 ms
+Iteration 60/100, avg batch time 166.33 ms
+Iteration 70/100, avg batch time 166.43 ms
+Iteration 80/100, avg batch time 166.44 ms
+Iteration 90/100, avg batch time 166.53 ms
+Iteration 100/100, avg batch time 166.59 ms
+Input shape: torch.Size([128, 3, 300, 300])
+Output location prediction size: torch.Size([128, 4, 8732])
+Output label prediction size: torch.Size([128, 81, 8732])
+Average batch time: 166.59 ms
+
+
+
+

## 4. Compiling with Torch-TensorRT TorchScript modules behave just like normal PyTorch modules and are intercompatible. From TorchScript we can now compile a TensorRT based module. This module will still be implemented in TorchScript but all the computation will be done in TensorRT.

+
+
[15]:
+
+
+
import torch_tensorrt
+
+# The compiled module will have precision as specified by "op_precision".
+# Here, it will have FP16 precision.
+trt_model = torch_tensorrt.compile(traced_model,
+    inputs= [torch_tensorrt.Input((3, 3, 300, 300), dtype=torch.half)],
+    enabled_precisions= {torch.half}, # Run with FP16
+    workspace_size= 1 << 20
+)
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - For input x, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float
+The compiler is going to use the user setting Float16
+This conflict may cause an error at runtime due to partial compilation being enabled and therefore
+compatibility with PyTorch's data type convention is required.
+If you do indeed see errors at runtime either:
+- Remove the dtype spec for x
+- Disable partial compilation by setting require_full_compilation to True
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+
+
+
+

## 5. Running Inference

+

Next, we run object detection

+
+
[16]:
+
+
+
# using a Torch-TensorRT module is exactly the same as how we usually do inference in PyTorch i.e. model(inputs)
+detections_batch = trt_model(tensor.to(torch.half)) # convert the input to half precision
+
+# By default, raw output from SSD network per input image contains 8732 boxes with
+# localization and class probability distribution.
+# Let’s filter this output to only get reasonable detections (confidence>40%) in a more comprehensive format.
+results_per_input = utils.decode_results(detections_batch)
+best_results_per_input_trt = [utils.pick_best(results, 0.40) for results in results_per_input]
+
+
+
+

Now, let’s visualize our predictions!

+
+
[17]:
+
+
+
# Visualize results with Torch-TensorRT
+plot_results(best_results_per_input_trt)
+
+
+
+
+
+
+
+../_images/_notebooks_ssd-object-detection-demo_35_0.png +
+
+
+
+
+
+../_images/_notebooks_ssd-object-detection-demo_35_1.png +
+
+
+
+
+
+../_images/_notebooks_ssd-object-detection-demo_35_2.png +
+
+

We get similar results as before!

+
+
+
+
+

6. Measuring Speedup

+

We can run the benchmark function again to see the speedup gained! Compare this result with the same batch-size of input in the case without Torch-TensorRT above.

+
+
[18]:
+
+
+
batch_size = 128
+
+# Recompiling with batch_size we use for evaluating performance
+trt_model = torch_tensorrt.compile(traced_model,
+    inputs = [torch_tensorrt.Input((batch_size, 3, 300, 300), dtype=torch.half)],
+    enabled_precisions= {torch.half}, # Run with FP16
+    workspace_size= 1 << 20
+)
+
+benchmark(trt_model, input_shape=(batch_size, 3, 300, 300), dtype='fp16', nruns=100)
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - For input x, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float
+The compiler is going to use the user setting Float16
+This conflict may cause an error at runtime due to partial compilation being enabled and therefore
+compatibility with PyTorch's data type convention is required.
+If you do indeed see errors at runtime either:
+- Remove the dtype spec for x
+- Disable partial compilation by setting require_full_compilation to True
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 10/100, avg batch time 45.88 ms
+Iteration 20/100, avg batch time 46.20 ms
+Iteration 30/100, avg batch time 46.10 ms
+Iteration 40/100, avg batch time 46.19 ms
+Iteration 50/100, avg batch time 46.15 ms
+Iteration 60/100, avg batch time 46.17 ms
+Iteration 70/100, avg batch time 46.19 ms
+Iteration 80/100, avg batch time 46.20 ms
+Iteration 90/100, avg batch time 46.22 ms
+Iteration 100/100, avg batch time 46.21 ms
+Input shape: torch.Size([128, 3, 300, 300])
+Output location prediction size: torch.Size([128, 4, 8732])
+Output label prediction size: torch.Size([128, 81, 8732])
+Average batch time: 46.21 ms
+
+
+
+
+
+

7. Conclusion

+

In this notebook, we have walked through the complete process of compiling a TorchScript SSD300 model with Torch-TensorRT, and tested the performance impact of the optimization. We find that using the Torch-TensorRT compiled model, we gain significant speedup in inference without any noticeable drop in performance!

+
+

Details

+

For detailed information on model input and output, training recipies, inference and performance visit: github and/or NGC

+
+
+

References

+ +
+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_notebooks/ssd-object-detection-demo.ipynb b/docs/v1.2.0/_notebooks/ssd-object-detection-demo.ipynb new file mode 100644 index 0000000000..f2a0bd8063 --- /dev/null +++ b/docs/v1.2.0/_notebooks/ssd-object-detection-demo.ipynb @@ -0,0 +1,943 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2020 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Object Detection with Torch-TensorRT (SSD)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Overview\n", + "\n", + "In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch's JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.\n", + "\n", + "When deploying on NVIDIA GPUs TensorRT, NVIDIA's Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA's Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.\n", + "\n", + "Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained SSD network, and running it to test the speedup obtained.\n", + "\n", + "## Contents\n", + "1. [Requirements](#1)\n", + "2. [SSD Overview](#2)\n", + "3. [Creating TorchScript modules](#3)\n", + "4. [Compiling with Torch-TensorRT](#4)\n", + "5. [Running Inference](#5)\n", + "6. [Measuring Speedup](#6)\n", + "7. [Conclusion](#7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 1. Requirements\n", + "\n", + "Follow the steps in `notebooks/README` to prepare a Docker container, within which you can run this demo notebook.\n", + "\n", + "In addition to that, run the following cell to obtain additional libraries specific to this demo." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting scikit-image==0.19.1\n", + " Downloading scikit_image-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.8 MB)\n", + "\u001b[K |████████████████████████████████| 13.8 MB 8.8 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: networkx>=2.2 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (2.6.3)\n", + "Collecting tifffile>=2019.7.26\n", + " Downloading tifffile-2022.3.16-py3-none-any.whl (179 kB)\n", + "\u001b[K |████████████████████████████████| 179 kB 110.1 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (21.3)\n", + "Requirement already satisfied: scipy>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (1.6.3)\n", + "Requirement already satisfied: numpy>=1.17.0 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (1.22.2)\n", + "Collecting imageio>=2.4.1\n", + " Downloading imageio-2.16.1-py3-none-any.whl (3.3 MB)\n", + "\u001b[K |████████████████████████████████| 3.3 MB 42.3 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: pillow!=7.1.0,!=7.1.1,!=8.3.0,>=6.1.0 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (9.0.0)\n", + "Collecting PyWavelets>=1.1.1\n", + " Downloading PyWavelets-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.9 MB)\n", + "\u001b[K |████████████████████████████████| 6.9 MB 61.3 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging>=20.0->scikit-image==0.19.1) (3.0.7)\n", + "Installing collected packages: tifffile, PyWavelets, imageio, scikit-image\n", + "Successfully installed PyWavelets-1.3.0 imageio-2.16.1 scikit-image-0.19.1 tifffile-2022.3.16\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting ipywidgets\n", + " Downloading ipywidgets-7.7.0-py2.py3-none-any.whl (123 kB)\n", + "\u001b[K |████████████████████████████████| 123 kB 12.1 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.9.0)\n", + "Collecting jupyterlab-widgets>=1.0.0\n", + " Downloading jupyterlab_widgets-1.1.0-py3-none-any.whl (245 kB)\n", + "\u001b[K |████████████████████████████████| 245 kB 60.6 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.3)\n", + "Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (8.0.1)\n", + "Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)\n", + "Collecting widgetsnbextension~=3.6.0\n", + " Downloading widgetsnbextension-3.6.0-py2.py3-none-any.whl (1.6 MB)\n", + "\u001b[K |████████████████████████████████| 1.6 MB 35.2 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.4)\n", + "Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.1.2)\n", + "Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)\n", + "Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)\n", + "Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.1)\n", + "Requirement already satisfied: stack-data in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.1.4)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.26)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)\n", + "Requirement already satisfied: pygments in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.2)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.1)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: black in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (22.1.0)\n", + "Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (0.3)\n", + "Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (22.3.0)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (4.9.1)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (2.8.2)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)\n", + "Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.4.0)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (5.4.0)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.7.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (1.16.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.6.0->ipywidgets) (6.4.1)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.1)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.8.0)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.1)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.0.3)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (6.4.2)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3.0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.21)\n", + "Requirement already satisfied: pathspec>=0.9.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (0.9.0)\n", + "Requirement already satisfied: tomli>=1.1.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (2.0.1)\n", + "Requirement already satisfied: mypy-extensions>=0.4.3 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (0.4.3)\n", + "Requirement already satisfied: click>=8.0.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (8.0.3)\n", + "Requirement already satisfied: platformdirs>=2 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (2.4.1)\n", + "Requirement already satisfied: typing-extensions>=3.10.0.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (4.0.1)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.0.1)\n", + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.7.1)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.8.4)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.11)\n", + "Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.0)\n", + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.1.2)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (4.1.0)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.5.0)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.1)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.0.7)\n", + "Requirement already satisfied: executing in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.8.2)\n", + "Requirement already satisfied: pure-eval in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.2.2)\n", + "Requirement already satisfied: asttokens in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (2.0.5)\n", + "Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets\n", + "Successfully installed ipywidgets-7.7.0 jupyterlab-widgets-1.1.0 widgetsnbextension-3.6.0\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install scikit-image==0.19.1\n", + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 2. SSD\n", + "\n", + "### Single Shot MultiBox Detector model for object detection\n", + "\n", + "_ | _\n", + "- | -\n", + "![alt](https://pytorch.org/assets/images/ssd_diagram.png) | ![alt](https://pytorch.org/assets/images/ssd.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "PyTorch has a model repository called the PyTorch Hub, which is a source for high quality implementations of common models. We can get our SSD model pretrained on [COCO](https://cocodataset.org/#home) from there.\n", + "\n", + "### Model Description\n", + "\n", + "This SSD300 model is based on the\n", + "[SSD: Single Shot MultiBox Detector](https://arxiv.org/abs/1512.02325) paper, which\n", + "describes SSD as “a method for detecting objects in images using a single deep neural network\".\n", + "The input size is fixed to 300x300.\n", + "\n", + "The main difference between this model and the one described in the paper is in the backbone.\n", + "Specifically, the VGG model is obsolete and is replaced by the ResNet-50 model.\n", + "\n", + "From the\n", + "[Speed/accuracy trade-offs for modern convolutional object detectors](https://arxiv.org/abs/1611.10012)\n", + "paper, the following enhancements were made to the backbone:\n", + "* The conv5_x, avgpool, fc and softmax layers were removed from the original classification model.\n", + "* All strides in conv4_x are set to 1x1.\n", + "\n", + "The backbone is followed by 5 additional convolutional layers.\n", + "In addition to the convolutional layers, we attached 6 detection heads:\n", + "* The first detection head is attached to the last conv4_x layer.\n", + "* The other five detection heads are attached to the corresponding 5 additional layers.\n", + "\n", + "Detector heads are similar to the ones referenced in the paper, however,\n", + "they are enhanced by additional BatchNorm layers after each convolution.\n", + "\n", + "More information about this SSD model is available at Nvidia's \"DeepLearningExamples\" Github [here](https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/Detection/SSD)." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "torch.hub._validate_not_a_forked_repo=lambda a,b,c: True" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Downloading: \"https://github.com/NVIDIA/DeepLearningExamples/archive/torchhub.zip\" to /root/.cache/torch/hub/torchhub.zip\n", + "/root/.cache/torch/hub/NVIDIA_DeepLearningExamples_torchhub/PyTorch/Classification/ConvNets/image_classification/models/efficientnet.py:17: UserWarning: pytorch_quantization module not found, quantization will not be available\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/plain": [ + "['nvidia_convnets_processing_utils',\n", + " 'nvidia_efficientnet',\n", + " 'nvidia_efficientnet_b0',\n", + " 'nvidia_efficientnet_b4',\n", + " 'nvidia_efficientnet_widese_b0',\n", + " 'nvidia_efficientnet_widese_b4',\n", + " 'nvidia_resneXt',\n", + " 'nvidia_resnet50',\n", + " 'nvidia_resnext101_32x4d',\n", + " 'nvidia_se_resnext101_32x4d',\n", + " 'nvidia_ssd',\n", + " 'nvidia_ssd_processing_utils',\n", + " 'nvidia_tacotron2',\n", + " 'nvidia_tts_utils',\n", + " 'nvidia_waveglow']" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# List of available models in PyTorch Hub from Nvidia/DeepLearningExamples\n", + "torch.hub.list('NVIDIA/DeepLearningExamples:torchhub')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using cache found in /root/.cache/torch/hub/NVIDIA_DeepLearningExamples_torchhub\n", + "Downloading: \"https://download.pytorch.org/models/resnet50-0676ba61.pth\" to /root/.cache/torch/hub/checkpoints/resnet50-0676ba61.pth\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1c7cf3e1635d4a2b9c8731b7fc9ce724", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0.00/97.8M [00:0040%) in a more comprehensive format.\n", + "results_per_input = utils.decode_results(detections_batch)\n", + "best_results_per_input = [utils.pick_best(results, 0.40) for results in results_per_input]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualize results" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "import matplotlib.patches as patches\n", + "\n", + "# The utility plots the images and predicted bounding boxes (with confidence scores).\n", + "def plot_results(best_results):\n", + " for image_idx in range(len(best_results)):\n", + " fig, ax = plt.subplots(1)\n", + " # Show original, denormalized image...\n", + " image = inputs[image_idx] / 2 + 0.5\n", + " ax.imshow(image)\n", + " # ...with detections\n", + " bboxes, classes, confidences = best_results[image_idx]\n", + " for idx in range(len(bboxes)):\n", + " left, bot, right, top = bboxes[idx]\n", + " x, y, w, h = [val * 300 for val in [left, bot, right - left, top - bot]]\n", + " rect = patches.Rectangle((x, y), w, h, linewidth=1, edgecolor='r', facecolor='none')\n", + " ax.add_patch(rect)\n", + " ax.text(x, y, \"{} {:.0f}%\".format(classes_to_labels[classes[idx] - 1], confidences[idx]*100), bbox=dict(facecolor='white', alpha=0.5))\n", + " plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Visualize results without Torch-TensorRT\n", + "plot_results(best_results_per_input)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Benchmark utility" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import numpy as np\n", + "\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "# Helper function to benchmark the model\n", + "def benchmark(model, input_shape=(1024, 1, 32, 32), dtype='fp32', nwarmup=50, nruns=1000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " pred_loc, pred_label = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%10==0:\n", + " print('Iteration %d/%d, avg batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output location prediction size:\", pred_loc.size())\n", + " print(\"Output label prediction size:\", pred_label.size())\n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We check how well the model performs **before** we use Torch-TensorRT" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 165.38 ms\n", + "Iteration 20/100, avg batch time 165.99 ms\n", + "Iteration 30/100, avg batch time 166.04 ms\n", + "Iteration 40/100, avg batch time 166.32 ms\n", + "Iteration 50/100, avg batch time 166.49 ms\n", + "Iteration 60/100, avg batch time 166.74 ms\n", + "Iteration 70/100, avg batch time 166.88 ms\n", + "Iteration 80/100, avg batch time 167.05 ms\n", + "Iteration 90/100, avg batch time 167.18 ms\n", + "Iteration 100/100, avg batch time 167.31 ms\n", + "Input shape: torch.Size([128, 3, 300, 300])\n", + "Output location prediction size: torch.Size([128, 4, 8732])\n", + "Output label prediction size: torch.Size([128, 81, 8732])\n", + "Average batch time: 167.31 ms\n" + ] + } + ], + "source": [ + "# Model benchmark without Torch-TensorRT\n", + "model = ssd300.eval().to(\"cuda\")\n", + "benchmark(model, input_shape=(128, 3, 300, 300), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 3. Creating TorchScript modules " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To compile with Torch-TensorRT, the model must first be in **TorchScript**. TorchScript is a programming language included in PyTorch which removes the Python dependency normal PyTorch models have. This conversion is done via a JIT compiler which given a PyTorch Module will generate an equivalent TorchScript Module. There are two paths that can be used to generate TorchScript: **Tracing** and **Scripting**.
\n", + "- Tracing follows execution of PyTorch generating ops in TorchScript corresponding to what it sees.
\n", + "- Scripting does an analysis of the Python code and generates TorchScript, this allows the resulting graph to include control flow which tracing cannot do. \n", + "\n", + "Tracing however due to its simplicity is more likely to compile successfully with Torch-TensorRT (though both systems are supported)." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "model = ssd300.eval().to(\"cuda\")\n", + "traced_model = torch.jit.trace(model, [torch.randn((1,3,300,300)).to(\"cuda\")])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If required, we can also save this model and use it independently of Python." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# This is just an example, and not required for the purposes of this demo\n", + "torch.jit.save(traced_model, \"ssd_300_traced.jit.pt\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 165.53 ms\n", + "Iteration 20/100, avg batch time 166.19 ms\n", + "Iteration 30/100, avg batch time 166.12 ms\n", + "Iteration 40/100, avg batch time 166.16 ms\n", + "Iteration 50/100, avg batch time 166.24 ms\n", + "Iteration 60/100, avg batch time 166.33 ms\n", + "Iteration 70/100, avg batch time 166.43 ms\n", + "Iteration 80/100, avg batch time 166.44 ms\n", + "Iteration 90/100, avg batch time 166.53 ms\n", + "Iteration 100/100, avg batch time 166.59 ms\n", + "Input shape: torch.Size([128, 3, 300, 300])\n", + "Output location prediction size: torch.Size([128, 4, 8732])\n", + "Output label prediction size: torch.Size([128, 81, 8732])\n", + "Average batch time: 166.59 ms\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input with Torchscript compiled modules\n", + "benchmark(traced_model, input_shape=(128, 3, 300, 300), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 4. Compiling with Torch-TensorRT\n", + "TorchScript modules behave just like normal PyTorch modules and are intercompatible. From TorchScript we can now compile a TensorRT based module. This module will still be implemented in TorchScript but all the computation will be done in TensorRT." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP16 precision.\n", + "trt_model = torch_tensorrt.compile(traced_model, \n", + " inputs= [torch_tensorrt.Input((3, 3, 300, 300), dtype=torch.half)],\n", + " enabled_precisions= {torch.half}, # Run with FP16\n", + " workspace_size= 1 << 20\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 5. Running Inference" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we run object detection" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# using a Torch-TensorRT module is exactly the same as how we usually do inference in PyTorch i.e. model(inputs)\n", + "detections_batch = trt_model(tensor.to(torch.half)) # convert the input to half precision\n", + "\n", + "# By default, raw output from SSD network per input image contains 8732 boxes with \n", + "# localization and class probability distribution. \n", + "# Let’s filter this output to only get reasonable detections (confidence>40%) in a more comprehensive format.\n", + "results_per_input = utils.decode_results(detections_batch)\n", + "best_results_per_input_trt = [utils.pick_best(results, 0.40) for results in results_per_input]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, let's visualize our predictions!\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Visualize results with Torch-TensorRT\n", + "plot_results(best_results_per_input_trt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We get similar results as before!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 6. Measuring Speedup\n", + "We can run the benchmark function again to see the speedup gained! Compare this result with the same batch-size of input in the case without Torch-TensorRT above." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 45.88 ms\n", + "Iteration 20/100, avg batch time 46.20 ms\n", + "Iteration 30/100, avg batch time 46.10 ms\n", + "Iteration 40/100, avg batch time 46.19 ms\n", + "Iteration 50/100, avg batch time 46.15 ms\n", + "Iteration 60/100, avg batch time 46.17 ms\n", + "Iteration 70/100, avg batch time 46.19 ms\n", + "Iteration 80/100, avg batch time 46.20 ms\n", + "Iteration 90/100, avg batch time 46.22 ms\n", + "Iteration 100/100, avg batch time 46.21 ms\n", + "Input shape: torch.Size([128, 3, 300, 300])\n", + "Output location prediction size: torch.Size([128, 4, 8732])\n", + "Output label prediction size: torch.Size([128, 81, 8732])\n", + "Average batch time: 46.21 ms\n" + ] + } + ], + "source": [ + "batch_size = 128\n", + "\n", + "# Recompiling with batch_size we use for evaluating performance\n", + "trt_model = torch_tensorrt.compile(traced_model,\n", + " inputs = [torch_tensorrt.Input((batch_size, 3, 300, 300), dtype=torch.half)],\n", + " enabled_precisions= {torch.half}, # Run with FP16\n", + " workspace_size= 1 << 20\n", + ")\n", + "\n", + "benchmark(trt_model, input_shape=(batch_size, 3, 300, 300), dtype='fp16', nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 7. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling a TorchScript SSD300 model with Torch-TensorRT, and tested the performance impact of the optimization. We find that using the Torch-TensorRT compiled model, we gain significant speedup in inference without any noticeable drop in performance!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Details\n", + "For detailed information on model input and output,\n", + "training recipies, inference and performance visit:\n", + "[github](https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/Detection/SSD)\n", + "and/or [NGC](https://ngc.nvidia.com/catalog/model-scripts/nvidia:ssd_for_pytorch)\n", + "\n", + "### References\n", + "\n", + " - [SSD: Single Shot MultiBox Detector](https://arxiv.org/abs/1512.02325) paper\n", + " - [Speed/accuracy trade-offs for modern convolutional object detectors](https://arxiv.org/abs/1611.10012) paper\n", + " - [SSD on NGC](https://ngc.nvidia.com/catalog/model-scripts/nvidia:ssd_for_pytorch)\n", + " - [SSD on github](https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/Detection/SSD)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.2.0/_notebooks/vgg-qat.html b/docs/v1.2.0/_notebooks/vgg-qat.html new file mode 100644 index 0000000000..71940b30cb --- /dev/null +++ b/docs/v1.2.0/_notebooks/vgg-qat.html @@ -0,0 +1,1917 @@ + + + + + + + + + + + + + Deploying Quantization Aware Trained models in INT8 using Torch-TensorRT — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Deploying Quantization Aware Trained models in INT8 using Torch-TensorRT
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ + + +
+

Deploying Quantization Aware Trained models in INT8 using Torch-TensorRT

+
+

Overview

+

Quantization Aware training (QAT) simulates quantization during training by quantizing weights and activation layers. This will help to reduce the loss in accuracy when we convert the network trained in FP32 to INT8 for faster inference. QAT introduces additional nodes in the graph which will be used to learn the dynamic ranges of weights and activation layers. In this notebook, we illustrate the following steps from training to inference of a QAT model in Torch-TensorRT.

+
    +
  1. Requirements

  2. +
  3. VGG16 Overview

  4. +
  5. Training a baseline VGG16 model

  6. +
  7. Apply Quantization

  8. +
  9. Model calibration

  10. +
  11. Quantization Aware training

  12. +
  13. Export to Torchscript

  14. +
  15. Inference using Torch-TensorRT

  16. +
  17. References

  18. +
+

## 1. Requirements Please install the required dependencies and import these libraries accordingly

+
+
[ ]:
+
+
+
!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org
+
+
+
+
+
[1]:
+
+
+
import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import torch.optim as optim
+import torch.utils.data as data
+import torchvision.transforms as transforms
+import torchvision.datasets as datasets
+import torch_tensorrt
+
+from torch.utils.tensorboard import SummaryWriter
+
+import pytorch_quantization
+from pytorch_quantization import nn as quant_nn
+from pytorch_quantization import quant_modules
+from pytorch_quantization.tensor_quant import QuantDescriptor
+from pytorch_quantization import calib
+from tqdm import tqdm
+
+print(pytorch_quantization.__version__)
+
+import os
+import sys
+sys.path.insert(0, "../examples/int8/training/vgg16")
+from vgg16 import vgg16
+
+
+
+
+
+
+
+
+2.1.0
+
+
+

## 2. VGG16 Overview ### Very Deep Convolutional Networks for Large-Scale Image Recognition VGG is one of the earliest family of image classification networks that first used small (3x3) convolution filters and achieved significant improvements on ImageNet recognition challenge. The network architecture looks as follows beac8a15065243e699379551998f212b

+

## 3. Training a baseline VGG16 model We train VGG16 on CIFAR10 dataset. Define training and testing datasets and dataloaders. This will download the CIFAR 10 data in your data directory. Data preprocessing is performed using torchvision transforms.

+
+
[2]:
+
+
+
classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
+
+# ========== Define Training dataset and dataloaders =============#
+training_dataset = datasets.CIFAR10(root='./data',
+                                        train=True,
+                                        download=True,
+                                        transform=transforms.Compose([
+                                            transforms.RandomCrop(32, padding=4),
+                                            transforms.RandomHorizontalFlip(),
+                                            transforms.ToTensor(),
+                                            transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
+                                        ]))
+
+training_dataloader = torch.utils.data.DataLoader(training_dataset,
+                                                      batch_size=32,
+                                                      shuffle=True,
+                                                      num_workers=2)
+
+# ========== Define Testing dataset and dataloaders =============#
+testing_dataset = datasets.CIFAR10(root='./data',
+                                   train=False,
+                                   download=True,
+                                   transform=transforms.Compose([
+                                       transforms.ToTensor(),
+                                       transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
+                                   ]))
+
+testing_dataloader = torch.utils.data.DataLoader(testing_dataset,
+                                                 batch_size=16,
+                                                 shuffle=False,
+                                                 num_workers=2)
+
+
+
+
+
+
+
+
+Files already downloaded and verified
+Files already downloaded and verified
+
+
+
+
[3]:
+
+
+
def train(model, dataloader, crit, opt, epoch):
+#     global writer
+    model.train()
+    running_loss = 0.0
+    for batch, (data, labels) in enumerate(dataloader):
+        data, labels = data.cuda(), labels.cuda(non_blocking=True)
+        opt.zero_grad()
+        out = model(data)
+        loss = crit(out, labels)
+        loss.backward()
+        opt.step()
+
+        running_loss += loss.item()
+        if batch % 500 == 499:
+            print("Batch: [%5d | %5d] loss: %.3f" % (batch + 1, len(dataloader), running_loss / 100))
+            running_loss = 0.0
+
+def test(model, dataloader, crit, epoch):
+    global writer
+    global classes
+    total = 0
+    correct = 0
+    loss = 0.0
+    class_probs = []
+    class_preds = []
+    model.eval()
+    with torch.no_grad():
+        for data, labels in dataloader:
+            data, labels = data.cuda(), labels.cuda(non_blocking=True)
+            out = model(data)
+            loss += crit(out, labels)
+            preds = torch.max(out, 1)[1]
+            class_probs.append([F.softmax(i, dim=0) for i in out])
+            class_preds.append(preds)
+            total += labels.size(0)
+            correct += (preds == labels).sum().item()
+
+    test_probs = torch.cat([torch.stack(batch) for batch in class_probs])
+    test_preds = torch.cat(class_preds)
+
+    return loss / total, correct / total
+
+def save_checkpoint(state, ckpt_path="checkpoint.pth"):
+    torch.save(state, ckpt_path)
+    print("Checkpoint saved")
+
+
+
+

Define the VGG model that we are going to perfom QAT on.

+
+
[4]:
+
+
+
# CIFAR 10 has 10 classes
+model = vgg16(num_classes=len(classes), init_weights=False)
+model = model.cuda()
+
+
+
+
+
[5]:
+
+
+
# Declare Learning rate
+lr = 0.1
+state = {}
+state["lr"] = lr
+
+# Use cross entropy loss for classification and SGD optimizer
+crit = nn.CrossEntropyLoss()
+opt = optim.SGD(model.parameters(), lr=state["lr"], momentum=0.9, weight_decay=1e-4)
+
+
+# Adjust learning rate based on epoch number
+def adjust_lr(optimizer, epoch):
+    global state
+    new_lr = lr * (0.5**(epoch // 12)) if state["lr"] > 1e-7 else state["lr"]
+    if new_lr != state["lr"]:
+        state["lr"] = new_lr
+        print("Updating learning rate: {}".format(state["lr"]))
+        for param_group in optimizer.param_groups:
+            param_group["lr"] = state["lr"]
+
+
+
+
+
[6]:
+
+
+
# Train the model for 25 epochs to get ~80% accuracy.
+num_epochs=25
+for epoch in range(num_epochs):
+    adjust_lr(opt, epoch)
+    print('Epoch: [%5d / %5d] LR: %f' % (epoch + 1, num_epochs, state["lr"]))
+
+    train(model, training_dataloader, crit, opt, epoch)
+    test_loss, test_acc = test(model, testing_dataloader, crit, epoch)
+
+    print("Test Loss: {:.5f} Test Acc: {:.2f}%".format(test_loss, 100 * test_acc))
+
+save_checkpoint({'epoch': epoch + 1,
+                 'model_state_dict': model.state_dict(),
+                 'acc': test_acc,
+                 'opt_state_dict': opt.state_dict(),
+                 'state': state},
+                ckpt_path="vgg16_base_ckpt")
+
+
+
+
+
+
+
+
+Epoch: [    1 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 13.288
+Batch: [ 1000 |  1563] loss: 11.345
+Batch: [ 1500 |  1563] loss: 11.008
+Test Loss: 0.13388 Test Acc: 13.23%
+Epoch: [    2 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 10.742
+Batch: [ 1000 |  1563] loss: 10.311
+Batch: [ 1500 |  1563] loss: 10.141
+Test Loss: 0.11888 Test Acc: 23.96%
+Epoch: [    3 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 9.877
+Batch: [ 1000 |  1563] loss: 9.821
+Batch: [ 1500 |  1563] loss: 9.818
+Test Loss: 0.11879 Test Acc: 24.68%
+Epoch: [    4 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 9.677
+Batch: [ 1000 |  1563] loss: 9.613
+Batch: [ 1500 |  1563] loss: 9.504
+Test Loss: 0.11499 Test Acc: 23.68%
+Epoch: [    5 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 9.560
+Batch: [ 1000 |  1563] loss: 9.536
+Batch: [ 1500 |  1563] loss: 9.309
+Test Loss: 0.10990 Test Acc: 27.84%
+Epoch: [    6 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 9.254
+Batch: [ 1000 |  1563] loss: 9.234
+Batch: [ 1500 |  1563] loss: 9.188
+Test Loss: 0.11594 Test Acc: 23.29%
+Epoch: [    7 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 9.141
+Batch: [ 1000 |  1563] loss: 9.110
+Batch: [ 1500 |  1563] loss: 9.013
+Test Loss: 0.10732 Test Acc: 29.24%
+Epoch: [    8 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 9.120
+Batch: [ 1000 |  1563] loss: 9.086
+Batch: [ 1500 |  1563] loss: 8.948
+Test Loss: 0.10732 Test Acc: 27.24%
+Epoch: [    9 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 8.941
+Batch: [ 1000 |  1563] loss: 8.997
+Batch: [ 1500 |  1563] loss: 9.028
+Test Loss: 0.11299 Test Acc: 25.52%
+Epoch: [   10 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 8.927
+Batch: [ 1000 |  1563] loss: 8.837
+Batch: [ 1500 |  1563] loss: 8.860
+Test Loss: 0.10130 Test Acc: 34.61%
+Epoch: [   11 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 8.953
+Batch: [ 1000 |  1563] loss: 8.738
+Batch: [ 1500 |  1563] loss: 8.724
+Test Loss: 0.10018 Test Acc: 32.27%
+Epoch: [   12 /    25] LR: 0.100000
+Batch: [  500 |  1563] loss: 8.721
+Batch: [ 1000 |  1563] loss: 8.716
+Batch: [ 1500 |  1563] loss: 8.701
+Test Loss: 0.10070 Test Acc: 29.57%
+Updating learning rate: 0.05
+Epoch: [   13 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 7.944
+Batch: [ 1000 |  1563] loss: 7.649
+Batch: [ 1500 |  1563] loss: 7.511
+Test Loss: 0.08555 Test Acc: 44.62%
+Epoch: [   14 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 7.057
+Batch: [ 1000 |  1563] loss: 6.944
+Batch: [ 1500 |  1563] loss: 6.687
+Test Loss: 0.08331 Test Acc: 52.27%
+Epoch: [   15 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 6.470
+Batch: [ 1000 |  1563] loss: 6.439
+Batch: [ 1500 |  1563] loss: 6.126
+Test Loss: 0.07266 Test Acc: 58.02%
+Epoch: [   16 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 5.834
+Batch: [ 1000 |  1563] loss: 5.801
+Batch: [ 1500 |  1563] loss: 5.622
+Test Loss: 0.06340 Test Acc: 65.17%
+Epoch: [   17 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 5.459
+Batch: [ 1000 |  1563] loss: 5.442
+Batch: [ 1500 |  1563] loss: 5.314
+Test Loss: 0.05945 Test Acc: 67.22%
+Epoch: [   18 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 5.071
+Batch: [ 1000 |  1563] loss: 5.145
+Batch: [ 1500 |  1563] loss: 5.063
+Test Loss: 0.06567 Test Acc: 64.46%
+Epoch: [   19 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 4.796
+Batch: [ 1000 |  1563] loss: 4.781
+Batch: [ 1500 |  1563] loss: 4.732
+Test Loss: 0.05374 Test Acc: 71.87%
+Epoch: [   20 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 4.568
+Batch: [ 1000 |  1563] loss: 4.564
+Batch: [ 1500 |  1563] loss: 4.484
+Test Loss: 0.05311 Test Acc: 71.12%
+Epoch: [   21 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 4.385
+Batch: [ 1000 |  1563] loss: 4.302
+Batch: [ 1500 |  1563] loss: 4.285
+Test Loss: 0.05080 Test Acc: 74.29%
+Epoch: [   22 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 4.069
+Batch: [ 1000 |  1563] loss: 4.105
+Batch: [ 1500 |  1563] loss: 4.096
+Test Loss: 0.04807 Test Acc: 75.20%
+Epoch: [   23 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 3.959
+Batch: [ 1000 |  1563] loss: 3.898
+Batch: [ 1500 |  1563] loss: 3.916
+Test Loss: 0.04743 Test Acc: 75.81%
+Epoch: [   24 /    25] LR: 0.050000
+Batch: [  500 |  1563] loss: 3.738
+Batch: [ 1000 |  1563] loss: 3.847
+Batch: [ 1500 |  1563] loss: 3.797
+Test Loss: 0.04609 Test Acc: 76.42%
+Updating learning rate: 0.025
+Epoch: [   25 /    25] LR: 0.025000
+Batch: [  500 |  1563] loss: 2.952
+Batch: [ 1000 |  1563] loss: 2.906
+Batch: [ 1500 |  1563] loss: 2.735
+Test Loss: 0.03466 Test Acc: 82.00%
+Checkpoint saved
+
+
+

## 4. Apply Quantization

+

quant_modules.initialize() will ensure quantized version of modules will be called instead of original modules. For example, when you define a model with convolution, linear, pooling layers, QuantConv2d, QuantLinear and QuantPooling will be called. QuantConv2d basically wraps quantizer nodes around inputs and weights of regular Conv2d. Please refer to all the quantized modules in pytorch-quantization toolkit for more information. A QuantConv2d is represented in +pytorch-quantization toolkit as follows.

+
def forward(self, input):
+        # the actual quantization happens in the next level of the class hierarchy
+        quant_input, quant_weight = self._quant(input)
+
+        if self.padding_mode == 'circular':
+            expanded_padding = ((self.padding[1] + 1) // 2, self.padding[1] // 2,
+                                (self.padding[0] + 1) // 2, self.padding[0] // 2)
+            output = F.conv2d(F.pad(quant_input, expanded_padding, mode='circular'),
+                              quant_weight, self.bias, self.stride,
+                              _pair(0), self.dilation, self.groups)
+        else:
+            output = F.conv2d(quant_input, quant_weight, self.bias, self.stride, self.padding, self.dilation,
+                              self.groups)
+
+        return output
+
+
+
+
[7]:
+
+
+
quant_modules.initialize()
+
+
+
+
+
[8]:
+
+
+
# All the regular conv, FC layers will be converted to their quantozed counterparts due to quant_modules.initialize()
+qat_model = vgg16(num_classes=len(classes), init_weights=False)
+qat_model = qat_model.cuda()
+
+
+
+
+
[9]:
+
+
+
# vgg16_base_ckpt is the checkpoint generated from Step 3 : Training a baseline VGG16 model.
+ckpt = torch.load("./vgg16_base_ckpt")
+modified_state_dict={}
+for key, val in ckpt["model_state_dict"].items():
+    # Remove 'module.' from the key names
+    if key.startswith('module'):
+        modified_state_dict[key[7:]] = val
+    else:
+        modified_state_dict[key] = val
+
+# Load the pre-trained checkpoint
+qat_model.load_state_dict(modified_state_dict)
+opt.load_state_dict(ckpt["opt_state_dict"])
+
+
+
+

## 5. Model Calibration

+

The quantizer nodes introduced in the model around desired layers capture the dynamic range (min_value, max_value) that is observed by the layer. Calibration is the process of computing the dynamic range of these layers by passing calibration data, which is usually a subset of training or validation data. There are different ways of calibration: max, histogram and entropy. We use max calibration technique as it is simple and effective.

+
+
[10]:
+
+
+
def compute_amax(model, **kwargs):
+    # Load calib result
+    for name, module in model.named_modules():
+        if isinstance(module, quant_nn.TensorQuantizer):
+            if module._calibrator is not None:
+                if isinstance(module._calibrator, calib.MaxCalibrator):
+                    module.load_calib_amax()
+                else:
+                    module.load_calib_amax(**kwargs)
+            print(F"{name:40}: {module}")
+    model.cuda()
+
+def collect_stats(model, data_loader, num_batches):
+    """Feed data to the network and collect statistics"""
+    # Enable calibrators
+    for name, module in model.named_modules():
+        if isinstance(module, quant_nn.TensorQuantizer):
+            if module._calibrator is not None:
+                module.disable_quant()
+                module.enable_calib()
+            else:
+                module.disable()
+
+    # Feed data to the network for collecting stats
+    for i, (image, _) in tqdm(enumerate(data_loader), total=num_batches):
+        model(image.cuda())
+        if i >= num_batches:
+            break
+
+    # Disable calibrators
+    for name, module in model.named_modules():
+        if isinstance(module, quant_nn.TensorQuantizer):
+            if module._calibrator is not None:
+                module.enable_quant()
+                module.disable_calib()
+            else:
+                module.enable()
+
+def calibrate_model(model, model_name, data_loader, num_calib_batch, calibrator, hist_percentile, out_dir):
+    """
+        Feed data to the network and calibrate.
+        Arguments:
+            model: classification model
+            model_name: name to use when creating state files
+            data_loader: calibration data set
+            num_calib_batch: amount of calibration passes to perform
+            calibrator: type of calibration to use (max/histogram)
+            hist_percentile: percentiles to be used for historgram calibration
+            out_dir: dir to save state files in
+    """
+
+    if num_calib_batch > 0:
+        print("Calibrating model")
+        with torch.no_grad():
+            collect_stats(model, data_loader, num_calib_batch)
+
+        if not calibrator == "histogram":
+            compute_amax(model, method="max")
+            calib_output = os.path.join(
+                out_dir,
+                F"{model_name}-max-{num_calib_batch*data_loader.batch_size}.pth")
+            torch.save(model.state_dict(), calib_output)
+        else:
+            for percentile in hist_percentile:
+                print(F"{percentile} percentile calibration")
+                compute_amax(model, method="percentile")
+                calib_output = os.path.join(
+                    out_dir,
+                    F"{model_name}-percentile-{percentile}-{num_calib_batch*data_loader.batch_size}.pth")
+                torch.save(model.state_dict(), calib_output)
+
+            for method in ["mse", "entropy"]:
+                print(F"{method} calibration")
+                compute_amax(model, method=method)
+                calib_output = os.path.join(
+                    out_dir,
+                    F"{model_name}-{method}-{num_calib_batch*data_loader.batch_size}.pth")
+                torch.save(model.state_dict(), calib_output)
+
+
+
+
+
[11]:
+
+
+
#Calibrate the model using max calibration technique.
+with torch.no_grad():
+    calibrate_model(
+        model=qat_model,
+        model_name="vgg16",
+        data_loader=training_dataloader,
+        num_calib_batch=32,
+        calibrator="max",
+        hist_percentile=[99.9, 99.99, 99.999, 99.9999],
+        out_dir="./")
+
+
+
+
+
+
+
+
+Calibrating model
+
+
+
+
+
+
+
+100%|███████████████████████████████████████████████████████| 32/32 [00:00<00:00, 96.04it/s]
+WARNING: Logging before flag parsing goes to stderr.
+W1109 04:01:43.512364 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.513354 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.514046 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.514638 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.515270 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.515859 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.516441 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.517009 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.517600 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.518167 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.518752 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.519333 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.519911 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.520473 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.521038 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.521596 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.522170 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.522742 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.523360 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.523957 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.524581 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.525059 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.525366 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.525675 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.525962 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.526257 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.526566 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.526885 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.527188 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.527489 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.527792 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.528097 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.528387 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator
+W1109 04:01:43.528834 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.529163 139704147265344 tensor_quantizer.py:238] Call .cuda() if running on GPU after loading calibrated amax.
+W1109 04:01:43.532748 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([64, 1, 1, 1]).
+W1109 04:01:43.533468 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.534033 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([64, 1, 1, 1]).
+W1109 04:01:43.534684 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.535320 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([128, 1, 1, 1]).
+W1109 04:01:43.535983 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.536569 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([128, 1, 1, 1]).
+W1109 04:01:43.537248 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.537833 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([256, 1, 1, 1]).
+W1109 04:01:43.538480 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.539074 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([256, 1, 1, 1]).
+W1109 04:01:43.539724 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.540307 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([256, 1, 1, 1]).
+W1109 04:01:43.540952 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.541534 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).
+W1109 04:01:43.542075 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.542596 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).
+W1109 04:01:43.543248 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.543719 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).
+W1109 04:01:43.544424 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.544952 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).
+W1109 04:01:43.545530 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.546114 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).
+W1109 04:01:43.546713 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.547292 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).
+W1109 04:01:43.547902 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.548453 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.549015 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([4096, 1]).
+W1109 04:01:43.549665 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.550436 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([4096, 1]).
+W1109 04:01:43.551925 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).
+W1109 04:01:43.553105 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([10, 1]).
+
+
+
+
+
+
+
+features.0._input_quantizer             : TensorQuantizer(8bit narrow fake per-tensor amax=2.7537 calibrator=MaxCalibrator scale=1.0 quant)
+features.0._weight_quantizer            : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0263, 2.7454](64) calibrator=MaxCalibrator scale=1.0 quant)
+features.3._input_quantizer             : TensorQuantizer(8bit narrow fake per-tensor amax=27.5676 calibrator=MaxCalibrator scale=1.0 quant)
+features.3._weight_quantizer            : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0169, 1.8204](64) calibrator=MaxCalibrator scale=1.0 quant)
+features.7._input_quantizer             : TensorQuantizer(8bit narrow fake per-tensor amax=15.2002 calibrator=MaxCalibrator scale=1.0 quant)
+features.7._weight_quantizer            : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0493, 1.3207](128) calibrator=MaxCalibrator scale=1.0 quant)
+features.10._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=7.7376 calibrator=MaxCalibrator scale=1.0 quant)
+features.10._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0163, 0.9624](128) calibrator=MaxCalibrator scale=1.0 quant)
+features.14._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=8.8351 calibrator=MaxCalibrator scale=1.0 quant)
+features.14._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0622, 0.8791](256) calibrator=MaxCalibrator scale=1.0 quant)
+features.17._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=12.5746 calibrator=MaxCalibrator scale=1.0 quant)
+features.17._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0505, 0.5117](256) calibrator=MaxCalibrator scale=1.0 quant)
+features.20._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=9.7203 calibrator=MaxCalibrator scale=1.0 quant)
+features.20._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0296, 0.5335](256) calibrator=MaxCalibrator scale=1.0 quant)
+features.24._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=8.9367 calibrator=MaxCalibrator scale=1.0 quant)
+features.24._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0220, 0.3763](512) calibrator=MaxCalibrator scale=1.0 quant)
+features.27._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=6.6539 calibrator=MaxCalibrator scale=1.0 quant)
+features.27._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0151, 0.1777](512) calibrator=MaxCalibrator scale=1.0 quant)
+features.30._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=3.7099 calibrator=MaxCalibrator scale=1.0 quant)
+features.30._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0087, 0.1906](512) calibrator=MaxCalibrator scale=1.0 quant)
+features.34._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=4.0491 calibrator=MaxCalibrator scale=1.0 quant)
+features.34._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0106, 0.1971](512) calibrator=MaxCalibrator scale=1.0 quant)
+features.37._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=2.1531 calibrator=MaxCalibrator scale=1.0 quant)
+features.37._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0070, 0.2305](512) calibrator=MaxCalibrator scale=1.0 quant)
+features.40._input_quantizer            : TensorQuantizer(8bit narrow fake per-tensor amax=3.3631 calibrator=MaxCalibrator scale=1.0 quant)
+features.40._weight_quantizer           : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0023, 0.4726](512) calibrator=MaxCalibrator scale=1.0 quant)
+avgpool._input_quantizer                : TensorQuantizer(8bit narrow fake per-tensor amax=5.3550 calibrator=MaxCalibrator scale=1.0 quant)
+classifier.0._input_quantizer           : TensorQuantizer(8bit narrow fake per-tensor amax=5.3550 calibrator=MaxCalibrator scale=1.0 quant)
+classifier.0._weight_quantizer          : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0026, 0.5320](4096) calibrator=MaxCalibrator scale=1.0 quant)
+classifier.3._input_quantizer           : TensorQuantizer(8bit narrow fake per-tensor amax=6.6733 calibrator=MaxCalibrator scale=1.0 quant)
+classifier.3._weight_quantizer          : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0018, 0.5172](4096) calibrator=MaxCalibrator scale=1.0 quant)
+classifier.6._input_quantizer           : TensorQuantizer(8bit narrow fake per-tensor amax=9.4352 calibrator=MaxCalibrator scale=1.0 quant)
+classifier.6._weight_quantizer          : TensorQuantizer(8bit narrow fake axis=0 amax=[0.3877, 0.5620](10) calibrator=MaxCalibrator scale=1.0 quant)
+
+
+

## 6. Quantization Aware Training

+

In this phase, we finetune the model weights and leave the quantizer node values frozen. The dynamic ranges for each layer obtained from the calibration are kept constant while the weights of the model are finetuned to be close to the accuracy of original FP32 model (model without quantizer nodes) is preserved. Usually the finetuning of QAT model should be quick compared to the full training of the original model. Use QAT to fine-tune for around 10% of the original training schedule with an +annealing learning-rate. Please refer to Achieving FP32 Accuracy for INT8 Inference Using Quantization Aware Training with NVIDIA TensorRT for detailed recommendations. For this VGG model, it is enough to finetune for 1 epoch to get acceptable accuracy. During finetuning with QAT, the quantization is applied as a composition of max, clamp, round and mul ops.

+
# amax is absolute maximum value for an input
+# The upper bound for integer quantization (127 for int8)
+max_bound = torch.tensor((2.0**(num_bits - 1 + int(unsigned))) - 1.0, device=amax.device)
+scale = max_bound / amax
+outputs = torch.clamp((inputs * scale).round_(), min_bound, max_bound)
+
+
+

tensor_quant function in pytorch_quantization toolkit is responsible for the above tensor quantization. Usually, per channel quantization is recommended for weights, while per tensor quantization is recommended for activations in a network. During inference, we use torch.fake_quantize_per_tensor_affine and torch.fake_quantize_per_channel_affine to perform quantization as this is easier to convert into corresponding TensorRT operators. Please refer to next sections for more details on +how these operators are exported in torchscript and converted in Torch-TensorRT.

+
+
[12]:
+
+
+
# Finetune the QAT model for 1 epoch
+num_epochs=1
+for epoch in range(num_epochs):
+    adjust_lr(opt, epoch)
+    print('Epoch: [%5d / %5d] LR: %f' % (epoch + 1, num_epochs, state["lr"]))
+
+    train(qat_model, training_dataloader, crit, opt, epoch)
+    test_loss, test_acc = test(qat_model, testing_dataloader, crit, epoch)
+
+    print("Test Loss: {:.5f} Test Acc: {:.2f}%".format(test_loss, 100 * test_acc))
+
+save_checkpoint({'epoch': epoch + 1,
+                 'model_state_dict': qat_model.state_dict(),
+                 'acc': test_acc,
+                 'opt_state_dict': opt.state_dict(),
+                 'state': state},
+                ckpt_path="vgg16_qat_ckpt")
+
+
+
+
+
+
+
+
+Updating learning rate: 0.1
+Epoch: [    1 /     1] LR: 0.100000
+Batch: [  500 |  1563] loss: 2.635
+Batch: [ 1000 |  1563] loss: 2.655
+Batch: [ 1500 |  1563] loss: 2.646
+Test Loss: 0.03291 Test Acc: 82.98%
+Checkpoint saved
+
+
+

## 7. Export to Torchscript Export the model to Torch script. Trace the model and convert it into torchscript for deployment. To learn more about Torchscript, please refer to https://pytorch.org/docs/stable/jit.html. Setting quant_nn.TensorQuantizer.use_fb_fake_quant = True enables the QAT model to use torch.fake_quantize_per_tensor_affine and torch.fake_quantize_per_channel_affine operators instead of tensor_quant function to export quantization operators. In torchscript, they +are represented as aten::fake_quantize_per_tensor_affine and aten::fake_quantize_per_channel_affine.

+
+
[13]:
+
+
+
quant_nn.TensorQuantizer.use_fb_fake_quant = True
+with torch.no_grad():
+    data = iter(testing_dataloader)
+    images, _ = data.next()
+    jit_model = torch.jit.trace(qat_model, images.to("cuda"))
+    torch.jit.save(jit_model, "trained_vgg16_qat.jit.pt")
+
+
+
+
+
+
+
+
+E1109 04:02:37.101168 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.102248 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.107194 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.107625 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.115269 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.115740 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.117969 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.118358 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.126382 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.126834 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.128674 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.129518 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.135453 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.135936 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.137858 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.138366 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.145539 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.146053 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.147871 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.148353 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.154252 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.154685 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.156558 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.157159 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.163197 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.163676 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.165549 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.165991 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.173305 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.173926 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.176034 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.176697 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.182843 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.183426 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.185377 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.185962 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.191966 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.192424 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.194325 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.194817 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.201988 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.202665 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.204763 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.205461 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.211393 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.211987 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.213899 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.214450 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.220892 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.221533 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.223519 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.224037 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.233809 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.234434 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.238212 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.239042 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.241022 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.241654 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.247820 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.248445 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.250366 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.250959 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.257248 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.257854 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.259968 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.260660 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+W1109 04:02:37.268160 139704147265344 tensor_quantizer.py:280] Use Pytorch's native experimental fake quantization.
+/opt/conda/lib/python3.8/site-packages/pytorch_quantization/nn/modules/tensor_quantizer.py:285: TracerWarning: Converting a tensor to a Python number might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!
+  inputs, amax.item() / bound, 0,
+/opt/conda/lib/python3.8/site-packages/pytorch_quantization/nn/modules/tensor_quantizer.py:291: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!
+  quant_dim = list(amax.shape).index(list(amax_sequeeze.shape)[0])
+E1109 04:02:37.329273 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.330212 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.332529 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.333365 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.339547 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.340248 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.342257 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.342890 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.350619 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.351372 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.353470 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.354121 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.360090 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.360806 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.362803 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.363274 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.370369 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.371057 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.373071 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.373766 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.379890 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.380538 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.382532 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.383128 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.389077 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.389760 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.391815 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.392399 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.399809 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.400472 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.402399 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.402939 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.408818 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.409424 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.411513 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.412097 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.418537 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.419128 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.421343 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.421946 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.429382 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.430156 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.432259 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.433079 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.439297 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.440027 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.442149 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.442826 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.449377 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.449968 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.452122 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.452754 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.462532 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.463295 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.466963 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.467725 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.469692 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.470336 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.476204 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.476738 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.478809 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.479375 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.485666 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.486219 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.488416 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+E1109 04:02:37.488986 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!
+
+
+

## 8. Inference using Torch-TensorRT In this phase, we run the exported torchscript graph of VGG QAT using Torch-TensorRT. Torch-TensorRT is a Pytorch-TensorRT compiler which converts Torchscript graphs into TensorRT. TensorRT 8.0 supports inference of quantization aware trained models and introduces new APIs; QuantizeLayer and DequantizeLayer. We can observe the entire VGG QAT graph quantization nodes from the debug log of Torch-TensorRT. To enable debug logging, you can set +torch_tensorrt.logging.set_reportable_log_level(torch_tensorrt.logging.Level.Debug). For example, QuantConv2d layer from pytorch_quantization toolkit is represented as follows in Torchscript

+
%quant_input : Tensor = aten::fake_quantize_per_tensor_affine(%x, %636, %637, %638, %639)
+%quant_weight : Tensor = aten::fake_quantize_per_channel_affine(%394, %640, %641, %637, %638, %639)
+%input.2 : Tensor = aten::_convolution(%quant_input, %quant_weight, %395, %687, %688, %689, %643, %690, %642, %643, %643, %644, %644)
+
+
+

aten::fake_quantize_per_*_affine is converted into QuantizeLayer + DequantizeLayer in Torch-TensorRT internally. Please refer to quantization op converters in Torch-TensorRT.

+
+
[14]:
+
+
+
qat_model = torch.jit.load("trained_vgg16_qat.jit.pt").eval()
+
+compile_spec = {"inputs": [torch_tensorrt.Input([16, 3, 32, 32])],
+                "enabled_precisions": torch.int8,
+                }
+trt_mod = torch_tensorrt.compile(qat_model, **compile_spec)
+
+test_loss, test_acc = test(trt_mod, testing_dataloader, crit, 0)
+print("VGG QAT accuracy using TensorRT: {:.2f}%".format(100 * test_acc))
+
+
+
+
+
+
+
+
+WARNING: [Torch-TensorRT] - Cannot infer input type from calcuations in graph for input x.2. Assuming it is Float32. If not, specify input type explicity
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter
+WARNING: [Torch-TensorRT TorchScript Conversion Context] - Detected invalid timing cache, setup a local cache instead
+
+
+
+
+
+
+
+VGG QAT accuracy using TensorRT: 82.97%
+
+
+
+

Performance benchmarking

+
+
[15]:
+
+
+
import time
+import numpy as np
+
+import torch.backends.cudnn as cudnn
+cudnn.benchmark = True
+
+# Helper function to benchmark the model
+def benchmark(model, input_shape=(1024, 1, 32, 32), dtype='fp32', nwarmup=50, nruns=1000):
+    input_data = torch.randn(input_shape)
+    input_data = input_data.to("cuda")
+    if dtype=='fp16':
+        input_data = input_data.half()
+
+    print("Warm up ...")
+    with torch.no_grad():
+        for _ in range(nwarmup):
+            features = model(input_data)
+    torch.cuda.synchronize()
+    print("Start timing ...")
+    timings = []
+    with torch.no_grad():
+        for i in range(1, nruns+1):
+            start_time = time.time()
+            output = model(input_data)
+            torch.cuda.synchronize()
+            end_time = time.time()
+            timings.append(end_time - start_time)
+            if i%100==0:
+                print('Iteration %d/%d, avg batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))
+
+    print("Input shape:", input_data.size())
+    print("Output shape:", output.shape)
+    print('Average batch time: %.2f ms'%(np.mean(timings)*1000))
+
+
+
+
+
[16]:
+
+
+
benchmark(jit_model, input_shape=(16, 3, 32, 32))
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 100/1000, avg batch time 4.83 ms
+Iteration 200/1000, avg batch time 4.83 ms
+Iteration 300/1000, avg batch time 4.83 ms
+Iteration 400/1000, avg batch time 4.83 ms
+Iteration 500/1000, avg batch time 4.83 ms
+Iteration 600/1000, avg batch time 4.83 ms
+Iteration 700/1000, avg batch time 4.83 ms
+Iteration 800/1000, avg batch time 4.83 ms
+Iteration 900/1000, avg batch time 4.83 ms
+Iteration 1000/1000, avg batch time 4.83 ms
+Input shape: torch.Size([16, 3, 32, 32])
+Output shape: torch.Size([16, 10])
+Average batch time: 4.83 ms
+
+
+
+
[17]:
+
+
+
benchmark(trt_mod, input_shape=(16, 3, 32, 32))
+
+
+
+
+
+
+
+
+Warm up ...
+Start timing ...
+Iteration 100/1000, avg batch time 1.87 ms
+Iteration 200/1000, avg batch time 1.84 ms
+Iteration 300/1000, avg batch time 1.85 ms
+Iteration 400/1000, avg batch time 1.83 ms
+Iteration 500/1000, avg batch time 1.82 ms
+Iteration 600/1000, avg batch time 1.81 ms
+Iteration 700/1000, avg batch time 1.81 ms
+Iteration 800/1000, avg batch time 1.80 ms
+Iteration 900/1000, avg batch time 1.80 ms
+Iteration 1000/1000, avg batch time 1.79 ms
+Input shape: torch.Size([16, 3, 32, 32])
+Output shape: torch.Size([16, 10])
+Average batch time: 1.79 ms
+
+
+

## 9. References * Very Deep Convolution Networks for large scale Image Recognition * Achieving FP32 Accuracy for INT8 Inference Using Quantization Aware Training with NVIDIA TensorRT * QAT workflow for VGG16 * Deploying VGG QAT model in C++ using Torch-TensorRT * Pytorch-quantization toolkit from NVIDIA * Pytorch quantization toolkit userguide * Quantization basics

+
+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_notebooks/vgg-qat.ipynb b/docs/v1.2.0/_notebooks/vgg-qat.ipynb new file mode 100644 index 0000000000..cca771ad92 --- /dev/null +++ b/docs/v1.2.0/_notebooks/vgg-qat.ipynb @@ -0,0 +1,1200 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8033b2eb", + "metadata": {}, + "source": [ + "# Deploying Quantization Aware Trained models in INT8 using Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "id": "69ec3ca7", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "Quantization Aware training (QAT) simulates quantization during training by quantizing weights and activation layers. This will help to reduce the loss in accuracy when we convert the network trained in FP32 to INT8 for faster inference. QAT introduces additional nodes in the graph which will be used to learn the dynamic ranges of weights and activation layers. In this notebook, we illustrate the following steps from training to inference of a QAT model in Torch-TensorRT.\n", + "\n", + "1. [Requirements](#1)\n", + "2. [VGG16 Overview](#2)\n", + "3. [Training a baseline VGG16 model](#3)\n", + "4. [Apply Quantization](#4)\n", + "5. [Model calibration](#5)\n", + "6. [Quantization Aware training](#6)\n", + "7. [Export to Torchscript](#7)\n", + "8. [Inference using Torch-TensorRT](#8)\n", + "8. [References](#8)" + ] + }, + { + "cell_type": "markdown", + "id": "79655ea8", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "Please install the required dependencies and import these libraries accordingly" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14a72941", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "6493e915", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.1.0\n" + ] + } + ], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "import torch.optim as optim\n", + "import torch.utils.data as data\n", + "import torchvision.transforms as transforms\n", + "import torchvision.datasets as datasets\n", + "import torch_tensorrt\n", + "\n", + "from torch.utils.tensorboard import SummaryWriter\n", + "\n", + "import pytorch_quantization\n", + "from pytorch_quantization import nn as quant_nn\n", + "from pytorch_quantization import quant_modules\n", + "from pytorch_quantization.tensor_quant import QuantDescriptor\n", + "from pytorch_quantization import calib\n", + "from tqdm import tqdm\n", + "\n", + "print(pytorch_quantization.__version__)\n", + "\n", + "import os\n", + "import sys\n", + "sys.path.insert(0, \"../examples/int8/training/vgg16\")\n", + "from vgg16 import vgg16\n" + ] + }, + { + "cell_type": "markdown", + "id": "4de5060a", + "metadata": {}, + "source": [ + "\n", + "## 2. VGG16 Overview\n", + "### Very Deep Convolutional Networks for Large-Scale Image Recognition\n", + "VGG is one of the earliest family of image classification networks that first used small (3x3) convolution filters and achieved significant improvements on ImageNet recognition challenge. The network architecture looks as follows\n", + "\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "7a5afc49", + "metadata": {}, + "source": [ + "\n", + "## 3. Training a baseline VGG16 model\n", + "We train VGG16 on CIFAR10 dataset. Define training and testing datasets and dataloaders. This will download the CIFAR 10 data in your `data` directory. Data preprocessing is performed using `torchvision` transforms. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5d2c4c45", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Files already downloaded and verified\n", + "Files already downloaded and verified\n" + ] + } + ], + "source": [ + "classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')\n", + "\n", + "# ========== Define Training dataset and dataloaders =============#\n", + "training_dataset = datasets.CIFAR10(root='./data',\n", + " train=True,\n", + " download=True,\n", + " transform=transforms.Compose([\n", + " transforms.RandomCrop(32, padding=4),\n", + " transforms.RandomHorizontalFlip(),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),\n", + " ]))\n", + "\n", + "training_dataloader = torch.utils.data.DataLoader(training_dataset,\n", + " batch_size=32,\n", + " shuffle=True,\n", + " num_workers=2)\n", + "\n", + "# ========== Define Testing dataset and dataloaders =============#\n", + "testing_dataset = datasets.CIFAR10(root='./data',\n", + " train=False,\n", + " download=True,\n", + " transform=transforms.Compose([\n", + " transforms.ToTensor(),\n", + " transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),\n", + " ]))\n", + "\n", + "testing_dataloader = torch.utils.data.DataLoader(testing_dataset,\n", + " batch_size=16,\n", + " shuffle=False,\n", + " num_workers=2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2bd092b3", + "metadata": {}, + "outputs": [], + "source": [ + "def train(model, dataloader, crit, opt, epoch):\n", + "# global writer\n", + " model.train()\n", + " running_loss = 0.0\n", + " for batch, (data, labels) in enumerate(dataloader):\n", + " data, labels = data.cuda(), labels.cuda(non_blocking=True)\n", + " opt.zero_grad()\n", + " out = model(data)\n", + " loss = crit(out, labels)\n", + " loss.backward()\n", + " opt.step()\n", + "\n", + " running_loss += loss.item()\n", + " if batch % 500 == 499:\n", + " print(\"Batch: [%5d | %5d] loss: %.3f\" % (batch + 1, len(dataloader), running_loss / 100))\n", + " running_loss = 0.0\n", + " \n", + "def test(model, dataloader, crit, epoch):\n", + " global writer\n", + " global classes\n", + " total = 0\n", + " correct = 0\n", + " loss = 0.0\n", + " class_probs = []\n", + " class_preds = []\n", + " model.eval()\n", + " with torch.no_grad():\n", + " for data, labels in dataloader:\n", + " data, labels = data.cuda(), labels.cuda(non_blocking=True)\n", + " out = model(data)\n", + " loss += crit(out, labels)\n", + " preds = torch.max(out, 1)[1]\n", + " class_probs.append([F.softmax(i, dim=0) for i in out])\n", + " class_preds.append(preds)\n", + " total += labels.size(0)\n", + " correct += (preds == labels).sum().item()\n", + "\n", + " test_probs = torch.cat([torch.stack(batch) for batch in class_probs])\n", + " test_preds = torch.cat(class_preds)\n", + "\n", + " return loss / total, correct / total\n", + "\n", + "def save_checkpoint(state, ckpt_path=\"checkpoint.pth\"):\n", + " torch.save(state, ckpt_path)\n", + " print(\"Checkpoint saved\")" + ] + }, + { + "cell_type": "markdown", + "id": "c80a86cc", + "metadata": {}, + "source": [ + "*Define the VGG model that we are going to perfom QAT on.*" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "8c564b8f", + "metadata": {}, + "outputs": [], + "source": [ + "# CIFAR 10 has 10 classes\n", + "model = vgg16(num_classes=len(classes), init_weights=False)\n", + "model = model.cuda()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "abc00452", + "metadata": {}, + "outputs": [], + "source": [ + "# Declare Learning rate\n", + "lr = 0.1\n", + "state = {}\n", + "state[\"lr\"] = lr\n", + "\n", + "# Use cross entropy loss for classification and SGD optimizer\n", + "crit = nn.CrossEntropyLoss()\n", + "opt = optim.SGD(model.parameters(), lr=state[\"lr\"], momentum=0.9, weight_decay=1e-4)\n", + "\n", + "\n", + "# Adjust learning rate based on epoch number\n", + "def adjust_lr(optimizer, epoch):\n", + " global state\n", + " new_lr = lr * (0.5**(epoch // 12)) if state[\"lr\"] > 1e-7 else state[\"lr\"]\n", + " if new_lr != state[\"lr\"]:\n", + " state[\"lr\"] = new_lr\n", + " print(\"Updating learning rate: {}\".format(state[\"lr\"]))\n", + " for param_group in optimizer.param_groups:\n", + " param_group[\"lr\"] = state[\"lr\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d80865a2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: [ 1 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 13.288\n", + "Batch: [ 1000 | 1563] loss: 11.345\n", + "Batch: [ 1500 | 1563] loss: 11.008\n", + "Test Loss: 0.13388 Test Acc: 13.23%\n", + "Epoch: [ 2 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 10.742\n", + "Batch: [ 1000 | 1563] loss: 10.311\n", + "Batch: [ 1500 | 1563] loss: 10.141\n", + "Test Loss: 0.11888 Test Acc: 23.96%\n", + "Epoch: [ 3 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.877\n", + "Batch: [ 1000 | 1563] loss: 9.821\n", + "Batch: [ 1500 | 1563] loss: 9.818\n", + "Test Loss: 0.11879 Test Acc: 24.68%\n", + "Epoch: [ 4 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.677\n", + "Batch: [ 1000 | 1563] loss: 9.613\n", + "Batch: [ 1500 | 1563] loss: 9.504\n", + "Test Loss: 0.11499 Test Acc: 23.68%\n", + "Epoch: [ 5 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.560\n", + "Batch: [ 1000 | 1563] loss: 9.536\n", + "Batch: [ 1500 | 1563] loss: 9.309\n", + "Test Loss: 0.10990 Test Acc: 27.84%\n", + "Epoch: [ 6 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.254\n", + "Batch: [ 1000 | 1563] loss: 9.234\n", + "Batch: [ 1500 | 1563] loss: 9.188\n", + "Test Loss: 0.11594 Test Acc: 23.29%\n", + "Epoch: [ 7 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.141\n", + "Batch: [ 1000 | 1563] loss: 9.110\n", + "Batch: [ 1500 | 1563] loss: 9.013\n", + "Test Loss: 0.10732 Test Acc: 29.24%\n", + "Epoch: [ 8 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.120\n", + "Batch: [ 1000 | 1563] loss: 9.086\n", + "Batch: [ 1500 | 1563] loss: 8.948\n", + "Test Loss: 0.10732 Test Acc: 27.24%\n", + "Epoch: [ 9 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 8.941\n", + "Batch: [ 1000 | 1563] loss: 8.997\n", + "Batch: [ 1500 | 1563] loss: 9.028\n", + "Test Loss: 0.11299 Test Acc: 25.52%\n", + "Epoch: [ 10 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 8.927\n", + "Batch: [ 1000 | 1563] loss: 8.837\n", + "Batch: [ 1500 | 1563] loss: 8.860\n", + "Test Loss: 0.10130 Test Acc: 34.61%\n", + "Epoch: [ 11 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 8.953\n", + "Batch: [ 1000 | 1563] loss: 8.738\n", + "Batch: [ 1500 | 1563] loss: 8.724\n", + "Test Loss: 0.10018 Test Acc: 32.27%\n", + "Epoch: [ 12 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 8.721\n", + "Batch: [ 1000 | 1563] loss: 8.716\n", + "Batch: [ 1500 | 1563] loss: 8.701\n", + "Test Loss: 0.10070 Test Acc: 29.57%\n", + "Updating learning rate: 0.05\n", + "Epoch: [ 13 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 7.944\n", + "Batch: [ 1000 | 1563] loss: 7.649\n", + "Batch: [ 1500 | 1563] loss: 7.511\n", + "Test Loss: 0.08555 Test Acc: 44.62%\n", + "Epoch: [ 14 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 7.057\n", + "Batch: [ 1000 | 1563] loss: 6.944\n", + "Batch: [ 1500 | 1563] loss: 6.687\n", + "Test Loss: 0.08331 Test Acc: 52.27%\n", + "Epoch: [ 15 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 6.470\n", + "Batch: [ 1000 | 1563] loss: 6.439\n", + "Batch: [ 1500 | 1563] loss: 6.126\n", + "Test Loss: 0.07266 Test Acc: 58.02%\n", + "Epoch: [ 16 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 5.834\n", + "Batch: [ 1000 | 1563] loss: 5.801\n", + "Batch: [ 1500 | 1563] loss: 5.622\n", + "Test Loss: 0.06340 Test Acc: 65.17%\n", + "Epoch: [ 17 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 5.459\n", + "Batch: [ 1000 | 1563] loss: 5.442\n", + "Batch: [ 1500 | 1563] loss: 5.314\n", + "Test Loss: 0.05945 Test Acc: 67.22%\n", + "Epoch: [ 18 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 5.071\n", + "Batch: [ 1000 | 1563] loss: 5.145\n", + "Batch: [ 1500 | 1563] loss: 5.063\n", + "Test Loss: 0.06567 Test Acc: 64.46%\n", + "Epoch: [ 19 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 4.796\n", + "Batch: [ 1000 | 1563] loss: 4.781\n", + "Batch: [ 1500 | 1563] loss: 4.732\n", + "Test Loss: 0.05374 Test Acc: 71.87%\n", + "Epoch: [ 20 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 4.568\n", + "Batch: [ 1000 | 1563] loss: 4.564\n", + "Batch: [ 1500 | 1563] loss: 4.484\n", + "Test Loss: 0.05311 Test Acc: 71.12%\n", + "Epoch: [ 21 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 4.385\n", + "Batch: [ 1000 | 1563] loss: 4.302\n", + "Batch: [ 1500 | 1563] loss: 4.285\n", + "Test Loss: 0.05080 Test Acc: 74.29%\n", + "Epoch: [ 22 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 4.069\n", + "Batch: [ 1000 | 1563] loss: 4.105\n", + "Batch: [ 1500 | 1563] loss: 4.096\n", + "Test Loss: 0.04807 Test Acc: 75.20%\n", + "Epoch: [ 23 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 3.959\n", + "Batch: [ 1000 | 1563] loss: 3.898\n", + "Batch: [ 1500 | 1563] loss: 3.916\n", + "Test Loss: 0.04743 Test Acc: 75.81%\n", + "Epoch: [ 24 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 3.738\n", + "Batch: [ 1000 | 1563] loss: 3.847\n", + "Batch: [ 1500 | 1563] loss: 3.797\n", + "Test Loss: 0.04609 Test Acc: 76.42%\n", + "Updating learning rate: 0.025\n", + "Epoch: [ 25 / 25] LR: 0.025000\n", + "Batch: [ 500 | 1563] loss: 2.952\n", + "Batch: [ 1000 | 1563] loss: 2.906\n", + "Batch: [ 1500 | 1563] loss: 2.735\n", + "Test Loss: 0.03466 Test Acc: 82.00%\n", + "Checkpoint saved\n" + ] + } + ], + "source": [ + "# Train the model for 25 epochs to get ~80% accuracy.\n", + "num_epochs=25\n", + "for epoch in range(num_epochs):\n", + " adjust_lr(opt, epoch)\n", + " print('Epoch: [%5d / %5d] LR: %f' % (epoch + 1, num_epochs, state[\"lr\"]))\n", + "\n", + " train(model, training_dataloader, crit, opt, epoch)\n", + " test_loss, test_acc = test(model, testing_dataloader, crit, epoch)\n", + "\n", + " print(\"Test Loss: {:.5f} Test Acc: {:.2f}%\".format(test_loss, 100 * test_acc))\n", + " \n", + "save_checkpoint({'epoch': epoch + 1,\n", + " 'model_state_dict': model.state_dict(),\n", + " 'acc': test_acc,\n", + " 'opt_state_dict': opt.state_dict(),\n", + " 'state': state},\n", + " ckpt_path=\"vgg16_base_ckpt\")" + ] + }, + { + "cell_type": "markdown", + "id": "e1044537", + "metadata": {}, + "source": [ + "\n", + "## 4. Apply Quantization" + ] + }, + { + "cell_type": "markdown", + "id": "c33b7f4e", + "metadata": {}, + "source": [ + "`quant_modules.initialize()` will ensure quantized version of modules will be called instead of original modules. For example, when you define a model with convolution, linear, pooling layers, `QuantConv2d`, `QuantLinear` and `QuantPooling` will be called. `QuantConv2d` basically wraps quantizer nodes around inputs and weights of regular `Conv2d`. Please refer to all the quantized modules in pytorch-quantization toolkit for more information. A `QuantConv2d` is represented in `pytorch-quantization` toolkit as follows.\n", + "\n", + "```\n", + "def forward(self, input):\n", + " # the actual quantization happens in the next level of the class hierarchy\n", + " quant_input, quant_weight = self._quant(input)\n", + "\n", + " if self.padding_mode == 'circular':\n", + " expanded_padding = ((self.padding[1] + 1) // 2, self.padding[1] // 2,\n", + " (self.padding[0] + 1) // 2, self.padding[0] // 2)\n", + " output = F.conv2d(F.pad(quant_input, expanded_padding, mode='circular'),\n", + " quant_weight, self.bias, self.stride,\n", + " _pair(0), self.dilation, self.groups)\n", + " else:\n", + " output = F.conv2d(quant_input, quant_weight, self.bias, self.stride, self.padding, self.dilation,\n", + " self.groups)\n", + "\n", + " return output\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "985dc59e", + "metadata": {}, + "outputs": [], + "source": [ + "quant_modules.initialize()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "164ce8cb", + "metadata": {}, + "outputs": [], + "source": [ + "# All the regular conv, FC layers will be converted to their quantozed counterparts due to quant_modules.initialize()\n", + "qat_model = vgg16(num_classes=len(classes), init_weights=False)\n", + "qat_model = qat_model.cuda()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8e5f7fb5", + "metadata": {}, + "outputs": [], + "source": [ + "# vgg16_base_ckpt is the checkpoint generated from Step 3 : Training a baseline VGG16 model.\n", + "ckpt = torch.load(\"./vgg16_base_ckpt\")\n", + "modified_state_dict={}\n", + "for key, val in ckpt[\"model_state_dict\"].items():\n", + " # Remove 'module.' from the key names\n", + " if key.startswith('module'):\n", + " modified_state_dict[key[7:]] = val\n", + " else:\n", + " modified_state_dict[key] = val\n", + "\n", + "# Load the pre-trained checkpoint\n", + "qat_model.load_state_dict(modified_state_dict)\n", + "opt.load_state_dict(ckpt[\"opt_state_dict\"])" + ] + }, + { + "cell_type": "markdown", + "id": "8f8a74e8", + "metadata": {}, + "source": [ + "\n", + "## 5. Model Calibration" + ] + }, + { + "cell_type": "markdown", + "id": "d2a321f9", + "metadata": {}, + "source": [ + "The quantizer nodes introduced in the model around desired layers capture the dynamic range (min_value, max_value) that is observed by the layer. Calibration is the process of computing the dynamic range of these layers by passing calibration data, which is usually a subset of training or validation data. There are different ways of calibration: `max`, `histogram` and `entropy`. We use `max` calibration technique as it is simple and effective. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "039423dc", + "metadata": {}, + "outputs": [], + "source": [ + "def compute_amax(model, **kwargs):\n", + " # Load calib result\n", + " for name, module in model.named_modules():\n", + " if isinstance(module, quant_nn.TensorQuantizer):\n", + " if module._calibrator is not None:\n", + " if isinstance(module._calibrator, calib.MaxCalibrator):\n", + " module.load_calib_amax()\n", + " else:\n", + " module.load_calib_amax(**kwargs)\n", + " print(F\"{name:40}: {module}\")\n", + " model.cuda()\n", + "\n", + "def collect_stats(model, data_loader, num_batches):\n", + " \"\"\"Feed data to the network and collect statistics\"\"\"\n", + " # Enable calibrators\n", + " for name, module in model.named_modules():\n", + " if isinstance(module, quant_nn.TensorQuantizer):\n", + " if module._calibrator is not None:\n", + " module.disable_quant()\n", + " module.enable_calib()\n", + " else:\n", + " module.disable()\n", + "\n", + " # Feed data to the network for collecting stats\n", + " for i, (image, _) in tqdm(enumerate(data_loader), total=num_batches):\n", + " model(image.cuda())\n", + " if i >= num_batches:\n", + " break\n", + "\n", + " # Disable calibrators\n", + " for name, module in model.named_modules():\n", + " if isinstance(module, quant_nn.TensorQuantizer):\n", + " if module._calibrator is not None:\n", + " module.enable_quant()\n", + " module.disable_calib()\n", + " else:\n", + " module.enable()\n", + "\n", + "def calibrate_model(model, model_name, data_loader, num_calib_batch, calibrator, hist_percentile, out_dir):\n", + " \"\"\"\n", + " Feed data to the network and calibrate.\n", + " Arguments:\n", + " model: classification model\n", + " model_name: name to use when creating state files\n", + " data_loader: calibration data set\n", + " num_calib_batch: amount of calibration passes to perform\n", + " calibrator: type of calibration to use (max/histogram)\n", + " hist_percentile: percentiles to be used for historgram calibration\n", + " out_dir: dir to save state files in\n", + " \"\"\"\n", + "\n", + " if num_calib_batch > 0:\n", + " print(\"Calibrating model\")\n", + " with torch.no_grad():\n", + " collect_stats(model, data_loader, num_calib_batch)\n", + "\n", + " if not calibrator == \"histogram\":\n", + " compute_amax(model, method=\"max\")\n", + " calib_output = os.path.join(\n", + " out_dir,\n", + " F\"{model_name}-max-{num_calib_batch*data_loader.batch_size}.pth\")\n", + " torch.save(model.state_dict(), calib_output)\n", + " else:\n", + " for percentile in hist_percentile:\n", + " print(F\"{percentile} percentile calibration\")\n", + " compute_amax(model, method=\"percentile\")\n", + " calib_output = os.path.join(\n", + " out_dir,\n", + " F\"{model_name}-percentile-{percentile}-{num_calib_batch*data_loader.batch_size}.pth\")\n", + " torch.save(model.state_dict(), calib_output)\n", + "\n", + " for method in [\"mse\", \"entropy\"]:\n", + " print(F\"{method} calibration\")\n", + " compute_amax(model, method=method)\n", + " calib_output = os.path.join(\n", + " out_dir,\n", + " F\"{model_name}-{method}-{num_calib_batch*data_loader.batch_size}.pth\")\n", + " torch.save(model.state_dict(), calib_output)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "78504a6f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Calibrating model\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████████████████████| 32/32 [00:00<00:00, 96.04it/s]\n", + "WARNING: Logging before flag parsing goes to stderr.\n", + "W1109 04:01:43.512364 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.513354 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.514046 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.514638 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.515270 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.515859 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.516441 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.517009 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.517600 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.518167 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.518752 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.519333 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.519911 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.520473 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.521038 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.521596 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.522170 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.522742 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.523360 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.523957 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.524581 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.525059 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.525366 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.525675 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.525962 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.526257 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.526566 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.526885 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.527188 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.527489 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.527792 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.528097 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.528387 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.528834 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.529163 139704147265344 tensor_quantizer.py:238] Call .cuda() if running on GPU after loading calibrated amax.\n", + "W1109 04:01:43.532748 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([64, 1, 1, 1]).\n", + "W1109 04:01:43.533468 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.534033 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([64, 1, 1, 1]).\n", + "W1109 04:01:43.534684 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.535320 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([128, 1, 1, 1]).\n", + "W1109 04:01:43.535983 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.536569 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([128, 1, 1, 1]).\n", + "W1109 04:01:43.537248 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.537833 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([256, 1, 1, 1]).\n", + "W1109 04:01:43.538480 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.539074 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([256, 1, 1, 1]).\n", + "W1109 04:01:43.539724 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.540307 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([256, 1, 1, 1]).\n", + "W1109 04:01:43.540952 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.541534 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.542075 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.542596 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.543248 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.543719 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.544424 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.544952 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.545530 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.546114 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.546713 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.547292 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.547902 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.548453 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.549015 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([4096, 1]).\n", + "W1109 04:01:43.549665 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.550436 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([4096, 1]).\n", + "W1109 04:01:43.551925 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.553105 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([10, 1]).\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "features.0._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=2.7537 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.0._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0263, 2.7454](64) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.3._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=27.5676 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.3._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0169, 1.8204](64) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.7._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=15.2002 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.7._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0493, 1.3207](128) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.10._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=7.7376 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.10._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0163, 0.9624](128) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.14._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=8.8351 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.14._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0622, 0.8791](256) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.17._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=12.5746 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.17._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0505, 0.5117](256) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.20._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=9.7203 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.20._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0296, 0.5335](256) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.24._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=8.9367 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.24._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0220, 0.3763](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.27._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=6.6539 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.27._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0151, 0.1777](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.30._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=3.7099 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.30._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0087, 0.1906](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.34._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=4.0491 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.34._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0106, 0.1971](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.37._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=2.1531 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.37._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0070, 0.2305](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.40._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=3.3631 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.40._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0023, 0.4726](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "avgpool._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=5.3550 calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.0._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=5.3550 calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.0._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0026, 0.5320](4096) calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.3._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=6.6733 calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.3._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0018, 0.5172](4096) calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.6._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=9.4352 calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.6._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.3877, 0.5620](10) calibrator=MaxCalibrator scale=1.0 quant)\n" + ] + } + ], + "source": [ + "#Calibrate the model using max calibration technique.\n", + "with torch.no_grad():\n", + " calibrate_model(\n", + " model=qat_model,\n", + " model_name=\"vgg16\",\n", + " data_loader=training_dataloader,\n", + " num_calib_batch=32,\n", + " calibrator=\"max\",\n", + " hist_percentile=[99.9, 99.99, 99.999, 99.9999],\n", + " out_dir=\"./\")" + ] + }, + { + "cell_type": "markdown", + "id": "1aa0c109", + "metadata": {}, + "source": [ + "\n", + "## 6. Quantization Aware Training" + ] + }, + { + "cell_type": "markdown", + "id": "9fe8ec11", + "metadata": {}, + "source": [ + "In this phase, we finetune the model weights and leave the quantizer node values frozen. The dynamic ranges for each layer obtained from the calibration are kept constant while the weights of the model are finetuned to be close to the accuracy of original FP32 model (model without quantizer nodes) is preserved. Usually the finetuning of QAT model should be quick compared to the full training of the original model. Use QAT to fine-tune for around 10% of the original training schedule with an annealing learning-rate. Please refer to Achieving FP32 Accuracy for INT8 Inference Using Quantization Aware Training with NVIDIA TensorRT for detailed recommendations. For this VGG model, it is enough to finetune for 1 epoch to get acceptable accuracy. \n", + "During finetuning with QAT, the quantization is applied as a composition of `max`, `clamp`, `round` and `mul` ops. \n", + "```\n", + "# amax is absolute maximum value for an input\n", + "# The upper bound for integer quantization (127 for int8)\n", + "max_bound = torch.tensor((2.0**(num_bits - 1 + int(unsigned))) - 1.0, device=amax.device)\n", + "scale = max_bound / amax\n", + "outputs = torch.clamp((inputs * scale).round_(), min_bound, max_bound)\n", + "```\n", + "tensor_quant function in `pytorch_quantization` toolkit is responsible for the above tensor quantization. Usually, per channel quantization is recommended for weights, while per tensor quantization is recommended for activations in a network.\n", + "During inference, we use `torch.fake_quantize_per_tensor_affine` and `torch.fake_quantize_per_channel_affine` to perform quantization as this is easier to convert into corresponding TensorRT operators. Please refer to next sections for more details on how these operators are exported in torchscript and converted in Torch-TensorRT." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "1f28d228", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Updating learning rate: 0.1\n", + "Epoch: [ 1 / 1] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 2.635\n", + "Batch: [ 1000 | 1563] loss: 2.655\n", + "Batch: [ 1500 | 1563] loss: 2.646\n", + "Test Loss: 0.03291 Test Acc: 82.98%\n", + "Checkpoint saved\n" + ] + } + ], + "source": [ + "# Finetune the QAT model for 1 epoch\n", + "num_epochs=1\n", + "for epoch in range(num_epochs):\n", + " adjust_lr(opt, epoch)\n", + " print('Epoch: [%5d / %5d] LR: %f' % (epoch + 1, num_epochs, state[\"lr\"]))\n", + "\n", + " train(qat_model, training_dataloader, crit, opt, epoch)\n", + " test_loss, test_acc = test(qat_model, testing_dataloader, crit, epoch)\n", + "\n", + " print(\"Test Loss: {:.5f} Test Acc: {:.2f}%\".format(test_loss, 100 * test_acc))\n", + " \n", + "save_checkpoint({'epoch': epoch + 1,\n", + " 'model_state_dict': qat_model.state_dict(),\n", + " 'acc': test_acc,\n", + " 'opt_state_dict': opt.state_dict(),\n", + " 'state': state},\n", + " ckpt_path=\"vgg16_qat_ckpt\")" + ] + }, + { + "cell_type": "markdown", + "id": "7a4dcaa2", + "metadata": {}, + "source": [ + "\n", + "## 7. Export to Torchscript\n", + "Export the model to Torch script. Trace the model and convert it into torchscript for deployment. To learn more about Torchscript, please refer to https://pytorch.org/docs/stable/jit.html. Setting `quant_nn.TensorQuantizer.use_fb_fake_quant = True` enables the QAT model to use `torch.fake_quantize_per_tensor_affine` and `torch.fake_quantize_per_channel_affine` operators instead of `tensor_quant` function to export quantization operators. In torchscript, they are represented as `aten::fake_quantize_per_tensor_affine` and `aten::fake_quantize_per_channel_affine`. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "3d34f526", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "E1109 04:02:37.101168 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.102248 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.107194 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.107625 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.115269 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.115740 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.117969 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.118358 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.126382 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.126834 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.128674 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.129518 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.135453 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.135936 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.137858 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.138366 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.145539 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.146053 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.147871 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.148353 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.154252 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.154685 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.156558 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.157159 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.163197 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.163676 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.165549 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.165991 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.173305 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.173926 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.176034 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.176697 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.182843 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.183426 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.185377 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.185962 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.191966 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.192424 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.194325 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.194817 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.201988 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.202665 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.204763 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.205461 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.211393 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.211987 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.213899 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.214450 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.220892 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.221533 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.223519 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.224037 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.233809 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.234434 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.238212 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.239042 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.241022 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.241654 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.247820 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.248445 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.250366 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.250959 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.257248 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.257854 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.259968 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.260660 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "W1109 04:02:37.268160 139704147265344 tensor_quantizer.py:280] Use Pytorch's native experimental fake quantization.\n", + "/opt/conda/lib/python3.8/site-packages/pytorch_quantization/nn/modules/tensor_quantizer.py:285: TracerWarning: Converting a tensor to a Python number might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!\n", + " inputs, amax.item() / bound, 0,\n", + "/opt/conda/lib/python3.8/site-packages/pytorch_quantization/nn/modules/tensor_quantizer.py:291: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!\n", + " quant_dim = list(amax.shape).index(list(amax_sequeeze.shape)[0])\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "E1109 04:02:37.329273 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.330212 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.332529 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.333365 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.339547 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.340248 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.342257 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.342890 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.350619 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.351372 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.353470 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.354121 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.360090 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.360806 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.362803 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.363274 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.370369 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.371057 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.373071 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.373766 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.379890 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.380538 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.382532 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.383128 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.389077 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.389760 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.391815 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.392399 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.399809 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.400472 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.402399 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.402939 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.408818 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.409424 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.411513 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.412097 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.418537 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.419128 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.421343 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.421946 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.429382 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.430156 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.432259 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.433079 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.439297 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.440027 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.442149 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.442826 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.449377 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.449968 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.452122 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.452754 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.462532 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.463295 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.466963 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.467725 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.469692 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.470336 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.476204 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.476738 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.478809 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.479375 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.485666 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.486219 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.488416 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.488986 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n" + ] + } + ], + "source": [ + "quant_nn.TensorQuantizer.use_fb_fake_quant = True\n", + "with torch.no_grad():\n", + " data = iter(testing_dataloader)\n", + " images, _ = data.next()\n", + " jit_model = torch.jit.trace(qat_model, images.to(\"cuda\"))\n", + " torch.jit.save(jit_model, \"trained_vgg16_qat.jit.pt\")" + ] + }, + { + "cell_type": "markdown", + "id": "7341418a", + "metadata": {}, + "source": [ + "\n", + "## 8. Inference using Torch-TensorRT\n", + "In this phase, we run the exported torchscript graph of VGG QAT using Torch-TensorRT. Torch-TensorRT is a Pytorch-TensorRT compiler which converts Torchscript graphs into TensorRT. TensorRT 8.0 supports inference of quantization aware trained models and introduces new APIs; `QuantizeLayer` and `DequantizeLayer`. We can observe the entire VGG QAT graph quantization nodes from the debug log of Torch-TensorRT. To enable debug logging, you can set `torch_tensorrt.logging.set_reportable_log_level(torch_tensorrt.logging.Level.Debug)`. For example, `QuantConv2d` layer from `pytorch_quantization` toolkit is represented as follows in Torchscript\n", + "```\n", + "%quant_input : Tensor = aten::fake_quantize_per_tensor_affine(%x, %636, %637, %638, %639)\n", + "%quant_weight : Tensor = aten::fake_quantize_per_channel_affine(%394, %640, %641, %637, %638, %639)\n", + "%input.2 : Tensor = aten::_convolution(%quant_input, %quant_weight, %395, %687, %688, %689, %643, %690, %642, %643, %643, %644, %644)\n", + "```\n", + "`aten::fake_quantize_per_*_affine` is converted into `QuantizeLayer` + `DequantizeLayer` in Torch-TensorRT internally. Please refer to quantization op converters in Torch-TensorRT." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "aa7495e0", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Cannot infer input type from calcuations in graph for input x.2. Assuming it is Float32. If not, specify input type explicity\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Detected invalid timing cache, setup a local cache instead\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "VGG QAT accuracy using TensorRT: 82.97%\n" + ] + } + ], + "source": [ + "qat_model = torch.jit.load(\"trained_vgg16_qat.jit.pt\").eval()\n", + "\n", + "compile_spec = {\"inputs\": [torch_tensorrt.Input([16, 3, 32, 32])],\n", + " \"enabled_precisions\": torch.int8,\n", + " }\n", + "trt_mod = torch_tensorrt.compile(qat_model, **compile_spec)\n", + "\n", + "test_loss, test_acc = test(trt_mod, testing_dataloader, crit, 0)\n", + "print(\"VGG QAT accuracy using TensorRT: {:.2f}%\".format(100 * test_acc))" + ] + }, + { + "cell_type": "markdown", + "id": "9df5a90e", + "metadata": {}, + "source": [ + "### Performance benchmarking" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "9eb2cd2d", + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import numpy as np\n", + "\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "# Helper function to benchmark the model\n", + "def benchmark(model, input_shape=(1024, 1, 32, 32), dtype='fp32', nwarmup=50, nruns=1000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " output = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%100==0:\n", + " print('Iteration %d/%d, avg batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output shape:\", output.shape)\n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "5c2514ae", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, avg batch time 4.83 ms\n", + "Iteration 200/1000, avg batch time 4.83 ms\n", + "Iteration 300/1000, avg batch time 4.83 ms\n", + "Iteration 400/1000, avg batch time 4.83 ms\n", + "Iteration 500/1000, avg batch time 4.83 ms\n", + "Iteration 600/1000, avg batch time 4.83 ms\n", + "Iteration 700/1000, avg batch time 4.83 ms\n", + "Iteration 800/1000, avg batch time 4.83 ms\n", + "Iteration 900/1000, avg batch time 4.83 ms\n", + "Iteration 1000/1000, avg batch time 4.83 ms\n", + "Input shape: torch.Size([16, 3, 32, 32])\n", + "Output shape: torch.Size([16, 10])\n", + "Average batch time: 4.83 ms\n" + ] + } + ], + "source": [ + "benchmark(jit_model, input_shape=(16, 3, 32, 32))" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "c5378ed6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, avg batch time 1.87 ms\n", + "Iteration 200/1000, avg batch time 1.84 ms\n", + "Iteration 300/1000, avg batch time 1.85 ms\n", + "Iteration 400/1000, avg batch time 1.83 ms\n", + "Iteration 500/1000, avg batch time 1.82 ms\n", + "Iteration 600/1000, avg batch time 1.81 ms\n", + "Iteration 700/1000, avg batch time 1.81 ms\n", + "Iteration 800/1000, avg batch time 1.80 ms\n", + "Iteration 900/1000, avg batch time 1.80 ms\n", + "Iteration 1000/1000, avg batch time 1.79 ms\n", + "Input shape: torch.Size([16, 3, 32, 32])\n", + "Output shape: torch.Size([16, 10])\n", + "Average batch time: 1.79 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_mod, input_shape=(16, 3, 32, 32))" + ] + }, + { + "cell_type": "markdown", + "id": "d6a5ec1c", + "metadata": {}, + "source": [ + "\n", + "## 9. References\n", + "* Very Deep Convolution Networks for large scale Image Recognition\n", + "* Achieving FP32 Accuracy for INT8 Inference Using Quantization Aware Training with NVIDIA TensorRT\n", + "* QAT workflow for VGG16\n", + "* Deploying VGG QAT model in C++ using Torch-TensorRT\n", + "* Pytorch-quantization toolkit from NVIDIA\n", + "* Pytorch quantization toolkit userguide\n", + "* Quantization basics" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/v1.2.0/_sources/_cpp_api/class_view_hierarchy.rst.txt b/docs/v1.2.0/_sources/_cpp_api/class_view_hierarchy.rst.txt new file mode 100644 index 0000000000..a75671077c --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/class_view_hierarchy.rst.txt @@ -0,0 +1,18 @@ + +Class Hierarchy +--------------- + + +.. raw:: html + + + +.. end raw html for treeView + + diff --git a/docs/v1.2.0/_sources/_cpp_api/classtorch__tensorrt_1_1DataType.rst.txt b/docs/v1.2.0/_sources/_cpp_api/classtorch__tensorrt_1_1DataType.rst.txt new file mode 100644 index 0000000000..6a40d653a7 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/classtorch__tensorrt_1_1DataType.rst.txt @@ -0,0 +1,17 @@ +.. _exhale_class_classtorch__tensorrt_1_1DataType: + +Class DataType +============== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Class Documentation +------------------- + + +.. doxygenclass:: torch_tensorrt::DataType + :project: Torch-TensorRT + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/classtorch__tensorrt_1_1Device_1_1DeviceType.rst.txt b/docs/v1.2.0/_sources/_cpp_api/classtorch__tensorrt_1_1Device_1_1DeviceType.rst.txt new file mode 100644 index 0000000000..5479dea0ee --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/classtorch__tensorrt_1_1Device_1_1DeviceType.rst.txt @@ -0,0 +1,23 @@ +.. _exhale_class_classtorch__tensorrt_1_1Device_1_1DeviceType: + +Class Device::DeviceType +======================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Nested Relationships +-------------------- + +This class is a nested type of :ref:`exhale_struct_structtorch__tensorrt_1_1Device`. + + +Class Documentation +------------------- + + +.. doxygenclass:: torch_tensorrt::Device::DeviceType + :project: Torch-TensorRT + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/classtorch__tensorrt_1_1TensorFormat.rst.txt b/docs/v1.2.0/_sources/_cpp_api/classtorch__tensorrt_1_1TensorFormat.rst.txt new file mode 100644 index 0000000000..3f2030e8f2 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/classtorch__tensorrt_1_1TensorFormat.rst.txt @@ -0,0 +1,17 @@ +.. _exhale_class_classtorch__tensorrt_1_1TensorFormat: + +Class TensorFormat +================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Class Documentation +------------------- + + +.. doxygenclass:: torch_tensorrt::TensorFormat + :project: Torch-TensorRT + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator.rst.txt b/docs/v1.2.0/_sources/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator.rst.txt new file mode 100644 index 0000000000..7e76229f19 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator.rst.txt @@ -0,0 +1,26 @@ +.. _exhale_class_classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator: + +Template Class Int8CacheCalibrator +================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_ptq.h` + + +Inheritance Relationships +------------------------- + +Base Type +********* + +- ``private Algorithm`` + + +Class Documentation +------------------- + + +.. doxygenclass:: torch_tensorrt::ptq::Int8CacheCalibrator + :project: Torch-TensorRT + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8Calibrator.rst.txt b/docs/v1.2.0/_sources/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8Calibrator.rst.txt new file mode 100644 index 0000000000..6ef15f8ff1 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8Calibrator.rst.txt @@ -0,0 +1,26 @@ +.. _exhale_class_classtorch__tensorrt_1_1ptq_1_1Int8Calibrator: + +Template Class Int8Calibrator +============================= + +- Defined in :ref:`file_cpp_include_torch_tensorrt_ptq.h` + + +Inheritance Relationships +------------------------- + +Base Type +********* + +- ``private Algorithm`` + + +Class Documentation +------------------- + + +.. doxygenclass:: torch_tensorrt::ptq::Int8Calibrator + :project: Torch-TensorRT + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1a18d295a837ac71add5578860b55e5502.rst.txt b/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1a18d295a837ac71add5578860b55e5502.rst.txt new file mode 100644 index 0000000000..70809499b3 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1a18d295a837ac71add5578860b55e5502.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_define_macros_8h_1a18d295a837ac71add5578860b55e5502: + +Define STR +========== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_macros.h` + + +Define Documentation +-------------------- + + +.. doxygendefine:: STR + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268.rst.txt b/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268.rst.txt new file mode 100644 index 0000000000..10850f77a2 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268: + +Define TORCH_TENSORRT_PATCH_VERSION +=================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_macros.h` + + +Define Documentation +-------------------- + + +.. doxygendefine:: TORCH_TENSORRT_PATCH_VERSION + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e.rst.txt b/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e.rst.txt new file mode 100644 index 0000000000..9a3d3c8aa8 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e: + +Define TORCH_TENSORRT_MAJOR_VERSION +=================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_macros.h` + + +Define Documentation +-------------------- + + +.. doxygendefine:: TORCH_TENSORRT_MAJOR_VERSION + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827.rst.txt b/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827.rst.txt new file mode 100644 index 0000000000..0c495bc60c --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827: + +Define TORCH_TENSORRT_MINOR_VERSION +=================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_macros.h` + + +Define Documentation +-------------------- + + +.. doxygendefine:: TORCH_TENSORRT_MINOR_VERSION + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b.rst.txt b/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b.rst.txt new file mode 100644 index 0000000000..40ad2fd99f --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b: + +Define TORCHTRT_API +=================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_macros.h` + + +Define Documentation +-------------------- + + +.. doxygendefine:: TORCHTRT_API + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da.rst.txt b/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da.rst.txt new file mode 100644 index 0000000000..75d62d3b65 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da: + +Define XSTR +=========== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_macros.h` + + +Define Documentation +-------------------- + + +.. doxygendefine:: XSTR + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1ad19939408f7be171a74a89928b36eb59.rst.txt b/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1ad19939408f7be171a74a89928b36eb59.rst.txt new file mode 100644 index 0000000000..262bd89acd --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1ad19939408f7be171a74a89928b36eb59.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_define_macros_8h_1ad19939408f7be171a74a89928b36eb59: + +Define TORCHTRT_HIDDEN +====================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_macros.h` + + +Define Documentation +-------------------- + + +.. doxygendefine:: TORCHTRT_HIDDEN + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883.rst.txt b/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883.rst.txt new file mode 100644 index 0000000000..ea5d28d205 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883: + +Define TORCH_TENSORRT_VERSION +============================= + +- Defined in :ref:`file_cpp_include_torch_tensorrt_macros.h` + + +Define Documentation +-------------------- + + +.. doxygendefine:: TORCH_TENSORRT_VERSION + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/dir_cpp.rst.txt b/docs/v1.2.0/_sources/_cpp_api/dir_cpp.rst.txt new file mode 100644 index 0000000000..f09e39c518 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/dir_cpp.rst.txt @@ -0,0 +1,16 @@ +.. _dir_cpp: + + +Directory cpp +============= + + +*Directory path:* ``cpp`` + +Subdirectories +-------------- + +- :ref:`dir_cpp_include` + + + diff --git a/docs/v1.2.0/_sources/_cpp_api/dir_cpp_include.rst.txt b/docs/v1.2.0/_sources/_cpp_api/dir_cpp_include.rst.txt new file mode 100644 index 0000000000..e262b4a9af --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/dir_cpp_include.rst.txt @@ -0,0 +1,20 @@ +.. _dir_cpp_include: + + +Directory include +================= + + +|exhale_lsh| :ref:`Parent directory ` (``cpp``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +*Directory path:* ``cpp/include`` + +Subdirectories +-------------- + +- :ref:`dir_cpp_include_torch_tensorrt` + + + diff --git a/docs/v1.2.0/_sources/_cpp_api/dir_cpp_include_torch_tensorrt.rst.txt b/docs/v1.2.0/_sources/_cpp_api/dir_cpp_include_torch_tensorrt.rst.txt new file mode 100644 index 0000000000..f1da041e12 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/dir_cpp_include_torch_tensorrt.rst.txt @@ -0,0 +1,23 @@ +.. _dir_cpp_include_torch_tensorrt: + + +Directory torch_tensorrt +======================== + + +|exhale_lsh| :ref:`Parent directory ` (``cpp/include``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +*Directory path:* ``cpp/include/torch_tensorrt`` + + +Files +----- + +- :ref:`file_cpp_include_torch_tensorrt_logging.h` +- :ref:`file_cpp_include_torch_tensorrt_macros.h` +- :ref:`file_cpp_include_torch_tensorrt_ptq.h` +- :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + diff --git a/docs/v1.2.0/_sources/_cpp_api/enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558.rst.txt b/docs/v1.2.0/_sources/_cpp_api/enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558.rst.txt new file mode 100644 index 0000000000..6a1c2671ae --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558: + +Enum Level +========== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_logging.h` + + +Enum Documentation +------------------ + + +.. doxygenenum:: torch_tensorrt::logging::Level + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb.rst.txt b/docs/v1.2.0/_sources/_cpp_api/enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb.rst.txt new file mode 100644 index 0000000000..a004103bfe --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb: + +Enum EngineCapability +===================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Enum Documentation +------------------ + + +.. doxygenenum:: torch_tensorrt::EngineCapability + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/file_cpp_include_torch_tensorrt_logging.h.rst.txt b/docs/v1.2.0/_sources/_cpp_api/file_cpp_include_torch_tensorrt_logging.h.rst.txt new file mode 100644 index 0000000000..ea89d38038 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/file_cpp_include_torch_tensorrt_logging.h.rst.txt @@ -0,0 +1,80 @@ + +.. _file_cpp_include_torch_tensorrt_logging.h: + +File logging.h +============== + +|exhale_lsh| :ref:`Parent directory ` (``cpp/include/torch_tensorrt``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +.. contents:: Contents + :local: + :backlinks: none + +Definition (``cpp/include/torch_tensorrt/logging.h``) +----------------------------------------------------- + + +.. toctree:: + :maxdepth: 1 + + program_listing_file_cpp_include_torch_tensorrt_logging.h.rst + + + + + +Includes +-------- + + +- ``string`` + +- ``torch_tensorrt/macros.h`` (:ref:`file_cpp_include_torch_tensorrt_macros.h`) + + + +Included By +----------- + + +- :ref:`file_cpp_include_torch_tensorrt_ptq.h` + + + + +Namespaces +---------- + + +- :ref:`namespace_torch_tensorrt` + +- :ref:`namespace_torch_tensorrt__logging` + + +Enums +----- + + +- :ref:`exhale_enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558` + + +Functions +--------- + + +- :ref:`exhale_function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a` + +- :ref:`exhale_function_logging_8h_1a0593f776f469c20469e2f729fc7861a3` + +- :ref:`exhale_function_logging_8h_1a0c012cb374addd90eb1f42eaec570650` + +- :ref:`exhale_function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8` + +- :ref:`exhale_function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5` + +- :ref:`exhale_function_logging_8h_1af8f3443813315af7901903d25dd495cc` + +- :ref:`exhale_function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2` + diff --git a/docs/v1.2.0/_sources/_cpp_api/file_cpp_include_torch_tensorrt_macros.h.rst.txt b/docs/v1.2.0/_sources/_cpp_api/file_cpp_include_torch_tensorrt_macros.h.rst.txt new file mode 100644 index 0000000000..61447e1ada --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/file_cpp_include_torch_tensorrt_macros.h.rst.txt @@ -0,0 +1,71 @@ + +.. _file_cpp_include_torch_tensorrt_macros.h: + +File macros.h +============= + +|exhale_lsh| :ref:`Parent directory ` (``cpp/include/torch_tensorrt``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +.. contents:: Contents + :local: + :backlinks: none + +Definition (``cpp/include/torch_tensorrt/macros.h``) +---------------------------------------------------- + + +.. toctree:: + :maxdepth: 1 + + program_listing_file_cpp_include_torch_tensorrt_macros.h.rst + + + + + + + +Included By +----------- + + +- :ref:`file_cpp_include_torch_tensorrt_logging.h` + +- :ref:`file_cpp_include_torch_tensorrt_ptq.h` + +- :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + + + +Namespaces +---------- + + +- :ref:`namespace_torch_tensorrt` + +- :ref:`namespace_torch_tensorrt__torchscript` + + +Defines +------- + + +- :ref:`exhale_define_macros_8h_1a18d295a837ac71add5578860b55e5502` + +- :ref:`exhale_define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e` + +- :ref:`exhale_define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827` + +- :ref:`exhale_define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268` + +- :ref:`exhale_define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883` + +- :ref:`exhale_define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b` + +- :ref:`exhale_define_macros_8h_1ad19939408f7be171a74a89928b36eb59` + +- :ref:`exhale_define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da` + diff --git a/docs/v1.2.0/_sources/_cpp_api/file_cpp_include_torch_tensorrt_ptq.h.rst.txt b/docs/v1.2.0/_sources/_cpp_api/file_cpp_include_torch_tensorrt_ptq.h.rst.txt new file mode 100644 index 0000000000..34b64af6e0 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/file_cpp_include_torch_tensorrt_ptq.h.rst.txt @@ -0,0 +1,84 @@ + +.. _file_cpp_include_torch_tensorrt_ptq.h: + +File ptq.h +========== + +|exhale_lsh| :ref:`Parent directory ` (``cpp/include/torch_tensorrt``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +.. contents:: Contents + :local: + :backlinks: none + +Definition (``cpp/include/torch_tensorrt/ptq.h``) +------------------------------------------------- + + +.. toctree:: + :maxdepth: 1 + + program_listing_file_cpp_include_torch_tensorrt_ptq.h.rst + + + + + +Includes +-------- + + +- ``NvInfer.h`` + +- ``fstream`` + +- ``iostream`` + +- ``iterator`` + +- ``memory`` + +- ``sstream`` + +- ``string`` + +- ``torch/torch.h`` + +- ``torch_tensorrt/logging.h`` (:ref:`file_cpp_include_torch_tensorrt_logging.h`) + +- ``torch_tensorrt/macros.h`` (:ref:`file_cpp_include_torch_tensorrt_macros.h`) + +- ``vector`` + + + + + + +Namespaces +---------- + + +- :ref:`namespace_torch_tensorrt` + +- :ref:`namespace_torch_tensorrt__ptq` + + +Classes +------- + + +- :ref:`exhale_class_classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator` + +- :ref:`exhale_class_classtorch__tensorrt_1_1ptq_1_1Int8Calibrator` + + +Functions +--------- + + +- :ref:`exhale_function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c` + +- :ref:`exhale_function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178` + diff --git a/docs/v1.2.0/_sources/_cpp_api/file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst.txt b/docs/v1.2.0/_sources/_cpp_api/file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst.txt new file mode 100644 index 0000000000..e29afa26a3 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst.txt @@ -0,0 +1,105 @@ + +.. _file_cpp_include_torch_tensorrt_torch_tensorrt.h: + +File torch_tensorrt.h +===================== + +|exhale_lsh| :ref:`Parent directory ` (``cpp/include/torch_tensorrt``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +.. contents:: Contents + :local: + :backlinks: none + +Definition (``cpp/include/torch_tensorrt/torch_tensorrt.h``) +------------------------------------------------------------ + + +.. toctree:: + :maxdepth: 1 + + program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst + + + + + +Includes +-------- + + +- ``cuda_runtime.h`` + +- ``iostream`` + +- ``memory`` + +- ``set`` + +- ``string`` + +- ``torch/custom_class.h`` + +- ``torch_tensorrt/macros.h`` (:ref:`file_cpp_include_torch_tensorrt_macros.h`) + +- ``vector`` + + + + + + +Namespaces +---------- + + +- :ref:`namespace_torch_tensorrt` + +- :ref:`namespace_torch_tensorrt__torchscript` + + +Classes +------- + + +- :ref:`exhale_struct_structtorch__tensorrt_1_1Device` + +- :ref:`exhale_struct_structtorch__tensorrt_1_1GraphInputs` + +- :ref:`exhale_struct_structtorch__tensorrt_1_1Input` + +- :ref:`exhale_struct_structtorch__tensorrt_1_1torchscript_1_1CompileSpec` + +- :ref:`exhale_class_classtorch__tensorrt_1_1DataType` + +- :ref:`exhale_class_classtorch__tensorrt_1_1Device_1_1DeviceType` + +- :ref:`exhale_class_classtorch__tensorrt_1_1TensorFormat` + + +Enums +----- + + +- :ref:`exhale_enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb` + + +Functions +--------- + + +- :ref:`exhale_function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1` + +- :ref:`exhale_function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528` + +- :ref:`exhale_function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384` + +- :ref:`exhale_function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797` + +- :ref:`exhale_function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9` + +- :ref:`exhale_function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2` + +- :ref:`exhale_function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef` + diff --git a/docs/v1.2.0/_sources/_cpp_api/file_view_hierarchy.rst.txt b/docs/v1.2.0/_sources/_cpp_api/file_view_hierarchy.rst.txt new file mode 100644 index 0000000000..c47d5aa483 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/file_view_hierarchy.rst.txt @@ -0,0 +1,18 @@ + +File Hierarchy +-------------- + + +.. raw:: html + + + +.. end raw html for treeView + + diff --git a/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1a0593f776f469c20469e2f729fc7861a3.rst.txt b/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1a0593f776f469c20469e2f729fc7861a3.rst.txt new file mode 100644 index 0000000000..8cab943a9a --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1a0593f776f469c20469e2f729fc7861a3.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_function_logging_8h_1a0593f776f469c20469e2f729fc7861a3: + +Function torch_tensorrt::logging::get_logging_prefix +==================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_logging.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::logging::get_logging_prefix() + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1a0c012cb374addd90eb1f42eaec570650.rst.txt b/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1a0c012cb374addd90eb1f42eaec570650.rst.txt new file mode 100644 index 0000000000..55bb2bde5c --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1a0c012cb374addd90eb1f42eaec570650.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_function_logging_8h_1a0c012cb374addd90eb1f42eaec570650: + +Function torch_tensorrt::logging::get_reportable_log_level +========================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_logging.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::logging::get_reportable_log_level() + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a.rst.txt b/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a.rst.txt new file mode 100644 index 0000000000..e8b0ac046d --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a: + +Function torch_tensorrt::logging::get_is_colored_output_on +========================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_logging.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::logging::get_is_colored_output_on() + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2.rst.txt b/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2.rst.txt new file mode 100644 index 0000000000..95380eb157 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2: + +Function torch_tensorrt::logging::set_reportable_log_level +========================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_logging.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::logging::set_reportable_log_level(Level) + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8.rst.txt b/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8.rst.txt new file mode 100644 index 0000000000..0ca83fe039 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8: + +Function torch_tensorrt::logging::log +===================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_logging.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::logging::log(Level, std::string) + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5.rst.txt b/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5.rst.txt new file mode 100644 index 0000000000..86c2c7d61e --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5: + +Function torch_tensorrt::logging::set_is_colored_output_on +========================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_logging.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::logging::set_is_colored_output_on(bool) + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1af8f3443813315af7901903d25dd495cc.rst.txt b/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1af8f3443813315af7901903d25dd495cc.rst.txt new file mode 100644 index 0000000000..9d0a42d2bd --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/function_logging_8h_1af8f3443813315af7901903d25dd495cc.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_function_logging_8h_1af8f3443813315af7901903d25dd495cc: + +Function torch_tensorrt::logging::set_logging_prefix +==================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_logging.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::logging::set_logging_prefix(std::string) + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c.rst.txt b/docs/v1.2.0/_sources/_cpp_api/function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c.rst.txt new file mode 100644 index 0000000000..5d9188270f --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c: + +Template Function torch_tensorrt::ptq::make_int8_cache_calibrator +================================================================= + +- Defined in :ref:`file_cpp_include_torch_tensorrt_ptq.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::ptq::make_int8_cache_calibrator(const std::string&) + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178.rst.txt b/docs/v1.2.0/_sources/_cpp_api/function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178.rst.txt new file mode 100644 index 0000000000..9551f48bb6 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178: + +Template Function torch_tensorrt::ptq::make_int8_calibrator +=========================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_ptq.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::ptq::make_int8_calibrator(DataLoader, const std::string&, bool) + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039.rst.txt b/docs/v1.2.0/_sources/_cpp_api/function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039.rst.txt new file mode 100644 index 0000000000..caa9ad6226 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039: + +Template Function torch_tensorrt::ptq::make_int8_calibrator +=========================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_ptq.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::ptq::make_int8_calibrator(DataLoader, const std::string&, bool) diff --git a/docs/v1.2.0/_sources/_cpp_api/function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa.rst.txt b/docs/v1.2.0/_sources/_cpp_api/function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa.rst.txt new file mode 100644 index 0000000000..477c2655ae --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa.rst.txt @@ -0,0 +1,13 @@ +.. _exhale_function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa: + +Template Function torch_tensorrt::ptq::make_int8_cache_calibrator +================================================================= + +- Defined in :ref:`file_cpp_include_torch_tensorrt_ptq.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::ptq::make_int8_cache_calibrator(const std::string&) diff --git a/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797.rst.txt b/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797.rst.txt new file mode 100644 index 0000000000..54f7c29df3 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797: + +Function torch_tensorrt::torchscript::check_method_operator_support +=================================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::torchscript::check_method_operator_support(const torch::jit::Module&, std::string) + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9.rst.txt b/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9.rst.txt new file mode 100644 index 0000000000..b80699688a --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9: + +Function torch_tensorrt::torchscript::compile +============================================= + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::torchscript::compile(const torch::jit::Module&, CompileSpec) + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef.rst.txt b/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef.rst.txt new file mode 100644 index 0000000000..a49fea74a1 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef: + +Function torch_tensorrt::torchscript::embed_engine_in_new_module +================================================================ + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::torchscript::embed_engine_in_new_module(const std::string&, Device) + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528.rst.txt b/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528.rst.txt new file mode 100644 index 0000000000..d551c4894d --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528: + +Function torch_tensorrt::get_build_info +======================================= + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::get_build_info() + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384.rst.txt b/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384.rst.txt new file mode 100644 index 0000000000..e296177bfa --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384: + +Function torch_tensorrt::set_device +=================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::set_device(const int) + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1.rst.txt b/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1.rst.txt new file mode 100644 index 0000000000..06b03cbfd9 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1: + +Function torch_tensorrt::dump_build_info +======================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::dump_build_info() + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2.rst.txt b/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2.rst.txt new file mode 100644 index 0000000000..2a1f0c89d0 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2.rst.txt @@ -0,0 +1,14 @@ +.. _exhale_function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2: + +Function torch_tensorrt::torchscript::convert_method_to_trt_engine +================================================================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Function Documentation +---------------------- + + +.. doxygenfunction:: torch_tensorrt::torchscript::convert_method_to_trt_engine(const torch::jit::Module&, std::string, CompileSpec) + :project: Torch-TensorRT \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/namespace_torch_tensorrt.rst.txt b/docs/v1.2.0/_sources/_cpp_api/namespace_torch_tensorrt.rst.txt new file mode 100644 index 0000000000..43a0afb20d --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/namespace_torch_tensorrt.rst.txt @@ -0,0 +1,59 @@ + +.. _namespace_torch_tensorrt: + +Namespace torch_tensorrt +======================== + + +.. contents:: Contents + :local: + :backlinks: none + + + + + +Namespaces +---------- + + +- :ref:`namespace_torch_tensorrt__logging` + +- :ref:`namespace_torch_tensorrt__ptq` + +- :ref:`namespace_torch_tensorrt__torchscript` + + +Classes +------- + + +- :ref:`exhale_struct_structtorch__tensorrt_1_1Device` + +- :ref:`exhale_struct_structtorch__tensorrt_1_1GraphInputs` + +- :ref:`exhale_struct_structtorch__tensorrt_1_1Input` + +- :ref:`exhale_class_classtorch__tensorrt_1_1DataType` + +- :ref:`exhale_class_classtorch__tensorrt_1_1Device_1_1DeviceType` + +- :ref:`exhale_class_classtorch__tensorrt_1_1TensorFormat` + + +Enums +----- + + +- :ref:`exhale_enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb` + + +Functions +--------- + + +- :ref:`exhale_function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1` + +- :ref:`exhale_function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528` + +- :ref:`exhale_function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384` diff --git a/docs/v1.2.0/_sources/_cpp_api/namespace_torch_tensorrt__logging.rst.txt b/docs/v1.2.0/_sources/_cpp_api/namespace_torch_tensorrt__logging.rst.txt new file mode 100644 index 0000000000..49f946f937 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/namespace_torch_tensorrt__logging.rst.txt @@ -0,0 +1,39 @@ + +.. _namespace_torch_tensorrt__logging: + +Namespace torch_tensorrt::logging +================================= + + +.. contents:: Contents + :local: + :backlinks: none + + + + + +Enums +----- + + +- :ref:`exhale_enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558` + + +Functions +--------- + + +- :ref:`exhale_function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a` + +- :ref:`exhale_function_logging_8h_1a0593f776f469c20469e2f729fc7861a3` + +- :ref:`exhale_function_logging_8h_1a0c012cb374addd90eb1f42eaec570650` + +- :ref:`exhale_function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8` + +- :ref:`exhale_function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5` + +- :ref:`exhale_function_logging_8h_1af8f3443813315af7901903d25dd495cc` + +- :ref:`exhale_function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2` diff --git a/docs/v1.2.0/_sources/_cpp_api/namespace_torch_tensorrt__ptq.rst.txt b/docs/v1.2.0/_sources/_cpp_api/namespace_torch_tensorrt__ptq.rst.txt new file mode 100644 index 0000000000..bdc39cb326 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/namespace_torch_tensorrt__ptq.rst.txt @@ -0,0 +1,31 @@ + +.. _namespace_torch_tensorrt__ptq: + +Namespace torch_tensorrt::ptq +============================= + + +.. contents:: Contents + :local: + :backlinks: none + + + + + +Classes +------- + + +- :ref:`exhale_class_classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator` + +- :ref:`exhale_class_classtorch__tensorrt_1_1ptq_1_1Int8Calibrator` + + +Functions +--------- + + +- :ref:`exhale_function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c` + +- :ref:`exhale_function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178` diff --git a/docs/v1.2.0/_sources/_cpp_api/namespace_torch_tensorrt__torchscript.rst.txt b/docs/v1.2.0/_sources/_cpp_api/namespace_torch_tensorrt__torchscript.rst.txt new file mode 100644 index 0000000000..b56b3f738e --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/namespace_torch_tensorrt__torchscript.rst.txt @@ -0,0 +1,33 @@ + +.. _namespace_torch_tensorrt__torchscript: + +Namespace torch_tensorrt::torchscript +===================================== + + +.. contents:: Contents + :local: + :backlinks: none + + + + + +Classes +------- + + +- :ref:`exhale_struct_structtorch__tensorrt_1_1torchscript_1_1CompileSpec` + + +Functions +--------- + + +- :ref:`exhale_function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797` + +- :ref:`exhale_function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9` + +- :ref:`exhale_function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2` + +- :ref:`exhale_function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef` diff --git a/docs/v1.2.0/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_logging.h.rst.txt b/docs/v1.2.0/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_logging.h.rst.txt new file mode 100644 index 0000000000..af68cbb678 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_logging.h.rst.txt @@ -0,0 +1,51 @@ + +.. _program_listing_file_cpp_include_torch_tensorrt_logging.h: + +Program Listing for File logging.h +================================== + +|exhale_lsh| :ref:`Return to documentation for file ` (``cpp/include/torch_tensorrt/logging.h``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +.. code-block:: cpp + + /* + * Copyright (c) NVIDIA Corporation. + * All rights reserved. + * + * This library is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + #pragma once + + #include + #include "torch_tensorrt/macros.h" + + namespace torch_tensorrt { + namespace logging { + enum Level { + kINTERNAL_ERROR, + kERROR, + kWARNING, + kINFO, + kDEBUG, + kGRAPH, + }; + + // Are these ones necessary for the user? + TORCHTRT_API std::string get_logging_prefix(); + TORCHTRT_API void set_logging_prefix(std::string prefix); + + TORCHTRT_API void set_reportable_log_level(Level lvl); + + TORCHTRT_API void set_is_colored_output_on(bool colored_output_on); + + TORCHTRT_API Level get_reportable_log_level(); + + TORCHTRT_API bool get_is_colored_output_on(); + + // Dont know if we want this? + TORCHTRT_API void log(Level lvl, std::string msg); + } // namespace logging + } // namespace torch_tensorrt diff --git a/docs/v1.2.0/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_macros.h.rst.txt b/docs/v1.2.0/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_macros.h.rst.txt new file mode 100644 index 0000000000..66f0005450 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_macros.h.rst.txt @@ -0,0 +1,50 @@ + +.. _program_listing_file_cpp_include_torch_tensorrt_macros.h: + +Program Listing for File macros.h +================================= + +|exhale_lsh| :ref:`Return to documentation for file ` (``cpp/include/torch_tensorrt/macros.h``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +.. code-block:: cpp + + /* + * Copyright (c) NVIDIA Corporation. + * All rights reserved. + * + * This library is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + #pragma once + + #if defined(USE_CMAKE_GENERATED_EXPORT_HEADER) + #include + #else + #if defined(__GNUC__) + #define TORCHTRT_API __attribute__((__visibility__("default"))) + #define TORCHTRT_HIDDEN __attribute__((__visibility__("hidden"))) + #else + #define TORCHTRT_API + #define TORCHTRT_HIDDEN + #endif // defined(__GNUC__) + #endif // defined(USE_CMAKE_GENERATED_EXPORT_HEADER) + + // Does this need to be gaurded or something? + #define XSTR(x) #x + #define STR(x) XSTR(x) + + #define TORCH_TENSORRT_MAJOR_VERSION 1 + #define TORCH_TENSORRT_MINOR_VERSION 2 + #define TORCH_TENSORRT_PATCH_VERSION 0 + #define TORCH_TENSORRT_VERSION \ + STR(TORCH_TENSORRT_MAJOR_VERSION) \ + "." STR(TORCH_TENSORRT_MINOR_VERSION) "." STR(TORCH_TENSORRT_PATCH_VERSION) + + // Setup namespace aliases for ease of use + namespace torch_tensorrt { + namespace torchscript {} + namespace ts = torchscript; + } // namespace torch_tensorrt + namespace torchtrt = torch_tensorrt; diff --git a/docs/v1.2.0/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_ptq.h.rst.txt b/docs/v1.2.0/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_ptq.h.rst.txt new file mode 100644 index 0000000000..65834c370b --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_ptq.h.rst.txt @@ -0,0 +1,190 @@ + +.. _program_listing_file_cpp_include_torch_tensorrt_ptq.h: + +Program Listing for File ptq.h +============================== + +|exhale_lsh| :ref:`Return to documentation for file ` (``cpp/include/torch_tensorrt/ptq.h``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +.. code-block:: cpp + + /* + * Copyright (c) NVIDIA Corporation. + * All rights reserved. + * + * This library is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + #pragma once + + #include + #include + #include + #include + #include + #include + #include + + #include "NvInfer.h" + #include "torch/torch.h" + #include "torch_tensorrt/logging.h" + #include "torch_tensorrt/macros.h" + + #ifndef DOXYGEN_SHOULD_SKIP_THIS + namespace nvinfer1 { + class IInt8Calibrator; + class IInt8EntropyCalibrator2; + } // namespace nvinfer1 + + namespace torch_tensorrt { + namespace ptq { + TORCHTRT_API bool get_batch_impl(void* bindings[], const char* names[], int nbBindings, torch::Tensor& data); + } + } // namespace torch_tensorrt + #endif // DOXYGEN_SHOULD_SKIP_THIS + + namespace torch_tensorrt { + namespace ptq { + + template + class Int8Calibrator : Algorithm { + using DataLoader = typename DataLoaderUniquePtr::element_type; + using Batch = typename DataLoader::super::BatchType; + + public: + Int8Calibrator(DataLoaderUniquePtr dataloader, const std::string& cache_file_path, bool use_cache) + : dataloader_(dataloader.get()), cache_file_path_(cache_file_path), use_cache_(use_cache) { + for (auto batch : *dataloader_) { + batched_data_.push_back(batch.data); + } + it_ = batched_data_.begin(); + } + + int getBatchSize() const noexcept override { + // HACK: Torch-TensorRT only uses explict batch sizing, INT8 Calibrator does not + // work when reporting the batch size here and having explicity batching. + // So we just report batch size 1 (warnings will still be printed out). + return 1; + // return static_cast(dataloader_->options().batch_size); + } + + bool getBatch(void* bindings[], const char* names[], int nbBindings) noexcept override { + if (it_ != batched_data_.end()) { + auto status = get_batch_impl(bindings, names, nbBindings, *it_); + it_ = ++it_; + return status; + } else { + // Reset iterator if incase calibrator is going to be used again + it_ = batched_data_.begin(); + return false; + } + } + + const void* readCalibrationCache(size_t& length) noexcept override { + if (use_cache_) { + std::stringstream ss; + ss << "Reading Calibration Cache from " << cache_file_path_; + logging::log(logging::Level::kINFO, ss.str()); + + cache_.clear(); + std::ifstream input(cache_file_path_, std::ios::binary); + input >> std::noskipws; + if (input.good()) { + std::copy(std::istream_iterator(input), std::istream_iterator(), std::back_inserter(cache_)); + logging::log(logging::Level::kDEBUG, "Cache read"); + } + length = cache_.size(); + return length ? cache_.data() : nullptr; + } + return nullptr; + } + + void writeCalibrationCache(const void* cache, size_t length) noexcept override { + std::ofstream cache_file(cache_file_path_, std::ios::binary); + cache_file.write(reinterpret_cast(cache), length); + std::stringstream ss; + ss << "Saved Calibration Cache to " << cache_file_path_; + logging::log(logging::Level::kINFO, ss.str()); + } + + operator nvinfer1::IInt8Calibrator*() { + return reinterpret_cast(this); + } + + private: + DataLoader* dataloader_; + const std::string& cache_file_path_; + size_t cache_size_ = 0; + bool use_cache_; + std::vector cache_; + std::vector batched_data_; + std::vector::iterator it_; + }; + + template + class Int8CacheCalibrator : Algorithm { + public: + Int8CacheCalibrator(const std::string& cache_file_path) : cache_file_path_(cache_file_path) {} + + int getBatchSize() const noexcept override { + // HACK: Torch-TensorRT only uses explict batch sizing, INT8 Calibrator does not + // work when reporting the batch size here and having explicity batching. + // So we just report batch size 1 (warnings will still be printed out). + return 1; + } + + bool getBatch(void* bindings[], const char* names[], int nbBindings) noexcept override { + return false; + } + + const void* readCalibrationCache(size_t& length) noexcept override { + std::stringstream ss; + ss << "Reading Calibration Cache from " << cache_file_path_; + logging::log(logging::Level::kINFO, ss.str()); + + cache_.clear(); + std::ifstream input(cache_file_path_, std::ios::binary); + input >> std::noskipws; + if (input.good()) { + std::copy(std::istream_iterator(input), std::istream_iterator(), std::back_inserter(cache_)); + logging::log(logging::Level::kDEBUG, "Cache read"); + } + length = cache_.size(); + return length ? cache_.data() : nullptr; + } + + void writeCalibrationCache(const void* cache, size_t length) noexcept override { + std::ofstream cache_file(cache_file_path_, std::ios::binary); + cache_file.write(reinterpret_cast(cache), length); + std::stringstream ss; + ss << "Saved Calibration Cache to " << cache_file_path_; + logging::log(logging::Level::kINFO, ss.str()); + } + + operator nvinfer1::IInt8Calibrator*() { + return reinterpret_cast(this); + } + + private: + const std::string& cache_file_path_; + size_t cache_size_ = 0; + std::vector cache_; + }; + + template + inline Int8Calibrator make_int8_calibrator( + DataLoader dataloader, + const std::string& cache_file_path, + bool use_cache) { + return Int8Calibrator(std::move(dataloader), cache_file_path, use_cache); + } + + template + inline Int8CacheCalibrator make_int8_cache_calibrator(const std::string& cache_file_path) { + return Int8CacheCalibrator(cache_file_path); + } + + } // namespace ptq + } // namespace torch_tensorrt diff --git a/docs/v1.2.0/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst.txt b/docs/v1.2.0/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst.txt new file mode 100644 index 0000000000..6526f355aa --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst.txt @@ -0,0 +1,294 @@ + +.. _program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h: + +Program Listing for File torch_tensorrt.h +========================================= + +|exhale_lsh| :ref:`Return to documentation for file ` (``cpp/include/torch_tensorrt/torch_tensorrt.h``) + +.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS + +.. code-block:: cpp + + /* + * Copyright (c) NVIDIA Corporation. + * All rights reserved. + * + * This library is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + + #pragma once + + #include + #include + #include + #include + #include + #include + #include "torch/custom_class.h" + + #include "torch_tensorrt/macros.h" + + // Just include the .h? + #ifndef DOXYGEN_SHOULD_SKIP_THIS + namespace torch { + namespace jit { + struct Graph; + struct Module; + } // namespace jit + } // namespace torch + + namespace c10 { + enum class DeviceType : int8_t; + enum class ScalarType : int8_t; + template + class ArrayRef; + } // namespace c10 + + namespace nvinfer1 { + class IInt8Calibrator; + } + #endif // DOXYGEN_SHOULD_SKIP_THIS + + namespace torch_tensorrt { + class DataType { + public: + enum Value : int8_t { + kFloat, + kHalf, + kChar, + kInt, + kBool, + kUnknown + }; + + DataType() = default; + constexpr DataType(Value t) : value(t) {} + TORCHTRT_API DataType(c10::ScalarType t); + operator Value() const { + return value; + } + explicit operator bool() = delete; + constexpr bool operator==(DataType other) const { + return value == other.value; + } + constexpr bool operator==(DataType::Value other) const { + return value == other; + } + constexpr bool operator!=(DataType other) const { + return value != other.value; + } + constexpr bool operator!=(DataType::Value other) const { + return value != other; + } + + private: + friend TORCHTRT_API std::ostream& operator<<(std::ostream& os, const DataType& dtype); + Value value; + }; + + struct Device { + class DeviceType { + public: + enum Value : int8_t { + kGPU, + kDLA, + }; + + DeviceType() = default; + constexpr DeviceType(Value t) : value(t) {} + DeviceType(c10::DeviceType t); + operator Value() const { + return value; + } + explicit operator bool() = delete; + constexpr bool operator==(DeviceType other) const { + return value == other.value; + } + constexpr bool operator!=(DeviceType other) const { + return value != other.value; + } + + private: + Value value; + }; + + DeviceType device_type; + + /* + * Target gpu id + */ + int64_t gpu_id; + + /* + * When using DLA core on NVIDIA AGX platforms gpu_id should be set as Xavier device + */ + int64_t dla_core; + + bool allow_gpu_fallback; + + Device() : device_type(DeviceType::kGPU), gpu_id(0), dla_core(0), allow_gpu_fallback(false) {} + }; + + enum class EngineCapability : int8_t { + kSTANDARD, + kSAFETY, + kDLA_STANDALONE, + }; + + class TensorFormat { + public: + enum Value : int8_t { + kContiguous, + kChannelsLast, + kUnknown, + }; + + TensorFormat() = default; + constexpr TensorFormat(Value t) : value(t) {} + TORCHTRT_API TensorFormat(at::MemoryFormat t); + operator Value() const { + return value; + } + explicit operator bool() = delete; + constexpr bool operator==(TensorFormat other) const { + return value == other.value; + } + constexpr bool operator==(TensorFormat::Value other) const { + return value == other; + } + constexpr bool operator!=(TensorFormat other) const { + return value != other.value; + } + constexpr bool operator!=(TensorFormat::Value other) const { + return value != other; + } + + private: + friend TORCHTRT_API std::ostream& operator<<(std::ostream& os, const TensorFormat& format); + Value value; + }; + + struct Input : torch::CustomClassHolder { + std::vector min_shape; + std::vector opt_shape; + std::vector max_shape; + std::vector shape; + DataType dtype; + TensorFormat format; + + Input() {} + TORCHTRT_API Input(std::vector shape, TensorFormat format = TensorFormat::kContiguous); + + TORCHTRT_API Input(std::vector shape, DataType dtype, TensorFormat format = TensorFormat::kContiguous); + + TORCHTRT_API Input(c10::ArrayRef shape, TensorFormat format = TensorFormat::kContiguous); + + TORCHTRT_API Input(c10::ArrayRef shape, DataType dtype, TensorFormat format = TensorFormat::kContiguous); + + TORCHTRT_API Input( + std::vector min_shape, + std::vector opt_shape, + std::vector max_shape, + TensorFormat format = TensorFormat::kContiguous); + + TORCHTRT_API Input( + std::vector min_shape, + std::vector opt_shape, + std::vector max_shape, + DataType dtype, + TensorFormat format = TensorFormat::kContiguous); + + TORCHTRT_API Input( + c10::ArrayRef min_shape, + c10::ArrayRef opt_shape, + c10::ArrayRef max_shape, + TensorFormat format = TensorFormat::kContiguous); + + TORCHTRT_API Input( + c10::ArrayRef min_shape, + c10::ArrayRef opt_shape, + c10::ArrayRef max_shape, + DataType dtype, + TensorFormat format = TensorFormat::kContiguous); + + TORCHTRT_API Input(at::Tensor tensor); + + private: + friend TORCHTRT_API std::ostream& operator<<(std::ostream& os, const Input& input); + bool input_is_dynamic; + }; + + struct GraphInputs { + torch::jit::IValue input_signature; // nested Input, full input spec + std::vector inputs; // flatten input spec + }; + + TORCHTRT_API std::string get_build_info(); + + TORCHTRT_API void dump_build_info(); + + TORCHTRT_API void set_device(const int gpu_id); + + namespace torchscript { + struct CompileSpec { + TORCHTRT_API CompileSpec(std::vector> fixed_sizes); + + TORCHTRT_API CompileSpec(std::vector> fixed_sizes); + + TORCHTRT_API CompileSpec(std::vector inputs); + + TORCHTRT_API CompileSpec(torch::jit::IValue input_signature); + // Defaults should reflect TensorRT defaults for BuilderConfig + + GraphInputs graph_inputs; + std::set enabled_precisions = {DataType::kFloat}; + + bool disable_tf32 = false; + + bool sparse_weights = false; + + bool refit = false; + + bool debug = false; + + bool truncate_long_and_double = false; + + Device device; + + EngineCapability capability = EngineCapability::kSTANDARD; + + uint64_t num_avg_timing_iters = 1; + + uint64_t workspace_size = 0; + + uint64_t dla_sram_size = 1048576; + + uint64_t dla_local_dram_size = 1073741824; + + uint64_t dla_global_dram_size = 536870912; + + nvinfer1::IInt8Calibrator* ptq_calibrator = nullptr; + + bool require_full_compilation = false; + + uint64_t min_block_size = 3; + + std::vector torch_executed_ops; + + std::vector torch_executed_modules; + }; + + TORCHTRT_API bool check_method_operator_support(const torch::jit::Module& module, std::string method_name); + + TORCHTRT_API torch::jit::Module compile(const torch::jit::Module& module, CompileSpec info); + + TORCHTRT_API std::string convert_method_to_trt_engine( + const torch::jit::Module& module, + std::string method_name, + CompileSpec info); + + TORCHTRT_API torch::jit::Module embed_engine_in_new_module(const std::string& engine, Device device); + } // namespace torchscript + } // namespace torch_tensorrt diff --git a/docs/v1.2.0/_sources/_cpp_api/structtorch__tensorrt_1_1Device.rst.txt b/docs/v1.2.0/_sources/_cpp_api/structtorch__tensorrt_1_1Device.rst.txt new file mode 100644 index 0000000000..a090eaa324 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/structtorch__tensorrt_1_1Device.rst.txt @@ -0,0 +1,27 @@ +.. _exhale_struct_structtorch__tensorrt_1_1Device: + +Struct Device +============= + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Nested Relationships +-------------------- + + +Nested Types +************ + +- :ref:`exhale_class_classtorch__tensorrt_1_1Device_1_1DeviceType` + + +Struct Documentation +-------------------- + + +.. doxygenstruct:: torch_tensorrt::Device + :project: Torch-TensorRT + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/structtorch__tensorrt_1_1GraphInputs.rst.txt b/docs/v1.2.0/_sources/_cpp_api/structtorch__tensorrt_1_1GraphInputs.rst.txt new file mode 100644 index 0000000000..60bc3285c6 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/structtorch__tensorrt_1_1GraphInputs.rst.txt @@ -0,0 +1,17 @@ +.. _exhale_struct_structtorch__tensorrt_1_1GraphInputs: + +Struct GraphInputs +================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Struct Documentation +-------------------- + + +.. doxygenstruct:: torch_tensorrt::GraphInputs + :project: Torch-TensorRT + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/structtorch__tensorrt_1_1Input.rst.txt b/docs/v1.2.0/_sources/_cpp_api/structtorch__tensorrt_1_1Input.rst.txt new file mode 100644 index 0000000000..74c594cd94 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/structtorch__tensorrt_1_1Input.rst.txt @@ -0,0 +1,26 @@ +.. _exhale_struct_structtorch__tensorrt_1_1Input: + +Struct Input +============ + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Inheritance Relationships +------------------------- + +Base Type +********* + +- ``public CustomClassHolder`` + + +Struct Documentation +-------------------- + + +.. doxygenstruct:: torch_tensorrt::Input + :project: Torch-TensorRT + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/structtorch__tensorrt_1_1torchscript_1_1CompileSpec.rst.txt b/docs/v1.2.0/_sources/_cpp_api/structtorch__tensorrt_1_1torchscript_1_1CompileSpec.rst.txt new file mode 100644 index 0000000000..31f2296658 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/structtorch__tensorrt_1_1torchscript_1_1CompileSpec.rst.txt @@ -0,0 +1,17 @@ +.. _exhale_struct_structtorch__tensorrt_1_1torchscript_1_1CompileSpec: + +Struct CompileSpec +================== + +- Defined in :ref:`file_cpp_include_torch_tensorrt_torch_tensorrt.h` + + +Struct Documentation +-------------------- + + +.. doxygenstruct:: torch_tensorrt::torchscript::CompileSpec + :project: Torch-TensorRT + :members: + :protected-members: + :undoc-members: \ No newline at end of file diff --git a/docs/v1.2.0/_sources/_cpp_api/torch_tensort_cpp.rst.txt b/docs/v1.2.0/_sources/_cpp_api/torch_tensort_cpp.rst.txt new file mode 100644 index 0000000000..1b34d45a77 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/torch_tensort_cpp.rst.txt @@ -0,0 +1,10 @@ +====================== +Torch-TensorRT C++ API +====================== + +.. include:: class_view_hierarchy.rst.include + +.. include:: file_view_hierarchy.rst.include + +.. include:: unabridged_api.rst.include + diff --git a/docs/v1.2.0/_sources/_cpp_api/unabridged_api.rst.txt b/docs/v1.2.0/_sources/_cpp_api/unabridged_api.rst.txt new file mode 100644 index 0000000000..29689c465f --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/unabridged_api.rst.txt @@ -0,0 +1,213 @@ + +Full API +-------- + +Namespaces +********** + + +.. toctree:: + :maxdepth: 5 + + namespace_torch_tensorrt.rst + +.. toctree:: + :maxdepth: 5 + + namespace_torch_tensorrt__logging.rst + +.. toctree:: + :maxdepth: 5 + + namespace_torch_tensorrt__ptq.rst + +.. toctree:: + :maxdepth: 5 + + namespace_torch_tensorrt__torchscript.rst + +Classes and Structs +******************* + + +.. toctree:: + :maxdepth: 5 + + structtorch__tensorrt_1_1Device.rst + +.. toctree:: + :maxdepth: 5 + + structtorch__tensorrt_1_1Input.rst + +.. toctree:: + :maxdepth: 5 + + structtorch__tensorrt_1_1torchscript_1_1CompileSpec.rst + +.. toctree:: + :maxdepth: 5 + + classtorch__tensorrt_1_1DataType.rst + +.. toctree:: + :maxdepth: 5 + + classtorch__tensorrt_1_1Device_1_1DeviceType.rst + +.. toctree:: + :maxdepth: 5 + + classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator.rst + +.. toctree:: + :maxdepth: 5 + + classtorch__tensorrt_1_1ptq_1_1Int8Calibrator.rst + +.. toctree:: + :maxdepth: 5 + + classtorch__tensorrt_1_1TensorFormat.rst + +Enums +***** + + +.. toctree:: + :maxdepth: 5 + + enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb.rst + +.. toctree:: + :maxdepth: 5 + + enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558.rst + +Functions +********* + + +.. toctree:: + :maxdepth: 5 + + function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1.rst + +.. toctree:: + :maxdepth: 5 + + function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528.rst + +.. toctree:: + :maxdepth: 5 + + function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a.rst + +.. toctree:: + :maxdepth: 5 + + function_logging_8h_1a0593f776f469c20469e2f729fc7861a3.rst + +.. toctree:: + :maxdepth: 5 + + function_logging_8h_1a0c012cb374addd90eb1f42eaec570650.rst + +.. toctree:: + :maxdepth: 5 + + function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8.rst + +.. toctree:: + :maxdepth: 5 + + function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5.rst + +.. toctree:: + :maxdepth: 5 + + function_logging_8h_1af8f3443813315af7901903d25dd495cc.rst + +.. toctree:: + :maxdepth: 5 + + function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2.rst + +.. toctree:: + :maxdepth: 5 + + function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa.rst + +.. toctree:: + :maxdepth: 5 + + function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039.rst + +.. toctree:: + :maxdepth: 5 + + function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384.rst + +.. toctree:: + :maxdepth: 5 + + function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797.rst + +.. toctree:: + :maxdepth: 5 + + function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9.rst + +.. toctree:: + :maxdepth: 5 + + function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2.rst + +.. toctree:: + :maxdepth: 5 + + function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef.rst + +Defines +******* + + +.. toctree:: + :maxdepth: 5 + + define_macros_8h_1a18d295a837ac71add5578860b55e5502.rst + +.. toctree:: + :maxdepth: 5 + + define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e.rst + +.. toctree:: + :maxdepth: 5 + + define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827.rst + +.. toctree:: + :maxdepth: 5 + + define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268.rst + +.. toctree:: + :maxdepth: 5 + + define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883.rst + +.. toctree:: + :maxdepth: 5 + + define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b.rst + +.. toctree:: + :maxdepth: 5 + + define_macros_8h_1ad19939408f7be171a74a89928b36eb59.rst + +.. toctree:: + :maxdepth: 5 + + define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da.rst diff --git a/docs/v1.2.0/_sources/_cpp_api/unabridged_orphan.rst.txt b/docs/v1.2.0/_sources/_cpp_api/unabridged_orphan.rst.txt new file mode 100644 index 0000000000..5789e581e8 --- /dev/null +++ b/docs/v1.2.0/_sources/_cpp_api/unabridged_orphan.rst.txt @@ -0,0 +1,48 @@ +:orphan: + + +Full API +======== + +Directories +*********** + + +.. toctree:: + :maxdepth: 5 + + dir_cpp.rst + +.. toctree:: + :maxdepth: 5 + + dir_cpp_include.rst + +.. toctree:: + :maxdepth: 5 + + dir_cpp_include_torch_tensorrt.rst + +Files +***** + + +.. toctree:: + :maxdepth: 5 + + file_cpp_include_torch_tensorrt_logging.h.rst + +.. toctree:: + :maxdepth: 5 + + file_cpp_include_torch_tensorrt_macros.h.rst + +.. toctree:: + :maxdepth: 5 + + file_cpp_include_torch_tensorrt_ptq.h.rst + +.. toctree:: + :maxdepth: 5 + + file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst diff --git a/docs/v1.2.0/_sources/_notebooks/CitriNet-example.ipynb.txt b/docs/v1.2.0/_sources/_notebooks/CitriNet-example.ipynb.txt new file mode 100644 index 0000000000..0573af0176 --- /dev/null +++ b/docs/v1.2.0/_sources/_notebooks/CitriNet-example.ipynb.txt @@ -0,0 +1,964 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Torch-TensorRT Getting Started - CitriNet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "[Citrinet](https://docs.nvidia.com/deeplearning/nemo/user-guide/docs/en/main/asr/models.html#citrinet) is an acoustic model used for the speech to text recognition task. It is a version of [QuartzNet](https://arxiv.org/pdf/1910.10261.pdf) that extends [ContextNet](https://arxiv.org/pdf/2005.03191.pdf), utilizing subword encoding (via Word Piece tokenization) and Squeeze-and-Excitation(SE) mechanism and are therefore smaller than QuartzNet models.\n", + "\n", + "CitriNet models take in audio segments and transcribe them to letter, byte pair, or word piece sequences. \n", + "\n", + "\"alt\"\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for optimizing a pretrained CitriNet model with Torch-TensorRT, and running it to test the speedup obtained.\n", + "\n", + "## Content\n", + "1. [Requirements](#1)\n", + "1. [Download Citrinet model](#2)\n", + "1. [Create Torch-TensorRT modules](#3)\n", + "1. [Benchmark Torch-TensorRT models](#4)\n", + "1. [Conclusion](#5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "Follow the steps in [README](README.md) to prepare a Docker container, within which you can run this notebook. \n", + "This notebook assumes that you are within a Jupyter environment in a docker container with Torch-TensorRT installed, such as an NGC monthly release of `nvcr.io/nvidia/pytorch:-py3` (where `yy` indicates the last two numbers of a calendar year, and `mm` indicates the month in two-digit numerical form)\n", + "\n", + "Now that you are in the docker, the next step is to install the required dependencies." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: wget in /opt/conda/lib/python3.8/site-packages (3.2)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Hit:1 http://security.ubuntu.com/ubuntu focal-security InRelease\n", + "Hit:2 http://archive.ubuntu.com/ubuntu focal InRelease\n", + "Hit:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease\n", + "Hit:4 http://archive.ubuntu.com/ubuntu focal-backports InRelease\n", + "Reading package lists... Done\n", + "Reading package lists... Done\n", + "Building dependency tree \n", + "Reading state information... Done\n", + "libsndfile1 is already the newest version (1.0.28-7ubuntu0.1).\n", + "ffmpeg is already the newest version (7:4.2.4-1ubuntu0.1).\n", + "0 upgraded, 0 newly installed, 0 to remove and 22 not upgraded.\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: Cython in /opt/conda/lib/python3.8/site-packages (0.29.28)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: nemo_toolkit[all]==1.5.1 in /opt/conda/lib/python3.8/site-packages (1.5.1)\n", + "Requirement already satisfied: numpy>=1.18.2 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.22.3)\n", + "Requirement already satisfied: onnx>=1.7.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.10.1)\n", + "Requirement already satisfied: python-dateutil in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.8.2)\n", + "Requirement already satisfied: tqdm>=4.41.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.63.0)\n", + "Requirement already satisfied: sentencepiece<1.0.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.96)\n", + "Requirement already satisfied: wget in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.2)\n", + "Requirement already satisfied: numba in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.53.1)\n", + "Requirement already satisfied: torch in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.12.0a0+2c916ef)\n", + "Requirement already satisfied: unidecode in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.3.4)\n", + "Requirement already satisfied: frozendict in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.3.2)\n", + "Requirement already satisfied: wrapt in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.14.0)\n", + "Requirement already satisfied: scikit-learn in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.24.2)\n", + "Requirement already satisfied: ruamel.yaml in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.17.21)\n", + "Requirement already satisfied: pesq in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.0.3)\n", + "Requirement already satisfied: torchvision in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.13.0a0)\n", + "Requirement already satisfied: gdown in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.4.0)\n", + "Requirement already satisfied: editdistance in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.6.0)\n", + "Requirement already satisfied: boto3 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.21.45)\n", + "Requirement already satisfied: isort[requirements]<5 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.3.21)\n", + "Requirement already satisfied: hydra-core>=1.1.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.1.2)\n", + "Requirement already satisfied: youtokentome>=1.0.5 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.0.6)\n", + "Requirement already satisfied: pytorch-lightning>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.6.1)\n", + "Requirement already satisfied: jieba in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.42.1)\n", + "Requirement already satisfied: fasttext in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.9.2)\n", + "Requirement already satisfied: soundfile in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.10.3.post1)\n", + "Requirement already satisfied: kaldiio in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.17.2)\n", + "Requirement already satisfied: pangu in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.0.6.1)\n", + "Requirement already satisfied: kaldi-python-io in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.2.2)\n", + "Requirement already satisfied: parameterized in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.8.1)\n", + "Requirement already satisfied: h5py in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.6.0)\n", + "Requirement already satisfied: rapidfuzz in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.10)\n", + "Requirement already satisfied: marshmallow in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.15.0)\n", + "Requirement already satisfied: opencc in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.1.3)\n", + "Requirement already satisfied: braceexpand in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.7)\n", + "Requirement already satisfied: omegaconf>=2.1.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.1.2)\n", + "Requirement already satisfied: sphinx in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.4.0)\n", + "Requirement already satisfied: pillow in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (9.0.0)\n", + "Requirement already satisfied: wordninja==2.0.0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.0)\n", + "Requirement already satisfied: torch-stft in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.4)\n", + "Requirement already satisfied: sox in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.4.1)\n", + "Requirement already satisfied: librosa in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.9.1)\n", + "Requirement already satisfied: regex in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2022.3.15)\n", + "Requirement already satisfied: sacrebleu[ja] in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.0)\n", + "Requirement already satisfied: black==19.10b0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (19.10b0)\n", + "Requirement already satisfied: pydub in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.25.1)\n", + "Requirement already satisfied: sphinxcontrib-bibtex in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.4.2)\n", + "Requirement already satisfied: inflect in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (5.5.2)\n", + "Requirement already satisfied: pyannote.core in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.4)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (21.3)\n", + "Requirement already satisfied: kaldi-io in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.9.4)\n", + "Requirement already satisfied: pyannote.metrics in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.2)\n", + "Requirement already satisfied: g2p-en in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.1.0)\n", + "Requirement already satisfied: matplotlib in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.5.1)\n", + "Requirement already satisfied: torchmetrics>=0.4.1rc0 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.8.0)\n", + "Requirement already satisfied: nltk>=3.6.5 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (3.7)\n", + "Requirement already satisfied: pyyaml<6 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (5.4.1)\n", + "Requirement already satisfied: scipy in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.6.3)\n", + "Requirement already satisfied: ipywidgets in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (7.7.0)\n", + "Requirement already satisfied: pytest in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (6.2.5)\n", + "Requirement already satisfied: pandas in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (1.3.5)\n", + "Requirement already satisfied: pytest-runner in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (6.0.0)\n", + "Requirement already satisfied: transformers>=4.0.1 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (4.18.0)\n", + "Requirement already satisfied: sacremoses>=0.0.43 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.0.49)\n", + "Requirement already satisfied: pystoi in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.3.3)\n", + "Requirement already satisfied: attrdict in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (2.0.1)\n", + "Requirement already satisfied: webdataset<=0.1.62,>=0.1.48 in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.1.62)\n", + "Requirement already satisfied: wandb in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.12.15)\n", + "Requirement already satisfied: pypinyin in /opt/conda/lib/python3.8/site-packages (from nemo_toolkit[all]==1.5.1) (0.46.0)\n", + "Requirement already satisfied: attrs>=18.1.0 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (21.4.0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: appdirs in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (1.4.4)\n", + "Requirement already satisfied: typed-ast>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (1.5.3)\n", + "Requirement already satisfied: pathspec<1,>=0.6 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (0.9.0)\n", + "Requirement already satisfied: click>=6.5 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (8.0.4)\n", + "Requirement already satisfied: toml>=0.9.4 in /opt/conda/lib/python3.8/site-packages (from black==19.10b0->nemo_toolkit[all]==1.5.1) (0.10.2)\n", + "Requirement already satisfied: antlr4-python3-runtime==4.8 in /opt/conda/lib/python3.8/site-packages (from hydra-core>=1.1.0->nemo_toolkit[all]==1.5.1) (4.8)\n", + "Requirement already satisfied: importlib-resources<5.3 in /opt/conda/lib/python3.8/site-packages (from hydra-core>=1.1.0->nemo_toolkit[all]==1.5.1) (5.2.3)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources<5.3->hydra-core>=1.1.0->nemo_toolkit[all]==1.5.1) (3.7.0)\n", + "Requirement already satisfied: pip-api in /opt/conda/lib/python3.8/site-packages (from isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.0.29)\n", + "Requirement already satisfied: pipreqs in /opt/conda/lib/python3.8/site-packages (from isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.4.11)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (4.31.2)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (1.4.0)\n", + "Requirement already satisfied: pyparsing>=2.2.1 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (3.0.7)\n", + "Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.8/site-packages (from matplotlib->nemo_toolkit[all]==1.5.1) (0.11.0)\n", + "Requirement already satisfied: joblib in /opt/conda/lib/python3.8/site-packages (from nltk>=3.6.5->nemo_toolkit[all]==1.5.1) (1.1.0)\n", + "Requirement already satisfied: typing-extensions>=3.6.2.1 in /opt/conda/lib/python3.8/site-packages (from onnx>=1.7.0->nemo_toolkit[all]==1.5.1) (4.1.1)\n", + "Requirement already satisfied: six in /opt/conda/lib/python3.8/site-packages (from onnx>=1.7.0->nemo_toolkit[all]==1.5.1) (1.16.0)\n", + "Requirement already satisfied: protobuf>=3.12.2 in /opt/conda/lib/python3.8/site-packages (from onnx>=1.7.0->nemo_toolkit[all]==1.5.1) (3.19.4)\n", + "Requirement already satisfied: pyDeprecate<0.4.0,>=0.3.1 in /opt/conda/lib/python3.8/site-packages (from pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.3.2)\n", + "Requirement already satisfied: tensorboard>=2.2.0 in /opt/conda/lib/python3.8/site-packages (from pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.8.0)\n", + "Requirement already satisfied: fsspec[http]!=2021.06.0,>=2021.05.0 in /opt/conda/lib/python3.8/site-packages (from pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2022.2.0)\n", + "Requirement already satisfied: requests in /opt/conda/lib/python3.8/site-packages (from fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.27.1)\n", + "Requirement already satisfied: aiohttp in /opt/conda/lib/python3.8/site-packages (from fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.8.1)\n", + "Requirement already satisfied: werkzeug>=0.11.15 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.0.3)\n", + "Requirement already satisfied: markdown>=2.6.8 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.3.6)\n", + "Requirement already satisfied: setuptools>=41.0.0 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (59.5.0)\n", + "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.4.6)\n", + "Requirement already satisfied: google-auth<3,>=1.6.3 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.6.2)\n", + "Requirement already satisfied: wheel>=0.26 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.37.1)\n", + "Requirement already satisfied: grpcio>=1.24.3 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.44.0)\n", + "Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.6.1)\n", + "Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.8.1)\n", + "Requirement already satisfied: absl-py>=0.4 in /opt/conda/lib/python3.8/site-packages (from tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.0.0)\n", + "Requirement already satisfied: cachetools<6.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (5.0.0)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in /opt/conda/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.2.8)\n", + "Requirement already satisfied: rsa<5,>=3.1.4 in /opt/conda/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (4.8)\n", + "Requirement already satisfied: requests-oauthlib>=0.7.0 in /opt/conda/lib/python3.8/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.3.1)\n", + "Requirement already satisfied: importlib-metadata>=4.4 in /opt/conda/lib/python3.8/site-packages (from markdown>=2.6.8->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (4.11.3)\n", + "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /opt/conda/lib/python3.8/site-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (0.4.8)\n", + "Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2.0.12)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (2021.10.8)\n", + "Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.3)\n", + "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.26.8)\n", + "Requirement already satisfied: oauthlib>=3.0.0 in /opt/conda/lib/python3.8/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=2.2.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (3.2.0)\n", + "Requirement already satisfied: huggingface-hub<1.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from transformers>=4.0.1->nemo_toolkit[all]==1.5.1) (0.5.1)\n", + "Requirement already satisfied: tokenizers!=0.11.3,<0.13,>=0.11.1 in /opt/conda/lib/python3.8/site-packages (from transformers>=4.0.1->nemo_toolkit[all]==1.5.1) (0.12.1)\n", + "Requirement already satisfied: filelock in /opt/conda/lib/python3.8/site-packages (from transformers>=4.0.1->nemo_toolkit[all]==1.5.1) (3.6.0)\n", + "Requirement already satisfied: frozenlist>=1.1.1 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.3.0)\n", + "Requirement already satisfied: yarl<2.0,>=1.0 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.7.2)\n", + "Requirement already satisfied: async-timeout<5.0,>=4.0.0a3 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (4.0.2)\n", + "Requirement already satisfied: multidict<7.0,>=4.5 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (6.0.2)\n", + "Requirement already satisfied: aiosignal>=1.1.2 in /opt/conda/lib/python3.8/site-packages (from aiohttp->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.2.0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: s3transfer<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from boto3->nemo_toolkit[all]==1.5.1) (0.5.2)\n", + "Requirement already satisfied: botocore<1.25.0,>=1.24.45 in /opt/conda/lib/python3.8/site-packages (from boto3->nemo_toolkit[all]==1.5.1) (1.24.45)\n", + "Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /opt/conda/lib/python3.8/site-packages (from boto3->nemo_toolkit[all]==1.5.1) (1.0.0)\n", + "Requirement already satisfied: pybind11>=2.2 in /opt/conda/lib/python3.8/site-packages (from fasttext->nemo_toolkit[all]==1.5.1) (2.9.1)\n", + "Requirement already satisfied: distance>=0.1.3 in /opt/conda/lib/python3.8/site-packages (from g2p-en->nemo_toolkit[all]==1.5.1) (0.1.3)\n", + "Requirement already satisfied: beautifulsoup4 in /opt/conda/lib/python3.8/site-packages (from gdown->nemo_toolkit[all]==1.5.1) (4.10.0)\n", + "Requirement already satisfied: soupsieve>1.2 in /opt/conda/lib/python3.8/site-packages (from beautifulsoup4->gdown->nemo_toolkit[all]==1.5.1) (2.3.1)\n", + "Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.0)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (8.1.1)\n", + "Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (6.9.2)\n", + "Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (1.1.0)\n", + "Requirement already satisfied: widgetsnbextension~=3.6.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (3.6.0)\n", + "Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (5.1.1)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets->nemo_toolkit[all]==1.5.1) (5.2.0)\n", + "Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (7.1.2)\n", + "Requirement already satisfied: psutil in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (5.9.0)\n", + "Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (6.1)\n", + "Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (1.5.1)\n", + "Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (1.5.4)\n", + "Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (0.1.3)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.7.5)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (5.1.1)\n", + "Requirement already satisfied: pygments>=2.4.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.11.2)\n", + "Requirement already satisfied: stack-data in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.0)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (3.0.27)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.0)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.18.1)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (4.8.0)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.8.3)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (0.4)\n", + "Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (22.3.0)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]==1.5.1) (4.9.2)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets->nemo_toolkit[all]==1.5.1) (4.4.0)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.18.1)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.5)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (6.4.1)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (1.8.0)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.13.1)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.13.3)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (3.0.3)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (6.4.4)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (21.3.0)\n", + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.21)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.1.1)\n", + "Requirement already satisfied: resampy>=0.2.2 in /opt/conda/lib/python3.8/site-packages (from librosa->nemo_toolkit[all]==1.5.1) (0.2.2)\n", + "Requirement already satisfied: pooch>=1.0 in /opt/conda/lib/python3.8/site-packages (from librosa->nemo_toolkit[all]==1.5.1) (1.6.0)\n", + "Requirement already satisfied: audioread>=2.1.5 in /opt/conda/lib/python3.8/site-packages (from librosa->nemo_toolkit[all]==1.5.1) (2.1.9)\n", + "Requirement already satisfied: llvmlite<0.37,>=0.36.0rc1 in /opt/conda/lib/python3.8/site-packages (from numba->nemo_toolkit[all]==1.5.1) (0.36.0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: threadpoolctl>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from scikit-learn->nemo_toolkit[all]==1.5.1) (3.1.0)\n", + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.7.1)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.5.13)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (4.1.0)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.8.4)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (1.5.0)\n", + "Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.6.0)\n", + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.1.2)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.5.1)\n", + "Requirement already satisfied: pytz>=2017.3 in /opt/conda/lib/python3.8/site-packages (from pandas->nemo_toolkit[all]==1.5.1) (2021.3)\n", + "Requirement already satisfied: pip in /opt/conda/lib/python3.8/site-packages (from pip-api->isort[requirements]<5->nemo_toolkit[all]==1.5.1) (21.2.4)\n", + "Requirement already satisfied: yarg in /opt/conda/lib/python3.8/site-packages (from pipreqs->isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.1.9)\n", + "Requirement already satisfied: docopt in /opt/conda/lib/python3.8/site-packages (from pipreqs->isort[requirements]<5->nemo_toolkit[all]==1.5.1) (0.6.2)\n", + "Requirement already satisfied: simplejson>=3.8.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.core->nemo_toolkit[all]==1.5.1) (3.17.6)\n", + "Requirement already satisfied: sortedcontainers>=2.0.4 in /opt/conda/lib/python3.8/site-packages (from pyannote.core->nemo_toolkit[all]==1.5.1) (2.4.0)\n", + "Requirement already satisfied: tabulate>=0.7.7 in /opt/conda/lib/python3.8/site-packages (from pyannote.metrics->nemo_toolkit[all]==1.5.1) (0.8.9)\n", + "Requirement already satisfied: pyannote.database>=4.0.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.metrics->nemo_toolkit[all]==1.5.1) (4.1.3)\n", + "Requirement already satisfied: sympy>=1.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.metrics->nemo_toolkit[all]==1.5.1) (1.10.1)\n", + "Requirement already satisfied: typer[all]>=0.2.1 in /opt/conda/lib/python3.8/site-packages (from pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (0.4.0)\n", + "Requirement already satisfied: mpmath>=0.19 in /opt/conda/lib/python3.8/site-packages (from sympy>=1.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (1.2.1)\n", + "Requirement already satisfied: colorama<0.5.0,>=0.4.3 in /opt/conda/lib/python3.8/site-packages (from typer[all]>=0.2.1->pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (0.4.4)\n", + "Requirement already satisfied: shellingham<2.0.0,>=1.3.0 in /opt/conda/lib/python3.8/site-packages (from typer[all]>=0.2.1->pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all]==1.5.1) (1.4.0)\n", + "Requirement already satisfied: py>=1.8.2 in /opt/conda/lib/python3.8/site-packages (from pytest->nemo_toolkit[all]==1.5.1) (1.11.0)\n", + "Requirement already satisfied: iniconfig in /opt/conda/lib/python3.8/site-packages (from pytest->nemo_toolkit[all]==1.5.1) (1.1.1)\n", + "Requirement already satisfied: pluggy<2.0,>=0.12 in /opt/conda/lib/python3.8/site-packages (from pytest->nemo_toolkit[all]==1.5.1) (1.0.0)\n", + "Requirement already satisfied: jarowinkler<1.1.0,>=1.0.2 in /opt/conda/lib/python3.8/site-packages (from rapidfuzz->nemo_toolkit[all]==1.5.1) (1.0.2)\n", + "Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /opt/conda/lib/python3.8/site-packages (from requests->fsspec[http]!=2021.06.0,>=2021.05.0->pytorch-lightning>=1.5.0->nemo_toolkit[all]==1.5.1) (1.7.1)\n", + "Requirement already satisfied: ruamel.yaml.clib>=0.2.6 in /opt/conda/lib/python3.8/site-packages (from ruamel.yaml->nemo_toolkit[all]==1.5.1) (0.2.6)\n", + "Requirement already satisfied: portalocker in /opt/conda/lib/python3.8/site-packages (from sacrebleu[ja]->nemo_toolkit[all]==1.5.1) (2.4.0)\n", + "Requirement already satisfied: ipadic<2.0,>=1.0 in /opt/conda/lib/python3.8/site-packages (from sacrebleu[ja]->nemo_toolkit[all]==1.5.1) (1.0.0)\n", + "Requirement already satisfied: mecab-python3==1.0.3 in /opt/conda/lib/python3.8/site-packages (from sacrebleu[ja]->nemo_toolkit[all]==1.5.1) (1.0.3)\n", + "Requirement already satisfied: sphinxcontrib-htmlhelp>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (2.0.0)\n", + "Requirement already satisfied: alabaster<0.8,>=0.7 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (0.7.12)\n", + "Requirement already satisfied: babel>=1.3 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (2.9.1)\n", + "Requirement already satisfied: sphinxcontrib-serializinghtml>=1.1.5 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.1.5)\n", + "Requirement already satisfied: sphinxcontrib-devhelp in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.2)\n", + "Requirement already satisfied: sphinxcontrib-jsmath in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.1)\n", + "Requirement already satisfied: sphinxcontrib-qthelp in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.3)\n", + "Requirement already satisfied: snowballstemmer>=1.1 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (2.2.0)\n", + "Requirement already satisfied: imagesize in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.3.0)\n", + "Requirement already satisfied: sphinxcontrib-applehelp in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (1.0.2)\n", + "Requirement already satisfied: docutils<0.18,>=0.14 in /opt/conda/lib/python3.8/site-packages (from sphinx->nemo_toolkit[all]==1.5.1) (0.17.1)\n", + "Requirement already satisfied: pybtex-docutils>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from sphinxcontrib-bibtex->nemo_toolkit[all]==1.5.1) (1.0.1)\n", + "Requirement already satisfied: pybtex>=0.24 in /opt/conda/lib/python3.8/site-packages (from sphinxcontrib-bibtex->nemo_toolkit[all]==1.5.1) (0.24.0)\n", + "Requirement already satisfied: latexcodec>=1.0.4 in /opt/conda/lib/python3.8/site-packages (from pybtex>=0.24->sphinxcontrib-bibtex->nemo_toolkit[all]==1.5.1) (2.0.1)\n", + "Requirement already satisfied: pure-eval in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.2.2)\n", + "Requirement already satisfied: asttokens in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (2.0.5)\n", + "Requirement already satisfied: executing in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]==1.5.1) (0.8.3)\n", + "Requirement already satisfied: pathtools in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (0.1.2)\n", + "Requirement already satisfied: setproctitle in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (1.2.3)\n", + "Requirement already satisfied: GitPython>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (3.1.27)\n", + "Requirement already satisfied: sentry-sdk>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (1.5.10)\n", + "Requirement already satisfied: shortuuid>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (1.0.8)\n", + "Requirement already satisfied: docker-pycreds>=0.4.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (0.4.0)\n", + "Requirement already satisfied: promise<3,>=2.0 in /opt/conda/lib/python3.8/site-packages (from wandb->nemo_toolkit[all]==1.5.1) (2.3)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: gitdb<5,>=4.0.1 in /opt/conda/lib/python3.8/site-packages (from GitPython>=1.0.0->wandb->nemo_toolkit[all]==1.5.1) (4.0.9)\n", + "Requirement already satisfied: smmap<6,>=3.0.1 in /opt/conda/lib/python3.8/site-packages (from gitdb<5,>=4.0.1->GitPython>=1.0.0->wandb->nemo_toolkit[all]==1.5.1) (5.0.0)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "# Install dependencies\n", + "!pip install wget\n", + "!apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y libsndfile1 ffmpeg\n", + "!pip install Cython\n", + "\n", + "## Install NeMo\n", + "!pip install nemo_toolkit[all]==1.5.1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 2. Download Citrinet model\n", + "\n", + "Next, we download a pretrained Nemo Citrinet model and convert it to a Torchscript module:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import nemo\n", + "import torch\n", + "\n", + "import nemo.collections.asr as nemo_asr\n", + "from nemo.core import typecheck\n", + "typecheck.set_typecheck_enabled(False) " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading and saving stt_en_citrinet_256...\n", + "[NeMo I 2022-04-21 23:12:45 cloud:56] Found existing object /root/.cache/torch/NeMo/NeMo_1.5.1/stt_en_citrinet_256/91a9cc5850784b2065e8a0aa3d526fd9/stt_en_citrinet_256.nemo.\n", + "[NeMo I 2022-04-21 23:12:45 cloud:62] Re-using file from: /root/.cache/torch/NeMo/NeMo_1.5.1/stt_en_citrinet_256/91a9cc5850784b2065e8a0aa3d526fd9/stt_en_citrinet_256.nemo\n", + "[NeMo I 2022-04-21 23:12:45 common:728] Instantiating model from pre-trained checkpoint\n", + "[NeMo I 2022-04-21 23:12:46 mixins:146] Tokenizer SentencePieceTokenizer initialized with 1024 tokens\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[NeMo W 2022-04-21 23:12:47 modelPT:130] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.\n", + " Train config : \n", + " manifest_filepath: null\n", + " sample_rate: 16000\n", + " batch_size: 32\n", + " trim_silence: true\n", + " max_duration: 16.7\n", + " shuffle: true\n", + " is_tarred: false\n", + " tarred_audio_filepaths: null\n", + " use_start_end_token: false\n", + " \n", + "[NeMo W 2022-04-21 23:12:47 modelPT:137] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s). \n", + " Validation config : \n", + " manifest_filepath: null\n", + " sample_rate: 16000\n", + " batch_size: 32\n", + " shuffle: false\n", + " use_start_end_token: false\n", + " \n", + "[NeMo W 2022-04-21 23:12:47 modelPT:143] Please call the ModelPT.setup_test_data() or ModelPT.setup_multiple_test_data() method and provide a valid configuration file to setup the test data loader(s).\n", + " Test config : \n", + " manifest_filepath: null\n", + " sample_rate: 16000\n", + " batch_size: 32\n", + " shuffle: false\n", + " use_start_end_token: false\n", + " \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[NeMo I 2022-04-21 23:12:47 features:265] PADDING: 16\n", + "[NeMo I 2022-04-21 23:12:47 features:282] STFT using torch\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[NeMo W 2022-04-21 23:12:47 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/nemo/collections/asr/parts/preprocessing/features.py:315: FutureWarning: Pass sr=16000, n_fft=512 as keyword args. From version 0.10 passing these as positional arguments will result in an error\n", + " librosa.filters.mel(sample_rate, self.n_fft, n_mels=nfilt, fmin=lowfreq, fmax=highfreq), dtype=torch.float\n", + " \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[NeMo I 2022-04-21 23:12:49 save_restore_connector:149] Model EncDecCTCModelBPE was successfully restored from /root/.cache/torch/NeMo/NeMo_1.5.1/stt_en_citrinet_256/91a9cc5850784b2065e8a0aa3d526fd9/stt_en_citrinet_256.nemo.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[NeMo W 2022-04-21 23:12:49 export_utils:198] Swapped 0 modules\n", + "[NeMo W 2022-04-21 23:12:49 conv_asr:73] Turned off 235 masked convolutions\n", + "[NeMo W 2022-04-21 23:12:49 export_utils:198] Swapped 0 modules\n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/jit/_trace.py:916: UserWarning: `optimize` is deprecated and has no effect. Use `with torch.jit.optimized_execution() instead\n", + " warnings.warn(\n", + " \n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:668: LightningDeprecationWarning: The `LightningModule.model_size` property was deprecated in v1.5 and will be removed in v1.7. Please use the `pytorch_lightning.utilities.memory.get_model_size_mb`.\n", + " if hasattr(mod, name):\n", + " \n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:669: LightningDeprecationWarning: The `LightningModule.model_size` property was deprecated in v1.5 and will be removed in v1.7. Please use the `pytorch_lightning.utilities.memory.get_model_size_mb`.\n", + " item = getattr(mod, name)\n", + " \n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:668: LightningDeprecationWarning: `LightningModule.use_amp` was deprecated in v1.6 and will be removed in v1.8. Please use `Trainer.amp_backend`.\n", + " if hasattr(mod, name):\n", + " \n", + "[NeMo W 2022-04-21 23:12:50 nemo_logging:349] /opt/conda/lib/python3.8/site-packages/torch/_jit_internal.py:669: LightningDeprecationWarning: `LightningModule.use_amp` was deprecated in v1.6 and will be removed in v1.8. Please use `Trainer.amp_backend`.\n", + " item = getattr(mod, name)\n", + " \n" + ] + }, + { + "data": { + "text/plain": [ + "(['stt_en_citrinet_256.ts'],\n", + " ['nemo.collections.asr.models.ctc_bpe_models.EncDecCTCModelBPE exported to ONNX'])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "variant = 'stt_en_citrinet_256'\n", + "\n", + "print(f\"Downloading and saving {variant}...\")\n", + "asr_model = nemo_asr.models.EncDecCTCModelBPE.from_pretrained(model_name=variant)\n", + "asr_model.export(f\"{variant}.ts\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Benchmark utility\n", + "\n", + "Let us define a helper benchmarking function, then benchmark the original Pytorch model." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading model: stt_en_citrinet_256.ts\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256.ts =================================\n", + "batch size=1, num iterations=50\n", + " Median samples/s: 102.0, mean: 102.0\n", + " Median latency (s): 0.009802, mean: 0.009803, 99th_p: 0.009836, std_dev: 0.000014\n", + "\n", + "Loading model: stt_en_citrinet_256.ts\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256.ts =================================\n", + "batch size=8, num iterations=50\n", + " Median samples/s: 429.1, mean: 429.1\n", + " Median latency (s): 0.018642, mean: 0.018643, 99th_p: 0.018670, std_dev: 0.000014\n", + "\n", + "Loading model: stt_en_citrinet_256.ts\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256.ts =================================\n", + "batch size=32, num iterations=50\n", + " Median samples/s: 551.3, mean: 551.2\n", + " Median latency (s): 0.058047, mean: 0.058053, 99th_p: 0.058375, std_dev: 0.000106\n", + "\n", + "Loading model: stt_en_citrinet_256.ts\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256.ts =================================\n", + "batch size=128, num iterations=50\n", + " Median samples/s: 594.1, mean: 594.1\n", + " Median latency (s): 0.215434, mean: 0.215446, 99th_p: 0.215806, std_dev: 0.000116\n", + "\n" + ] + } + ], + "source": [ + "from __future__ import print_function\n", + "from __future__ import absolute_import\n", + "from __future__ import division\n", + "\n", + "import argparse\n", + "import timeit\n", + "import numpy as np\n", + "import torch\n", + "import torch_tensorrt as trtorch\n", + "import torch.backends.cudnn as cudnn\n", + "\n", + "def benchmark(model, input_tensor, num_loops, model_name, batch_size):\n", + " def timeGraph(model, input_tensor, num_loops):\n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(20):\n", + " features = model(input_tensor)\n", + "\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(num_loops):\n", + " start_time = timeit.default_timer()\n", + " features = model(input_tensor)\n", + " torch.cuda.synchronize()\n", + " end_time = timeit.default_timer()\n", + " timings.append(end_time - start_time)\n", + " # print(\"Iteration {}: {:.6f} s\".format(i, end_time - start_time))\n", + " return timings\n", + " def printStats(graphName, timings, batch_size):\n", + " times = np.array(timings)\n", + " steps = len(times)\n", + " speeds = batch_size / times\n", + " time_mean = np.mean(times)\n", + " time_med = np.median(times)\n", + " time_99th = np.percentile(times, 99)\n", + " time_std = np.std(times, ddof=0)\n", + " speed_mean = np.mean(speeds)\n", + " speed_med = np.median(speeds)\n", + " msg = (\"\\n%s =================================\\n\"\n", + " \"batch size=%d, num iterations=%d\\n\"\n", + " \" Median samples/s: %.1f, mean: %.1f\\n\"\n", + " \" Median latency (s): %.6f, mean: %.6f, 99th_p: %.6f, std_dev: %.6f\\n\"\n", + " ) % (graphName,\n", + " batch_size, steps,\n", + " speed_med, speed_mean,\n", + " time_med, time_mean, time_99th, time_std)\n", + " print(msg)\n", + " timings = timeGraph(model, input_tensor, num_loops)\n", + " printStats(model_name, timings, batch_size)\n", + "\n", + "precisions_str = 'fp32' # Precision (default=fp32, fp16)\n", + "variant = 'stt_en_citrinet_256' # Nemo Citrinet variant\n", + "batch_sizes = [1, 8, 32, 128] # Batch sizes (default=1,8,32,128)\n", + "trt = False # If True, infer with Torch-TensorRT engine. Else, infer with Pytorch model.\n", + "precision = torch.float32 if precisions_str =='fp32' else torch.float16\n", + "\n", + "for batch_size in batch_sizes:\n", + " if trt:\n", + " model_name = f\"{variant}_bs{batch_size}_{precision}.torch-tensorrt\"\n", + " else:\n", + " model_name = f\"{variant}.ts\"\n", + "\n", + " print(f\"Loading model: {model_name}\") \n", + " # Load traced model to CPU first\n", + " model = torch.jit.load(model_name).cuda()\n", + " cudnn.benchmark = True\n", + " # Create random input tensor of certain size\n", + " torch.manual_seed(12345)\n", + " input_shape=(batch_size, 80, 1488)\n", + " input_tensor = torch.randn(input_shape).cuda()\n", + "\n", + " # Timing graph inference\n", + " benchmark(model, input_tensor, 50, model_name, batch_size)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Confirming the GPU we are using here:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Thu Apr 21 23:13:32 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 510.47.03 Driver Version: 510.47.03 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA TITAN V On | 00000000:17:00.0 Off | N/A |\n", + "| 38% 55C P2 42W / 250W | 2462MiB / 12288MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + "| 1 NVIDIA TITAN V On | 00000000:65:00.0 Off | N/A |\n", + "| 28% 39C P8 26W / 250W | 112MiB / 12288MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| 0 N/A N/A 3909 G 4MiB |\n", + "| 0 N/A N/A 6047 C 2453MiB |\n", + "| 1 N/A N/A 3909 G 39MiB |\n", + "| 1 N/A N/A 4161 G 67MiB |\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 3. Create Torch-TensorRT modules\n", + "\n", + "In this step, we optimize the Citrinet Torchscript module with Torch-TensorRT with various precisions and batch sizes." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating Torchscript-TensorRT module for batchsize 1 precision torch.float32\n", + "Generating Torchscript-TensorRT module for batchsize 8 precision torch.float32\n", + "Generating Torchscript-TensorRT module for batchsize 32 precision torch.float32\n", + "Generating Torchscript-TensorRT module for batchsize 128 precision torch.float32\n", + "Generating Torchscript-TensorRT module for batchsize 1 precision torch.float16\n", + "Generating Torchscript-TensorRT module for batchsize 8 precision torch.float16\n", + "Generating Torchscript-TensorRT module for batchsize 32 precision torch.float16\n", + "Generating Torchscript-TensorRT module for batchsize 128 precision torch.float16\n" + ] + } + ], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "import torch_tensorrt as torchtrt\n", + "import argparse\n", + "\n", + "variant = \"stt_en_citrinet_256\"\n", + "precisions = [torch.float, torch.half]\n", + "batch_sizes = [1,8,32,128]\n", + "\n", + "model = torch.jit.load(f\"{variant}.ts\")\n", + "\n", + "for precision in precisions:\n", + " for batch_size in batch_sizes:\n", + " compile_settings = {\n", + " \"inputs\": [torchtrt.Input(shape=[batch_size, 80, 1488])],\n", + " \"enabled_precisions\": {precision},\n", + " \"workspace_size\": 2000000000,\n", + " \"truncate_long_and_double\": True,\n", + " }\n", + " print(f\"Generating Torchscript-TensorRT module for batchsize {batch_size} precision {precision}\")\n", + " trt_ts_module = torchtrt.compile(model, **compile_settings)\n", + " torch.jit.save(trt_ts_module, f\"{variant}_bs{batch_size}_{precision}.torch-tensorrt\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 4. Benchmark Torch-TensorRT models\n", + "\n", + "Finally, we are ready to benchmark the Torch-TensorRT optimized Citrinet models." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP32 (single precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading model: stt_en_citrinet_256_bs1_torch.float32.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs1_torch.float32.torch-tensorrt =================================\n", + "batch size=1, num iterations=50\n", + " Median samples/s: 242.2, mean: 218.0\n", + " Median latency (s): 0.004128, mean: 0.004825, 99th_p: 0.008071, std_dev: 0.001270\n", + "\n", + "Loading model: stt_en_citrinet_256_bs8_torch.float32.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs8_torch.float32.torch-tensorrt =================================\n", + "batch size=8, num iterations=50\n", + " Median samples/s: 729.9, mean: 709.0\n", + " Median latency (s): 0.010961, mean: 0.011388, 99th_p: 0.016114, std_dev: 0.001256\n", + "\n", + "Loading model: stt_en_citrinet_256_bs32_torch.float32.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs32_torch.float32.torch-tensorrt =================================\n", + "batch size=32, num iterations=50\n", + " Median samples/s: 955.6, mean: 953.4\n", + " Median latency (s): 0.033488, mean: 0.033572, 99th_p: 0.035722, std_dev: 0.000545\n", + "\n", + "Loading model: stt_en_citrinet_256_bs128_torch.float32.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs128_torch.float32.torch-tensorrt =================================\n", + "batch size=128, num iterations=50\n", + " Median samples/s: 1065.8, mean: 1069.4\n", + " Median latency (s): 0.120097, mean: 0.119708, 99th_p: 0.121618, std_dev: 0.001260\n", + "\n" + ] + } + ], + "source": [ + "precisions_str = 'fp32' # Precision (default=fp32, fp16)\n", + "batch_sizes = [1, 8, 32, 128] # Batch sizes (default=1,8,32,128)\n", + "precision = torch.float32 if precisions_str =='fp32' else torch.float16\n", + "trt = True\n", + "\n", + "for batch_size in batch_sizes:\n", + " if trt:\n", + " model_name = f\"{variant}_bs{batch_size}_{precision}.torch-tensorrt\"\n", + " else:\n", + " model_name = f\"{variant}.ts\"\n", + "\n", + " print(f\"Loading model: {model_name}\") \n", + " # Load traced model to CPU first\n", + " model = torch.jit.load(model_name).cuda()\n", + " cudnn.benchmark = True\n", + " # Create random input tensor of certain size\n", + " torch.manual_seed(12345)\n", + " input_shape=(batch_size, 80, 1488)\n", + " input_tensor = torch.randn(input_shape).cuda()\n", + "\n", + " # Timing graph inference\n", + " benchmark(model, input_tensor, 50, model_name, batch_size)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP16 (half precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading model: stt_en_citrinet_256_bs1_torch.float16.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs1_torch.float16.torch-tensorrt =================================\n", + "batch size=1, num iterations=50\n", + " Median samples/s: 288.9, mean: 272.9\n", + " Median latency (s): 0.003462, mean: 0.003774, 99th_p: 0.006846, std_dev: 0.000820\n", + "\n", + "Loading model: stt_en_citrinet_256_bs8_torch.float16.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs8_torch.float16.torch-tensorrt =================================\n", + "batch size=8, num iterations=50\n", + " Median samples/s: 1201.0, mean: 1190.9\n", + " Median latency (s): 0.006661, mean: 0.006733, 99th_p: 0.008453, std_dev: 0.000368\n", + "\n", + "Loading model: stt_en_citrinet_256_bs32_torch.float16.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs32_torch.float16.torch-tensorrt =================================\n", + "batch size=32, num iterations=50\n", + " Median samples/s: 1538.2, mean: 1516.4\n", + " Median latency (s): 0.020804, mean: 0.021143, 99th_p: 0.024492, std_dev: 0.000973\n", + "\n", + "Loading model: stt_en_citrinet_256_bs128_torch.float16.torch-tensorrt\n", + "Warm up ...\n", + "Start timing ...\n", + "\n", + "stt_en_citrinet_256_bs128_torch.float16.torch-tensorrt =================================\n", + "batch size=128, num iterations=50\n", + " Median samples/s: 1792.0, mean: 1777.0\n", + " Median latency (s): 0.071428, mean: 0.072057, 99th_p: 0.076796, std_dev: 0.001351\n", + "\n" + ] + } + ], + "source": [ + "precisions_str = 'fp16' # Precision (default=fp32, fp16)\n", + "batch_sizes = [1, 8, 32, 128] # Batch sizes (default=1,8,32,128)\n", + "precision = torch.float32 if precisions_str =='fp32' else torch.float16\n", + "\n", + "for batch_size in batch_sizes:\n", + " if trt:\n", + " model_name = f\"{variant}_bs{batch_size}_{precision}.torch-tensorrt\"\n", + " else:\n", + " model_name = f\"{variant}.ts\"\n", + "\n", + " print(f\"Loading model: {model_name}\") \n", + " # Load traced model to CPU first\n", + " model = torch.jit.load(model_name).cuda()\n", + " cudnn.benchmark = True\n", + " # Create random input tensor of certain size\n", + " torch.manual_seed(12345)\n", + " input_shape=(batch_size, 80, 1488)\n", + " input_tensor = torch.randn(input_shape).cuda()\n", + "\n", + " # Timing graph inference\n", + " benchmark(model, input_tensor, 50, model_name, batch_size)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 5. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of optimizing the Citrinet model with Torch-TensorRT. On an A100 GPU, with Torch-TensorRT, we observe a speedup of ~**2.4X** with FP32, and ~**2.9X** with FP16 at batchsize of 128.\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. Fill out issues at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.2.0/_sources/_notebooks/EfficientNet-example.ipynb.txt b/docs/v1.2.0/_sources/_notebooks/EfficientNet-example.ipynb.txt new file mode 100644 index 0000000000..31a3dad874 --- /dev/null +++ b/docs/v1.2.0/_sources/_notebooks/EfficientNet-example.ipynb.txt @@ -0,0 +1,693 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Torch-TensorRT Getting Started - EfficientNet-B0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch's JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.\n", + "\n", + "When deploying on NVIDIA GPUs TensorRT, NVIDIA's Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA's Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.\n", + "\n", + "Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained EfficientNet network, and running it to test the speedup obtained.\n", + "\n", + "## Content\n", + "1. [Requirements](#1)\n", + "1. [EfficientNet Overview](#2)\n", + "1. [Running the model without optimizations](#3)\n", + "1. [Accelerating with Torch-TensorRT](#4)\n", + "1. [Conclusion](#5)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting timm==0.4.12\n", + " Downloading timm-0.4.12-py3-none-any.whl (376 kB)\n", + "\u001b[K |████████████████████████████████| 376 kB 11.9 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: torch>=1.4 in /opt/conda/lib/python3.8/site-packages (from timm==0.4.12) (1.11.0a0+bfe5ad2)\n", + "Requirement already satisfied: torchvision in /opt/conda/lib/python3.8/site-packages (from timm==0.4.12) (0.12.0a0)\n", + "Requirement already satisfied: typing_extensions in /opt/conda/lib/python3.8/site-packages (from torch>=1.4->timm==0.4.12) (4.0.1)\n", + "Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in /opt/conda/lib/python3.8/site-packages (from torchvision->timm==0.4.12) (8.2.0)\n", + "Requirement already satisfied: numpy in /opt/conda/lib/python3.8/site-packages (from torchvision->timm==0.4.12) (1.22.0)\n", + "Installing collected packages: timm\n", + "Successfully installed timm-0.4.12\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Fri Feb 4 21:29:36 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 510.39.01 Driver Version: 510.39.01 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA GeForce ... On | 00000000:65:00.0 Off | N/A |\n", + "| 30% 28C P8 11W / 350W | 0MiB / 24576MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!pip install timm==0.4.12\n", + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "NVIDIA's NGC provides PyTorch Docker Container which contains PyTorch and Torch-TensorRT. We can make use of [latest pytorch](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch) container to run this notebook.\n", + "\n", + "Otherwise, you can follow the steps in `notebooks/README` to prepare a Docker container yourself, within which you can run this demo notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 2. EfficientNet Overview\n", + "\n", + "\n", + "PyTorch has a model repository called `timm`, which is a source for high quality implementations of computer vision models. We can get our EfficientNet model from there pretrained on ImageNet.\n", + "\n", + "### Model Description\n", + "\n", + "This model is based on the [EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks](https://arxiv.org/abs/1905.11946) paper.\n", + "\n", + "\"alt\"\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 3. Running the model without optimizations\n", + "\n", + "\n", + "PyTorch has a model repository called `timm`, which is a source for high quality implementations of computer vision models. We can get our EfficientNet model from there pretrained on ImageNet." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "import torch\n", + "import torch_tensorrt\n", + "import timm\n", + "import time\n", + "import numpy as np\n", + "import torch.backends.cudnn as cudnn\n", + "from timm.data import resolve_data_config\n", + "from timm.data.transforms_factory import create_transform\n", + "import json \n", + "\n", + "efficientnet_b0_model = timm.create_model('efficientnet_b0',pretrained=True)\n", + "model = efficientnet_b0_model.eval().to(\"cuda\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our model loaded, let's proceed to downloading some images!" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2022-02-04 21:30:07-- https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\n", + "Resolving d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)... 18.65.227.127, 18.65.227.37, 18.65.227.99, ...\n", + "Connecting to d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)|18.65.227.127|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 24112 (24K) [image/jpeg]\n", + "Saving to: ‘./data/img0.JPG’\n", + "\n", + "./data/img0.JPG 100%[===================>] 23.55K --.-KB/s in 0.004s \n", + "\n", + "2022-02-04 21:30:07 (6.40 MB/s) - ‘./data/img0.JPG’ saved [24112/24112]\n", + "\n", + "--2022-02-04 21:30:07-- https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\n", + "Resolving www.hakaimagazine.com (www.hakaimagazine.com)... 164.92.73.117\n", + "Connecting to www.hakaimagazine.com (www.hakaimagazine.com)|164.92.73.117|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 452718 (442K) [image/jpeg]\n", + "Saving to: ‘./data/img1.JPG’\n", + "\n", + "./data/img1.JPG 100%[===================>] 442.11K --.-KB/s in 0.06s \n", + "\n", + "2022-02-04 21:30:07 (6.83 MB/s) - ‘./data/img1.JPG’ saved [452718/452718]\n", + "\n", + "--2022-02-04 21:30:08-- https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\n", + "Resolving www.artis.nl (www.artis.nl)... 94.75.225.20\n", + "Connecting to www.artis.nl (www.artis.nl)|94.75.225.20|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 361413 (353K) [image/jpeg]\n", + "Saving to: ‘./data/img2.JPG’\n", + "\n", + "./data/img2.JPG 100%[===================>] 352.94K 246KB/s in 1.4s \n", + "\n", + "2022-02-04 21:30:10 (246 KB/s) - ‘./data/img2.JPG’ saved [361413/361413]\n", + "\n", + "--2022-02-04 21:30:10-- https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\n", + "Resolving www.familyhandyman.com (www.familyhandyman.com)... 104.18.202.107, 104.18.201.107, 2606:4700::6812:ca6b, ...\n", + "Connecting to www.familyhandyman.com (www.familyhandyman.com)|104.18.202.107|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 90994 (89K) [image/jpeg]\n", + "Saving to: ‘./data/img3.JPG’\n", + "\n", + "./data/img3.JPG 100%[===================>] 88.86K --.-KB/s in 0.006s \n", + "\n", + "2022-02-04 21:30:10 (14.4 MB/s) - ‘./data/img3.JPG’ saved [90994/90994]\n", + "\n", + "--2022-02-04 21:30:11-- https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\n", + "Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.216.133.45\n", + "Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.216.133.45|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 35363 (35K) [application/octet-stream]\n", + "Saving to: ‘./data/imagenet_class_index.json’\n", + "\n", + "./data/imagenet_cla 100%[===================>] 34.53K --.-KB/s in 0.07s \n", + "\n", + "2022-02-04 21:30:11 (474 KB/s) - ‘./data/imagenet_class_index.json’ saved [35363/35363]\n", + "\n" + ] + } + ], + "source": [ + "!mkdir -p ./data\n", + "!wget -O ./data/img0.JPG \"https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\"\n", + "!wget -O ./data/img1.JPG \"https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\"\n", + "!wget -O ./data/img2.JPG \"https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\"\n", + "!wget -O ./data/img3.JPG \"https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\"\n", + "\n", + "!wget -O ./data/imagenet_class_index.json \"https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All pre-trained models expect input images normalized in the same way,\n", + "i.e. mini-batches of 3-channel RGB images of shape `(3 x H x W)`, where `H` and `W` are expected to be at least `224`.\n", + "The images have to be loaded in to a range of `[0, 1]` and then normalized using `mean = [0.485, 0.456, 0.406]`\n", + "and `std = [0.229, 0.224, 0.225]`.\n", + "\n", + "Here's a sample execution." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from PIL import Image\n", + "from torchvision import transforms\n", + "import matplotlib.pyplot as plt\n", + "\n", + "fig, axes = plt.subplots(nrows=2, ncols=2)\n", + "\n", + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " input_tensor = preprocess(img) \n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img)\n", + " plt.axis('off')\n", + "\n", + "# loading labels\n", + "with open(\"./data/imagenet_class_index.json\") as json_file: \n", + " d = json.load(json_file)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Throughout this tutorial, we will be making use of some utility functions; `efficientnet_preprocess` for preprocessing input images, `predict` to use the model for prediction and `benchmark` to benchmark the inference. You do not need to understand/go through these utilities to make use of Torch TensorRT, but are welecomed to do so if you choose." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "cudnn.benchmark = True\n", + "\n", + "def efficientnet_preprocess():\n", + " config = resolve_data_config({}, model=model)\n", + " transform = create_transform(**config)\n", + " return transform\n", + "\n", + "# decode the results into ([predicted class, description], probability)\n", + "def predict(img_path, model):\n", + " img = Image.open(img_path)\n", + " preprocess = efficientnet_preprocess()\n", + " input_tensor = preprocess(img)\n", + " input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model\n", + " \n", + " # move the input and model to GPU for speed if available\n", + " if torch.cuda.is_available():\n", + " input_batch = input_batch.to('cuda')\n", + " model.to('cuda')\n", + "\n", + " with torch.no_grad():\n", + " output = model(input_batch)\n", + " # Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes\n", + " sm_output = torch.nn.functional.softmax(output[0], dim=0)\n", + " \n", + " ind = torch.argmax(sm_output)\n", + " return d[str(ind.item())], sm_output[ind] #([predicted class, description], probability)\n", + "\n", + "def benchmark(model, input_shape=(1024, 1, 224, 224), dtype='fp32', nwarmup=50, nruns=10000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%10==0:\n", + " print('Iteration %d/%d, avg batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output features size:\", features.size())\n", + " print('Average throughput: %.2f images/second'%(input_shape[0]/np.mean(timings)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the model downloaded and the util functions written, let's just quickly see some predictions, and benchmark the model in its current un-optimized state." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/lib/python3.8/site-packages/torchvision/transforms/transforms.py:321: UserWarning: Argument interpolation should be of type InterpolationMode instead of int. Please, use InterpolationMode enum.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "./data/img0.JPG - Predicted: ['n02109961', 'Eskimo_dog'], Probablility: 0.3987298309803009\n", + "./data/img1.JPG - Predicted: ['n01537544', 'indigo_bunting'], Probablility: 0.23344755172729492\n", + "./data/img2.JPG - Predicted: ['n02481823', 'chimpanzee'], Probablility: 0.9695423245429993\n", + "./data/img3.JPG - Predicted: ['n01739381', 'vine_snake'], Probablility: 0.227739155292511\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " \n", + " pred, prob = predict(img_path, efficientnet_b0_model)\n", + " print('{} - Predicted: {}, Probablility: {}'.format(img_path, pred, prob))\n", + "\n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img);\n", + " plt.axis('off');\n", + " plt.title(pred[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 37.62 ms\n", + "Iteration 20/100, avg batch time 37.66 ms\n", + "Iteration 30/100, avg batch time 37.65 ms\n", + "Iteration 40/100, avg batch time 37.66 ms\n", + "Iteration 50/100, avg batch time 37.70 ms\n", + "Iteration 60/100, avg batch time 37.70 ms\n", + "Iteration 70/100, avg batch time 37.70 ms\n", + "Iteration 80/100, avg batch time 37.71 ms\n", + "Iteration 90/100, avg batch time 37.72 ms\n", + "Iteration 100/100, avg batch time 37.72 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average throughput: 3393.46 images/second\n" + ] + } + ], + "source": [ + "# Model benchmark without Torch-TensorRT\n", + "benchmark(model, input_shape=(128, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 4. Accelerating with Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Onwards to the next step, accelerating with Torch TensorRT. In these examples we showcase the results for FP32 (single precision) and FP16 (half precision). We do not demonstrat specific tuning, just showcase the simplicity of usage. If you want to learn more about the possible customizations, visit our [documentation](https://nvidia.github.io/Torch-TensorRT/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP32 (single precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n" + ] + } + ], + "source": [ + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP32 precision.\n", + "trt_model_fp32 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.float32)],\n", + " enabled_precisions = torch.float32, # Run with FP32\n", + " workspace_size = 1 << 22\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 27.86 ms\n", + "Iteration 20/100, avg batch time 27.71 ms\n", + "Iteration 30/100, avg batch time 27.99 ms\n", + "Iteration 40/100, avg batch time 27.95 ms\n", + "Iteration 50/100, avg batch time 27.89 ms\n", + "Iteration 60/100, avg batch time 27.85 ms\n", + "Iteration 70/100, avg batch time 28.00 ms\n", + "Iteration 80/100, avg batch time 27.97 ms\n", + "Iteration 90/100, avg batch time 27.95 ms\n", + "Iteration 100/100, avg batch time 27.92 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average throughput: 4584.06 images/second\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input\n", + "benchmark(trt_model_fp32, input_shape=(128, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP16 (half precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x.1\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT] - Mean converter disregards dtype\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Tensor DataType is determined at build time for tensors not marked as input or output.\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Tensor DataType is determined at build time for tensors not marked as input or output.\n" + ] + } + ], + "source": [ + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP16 precision.\n", + "trt_model_fp16 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.half)],\n", + " enabled_precisions = {torch.half}, # Run with FP32\n", + " workspace_size = 1 << 22\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 12.05 ms\n", + "Iteration 20/100, avg batch time 12.56 ms\n", + "Iteration 30/100, avg batch time 12.39 ms\n", + "Iteration 40/100, avg batch time 12.34 ms\n", + "Iteration 50/100, avg batch time 12.33 ms\n", + "Iteration 60/100, avg batch time 12.32 ms\n", + "Iteration 70/100, avg batch time 12.30 ms\n", + "Iteration 80/100, avg batch time 12.28 ms\n", + "Iteration 90/100, avg batch time 12.35 ms\n", + "Iteration 100/100, avg batch time 12.35 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average throughput: 10362.23 images/second\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input\n", + "benchmark(trt_model_fp16, input_shape=(128, 3, 224, 224), dtype='fp16', nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 5. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT for EfficientNet-B0 model and test the performance impact of the optimization. With Torch-TensorRT, we observe a speedup of **1.35x** with FP32, and **3.13x** with FP16 on an NVIDIA 3090 GPU. These acceleration numbers will vary from GPU to GPU(as well as implementation to implementation based on the ops used) and we encorage you to try out latest generation of Data center compute cards for maximum acceleration.\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. If you run into any issues, you can fill them at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.2.0/_sources/_notebooks/Hugging-Face-BERT.ipynb.txt b/docs/v1.2.0/_sources/_notebooks/Hugging-Face-BERT.ipynb.txt new file mode 100644 index 0000000000..9b027b473e --- /dev/null +++ b/docs/v1.2.0/_sources/_notebooks/Hugging-Face-BERT.ipynb.txt @@ -0,0 +1,714 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "9369b63c", + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2022 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "id": "d0a97ac5", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Masked Language Modeling (MLM) with Hugging Face BERT Transformer" + ] + }, + { + "cell_type": "markdown", + "id": "83f47edb", + "metadata": {}, + "source": [ + "## Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained BERT transformer from Hugging Face, and running it to test the speedup obtained.\n", + "\n", + "## Contents\n", + "1. [Requirements](#1)\n", + "2. [BERT Overview](#2)\n", + "3. [Creating TorchScript modules](#3)\n", + "4. [Compiling with Torch-TensorRT](#4)\n", + "5. [Benchmarking](#5)\n", + "6. [Conclusion](#6)" + ] + }, + { + "cell_type": "markdown", + "id": "596fa151", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "NVIDIA's NGC provides a PyTorch Docker Container which contains PyTorch and Torch-TensorRT. Starting with version `22.05-py3`, we can make use of [latest pytorch](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch) container to run this notebook.\n", + "\n", + "Otherwise, you can follow the steps in `notebooks/README` to prepare a Docker container yourself, within which you can run this demo notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "58e687d1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: transformers in /opt/conda/lib/python3.8/site-packages (4.18.0)\n", + "Requirement already satisfied: tqdm>=4.27 in /opt/conda/lib/python3.8/site-packages (from transformers) (4.63.0)\n", + "Requirement already satisfied: regex!=2019.12.17 in /opt/conda/lib/python3.8/site-packages (from transformers) (2022.3.15)\n", + "Requirement already satisfied: huggingface-hub<1.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from transformers) (0.5.1)\n", + "Requirement already satisfied: tokenizers!=0.11.3,<0.13,>=0.11.1 in /opt/conda/lib/python3.8/site-packages (from transformers) (0.12.1)\n", + "Requirement already satisfied: numpy>=1.17 in /opt/conda/lib/python3.8/site-packages (from transformers) (1.22.3)\n", + "Requirement already satisfied: sacremoses in /opt/conda/lib/python3.8/site-packages (from transformers) (0.0.49)\n", + "Requirement already satisfied: requests in /opt/conda/lib/python3.8/site-packages (from transformers) (2.27.1)\n", + "Requirement already satisfied: pyyaml>=5.1 in /opt/conda/lib/python3.8/site-packages (from transformers) (6.0)\n", + "Requirement already satisfied: filelock in /opt/conda/lib/python3.8/site-packages (from transformers) (3.6.0)\n", + "Requirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.8/site-packages (from transformers) (21.3)\n", + "Requirement already satisfied: typing-extensions>=3.7.4.3 in /opt/conda/lib/python3.8/site-packages (from huggingface-hub<1.0,>=0.1.0->transformers) (4.1.1)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging>=20.0->transformers) (3.0.7)\n", + "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (1.26.8)\n", + "Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (2.0.12)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (2021.10.8)\n", + "Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.8/site-packages (from requests->transformers) (3.3)\n", + "Requirement already satisfied: six in /opt/conda/lib/python3.8/site-packages (from sacremoses->transformers) (1.16.0)\n", + "Requirement already satisfied: click in /opt/conda/lib/python3.8/site-packages (from sacremoses->transformers) (8.0.4)\n", + "Requirement already satisfied: joblib in /opt/conda/lib/python3.8/site-packages (from sacremoses->transformers) (1.1.0)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install transformers" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "1104c4f1", + "metadata": {}, + "outputs": [], + "source": [ + "from transformers import BertTokenizer, BertForMaskedLM\n", + "import torch\n", + "import timeit\n", + "import numpy as np\n", + "import torch_tensorrt\n", + "import torch.backends.cudnn as cudnn" + ] + }, + { + "cell_type": "markdown", + "id": "acf67a5e", + "metadata": {}, + "source": [ + "\n", + "## 2. BERT Overview\n", + "\n", + "Transformers comprise a class of deep learning algorithms employing self-attention; broadly speaking, the models learn large matrices of numbers, each element of which denotes how important one component of input data is to another. Since their introduction in 2017, transformers have enjoyed widespread adoption, particularly in natural language processing, but also in computer vision problems. This is largely because they are easier to parallelize than the sequence models which attention mechanisms were originally designed to augment. \n", + "\n", + "Hugging Face is a company that maintains a huge respository of pre-trained transformer models. The company also provides tools for integrating those models into PyTorch code and running inference with them. \n", + "\n", + "One of the most popular transformer models is BERT (Bidirectional Encoder Representations from Transformers). First developed at Google and released in 2018, it has become the backbone of Google's search engine and a standard benchmark for NLP experiments. BERT was originally trained for next sentence prediction and masked language modeling (MLM), which aims to predict hidden words in sentences. In this notebook, we will use Hugging Face's `bert-base-uncased` model (BERT's smallest and simplest form, which does not employ text capitalization) for MLM." + ] + }, + { + "cell_type": "markdown", + "id": "19e711c0", + "metadata": {}, + "source": [ + "\n", + "## 3. Creating TorchScript modules " + ] + }, + { + "cell_type": "markdown", + "id": "81d4c6f6", + "metadata": {}, + "source": [ + "First, create a pretrained BERT tokenizer from the `bert-base-uncased` model" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c7c8721e", + "metadata": {}, + "outputs": [], + "source": [ + "enc = BertTokenizer.from_pretrained('bert-base-uncased')" + ] + }, + { + "cell_type": "markdown", + "id": "b7c1c679", + "metadata": {}, + "source": [ + "Create dummy inputs to generate a traced TorchScript model later" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c3827087", + "metadata": {}, + "outputs": [], + "source": [ + "batch_size = 4\n", + "\n", + "batched_indexed_tokens = [[101, 64]*64]*batch_size\n", + "batched_segment_ids = [[0, 1]*64]*batch_size\n", + "batched_attention_masks = [[1, 1]*64]*batch_size\n", + "\n", + "tokens_tensor = torch.tensor(batched_indexed_tokens)\n", + "segments_tensor = torch.tensor(batched_segment_ids)\n", + "attention_masks_tensor = torch.tensor(batched_attention_masks)" + ] + }, + { + "cell_type": "markdown", + "id": "7e31b27f", + "metadata": {}, + "source": [ + "Obtain a BERT masked language model from Hugging Face in the (scripted) TorchScript, then use the dummy inputs to trace it" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "a3cd5a35", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Some weights of the model checkpoint at bert-base-uncased were not used when initializing BertForMaskedLM: ['cls.seq_relationship.bias', 'cls.seq_relationship.weight']\n", + "- This IS expected if you are initializing BertForMaskedLM from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n", + "- This IS NOT expected if you are initializing BertForMaskedLM from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n" + ] + } + ], + "source": [ + "mlm_model_ts = BertForMaskedLM.from_pretrained('bert-base-uncased', torchscript=True)\n", + "traced_mlm_model = torch.jit.trace(mlm_model_ts, [tokens_tensor, segments_tensor, attention_masks_tensor])" + ] + }, + { + "cell_type": "markdown", + "id": "d8d2217a", + "metadata": {}, + "source": [ + "Define 4 masked sentences, with 1 word in each sentence hidden from the model. Fluent English speakers will probably be able to guess the masked words, but just in case, they are `'capital'`, `'language'`, `'innings'`, and `'mathematics'`.\n", + "\n", + "Also create a list containing the position of the masked word within each sentence. Given Python's 0-based indexing convention, the numbers are each higher by 1 than might be expected. This is because the token at index 0 in each sentence is a beginning-of-sentence token, denoted `[CLS]` when entered explicitly. " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "4d1af982", + "metadata": {}, + "outputs": [], + "source": [ + "masked_sentences = ['Paris is the [MASK] of France.', \n", + " 'The primary [MASK] of the United States is English.', \n", + " 'A baseball game consists of at least nine [MASK].', \n", + " 'Topology is a branch of [MASK] concerned with the properties of geometric objects that remain unchanged under continuous transformations.']\n", + "pos_masks = [4, 3, 9, 6]" + ] + }, + { + "cell_type": "markdown", + "id": "4d89b4c8", + "metadata": {}, + "source": [ + "Pass the masked sentences into the (scripted) TorchScript MLM model and verify that the unmasked sentences yield the expected results. \n", + "\n", + "Because the sentences are of different lengths, we must specify the `padding` argument in calling our encoder/tokenizer. There are several possible padding strategies, but we'll use `'max_length'` padding with `max_length=128`. Later, when we compile an optimized version of the model with Torch-TensorRT, the optimized model will expect inputs of length 128, hence our choice of padding strategy and length here. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "d2d7546b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Paris is the capital of France.\n", + "The primary language of the United States is English.\n", + "A baseball game consists of at least nine innings.\n", + "Topology is a branch of mathematics concerned with the properties of geometric objects that remain unchanged under continuous transformations.\n" + ] + } + ], + "source": [ + "encoded_inputs = enc(masked_sentences, return_tensors='pt', padding='max_length', max_length=128)\n", + "outputs = mlm_model_ts(**encoded_inputs)\n", + "most_likely_token_ids = [torch.argmax(outputs[0][i, pos, :]) for i, pos in enumerate(pos_masks)]\n", + "unmasked_tokens = enc.decode(most_likely_token_ids).split(' ')\n", + "unmasked_sentences = [masked_sentences[i].replace('[MASK]', token) for i, token in enumerate(unmasked_tokens)]\n", + "for sentence in unmasked_sentences:\n", + " print(sentence)" + ] + }, + { + "cell_type": "markdown", + "id": "b0b423ff", + "metadata": {}, + "source": [ + "Pass the masked sentences into the traced MLM model and verify that the unmasked sentences yield the expected results. \n", + "\n", + "Note the difference in how the `encoded_inputs` are passed into the model in the following cell compared to the previous one. If you examine `encoded_inputs`, you'll find that it's a dictionary with 3 keys, `'input_ids'`, `'token_type_ids'`, and `'attention_mask'`, each with a PyTorch tensor as an associated value. The traced model will accept `**encoded_inputs` as an input, but the Torch-TensorRT-optimized model (to be defined later) will not. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "683a4a73", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Paris is the capital of France.\n", + "The primary language of the United States is English.\n", + "A baseball game consists of at least nine innings.\n", + "Topology is a branch of mathematics concerned with the properties of geometric objects that remain unchanged under continuous transformations.\n" + ] + } + ], + "source": [ + "encoded_inputs = enc(masked_sentences, return_tensors='pt', padding='max_length', max_length=128)\n", + "outputs = traced_mlm_model(encoded_inputs['input_ids'], encoded_inputs['token_type_ids'], encoded_inputs['attention_mask'])\n", + "most_likely_token_ids = [torch.argmax(outputs[0][i, pos, :]) for i, pos in enumerate(pos_masks)]\n", + "unmasked_tokens = enc.decode(most_likely_token_ids).split(' ')\n", + "unmasked_sentences = [masked_sentences[i].replace('[MASK]', token) for i, token in enumerate(unmasked_tokens)]\n", + "for sentence in unmasked_sentences:\n", + " print(sentence)" + ] + }, + { + "cell_type": "markdown", + "id": "7a31b545", + "metadata": {}, + "source": [ + "\n", + "## 4. Compiling with Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "id": "413d8b4f", + "metadata": {}, + "source": [ + "Change the logging level to avoid long printouts" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "42862893", + "metadata": {}, + "outputs": [], + "source": [ + "new_level = torch_tensorrt.logging.Level.Error\n", + "torch_tensorrt.logging.set_reportable_log_level(new_level)" + ] + }, + { + "cell_type": "markdown", + "id": "121d6d59", + "metadata": {}, + "source": [ + "Compile the model" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "eab90150", + "metadata": {}, + "outputs": [], + "source": [ + "trt_model = torch_tensorrt.compile(traced_mlm_model, \n", + " inputs= [torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32), # input_ids\n", + " torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32), # token_type_ids\n", + " torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32)], # attention_mask\n", + " enabled_precisions= {torch.float32}, # Run with 32-bit precision\n", + " workspace_size=2000000000,\n", + " truncate_long_and_double=True\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a96751ce", + "metadata": {}, + "source": [ + "Pass the masked sentences into the compiled model and verify that the unmasked sentences yield the expected results." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "097ea381", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Paris is the capital of France.\n", + "The primary language of the United States is English.\n", + "A baseball game consists of at least nine innings.\n", + "Topology is a branch of mathematics concerned with the properties of geometric objects that remain unchanged under continuous transformations.\n" + ] + } + ], + "source": [ + "enc_inputs = enc(masked_sentences, return_tensors='pt', padding='max_length', max_length=128)\n", + "enc_inputs = {k: v.type(torch.int32).cuda() for k, v in enc_inputs.items()}\n", + "output_trt = trt_model(enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "most_likely_token_ids_trt = [torch.argmax(output_trt[i, pos, :]) for i, pos in enumerate(pos_masks)] \n", + "unmasked_tokens_trt = enc.decode(most_likely_token_ids_trt).split(' ')\n", + "unmasked_sentences_trt = [masked_sentences[i].replace('[MASK]', token) for i, token in enumerate(unmasked_tokens_trt)]\n", + "for sentence in unmasked_sentences_trt:\n", + " print(sentence)" + ] + }, + { + "cell_type": "markdown", + "id": "a398271d", + "metadata": {}, + "source": [ + "Compile the model again, this time with 16-bit precision" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "a063dee2", + "metadata": {}, + "outputs": [], + "source": [ + "trt_model_fp16 = torch_tensorrt.compile(traced_mlm_model, \n", + " inputs= [torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32), # input_ids\n", + " torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32), # token_type_ids\n", + " torch_tensorrt.Input(shape=[batch_size, 128], dtype=torch.int32)], # attention_mask\n", + " enabled_precisions= {torch.half}, # Run with 16-bit precision\n", + " workspace_size=2000000000,\n", + " truncate_long_and_double=True\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a926334a", + "metadata": {}, + "source": [ + "\n", + "## 5. Benchmarking\n", + "\n", + "In developing this notebook, we conducted our benchmarking on a single NVIDIA A100 GPU. Your results may differ from those shown, particularly on a different GPU." + ] + }, + { + "cell_type": "markdown", + "id": "976c6fb9", + "metadata": {}, + "source": [ + "This function passes the inputs into the model and runs inference `num_loops` times, then returns a list of length containing the amount of time in seconds that each instance of inference took." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "b72a091e", + "metadata": {}, + "outputs": [], + "source": [ + "def timeGraph(model, input_tensor1, input_tensor2, input_tensor3, num_loops=50):\n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(20):\n", + " features = model(input_tensor1, input_tensor2, input_tensor3)\n", + "\n", + " torch.cuda.synchronize()\n", + "\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(num_loops):\n", + " start_time = timeit.default_timer()\n", + " features = model(input_tensor1, input_tensor2, input_tensor3)\n", + " torch.cuda.synchronize()\n", + " end_time = timeit.default_timer()\n", + " timings.append(end_time - start_time)\n", + " # print(\"Iteration {}: {:.6f} s\".format(i, end_time - start_time))\n", + "\n", + " return timings" + ] + }, + { + "cell_type": "markdown", + "id": "0b44dcf8", + "metadata": {}, + "source": [ + "This function prints the number of input batches the model is able to process each second and summary statistics of the model's latency." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "2ef71ab7", + "metadata": {}, + "outputs": [], + "source": [ + "def printStats(graphName, timings, batch_size):\n", + " times = np.array(timings)\n", + " steps = len(times)\n", + " speeds = batch_size / times\n", + " time_mean = np.mean(times)\n", + " time_med = np.median(times)\n", + " time_99th = np.percentile(times, 99)\n", + " time_std = np.std(times, ddof=0)\n", + " speed_mean = np.mean(speeds)\n", + " speed_med = np.median(speeds)\n", + "\n", + " msg = (\"\\n%s =================================\\n\"\n", + " \"batch size=%d, num iterations=%d\\n\"\n", + " \" Median text batches/second: %.1f, mean: %.1f\\n\"\n", + " \" Median latency: %.6f, mean: %.6f, 99th_p: %.6f, std_dev: %.6f\\n\"\n", + " ) % (graphName,\n", + " batch_size, steps,\n", + " speed_med, speed_mean,\n", + " time_med, time_mean, time_99th, time_std)\n", + " print(msg)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "afe97b9b", + "metadata": {}, + "outputs": [], + "source": [ + "cudnn.benchmark = True" + ] + }, + { + "cell_type": "markdown", + "id": "eba98b24", + "metadata": {}, + "source": [ + "Benchmark the (scripted) TorchScript model on GPU" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "bab5fa8f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "\n", + "BERT =================================\n", + "batch size=4, num iterations=50\n", + " Median text batches/second: 599.1, mean: 597.6\n", + " Median latency: 0.006677, mean: 0.006693, 99th_p: 0.006943, std_dev: 0.000059\n", + "\n" + ] + } + ], + "source": [ + "timings = timeGraph(mlm_model_ts.cuda(), enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "\n", + "printStats(\"BERT\", timings, batch_size)" + ] + }, + { + "cell_type": "markdown", + "id": "bc79c452", + "metadata": {}, + "source": [ + "Benchmark the traced model on GPU" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "5c0bd8e9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "\n", + "BERT =================================\n", + "batch size=4, num iterations=50\n", + " Median text batches/second: 951.2, mean: 951.0\n", + " Median latency: 0.004205, mean: 0.004206, 99th_p: 0.004256, std_dev: 0.000015\n", + "\n" + ] + } + ], + "source": [ + "timings = timeGraph(traced_mlm_model.cuda(), enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "\n", + "printStats(\"BERT\", timings, batch_size)" + ] + }, + { + "cell_type": "markdown", + "id": "41db22a1", + "metadata": {}, + "source": [ + "Benchmark the compiled FP32 model on GPU" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "ade7b508", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "\n", + "BERT =================================\n", + "batch size=4, num iterations=50\n", + " Median text batches/second: 1216.9, mean: 1216.4\n", + " Median latency: 0.003287, mean: 0.003289, 99th_p: 0.003317, std_dev: 0.000007\n", + "\n" + ] + } + ], + "source": [ + "timings = timeGraph(trt_model, enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "\n", + "printStats(\"BERT\", timings, batch_size)" + ] + }, + { + "cell_type": "markdown", + "id": "57b696de", + "metadata": {}, + "source": [ + "Benchmark the compiled FP16 model on GPU" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "f61b83fd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "\n", + "BERT =================================\n", + "batch size=4, num iterations=50\n", + " Median text batches/second: 1776.7, mean: 1771.1\n", + " Median latency: 0.002251, mean: 0.002259, 99th_p: 0.002305, std_dev: 0.000015\n", + "\n" + ] + } + ], + "source": [ + "timings = timeGraph(trt_model_fp16, enc_inputs['input_ids'], enc_inputs['token_type_ids'], enc_inputs['attention_mask'])\n", + "\n", + "printStats(\"BERT\", timings, batch_size)" + ] + }, + { + "cell_type": "markdown", + "id": "43f67ba3", + "metadata": {}, + "source": [ + "\n", + "## 6. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT for Masked Language Modeling with Hugging Face's `bert-base-uncased` transformer and testing the performance impact of the optimization. With Torch-TensorRT on an NVIDIA A100 GPU, we observe the speedups indicated below. These acceleration numbers will vary from GPU to GPU (as well as implementation to implementation based on the ops used) and we encorage you to try out latest generation of Data center compute cards for maximum acceleration.\n", + "\n", + "Scripted (GPU): 1.0x\n", + "Traced (GPU): 1.62x\n", + "Torch-TensorRT (FP32): 2.14x\n", + "Torch-TensorRT (FP16): 3.15x\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. If you run into any issues, you can fill them at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4ebd152d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/v1.2.0/_sources/_notebooks/Resnet50-example.ipynb.txt b/docs/v1.2.0/_sources/_notebooks/Resnet50-example.ipynb.txt new file mode 100644 index 0000000000..f020662c73 --- /dev/null +++ b/docs/v1.2.0/_sources/_notebooks/Resnet50-example.ipynb.txt @@ -0,0 +1,925 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Torch-TensorRT Getting Started - ResNet 50" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch's JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.\n", + "\n", + "When deploying on NVIDIA GPUs TensorRT, NVIDIA's Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA's Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.\n", + "\n", + "Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained ResNet-50 network, and running it to test the speedup obtained.\n", + "\n", + "## Content\n", + "1. [Requirements](#1)\n", + "1. [ResNet-50 Overview](#2)\n", + "1. [Running the model without optimizations](#3)\n", + "1. [Accelerating with Torch-TensorRT](#4)\n", + "1. [Conclusion](#5)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tue Feb 8 19:16:53 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 510.39.01 Driver Version: 510.39.01 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA GeForce ... On | 00000000:65:00.0 Off | N/A |\n", + "| 30% 29C P8 15W / 350W | 0MiB / 24576MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting ipywidgets\n", + " Downloading ipywidgets-7.6.5-py2.py3-none-any.whl (121 kB)\n", + "\u001b[K |████████████████████████████████| 121 kB 5.3 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)\n", + "Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.7.0)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.3)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (7.31.0)\n", + "Collecting jupyterlab-widgets>=1.0.0\n", + " Downloading jupyterlab_widgets-1.0.2-py3-none-any.whl (243 kB)\n", + "\u001b[K |████████████████████████████████| 243 kB 2.6 MB/s eta 0:00:01\n", + "\u001b[?25hCollecting widgetsnbextension~=3.5.0\n", + " Downloading widgetsnbextension-3.5.2-py2.py3-none-any.whl (1.6 MB)\n", + "\u001b[K |████████████████████████████████| 1.6 MB 3.5 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)\n", + "Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.1.2)\n", + "Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)\n", + "Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.4)\n", + "Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.1)\n", + "Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)\n", + "Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.0)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.24)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)\n", + "Requirement already satisfied: pygments in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.1)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (0.3)\n", + "Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (22.3.0)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (2.8.2)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (4.9.1)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)\n", + "Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.4.0)\n", + "Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (5.4.0)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.7.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (1.16.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.5.0->ipywidgets) (6.4.1)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.8.0)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.3)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3.0)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.13.0)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.12.1)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (6.4.0)\n", + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.21)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.0.1)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.1.2)\n", + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.7.1)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (4.1.0)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.10)\n", + "Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.0)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.5.0)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.8.4)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.1)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.6)\n", + "Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets\n", + "Successfully installed ipywidgets-7.6.5 jupyterlab-widgets-1.0.2 widgetsnbextension-3.5.2\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "!nvidia-smi\n", + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "NVIDIA's NGC provides PyTorch Docker Container which contains PyTorch and Torch-TensorRT. We can make use of [latest pytorch](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch) container to run this notebook.\n", + "\n", + "Otherwise, you can follow the steps in `notebooks/README` to prepare a Docker container yourself, within which you can run this demo notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 2. ResNet-50 Overview\n", + "\n", + "\n", + "PyTorch has a model repository called the PyTorch Hub, which is a source for high quality implementations of common models. We can get our ResNet-50 model from there pretrained on ImageNet.\n", + "\n", + "### Model Description\n", + "\n", + "This ResNet-50 model is based on the [Deep Residual Learning for Image Recognition](https://arxiv.org/pdf/1512.03385.pdf) paper, which describes ResNet as “a method for detecting objects in images using a single deep neural network\". The input size is fixed to 32x32.\n", + "\n", + "\"alt\"\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 3. Running the model without optimizations\n", + "\n", + "\n", + "PyTorch has a model repository called `timm`, which is a source for high quality implementations of computer vision models. We can get our EfficientNet model from there pretrained on ImageNet." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Downloading: \"https://github.com/pytorch/vision/archive/v0.10.0.zip\" to /root/.cache/torch/hub/v0.10.0.zip\n", + "Downloading: \"https://download.pytorch.org/models/resnet50-0676ba61.pth\" to /root/.cache/torch/hub/checkpoints/resnet50-0676ba61.pth\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a7036a6122874340b14aaef7b8319260", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0.00/97.8M [00:00] 23.55K --.-KB/s in 0.002s \n", + "\n", + "2022-02-08 19:17:19 (14.6 MB/s) - ‘./data/img0.JPG’ saved [24112/24112]\n", + "\n", + "--2022-02-08 19:17:19-- https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\n", + "Resolving www.hakaimagazine.com (www.hakaimagazine.com)... 164.92.73.117\n", + "Connecting to www.hakaimagazine.com (www.hakaimagazine.com)|164.92.73.117|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 452718 (442K) [image/jpeg]\n", + "Saving to: ‘./data/img1.JPG’\n", + "\n", + "./data/img1.JPG 100%[===================>] 442.11K 2.40MB/s in 0.2s \n", + "\n", + "2022-02-08 19:17:19 (2.40 MB/s) - ‘./data/img1.JPG’ saved [452718/452718]\n", + "\n", + "--2022-02-08 19:17:20-- https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\n", + "Resolving www.artis.nl (www.artis.nl)... 94.75.225.20\n", + "Connecting to www.artis.nl (www.artis.nl)|94.75.225.20|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 361413 (353K) [image/jpeg]\n", + "Saving to: ‘./data/img2.JPG’\n", + "\n", + "./data/img2.JPG 100%[===================>] 352.94K 366KB/s in 1.0s \n", + "\n", + "2022-02-08 19:17:24 (366 KB/s) - ‘./data/img2.JPG’ saved [361413/361413]\n", + "\n", + "--2022-02-08 19:17:24-- https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\n", + "Resolving www.familyhandyman.com (www.familyhandyman.com)... 104.18.201.107, 104.18.202.107, 2606:4700::6812:ca6b, ...\n", + "Connecting to www.familyhandyman.com (www.familyhandyman.com)|104.18.201.107|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 94328 (92K) [image/jpeg]\n", + "Saving to: ‘./data/img3.JPG’\n", + "\n", + "./data/img3.JPG 100%[===================>] 92.12K --.-KB/s in 0.005s \n", + "\n", + "2022-02-08 19:17:25 (16.8 MB/s) - ‘./data/img3.JPG’ saved [94328/94328]\n", + "\n", + "--2022-02-08 19:17:25-- https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\n", + "Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.217.41.222\n", + "Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.217.41.222|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 35363 (35K) [application/octet-stream]\n", + "Saving to: ‘./data/imagenet_class_index.json’\n", + "\n", + "./data/imagenet_cla 100%[===================>] 34.53K --.-KB/s in 0.07s \n", + "\n", + "2022-02-08 19:17:26 (481 KB/s) - ‘./data/imagenet_class_index.json’ saved [35363/35363]\n", + "\n" + ] + } + ], + "source": [ + "!mkdir -p ./data\n", + "!wget -O ./data/img0.JPG \"https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\"\n", + "!wget -O ./data/img1.JPG \"https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\"\n", + "!wget -O ./data/img2.JPG \"https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\"\n", + "!wget -O ./data/img3.JPG \"https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\"\n", + "\n", + "!wget -O ./data/imagenet_class_index.json \"https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All pre-trained models expect input images normalized in the same way,\n", + "i.e. mini-batches of 3-channel RGB images of shape `(3 x H x W)`, where `H` and `W` are expected to be at least `224`.\n", + "The images have to be loaded in to a range of `[0, 1]` and then normalized using `mean = [0.485, 0.456, 0.406]`\n", + "and `std = [0.229, 0.224, 0.225]`.\n", + "\n", + "Here's a sample execution." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from PIL import Image\n", + "from torchvision import transforms\n", + "import matplotlib.pyplot as plt\n", + "import json \n", + "\n", + "fig, axes = plt.subplots(nrows=2, ncols=2)\n", + "\n", + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " input_tensor = preprocess(img) \n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img)\n", + " plt.axis('off')\n", + "\n", + "# loading labels \n", + "with open(\"./data/imagenet_class_index.json\") as json_file: \n", + " d = json.load(json_file)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Throughout this tutorial, we will be making use of some utility functions; `rn50_preprocess` for preprocessing input images, `predict` to use the model for prediction and `benchmark` to benchmark the inference. You do not need to understand/go through these utilities to make use of Torch TensorRT, but are welecomed to do so if you choose." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import time\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "def rn50_preprocess():\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " return preprocess\n", + "\n", + "# decode the results into ([predicted class, description], probability)\n", + "def predict(img_path, model):\n", + " img = Image.open(img_path)\n", + " preprocess = rn50_preprocess()\n", + " input_tensor = preprocess(img)\n", + " input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model\n", + " \n", + " # move the input and model to GPU for speed if available\n", + " if torch.cuda.is_available():\n", + " input_batch = input_batch.to('cuda')\n", + " model.to('cuda')\n", + "\n", + " with torch.no_grad():\n", + " output = model(input_batch)\n", + " # Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes\n", + " sm_output = torch.nn.functional.softmax(output[0], dim=0)\n", + " \n", + " ind = torch.argmax(sm_output)\n", + " return d[str(ind.item())], sm_output[ind] #([predicted class, description], probability)\n", + "\n", + "def benchmark(model, input_shape=(1024, 1, 224, 224), dtype='fp32', nwarmup=50, nruns=10000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%10==0:\n", + " print('Iteration %d/%d, ave batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output features size:\", features.size())\n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the model downloaded and the util functions written, let's just quickly see some predictions, and benchmark the model in its current un-optimized state." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "./data/img0.JPG - Predicted: ['n02110185', 'Siberian_husky'], Probablility: 0.49785590171813965\n", + "./data/img1.JPG - Predicted: ['n01820546', 'lorikeet'], Probablility: 0.6445754766464233\n", + "./data/img2.JPG - Predicted: ['n02481823', 'chimpanzee'], Probablility: 0.9899807572364807\n", + "./data/img3.JPG - Predicted: ['n01749939', 'green_mamba'], Probablility: 0.39485082030296326\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " \n", + " pred, prob = predict(img_path, resnet50_model)\n", + " print('{} - Predicted: {}, Probablility: {}'.format(img_path, pred, prob))\n", + "\n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img);\n", + " plt.axis('off');\n", + " plt.title(pred[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 75.34 ms\n", + "Iteration 20/100, ave batch time 75.33 ms\n", + "Iteration 30/100, ave batch time 75.35 ms\n", + "Iteration 40/100, ave batch time 75.37 ms\n", + "Iteration 50/100, ave batch time 75.38 ms\n", + "Iteration 60/100, ave batch time 75.38 ms\n", + "Iteration 70/100, ave batch time 75.39 ms\n", + "Iteration 80/100, ave batch time 75.39 ms\n", + "Iteration 90/100, ave batch time 75.40 ms\n", + "Iteration 100/100, ave batch time 75.41 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average batch time: 75.41 ms\n" + ] + } + ], + "source": [ + "# Model benchmark without Torch-TensorRT\n", + "model = resnet50_model.eval().to(\"cuda\")\n", + "benchmark(model, input_shape=(128, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 4. Accelerating with Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Onwards to the next step, accelerating with Torch TensorRT. In these examples we showcase the results for FP32 (single precision) and FP16 (half precision). We do not demonstrat specific tuning, just showcase the simplicity of usage. If you want to learn more about the possible customizations, visit our [documentation](https://nvidia.github.io/Torch-TensorRT/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP32 (single precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP32 precision.\n", + "trt_model_fp32 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.float32)],\n", + " enabled_precisions = torch.float32, # Run with FP32\n", + " workspace_size = 1 << 22\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 41.02 ms\n", + "Iteration 20/100, ave batch time 41.12 ms\n", + "Iteration 30/100, ave batch time 41.22 ms\n", + "Iteration 40/100, ave batch time 41.14 ms\n", + "Iteration 50/100, ave batch time 41.20 ms\n", + "Iteration 60/100, ave batch time 41.20 ms\n", + "Iteration 70/100, ave batch time 41.19 ms\n", + "Iteration 80/100, ave batch time 41.23 ms\n", + "Iteration 90/100, ave batch time 41.20 ms\n", + "Iteration 100/100, ave batch time 41.21 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average batch time: 41.21 ms\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input\n", + "benchmark(trt_model_fp32, input_shape=(128, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FP16 (half precision)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x.1\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP16 precision.\n", + "trt_model_fp16 = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((128, 3, 224, 224), dtype=torch.half)],\n", + " enabled_precisions = {torch.half}, # Run with FP32\n", + " workspace_size = 1 << 22\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 14.48 ms\n", + "Iteration 20/100, ave batch time 14.58 ms\n", + "Iteration 30/100, ave batch time 14.72 ms\n", + "Iteration 40/100, ave batch time 14.73 ms\n", + "Iteration 50/100, ave batch time 14.70 ms\n", + "Iteration 60/100, ave batch time 14.79 ms\n", + "Iteration 70/100, ave batch time 14.73 ms\n", + "Iteration 80/100, ave batch time 14.69 ms\n", + "Iteration 90/100, ave batch time 14.68 ms\n", + "Iteration 100/100, ave batch time 14.69 ms\n", + "Input shape: torch.Size([128, 3, 224, 224])\n", + "Output features size: torch.Size([128, 1000])\n", + "Average batch time: 14.69 ms\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input\n", + "benchmark(trt_model_fp16, input_shape=(128, 3, 224, 224), dtype='fp16', nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 5. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT for EfficientNet-B0 model and test the performance impact of the optimization. With Torch-TensorRT, we observe a speedup of **1.84x** with FP32, and **5.2x** with FP16 on an NVIDIA 3090 GPU. These acceleration numbers will vary from GPU to GPU(as well as implementation to implementation based on the ops used) and we encorage you to try out latest generation of Data center compute cards for maximum acceleration.\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. If you run into any issues, you can fill them at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.2.0/_sources/_notebooks/dynamic-shapes.ipynb.txt b/docs/v1.2.0/_sources/_notebooks/dynamic-shapes.ipynb.txt new file mode 100644 index 0000000000..a0ceaab576 --- /dev/null +++ b/docs/v1.2.0/_sources/_notebooks/dynamic-shapes.ipynb.txt @@ -0,0 +1,1023 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "332a2ed8", + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2020 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "id": "18ee9d62", + "metadata": {}, + "source": [ + "# Torch-TensorRT - Using Dynamic Shapes" + ] + }, + { + "cell_type": "markdown", + "id": "73703695", + "metadata": {}, + "source": [ + "Torch-TensorRT is a compiler for PyTorch/TorchScript, targeting NVIDIA GPUs via NVIDIA's TensorRT Deep Learning Optimizer and Runtime. Unlike PyTorch's Just-In-Time (JIT) compiler, Torch-TensorRT is an Ahead-of-Time (AOT) compiler, meaning that before you deploy your TorchScript code, you go through an explicit compile step to convert a standard TorchScript program into an module targeting a TensorRT engine. Torch-TensorRT operates as a PyTorch extention and compiles modules that integrate into the JIT runtime seamlessly. After compilation using the optimized graph should feel no different than running a TorchScript module. You also have access to TensorRT's suite of configurations at compile time, so you are able to specify operating precision (FP32/FP16/INT8) and other settings for your module.\n", + "\n", + "We highly encorage users to use our NVIDIA's [PyTorch container](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch) to run this notebook. It comes packaged with a host of NVIDIA libraries and optimizations to widely used third party libraries. This container is tested and updated on a monthly cadence!\n", + "\n", + "This notebook has the following sections:\n", + "1. [TL;DR Explanation](#1)\n", + "1. [Setting up the model](#2)\n", + "1. [Working with Dynamic shapes in Torch TRT](#3)" + ] + }, + { + "cell_type": "markdown", + "id": "1603028d", + "metadata": {}, + "source": [ + "---\n", + "## TL;DR Explanation\n", + "\n", + "Making use of Dynamic Shaped Tensors in Torch TensorRT is quite simple. Let's say you are using the `torch_tensorrt.compile(...)` function to compile a torchscript module.\n", + "\n", + "One of the `args` in this function in this function is `input`: which defines an input to a module in terms of expected shape, data type and tensor format: `torch_tensorrt.Input`. \n", + "\n", + "For the purposes of this walkthrough we just need three `kwargs`: `min_shape`, `opt_shape` and `max_shape`. \n", + "```\n", + "...\n", + "torch_tensorrt.Input(\n", + " min_shape=(1, 224, 224, 3),\n", + " opt_shape=(1, 512, 512, 3),\n", + " max_shape=(1, 1024, 1024, 3),\n", + " dtype=torch.int32\n", + " format=torch.channel_last\n", + " )\n", + "...\n", + "```\n", + "In this example, we are going to use a simple ResNet model to demonstrate the use of the API. We will be using different batch sizes in the example, but you can use the same method to alter any of the dimensions of the tensor." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "db3493d2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mon May 2 20:40:30 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA Graphics... On | 00000000:01:00.0 Off | 0 |\n", + "| 41% 51C P0 62W / 200W | 0MiB / 47681MiB | 0% Default |\n", + "| | | Disabled |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Requirement already satisfied: ipywidgets in /opt/conda/lib/python3.8/site-packages (7.7.0)\n", + "Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.3.0)\n", + "Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.13.0)\n", + "Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)\n", + "Requirement already satisfied: widgetsnbextension~=3.6.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (3.6.0)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (8.2.0)\n", + "Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (1.1.0)\n", + "Requirement already satisfied: psutil in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (5.9.0)\n", + "Requirement already satisfied: tornado>=6.1 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (21.3)\n", + "Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.5)\n", + "Requirement already satisfied: matplotlib-inline>=0.1 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)\n", + "Requirement already satisfied: jupyter-client>=6.1.12 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.2.2)\n", + "Requirement already satisfied: debugpy>=1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.6.0)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.1)\n", + "Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: stack-data in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.29)\n", + "Requirement already satisfied: pygments>=2.4.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.2)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "Requirement already satisfied: pyzmq>=22.3 in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (22.3.0)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (0.4)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (2.8.2)\n", + "Requirement already satisfied: jupyter-core>=4.9.2 in /opt/conda/lib/python3.8/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (4.9.2)\n", + "Requirement already satisfied: jsonschema>=2.6 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)\n", + "Requirement already satisfied: fastjsonschema in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (2.15.3)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (21.4.0)\n", + "Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (5.7.0)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema>=2.6->nbformat>=4.2.0->ipywidgets) (3.8.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.8.2->jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (1.16.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.6.0->ipywidgets) (6.4.1)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.1.1)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.14.1)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.8.0)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3.0)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (6.5.0)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.3)\n", + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.21)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.1.1)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.7.1)\n", + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.2.2)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.8.4)\n", + "Requirement already satisfied: nbclient>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.6.0)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (5.0.0)\n", + "Requirement already satisfied: tinycss2 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.1.1)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.5.0)\n", + "Requirement already satisfied: beautifulsoup4 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (4.11.1)\n", + "Requirement already satisfied: soupsieve>1.2 in /opt/conda/lib/python3.8/site-packages (from beautifulsoup4->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.3.1)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.1)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->ipykernel>=4.5.1->ipywidgets) (3.0.8)\n", + "Requirement already satisfied: asttokens in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (2.0.5)\n", + "Requirement already satisfied: pure-eval in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.2.2)\n", + "Requirement already satisfied: executing in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "!nvidia-smi\n", + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org" + ] + }, + { + "cell_type": "markdown", + "id": "0ed1b4f7", + "metadata": {}, + "source": [ + "---\n", + "## Setting up the model\n", + "\n", + "In this section, we will:\n", + "* Get sample data.\n", + "* Download model from torch hub.\n", + "* Build simple utility functions" + ] + }, + { + "cell_type": "markdown", + "id": "5934504f", + "metadata": {}, + "source": [ + "### Getting sample data" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e46814cc", + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2022-05-02 20:40:33-- https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\n", + "Resolving d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)... 18.65.227.37, 18.65.227.99, 18.65.227.223, ...\n", + "Connecting to d17fnq9dkz9hgj.cloudfront.net (d17fnq9dkz9hgj.cloudfront.net)|18.65.227.37|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 24112 (24K) [image/jpeg]\n", + "Saving to: ‘./data/img0.JPG’\n", + "\n", + "./data/img0.JPG 100%[===================>] 23.55K --.-KB/s in 0.005s \n", + "\n", + "2022-05-02 20:40:33 (4.69 MB/s) - ‘./data/img0.JPG’ saved [24112/24112]\n", + "\n", + "--2022-05-02 20:40:34-- https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\n", + "Resolving www.hakaimagazine.com (www.hakaimagazine.com)... 164.92.73.117\n", + "Connecting to www.hakaimagazine.com (www.hakaimagazine.com)|164.92.73.117|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 452718 (442K) [image/jpeg]\n", + "Saving to: ‘./data/img1.JPG’\n", + "\n", + "./data/img1.JPG 100%[===================>] 442.11K --.-KB/s in 0.02s \n", + "\n", + "2022-05-02 20:40:34 (26.2 MB/s) - ‘./data/img1.JPG’ saved [452718/452718]\n", + "\n", + "--2022-05-02 20:40:34-- https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\n", + "Resolving www.artis.nl (www.artis.nl)... 94.75.225.20\n", + "Connecting to www.artis.nl (www.artis.nl)|94.75.225.20|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 361413 (353K) [image/jpeg]\n", + "Saving to: ‘./data/img2.JPG’\n", + "\n", + "./data/img2.JPG 100%[===================>] 352.94K 608KB/s in 0.6s \n", + "\n", + "2022-05-02 20:40:36 (608 KB/s) - ‘./data/img2.JPG’ saved [361413/361413]\n", + "\n", + "--2022-05-02 20:40:37-- https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\n", + "Resolving www.familyhandyman.com (www.familyhandyman.com)... 104.18.201.107, 104.18.202.107, 2606:4700::6812:c96b, ...\n", + "Connecting to www.familyhandyman.com (www.familyhandyman.com)|104.18.201.107|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 90994 (89K) [image/jpeg]\n", + "Saving to: ‘./data/img3.JPG’\n", + "\n", + "./data/img3.JPG 100%[===================>] 88.86K --.-KB/s in 0.006s \n", + "\n", + "2022-05-02 20:40:37 (15.4 MB/s) - ‘./data/img3.JPG’ saved [90994/90994]\n", + "\n", + "--2022-05-02 20:40:37-- https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\n", + "Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.217.33.238\n", + "Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.217.33.238|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 35363 (35K) [application/octet-stream]\n", + "Saving to: ‘./data/imagenet_class_index.json’\n", + "\n", + "./data/imagenet_cla 100%[===================>] 34.53K --.-KB/s in 0.07s \n", + "\n", + "2022-05-02 20:40:38 (489 KB/s) - ‘./data/imagenet_class_index.json’ saved [35363/35363]\n", + "\n" + ] + } + ], + "source": [ + "!mkdir -p ./data\n", + "!wget -O ./data/img0.JPG \"https://d17fnq9dkz9hgj.cloudfront.net/breed-uploads/2018/08/siberian-husky-detail.jpg?bust=1535566590&width=630\"\n", + "!wget -O ./data/img1.JPG \"https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg\"\n", + "!wget -O ./data/img2.JPG \"https://www.artis.nl/media/filer_public_thumbnails/filer_public/00/f1/00f1b6db-fbed-4fef-9ab0-84e944ff11f8/chimpansee_amber_r_1920x1080.jpg__1920x1080_q85_subject_location-923%2C365_subsampling-2.jpg\"\n", + "!wget -O ./data/img3.JPG \"https://www.familyhandyman.com/wp-content/uploads/2018/09/How-to-Avoid-Snakes-Slithering-Up-Your-Toilet-shutterstock_780480850.jpg\"\n", + "\n", + "!wget -O ./data/imagenet_class_index.json \"https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7392a8ec", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# visualizing the downloaded images\n", + "\n", + "from PIL import Image\n", + "from torchvision import transforms\n", + "import matplotlib.pyplot as plt\n", + "import json \n", + "\n", + "fig, axes = plt.subplots(nrows=2, ncols=2)\n", + "\n", + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " input_tensor = preprocess(img) \n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img)\n", + " plt.axis('off')\n", + "\n", + "# loading labels \n", + "with open(\"./data/imagenet_class_index.json\") as json_file: \n", + " d = json.load(json_file)" + ] + }, + { + "cell_type": "markdown", + "id": "1374edab", + "metadata": {}, + "source": [ + "### Download model from torch hub." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "659fa798", + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using cache found in /root/.cache/torch/hub/pytorch_vision_v0.10.0\n" + ] + }, + { + "data": { + "text/plain": [ + "ResNet(\n", + " (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n", + " (layer1): Sequential(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (layer2): Sequential(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (3): Bottleneck(\n", + " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (layer3): Sequential(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (3): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (4): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (5): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (layer4): Sequential(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n", + " (fc): Linear(in_features=2048, out_features=1000, bias=True)\n", + ")" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import torch\n", + "\n", + "torch.hub._validate_not_a_forked_repo=lambda a,b,c: True\n", + "\n", + "resnet50_model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)\n", + "resnet50_model.eval()" + ] + }, + { + "cell_type": "markdown", + "id": "0a67e8db", + "metadata": {}, + "source": [ + "### Build simple utility functions" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "60286396", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import time\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "def rn50_preprocess():\n", + " preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ])\n", + " return preprocess\n", + "\n", + "# decode the results into ([predicted class, description], probability)\n", + "def predict(img_path, model):\n", + " img = Image.open(img_path)\n", + " preprocess = rn50_preprocess()\n", + " input_tensor = preprocess(img)\n", + " input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model\n", + " \n", + " # move the input and model to GPU for speed if available\n", + " if torch.cuda.is_available():\n", + " input_batch = input_batch.to('cuda')\n", + " model.to('cuda')\n", + "\n", + " with torch.no_grad():\n", + " output = model(input_batch)\n", + " # Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes\n", + " sm_output = torch.nn.functional.softmax(output[0], dim=0)\n", + " \n", + " ind = torch.argmax(sm_output)\n", + " return d[str(ind.item())], sm_output[ind] #([predicted class, description], probability)\n", + "\n", + "# benchmarking models\n", + "def benchmark(model, input_shape=(1024, 1, 224, 224), dtype='fp32', nwarmup=50, nruns=10000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%10==0:\n", + " print('Iteration %d/%d, ave batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + " print('Images processed per second=', int(1000*input_shape[0]/(np.mean(timings)*1000)))\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output features size:\", features.size())\n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))" + ] + }, + { + "cell_type": "markdown", + "id": "21402d53", + "metadata": {}, + "source": [ + "Let's test our util functions on the model we have set up, starting with simple predictions" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "bb3e4a0d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "./data/img0.JPG - Predicted: ['n02110185', 'Siberian_husky'], Probablility: 0.49788108468055725\n", + "./data/img1.JPG - Predicted: ['n01820546', 'lorikeet'], Probablility: 0.6442285180091858\n", + "./data/img2.JPG - Predicted: ['n02481823', 'chimpanzee'], Probablility: 0.9899841547012329\n", + "./data/img3.JPG - Predicted: ['n01749939', 'green_mamba'], Probablility: 0.45675724744796753\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for i in range(4):\n", + " img_path = './data/img%d.JPG'%i\n", + " img = Image.open(img_path)\n", + " \n", + " pred, prob = predict(img_path, resnet50_model)\n", + " print('{} - Predicted: {}, Probablility: {}'.format(img_path, pred, prob))\n", + "\n", + " plt.subplot(2,2,i+1)\n", + " plt.imshow(img);\n", + " plt.axis('off');\n", + " plt.title(pred[1])" + ] + }, + { + "cell_type": "markdown", + "id": "2fc7f347", + "metadata": {}, + "source": [ + "Onwards, to benchmarking." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "f182b433", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 10.01 ms\n", + "Images processed per second= 1598\n", + "Iteration 20/100, ave batch time 10.01 ms\n", + "Images processed per second= 1598\n", + "Iteration 30/100, ave batch time 10.21 ms\n", + "Images processed per second= 1566\n", + "Iteration 40/100, ave batch time 10.33 ms\n", + "Images processed per second= 1549\n", + "Iteration 50/100, ave batch time 10.31 ms\n", + "Images processed per second= 1552\n", + "Iteration 60/100, ave batch time 10.25 ms\n", + "Images processed per second= 1560\n", + "Iteration 70/100, ave batch time 10.20 ms\n", + "Images processed per second= 1568\n", + "Iteration 80/100, ave batch time 10.18 ms\n", + "Images processed per second= 1572\n", + "Iteration 90/100, ave batch time 10.16 ms\n", + "Images processed per second= 1574\n", + "Iteration 100/100, ave batch time 10.15 ms\n", + "Images processed per second= 1575\n", + "Input shape: torch.Size([16, 3, 224, 224])\n", + "Output features size: torch.Size([16, 1000])\n", + "Average batch time: 10.15 ms\n" + ] + } + ], + "source": [ + "# Model benchmark without Torch-TensorRT\n", + "model = resnet50_model.eval().to(\"cuda\")\n", + "benchmark(model, input_shape=(16, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "id": "21e56cdf", + "metadata": {}, + "source": [ + "---\n", + "## Benchmarking with Torch-TRT (without dynamic shapes)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8c9ed780", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "trt_model_without_ds = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input((32, 3, 224, 224), dtype=torch.float32)],\n", + " enabled_precisions = torch.float32, # Run with FP32\n", + " workspace_size = 1 << 33\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "58a4ba94", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 6.10 ms\n", + "Images processed per second= 5242\n", + "Iteration 20/100, ave batch time 6.12 ms\n", + "Images processed per second= 5231\n", + "Iteration 30/100, ave batch time 6.14 ms\n", + "Images processed per second= 5215\n", + "Iteration 40/100, ave batch time 6.14 ms\n", + "Images processed per second= 5207\n", + "Iteration 50/100, ave batch time 6.15 ms\n", + "Images processed per second= 5202\n", + "Iteration 60/100, ave batch time 6.28 ms\n", + "Images processed per second= 5094\n", + "Iteration 70/100, ave batch time 6.26 ms\n", + "Images processed per second= 5110\n", + "Iteration 80/100, ave batch time 6.25 ms\n", + "Images processed per second= 5118\n", + "Iteration 90/100, ave batch time 6.25 ms\n", + "Images processed per second= 5115\n", + "Iteration 100/100, ave batch time 6.40 ms\n", + "Images processed per second= 5002\n", + "Input shape: torch.Size([32, 3, 224, 224])\n", + "Output features size: torch.Size([32, 1000])\n", + "Average batch time: 6.40 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_model_without_ds, input_shape=(32, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "id": "cd233b85", + "metadata": {}, + "source": [ + "With the baseline ready, we can proceed to the section working discussing dynamic shapes!" + ] + }, + { + "cell_type": "markdown", + "id": "bd5746da", + "metadata": {}, + "source": [ + "---\n", + "## Working with Dynamic shapes in Torch TRT\n", + "\n", + "Enabling \"Dynamic Shaped\" tensors to be used is essentially enabling the ability to defer defining the shape of tensors until runetime. Torch TensorRT simply leverages TensorRT's Dynamic shape support. You can read more about TensorRT's implementation in the [TensorRT Documentation](https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#work_dynamic_shapes).\n", + "\n", + "#### How can you use this feature?\n", + "\n", + "To make use of dynamic shapes, you need to provide three shapes:\n", + "* `min_shape`: The minimum size of the tensor considered for optimizations.\n", + "* `opt_shape`: The optimizations will be done with an effort to maximize performance for this shape.\n", + "* `min_shape`: The maximum size of the tensor considered for optimizations.\n", + "\n", + "Generally, users can expect best performance within the specified ranges. Performance for other shapes may be be lower for other shapes (depending on the model ops and GPU used)\n", + "\n", + "In the following example, we will showcase varing batch size, which is the zeroth dimension of our input tensors. As Convolution operations require that the channel dimension be a build-time constant, we won't be changing sizes of other channels in this example, but for models which contain ops conducive to changes in other channels, this functionality can be freely used." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "9a04007d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n" + ] + } + ], + "source": [ + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP32 precision.\n", + "trt_model_with_ds = torch_tensorrt.compile(model, inputs = [torch_tensorrt.Input(\n", + " min_shape=(16, 3, 224, 224),\n", + " opt_shape=(32, 3, 224, 224),\n", + " max_shape=(64, 3, 224, 224),\n", + " dtype=torch.float32)],\n", + " enabled_precisions = torch.float32, # Run with FP32\n", + " workspace_size = 1 << 33\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "f0babc85", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 3.88 ms\n", + "Images processed per second= 4122\n", + "Iteration 20/100, ave batch time 3.89 ms\n", + "Images processed per second= 4116\n", + "Iteration 30/100, ave batch time 3.88 ms\n", + "Images processed per second= 4123\n", + "Iteration 40/100, ave batch time 3.86 ms\n", + "Images processed per second= 4142\n", + "Iteration 50/100, ave batch time 3.85 ms\n", + "Images processed per second= 4156\n", + "Iteration 60/100, ave batch time 3.84 ms\n", + "Images processed per second= 4166\n", + "Iteration 70/100, ave batch time 3.84 ms\n", + "Images processed per second= 4170\n", + "Iteration 80/100, ave batch time 3.83 ms\n", + "Images processed per second= 4172\n", + "Iteration 90/100, ave batch time 3.83 ms\n", + "Images processed per second= 4176\n", + "Iteration 100/100, ave batch time 3.83 ms\n", + "Images processed per second= 4178\n", + "Input shape: torch.Size([16, 3, 224, 224])\n", + "Output features size: torch.Size([16, 1000])\n", + "Average batch time: 3.83 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_model_with_ds, input_shape=(16, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "e86a3541", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 6.71 ms\n", + "Images processed per second= 4767\n", + "Iteration 20/100, ave batch time 6.48 ms\n", + "Images processed per second= 4935\n", + "Iteration 30/100, ave batch time 6.39 ms\n", + "Images processed per second= 5005\n", + "Iteration 40/100, ave batch time 6.38 ms\n", + "Images processed per second= 5014\n", + "Iteration 50/100, ave batch time 6.38 ms\n", + "Images processed per second= 5016\n", + "Iteration 60/100, ave batch time 6.37 ms\n", + "Images processed per second= 5020\n", + "Iteration 70/100, ave batch time 6.37 ms\n", + "Images processed per second= 5024\n", + "Iteration 80/100, ave batch time 6.37 ms\n", + "Images processed per second= 5027\n", + "Iteration 90/100, ave batch time 6.37 ms\n", + "Images processed per second= 5026\n", + "Iteration 100/100, ave batch time 6.38 ms\n", + "Images processed per second= 5018\n", + "Input shape: torch.Size([32, 3, 224, 224])\n", + "Output features size: torch.Size([32, 1000])\n", + "Average batch time: 6.38 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_model_with_ds, input_shape=(32, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "35800f63", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, ave batch time 12.31 ms\n", + "Images processed per second= 5197\n", + "Iteration 20/100, ave batch time 12.42 ms\n", + "Images processed per second= 5153\n", + "Iteration 30/100, ave batch time 12.85 ms\n", + "Images processed per second= 4980\n", + "Iteration 40/100, ave batch time 12.71 ms\n", + "Images processed per second= 5033\n", + "Iteration 50/100, ave batch time 12.67 ms\n", + "Images processed per second= 5052\n", + "Iteration 60/100, ave batch time 12.63 ms\n", + "Images processed per second= 5067\n", + "Iteration 70/100, ave batch time 12.58 ms\n", + "Images processed per second= 5088\n", + "Iteration 80/100, ave batch time 12.56 ms\n", + "Images processed per second= 5096\n", + "Iteration 90/100, ave batch time 12.55 ms\n", + "Images processed per second= 5100\n", + "Iteration 100/100, ave batch time 12.57 ms\n", + "Images processed per second= 5091\n", + "Input shape: torch.Size([64, 3, 224, 224])\n", + "Output features size: torch.Size([64, 1000])\n", + "Average batch time: 12.57 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_model_with_ds, input_shape=(64, 3, 224, 224), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "id": "f87a75bd", + "metadata": {}, + "source": [ + "## What's Next?\n", + "\n", + "Check out the [TensorRT Getting started page](https://developer.nvidia.com/tensorrt-getting-started) for more tutorials, or visit the Torch-TensorRT [documentation](https://nvidia.github.io/Torch-TensorRT/) for more information!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/v1.2.0/_sources/_notebooks/lenet-getting-started.ipynb.txt b/docs/v1.2.0/_sources/_notebooks/lenet-getting-started.ipynb.txt new file mode 100644 index 0000000000..2db954946d --- /dev/null +++ b/docs/v1.2.0/_sources/_notebooks/lenet-getting-started.ipynb.txt @@ -0,0 +1,718 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Torch-TensorRT Getting Started - LeNet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch's JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.\n", + "\n", + "When deploying on NVIDIA GPUs TensorRT, NVIDIA's Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA's Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.\n", + "\n", + "Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a simple LeNet network. \n", + "\n", + "## Content\n", + "1. [Requirements](#1)\n", + "1. [Creating TorchScript modules](#2)\n", + "1. [Compiling with Torch-TensorRT](#3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "\n", + "Follow the steps in `notebooks/README` to prepare a Docker container, within which you can run this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting ipywidgets\n", + " Downloading ipywidgets-7.6.5-py2.py3-none-any.whl (121 kB)\n", + "\u001b[K |████████████████████████████████| 121 kB 12.7 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)\n", + "Collecting jupyterlab-widgets>=1.0.0\n", + " Downloading jupyterlab_widgets-1.0.2-py3-none-any.whl (243 kB)\n", + "\u001b[K |████████████████████████████████| 243 kB 115.0 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.3)\n", + "Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.7.0)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (7.31.0)\n", + "Collecting widgetsnbextension~=3.5.0\n", + " Downloading widgetsnbextension-3.5.2-py2.py3-none-any.whl (1.6 MB)\n", + "\u001b[K |████████████████████████████████| 1.6 MB 122.5 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)\n", + "Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.1)\n", + "Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.1.2)\n", + "Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.4)\n", + "Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)\n", + "Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.24)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.0)\n", + "Requirement already satisfied: pygments in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.1)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (22.3.0)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (0.3)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (4.9.1)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (2.8.2)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)\n", + "Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.4.0)\n", + "Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (5.4.0)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.7.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (1.16.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.5.0->ipywidgets) (6.4.1)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.12.1)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.13.0)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.3)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3.0)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (6.4.0)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.8.0)\n", + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.21)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.0.1)\n", + "Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.0)\n", + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.7.1)\n", + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.1.2)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.10)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (4.1.0)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.5.0)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.8.4)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.1)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (21.3)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.6)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets\n", + "Successfully installed ipywidgets-7.6.5 jupyterlab-widgets-1.0.2 widgetsnbextension-3.5.2\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Thu Feb 10 22:01:27 2022 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 510.39.01 Driver Version: 510.39.01 CUDA Version: 11.6 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 NVIDIA GeForce ... On | 00000000:09:00.0 Off | N/A |\n", + "| 0% 42C P8 20W / 320W | 0MiB / 10240MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org\n", + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 2. Creating TorchScript modules\n", + "\n", + "Here we create two submodules for a feature extractor and a classifier and stitch them together in a single LeNet module. In this case this is overkill but modules give us granular control over our program including where we decide to optimize and where we don't. It is also the unit that the TorchScript compiler operates on. So you can decide to only convert/optimize the feature extractor and leave the classifier in standard PyTorch or you can convert the whole thing. When compiling your module to TorchScript, there are two paths: Tracing and Scripting. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import torch \n", + "from torch import nn\n", + "import torch.nn.functional as F\n", + "\n", + "class LeNetFeatExtractor(nn.Module):\n", + " def __init__(self):\n", + " super(LeNetFeatExtractor, self).__init__()\n", + " self.conv1 = nn.Conv2d(1, 128, 3)\n", + " self.conv2 = nn.Conv2d(128, 16, 3)\n", + "\n", + " def forward(self, x):\n", + " x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))\n", + " x = F.max_pool2d(F.relu(self.conv2(x)), 2)\n", + " return x\n", + "\n", + "class LeNetClassifier(nn.Module):\n", + " def __init__(self):\n", + " super(LeNetClassifier, self).__init__()\n", + " self.fc1 = nn.Linear(16 * 6 * 6, 120)\n", + " self.fc2 = nn.Linear(120, 84)\n", + " self.fc3 = nn.Linear(84, 10)\n", + "\n", + " def forward(self, x):\n", + " x = torch.flatten(x,1)\n", + " x = F.relu(self.fc1(x))\n", + " x = F.relu(self.fc2(x))\n", + " x = self.fc3(x)\n", + " return x\n", + "\n", + "class LeNet(nn.Module):\n", + " def __init__(self):\n", + " super(LeNet, self).__init__()\n", + " self.feat = LeNetFeatExtractor()\n", + " self.classifer = LeNetClassifier()\n", + "\n", + " def forward(self, x):\n", + " x = self.feat(x)\n", + " x = self.classifer(x)\n", + " return x\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let us define a helper function to benchmark a model." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import numpy as np\n", + "\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "def benchmark(model, input_shape=(1024, 1, 32, 32), dtype='fp32', nwarmup=50, nruns=1000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%100==0:\n", + " print('Iteration %d/%d, ave batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output features size:\", features.size())\n", + " \n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### PyTorch model" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LeNet(\n", + " (feat): LeNetFeatExtractor(\n", + " (conv1): Conv2d(1, 128, kernel_size=(3, 3), stride=(1, 1))\n", + " (conv2): Conv2d(128, 16, kernel_size=(3, 3), stride=(1, 1))\n", + " )\n", + " (classifer): LeNetClassifier(\n", + " (fc1): Linear(in_features=576, out_features=120, bias=True)\n", + " (fc2): Linear(in_features=120, out_features=84, bias=True)\n", + " (fc3): Linear(in_features=84, out_features=10, bias=True)\n", + " )\n", + ")" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = LeNet()\n", + "model.to(\"cuda\").eval()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 5.56 ms\n", + "Iteration 200/1000, ave batch time 5.56 ms\n", + "Iteration 300/1000, ave batch time 5.56 ms\n", + "Iteration 400/1000, ave batch time 5.56 ms\n", + "Iteration 500/1000, ave batch time 5.56 ms\n", + "Iteration 600/1000, ave batch time 5.56 ms\n", + "Iteration 700/1000, ave batch time 5.56 ms\n", + "Iteration 800/1000, ave batch time 5.56 ms\n", + "Iteration 900/1000, ave batch time 5.56 ms\n", + "Iteration 1000/1000, ave batch time 5.56 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 5.56 ms\n" + ] + } + ], + "source": [ + "benchmark(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When compiling your module to TorchScript, there are two paths: Tracing and Scripting. \n", + " \n", + "### Tracing\n", + "\n", + "Tracing follows the path of execution when the module is called and records what happens. This recording is what the TorchScript IR will describe. To trace an instance of our LeNet module, we can call torch.jit.trace with an example input. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LeNet(\n", + " original_name=LeNet\n", + " (feat): LeNetFeatExtractor(\n", + " original_name=LeNetFeatExtractor\n", + " (conv1): Conv2d(original_name=Conv2d)\n", + " (conv2): Conv2d(original_name=Conv2d)\n", + " )\n", + " (classifer): LeNetClassifier(\n", + " original_name=LeNetClassifier\n", + " (fc1): Linear(original_name=Linear)\n", + " (fc2): Linear(original_name=Linear)\n", + " (fc3): Linear(original_name=Linear)\n", + " )\n", + ")" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "traced_model = torch.jit.trace(model, torch.empty([1,1,32,32]).to(\"cuda\"))\n", + "traced_model" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 5.56 ms\n", + "Iteration 200/1000, ave batch time 5.56 ms\n", + "Iteration 300/1000, ave batch time 5.56 ms\n", + "Iteration 400/1000, ave batch time 5.56 ms\n", + "Iteration 500/1000, ave batch time 5.56 ms\n", + "Iteration 600/1000, ave batch time 5.56 ms\n", + "Iteration 700/1000, ave batch time 5.56 ms\n", + "Iteration 800/1000, ave batch time 5.56 ms\n", + "Iteration 900/1000, ave batch time 5.56 ms\n", + "Iteration 1000/1000, ave batch time 5.56 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 5.56 ms\n" + ] + } + ], + "source": [ + "benchmark(traced_model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Scripting\n", + "\n", + "Scripting actually inspects your code with a compiler and generates an equivalent TorchScript program. The difference is that since tracing simply follows the execution of your module, it cannot pick up control flow for instance, it will only follow the code path that a particular input triggers. By working from the Python code, the compiler can include these components. We can run the script compiler on our LeNet module by calling torch.jit.script.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "model = LeNet().to(\"cuda\").eval()\n", + "script_model = torch.jit.script(model)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "RecursiveScriptModule(\n", + " original_name=LeNet\n", + " (feat): RecursiveScriptModule(\n", + " original_name=LeNetFeatExtractor\n", + " (conv1): RecursiveScriptModule(original_name=Conv2d)\n", + " (conv2): RecursiveScriptModule(original_name=Conv2d)\n", + " )\n", + " (classifer): RecursiveScriptModule(\n", + " original_name=LeNetClassifier\n", + " (fc1): RecursiveScriptModule(original_name=Linear)\n", + " (fc2): RecursiveScriptModule(original_name=Linear)\n", + " (fc3): RecursiveScriptModule(original_name=Linear)\n", + " )\n", + ")" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "script_model" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 5.56 ms\n", + "Iteration 200/1000, ave batch time 5.56 ms\n", + "Iteration 300/1000, ave batch time 5.56 ms\n", + "Iteration 400/1000, ave batch time 5.56 ms\n", + "Iteration 500/1000, ave batch time 5.56 ms\n", + "Iteration 600/1000, ave batch time 5.56 ms\n", + "Iteration 700/1000, ave batch time 5.56 ms\n", + "Iteration 800/1000, ave batch time 5.56 ms\n", + "Iteration 900/1000, ave batch time 5.56 ms\n", + "Iteration 1000/1000, ave batch time 5.56 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 5.56 ms\n" + ] + } + ], + "source": [ + "benchmark(script_model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## 3. Compiling with Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### TorchScript traced model\n", + "\n", + "First, we compile the TorchScript traced model with Torch-TensorRT. Notice the performance impact." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x.1\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Max value of this profile is not valid\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "# We use a batch-size of 1024, and half precision\n", + "trt_ts_module = torch_tensorrt.compile(traced_model, inputs=[torch_tensorrt.Input(\n", + " min_shape=[1024, 1, 32, 32],\n", + " opt_shape=[1024, 1, 33, 33],\n", + " max_shape=[1024, 1, 34, 34],\n", + " dtype=torch.half\n", + " )], \n", + " enabled_precisions = {torch.half})\n", + "\n", + "input_data = torch.randn((1024, 1, 32, 32))\n", + "input_data = input_data.half().to(\"cuda\")\n", + "\n", + "input_data = input_data.half()\n", + "result = trt_ts_module(input_data)\n", + "torch.jit.save(trt_ts_module, \"trt_ts_module.ts\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 1.41 ms\n", + "Iteration 200/1000, ave batch time 1.40 ms\n", + "Iteration 300/1000, ave batch time 1.40 ms\n", + "Iteration 400/1000, ave batch time 1.39 ms\n", + "Iteration 500/1000, ave batch time 1.40 ms\n", + "Iteration 600/1000, ave batch time 1.40 ms\n", + "Iteration 700/1000, ave batch time 1.40 ms\n", + "Iteration 800/1000, ave batch time 1.40 ms\n", + "Iteration 900/1000, ave batch time 1.40 ms\n", + "Iteration 1000/1000, ave batch time 1.40 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 1.40 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_ts_module, input_shape=(1024, 1, 32, 32), dtype=\"fp16\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### TorchScript script model\n", + "\n", + "Next, we compile the TorchScript script model with Torch-TensorRT. Notice the performance impact." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x.1, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x.1\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Max value of this profile is not valid\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "trt_script_module = torch_tensorrt.compile(script_model, inputs = [torch_tensorrt.Input(\n", + " min_shape=[1024, 1, 32, 32],\n", + " opt_shape=[1024, 1, 33, 33],\n", + " max_shape=[1024, 1, 34, 34],\n", + " dtype=torch.half\n", + " )],\n", + " enabled_precisions={torch.half})\n", + "\n", + "input_data = torch.randn((1024, 1, 32, 32))\n", + "input_data = input_data.half().to(\"cuda\")\n", + "\n", + "input_data = input_data.half()\n", + "result = trt_script_module(input_data)\n", + "torch.jit.save(trt_script_module, \"trt_script_module.ts\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, ave batch time 1.43 ms\n", + "Iteration 200/1000, ave batch time 1.41 ms\n", + "Iteration 300/1000, ave batch time 1.40 ms\n", + "Iteration 400/1000, ave batch time 1.42 ms\n", + "Iteration 500/1000, ave batch time 1.42 ms\n", + "Iteration 600/1000, ave batch time 1.41 ms\n", + "Iteration 700/1000, ave batch time 1.41 ms\n", + "Iteration 800/1000, ave batch time 1.40 ms\n", + "Iteration 900/1000, ave batch time 1.40 ms\n", + "Iteration 1000/1000, ave batch time 1.40 ms\n", + "Input shape: torch.Size([1024, 1, 32, 32])\n", + "Output features size: torch.Size([1024, 10])\n", + "Average batch time: 1.40 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_script_module, input_shape=(1024, 1, 32, 32), dtype=\"fp16\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling TorchScript models with Torch-TensorRT and test the performance impact of the optimization.\n", + "\n", + "### What's next\n", + "Now it's time to try Torch-TensorRT on your own model. Fill out issues at https://github.com/NVIDIA/Torch-TensorRT. Your involvement will help future development of Torch-TensorRT.\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.2.0/_sources/_notebooks/ssd-object-detection-demo.ipynb.txt b/docs/v1.2.0/_sources/_notebooks/ssd-object-detection-demo.ipynb.txt new file mode 100644 index 0000000000..f2a0bd8063 --- /dev/null +++ b/docs/v1.2.0/_sources/_notebooks/ssd-object-detection-demo.ipynb.txt @@ -0,0 +1,943 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2020 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Object Detection with Torch-TensorRT (SSD)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Overview\n", + "\n", + "In the practice of developing machine learning models, there are few tools as approachable as PyTorch for developing and experimenting in designing machine learning models. The power of PyTorch comes from its deep integration into Python, its flexibility and its approach to automatic differentiation and execution (eager execution). However, when moving from research into production, the requirements change and we may no longer want that deep Python integration and we want optimization to get the best performance we can on our deployment platform. In PyTorch 1.0, TorchScript was introduced as a method to separate your PyTorch model from Python, make it portable and optimizable. TorchScript uses PyTorch's JIT compiler to transform your normal PyTorch code which gets interpreted by the Python interpreter to an intermediate representation (IR) which can have optimizations run on it and at runtime can get interpreted by the PyTorch JIT interpreter. For PyTorch this has opened up a whole new world of possibilities, including deployment in other languages like C++. It also introduces a structured graph based format that we can use to do down to the kernel level optimization of models for inference.\n", + "\n", + "When deploying on NVIDIA GPUs TensorRT, NVIDIA's Deep Learning Optimization SDK and Runtime is able to take models from any major framework and specifically tune them to perform better on specific target hardware in the NVIDIA family be it an A100, TITAN V, Jetson Xavier or NVIDIA's Deep Learning Accelerator. TensorRT performs a couple sets of optimizations to achieve this. TensorRT fuses layers and tensors in the model graph, it then uses a large kernel library to select implementations that perform best on the target GPU. TensorRT also has strong support for reduced operating precision execution which allows users to leverage the Tensor Cores on Volta and newer GPUs as well as reducing memory and computation footprints on device.\n", + "\n", + "Torch-TensorRT is a compiler that uses TensorRT to optimize TorchScript code, compiling standard TorchScript modules into ones that internally run with TensorRT optimizations. This enables you to continue to remain in the PyTorch ecosystem, using all the great features PyTorch has such as module composability, its flexible tensor implementation, data loaders and more. Torch-TensorRT is available to use with both PyTorch and LibTorch." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Learning objectives\n", + "\n", + "This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained SSD network, and running it to test the speedup obtained.\n", + "\n", + "## Contents\n", + "1. [Requirements](#1)\n", + "2. [SSD Overview](#2)\n", + "3. [Creating TorchScript modules](#3)\n", + "4. [Compiling with Torch-TensorRT](#4)\n", + "5. [Running Inference](#5)\n", + "6. [Measuring Speedup](#6)\n", + "7. [Conclusion](#7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 1. Requirements\n", + "\n", + "Follow the steps in `notebooks/README` to prepare a Docker container, within which you can run this demo notebook.\n", + "\n", + "In addition to that, run the following cell to obtain additional libraries specific to this demo." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting scikit-image==0.19.1\n", + " Downloading scikit_image-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.8 MB)\n", + "\u001b[K |████████████████████████████████| 13.8 MB 8.8 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: networkx>=2.2 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (2.6.3)\n", + "Collecting tifffile>=2019.7.26\n", + " Downloading tifffile-2022.3.16-py3-none-any.whl (179 kB)\n", + "\u001b[K |████████████████████████████████| 179 kB 110.1 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (21.3)\n", + "Requirement already satisfied: scipy>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (1.6.3)\n", + "Requirement already satisfied: numpy>=1.17.0 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (1.22.2)\n", + "Collecting imageio>=2.4.1\n", + " Downloading imageio-2.16.1-py3-none-any.whl (3.3 MB)\n", + "\u001b[K |████████████████████████████████| 3.3 MB 42.3 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: pillow!=7.1.0,!=7.1.1,!=8.3.0,>=6.1.0 in /opt/conda/lib/python3.8/site-packages (from scikit-image==0.19.1) (9.0.0)\n", + "Collecting PyWavelets>=1.1.1\n", + " Downloading PyWavelets-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.9 MB)\n", + "\u001b[K |████████████████████████████████| 6.9 MB 61.3 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging>=20.0->scikit-image==0.19.1) (3.0.7)\n", + "Installing collected packages: tifffile, PyWavelets, imageio, scikit-image\n", + "Successfully installed PyWavelets-1.3.0 imageio-2.16.1 scikit-image-0.19.1 tifffile-2022.3.16\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n", + "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", + "Collecting ipywidgets\n", + " Downloading ipywidgets-7.7.0-py2.py3-none-any.whl (123 kB)\n", + "\u001b[K |████████████████████████████████| 123 kB 12.1 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (6.9.0)\n", + "Collecting jupyterlab-widgets>=1.0.0\n", + " Downloading jupyterlab_widgets-1.1.0-py3-none-any.whl (245 kB)\n", + "\u001b[K |████████████████████████████████| 245 kB 60.6 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.3)\n", + "Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (0.2.0)\n", + "Requirement already satisfied: ipython>=4.0.0 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (8.0.1)\n", + "Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.8/site-packages (from ipywidgets) (5.1.1)\n", + "Collecting widgetsnbextension~=3.6.0\n", + " Downloading widgetsnbextension-3.6.0-py2.py3-none-any.whl (1.6 MB)\n", + "\u001b[K |████████████████████████████████| 1.6 MB 35.2 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: nest-asyncio in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.4)\n", + "Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.1.2)\n", + "Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)\n", + "Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.3)\n", + "Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.1)\n", + "Requirement already satisfied: stack-data in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.1.4)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.26)\n", + "Requirement already satisfied: pickleshare in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)\n", + "Requirement already satisfied: pygments in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (2.11.2)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)\n", + "Requirement already satisfied: decorator in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (5.1.1)\n", + "Requirement already satisfied: backcall in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)\n", + "Requirement already satisfied: black in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (22.1.0)\n", + "Requirement already satisfied: setuptools>=18.5 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (59.5.0)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.8/site-packages (from ipython>=4.0.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.8/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.8.3)\n", + "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (0.3)\n", + "Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (22.3.0)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (4.9.1)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (2.8.2)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets) (4.4.0)\n", + "Requirement already satisfied: attrs>=17.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.4.0)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.18.1)\n", + "Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (5.4.0)\n", + "Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.8/site-packages (from importlib-resources>=1.4.0->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.7.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.8/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets) (1.16.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.8/site-packages (from widgetsnbextension~=3.6.0->ipywidgets) (6.4.1)\n", + "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.1)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.8.0)\n", + "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.1)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.0.3)\n", + "Requirement already satisfied: nbconvert in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (6.4.2)\n", + "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3.0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.15.0)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.8/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.21)\n", + "Requirement already satisfied: pathspec>=0.9.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (0.9.0)\n", + "Requirement already satisfied: tomli>=1.1.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (2.0.1)\n", + "Requirement already satisfied: mypy-extensions>=0.4.3 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (0.4.3)\n", + "Requirement already satisfied: click>=8.0.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (8.0.3)\n", + "Requirement already satisfied: platformdirs>=2 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (2.4.1)\n", + "Requirement already satisfied: typing-extensions>=3.10.0.0 in /opt/conda/lib/python3.8/site-packages (from black->ipython>=4.0.0->ipywidgets) (4.0.1)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.0.1)\n", + "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.7.1)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.8.4)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.11)\n", + "Requirement already satisfied: testpath in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.0)\n", + "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.1.2)\n", + "Requirement already satisfied: bleach in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (4.1.0)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.5.0)\n", + "Requirement already satisfied: webencodings in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.1)\n", + "Requirement already satisfied: packaging in /opt/conda/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (21.3)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.0.7)\n", + "Requirement already satisfied: executing in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.8.2)\n", + "Requirement already satisfied: pure-eval in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (0.2.2)\n", + "Requirement already satisfied: asttokens in /opt/conda/lib/python3.8/site-packages (from stack-data->ipython>=4.0.0->ipywidgets) (2.0.5)\n", + "Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets\n", + "Successfully installed ipywidgets-7.7.0 jupyterlab-widgets-1.1.0 widgetsnbextension-3.6.0\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install scikit-image==0.19.1\n", + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 2. SSD\n", + "\n", + "### Single Shot MultiBox Detector model for object detection\n", + "\n", + "_ | _\n", + "- | -\n", + "![alt](https://pytorch.org/assets/images/ssd_diagram.png) | ![alt](https://pytorch.org/assets/images/ssd.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "PyTorch has a model repository called the PyTorch Hub, which is a source for high quality implementations of common models. We can get our SSD model pretrained on [COCO](https://cocodataset.org/#home) from there.\n", + "\n", + "### Model Description\n", + "\n", + "This SSD300 model is based on the\n", + "[SSD: Single Shot MultiBox Detector](https://arxiv.org/abs/1512.02325) paper, which\n", + "describes SSD as “a method for detecting objects in images using a single deep neural network\".\n", + "The input size is fixed to 300x300.\n", + "\n", + "The main difference between this model and the one described in the paper is in the backbone.\n", + "Specifically, the VGG model is obsolete and is replaced by the ResNet-50 model.\n", + "\n", + "From the\n", + "[Speed/accuracy trade-offs for modern convolutional object detectors](https://arxiv.org/abs/1611.10012)\n", + "paper, the following enhancements were made to the backbone:\n", + "* The conv5_x, avgpool, fc and softmax layers were removed from the original classification model.\n", + "* All strides in conv4_x are set to 1x1.\n", + "\n", + "The backbone is followed by 5 additional convolutional layers.\n", + "In addition to the convolutional layers, we attached 6 detection heads:\n", + "* The first detection head is attached to the last conv4_x layer.\n", + "* The other five detection heads are attached to the corresponding 5 additional layers.\n", + "\n", + "Detector heads are similar to the ones referenced in the paper, however,\n", + "they are enhanced by additional BatchNorm layers after each convolution.\n", + "\n", + "More information about this SSD model is available at Nvidia's \"DeepLearningExamples\" Github [here](https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/Detection/SSD)." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "torch.hub._validate_not_a_forked_repo=lambda a,b,c: True" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Downloading: \"https://github.com/NVIDIA/DeepLearningExamples/archive/torchhub.zip\" to /root/.cache/torch/hub/torchhub.zip\n", + "/root/.cache/torch/hub/NVIDIA_DeepLearningExamples_torchhub/PyTorch/Classification/ConvNets/image_classification/models/efficientnet.py:17: UserWarning: pytorch_quantization module not found, quantization will not be available\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/plain": [ + "['nvidia_convnets_processing_utils',\n", + " 'nvidia_efficientnet',\n", + " 'nvidia_efficientnet_b0',\n", + " 'nvidia_efficientnet_b4',\n", + " 'nvidia_efficientnet_widese_b0',\n", + " 'nvidia_efficientnet_widese_b4',\n", + " 'nvidia_resneXt',\n", + " 'nvidia_resnet50',\n", + " 'nvidia_resnext101_32x4d',\n", + " 'nvidia_se_resnext101_32x4d',\n", + " 'nvidia_ssd',\n", + " 'nvidia_ssd_processing_utils',\n", + " 'nvidia_tacotron2',\n", + " 'nvidia_tts_utils',\n", + " 'nvidia_waveglow']" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# List of available models in PyTorch Hub from Nvidia/DeepLearningExamples\n", + "torch.hub.list('NVIDIA/DeepLearningExamples:torchhub')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using cache found in /root/.cache/torch/hub/NVIDIA_DeepLearningExamples_torchhub\n", + "Downloading: \"https://download.pytorch.org/models/resnet50-0676ba61.pth\" to /root/.cache/torch/hub/checkpoints/resnet50-0676ba61.pth\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1c7cf3e1635d4a2b9c8731b7fc9ce724", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0.00/97.8M [00:0040%) in a more comprehensive format.\n", + "results_per_input = utils.decode_results(detections_batch)\n", + "best_results_per_input = [utils.pick_best(results, 0.40) for results in results_per_input]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualize results" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "import matplotlib.patches as patches\n", + "\n", + "# The utility plots the images and predicted bounding boxes (with confidence scores).\n", + "def plot_results(best_results):\n", + " for image_idx in range(len(best_results)):\n", + " fig, ax = plt.subplots(1)\n", + " # Show original, denormalized image...\n", + " image = inputs[image_idx] / 2 + 0.5\n", + " ax.imshow(image)\n", + " # ...with detections\n", + " bboxes, classes, confidences = best_results[image_idx]\n", + " for idx in range(len(bboxes)):\n", + " left, bot, right, top = bboxes[idx]\n", + " x, y, w, h = [val * 300 for val in [left, bot, right - left, top - bot]]\n", + " rect = patches.Rectangle((x, y), w, h, linewidth=1, edgecolor='r', facecolor='none')\n", + " ax.add_patch(rect)\n", + " ax.text(x, y, \"{} {:.0f}%\".format(classes_to_labels[classes[idx] - 1], confidences[idx]*100), bbox=dict(facecolor='white', alpha=0.5))\n", + " plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Visualize results without Torch-TensorRT\n", + "plot_results(best_results_per_input)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Benchmark utility" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import numpy as np\n", + "\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "# Helper function to benchmark the model\n", + "def benchmark(model, input_shape=(1024, 1, 32, 32), dtype='fp32', nwarmup=50, nruns=1000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " pred_loc, pred_label = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%10==0:\n", + " print('Iteration %d/%d, avg batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output location prediction size:\", pred_loc.size())\n", + " print(\"Output label prediction size:\", pred_label.size())\n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We check how well the model performs **before** we use Torch-TensorRT" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 165.38 ms\n", + "Iteration 20/100, avg batch time 165.99 ms\n", + "Iteration 30/100, avg batch time 166.04 ms\n", + "Iteration 40/100, avg batch time 166.32 ms\n", + "Iteration 50/100, avg batch time 166.49 ms\n", + "Iteration 60/100, avg batch time 166.74 ms\n", + "Iteration 70/100, avg batch time 166.88 ms\n", + "Iteration 80/100, avg batch time 167.05 ms\n", + "Iteration 90/100, avg batch time 167.18 ms\n", + "Iteration 100/100, avg batch time 167.31 ms\n", + "Input shape: torch.Size([128, 3, 300, 300])\n", + "Output location prediction size: torch.Size([128, 4, 8732])\n", + "Output label prediction size: torch.Size([128, 81, 8732])\n", + "Average batch time: 167.31 ms\n" + ] + } + ], + "source": [ + "# Model benchmark without Torch-TensorRT\n", + "model = ssd300.eval().to(\"cuda\")\n", + "benchmark(model, input_shape=(128, 3, 300, 300), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 3. Creating TorchScript modules " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To compile with Torch-TensorRT, the model must first be in **TorchScript**. TorchScript is a programming language included in PyTorch which removes the Python dependency normal PyTorch models have. This conversion is done via a JIT compiler which given a PyTorch Module will generate an equivalent TorchScript Module. There are two paths that can be used to generate TorchScript: **Tracing** and **Scripting**.
\n", + "- Tracing follows execution of PyTorch generating ops in TorchScript corresponding to what it sees.
\n", + "- Scripting does an analysis of the Python code and generates TorchScript, this allows the resulting graph to include control flow which tracing cannot do. \n", + "\n", + "Tracing however due to its simplicity is more likely to compile successfully with Torch-TensorRT (though both systems are supported)." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "model = ssd300.eval().to(\"cuda\")\n", + "traced_model = torch.jit.trace(model, [torch.randn((1,3,300,300)).to(\"cuda\")])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If required, we can also save this model and use it independently of Python." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# This is just an example, and not required for the purposes of this demo\n", + "torch.jit.save(traced_model, \"ssd_300_traced.jit.pt\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 165.53 ms\n", + "Iteration 20/100, avg batch time 166.19 ms\n", + "Iteration 30/100, avg batch time 166.12 ms\n", + "Iteration 40/100, avg batch time 166.16 ms\n", + "Iteration 50/100, avg batch time 166.24 ms\n", + "Iteration 60/100, avg batch time 166.33 ms\n", + "Iteration 70/100, avg batch time 166.43 ms\n", + "Iteration 80/100, avg batch time 166.44 ms\n", + "Iteration 90/100, avg batch time 166.53 ms\n", + "Iteration 100/100, avg batch time 166.59 ms\n", + "Input shape: torch.Size([128, 3, 300, 300])\n", + "Output location prediction size: torch.Size([128, 4, 8732])\n", + "Output label prediction size: torch.Size([128, 81, 8732])\n", + "Average batch time: 166.59 ms\n" + ] + } + ], + "source": [ + "# Obtain the average time taken by a batch of input with Torchscript compiled modules\n", + "benchmark(traced_model, input_shape=(128, 3, 300, 300), nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 4. Compiling with Torch-TensorRT\n", + "TorchScript modules behave just like normal PyTorch modules and are intercompatible. From TorchScript we can now compile a TensorRT based module. This module will still be implemented in TorchScript but all the computation will be done in TensorRT." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n" + ] + } + ], + "source": [ + "import torch_tensorrt\n", + "\n", + "# The compiled module will have precision as specified by \"op_precision\".\n", + "# Here, it will have FP16 precision.\n", + "trt_model = torch_tensorrt.compile(traced_model, \n", + " inputs= [torch_tensorrt.Input((3, 3, 300, 300), dtype=torch.half)],\n", + " enabled_precisions= {torch.half}, # Run with FP16\n", + " workspace_size= 1 << 20\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 5. Running Inference" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we run object detection" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# using a Torch-TensorRT module is exactly the same as how we usually do inference in PyTorch i.e. model(inputs)\n", + "detections_batch = trt_model(tensor.to(torch.half)) # convert the input to half precision\n", + "\n", + "# By default, raw output from SSD network per input image contains 8732 boxes with \n", + "# localization and class probability distribution. \n", + "# Let’s filter this output to only get reasonable detections (confidence>40%) in a more comprehensive format.\n", + "results_per_input = utils.decode_results(detections_batch)\n", + "best_results_per_input_trt = [utils.pick_best(results, 0.40) for results in results_per_input]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, let's visualize our predictions!\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQEAAAD8CAYAAAB3lxGOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOz9efRt237QBX6+c861dvNrTnO7d+97L3lJSAMJSGygqLIwVJABAYwVNI1hRAlWKBpLi7ICAhbSOWKpWEqUQVQErIokVolGihIUQaihjgJFxYSEPJK8l3f705/f77f3XmvO+a0/vnOuZu/9+51zX6Mngzvv/Z2992rmmmvO+e07UVU+bB+2D9vfvs39zz2AD9uH7cP2P2/7EAl82D5sf5u3D5HAh+3D9rd5+xAJfNg+bH+btw+RwIftw/a3efsQCXzYPmx/m7cvGBIQkV8uIj8mIp8Ukd/+hXrOh+3D9mH73Jp8IfwERMQDfxP4+4HPAH8F+DZV/ZHP+8M+bB+2D9vn1L5QnMAvAD6pqj+hqh3wJ4Fv/AI968P2YfuwfQ4tfIH6/Sjw05PfnwF+4XUX37p1S1977dW9o3LzE+Twpx6cvqaP5+r6hosOTh2/9hmP+ZybTB6gOv/9zHvr6I7MI6h9yt5MyPxykTLnKogIzgec87OB6OEjAEU1o5qHK0Q8IjK5R2bXo5mcEylGco72wtPOxZX1Hw7Y7/2NMX1THUZz7ILDUX9Aplln34TrZuN5lk3nHc6ecHju+HP+5t/8sXuq+sr+8S8UEnhmE5HvAr4L4NVXX+EPfe+/wgB+IhiTMu66YYOoDt9lstlEhCraiMh4buhifs/smtL2798/X+d2/vz6d/Qd578nW3v6HvMHzH/bJXL0vY/fP58T0GEO5Mi98/lQvCgO+xMRxAnOCV4EEXsHJ4JIxnsBEZKC8y2rk1ssV2eEZgGuoYKXoCBqv1VBI9vtYy4uH5D6nqY54fT0ZdrlScEsZaZUEVFyvyVuL7h8+pAnj+8R+w0Sk72uE9R71DWoBBRHRsgIKg5FUARRLUAs9qlSRqYFnyioDIB+TExW1eG4ynEmenbNtA9VVOQoJhGRsjccTPbxsf72+67HDp8535eqyi/9+r/vU8fG/IVCAm8CH5/8/lg5Nh3U9wHfB/AVX/Hlug+k03YMIPePHQcqmJKCmxDA/nnKXVJJ7DWkVitiOPLkCgJHRzVBatPfh9dcf/7Z1P/4Rj4+T2OfWu60x9uBaU92PoOCE4eqklLPbneFOEHJNG2ZY8mgeb45NZH6HbvNBV23ZbVU8uoc8hLxviyZ3ZdTz+7yMVdPH7K9fEzabRBNpW9HFkfGozjQQjjKn2qBdUBVhvcbOIAB4qe/50C430TkOfmGgxuvZUpU607JBREdRwL7x44im8k1dbzPal8oJPBXgC8XkS/BgP9bgX/kphsOqfr4ffqXc54dh+Mbux6bcgHT6w7vsSWajYMJlA0AuY+Mbnin52D0rlukkWjI8Pv49cqIp+TIdce3bH3/+ZzYBtdCtQxwlJwpHJAOcyLOnptzHoA99Vs6sXlzIvjgESfGBaiguQKoZ7E44ezsLrHfslieslwsrR8t9Dkboui3l1w8us/24jEpbnFaBxPIEozSq6DZIeJs3FB5GQqumk7XgBAGRMFIoJ9XUX6tlPGcbSQQlUNRG6+O63sMAUyPH5w7eIfnETS+QEhAVaOI/BbgzwIe+KOq+sM33XMUGOT4+X1KPhUFbrrmxufvP5AiGQ8Y9fD8Pk44yp4PJPWw3YStRyR4XL6rY6qAOo5xv+86zsm2m8zVHCnagxXIMLDQThSVgmmkzktFAM5EBgHVTOo7OoM0QtsQmgbnA4IHCaAOVU8IwsnKkZc9PrQ416AIOSU09cR+R7e5ZHP1lG5zSc7JAERdYfMDGUeuwI4D3ADglcUe5eVRHLDv08my46aj+OzbdUB7rMns28iRfBAKfrTTax5/U39fMJ2Aqv4Z4M8818X7rL0dPCqbH6Pe0+MDB3ANy3+8H67j5yffC0WbQf0N/V3b6bPuqefKY4dNfWR4Myp+3TWGSFSH7T97xpTjqlSxUqNc7s3lZhEM2J2iGZwK6kGy0V4REwtyiqQYCV1DaBt8WBDCEudckXsdEPB+iZcGVIhdImui73d0uwu6bkO33dDvtpAigkNcS8FCqPgi+9s8ywQh1HcQIA+6gPmcTKmlcUB1bT8Yfb+JJb/uWqZPmaoNBq7ukKt93rYvZj5L/IP/GRWD+22mACsH9mX+4/fYffWaY7qDm597vYxXuNOipBqf87ztBibg2ffu87BH3rHqDEYxYKR2A+CX95tu70FQKNR/pJbTJ8lwwEC8agIEso0hVznX2YDFZQozYVxB7ul6j4QdwXcEHxFpjeWXCNKDZjRC7DN939HFLTFuSDmi5c+JDAo/EY+qKf5yGXgdbxUNqAq/2TzuEY9K/Ye3HufvJu7rmtU6+CX7cvzeHaJidGWy7w/Z+ePcxSDk7nPA1ygen/U2LwQSmG66QwotIzQCR6Zzcunh92cihmfMkKixwDfvieMYXCb9P3tL7Ysz5eiRfvdGWNZ+xrbMZFzZ639ABoX6C4XRmfZaWIsBgRSxo9LMOjZ0sqFz1cWDU1BNqOsh90TpETqgNYRBROnIqScnQROklFDtyRqp1gRc6VE9ORflnzpSFVEGzV8d3fj+qiP6Gud1MhsHCKIiz+u5r+vWYBT9GESq6Xzv8xj1+cM7KHs74HoOoPZ+iBz2n6FMLVLXtRcCCcAeVpNx4LN1egZXVDmI/X6Pat6n/2qZsJlSUKYXHh2vDVDrg48MU2fvMjszYd/nrPyUXh9n9/eVesc3i86/XiMq1OuGuZvoBBwVyg8BbTpc0SImVJEBMG19RjF/gKwJ1YjmLaIOJIJ25BxNYaiu9Jknz6r8h3ECikeLBSCTB+ZMBi7GRjYq2uaITyrrP8zXnO+Zcw7P18b5r1zZEY71pk08WC1GKn7MJPgcIznyDJ3oGa9HBS8MEkDcwNJODo6sz/CPm5y1NgLIFOBk0sM+SjmcEDebxJspd2UMpntJZKQEs3tnisVJHzJS+UMEcOSZe/dPN3LF+NPXHI5h1OZZ9GDYeANJUlMOTljMuk9tmbLNbBFJUkFIzglZgCSDhUGlOgdFU76pQ8gD0FbqPgBxrix9teMb4GuhmFm03D0SDfsYyWk9r8Os7ot9U+RdgXjqx3HN/Fy7hZ7tcjRXVB7e/9ytWlH2CMBU9JlyPPqMtX9BkMBkAeqCXnulTDYq41pWRLDHPs85+WcwRs9i3Ye+ZXzucG507Nnvr5yeAH4ZzQTpHVPsXc8tjA8YAWFyWCbczTWvcuhjUSjPMHDraFS02u9hrqlgOud0NIM4IeXSV5YJcSo8hiqDHn6qkxmWtQJ9va2KBJP5QslMtfkVWVWKXLusO2CcSC3PnUPk9UBY9SwzU97s/LyPYzL8gIarqDFBGtN9f8zKtW/yE53qMo5wF2UT6zj4G9sLggTmm3LepjLtyJaOmK5S2mcA+DOePZhmZo+eUolxMm980hQZzHhm62PqAHRTT4NSr2zsG6bneDdCkevtx/5l+7qSUTcw3TRTzFPBvv5yuGHT1+cVZj7XLW/UuyrJ7BkjEI92cRmAQ4swMZjzJl589XUnygh7r7JOI2DUb+POmX+ZvFLtbu/gfL714Lxdc7Nj0Xh9dRQa134fkRzqdeYnB3oxEc3mXAzj9+kayv41h+2FQQLH2sgTHGLHY99vOvc8VoLDY3MK/rztmGJpDsyyd+wIF8EhJ1AXc7oPruda9EDZNx3LUZ3C5H1tTGXzyqEwIWVDDjS2PGyUbdNA1es6Tn3mMkwQSgXWOpaqnLM3HIC7UvfpHme+T0bOwW7Jw03jNcfbnBLvm9oOrt7bW9cjgxF53vT0m9uEe0EL0jt21RFdWhnDTc99MZCAHAHmfexcNvS+N+FUefIs34Abh3DNfVNz3HM7gsyQxvWUfMT+1yOgunWOIYlpO7CCyAgUo1fa/Pp97LZPEQckpPscTNlWOm5IEWZAXq8axzA9s0+p9/zjhfG+yr5reYfqwzC5f9z6hy6382M3cFR7KPWYq+7+7+sQxcFemczjcM0ebpru4X1Lz2RUDIBwZCteyyzqTTvnRUECE6DebyNmq+zj/NqbnImex2/guKx9vD0vgrkuiONIjzc+ezy3N+YqAj3r+RMu4jhTOOlpbx5UZX7TAQJUE/fr5i0TOVJlu6bu2cwomozC/hRplXGrcQFToUEVNCtVPBtcg0uXqdDAqisaxYLS9TXBPvP5up6yHzr5jMjlRk5hug3qBO+tzYDcJs+a7u1cRZ9hksbnHxvfOICx/3Hcx9uLgQSeAVuDzMkc+K/tbsLq3nztSKNmLOaR+z6I19Zs3MyB64NwFFNuYsoJVPp5eP0+uT/S55Rp1PmFox6CAQGoTKjxpInsc2vz31Ow2+fEZdjXEwpdfinFC3CglBPAHuZg6uU3ua72Xa7TPXlIhuPHgHcErOsQwOxJR9awWlJ0PFDGrhxySc/ZdOAlbxznQcsT4H8GfL0YSIAj4sDs3PzIPvV/Xk/Bw2MTrbfcdN0h8H42YscHFS2u4wQ+u6ZzwNob0+SqiYxed+Dh8zWPbOqBkhZI0z07/dwHhP2fR8STPe6YkcPYAywdTw8Duabv4+05RIJnLcURWJebTj7P2A5ZuKGf6wKMbn7avL0wSADGzbcH89dfP6H4n4t1YL/P/e/7yqIP8qzrXFCP9XFcNJli/iPnb7p+cvpZ+3eAm+L9N909+RjVm0HaHOp0Yq8frjjGsQ4LPUFQMyiGMQR4T7TSPU6NydxUyWEypmm73t//mPfldLxz7mMY6Uy3YopeKqciTAfzTIXjc7drbj92+GeETmDK5j8Lde0D4qCwkkw1N32uCOGz4yqu7W34ZkA89fUHjgLTeN88PHg8W9m8qndW9thzqcCnkxuOvcMUVRx3ZtlXco58vR1TnfY1H+M+AtgPejJRZ0599+3iTHRB0/c7oNTDRE2efkSUqc85cvSoAnUuXo7vORXv51Mkh8t5nJzf2KYetGMvcrAM03bssEzdq4+0FwIJ7APutcOtFL+y8NSJGqHkWZ5xhrQLtmakrh8EMY9jPa7Yu56SwOHbHVKJw3v2+2eAronkN5OQr9cHzJ87R0gckI19yjw+a/6MuXZ77+prNOv71p1jIx4/ZH58hrsqAdlHQkfY+ZufdNiKEnJAOhNuo/Kt4xTpgK9kGPOcW9l/k8mD5iOfcVLHYGPkSm56L9smct1DgRcGCUBVJcn+wk6aTI/vU4IjL3q92W/o7SiVPXb/MTPQde1ZMv/nRXJ5Hvl0uHb29IOTOmzYObUaWX6dbPQbuuLZbO7xeIf5c/UA6KfX1X0ww0CTsxyh/jdP1J5x4OB5s9N7c2kAL7NnjzMpw4ir/8NBF0fGONeFWG+HuPj5qJZx2dc+FHiBkMDzsOADTjw4pdOzN9x/8zOf99opFft89F2vP2ZNuM5+PKWwlRW3XHpQM/kcztPkuoMRjABfSd8MlI4qoG54nyM9T99p/j77V+yb9HR2TQWwY/3vcxbzdbieKOiRS6bvl1WPPnOc77GDGZNCjav8YAlLDoiOHtFH7HNR+2LCQC8P7522FwMJyHEgKz/m8paOX6ZKludV2t0k3z+fxl4OnvW5KHnm703pb/z9PM8YtfKFHa1zVPvZf2bZLMesKtNeh28f9P32xYFrOIb5+07Hci1pPhxToQrHIu/mbtfPh5QnXP3hsw44JSYIdTxXJLVrCNZn02QO3FyzJrL3edO1k/ZiIIFrFmkAtvLbNtS+ZDUuw2ejvT/2vA9y7c2A9PztuKnnhufbIGb33rzU4y6aRhU+v8/CB0MEeu2PMpo93YE94yb+4aCDyWWHsvEHXxMdP/aU1IdcyzS6tXBdB8ObIoybQr5vHtOU6zmmQxn6VQ6iRZ/3eS8EEjC55fpF+yBs9wfhBD4oAB9DMp/d4n7wdpPycv/c9dxDGf+zCe2h5n3PTPq5tmO6gQ+U0afI/cfW4nlEgJvaMRF6DMtm5vJ7vVVr4nZ9DUJ7Ls7zOYF6Pq6Ry3qe9kIgAbh5c9248SaywjEb/wd5ZqVOH3Sff74A49ntuk0wbttr56BSi2d19Tyj+DwgvWPI89AS8cxOnmMshlieZ8xjevLjrHYV/8den024jna1t1+qifXYfEwvPdALTUSgOqaRK7rhXfbai4EEBJx7vopo19l390WKz14k+CDXfv64gOvG+4HZ8M+jeHLcoenz877H+/8AuoBJe/b7PieHccNlA4AVLaJwqIu63gnpg4x177k6131NxYGbzavj/c9qLwYS+ACKmyO3Wrqq/cMfoL8PYv7bv+YLyQUcN6ftj+Nm3UHt53pl1zPu+wDX/0/ZjGl4Xln7GIO/d8WxdZwghYkGYPZ7vOiG/ssl1yPVm5HtTa7BN11z0/FpeyGQwL5O4INq3a8Dwy+EgvDz7ab8rLbvsXZczn82BYKRnb2R7b1hHJ/P9nnhoo7oAK7nFJ+nv70vMgHwojCcGgCnOgzd97WePX0e5Xhw/hqAfhbwH+MKDkWNnyFIAI6LA8/zQp8vBPC8iq/rFZE3TfbNlGKmR57suyFvYDn2uWjyq35qX+yeecHtnXvGwWfIu9OTzytW2MveqAIaSLFcywnMf8sesB7mAZgj2WP+eVPl33hsum7W5XFkPSoP7f2OUvmyNgfzMlkwndxzDBnsI4KfUdYBRMYCjzqqXKrde37p3gFVDmJa7cojx45TCZ1cP1/YumhH7prJg58LCmCSo74APWO/ooLV5bM+sjJJ0fns2gzDSx35YddrmcP9ER/pZg+4psePmUzr5VNwuc6MZfeUEmNznnsY3rNIwHVcwD6VPsY9VASAXJ+FZ44cxhjG6Simvgn1+dOx1HsPXtIGMvljyBM5ZSBqAhbV+v3IG0+UknP0cby9GEgAGFmwUdrah/ejLOQHYiuPI4sKd6o6UMxxk8w30DEqUpHFwaMm4x9RzN5lEwCs3QzbY7L5Laa/plbRYXPkfA1lmT13n2rPthQDIpje8QE59Zso0Gwj1o197f2Ts1OO5eCOa5416WcOiIfi5vEXufmU3bsfH3EYQzIyRHt5DybzPOUCyknqcnDsHDY7dc1zOX58jceDqjdnQn5hkMC+OOBs5/OBd+ON7dms/jFT9U2OTGPPN7tm3vTM+Xd7ZxEr8+WAmKw8V9ZMFku5rTpuyPpqA226Fnh0/k0n8zvBY9cpSudAPk7UVAQYqP+Eo7mp3aTtv1ne14NrD6+bjnH+zIq8Z33apB593uFz9mWoa951L6x6v28dAH/O0u/L+vV3nnACda11r9+5uDC59pr2OSEBEfkp4CmQgKiqf7eI3AV+APgE8FPAN6vqw+foa+9IwXDPkNE/mEnsuGw6c/iQ48v5PGz3zG4862QGGUf7GTiKyfNF1faQ9vTdlpQi2WH5/8v1ovW+/QjKCcU5Iq7I/heFsRDGIRI48Dmg0uzDdbP/j3FHHxxNfhCt93G9jo1xf66PXTsixuPPO47sbuBIbhCr5kigAG5+NhKYofFBnJtHFOacD/QGN7XPByfwS1T13uT3bwf+vKp+j4j89vL7tz2rk2NstrXjVKleOwKwPgNhHG6Gg+dO9u1n7bx0/A4OAGKvnwpoBtC2wE5BStGOlDtU07D2uVAQV3L0273sPUfADXWE7D2LnqEqHecb1V0PpHuysh6h9FNkKjO5eDoinaCnSX+M7PZzi3fXXHuTYrCeP6p0vtaEtz+uZxMEmAk2B33OgHvCCVQAnl9nvU2fp5KHc64ygKqoZuujFImtdRduGucXQhz4RuDryvc/DvxFnoEEppRmCvyj+mVsx7WuIwm//lVtpsY8AkeAEo4AxmH7YNxH7dyV5x9uoHrMuVKFRwAxJFAT7jkHVQFqxb3KZlE/jvco20nRIoyAO6ZEd4MK1v5SnYBDkaLOS5U+jiGciXiyB4YHlx4dq7BX92ByyxQIh3XPz2HNqfNcdtMNmvOje+sDtOsITD13LYUvSGCfgs9Z+gllL0Si/mWd96dTRDITH463zxUJKPDnxCDrj6jq9wGvqerb5fw7wGvP09ExGVtmNOya+8q/Bjw3Z++FfO1kDEiIZz7ymg1y002F6h4xL+4jlKpbGAlt0Q+4ggM0I1hlvuwU8oTe3LTSIgz5+Gv/qtQSX+OfzkWEySuMHIcU1n4CNHXUA4DXc27I+DNFVvsjNTjQAeEcm6fxYi1IdX7NsVYRwEgvnrm4z9Xvs1oFyOnY67EpsM/EgSOIgqKEnJ0rujLVTBVNxmvyRFmss3uva58rEvh7VfVNEXkV+E9F5Ef3JkJFjqN2Efku4LsAXn/jjSNI4LhsftAqE1Dvv/amKSunk8/pE+3Q8677TEa8+coJUO/3MZ4QEbLmYbRa/1HFFwAs2wJF8VISetYNMh3FALSFE5CR5R5lf1CsNuDeSMdWAbP+I1KKkRRLxR4TokOq4DrHGcFNuIRRIJjimvqXJyduBsBSMnUP0KbKjgH1TLq5TtyoJsIpUt7XHTyXmFLmawDkPK7LPqCPlLtoUA7EgXF2xnO5rJmW7+P7T/UKOWeyZlsPNYvCde1zQgKq+mb5fE9E/hTwC4B3ReR1VX1bRF4H3rvm3u8Dvg/gq7/ma9ReBANohSEnywCzxyLEeE5MUZ85BbojCGCPFa4LM3vc0Y35rLRmeYaoxvcY2dRhs1HNT1UYMgCdElcp7yGFIOas6OA9UHopyMH0RkKCQj0FqwrkxtTeRakox4q9VnZa6/gnrP2EbRq+akGJhRJVCJRSiahyIrN3qiLajP8b5/0A+GSM4T8QE6Ys9LAuOln7eZvuqaroPGTHmfTrZu8wE34GBDAZ90Smr8gh5zycH4C+3HicG5hQehTNac5FlDFrrqJAJuVE0jxTNl7XPmskICIngFPVp+X7LwN+L/BDwD8KfE/5/I+ev8/6BRjyAE7l0M+ONRv799QNMaFdk4fWIyO/+jzmwWe1akc+1HuU83qszwk2qvwehb4N+gUzpUoVEPaYrtpDocUjfa5ihlaqPnl/HRgFpDjvGCWfDtgePOKAgccY+hjAeChiUn/r6LZMQfY6WY1i/pxS0/0mYs5llrR1LJc2m9Chv0zNo3iMiFSioLXoKSMumXJpo+KwODRNwb8uE6ATr8AKmPWdj3EBOedxvvKcE6jPrTK9VXROxgHMxAo7V5FAzsnMyRMkdBOv+rlwAq8Bf6pMagC+X1X/ExH5K8APisivBz4FfPOzOjLPNz85ogXfVkGYcWeiN1L/6zHeiGEMIKcsV+n3mjsOjh8A7OG9U9RyYGIbxlr7q1j+8PmDXkR0AqwFvHXqWTlBYpV6FCh14x1lM0xEgOG2PIKyjFcb0vFMRQjjBmSk4DrtqIL2mF+vIhY9snYzkeDIHBy2+u55xC9VTJrqdeq7KiCOURk6PqFyn+P6OIzSj2nDR/DRof5iHe842Ar4MnACIwIo3p5TYJ0B9nidyfIVCdhcqSo5TRV+IxIwgJ8oE4tlYEQkVQf2BVIMqupPAH/HkeP3ga//QJ1NqOTkkPU3HKhs6P6ZPep3I5U+RtXrt1GZMlx6ZOIqcRjYzIN+CsWpTExhoW+yCswQl4wfMqGyM0I8uVCGhx9u7gqQ8/7q8TzrtdpijOiPm3mcj4oIBKRQTZ2O5WBG9sY7/Xe8Yn8VVWtP8zag8OGmigimIoDMqHeVXKQguAHoS0czUUCr5SgzWDP2kEod6GSmmU5pRWIjkGcGkexafYCx71mLvD8z75nmP6cRAWRN5j1a9QNZ7d4yeXOFYxERn4FcXxiPwdH8NGJgBpluuIj5j5u5gmPt+TiFERPfNGL71+S7Axaf0SvtWoeSY+NjygFQNvg+YNWdKEbQizJl0KnUS+srHH3nwhFQ5WUBcYirQO4Y9nDZUOAHIKzgMgN2I8tHzXzXjWD+u769Hp480KfUcY3nVXMZe7mmbqXJ80YcooOideT9deyXCWcxUQBXLodZCfXp2hagqxr6QpHzwP7PKXgu1JuKACYIxJR74z2VC5CBzR8VwpoZlMp1DMNYbmIDeIGQwLiX6u51Uzz7HPc9u+3LhJVdnE7SoPwameOjfYwmJzlg+Q/7g2ED6VyZte9sPGFMhnPWfx3VhPXVoqUXKgmdTYdUgLhhkkbZ155n1YYcIhkRY41nyAUmQD5SYR3+6rcxwGbviQe/6vCBmZPRMc383OQ2vucUKKam19nTCkU8UNDW+ydcxKwP3V+hYhsZ4EwrgwRKAfiiwc/FqyOPfynlEcjzFAlMEMDE6WcUHVKZnwrcdRIKx1AtEQNXY+flGYjgxUECU6Q+27ZHQYQpzXzedM6zBdWjjq3X3me3HFMsHf4+5o02UFQmm3v493AU5YkcvL9UnXd1G9YZ6zqBjBkHUBn2EVDt6ByhGenU+ujK7A9U0sxyguC0BDINmn1GqqTTtann69veHGMxUOa9+Tvq4Tedqb2NPpjN9u7f982YK+HyMCfPahUJVBMcE2RsusA8/OWcbkQCmucIYIoIhjUZgL8gjPq+tfDWgIXrGuRBBFRGi8Sx9uIgAfbA4SDwYlyYfWqt+zIxhwtcDhxssLG//TbdHCPgDcdr5R6plPrQ63GkTJXi3hRvPgLzyOUqyASw9iQjmd3PjKzPwH8y7ClfctimQKtUXlpw5bAhgSlPIpN/bayYom5Qqo1y+KgsvG6mJ8eOAPTx8R6u8wAgg3gyPmkQfQ7ITD3mhj4OuMbh4uKzkcuzJjL8VOs/Vd7tI4JBHMgJzdXuX5FAkfWnzyxIOWs2V/KJuDHndqooWcZUkcINiPfFQQIVgLT+A0wnYcon72HrgxecXT85XJHp8Mz66Ang6DDj5Z4RKNyQ82Bk/arpr0ZBHpf/r/NkrAM1zfLsGhnHM+VebA9Wap0HUWGKZMauZZKrQAdqPDxiFJAnvMH0yjq+NE7WoFAcAWn272Qu66PToKgsZ/bli/22xxxdJxbMAHnynkMH08AaxvkUmUQRDrcopmAZXZGP6XlGZFo9+UwDnytAF6RQNf1MEEEqiGCKJIwTSMhEP1Ovnz27Avz0s6IvHVdwTgLyMOabROsXBwkMwA1TWRMopqApvtZhExjC39tNUvsrG2Da17EnH1AZmU3yeG/dBFUhZFYAd4QDONb/zUpJ3fspTN18K9BUI0nVFuzT/aELYTJjI4dQHyB1PDL5LYyRixOka32NyEUQVDwjppo/1+YvITJqJConMME7zzMTszZn3eGYGDhftzJ7TgYEWhFWtQaMUoVgCMDdsE6jHmCk3FqQQKX2IydATsN1hgTmJr2B8uc8od4wdQceqHnFqqpofe89ajYf95SLuB4BwAuFBGCfpo/7UAebsIhjn6zWjbMvu4vI3F1yVr+O4VrrY6RMdSMdsIQTijwgmkoZKmV5JsBP+6mDn4g35fdU4KnI0cnI2moFVGV+5WQMrnZd5fCBitX52EOeRZxwddNNxY8inunEb+OgWMgEwqeCxcA+DxNch6wDV1OlP9nvqozrOdHn0XnPaWSIhUMKX+dCpLpUHW+jWU/3NPkjoE8pPDlZfzrR8k+o+MhJTJV3I/APiKbChWEbkDy8O4jpBeYjHf4GC8UNeOCFQQL7izeymHOAGXH8lHOYcwNT+dzJmIFFC8s1dj3lEOYTNXKXIxWdAvi+RDl99pxi3YSFZYJHdDaGCtuDLqJyGzNEqbOP6RiG72o9D7gGqFaF/Vurln18B5khzoPxTTij8YqqtJwerlzLCASzMQ4jHGbl8B0nbYos5vthfnk9NiTiqPdxiAiMKzJ9x7E1G4CxyuJ7sf/7uoCcEkVraCPQ6r9fgX8C8AMCmO6XCryVDOj4vrlu+hHYx5kbBlzWS2f9H2svBhKYsCzjPp3wvsNFM9JkWH2A6fm2kQn1GJ1f9qGFMtd1saaqvzlGmN4/lz/H8cy6vtbEVJ6i041fSZ8Wt1nFDUVFpbzriPAcdt00TH7saboRpoA/mSMp1x3ZF1MxQuZdja+pE2R0LD5sOjCtFHTu2DPjqiaDHXqbcDnjStZ1GK8fkX91mJkQBNUSdl2VdiX2fhAHpnSgUvf5Os+odn2s2eMGpHgcGRSbfgHSQUcAh/tIzaIwUO69uZ+i/3E5R8CecszDWlUnD9GBc7iuvRhIALDYcIZda1MnlmiT6cKWz1yvKPrqCR9ZJ8jmpAbgzLHh1H4vZZGl3D8qWvaoU9YBSjSXoCA3UtCBWh8osObUy57pBpY7VQ7FlXcqY5iKA4YIRqpQuREbp5uMckIdJwRDpnNIpU+Ti8v1NYhIZHpyBLiRAxM8WkSCOlIdOlIZZW7N2bhYcYMCNe8p7eoaVQCYiTszYJ08bl+BPFBLHXrLORtire+8/9IwAH4lrJXqo8yj+srFWsx6A4WdIgDK/RVJTB+y/12HB6LT+TsY4fjaZSfXQU/mUGc00m4Y+7wmmBd4YZBA2ZI6UqhMdRYa5WNXvg1yzhCdB6GQKC0mtagT7DfjKOZEu4TizCYM0QH5DCPcw7p5WNTrXXEOrQ4jVh8MjiN5qgIrZQJs81c9QAGKqu2fxBaOlFfm+2sfbiZMwfBlj5aMyGqgmDO+nqo7qSKK5jniGfvJw6atCjNxDo+HEshVAXayVW2pynJpAfRp35V9Fp2i9/pZgXKkzmkiU0/XgTr35ZiqIlmNuOjY6yxIpwLsBAnIpN9xXvfEnso9HUz8RP6XNNw/rNMMccxn1+7NAyEZ2sA16nQh9y6atxcCCdi65mExRdxsUo0Cm0TvnNjfhApkgVjZHlFUIEsGccXcIpacs7LQgxxQeqgYeWhzcDFAMC+6uqVGB5oDSeCgVQo6BNGo4IsW2lCVIyNkMmi0b0VcsOjAhiwCrrCTGZxkhA4/eY/6XloGNbKzppRLkxlXUXKJzzqwahQuQGcbaL7bBj98N6GiE+7Kla5cFcZSRLMjhbKWdR1mHIcrHMN07HWNGJF/OZx15IrqCh6w5vVYBbg9JDDY8SsSmDx32s/wQObnR0DmyDG1dROZuL3UTTd5scGUp7ZulQ7UkOPydjanrtCrcQ+KK8RSphGf4zHvHd5PA/Tm7YVAAtOJleocQ020ULawOHJOxN40rs7Zy4FaUIUD5wt77ipAZTJmzlLUNuR0w+veWkzaTHG1JzsyuadSiZn8vN9ZvU5qv2IEZ1D2FTlfxXz3MzhVvBjy8FptyYCrEXquILk0MhB2tDjr2MYRKc9CyvNG1t3mdRzrHJnN3X6PadRn/gnMBaiKJHSivDIvuamlYJ9/KGKRujq5zKe9UGom6zFB5LmeHzjFCRLY+4NRTs+paugn6zdBIFP2aqTcw8KOjxuIho7XTOOm2UelVPIwpJSvpF1n76+DRkCqn0aZPucKZ1aU4c45vHM478bf3t1Y6/PFQAIVy1Ooiph9VbyxjSLQ9TseP3rM5vIC7x0npycsFgtS7Nl2W7JGghd842iahtB4vA+ID4g0iAoOP6cETDfI8Y0+G+TRYzU0eY+aHrTKrhumd5MIf7PNK14STrPxBTmiXU/abnC7La1aCvKsQio2emP7nD2/sO7Vpm/0xSiDSnFFKdRaqlKVqrjaH/c+ArzunUZEUJV+U0XkENMwAEQ2zbavczV9XtUR6JBEtVLwuS7DAF2G8wx9qUXRDNR8TM89mu+SFsAfOAodUrTJ7LmTjqmXTjDPEcQwB/AJhRkmY3K+SKCDiDFEOtbpKkRxQDijSGvOTq5wxb58GrX33uOcY+oO/iw36BcDCaDkHCeDtYgwHbC+8ujhA37qJ36Ci6dPePnllzg7/WKWjefRxVMeP7jPrtsQuy3b3YaUI03jWa5WnN+6xd07r3CyPqNp16g4k/PAvg9cyHWuqXMg0MmC1rbvIzA9Xp9VX63aIbRwKqIJJ4qXDNohcYfEHbtHD3j47jvcf+9dcuw5Oz3l7Pyc9vSUpl0hoUWcJ0kYOGSVyiVUoBSS2oapkWdTIbKKXVW3Yi94jOJfMzflGWMA01S7b4OqRh6HiW0iWpBPmU0tiHGcYFuLIRhmQkwngGsxN3OgHRRyOgf+ejzlGs03KvuGaMMKtNOcjQdt6kmps/sGFCB7iIBc9Et7GvqqoBw4Cx2czgbdRlmpIRrVmRhpAB8IIeC9nxChI7Egz9FeCCSgQM5VYjWZH9R8LerkFhmobRtu3Trn/OyU9WpN7iOubO7YbXn65CFPnj7myZNHPHr/Hu+7N7l/6y5377zMq298jNOzc8R527OuOOCYtyhTJdhcHp1QgOG8jXVYoJnIsNeqCqJieAE04SXjSUiOOI0Qr+iuHrF9cp/H73yG9z7zad761E+xubzg9GTNrdu3Ob/7Eqvbd1jfusNifQeWt2naJc77gtQcqZoWTUK0Z7oRiITK+uqQyafqDWS2iQ830vDbyR6+2GPvh6QjReSQPLMmToWNPIm7r1zBIA5cJ59rQRRK+cxzyj/419eQXZ3n9c/VE3LyXllnrwCHYuHkBRlR1wQ5HOwBQ3r7G6R+G/SG5bWHR3iHd37Gzleqb9yfK99nqzVwtcOR50AELwQSQJWUIlCpjuDEDSyYd8Lp+oSPf/RjiINPfPEXcffOHZrQ8tLtl+n73vrotzx9+ojHjx/w8OE9Hj9+xOXTpzy+/4BH9x6x7Xo+/kVfzOnpGeKDIRlnE6rDSgyDmm3A4VOqSVGme5UqFuy32SbKeWDXHT0tCZ978vaCuHnK5aP3eHLvbXYXj0hXj2m391n3D0mXD+gvE++8nXk3BNx6yer8JU5ufYTVnY9yfvsO69Mz2vUpYXmCCwvjFHxgjHvXwaJRLR8mJlRW3N5h2J4TSlm13Lq3iXV6S2FZp+zuqLAriEBr1IHNVeGRcDLWUaiKvqkzDjAkzzBlWTVXmt5h6qmnVO+8jKZR/p+KfQMVHxigykodAxgZTcCTbErsz1j5R8q/gxuwzOdzEB+ZUHgRKCy9sfIgRZnnyzFXPWWHPTednynrPz7n2SKutRcCCRgnUPTkrlgGqhKr5H5rm5ZXXnmF0/Wal+6+xHK5QJynWSxZlplR7Tl/+Tav68fYbS+5ePKYB/fu8+M/9uM8uP+QrtvS7bbExcJMilJcSj0jKt4TCw6/V6eUMk53vavpfnSfPdIog9NI7i7pLh5z9f5nePTeW2wf3UdyRyOJJT3LVQPnS9a9J3Y7dtsdMSvdxWMePXqP+/wU0pywXJ+wPj3n9M7LnN99jdWtu6zP77BYnxHaFaFtkODBmRUCcah4EoYiUpnn8b88bLbZe+yt2fiiewcmYl0RtofDJUPBgDdEQJz5g2TRiUw/JtmYutvWjLvG2lREoENevUGhli1d1xBANWLr2bAHZDd5D5294YREa90DlRDoeH4U2EcEgB4qWwcFnsnz3psSzw3U3hR4+wFpdf6qveA4bE8V7MNbPZMbeCGQQF00KDFqalTKiRXW0KwkLMV2t+t4+uSpiQar1UBpcILgi2zlWTaexfqE01t3iCqs33mX1WLJarW05+Q8aNpzAp2lr4aCmqjfCt85GfKhF9Z+zPpwbaUaIphTlJL7LY/vvcPTd3+a7bufIm8uaTSyXAQaHwjicI0QFy2dy6j2rBoIbUuUxNNNJOYd5Eh6+oSLJ+9yee9N7q/PCaszFie3WJ6eszq9zckt+748PaddnRCaBfgGcWazF1wZe4miK5t64NAZKeZgGZWJ/DuR6Uf4NwRgWfvEPF21Uj+7xAlDGLhROnPsqRKTAVoa9EN5Ys4zJ8+KtJnI+WW2syIzMWPkRIbxD2t5M5BMRZC6oqOMP6fwwzpPxETnmLDyMlHqGYtfszmN+2c6vHERpvuoop8pF7LfpojqJobgxUACYIpBKBPtUElm12cMZE0oSSPxSSKhnOZM0y5wIQyeeyIezYmMN+eUBbz02kfw7RLJ4J3ZS5MK5BJNMNj/i+5hJpzpIEurWpQZYjoMW7Siqd8D/KoUHL9jIo4qjsR2e8U7n/5JHr31SW7plpPWc7Jc0iwae4+kuB4zgzolxsgiBM7XC1ybOVn25JxxOGKGzS6yS0/YXDxl+0S4JJDFIc2KsDqlPbnFya2XOT1/idXZLZbrM8J6Tbs+xS3PkLDAN61VOnIwRtRVRkYYIdnNvRBVyGpiVeV0Kn3NCB4pHoIGUE4LjpDKzlcxolB2KWJXYbKs3lLNvpMGKl996GvqrtrLsAp18IMYtA/QlWbrgBiOKdUG4ByOlPENBxyuKO5kUNy5QWEnwiDXz0SA8QHzcZfnTxmqKbdRFYeVaJmzxv5Yyxg5hh7m7YVAAqoZjX2xo7uyGMm+T+RMI6SO1G1IjxO7fsd6vWa5XBFCIAQPYpaFGHv6bsd2s2G77XGuIYuSSh7jYX8UijfXWskwcwMg10muFLIuwF7bj2TUKkviTISoCrKUiFdPydtLFreWnJ6tWbYtGatC7BXUOTQAwZEl4HzLYuVZLCPrVYNmh3hHUmW3jfRR2XWJzbYnxo6YlK57ynbzHhf3PE9kgYQ1YXnKYn3G4uzURIc7H2Fx62VO77zE4mRFWHh8E3DSgjjyRNFYCatTMd8sMazh8OgAypmsPdWEWZ2kbApdSYFefSbFtOKFYuVyD67oXVBUXUHAOv7VoBxlz6RYyfH4Mej799h93btwSnxHWYjhraQAvpRcjJWtnyvq3MRMV/eEHgI+exzIwKKMY9K9LVlNu0kzfd+jqoQQrDpV0aFNnyCqZfyyd2beXggkAKAp2jhrossiClBevL6Mqsch7Pot/dOO3e6KZbtg0TT40FgBTlX6vme329HtdmPCRnsSdTfkPHXrrFtiHg48mIBUrVagMiSCqJvpOjFgeLfyz5hxRwjOsWwDumo5WTWE4FERkhaXaTG5MHsle8X5Bu8DXhJN6FEVNAV8uwDnaAOoCikqm63Q94mUlZiUXVR2vdLHnj5d0m827K7ucfUQHvglsrxNe/oSZ3df4+T8FidnJ5zfvcXq9IywPCGEFYQARY+QMcWtmOGv7FDDqhnAQcYDJtdnGdKxMiYDqWhABuZaCkIwzsM8NMHh/SiqDHL1sA559BnYM+9Ntf/jWsh4Ehh1QeXsBA4H2b3w594Z8HsvA2tvliyZ7YGpyDM9dn0bwXf/uv1QdhEh5UxKieoMNHgOznDKlFP5maITGCruFlmzJqQobGNFCE7NpJdVSQKaEv12y5VzAztmcn4i5URBhrbRygarShdzVZaDNAMV4+aciTGSYiRnxQdPE4IhqSJKVK300bwDk/dzbqSilXo1TYMuFzTe4d1kwcXhnOK84D34AKGx78am12em8ufxPiPO0bQOCUqMGLusjpyVmBVyIOeGXZe53O3YpsgmXrB5+pDd07fo3/8UT8KKtl2yOjulPT9leXabxdltFqe3WJ7dplmf4BZLQrNEXIPizOXWVa7ASqNl8QW4Hdn7QYSYcgBjeTIM4J2zMUvJqIvD9MTV9u/L9Ig5WJWoPynKwyxplJ+r5rxS8vLPmI+iIKASdyEFkN1EcWdUvYg5IhOZvsr67ui6z2X6eZsr+ib3yiECGPuqeqrxOTmXIrUwECdkYkId5nno6fiAeFGQwNAKlCiopCo4lvWTAbXnaPZtcULSTAZ6HSeMCTU3t9lCIcSDMCghh3DLCbtUkUDMmd22Y7vbEmNEVWlCQ9s25octptTx4XmmMFPdPatiKAPiPeJdYX4EcQ6XFReEEBXNEU09oj05b1EWiHjGzFMZdMug0FOPiKeVTPBKFotWdAFSinigcQ2qnsuNYxs9u6hcbDNX2y1dl+muHtNnYfu+kNsWt1zj12f49SmLs1ssz+9wcvsu53de4eTsDov1Kd4v7B1cMIQrmKZ/kJ0L51AiRetsVwuQUhdvFLdsLQoH4HxhEgVNgsvJ/OVdxhXvv+oUOxbjLP74eYoIivIYk6PFjWXdXZXlXVmHyt5PAH0GpEMxlpEATL9fJyrue5aOiH+46MjPQukn52qcgGWCnyslK+GrLOjYx/H2giEBGNxYYSKXSeESINUwGDEYTuW8qznzGRVZg41bjbPIaprvPMzHGPgizpQrOSV2KdF3PbuuI6c8OmqgpNiTUwQE5wNN2w4U4pjHoBbzoImZGeeKi7ATnDd2LnhXWE41jkDBSbJ3lYRzCdXOIva0hZzNhtw4fFNmS6JFWZZCFaVgMUksX71IKhrpDieOU1EWnZJUWLUNT5zycLclxcxq2eIXnj5Hun5DevKI7mlgc68Bt8AvTlmc3GZ96y6nt19mfXaH09MzTs5v0axPWC6XRC/gA71mYk7mrjuhplO5XNEhXABHMcKUNUcQCcUX3oMkcoyoN2TuUcgWMDaYN4toUCs4j+wBhpRw+OCKPO0Llfd7ACwTil7XdeQa9kn9PgKY74dD7fyBIrnu8yMQMesTwbnAYuEHxDXGjMvwMY8c/hkgDoiM0bTWxoUb16DI8eUKVzYJCuJNGZhzle+h6hIGyiNVOTXVXds1zjlLElHszbHvjXI6R/Blc8icuaoaWmFMMjqOffpuBWNX33FVJCc8WoKEqDakkTpo8TIjARFxSvCCkxplGM3T1zmCa8jJJHAnjlQTSNT3zooSySVrQVRw4kEyLnQ4Caz8gr4TnrpME3pu31pycr4gJaWLiS4luq6j66DbQv/0PlcP3uXq3TUPlycsVqes16esz85Z377D6s5dVrdNhPBhATngxJEdJaDLOLxBWehkWOeZJaKm2s6mf8CZNQRvaeOcz4OIpRmcMw7AWOUifuXCFQxwrIjzeNfQtIbcqUSDGtg0Wc0ZcB9f5rklYdwfo/7DlIr7bdg3chxMZYIA7NOu9z4YP7MnJkxzuQyB9zMkdry9EEgA9pFAheQpE1NpxniFvaUyzT4xTEpxKR3WAUElMLCf+9yCjHKkmXPa4enVgy2XhR0Eh+H+fQw+oT7DttJS/s/O5aJ0tPc2I6i6MCi6TFSJoBEnkRAsZ4IQiamzGVJH8IGULPm888bqJklD/1LCdvuYSB6Cg+CSeemREUkoycypLuB8JCwzq1OxKEYFJy2xU3ZXidg5dpvIo92Oq9iTLi/pr+5x+TjQPVjy9L1TZHlCszpjcX6b1Z1Xuf3qlxDW50bNc/W2dMU8awjWljBRrINk83M2HdCwZkWjoOC94hVDDsmBRJtFzUWPoGNCkcoe42aA7GTcN2h1UJu3uVJvJB6TjTXnXsW4zmMIo7LxoxJaCwIouorpfmP6CJ3tucGRqPwzCENVkV1ETkd9Vh76PtZeGCQwl4TGCRpU6+WNq897vVynv3W0yw+MptqiqSpZIhUzA+PmGDZDeYZYOGbtf8gipEWmrwinKolKFyNWnk/4GAnGqBxkHuWmU4xVwqlzLT1FBkmApwbDgKKSibkjFVk7i1geBWe56VOVi1Gq3m3w4y9Al5OSo5Bz2YSaEO1wBBpnFKxtQVtH33o0Bbqdo73KbHpHF83qoHmH7rak/ordk8BTaUjNkjuvf4KT05cJy7Oi/xCyc6izOEpkdPapE6hiNnfjDCp3ZPPnHIg6U4N4qQqIMmdpQB4UBGHu56O7slJtEgw5Dwo/V+a+rt2EDR/Wc9LTDMonbPiwMYs4UVgyLcA+Qm4B1rLJB+Pm5JJBT1Kz7GJKyjpnY0sFP4x9CmO+qTyFkSPtmUhARP4o8KuA91T1a8qxu8APAJ8Afgr4ZlV9KDYz/yrwDcAV8I+p6n/7rGfAIatVzR4HCGyYofHGqZJlWMJBoBs5AtnHiKMGasQ1IkMgTmW/yi4d0MeIgUsQyRCEs9eUgUvR6eYadou5x6YIzo8BNub+Gkk5DvZxuzaaaVAVNKFOSGTTd4qAj2RNqIulSGUyk1ZBbEFMjjTRQc0JKccyTntfL8rCKUuxkGZIiCYbvwdcwHvhxHuWSUjZkZIj9ZGuz1x1G3Kv9BpYLB3nJ56z9QLXNKhvRra7igYYoDvEgFtlCLDLCpJ0AAgp0KT4EvjocEXUyppNXCIVriEVhriYKtESwl0UgZiIISUvAyXkei4OTFZc5kcGABuWtAC9joiGGWBX0iHj+wxcRuV1yj4ey1tQiYIUosOAkkbTub2jjpzGMDNSuMHrcwnA83ECfwz4XuBPTI79duDPq+r3iMhvL79/G/ArgC8vf78Q+MPl88Y2fbV64BjzMr0uT44NGXvqsRmc1+lnVqRhuJnCEFZMoVp8ADJa2MehzrswFiAZOixppSecx3zQ1bmoLrUhgfpM1URKkSYpEoqSJ3do3oH2CJkg4J0FxGR1lmCopqOqSjMHIgno7Zwa9yBi1Nep0jgpgGFjNapaeBKlIAEI4ghAyrWvhGIIJ6qABPyiIRCMtc8OjZCisNjBqoeLPpP9DolP2V08JIQz/HJNaJsBcNUbsCRNZX6Mik9TqIm3VVeVUmuvKHFDwKspg4tR2MKyszfEWQABqVkTyhpZ1hnM7GfxFILpfVKVqWccnSsm6nE9BS0uZ/VyA2YvQi2DXvVOuay6+VVU/F8jMI3jsTfQUUyYKvhEhhyaNWCqBmZVU2vSUZthDIP16LJO9C2fQxkyVf1LIvKJvcPfCHxd+f7Hgb+IIYFvBP6EGmn+r0Xktoi8rqpvP+s5++VH9wl+Ib3DGo059evZka06gPOJ1rZS/BnSGM4VIM41PXQu5eVHH+w8JNBUcKEAUFVQVWRQ/F2FkcUt4xhyF1bfiBzRuENCxKVMUleAf4uTDq8Zl5VBm6GUNGsZfMkTkA1xVb8JQWl8ZfEVKUk4HKYwyzC48WYtBkxxIJ6sRtljFJIDF4SokJI5H2l2qEbIXTGfeZwLuNbji7txK9Bk2MRLtu/+NJ/eeFh9hvbklLOzM9r1Ge3qzHwO2sYyQTkHEowLUyXlbAjGGWdmuRYLoBTzsGY7J9LgihdhoGRqpiATrUQj23oWk6WKs9RfheIYYE5IS+XUGGMC7XBxZ56IGHUbuoLgs8hAhQfRrjK2buQShhvFzo8C6YTgTblZI0uGaCYm2JBjcae20uUp9ez6HbnvSV3PbnPF1cUF17XPVifw2gSw3wFeK98/Cvz05LrPlGMHSEBEvgv4LoCPvPbqnoxVrpl9kwEDSJmwKmtLnfC9pJjHequoYoYoquih422laE0B7DxwF1J92NVMTRSkgNQKEJNO9p8vE/pRaspZPHM3UFPNHogIPaKxJL/0kMtbqqULs41jY9YSeScTJCNizrwmSuSSfq14v+HQZIggZTHgVkHV5OIx32Z127bJkExN42g2/1yrDJV1UKXBzKDRwS4lrp4mLp/25MU92uWKp80C3BK/OGF1douTO7dZnp/Tnpzg2xPELQm+tRyMrgKrI02Wx3tBCoJTnCkwnYCjeDQqSTOaapykzhPHljmZcnBzmXCyYyTvERIqOS/brIBrBeJ6qiqNZc7qU7lWrcpDHf6zfWdrZGFdhUNNY+1BweJW+mLByqknd1v63Zbd9pLt7ort9pLt5orUdeS+I+529LvdkT1p7XNWDKqqyk35jK+/7/uA7wP4OV/1FXX+JpAvE1I/fhq2nmCDsoAVEQyfN5aTGptMnzf5Xa0FxooWD0MbuGnMgRqgUf8ZN8vU9XjvvcuGcYVSSS0wmTJZXDFvJUSyyf3ZkZInpuqi6i3gJtvGFuruq8EpxhWMe66wnmKKRPPMdMbtJEhR6btEisZGWzx+JKsfNPVtCATn6PtE7MssFxY06ZjX356XaVzGeTF5Pm2JXaTbPSFvGnBLkAUZz1MJ+NWaxdkZi7NzVmcvszy5w/L0nMXqhGa5wjULsgSSOGLhXqobL67aysHlgFMhto5+EDGMbRKFIDq8n+AsoYukueg42QnTfTCIeiX3BE7IbiQ8tioTHRKVQFXxS6jZl826oQO/aPlzylqrQrb9ICmjfSR2PbHr2O127DZX9Lst2+0VFxdP2O02xNiR+54ce3Luy/omJJvZ2Psi4t0ACp8tEni3svki8jrwXjn+JvDxyXUfK8ee3fa0rVON+pQnUJ2beerpacDO9V5bU8x/5LET4J3fr5OPOSsnAwKoVH6U1moFNONKK7KavvKM1pahacFvVQ52dJ2w2yl+4UE9mg0IXfF6qyG0w2ZlL6KuJMNQTSSTBdBUuYgiPYspC80TL6FEggjBmzNTBtQp6nLJ+GQKuqRCXzgT839IeAHvIHhh2XqSCJFI4zKNZrr+kpjBuRaXLum3D7m673m8OKNdnbMsjker03Pa9RnN8hS/OKFdrJHQoNkbYi5sfc2epC6gjbH+STuTnWNRcJay4zUWymHJXMfU3NWrdFS4DS7Ck8VW59CiVxgpV5liDAmKjjaI2n1F+mCAnlKPpkTMidhvyd2WrlD0brOh32zorq7orjb0uy19tyP1OzSbnkjETKGNsxgL0zsI4gzZmTdlQZi6v8/n7bNFAj8E/KPA95TP/2hy/LeIyJ/EFIKPn0cfYLM3qkRHzep0cxfAdtObRkore4jghgdxPeNyGBlofRZAG1hts/PbJjHARNxANXSCLKoQ4lSqOFs4z6JQdPW9HMFXhxVnDjJqEXddl9nulGUTrMdsuRbcEL3GaE7UiRMKRUQZ3PGs4q7W8wlEGvMPcIJz4EVomzBmsXWjCdQoXuW1fNn4ihd7f9ukxkWA4IKJIz72uAyta1k44xRUHY7Err/g8eMt2wTt6SlpuaK/WLF7dMpiubYw6PUt/OqMxcltVqfn+GaFuDXig7lYl2Az8RTf/0DOy6I/6dCoiIayfr74JgRwDTgbq5qERg0VhxKcUzi3ujfsXl/EMh0sleadmEBjEZUUjUpOkZwjMUb67ZbY74j9ju3VJdvthq7b0e82pG5D7Dfk1KMpon1CY4/LmYDQOFgU4PeiNE1JKipW8kzVRD4BcvGqtYxEpny8iSd+HhPhvwd8HfCyiHwG+N0Y8P+giPx64FPAN5fL/wxmHvwkZiL8dc/qvzxlpFxVZkIHYJ6yZ0dutfvqdz1CwWdUsVDqKRs40cpWL0A9mLaJ3Del54OZZ4/1F4q5iCFVWlUw2p/JpE6kOgziXd2k4DSRfcCVWIEYlZQdOTmcD8UTrrLDNnsxpmFjDkpQKW7TFAxUQ1yzJ/ce8Q1EmzjnFectHsIFC3vOKdH3hcpgQUvOFeZWTOvtfAM4tBezYOQIBJw3vYQrii/nHKEJOIlYdGBANZFjh1NHqxHtnpDjE7YX99iKmRVpTghrExcWJ7cI7Snt8pzQNLSLlnaxRH1Ag8OFQOs92jokO7q+BI4hBSlUq0GDuGZO0cW4N1uTanmQUd9SkJ4j2nvGIpPniPY9qdsR+y39bkO/3RF3W7qSALffbthuNnS7rSHLFAcZPwTBlWCw4KHxFu8hXs0qmxOaepyUvAQYx+arktMXwjEhkK7EttSYFHGfQ90BVf22a059/ZFrFfjNz+rz6HOAAjnTA9TDFTsfUPlB0VIv3L+RgZEQGFJjz7rY5x4m3RzlLAbkNEFeBzqACaKZJN00+S8PsoIvQStuoDbZgForJ2RDSRlSglxzVg4VcCr3YnkaU+oh+MGUWSlbfWSVVZN4ogpRG5Jmkib7JJNUyHgcjpQjRGi8lHirEYGJOBrvSgZnoQlhUFrlnIcYjVz0D2ZxEYIPhd222AdxjtYHTpYNPgjOJba7nSGIHLm63HJ1+YSHDx6gbkm7OOX27ZdYn6xN5m0WJCfQeNr1Kc36FAmmI/AyaiwUsZBs5xBn5k1xFiJs1MMRY4KseC8EsWhUTRFXHJNi35F3O9L2in6zYXt1wdXlBburDf3mkr7f0m035LgzxWnx+hQ1T9RWrHBOaE1bkFIu0aJj1KgFSiVTbGo2EU0SznlCU2McKmBL1eIWzq3GQtSsRfXzhS8+st9GubvCjrV9z26oXn83sTvzm6by8uFd+3qFqQunYso4LVp4KTH1c05A99QOIyIa9FnlYtFSREV8URBB9ZwTjeYwVB11RIZ3FVEzERLJ2Qqr5Oq1YtIuqGUzEqoPvQ3D4qSELju2Ubi8SKgKSX2JLxCiOvrki/ONowHTeWTznaj6BUquP+eKDOwd2Tuik5LE02zwFg056jqkyBbiBZLghqSaQnBK40wMcc6hzhNE6KXhok+8f/89dvFt4qsPuHPn3PrznkhJaR6W+MUKDQsIC4tw9C0+tDTNEt+YCOC8x1OUsn1BFFnRPpNypL8wZVvqO1LflSQ1kbjdkjaX5M0labclVnk9RVR7ahr5YDjJYj4oIm7NmESpoCVCcB7xUvyV8hBUlp0FumUVgjh8MeEm50wMcg1JnK2H5mLRkcKZjoVHxFX9xfVKgRcGCdTYn2rmG2hsNYMVNt4CQ44Ab/ncp/QH8d5ThDKh8sdMlPM8Afb8cWRjnHnVCqtOPRInz50qIksvJr9b9SBfzUlYAJPThNKjRFQyoXGE1g8VlkreFTQn+hjHeaKMRUu+hVT0DmrZgbRyF5LpsvLwSebtz3SsVg0n6xWKB+dJOLpc5ElRgnNWxs3JJEWXomQ09zjpydmRUm/srQ90va2lIQ+bi+r04gRzIQ4O6TM4+23u8xZ2HUQJDsRlXOPJ3lym3+82bJ8+hTNYnCVSjPTJPCT7BLsESQKbpGwixBzwYcViuWZ9cs7p6TmrkzXn5+fkkxVZI91uQ9d3xF1Pt9lydXHBbnNF7HeQekSUFBO77RUBU26GbIVihIw4oXWC82rZgYWC0MCLG5S45gsgNsclAMw3TdkkiUwcWHfvPeqLOVoCyXm6rCQFH1o7Vky74gI+NObjkc10LUXHY1n07L7r2guDBMzxhsLa1NTcVToYwSgfsN0wsAz71FemdN/6kalB95qJmXIDB+HBlIUcYH3UCdS+lQKkOl4zf1jxSpyEuirFXTjnkkth9PDywdMumkGnYF6AjY1FLUTadCiWiHPwu89agpaM0ivVT8D8Ay43kYePOlKC0CxwQSxCTzybXul2PW1QFosF+AwSTa4uGZl8CQLKGom90nc7GvEWpYgpUq3yk82Bd4IXC6M2XaIFMFW3aIMPk201YfNgwhAiDU3wrFpPWgROF5lbi57se/oYyap0vbJRpVMzq202kdjBpodHCVQ8y+UJy9WSs1tnnJysSLlnu70ixQ7tI6mL5NiZD4dmGies1kvWTcDnS4JAK0ITiggngJPCyZRCIKVWphMxd4RsikcfWiQ0ZBwpg2tapGmIXTK5P0dz8HINzrc4b1mEugwxK9sY6RW8X+J8Y+KW84R2yWK5Rlw7ZFdyDlIxTYgIflQYHLQXAgmIc7Ttihr5RXEBpZp2igJFtdpmGb3HClhO2Z3pN9MDUGDQDZCpB1fPgXQ2vqk+YsKxDCakPTWD/d7jLGZ4wKgoRcFj7r7VApEnMk5h40pyi91ux6UIeaGFwjokSDGb6lAO2xJnQE5i312hGsXN0tEg0rI+EW7fzSyXHt8oKffFDOi5vOp4752nnJ8uOD+/TbswTsc8JRW0L3EJ5rWovnIK5jYrOFCPqHmxO2cRjN6VnAnO9B/BaSmumvHBWxYlAXUZp5aU1Bi4TINn2Qb6ZaAJEdFLPL3Nn3O0eHxWNimy1S0rEm3T0AG7FOm6RLe9YPMgc/F+YH2ywnmz0XsHrXO0QBtMBCEngnMspCNIYuGN6/IIwQV8CGjxdnS+xUljiN1jSlbniqOXeUKG5QrfLtlGE9+kXZCcpxcLDa/u2b5p8c2SLIEuRroukhViAPUOWa4Jy6WV2RNHaBqaZgGlGtXgzi4W+OakKA6vaS8EEgDBhcYwmFbX30jNyFOBR6mKKR1q3lMcL8rJUdqfRKUZDMsAXFoVdJPnj21EKPuIoma/rddJyROvA4u8d31BEAMrJt4i/4q8DtlYfIHqimeoIaDqzQVUG5K0hGVmt+u53Ea6Hi4uleAVGjWZuiTr8M5ZCjQU1ZamCabw0qKp9y1KQBDOTjx8xBCjKlxeGTvqvSM0zjZzcDgX8C6Ay+VdXDGXZbzzBhSa6NWTo+kTUAtgkVyV1jpMTTU72hzW91e8s/iG1gXUeyRngireZZJagZmYerq0I6FkyTh6062oR3KiwawBjUaWoiSxnA1N44hiptQ+KuQdi6ws2obgHU2jLLyFay8ab3Ufe9tHTnqCKyHmlQtzS9RbzsVeAqILPC3OBxYngSQ7uqx4WoJraZZrlqen5vS02Vndh7AginFlwbcERzE9e7OKiMdpoo2mX1k5R3YOCQHftIPoZ7hdh3W06FSB1IEa95aGCl+H7QVBAmNAUNkR1FTeSpEVqRp0BqBzA1tfI+uqttywqtWVq84bkGIsCRrrc6ZtIsvrKH5Mr5P6z2BmdEctC8K+GKGjtl+LH79arLyomF29iC5JHDkHVB3bCE/7lsu8wHlHWmRyiiQFV6KLU1FqiZj3IShOor0/ShNK6nCsUGu7sHyFIkKOnta15GSJK4mCeCUIvHR7zboNNF4ILkIq5dJyNpadYJwB3mT3YG7FnXrUu8F9VzWRMceVAbUKg1hS7diZjKYOF4rSzPWFMoJojxBRGqLuLLpSLJWaK+XQPL7oGzLBCUFg0Xhidqiz/JChiB29E1LqWDjlZBEI3rFoYRkgOGHRBEgQvaWNzwg+hJK9yNPnhm3n2AKyXNIsz1GWNH7JyfqM5Z0VG70kdjvUL3HNgtQu2bYLi8NYJLxfgA+0xcehEYdgrs62vUzUCpY2yfJEJnMzT11H3G6JsaRfjz05duS4MwInxSM07swTNSmx766FvRcGCUwLWJhmq2q6dZC79614lU2n2IFFS3SXac3A6yB3SxE1ct8jIoTghnTicFwxCPvKQQ4Ui1XjPyARPby3eqwZVxPNpVONnY/J09Ei4kmuZaOOLnlUGvqwJp5C4hHb7QaVc5xGJEZ8ThauoBY0YrZs0ymYsqxDNeGjjUlTxrHDS0cTPN7LUPSz1gFAQftEf3XFIqw4XwUcGem3oN7qJqaEI5OdhRGrWpARap6ByXmyg94lkiaiqpktXdFip0QWNW03Di0b27jvnQUFkVA2KOb3IBqNe5GEd72Z06qZDNMjOPEoGZcFkw4cvgQkiWTEW9KVak7NuUOc0DQNXpS2caxacy8OAjFZDASulHKTwC7t2MWex5vI474ntWteevkV7rzyBqINwS1wixVx5RF/i0bMizE5jxLYJrNAuIW3WAbLqoLkREo7+rgrloYSVamZXHRHMUa6riNW56OuI/VlcRl9Fpyo6SaKCRTMSWq61/fbC4IEqlZ74JvLrqxBHnIoY0/uHeO5mCjhigpPavKKkl8wZyvoUe8+AvxT8+Cx5BHzr+XZ9Z6ZgnJ+qSEpyxHXR3h6lQk7OFksEL8kyZp+sURXS5rFmuAcr7z8RTx5dI/HDx/Qb56Quw2kjhx7XEpI6kb9CQo543LCxa54q5mjiUbz5ks52gbPMiRc9SghmE055Z6Lp5f0/Y42BAtkEWXZtjTe5jgER/ZCVLNtSwmfTSpEXPGFjEUks9wIqDPKHkGdMwVYKRQjmo0j0MhQal1iKUCTgR4wz0TvzGPOFfOjmSjNs890J4XrEvPSpIgarn51MnhDmgMUVBuqw/QRQonIS5nkQJ1xHTELF7vI/avMY/UsTs9oX/44q1c+ikbFZ+PmtprokxCR4pshkCKxiwa4WdHOiAHRuLuYd+y6Hbt+S0yx6htt/UgDQpDC9WnKmGuExzcN0ixxbklwdsw1K/BLJCwIoSGEAPy5oxD0QiABkSo/y+xYKRJYsGI9M0EUwyKPOeylBPWIK8rEnKpmaSgYsf8H+zJ9HcMcQVzrjTy7qPZVFJaqxT/flHUqQpKG+096fuLNx4R4ySe+5A1Oz18lnNylXd6iXZwQFsviGZg4efKAk4cPePzwXR7ce5u4uSCkiMaekGMp+1E9EQvwJUuVriVUWdMOl4vtOybzjNOElPxDuVDqGBsu+8xlHxHpSx5EIbhk2v2S79B7zHzYeJrGOLYs9u59r/SdJUMNYh5uNdTVXKeLwrZYQ6hoXEwI9OLxEkoopwEBeLx4AgmHw7sGLy3OlVImUshBqUVQxTjJFmJsiCrPbOje+1I6PpOTcUaIFE2UcSwxGRdiiUmX1o8z0aRZnrI+uc1ydUrqIhcPHvH40QNyVvqk5FKgxUUDWk3JnI9ytkChbIFjKkr0Sl8QNB4Wq4W5BovFYXjvaBpP0xhAe+cIwdM2DW3wOB/wTaAJdtyFJRpWZN8i3hOqKfJIeyGQABwCnGH3qSJwxOpVAVL1B1Kju3QUHSw7mJqdNMbCG1SF3aGmdF+2v85voHo0CoeIpJwg50yK44YbswoFEkrMifced/zUe09ZSuRLft4nOHn9y2hOXyKHJSE0lcHAAafLOyxuv8HyzuukxTn333mTbneFxL4oOHVIUFKdeMxnwXzYiblkIVZyb1yEXWNZg5zLRFHLbZA7Ej0p7RCN5NwPOQtI4JJCV23lJZuPSxZ85MFSllmQ0enpwhSHbmeWh+LYUzM3VTdexX5DQCTgZYX3DsW87XAe8QscS1tbSXjXEsKiVHqubt4lfLg6JIghqppWLeVkIciiQy1A4/a0JGFVPEqOxezqZRC3LCKvIQRYBGGRhaV3rH3DaWiIMfLgyT3e/dQniVFo2zOa5oSFD6AW/uzbBmmbUh8i4IPVIXQhkH2JY3AeFxztqiUEU/JWwBbvCcHcuqW4BTvxBCeUlxyTsIiJMFksnNnMtsfbC4MEaqssuFGGKVuuU0UAlSOoZn+zjcqYw9/4PItFqPcMsFqSNOwBevW3F9Uxm4wWa0J9tM6vH581jqvrOrabLSE0LJeriYOTycExO3ZZ6LWhCQ1ufRe3epm8uEN2gRycpfQqSh5xS9rmhPOC2V17wuWj++hui5u4D+dK6XNEs8Wbo4qmoumOSnIdOfRY+i0dIgedVFDMCBGvPZJ7JPXGXaSMRqVPpnPYdT1eo2mgSbZ/k1E4svW90KWZ2tzC3D9cY7EKzpUkJpi50TmrDUkAWpDWEoQ6j6rHBW/l1mWJuITQ412Dcy1CRBwkVajVfVMJsPKmNXC+IMpcRJOiPGZw9LL1SZrpqwKuioIlX0TwDpWGtlEWIbFIytLByntOmoYubVj5jgUb1u2a1974CCe3XsG3rcVLLALtaokLFhsSlg2+aXDBMh87afFugfcNOMg5suu2CLW8mfmRIEb0MoWYqZCK/SVLQQY4UzyjuBxLyPoLbyK0ts+SV0cY00IPRJjq+Vfrr5l6Kw+mvUGZWL8PCTfngUEi86Khw3MnaoXKQYxJIaY6h/pXWNuizNluNjx8+JjlckXTtLaBSrJS1FvWHITQLAgLQZ0n4U1k8IFcQozVORQzt4kEpIWzOx9BXMODZkmOO3x9fo7EfkdORuVT6unjjtRHNCZSH8mxJ/YdqQS95NSTSpx9TgmSWVKcBIKsLBLO9abMbAXJJmdLgtx1pszaXRH7rcmtyQJjApnT1rHThpiU5FtbIechGMWzSryKBMB7iBbUg2vIeEskIqaYc87j2hUuLhDf4WSHlwbnzBQqhetzqJk0Y54h7CH5jGgJvBqtO94Hy8tIJiFIVmI2XYYrRME7oQkeCDRdogmOFjErhHc03pODp1k3LNctt2+9wpd+5VfR3nqZvGpZnK1ZLpa0i4WlV/MOv2gNAYRA8IFGTLxp/AJQLp4+4Z133uHy8rIUXKUUwVXLZ1BFTimRp1qzYFm2J9EERV9kAVPXw90LgwQqAjCPt2pCKhsUc1JxUtI2DQ4/eaDEmk0xpFKkgmo1EAZZNbGHZMrmmFH3+m9hA44GEA1Gi6koUBSRuKF82RhUZNTE5UimJ7ClyTsCPV6CxeDnCDmV6LyIucwVxRcUvYen8QtO1rfYnlyw216a00rJCpxyT6oiQsldGPse7SMuKxo7+tiVVGGJnM32nnK23zENgStOM5r6Ie5do9UtyMnQYQotuVmR2lOyJoSMyx0ud0jaoZLZCLjUIWGBSLZakaHFeasnaVXSLLWZ+vJbnBUWSbYGSSLO+eI3YE5RrnEW6ei8UUfniwRgBKNzucxXcULyFqaZAZIpmb1zeDzeOVOcYqJJr8pQDTtZyLNvHIu2oXErtp3i24iKI7lA9J4+lOCqACwXuNMT/OkJzfltTl99mZfeeJWTk1MaH0rosekjiv+0ZRLygpdCcNR+P3z0iKvNxhSIQnElUTPVmkslQ/ZhAOdNf1LEwuSs3oSoIO6Ftw7stQLJR0AWJlitmufGkOORMlel4SBByKSPGVYcFXjHlYTXaAMH82DtvCKMbPZbzQMbZzJFMexLQlyHVRRKCI2Z1sQA2VBVMs24ZRM0DbOzQBvBlENtuyTG3pRdQWhcIOCJPgzcjc/gQ4KF4lXRGGlTP6EsPVDMUFkH7kBTRFMk58I19NFMe1HJKRP7RFeeXcIDx+/aIzmCS+y6HcqGIOZsFL0nuxYNFjDjAN12tipOSh5BY2nFjaG/WZzVNhQP3hEWDYv1Ce3qhJQi4pvCGidk19OlK3AXkHssKtNEnlSUfc6p1S3wWqIMa70DW0vL1WAmZamI2DUsVydc7jLNpseVOg/zJLcFqIPJ/mG15Oz2HV566RVWy6XFEWQdRNbCo9jOLWKH6cEo1ZHchNDouO+ZcrklnkMoeqC6Y+17HvJVHN/G8IIggWNa91qWulJcrVF73pU01BO5X2vyjJKZrUD6kOFlNOYf5Yqu8xE41kwHIeMzBh+GUdzw3tG2Vmm45vgDy8qjJLKLxGSlu51r6fyCrjH9QACT812mZgZOamnBgzeFZ5DAarVgt7uyfqrsqmIJQhAQhwaPC0pKFgBDKTriKMxCNqcizdHYaWc2/Zx6+n5HijtCRWBqGu4U01D+LWkmJkvKqknJfTQEoNFs/t2G3F+R8waJV6QmkRoh+R4fSrot34Gz0uY+BCQ0hNDgsynjVJwBVViBWhm0xWLBnVc+ziuvvkRKiqonuAaHstlc0D66z+PHV2y3F6ju8IXjIUcsI5GaLoG+OG5ZFiWPL/4FJftwUvooKBa1tz45Yb1NhLDFp2waeleLlgpezYLhfDAFqPO4piWElsYFSz4iY5oxE0xGimawnod95apHKnngJtGalHSsqVjFUAoRGeTZYjUzpvhniGLwMKJPqP7+IgyZdMzRuogBFQtXEaDk3TMAqhM6UQ5yo3g0PP9Gk6GOmoihx0kCkbZtWCxafJBRkSEOkdZCPnNAs+DUESRYirASXNOqKXaSmouqKDiMvXOAJ+OanuAjIrEqhW3zpFx87Y0jEZeoYbuZBFLs+riiMPUmOvmSkNSB14Zdt+PBg4e8/eab5JRoG6u5ePvWObfPb5WNaYg1FYcXVCz7ejaLQp+2FhCTtkja4vsr2ryFvCXGSxw9jbNKQo4niHja9oSmWRBCa/PgTL/QNEt8OEWdZ9legQu8/MrHePX110kRcrJybB7l4uIRmgOLxTum58i51I+s2XdcCQeHapsIDhpxBJMoLbzbGZtuxMjk7NVyzWJhtRytHmUNBbf95wGvtZS5o5ZbG/fMIKsy6iUmiGBPLp2Km8Y41Htd2X8yiL11T8qwwavZ1DgFydfv+hcGCUypcWWDZl5OhVUbqvUAg89+1uFlR3l+IhrsC/5DnzeP57o0Zfs5B4bjRdkUQmNKoMLSqQLZWFrTSy0Q9fgsBIVWoJXEUhLLbGrMXoEUS0bfiIpllgkexPUsV4nzW0uytuaBEDvSdoNGc6vNhVyrWiivT8UiUvLYumr1GJkkwMxViuJcw9OLjidPnpg+xgmvvdazPnuJs9VZUdhiysPi3Wn7MCO5h7yAnIs3YzTdQH+Fdhfo9gmat4jLllWHR4hC054RmgU+tCxkAUVWb5drQnOCbxzr9YaUlMXylHZxTnQ2t433ODVRpQlrPEXbHnp0t7WiqJmSHKTsoepqrsbD1eQuBeyNmqsjYVR5sVzStAuL0a+7S3VANg2OIG4SAFqtTeN2HK1J4zX7+1CmCGCynSusjyIoA9GrJtGhzwmXOugMrmkvBBIYZev6e/59Wqqrpl4GLOuuXVWvnvZaKBRUmf/a3IMj+pzJJs8SE8xm7WaL4pyjbRdDogzn/KC1VXUl/5456rgcaXOkTZFF3LGIG9rsyGpUXnOPaIf4DvER54MloWjg5ZfWvPzKR8CdQYrk7pL+8iHbpw/YXT0hdltSivRdpOsViZgZrow1JS26Bht/u1hyfus2KcNljLx2+5zFV38Fl1cbuq6jj5G2bUttgTjWwys29kwJ6pJcCm+YPwAaUNZkl1BZI35NCCtCvMBrj99mxK0QIIQzQrPENS1NiOR+RxZYrE4JzYrQOk7WF1xedji3ApaAFl8EhxAJ3hSGFDu69w1KyaeAoyj+SVrC0guzKaKlAK3tGVf0E8kZtyMeQhMIjYkMzk/iRsqe8cHThFDyMEjRaxRnt6kii9FCoVT1VT1me3EwPzOuWTVFT/VQDP/a77GmoRzA1XXthUACtV3nrjv38KscVmV3iniQYTq5NdZAqZySHugejqKEukg3oc5ynTAfYx17CAHvLaAlFy4FV+oE0qOyw0nPqlFOlg6XntJdvINsi687CXzC+WTht96UjM4vLENv8LQnt/GLu2R3VuIJFqQN7E4i/VUmbqHfXbG96thuEzEKMZn5K2UlSqaLidhnpPGsFnd46bYjdsmKjOYLXjpJ3F03ZG2t6KkI3m+QuEOdcTU5ZcyE6ctkF/1BTbSCmNiBI3sPEhC3NNt93IC3hJ8KqGvNp0BanF8UriXjmhUSFjTe0bQL9CoOSJXBddl0L+oSWVLJVzBJs0WJIRBHDbHFmXONUykiUdE7IcU8OK5pXfPqcpxzLqZeAzxzhLIcivW5UupZluUf4baKA+V7ecooKdRLKPEyOkUESo2ZmO1iKdgMx9hLMX8/QwB+IZBAZeuPaeenCTtGjz+GT8FkYItPP0Qg0+unmLYe18nva26i4vGpO7BMxqa5iid65PlVd1A2qfQgPY1XTteOu7cDjTxmd7UxttNDGxJukSys1bcmn/rGNnsIiG/x3rIEiw+4Ih26BmQBTSoecAJr5+iXQkpCHxN9NJfWGGHTKds+Ii7T+ku0f4BPytpdkt2FZTUKZo+PKZFULX+gKt6vyThzdUXAOUMymokKWgFbKV6FHofVU6hZlXOG5ITsMT9/50nS4jBburHp2ZCDBMuf5wM4SJros8nl5syoqHZ0eUeiI4u5Q4vzuAEwLPdiIptTTYXMAsA5m8OQE8vJZzoTyyydAZwrx4QYzcxasoRZNxXwS8s5D5aYKjqMIe4lWatq0eNpFR7s3hkR0vFPwLw9KxDUjyIuD9dV8RmQQ5iYthcCCYBNmHNmY79O5jZCU9n6UQkyphCfCF8UhFCPTkSmuiDVfXgOsvXIHOBtjFoKgFQFZgX8+bscIjNz60WyFQARc7dtG+XkBJYhEyXSiGPhEo3f4kJk0XgWIeJCAyHj2jWu9UhrlNG8w0bDqLiMk0jOO7S7JG4uySmWgjtaTH8WsONFWXjLWJs1ol3k8uHWfO1Tz0kbLWlIgOBrqTUlxoQPgdVZi5eG2EMECyjKSsxCF5VdgpgSu10k5UTqEy5GFl5Zivkb7HJPtNSmNkvOEIGEFnWCa1zhLDwiAecb8yMQ2PYdm26LF2PrXU7E3HHVbYi5J2lvFcutWqslOS2KZR0ApmYatuMZrTpno+zOWw0DSj1D583hiVLIdFzxQYlb6UyMEfrO8hL2kdh4wHQHwigi5KKkFbWCMeYH49htd/R9PyCMMWuUG0QVEYt3kGojxGBh3O9uxAc3sLYvDBKAOSWdAtLU6Wb6OytDLfrq8jsF6eHYTOk62mLRefKxen5EJFPOwbBwETaG75MbB/Fj+tswRR7ul6LdyTkOUWA1xXQriUaSJbAo+fmDd4UCCq7xuMUC2iUaFmTXDBu6JhgQM96RUkfXXdHvdsb2p0wfzYmp1kwYNdeZpMp2ZyW9nLNQa0v5Z4pXV7wKtdtx1XVsHwYWvsGpQ5pAdg4fFsQEQRqW7Yqoyo5ESkLX9+S+w0kmxp7NxVOePn7I7uqSPmXa0FgIslpAVPV9NxfuUOR6in+Dsut2XO2uTFnqAI3E3LGNO6JAEk8WC9m1FGhq3IgLQGRMLFPNcb5keS5l2HLGeTVDYomO7MWjzsx/lsdgdCxypTaFOS8JKSV8cbGOMRJ7b+tTPBFt/5r5L4sU1cSY0MamPQ+bySw+Uhx//OBMV5d/4CGkiAqlTwZYesGRgAgTRZMNukZ4za+bSEIFGeSqHZ1wAHu92/UTJcygL6ysVLXxV9ZiT2woHVB0xoeDL+ent+vkbgGjYAgiltVHs4XDegl4KSXANFkgjSyQ2Fg+BOdNXtWAiMnM+CUqC5SmPDpDKXwBqQBxQxNa4i6S+kTXU8qIe5Ojq36laMlUre6AeDNE1jRKmqMlx4g9/W7D1cVT3nn7LR68fY8mKUvvkcYRUdrVCRddZnl2my/6+Jfhw5KUBTKEGOm7HRFh23W8+/77vPfee1bdKCe2WXnz/fdIKfPy3Vf5yGsfwbwv1XysqP70iayejKNL5gNaM/rGBFEDnTZ0uaXP0DoBWaCuw8x2tg5D9KJYGjAXSuRiQQIm0gTM587Rqye6Bg2N+S2UvIK1IvSgtMY8MBHwPtA05a8Ng46jmu6ySonWsHF4MSBXFdq2wdfU7K7cmY3SV/FflRKXMnLD0/05VTjeVJ78hUACU3Z6ygkcM9NVkcEi+ipbB4dIQEedQSn5OggRM8yoB/fNEcE4uW74ZoMWPXzq3m111KhZ+M3kl33xRAtobuxPIwkhucb8CJKg0UQI8YKkFtO0+5GNpRTLJEKOUNh9S/ftcW6Jd9CExZC7EbUYAVdYTAu19kWlVNKaZU9GCC7T98r2IpJ2G+LukrTbETc93cMnaNfTLhqW64XFxF/t6LtIiInw0hv4xhCAE5CcoN+Z9j4EThYLTpZLksJmuyNm5eJqw9XVFSEEXnnlJbxrULV6iQJ0XWK7zTi/JLRrXFhZluomgCZ2T3sePbzi/nuPefrUnLGSJGKyCMAsBuBpwk0aAaoevIZsU8rsug7Jmaje9BuuNc9EZ2m/wBVfAvO1yKqmgFQPyRy3TFUiVhvBmeNY0YaUfTT+V3dJHVcVO7Umo5EaI1FSkudRR+Vk5rECpUSbTI+7FxwJ1DZNZQ1+7/icEziu6KivnAeFyCA+qLG2zpzx7NKStmwsFz7VAMw/hziD6WPYQwDXvVfJTGN59zxeLfor44nZE7tgxTO8spMA6i1sN1shSZdBkzNSlzrIV4gPhv404HQLaUfuLWGlw9NrQLVo4p1ZGlzlNuofNVbBNlNMYgjImQNT1Mjl455H956QtpcQtyycEqTlfN2y8InTheP0dMmmT/Q5QAr4HEhdTwhFFwK4ILRYxpu1X9C89ConzYKHjy94b/OA1XrNR157lZQ6VqtFCWtWyFZVSHB41+J9S3bmJ7BYnRMFxHsk9eT8lHvv3eP+e+9xdbnBe0jdBdpdlAIeVnrdkno6Q5aVQKiFeAuOza7j/oMnuLCEdo00DUopeJqUmE0GD3i8moCpwYKfJDt89kW56IYcFgxbbI/4CEN+hSqemmkxl8rDqTiEORwWQjyIceJKclfzFLQcGq5k5Sru1oCTMJCLY+2FQAIzu2dRYtSUm/ucQM75IPJvP6Cosv6gQ0BRdfWtmLeWAi0dMdGtUG6t/4zHpWpbx7GKk5LSzbgTnSy2ah6UTJb337L4+JyM8jsrQq7ZKHsW2DnMjTcpLplDkSQh9xHfdUi7wbVSOAmF5NG4IW+fknZXaB9NMsiOnL0p53pLrmmlqsypJyVsQ6fifVnmxLTfwbIEJ7jYwsMnHXm7I2gkN1Yk1bctjh6Co9dsUZBhhU9K1wlvvv+IdrED72mWC8SDxkjjdzTSsd1anjwXE40KLY5GhWW7wCHEzdasH1Iq7SQLuW0XCzQlfGjwbVvEJ1PMrdYnvPbKXRZ07C4fIQKL0zO6q56u37KLYDUevWUBTh7NvgjgoKIWrCaO0CzJ0pCSK16WJVORKpYRTaFXNJo+JTtLCddIS8hmLk1l/w1ZjUwupOqdak6cAQ8PCm9LgFIjQr0zsS+b9xeqqYgD5oaeZEdkh2rEq0e0QWgsXNs1NM5B+hnACUy9oUYHoWfdM/UgLIikKkpkEk5adABZLFAnOzfEZlPkMxmu0wH+tfZHVSDKoHlVLQEvk8hF+xzQjymO1MaSC3fiKMVFNJaCHhSxwhBBwsxsfc64WDXA4LOC73CLDhcDBJNxiUraXhI3F8TtFWmzQbuefrtj2yWutpHNtidnLFMRlhswqZJyKYIhJcEGFs4r0pBLurAkC7JbEqUnp4z0Js5oOLF0W6nn4jLTZ1ifrginCy42O64ueprekMXCLyxiryTA7FPHxeUFV5sNmoV2aam6Hzy4h0qicYFF21q0XQi07YpmeUq7OjdFaeNJOdL1PdE1hsSjlT67dbrGd2e8FcxGf+v8hI3bsdkI6SqajgKP5ADZG4cVjDNAIKaI8y1n57fZ9cLFJloJtwxeqywPfZfoNjs2FxvC1RVd7Nhse4JYIJfDDU5UM6a1KmSF2Z6ycwxcpqvIQyyq1nQYyQKvfCZqZLN7ytOrJ2zjI7b9JX3a4LIjyJIQ1kjTsliccvvkFdaL82vh6HkKkv5R4FcB76nq15Rj/xzwvwPeL5f9DlX9M+XcPwP8eizG5P+gqn/2Wc+Afb1AmY+JVeD4PVVMGL2kjjHoQz8yAifVclC5iUrBJ8JVBWdEihecluOV3aJQDjWA1jxg6HKn2YkBiKZ5z2pmuGzZeynFIgaLhwg9HlcosWhCE7SA9BG/2+GaBs8WJKIRQwK7S7rtln67JfeR2FuCjCwOdcYOqjhiisbOijcZWUqBUx8QMVNcFl8qjDU069ucvJSJ20tc7mhcZnt5weXWsF5KW8t4rIHLoGgDF32gD54QndUDzDsWi5aXbp1xerKk32xJG4VgmQJXrTnb9NlCl8UFuq7HidDmzA7H2WrNrbMl6zvnSNPSLlv6vqeTTEwZ7a7Il0+5fHCfy4f3aYInq3K12dB1Sh8DXYSryyu2mx0heDbqiVdb/C7TbIyjME/CHnFLugibLrOUBTmpIc4U2XZbLjZb4vv36P7G/0h4a41IYtknbrGwqEXJaLakLmmqdirUviKCPY0XtYiOEyGEknG76MCyWvIXfGSzuc+n3/lbvPnup7nsHtKlDX3cGmFQTxMWLNsFJ8tbfNHrX80Xv/FzrwO95+IE/hjwvcCf2Dv+r6jqvzQ9ICI/B/hW4KuBN4D/TES+Qi3/9fO1OkmzQzc7Oxx2MSpmZuPTgne1OvtM7KgTr7BDF+PRrFizHqGU4J7qXWZYH2WGSSxZZLYCoZpNgVecRrRwI2b7LqILjqgZly3Bhzn5l4wyISJdT97tihzrLJJ3tyPtdqSdZaBNfbLoPgRK+e6cKA4uQtZgIcEJcjYRAAm44tGXMVnTOc/itOF2s8JJZtlYevEH995j0yfk/JxWI92mAwLbmLnqMhsc200mXm652j3hzXfexXvH1/7cn8PP/aqv5P7jJzy495TgHMEHqy68XNhmTz2ybLh68ph+tyO4RJsgNhu4vCS0kZAS3ePH4JdE19KnSKM9xMxVn9hFpV2dsus6LrdXaGpN4ep7ostEL7imJTYtXTLOyceyts7jfIsQiDi08WhYcdln7j255Ml2R6dqHKBT+tyRdkLjbd2VEjkqRf+S04Srrf4idVeN+3JUFRhRMPfztiQIrVuzej0qXbzkyeV7PHz6GXp3RRc37NLWypqpwC6zTY4u3eb21UvE/KXXwsvzVCX+SyLyiWddV9o3An9SVXfAT4rIJ4FfAPxXz3n/TeO48fzc5Xi4a3ZOUsYrhArkRQaQ6XUF42r5rRgrVj3cRChmGsGr4kx9jSuIxe6viMg8xjwCmoujjhWurHUBqnJSy1+tGWiZe6viyjS9oc+EXST7zvCJYinD+q4ggJ4c1cqYl1LmfVKSmo095YyW2IUYlZgExONoTHFJQAlDDkAJLaER/PKMJnjWiwVtcGxzi3v3PpIvab0SVpZHP19coE83IJDIdAkut8JP398Qc+KNLxN+9uol0moHJ5FmsbSN3rSs1icgmT7uOFkvuUif4WL7Pv12S+gyj6JwbxvB+6Klb8Ev6Wm42m5ZBVhJj14+Il89IedI12cuN0qQBuc9XViQ1i0aepJ39G1DSgu8M3diC1yzJJ2ZoowUhzYLnkbHW48vudj2uMWKWy/d5fzkDi9/5HWa8xXBKTy9Qh9vsAii4sGaMynZn8MAWMreq1taqzxJQfhl/4QQCCEM1jBLEVYSp/QbuviUJJdI06GYg5QvdRv6/pJOMo0okcdk2VwLO5+LTuC3iMh3AH8V+D+p6kPgo8B/PbnmM+XYQROR7wK+C+D111+vx0yGnrJPz9EOkn2WphUYi+Ixb7dcPX5IakpaqpqleCoKFPv5IC6UVsOYB/lMQU4SqVnRdTW5p87+smZLW60W7IQqDVu2jx+Q+h3BuxL7D1TFXBEMS17PUl3HosejU4JPiOuRWHLi9ZF+1xG7jthHUjQKn6IQs8X79yWfwK7riSVeoO9TKapRzUmeqj1PWhxtaPGNRUO2bYtvGysVdrJjKyuePH5E4xKLEFguHLlZ41beogN9AgkEWvLylL7v0fUtli+9zhe//Dq5t6hI7wMgJRtuJsaOpnE87Bx5m9mkBwBso3C1iySN9GnDbpe53CTeefCUd9+7x7p13Fk1rKRn4ZKl/VqcoNKyDOZyTROQ01t4Bd94JAQaEt5b+jArHmoVl3ANvlnQLEr4N5mHnaJhyZ3XP8prH224vT7n1kt3casAuePpm+/w5PGliQFYvoGUM7vdjkYo9QktqYiqFsQ/rWxdTIIKXdeVgrJTsVcG0Xe327DbPSXlS1Jv1wXfWoUkn/CayHlHzE+J+SlJd9fCz2eLBP4w8PswUvv7gH8Z+M4P0oGqfh/wfQBf8zVfM8Bb0ZseXH8cyI+JCSMGGWrnATlF7r/7Dp/5yU/iqm3AmTJOtGr53ZjIQRnYdR88oeS6s4y+ZhO+dfcldldbXFigWBWfnPJgEsrZjsWsJATNiaAbuifvsb24KDXtim97sWoURQI/+P/+L9jserPfl5yD3ouVrvZF/ChBLCmVQqZFvyCFqzDKX8dhfznlibRSKuCW+vVSjOaVK3HeRIQaNVej9TabKx7ce4/t5gJIBO8JzqoopVzSlSWzRuxipl2f4VX51Nvv86f//F+ibZrBa261XPJr/oF/wHIOlnRg3fYKFmu0XRH9whxpQoM2S3Ny6jOSElfdU955/xHv3H9M6+DxwnPawsnSWxDXLrBcLbm1WBEaz2K9olm0IJbC21jtbOvQBoKrRMHjmwXL1Qknp6d0fcdmc4USEac0bWDVLFiHZdkTllUpR0vEomoKPCllxms4r31UojOuFYzK8ClRmmYVKmgAKS7Qu+2G2G0tyjQlHAGfvZlVQ6RxViY+a2LXb+nj5xkJqOq79buI/JvAny4/3wQ+Prn0Y+XYB3/G/HnXXHWc+k8p+9R/34lVwSUnUraSUoIp7ySbfTY7Z3nnsIw5lsItkLDSYFlzweSeGLd03QZiREToe3MRdcW/O+dMTIlYcgdqSmTZ0ndX5jasZp6qabWGEBKFq13P7/rufxqhIgHLeOtLaq5UEEyfEimWv5QAIXjTmPfR/PZjTPRdX9hKigKwlPEaQm9NB4CzEGB1lhfBlyw53vuS/tpzefGU9955k83VE9C+1PILiFjlnpTMyShl2Owib717jz4m3njjdb7kE5/g/OyUEMwX4Z//nv8ruZpmxJBiLmvnvMf7gHNqRTeD1VXUnEheS1hzHuTmJI5eHFcJmtDQbxOnTaKl+FaKFe90DtSBeo+XhuAsp7/zleKansK3Ad+Ykta3AU0QGkezaGmb1jwMMa9KYmc5GWNHziXtm4OmCSzaBe2iLUVTdNQhqVIj/0znZGKEQ+j7fiBI4sbEOuaYZIlkRSJtoyRNpFyQOTqkPkvOHNFShD5+nmsRisjrqvp2+fm/Bf7H8v2HgO8XkT+IKQa/HPj/fTbPqO1Y7MA4jmvvYuQGqvwvnL90zpe2X0qQkrl1ksNtCEySkuRURlztnGmvY4rkFEtiT89yfc7ZrbvgW4tRT7kggSJ+ZAPMnNVCcTUR9IqHuwfkHKE4lJgrqysOHTVV2tw6olIsDcn+UkpG3XNNH6ZFS28mcBGhT5G+FhtJNUVVre1YFaIUv4tiuipWD1SIUqrkDnOUizeismhbGn+GageaaRqrJuT6aA48qhay3Cuty2TtefzgfX6axMsvv8Tt27dZLJdo6om7S8KiJUe7N3WXBImcLRv82dLEhmDUXc2vkZAd6XzNF73xMqv1kpxMcVkLqty6/RKuXZaiIUrSnph7VEykabxj2QQWPtA4RxsEXMRy9FtxlTYo3iUWDQRnJkUXHARP8MGUz1rKshEBK/aSUm9BWZqHeXbOU3ksCmdXa0Qy7NbiC6xzHZdlrarZteyYI+F9IrjevDGxrFIW56FIEpDG3Ms13Ghufx4T4b8HfB3wsoh8BvjdwNeJyM8v0PZTwG8oA/5hEflB4Eew4LLf/LyWgSk7RIl+OpYI5Jgr8ZB/jUPEYKxxYaeawPL01Ba8pDGvWXOqBnfqsaWajfUugS2PHl1ycfmUHDPn63PWt+9wevsc367LJMsQVpxLdR2lAG02VjfvHvP03mdIfUJbseKYUpJeaN0mvijyRgdhtTyaxjkUh6lc2O5Uik5qKS0WSwXaVLiEwblKJ8pTLJGmFQ0zcSQXa4kpsk0poVj1XxExHUch023TEJYNaEeMHcE7YuyG0maiGZ+tnHYTIEah7za8//47oInVcsFyaax+cMqqbej6bBl324azkyUST1k3MMTFi6VrD2LlwkLbsDhZ85FNR0qmcOu7LaJw5+4rnN66w5OLx1w+fcBme4Vgyra2aVg2RdHpPJ5MG0r+Sk8p+R1oW89qFUrNyJo23giCd8UBWLKlFcsgscS6OEctN52zcZR1Nw4fOt2dlYMta110A6PFu2qK6l4uPgNqAUloKW5bYkms7mbZ9SX46ia1+vNYB77tyOF/+4br/wDwB57V7949hhXLSK1aSj56HYyIYNQJlEkbxAMZ+slUTaNVqI1Rydmq7ljZqeKWW5CAhYT6AsQJj9ITuUyXvL+7x7uP7vHo/YfcXdxisTrj1Y85pF1YtJ2MiMuVlbXAEquvk0ggC7JzaK/kVth5ofeC9g7JlngjiiPX4mIVWWWxPPwF21uMQAH8VJTKGVIa7U0pK+TqFq1lPNh8kcy/QYttQryF17tijVD4//y5P8u//m/9EcQJP/urvorv/Vf/ID/yIz/Kb/ud/yxPnjwhhMBv/se/g1/+S38xvvX81t/1z/M3/ubf4u/9hX8nv+k7vx0n8H//wT/F+a1bfPVX/xw0mXi03e3oS0p2LYDbx56+j6wWCyQZ5V0sWoIsySkVHQPkrrjGBlNAnjYty2VLytAlZbdtQYXFcsXJas1mu+XpRc/VZkfYGve1Wi45XbU4PK5VINOpFB2NKwi7J0Zht9OJ/ShbMld1aFZ2HlSURR9p+2TlxrQUZRWP5U4vRCvnYUf7GaXKxe13giAo0YmurlWkhgWPiMBAxGnAZQFaRBdUd3tLpGqVt1wQJFyvaX9hPAZhSvmPx+hfl/fvJqeiqcUhxsSu6+iJCJZ51wI7TDywoBBXFEAOJ7DZbLh/eZ+Hm4dc9DsePXnE+/ff5XF/j098/MsHk2SW6fhh1PHpqAkWMRfTrINFqBbzrOGNc8pRiUZRl1aSMfRrNQXNAcoi33M1PZY7nau9TLwwi/VjMoNFO1o5KuVTn/o0/+Yf/6P8yT/2x7h99w73Hz0gp8hy0fIv/f7fy0u3Tnjw8AHf8p2/kV/0C76W+w8fsV6v+Y//5L/Fd/yG38r9h4/Z7Xb88I99kn/if/+dbHb9YAXJmuljz3a7o+s63nn3Hd565z1QeOXllzhdLbncbEh9j+ZMt9vR9xYxGPtMFzPbFOlyBsk4CRYq3ZsFpO8jMUOXMu/fv8+nP/MZLq8uCcHzznvvIyhnqyVvvPYSr710i1una5Ztg0sQkulKAHa7XYluLRmHiqjoMUofvSWz6XNk2Ud2fWKXMm3RbxjyHxF2JRK+KFEN3kshETEEUpfFUqMFfAiDwjnnjAslMM6Zt6mWtXTOgVPLGSERkVxyF0RaLzTuZ0i24doqtXr2dceBf4osKvIwD6yGGBor5qAZXwo6CiYXC5bhNxddgUPJuuPho0f8xJs/ySb3PHr6hCePH3Hu14zVYvMAuEfFFQrQCgMCcLU4as3cW4G5luoe1ISDgoDv++Pfzw/8qf8YgG/5B7+B7/y2b+J7/tAf4SOvvcK3/5pfBZL51//Yv8t6teTXfds38e98/3/An/0Lf5muj/zSX/yL+Ce+89fymbfe4zd89/+Fv/PnfTV/7a//DV575WX+0L/w+1m1TRF9DGn9P3/oT/Ht//Cv4dbZCTn33L19i5wSX/LFH2d3adaB9XLB7du3ePjwCcEHtrue0CxIBZF935/4Ab79m7/RUJIr7DTmkINC3/fsdjvefPMtfuyTn6RtWnbbDS/dvoWo+c07qSnCiiiCqc5CuzKzpW8IoSWlxPv3H/Lg4WMuLi4JVxvc4yc8fPSI+w8fsut6Xn75Fba7jscP7/O+Zi4eP6D/+Bu0X/xR1ssFwXu8d1bCfKJ0NrfqMbK1VvRxg97I1jcqJIRohB+LPLUqRYakOprQmP5ER1FU8DZHg597qXvoW5xrDKBrlWbUUqcFZ7USS71ESqh0dhFlgw8dpcgTrWvw/AwoSPosZ6B6zX5ikco5lCugsEumgS0ssKXBNBuqKxF8VSZz3tx5S+lycKWohECOLBZLVosll5cX3L94xOOLp8Rdz507pyiJPu6QvrP79lNLTUKeDeDte6rJIqoSsia3UKMalb8XLa6nwP/wIz/KD/yHf5of+v5/ByXxq7/1O/kFX/vVfMMv+8X8/n/5D/OP/JpfgaL8J3/h/8v3/cF/jv/yr/63fPrNt/jBf/sPogq/6bt/H3/1r/8wr3/kNT71mTf5g7//d/IHftf/mX/yd/xe/vxf/sv8g9/wy00VUzwUP/XTn8YJfOuv+3WknPknftNv4Ou/7hfbGEudgh/+0R8j9pEv/ZIvplkseOnuHX71t3wnv+qX/1LevfcQwfFVP+vLeOf+w2LlMDa6+lyoKjFGfvqnP82nP/Vp2rbl4skFH/3Iq3z8Y69wslrSOkiLls2mo+t6UupwDk7O73Dn1ddYrtaEEIz660/w1tvv8uDhw1Lhx9N1PYhw+/YdvvIrv4q+3/LTn/pJLp88pOsjTy8u2Ox2iHOmwQ++JIh1w/4SkcFxx5AAIEIUEwdCSnjX4bwVAI3Z/DJyl9hebbi4uCDGx2y3W26dn5PzCW2pEjzAvVRuw3ZhThbklUvGaBFLhpIF0100wUrW4Yt1JYJsUJ9AOtQlRD2OQBtO8P7kWrj6GYMErmf5DQlU26upxym5GQUtueUHS2sxx8nYcUkIWZM3SmGxrVyUc4E7t+7wRW98jPiWIj6Qu0gTFpZ3L1nIZ6Xw+0hqHKUDD33X0Xf9wLAXi/4g6yORkswKq/Brfgn/9X/z1/jlX/91nJ6fgma+4Zd9Hf/NX/9RvvPbv4mHj57w+GLD/YePuHP7Fl/xs76Mf/+H/lP+q7/63/MPfedvBeDqasO79x/yFV/xs/iij77BL/h7vhYQ/q6f/3O59/AR57fPzFOwbEoRePPtt/gP/70/wVvvvcc3fdt38Iv/V7+I1ckazZn79x/we//Ff43v+d2/vVRRdvyz/8x3k2JP3/f8+t/4T/FP/YZ/jD/xA3+KH/3xn+Bnf9VX8Pf+ol8IYDJ+ybjT9z2f+qn3ePvtt/Au8NZn3uK9t2+zaL+WT3zsI5agtVQ4ymrhvjFZHcdbt19mfXoKqlxeXXF2fpumXfDo0WNSTkYZs9L3kTfeuMPP+3k/l5RNKfn+O2/iiayWBbCLOfKYxWk/0W3dPEOaL3M6oUfZpp7Qd/S7jv5qw7133uHeu2/z1ltv0TQNr7/xBrdv3eLW+dlQFdn8MAJNKUDjvKPrOi4vL4ixLwvCsD9Nf9MirNC8IuctNQzWLF7FnB09Xk4I4Q7I6bWw9UIhgeNUfsTG02vH4wXwTXs2OMb4Yts2l98qIZfvxSnGV8pdEzaUKkdDzUo1Nu/O+W1+9lf8bHZZudXtWDZLNg8uWbQntM2C0C4M86sO1H/U3qfi1AORRNps2O625kKMuRZbnfqqEU5F82zvt9tt2e4s5bd4x+rkFO9M8bVan3D7pVf5Nd/4K/mL/+V/w7vv3+NbvulXc+fl12gXS777//ib+PXf8a2DWgvgUz/9GZarFbfv3AWBk7NTLi6vOL99m1z0zih80Rd9jL/na38+d+7e5tZLd/hZP+tL+cxbb/F3/Jyv5OLign/yd/0efvN3fjtf+/O+2nBXLjkTRPjP/4u/xFd+xc/i4eML3nzrXX7jP/4d/Ev/2h/h7/k7fz7LdlEsKCMibkLg1Zdf4eTknPffe5cnj5/w/rvv8/ord1iEZSnrVtY854E6hmZBaBZcXF7w+MmFJWBtl2w7K4HmnC++HhaNeOfuXcQJ9957h+3VE5wmWq84F8wfwbuJQ8+Y53JMKGvBYlJMqNWfwpSBQnOy4uT2LZpFS+q2pO0lu80l791/jx//8R9nuVzx4P23uH3rNq+/8QbL5XJQijsfCN6bKCKWnmy321kOQYrYoclE2V5oOWPpX+Yibsj5AsugXLlHs6KQWhYnL7Nevobm9bWw98IggamL5JTFn1LUo0hiOGYU5unTpzx6+JCTkxNu37ljtuVcMugUjsF5jzgrF4boYNZCHaqJIdeAmhtH6xvO1ue89tLr+CdPefL4KU8eXeFYEPyS4M2pZn9stTCpZbFVYo70eWG1AyhsZdEcay6KHK/mRVi4lV3X8/jpU776q76cP/AH/w1+2z/9W3FO+NP/yZ/nj/7h/xvNYs23/MPfxG/8p34b9+8/5M/90A/gmxV//9f/b/i93/Mv823/8K/h9GzNm2+9TduEUrfPiowYeanu0I6afxGFX/0Nv4x//z/4IX7tP/LNPHjwgL/1t36ST3zxx4kx8pu/+3fyDb/07+Prf/H/gprAJSejpn3M/PHv/5P8i7/vd/M//vBfxxXPPNVSCq214BjvTXzyznP37l1eevVVPvLaR3n37Xcgd4gkdtsdclpLuxsit1TuuVjYzNX54tKqQCcVLjcdfdZSwanh7NYJIQSapqXrOlbrlSVMiZHUbfEriyvwTWX3DUFNxYFhPYszjxGVQkBqURznWd2+xUfXZ2S/IvVbNk/ugxNa6fnYa3dxztEQSd0lF4/v0W3aIgIU1+HiFKSKcTJoKXFW6FzlOnxkFW7x2q0vRvrAtn8CYqnllESXd1aEpT3j7u0v4ezkFfruZ4h1ADhK8Y/VIKiIQoRiI1VSjFw8fcq9e++TUs/6ZIUPaxSrhFNrANSkkq6aY0wrV8yMvjABFg1ufkOOxi/4yEfe4L2HP85//9d+jMsHV/xdP39X1Hdjwsr9cYdg1MjG6JC0MJbPLmTIl1/ckS2TVN14lFRXPV/6JZ/gH/qmb+SX/IpvRIDv+LXfyld/zdcQM3zlV34VTy8uef31j/DKqx8hA1//S34Jf+Nv/i3+vl/xTQCcnqz5t//wv0II9n5JGZ5hm64wP8Vz8et+ydfxn/2Fv8zf/b/+pXjn+T2/+3dy5+4dfvAH/1/8lb/233Hv/j3+9J/7z3He8y/+vt/DV37V17Dpdvy73///4B/4lb+axWLFF33s42x3Hb/jn/sevvrnfCUn6zVSbOzeOZrQWIouVVYLK3OGwum65d23P00f42RnVKrsQEqRE2felrtdx66LPL3a8N5799nuEojn9tltvvzLv4yUzYFrs93RLlcmJiBcXl2xCOsiCnh8qR05PGfYEyYfORgC/R0BwQqbiGSyD/jVkrB2pGyER/ot6mDVZNYvnxvVdw7nhH7zmO5KTXdRRNBqlTACEouy2ZBA1mxrozq4IazdLV45c2z7J1bOrbEKS5Y2TmjcmuX6JUJybDdProW5FwYJ2GSMrP8Qkz8RBWo68oMmYF5Ywq1b5zSNZ71es1otLZGlQOpBU/ENcIXFqvLvBCBqwchRnah4HI1bcPtkwa31A85Wd+lDYLe1BB1NSRRa29zUaZryrFAyW5knXUxFVFEk58HpIyfG+PFyXd9H/pd/9Uf4Re0Jv/dbittGD3zv6K7xw9/8rfblXx+PfTfw3fU4wJ/+CwD8yLd8G/yhPwbA76CB9S343j96MK3f+5GPwbd9u/146334N/4dvgv4rt/5u+YX/o1P2h/wL5ydmKLzL/5lAH7lL/sV43X3n9rnvSfwyU8D8JV/7X/gt7z/Hv/8t/xKnBNzs10sCD4QYypcgynqUjLlrZTc/8ZGe9pmgfeBt995j7feeY9dp5ydnnDn7it85PWPcvel29y/f48nTy/wIbDZbul7S0qSC2AacgqlFqFZiRDTvGdGZx2hXK8Bpw3gUElIWz1LwSWHz5ZLQSWRXXU1x5LduIHnQsS8PtExJF3VCqioq4pjS3aSocQiOFLMSBR2TyIXTzec3lqxOlvifcOiXeGlQZMiu0C/fULW7cH61vbCIIFqb59nCzq8Zvp9ALTicCEI6/Wa9XpNCMZSp1ji9s3drshNpgEvxn3rr8rNCpa6uxxVQB2eloBwtjzn7vldZNewXKwQfDFdVYec6XgZ/AGg5CrOJiYkzYOLKloywKmar39fkUce3IOXu45P/dpv5vTWbaNSlkPMfMG0cEuqAzKqbP3Dh494+523aZrAGx99g/W6aIknVZ8LT8U4m5T8fkXZSWGFS+m0Jw8fcP+dN4GO8/O7xLzg0UWPX5yDOLbbDcFFut0lT58+5OGjh8UpyWI1zk5O+NjHPsrp2Sk/8t/9FV7+jz5FF7HIxpzYbbeT+hMUkaXmbKgh0Ta5gnB2dsb5rUsuLy+4vLwyyh48oWnYdR3L1ZKmDfzUp3+Kn/6M47233+bRg0fkrrdSdi6Q1VtC0qr0KynFtAChimBu3sYZevW47G0tnCMFIYdikfLgouLViq1kV5K8lrTpSC5pwz2IuVdX65KFrFc3c5DiYpxDEUKcR/D0SdkqxKuOq0dblqGhPW1pWLKUExrfgiScOvoIm/iFCSX+vLacI/Ulp9F/03YsatAccWz7Bu9xYmWgfNG81rLlomYG1JK5ddxERcpTqOIF1ExCtglyMW0BnKyWrFcLduuOtvU4ZxFpNTpvZoWoIouDuoVdtV6U5KOC1bhPYtnwYzT/86pYNCeRKh7YRsxAjuYsZOZEm5daGFMw+3NOmQf33+NTP/W3WCwXrNeLYnVgsLmbkFly+pepzXWudXBaJueIqKVG67uOnHaI7Ij9Beoyy0Vgl7YggdVyYcU/U8CHhqkkjTqyOvqYiCkW2Re6JFxc9bzz9ruk3Qah5+W7t9j1vf3FxLbv6VIiOwXJpNyj2rM6XXB265TQOtYnC0LrUYk8vXjET36q4+mFuQ3fv/+QbpdIfUcAFs2a0K5BWra9kunwkkuEoTmRmSOW+TngTawLAg3OrnUCrmj4pbH1L8pDDxadaYtX0rtNrA1Y5uyai8KlEj2SK2IwPwlxprsxd2ITGxsXyD7YZ5+4eHTB+fkpi2aFaMJLwgd7bs6R7dXDa2HvhUECwAi0lXSOvhOza+wzM5RXUgcoKo4klgjCHHVts+SCKCzLS8Llqk8wv4DK6AmVQVCy1Iw/ARVfSlEJi/UJt2/f5dHDKytDVUnupI0e4fVAhbjKhUAuCTwEj3pP9IkumpebS4VTKD4Grnh7iTjLbdeZv77JjRaoYnZ4CM4Zd5AzOSe8c7z68kv44Emx4/LicXHLdkWe9aWyz2CDKt9lqMMgIgTXWFKLPpfSWwlhB7ql9S0+BBbizW6tsOsy280F293GAKAgG7RQM2e6lKoQ/tEf+ySf+cy73Lv3LsFFvvzLvohdTNx79Njeq/n/U/dvMbdtW34f9Gu99zHGvHyXddtr77P3PqdOlevY5XuCgESEBxBPICTDAxE8BAIR5iERRMoDwQIJKQryA3HwU6RCQcJSohDJQUTIEgpIKCTEBmyFpOwy9qmqc9uXdf8u8zLG6JfGQ+t9zPmtvfepsupleWytvdb3zfuYo7fe2r/92/8/sB0u2LqOmJVuc0XJME2myIsq3/vke/yZP/0nmecZszofcA6C9wyXT/j42eeUIsRpQjTTeeX6YsVqfQV0JuNN7eRUZ59Sz7t4R0qVMeiUQMZTQOLSMXCNVYjgxJtQapFFZ9Dh6xSqLPevqQ71W0PEnJtiNCv50Nl3X0q1lq+26SUX1BW21xf4tz13xyPd23u61QrXgddSv1+H62BY/0PCGDxfUDaDrW2DfthCXCoqfXCx2tquj3cVR6Clu6fnpv277dw1lbZH2AxDUdudRUyn3nZKh/gVEla8uztwf5wp+BqE2ivVxXSeySi2W6guUlK5gXFVsDQ7IS6peC0l6u7ZjCO0KHGOTNO8LP5GSUYLvfd439cJvhlVZXNxxbBaWanlIKcWYEzFyPnAsLKRYs7aYpa+uOW78ADZaNfTNFGyjfIKEDqh7wK+X6ME5piYxpnd/TuOxwPeUXvidffLiePxQOhO7MrDfs9+dySXxOpqxfNPvsf26prglC54+mFNCCuQjjkpuIE8wUQkp0SZ4aPr58gPPHGe8S4w9CtWq4GuNx7DxcUVpcD+/o44HXEkhg5WvTM4ONdzLjaf4IMjiDfHId/R+XDSnKAOAEvDjlrNL3VGwEHFLkqdAmwmLw+y2cqBcJLxzgRHcp2jEC90zuEKNRss1Z7ekTNMqaA+QLdiPkbe3Y1cPJ4JQwDnCYTqjJTp+9V3rrsPJAg8rPWBSn6wRVUaD2C53QYs2upuBcEyqqltGtEOWzC245wXExZgdPmp9chVhVLEmFharFCsX6gPA8P6ilgcczFhSqluPa33/SALoO6s9bmNcWd6hEULmhMl5QU/sEEgrTZUdlG2UQLlVBJZ2SRosYVq6skem0DMxGwXH67DdQ6hUEoil0TJamWGKj4UhtVqGZ+2ne/szS+pK4tw5939jhwL66FDxBx/Q3CIyxQtBF8QnXGaGLzQDQO4QJwMtfYOcoyIKkNvl+Af+dXPiNnaZJeXKz797HMuLzeEussKHi3B/A4zDH1HoDN571LotON6dYluEqnLeOcZ+oFh1TMMPc55VusNpRSGUpickuYDxJHpcOB+PlgwUbuGhr5j6AdCZ/JnvhtwwxofOqQzTr91FEKdN6ltVm/Tg1ohfMEmEo1/UpbvNVVsqKCkeUbnHSWOUCzAizg6H8hadTBxpgo1TzidERcMF5gzfnVJH4U5T+wOkWGl5CwEseCsRZaM69uODyII2Bqv3YCiy6JqYKHqCfxaouh5K3HJHlgAwkXIU09KPw0HsNesj6ECaksWYoChZLOF8g4C1pbS2tb65ONn/OBXPufq+tJycFpHoz7vQjg5+3x1q9ByAuNKydavjsZuQ087SueFv/iv/Kvc399xvz/y//7pV3z585/hu95Ggxdg9Hyi0mYScs7EONcRYossohYESs5oDQBOhK7v2Wy3+CrM0ZJTO5/u1EERQXPi9t0bXr96idPIZuVt0q/rkRDAhfaFME2Rw25ntXFlFMZoVM7gA/3QM6wGHm2NxPKP/2f/ERKOVGyo68mjJ1xseoKDNEcbmS6eUjJBmn9DgljQeUKnCRcnupwhRRyJkmamScjeUu1bhJQS0/HAeLjjsLthHm/JcQ864wVyTuQ0E8RwAR96QjfgQo/r1vi+x/cDru/ttr7H+Q7xHaFf0fVWGoXebuv7LcNqQ9ev8aGHYG3FORdSsSwu+YnklGm2jlHve9artektUHUgUKZpYpJATpngO7OM88rzbsOTp5Fp2lmWUAIxOpKaTV8IPVOO37n+PoggYIvGLcIeTZRj4f/WBWsEDpu2Oh01aZbTXf3ZTtxAqfetnKnOMVRrKPsZhEwnjt4BJFyZURP3JTmPdwNP1/Anfv37fPLRI4Kcjeqe3lIFcU6/aPTl9q4ctrPOJbOqSkYEQYYOnzv+6//l/yKaD7x48TVfvbnhf/Hv/3X+vf/Wf4P19pHZk2UTKzX9wlIpzIkQPHOcubu7JaaZrJkS56pGPJo3wTyjWui7wNOnT/nk009YrVYMmxWCq2O7hprPMTIejzZxSeHnP/09/sb/8z9k2r3jo+stj663bC8vWG039JsNXWfMN02O8TBahlFbZ1bm9nTdwHq7NXFRFP7N/yOfP3tC8Z4pW4RceWEQt3yXWorpKI4zKRWy3JH2r22k9zgyHSeOhyPjOFGyEa8s1c42ttyYoGRKnonzgeP+hnF/g+PI9eXA5bqn5ImsEacgk8LcbModmY7sQ7VHN3PS5m3oQoeEwdySvAGiIawYNpesNpf0w5quH/D9YNRzbLYh+A4cFB3pNOE9BIS+KF2qrkJim9XQDXBZ8ZuafRQJxlosUFK0a8tXsDeB8x14YUgfOGOwVr7fSKPbij2nb2oFCRaAsP0nC4er5QXL7bbQT8gAYOXE2W+lPacqXhNrL6YgSyTOI0kLXelIOrJV5YfPNjy77OgkofS/z+fT5V+NiOKqLY0CvrcUct0PrNZmd+U0knPHcy/47RUArguIN+dggpUVTgspWTkwTiOHOZNyNIvuNFOyofl5mkjzRBpn4vGAQ8lDz8vXr7i5u+HiYsunn3/Ko0ePmcaJaZqJqfDmzRtevnplYpzeMY9HwnpgGtfcTcL0dmYzHdhOnv4AITgz08yBnKzjU8j0a9shxSlSy6ucdCFGeUl0zvSOSwI9TkzjnpxGpnFkmmcOx9F8C1M0oKyYU3KaIyUVcsqontmEo+Q8M80T3TDQD4NlSjojsiexJ7PD6ZGVK1z3iRCmeg1obZEaboIKMR+rkrSD4lB1zKn2+V1AXQetHMCTMF3EuV8RQm92ab4DF8gY7bkfVvb74OlXHX3fkcQRXVd9B9T0Hb3NOIgTJHjwHnXehojEGRCJ6SE4NTzH9T0EM0FZdevvvD4/iCDw/nEOnrxPxX3wc02VGpkD1VoO2K1tN17gg1Z0t9VXAbwTKlBDR0kEMr0oThK9O5LJONeTRRlQtl3gui90kshOjbq9BKlvHqf3VSuZisDjwAWHOs/gV0CPFNA0IakQVgk/VUp1MEsvj+CKB7VhnRhHcpkZpwOv375ld9hx2B+IVYE4VsWfEmfSOBGATd/bjq2Z/e6OeTry9PE1ZbslzRP7+ztub+949fo1u/0ecTDPE8fjkXGeGC4uCeI5HEf2txP3kyd0M947hqFHY7EMwjlWm4HHHz1i03uoHntJI5JmExUFvvri5/TebBZKtDpZSibHkZxnUopMcSJpPuuGuGrkYr4O0hmRKIQ2NlssaMy3bLpLthuT2TrmAynf0+kBZMJLZO0iG6f0LuLFgpHDyrfg1cqZqp+oCuIC3nekVEil4HyhEJfMsxRBNVBKoIyeYbVGE9W1ypNUbFx47E1ZynWUvmcOZjjrXTAJM6ibRvU29A46R3FCcbJI04k3HYROPL4ZyziP+h6qscx3HR9EEGi19HfNCbQ6+/w2OO3yFVRA0fMfT3X4wyTg1M8/wwiWepw6tcaMSMG5gmMmEE0FMHicKJ0q65AJDuMRVNszI7Xog9eT+n9rU56PGEPNs62b4R2o8SQKxk8w8cwa1pzDhY7Bezo6NFvfeT9O7Hd7bm5u+eIXX/DixQvu7u5IMS1iqaHzOAppPLLuOvTymqePrvjo2VOoevirfiDPEXJm1XX460s26956+iVznEbe3dxyc3tDmhNxnplHpRQH2XYgJ0JUa8vJegviyF3Ab694/PFz1qsetCPomnKM3Lx+CcAXP/sJaymsxNBwau3vKDiX6Uh4TVBFPMDRd6tqEVZVeNTKuxBkGeaaGZF8IDDQkZhiYj7umA87yjwhOeFF6cU6ASTDf1o7zlpyivPgO3MDztmou10n1fPR7ofqIpra7jfFyJgKG4dRyFUr88/jfURkrDoEAVc68iSkbNoW4kJVZbZsxPQoleLUgoAI2roQTSS2CEE9eMcskG1YBvQDDwJwtrDf3/mXFkAl8j4oB85WtxGy3gsotTCoeF8DGLX93EQ9z4qCpvefK1FEyEs9LxpxjDhRgl+bykt9nw0VWIDMB+WHmYc0MC+Xcrp1wTnPPAew69nsKtzSXdCilJwRH+j7FaodOQSuHkWUjtu7A8ENXG0f07s10zwRY+Q4H233dPb5bm/v2d3eE48j42EkdJ6UZnb3O4I31Hu1XnN1fcGjx08WaXbf9RRV7u7uuNvfcBwPpOzo/AbvVqTJDE59cGwvOi4uL0CE4zwRho6L60uury7p/Qqfe0IWvvfxcwB8mknjnuI8wQleoPOOzgteCrhk3Qcyd8cd0LEKHalAzAmKJyWj+PrV2gJyKZAjkjOSM3maGPdH9je3HA87nJo4pwseLz2qPWPKBKdoqIFZoFDw4nHBW0YnpnJEcxwmoVIqtmUXl6vXhfPgSyGEwtB7cjbwbxgE7zNFY6WUJ3CJmApTjtaJcm6ZbA1qUukpmWpQ1wX7OSuIBQAXOiSbcarvAp0XErXz9EuW+gcTBNoCeYjgP+zyP0T22+84WTvJ+dBsQwrPX8NO6kKHPUvRWykgQHGOJA6YzS9QxBxpnKCacFrwsqpefjxoC34T16jvBVdLkfYxpP7nKhp/osaKlZxLfGoCoU4VTYlZPQ5T3+1XA88/2fDsI+XTz37Ib/zGn2aeJvb7PbvdjtvbW168+ppXr15w3N/jJTCxxykcovLFy7dstlYrH9M7umBpqPP3XN4deP4xXD26ZlitWG+v2GwvePIsMeeJpAlcBxrIs5BmS5tD5xlWDh886qROUBoRTEUYs6BzpitKX/kcHZGSDuYwhJGJpHhC19N3YkIakpljxKUjRYup7BabHo0pcrc71Jamp+96Y4lmcEXQmElM1asxItl67q5Ju2Vzfp9SIUqpQKBUGrEQVAhUWq8a0Slla53mhkOIo4mAFjU+RlEBb5uA2YcX41UM1r9P0YIAJVBSNgOZmGvAtvfmQ/W7KMYYDN7UkVUVUkTV48QRNBuxTAVPxIu9zzkn5vgddSofUhCAh+k5nO3S1B1cT0DfWVzQsnTYHjxNAwhFT3/MBriNzOnSahTVavRhIwXGEYh4ncgeMh2Gx2X6osx1XkCXabMWwE7vATgtbGrfX9vLVoCwjpG2gRgwn4GmTSgKodh79EUXoZM5m5yzQxExv8Ht1cDl1SMU2zFSjIzjkdvbG969e8PdzTvmccTVScV5HolxZLNd0XeBfui43F6QUuJ4GBGBfrNhffmI7cUFq/Wa0A9mv1ay0ZcFu1gHMSHRYvoJc1ZKjBSKuUEXIedCqCzNkmAAfP0iOzF7Ne8NPEy5kBOIL9Zy80rRTM4TkHCuxwsmb+4cWTNTTDgXyMkCD5opc0JjZD4erbswT2iZ0RKr3mOidzZarppJqVrEFW/Tjr6O+VLwvu72dWNKIVeAV/Bq0uwN6xHnzUYSW7yi0VSJO6HrA/0QyEWJJZKivV7Jaq8rQi4W2MQHRH1VkJbafgzmjBwTMSV8oLIQ82J24sgMFaTN2jNNpwG3948PKwicHQ/ouG2xnvX2LVVvf+pxihdnuyjLypP3Fmh72lP+oMsDLQspGJrjKs/ALgdRRUpmKVbeQwNbyXL+Xs5e4ZQJyAkvWP5UM8vGP28TbmCgWec7Vuu1OQ0rUPlquVKhS2P9ec+679leXvLk6TN+Jf+QkvJyHsbjkTdvX3F/f8tqFRiGjqHv2GzW9t7OApvVxsaknJPhGanYOG5Wa02WXMjJJvNyzsaOayarXuj6wT6LC3R+qGDqTPB2Ca6HjpRC1XVMHI5HAz3TGh8uwXtCtUyjcTCqFLpzjtAFNttNRe2VeZ4paWYeR9I0kZN5CsSUGKcjOUcbBnaW9ptfQBvpLnV3PhE9VDOSWsJpAcaERu078yKE5qLktY70ujPnp0xw/eK+ZAIigo+dKSirtSK7EOhFmKaRKZ4EUcyEpMmceeZ5IuZ8yj9VSTGTq06GFyVG6IJnvbqg+yUr/YMJAu8Dgd/Gya93BE4iE/WXnLcEH5QLbam2511uP0sGzh5ni6jU9EJr5OdBsNFqNuHbtt5kuuWMj0DDIOy9fHMgSpYMYnEXhVrS2GNcRYPVnYWKmlm4KgRi7rengaumZNSmEL1Ul1wEH/qaSTj69Yb1xZbjcUcpMyz6CW2KohKuciFm6yy0icZSeem54Sznn0rMzSf09r4VIEA/DKBCmgveBzrvSFMkVRKLc8F65poY90fud3eUXBj6rorAuCq0EshFgMwUZ1IRkprseu9tx5yOO1LOaIykebSBLI3EkkEM0FutBoIInUAQmyspRem6mk5705toxivg0NLOjFRWZ7GpUC0klFgxAZex703NhUnEpv7240wudehIzHQmJ8VLIISe0K9syKhOUPoQwFO7HZbal1KIsapnuUDf2RBbzkpMkeDNlrzrAmhmmhPON6Gcbz8+yCBw/vP7t8N79ff5WGm9OBcw8czz+QQwUnf11nVoM9ynGqLUZW4wtd2nag3RaMlGRrEWksr7C/w822itylMgKuXsszWmYctqpHnXNQUeX4dvWBZoyQWVRgo5lRHGIfGn7gNSXYsqm12EVDMc54TQrRgUjsd7UhorpThXw1WhUJbpyZTNJ8Cm2iyQhDNhVbMLc8Q4G9JROfRFCzgbbEoxMx6PzBLxLhCPew7Ht4DZZHmFkpIJiW7WeO+5vr6k7ztKiRzTzGGcGKeZnBMxO7SSbjI2yZljrOfYhsVEIqHDFI5QGzG3+SnIBckm79ayiq6z8eBQ0XxXtSe9DwjGF1CoizHaFGRdgGAiIaJSK07jGZiykuNwmIjTTBc805wXUVIkoNnUgl3tHolA33fgXaWIG/uvCeiGYMI4wQeUwuFwNFl2hb6YWnFJMM0ZcQnn/iFQG/6motDDYPBQtUce7OrWN26tuXMwsa1E+93yvN/YlU+HdSAsEzDHGXtOcS3XaLfVkuHsuRZa81JSfFsmc56tnGUz8uCnZceHE1X6fB6inQt7mCztydNcgS4xr2jl3alUFduCpozmiRhHjuNIzpONWtfRXvMndLggRlbR3gRCSzGZLN8heErNPLrQEUIwYCtnMta6KxTm48ztzQ2Hw5G3b244HCaceC5WPU+GOtMhtts5gaG3cWTvHF3nOB73zHEkxtno0NqGc9SCIVIXuOnrWxCwrCzOZg4a+mDK0t6+Q5ujyKZQpDZxmVMNWF0zLGXx7vHONPwRj/M94PBdqGzNGR3tOw2VFmziMNWcNSb6EHBYi7FkmHLlFDiPSCJhDtMS2pKs5aEzfKFdLyE0P4Kqiuyr/Zvz9XuHlFq2oKRYUDUm4XcdH0gQeL+mPqXQ72cHpZRl9yw1lbbFWDXyakrWdv7lbz0LAue/K6Xy40+3L4vfuvU2S1D7xidk7zTyvGAUZ7MND/DN83+jCz36YZAQHgYOe56cc9W2qzLmWhbE2rIaWe5rWUl9phb/RIw6iikaSa2DVQspClKSDcW4gqt6i855+r5HNZuluMJqtSKlyG63J2eTs+ZMTHWuhqf7/Z5xHBnHkTlGpnlinI5oMcQ7+J7Nas16c8Gjiws+2tp7X60vOOxeQ54peeYk9OmqTmOr/0NdhNY5ONeJNA0JZ7MTydJ7E/rwdMHuF7wpOJecoGRET6zRUqzW985BELSCnwKkkuq56QhiQct7MYZfVsRlVDwhDJTimEbDGEQL8zwBQj+sCFQ6iNp0asyl0poBl9BohWezK1cRfOjour4ar5qHwRzTg80xpWQMTIHoMkeJdVaEJeB91/GBBIFvHg8XkZ79rWeb+dmdqntOW/q0rGCZyz3LAOQswNSLTashiS2gNnijZyuqpuvaJhXL8vJSQcPzoCBLvNAH77MFsvMAcD5o1NiEjW9gwiJ239Jesy3w+lqc4RB2elowOhGU7H01QVG7X8lSg18dUqm7juAqCUYZj4lpmoiziabe3+8rVqDVGchuH0fbqVsJ471ntVrx5PEzuj7QdZ7V0NN1Hc4HfFgxOM8Gk726fvyM3YufMO33iFRnZ9dIMjbaG0KPiGecZlQzw+BsSk4jMUczIxWAZOaj2Qa0Us62EFJks/Y2FHbqDNZyUCrm0Mhc5n5sXBtfBVsUyGiayWWumE2Hc4m+kyoa4pgSqJriUCnRJgVLJiYIfb/YopcC5TjiOssqkioZXapNMOLafByZxsj24gLnT8a3RU1Vu+s6QhgQMbeilApFp6qh6cnfnQQAfzBD0u8DfwX4uJ6v31TVvywiT4D/A/BDzJT0n1TVd2JX318G/mvAAfinVfVv/X6vAw9xgbPqYLntmw9gSb2XnR1qdnAKB/Z30wqCBZBrr7kslDNAsj7eaevZ67LxNlxAOWUDv9/R0vtWr57d0t7Vkto//Mx6qhLOSgmpi/bcuqoBpu+dOHtgnXZErZuwSKxpIs0TOU9o8OZnmJScD+SU2e133N3emgT2PDNPk2EkQnV1CvR9z9XVFSEE1us1q9WKvu9wztN1PV0XUEwFSdSIWEVt503ZxEQ/+ugTbn5+QdqbtFffd3RdwIXaSouKd6ZYVMp8Ul4q5kIsGs1eXoAS0TwbiFmqqEwR5jnSh4LvfP387Xo742toXhSd1DnDErwjVQ2G4Kv8hxZELTCIZLyDLgg5w9v7Hbv9zObyAh+M5TfHiZIwrEE6K1cQuuAtEwselxNa5wRyVkqBmArz7sDusMP5wHq9tXPaD/aNV1BatVhTyVkmbFVpzU5dtav/juMPkgkk4F9Q1b8lIpfA3xSRfw/4p4H/m6r+RRH5F4F/EfifAv9VzJL8R8A/Bvxr9e9ferTd8Txtbztfo9iebqs7GKf7uWUnbn+XB8+1PDdKEytpQaMsKj5nVflZ6SDtZz1NLHL+Xn+fOGBPbRFey8NMYMnm63tZdulyeu4GDMJZMJRTZCjlIaayvP2zYGZeeO5hJlOMrLLf3XE87GxIZ3dgvzuyu9+TcibUufmu61iv1zx/9pyLywsbIQ72+67rlvS9ufQ8fB+WjZlFeiZqJiahI5Czad998dXXHI8jq9WKEDI+eAM+nSwMywJGmx7W1iKLM1qUobNBqjpRBWo24S1QO+foQ0cfPOsBpGRSHcc2joY+cFw2GMjUfnyVhzc1JaGrFmVOQaWgeUZdIdeMrZSeGGcOxyPdakVXh5ZK9Y0EU76eplSByBXDemVylwkLBs7jnJIz+OCY5szd7Y6UCs571usN/TDgvSkVzdO8ZHvU67tdu6Wa1nr3h+gOqOpXwFf13/ci8tvAZ8CfA/5L9W7/e+D/jgWBPwf8FbWr9a+LyCMR+V59nu94kfa/U657utiNttkWef1oy1o/bdzn4N/ZbP/ZSxTBoveZDZigtV1TiTeqlVhUA0nlI0srGVwNTBlctkwhS7a0XKTSfZdPQeMytEXZPoEs/4Zql1SDi6WCS49ePK61dxrecPa49glPQeW9FGrJMortxMtJVcbDkd/9nd/hq69+TkoT3hkff71a8fj6CevNmu1my3q9NnDQ+aq95+okoLWtrENj76zUllnRjOZMyVptuSY0jXabOEQ6ChmPZUXv3ryi5Im+9wRvpZ1UkDbnwjhmYs5cXj3h8vopu7sb7m7fIBq52nYMQcCVeqaMDSiitEvFOzGlIGdBWMAyhzOSVgN9wToqKaoNBaoBbmZXVzegkqplu1171jI09eKLbUfXB5wXUEPsnfP0naMPHi+1vUh1gq50+FKKuYkFy0tUKohbjA+gVe2plIQW+w4EWDx0avu3uqLXc5cpGfruuydd/4EwARH5IfCPAn8D+PhsYX+NlQtgAeLnZw/7Rf3ddwcBsBOv57s355nyactsdTpnKT2N3NJ2Wq0nty7G2oZXOdvZsZMmNfIjtfVW7AKituOcVk6CtPKivrfSuhLWbXrYk1gkUmgdhNLSz2o0YmVFrduXbKW+Y/vG6+d9mOK3DIbl85ywiNNznc7bN8hQ7X5A1sLl1RXD6tfoe8dQDT47b387J9Xswy0X+vIe7CRUVD3Zn0qMyTmTSzZgrdiQi6gNAIkzrr44T+PiAWiZEIkYIyfX0kuW1z4cj+wOhW7Y8vTpM3KeuLuz71mwEktEEQ1LWk9t1SEW9IzX07Cd5WQavZhK7a3B34aEHGkG6ex+5g2Sq9uUfYc5G2fEcBgDkrtgNPBcv29RQ/VXq4HVaoWURMy1lZmLDXrV4CKK6c4hSHGVqNwufSWnyDQl00QIwXCIRWHa2zdb7NpYRHXqZ/uu4w8cBETkAvirwD+vqnfvtfRUftmrfPvz/XngzwN88snHD6brtC5KoC62mra3Wq3WOzSLJjWST3Vjtv6vmJd8S6tLraOdVlpuuwD1pOjbbpdK/PHOmSipKwbYlGxfuFYL8JwWlR+p4fh0Fk4gZdFkrTUsOpsUWNMWWM4Ii9AJbXdyp0VP7YZwVhY1wPJUw5yei4fh4cEPCubsO/DJp5+h2qza1QQul8BnXIGWORVa/12NJViMEmsBoNbS5aylu9Q3VnP7OhxUxFOarv9yRcwoE+hUZ0G0BsIO5xQfIPSCC0K3Clyw5f5uzeALncuUNC67omShZDWV+UyD92tJUbEfV6+DYgvPodYdERsWKzmTcUQygg1fdUEMn0ixOgM5K2+yZYLmUlyfvzgoYqNE9Rrx7TW1cUXExCZThgbY1m6Lkc8CzoW6iJ1R2kuiZEGC0X96H6rytG09Uprwzjle5ZZA8W3HHygIiDVx/yrwb6jqv1N//aKl+SLyPeBl/f0XwPfPHv55/d2DQ1V/E/hNgD/+x39DczXeXHayswu9CUTomayWogsQ4pz5t1lhdXrs6Y+dD5cKpNnAlKrGQ8q1pZTI80yOiRhH5Bo+eupxXk1q2uki9ni+w59jCKcFJ20LXmTLmgy4uJphSLPc9rUddBogakHA7Klk+S7fbytaCXK+y59wggciLe20QB1GarcZ2SQmS9t9bxZfpXkjtMBcwbVSRTxyKeaeXLOW81LE+3NiExS1SUiPp1Mz4U7iLGg7Wd6+gXutm0NN6xU00vnA9dWa7UXHsPLM0x7VxGoV6JzJiSHZsrliWYi97xZUT++9nAG7Vk/aOSw1Wvg6GbgwI+sIrqgFBvtuzCxHa/bWUnmDFEotIjtKMdqwVrWkUgrzPJPjbOYhrkdzNnuxAKmKjmrRJa2nbmRW24PDJivXQ79kbgldxr0bvpUrWQpnwGPT2Py24w/SHRDgXwd+W1X/0tlN/y7w3wP+Yv37/3T2+39ORP4tDBC8/aV4AC3NqYy0GhG1fVFaDTrq/ZoZg6HiWtM4u7ANHJHTwjlbNJozx5s7xttXoGbtFecZciIn63PneaakxJxH+h9c8SuPnqFd8yGyXa+IYQpFHaI2h681VWsLn5bGtp2+ARf1fbWsp57fE79ATgv+9AWwLGYtp0T8vFQ6BYZT3xjVs6c7Pel5qGg4R46JlGYgGF9/TgtF+Bsl2vJ69TxLG16RReG5lTUOQGwq0JPxWoejRZZ5BNG63HOx+Cq+tgTPS7rMKhh6kOY9b17ZODdqLL2i1hPPGMibcqaILi7LAuDUyqd6PjNqe4YhfHXOv3pXnDkhm0+j/S5XPwjvzPkol1PZUuonLmr9/zpXxpxMAk7cyYq90YKbCE3KVlqk1jXSmtJjgS3nQorZRqVbqVgVS4valKtzrXS1gGfciozzRsnWPyRP4J8A/ingPxWR/7j+7i9gi//fFpF/Bvgp8E/W2/4a1h78MdYi/O//fi/QGjQK1YzT0ayoz7awGhhY0HkWZN52tqyNXeVqal3lnLUQ54mf/uQnvPjpjy0SV6MHL5Zml2yS4MZxm/jkiZLSpe0kEmoJUFASlpU0JABY6MoN4JMHn86JM9+8ikLn2r9edqyzKpuzj3b+s/2tnK33B7f90uMsLT8vC8S5Jf2cpolpHA1MSsmuwxqU4QQ4ti6AOyNSSwvENdi1csDAVaP2OhSpAzmuAWznJWXd6bRldDUtF7FhLV/39Dlmbu+tB355sTKMs1g2pwri1CTVDQol5Yz3gnhvWYqrdG9q8EaqTLiiOFww8DNXmrQNPRkIV5ItSBFnu30N/OLsO6YEa0Rnw0EKzgIHLfhUbQJvQUTVEXPdtaurtauO1LmWWg0cNFcio3SXAvMca4pvz9Wuj0YuWwR7VSmpYg7fcfxBugP/QbuEvuX4r3zL/RX4Z3+/533/aIKUUFFS859eZgNaGr3si3UXK4Cvpg8LPlD70VIf3+Q6jmnmvgltYqlroF4IaqmpcxD6Dt+Zk27DB5wI2kQkWiCqEbiInErYNp8O1O/e/Aqk7W5naf+SSttncrTMwB5+CiZnJcDy1Gcp7bcd7yUVD7/ABa1YalhEyJW374Kz8qCy1k5uSqf3JWef85TJ2Cu1gaUm5dYyNVv3UmORPb5RoeXsfZllWeuOVOBVs2UUYoKnbZnZgEKtwzkBabY/WCrt64xF0Tor0CY0pZZHWluoCIvfgq/ApTfKdSkK4vHBFv0cbTNYPhsnaXwDM2vAqxnBonjdvkS1nT9lpTgHpdmr2ZyK1tmDWhPQ1VmBoqZSPKdcZfcFqcatDZehrgPvfc0+4rd0jU7HB8IYPNX/7VKTyuCrMZvTlF69HaXpCjSrsZxtPruMtoOtVytczQaKZiKFFAIumKZ78Da77X2oF55webHh+mrgo4/XdCFAhRCdOPCCUyN/GBAoy+pql8LZRzrDCxpr0S6GNvO9LJATmPDgnHzjOMWWByXtd7UHH+ACrVypC2+pZzkDHEWr95457S7DTDTzkHo/1RNe8S2ZANQWrWv99JP1tlCf971PqFRSTx1cEszGS6nBvtTMLhke4bwYbVmaZJu18AzUbNOc7f05+4zZvhTX1J3PzmWpQeAU8GTh5oOJiXrnCF0HFOY4267tDcVXhKyFrKb5Z69vpYTUsqGUQqtxUsmGN0gbtmqZbcVKfD0DzuNcxHe+liCJec5oPr3PVi43b4E29t3o6aat8KFLjteru0WxEwbQUkKpu+ZpNjulREqROU5my5UzxzkxzpGYEpvNhs8/+4yLzUDJNuN+9egxufwKfRcMWBl6G3zxXdXjS2y3W642PY9XR0I44PxMEcG5DieKq8HJuQ4zlWgpiLTJ47Pk/jQW3BCwxuJy0qzFbFCnfT7LSn45z7Oo1mT8rDx4/9C6k8hpdORBiFlaj7IELO+bnJHtiA/wCk5BRlU5NfdOL/hwYSvWn6todXsPti1Cm/ZcOh91566tNTC8h6KkbMFBxRh5NcFAs2n65aKUjC2w6tVo+IDUHr8N7oirsuPaJLdaiWYlS2N1mHqwLBL2udSU3Ss+1BRbTdHH42l27gU5E45x4ANZE1lb3kWlEitzjLbYpTuN9rTa3nu881jOY3wDkfr+68ASxbCWrjsJ7C9lmLiFbi619ThPH3wQ0NrHdUsJUNTGQud54nA4ME2TDaSMI3O1wkopGtCCmrd8GPBdb1NWzpHmyChUjX749LPv8/yj54YAYwhvu5BLKnUaSxBiRWg9XejI4gwXqG1HrQKUSw1QjTtPJscNSDvrGJzNFrRb7CIsCyjV5Le/K8Nvv1+ITOp4b/M/HWflv5x+dXbzaQE+eNhZhvJ+EICzC+3s+R7yHM5eTFvwa7MY9QbVhbNxwjss62sz+khrqVmrzIxbQ61AmiJTHfFuU1MtuNSaONfNv46W0TgAJdcsqNQWMo3CbH6QzfciaYGUMB6Cof4uO7Nf860Vp0smUfdlTrJ29jlzy3JqYVo0W2cqR4uRTQ3InbpEVq5UI9xSqpgNlflpo9mGLbjTdfEgYNvv7Px566x9x/FBBAEtyng4mCjm8cjhuGc6HslpZp5G7u7uiDEuabT3pq/XdR2b9YphNdD1PcNmy3pzQei6OocvaE52Ep1jtdpAPyw0evQ0legClFovhlK15r2SyLhaa5qIhiOroM5GQ1lS45O5SFsgqi0lf2+liqW/DShsAaFVx+2/bzlTZ8Dg+U77rXetgaDlJe+1DWsQWN6zVMIM0gCPM3zivffyHjp5KkneDyotAOQHZ0brvljjPVCp22Ry1dLrnOUCNasGrfP8KIh57Dl8pQvLEmOaNZstTk9GCWo9e3FUUk6pFVrTBqiu0KmQ6wK395eW2QFfF2RKBQmCd93yrbUg0tJ/1QpjNg9JbS2+U+C1rDahDpwPi0lrO7+t71/UgMF2jqRYcPTO3hci1q6tQaSddxG7zxIsP3RMYJpG/t7f/W3mGEkpkrNF3y54vHNcXmzpusBqZcMpXWcmDb4qzkjVeTNzh0qucPWCbIpUmDFDIwW19Mp7DzW51WAZSNCM6zqiZCZ19PiaoSglm/MusuJk1yULEOnaH05Lz+EriNP6zHUxyCkjWOAF4cwSjeVZzn/D2U/foB/zcOdui32hyCmcyEY2Mi319YTTzv9wMKlduN98T/bTw6CAsCDwliwZmcbqfTHsATMKOYGohtsUMo3KDVbP5trna0NHVL1ICwMteJ0Bctq+UZuGzMV8AGhYRB03zgqq5qLs1JsgqppTsy3E5lpkTsBaYkXaTT2pqGUbJ2DIgwsUTFPRVQDVqxjtqyQ75Ri3JTdaRAuipZyCippwTFLLMOeS6aV6myA1CHjUtdKnlVX2fVoHpiramzXzt649+ECCQM6JNB/pu47Lyyv6vqMPwSJwbe24+u+WDZw2c6u1jIBW0BItMKjVnKXaVmsx5LuqPwJ28boG8AFOTBXGFUv5Z3H0EuicedFbYufI2oH0dpFRDCgE21m1uQ+3rcm2MkO4a9ZQEWhx7jTdB8sOfH68T6A6z7lrhX763TcTjmWvamVKjTdQm2Ky/Gn3bQtqeQfLS8s5cPvgdc4zjPYyZwGnzl8UbQSiyrdok3v1QW2uw+YSbCGUnMnJXHgKbhEy1cb3bwQsNd68LTIj/WRtuhP135hiMxjY2HCArEYVz+7k8SCt84OxRTtv31eurk7S20ShqBBzff+1g1SK2nARFrBc8QQXUJ1JKdM50xjMRcnJMgTnK2BbjLZUt3JSgeIEP5ibUNZk2oSudkK8o7iqj6DVBr0G8CIZH+rn+E7w6AMJAkPf8yu/8rlNoPma1tSLX6ACKOf1Tq2+5HT5tv6805aKV/pGA7PEod7XFNiOdmJca/1VwC5oNef0gnrT6PNSQIq5vix6gGUJAlqHF0QLbWpuQfDbbrc4yRh41cAwqBmBlve6BW3PPS3Eb04tnu/KtQY4q9jlvd/WkvxBTd8eq5XOfI5ftOP8eRZiVAsd5++3BZv6KAsA5YTYq5iTu7RMpr5PPcMp6k6v2kgvoL7U9liyGlsg1ewmiZIFcv0eSsVLtGIt5o3iyB6TT1NhxhHVEYFjETpMraioErMtDC8CmKuPZZhWfxe15whi10lSy15cHXoqaju4tPcgFoSsOVDre+ct2XE2lCbGV68pv21ITRW7Dx2r7YakQprmsxPdxsmttDCQWR6UEd451Fub8LuODyIIOO/ZXphXmrEGqanYWSUpskxLndIvE5/0VdCyKeQi1biBJqqRa6Yc6m7RWlC2IhoHQZ09oklyNxqsr7x6HCQUyBhNNWMkJlkWa3m4smyRawONWp1ou0UuVVq8lQWVdNSC2uk5vvmv08/nQeC9MuC90uAkU3a695JNvPca7/MC3j+WjuOSpDy8j7QA3b6Ys/fTSqAHdWodxhJYtGAs/S+UJZMqpGxSXEUgYRTmqLZbO7X5gKSJXBw5mxqyE9tNkzPH3lQKYxHGDGNRpuIY6CjZE7ISRAni6CisgqumHp5OBFxANFp2kVvr0Rau94oTm9Z0BYqz6yMBxynhpcmAqUmtOzUjZ1Gyy1UL0l67Mg9qCSs2DamFzgdcY62WTImVH5BLLW1bdlw3FLRF2O88PoggQF1YpxaHh0qDXHY0aUj4KV07MT7qb+suZJhArY/bIpdSiT3GqXZ6urhPlN+AqKm4alQ0K6Id2ZVKZvIVyFK8ZIIrNLuJh/txy1wqgixnANzyf/uaXVsoDQw46xA0CsypfHk4Iq16Pjx0djb1jD5cT47UHL8a5dBEE89FUq1ut/T9HJg8fS+y/FuxgqKVGO9nBFJbpojQGJz2XC0JsKCwBJuSl8rIcHgxVZ5iM/TOeSiOXGxop5BMYFRK9YnAhnXwZE2kIic8oQioN2Xi7BhT4FiUsQiTerQbcKtLYu8oJZO04CnMmphyYpyEPgkrH+h9oJMOTUqssmY5QynOMoY6SWiZqq/npzDNic5l1kNtDfvquZAzTcfSBpGgcz2+lkSqEOeZu5s9q+0FF5sBdLa2acoEb21JxFUZuvq9qW04Km5pTX7X8YEEASrIbQtHGnWYRmxptfHZrtQCQDvqRd5Yd9DS6IcnxTcSBmepdQ0UVLQf8eToSaWQNJCkGDBUIyxiE3GuytZWNgONzOScoxQHUqpkl9QxVnmoHOxc/XLkbPqQ5b2f78b2y4fy4r8E8H3wTO3O0gLCUkKxnAdtNUINOo3P8OCZlvudlQtnAenbXva9fz78pZxKnVJp3O1cWBBoGYbJgLcAaN9BMtXjpbRxxgkoHtWOXJSUraaOyTFPgiRhjo6oPbM6ZtdR3Aq/2uAvrnFdZxJlampFWhIpT6SSOJRCR6ErBa/CKlkHw6GUEtCSWIlZ2qdiYJ1TT9G0hFOTWu8ILuNFa0Zg5W3KBYjL5xV8FTqxkmgaR1brC7wYEpgqqOu6tp3UYHD29WglSeXKs/iu44MIAiJitttLEHAslmFy6o8u4FO9WNtFrUs/e7mRh/syVUtQOPnHwdIqqilTmwxM6kB7RoWJzoIEAlJIYugwrkOlEUWoMk8eqbuoR9BUhza8taecCl0X6pCKY5mH4FsWyhkSf77zLwGgXvrfWHz1fD6k8vKgBSjiwIN3nuZ01LKK5dRUIG05m+8DlPXvBgC2+7TXKmc/tzypkYPOQcR2n6yKV6DSZqUh53Xx26IuJ5wIMT4BAsVBcZTckbMjZ4hZmbLjmJLV58Xju46YOrII2XX4YcOwvqJbX9BvNog312RqkHFaoCTrCORE0omZhOSZo2ZczMYGLAktwpDFbNWy9fEDHVFnE6ypHgEhdHiX0FK5/2ogZzkrGVUcxXlKcUtJ9GADxNix4grMbdBLlmyvnfGiDXjMv3TH+CCCAGLGGK12roiJ3ba0vQA5U4WRU2vQnS9szrIGBFwNAk4rXneGcLsT2Ubb4Lk4VFdouCaTyH3HzGi7uiSiS5apdAOuW2NFXaXX1rJDsQXmgpl35FYSlIIXt0g9nTKRtvOf6uyFRq1VZo1WNUjbrFmQx7Nd+8F5YEmQls9rjHiTyApVv2+hQLf3sDzmWxiJbQc/K1selicPA5OeLf6lbGj/nQWWtgSaI/OJ0WivUXKhJJsVcOoRDeQcUBVSgoRnKj1zhHFWDnMmEiirNepWFNeB71mtV/guQNfh+xXdsMGFDhcaM69NqvaYspGZmZaUKWVj11rJaDbGqomXZBP5yMl4KTkRFNwxk6J1l4QOlz1ucgyhZTViLFRv3pfqEiBk6WnkqOIcjUVqQdrWQ8mZ4gou1ya0s3XTsuYmoWfDcY2n8e3HhxEEAGshlZpOn3b5luzZvwTna/91CQJULkDdGaEy6vRU1wq2mxer+crZCT0BWPUEFjF1GvF2IocOZCaVCdJELDM+BKQfkGGLC8Oi8++cM2GKmra7yjIsOVHUdO1TahNvrc4Gw7AbswCW3b/9Yfn1g/s8/PthADh/iOgSO0Csh2xsQ1nard++UZyl/e1fp+Ti7G7yXiBYqixDTMTmL1oW0BZAfcDy3MvHc1ozJ7do+6laJuWQyiToDN1Pyj4Ks8JcCmOCVAIp9MYgDWv6sCaEFf2wMqp43+E6t+g5QEFkqhlb3VDO2otFIDtAV7TpHs2lgsdWz7ucbBIw2aRfzJGSZ5AeJHNEmGPmmApD56pMmSN4s42367HDgeEYuQV7Nau3qlOg9fVyTuY9EPyC5WSa5kW7to0k00Rzvuv4YILAMnAhtb5rhBXXALbT8eBibzGifujzmtue9yyFbv3kujOd0mZbgDauWXck15E0M9Hhuw3ohMpILAeiCD0DwQ0435vhRJu755TCnlpetgsW1SrUoafQVm8/ddpPu+835/ib6YlyloWf7RAPz0/dzJe2o7ZORL24Ws358PI4LwIeHqJayx89xYdzeKD9WCPPefovev652mOURe+RJf+3BSiW7SmmtmVz+sbWnLNyyLbbTVE5JJiBqEL0PQw90g10/ZpVv6IPg1lzhZ6uc3hvSL53ipdUh8wSWoebjPRj8wTWyjWCmIrH5MOp8wyWsWop1kEIp2CYq7eBEJESzfRlHkklMatNyapGpGS6VOhdpkMIUsxPsBScs1o+qZLEcIBSWYeLsKi0YFVHqPV0Dbg6Bl1SrlOP3358IEHAcHKzuKqp/pLetn+3dNEeYQuknO5TATjv/BI0msDCCUqoAN0DQKzyqwHxivhCLmIuLlmQpPi+p/cBJz1aAklNQ94lYcA840Qwma0Yly+omXTmlMit7yXY5JnIMupsH+0saLVwsASW93ZLlgp7aWW2TOQbZ/ZbwL1c1XfOlYNOnYZT5vXLvi/QUzPjDIZRTsyHB9Fhud8pQC2fv37WkkslWtmpKiLEYrLbWQupBI5Z2EflcEgQAlkCSTrUd6jfEIYVYbWmW21YrVasgqdT8JX67X0hODFHIU2IGsLunHE8BPMJoJqnqgxkehTDC1SUqI4pKQb5CKJdi13V46CYH0HoEVErEcThBhNWLTmaeKgmSo5EnZn1iM8RlyNeCsFLnZ0oHJMSi9SOxxlwqk1roKo9KfY67jzLs3Z0bPjUtxwfRBCwxelPi7TRgM8cec8BMYXGtLFSoFKHG/+6fXg7KdYJOFezsVHSykbLuQ5/1LTOO+MDVJGLDMSqeBOcQwaHK2b7nYpNp/kl06jpV3Wyaco9Vg6YG02r65sMlNGMQRcI5BzYbGBlO09t1z+rwxcs4dS+Oz/sFNXyStv9M6mY8szJF9FuP3UOvgV0rMFyySg4n0yw7MAtOX1ZSjqnZxiIYKUWLVOJp9u0DVHVqTz1tusnJRZICKPriaFDJViq7XrUOST09P2GbtPTbzZ0w4quC3RkQil07hTcvC/WnquMLec8wXtEI2jCuWgfxHVGEdcB1FupRyZgCklJBK3EEBVHdIAqqQZoxdiAUsQ8DDqHSI/mmjlSTLW4zGjpmeOIk4gjW7aaMuTMPDmy9mQNxNLG2T15KY3cktVZK7t9N1WaLFOzlm8/PowgILJIIstZuirO+ALNgqqBbxQ94QG12BVnugBNHdc5X9t4oVKPQ9XQtyBgajpHxmk0Y8mcaIy9TiAER0pWXkSxoCAIXvoa4RNZOmJMhDxXXpwBbM1/zkuBnJCSjAAiDl9TzVQBJadKKKCufqHigOYd97Al2Hj+LTM6pd+6nKPz40G2XjnqRRSkkHIkN/l1pXLxWXb1c/mzbzts53MsukgKosneY4taNZ31anRYFTVuffHMcUbSkft3JkydkyLFo0RAiNkzZbgblV2EuXiy65CuN5zGD/hgoJ73jqHv2K7XdIOjC85Gfl0haCHUoBRV6byvu341Vw0OLx3BrRBNhpW4DG6yVl8ysM5J1ZbQaIFFAiWo2YNn6ri5kMQafFoXJWrDaEVqieMdrutQqiqzFoQ1WTfkNCM544vpJuZpImtEfU8IwjF3lF3GqxBcRyyBnDt8I6yVWCnXVRillgqaQb67GvgwggDCKYWpWUCuULllylKtuCul2J9EOp13+M7XBR5oV3EXelartbnJiiwzCG0BpZQYx47QdYzjkRhn4CTvhA6LbFXO2dL8KqXtvaOr5pv3tzdoKfSrtUXnZHr7LU92zkOo2YqCC36ZVc9agZwqdV3x3AULOGGDrTx4+PcJFLC/zoOlnGUUpdJwC9RmS1kyoBZMlic6Kz++Lbs44RTGaHPt51oalDMMwrCPmiuISXUf9ne8vd9xd3dHR2R6bUFgzCAMZPXk6CizMKbCMXmydJQw4Ps1oV+BOLp+YLXesl5vWfUDQ9cxDB3iMiVFIFFU6cQUjrXA4AcbFFOH5RWVNJZnOgLemWCIKxPeFYpzRO+YcjbTUSmIdNZlcUIqhaCnTCgEZyk7jozxgNR5BHtMboHbWQZhgdPV4N7hw8oEUypm4NaFkDJ5nhHNHErmbh7RlOmDMKhnVZRVKHRAJzaUVHKhd3VOQpuu1neXeB9EEBBOZBup3HonbmGKtWm/UJVefLVqcr6ZLbiKklbRhZTxPixBwAY0zJG22Y31fc0Oug7vPON0pMlpo6UyLaW+O+tJZ1XmlMh1GkxzYtzvmQ87Lh89Zlhv8eIZnLP0r6rx5JxskRQbHaX+aSNJNTFczofCojBbzluE7wGF58f7v1dtvPKGPfAQFFy0Ddsr1r/kPCh8O8Bqh6F1S/3fOB3i6nu310kpcjzcs7+/4fbmht1uT0HohzWPnjziOnwGwJgduawYU2FKpXIwHPTWygthwPcrhmHNalix3XT0fSC4QJCevuvo+zrKG1wdJxacZlyxSU58T0oGPjo1WTpXQIgM7sBqUNarxGaVWXceEU+mYz8HXt9m3h4KRQaKZJKOFBVUPFK9BX3X2cZVQbyYCtOspCzVD/A0LiVULErVFq5UeKgIuA4J/Wl0Plfh19p9oCSmEplyZDdnummidzCI0kmhD8KmQB8cpqoNKh/4FCEirDYbGyCqiz50HX2/out7vAtLLW8S466SbdpOxYLyN0FGK1G9YQ2htWDK0v8Wac9ji9x7X0uDeXF9KbnZZnuCN2DPe0+KkVisH5ynA3F/z3w8sr28YnNxxbDemnOu84sCsqqSSHVuvjQtEgsEmpe2YgMHlqV4tvj0vX+fg4nt7/NMoOnmuWXevibqZ8AoqmeEIb51w/i2AIO2c2mtMqQi9zGTcuF4nLm5veXd7Vvud7doiaz6jutHj3ny5BnXjx4z9AO3L38GwNtjsbFfWZGkqk77QOh6hvWa9XrDZnvBZrNlNfT0XSZIRtTkzL1zeGfcffFUJmYACTx+/BTnPC9fvyU2d2GpmYwU1j1cXh14/tEdT64jF2vHAPjiGeeRMX/E80cX/PiV4/XOcSyZHBxDf8F2c8mwWjGsrAUZQkCAUsyP4DhljmNiPI5M45F5mkgxEeeZGKNlTlVYRqB2JaqaEYXgA776Dlo9h3WIcqQkU8uOcSSXxFRmyBGXEl0Sutpl8EWXYadvOz6IIOBD4MnTZ3R9j3i/KMeGrqfvV8bl1zYDUNPT85YYLRAYLTiEQMm6qLSGUMd4i81xt125pcQhBELoYBqXx5Ssi/67pcjOTB27uovmqs0/R9DCmHekaSaNE5ePEsP6wpBq50EdGSMKLY47tMFyajpoC9JQ4xMYyHvlQCPZ/H7HAvY14LDmNRX/e3A0sPVEya4p7llQOX/eU5BpJCYhzYnDNPPu9p7bu3tev3nHNM34ruP6yWOef/SEJ1eXrLpg59F35FKYKl9grHMbqC3mzneshoHNZs3V5SUX2y2bzYqu6+usfMRT3aI0WVDKulB+rVsEV4+v+Y0/88eQztP9zu/w5ddfMu4TTj2kjHOR1Up59tHMZ5/dcrG9twnCWelyICSPm+/xq885PPuYqUAuG9bPHvH4ySc8ffIxF5cXRjl2wcDgnJfvMdd2Yppn9rsdh909x/2e25sb7u/vGA9WiqZseIqro8g296C1g2Ageec7grdsV31Ag9GmU1xRspniqKplIWqdCJ8mvCb8d4nP8KEEAe/ZXl3VVpsQYyLFtLT+fDiJXJ7osO3irIXzWUvKVemn3KSoK0qragpDRQsxmqFlq/tTisxTNIcjpfaLtfaqbV7ACXRdjyrklJnmiZzMkdapEo9Hbqtz78XVIzaXV/TDmqqWt4ynmiCmofRKqSPRtvs36yptnYUqPd2OBgK61tKTVrZ8G4inp/+3BkCT4npw/xaYaiDiLFDU1uM3WYEmv304Hnn77oZ3727YH0ZSyoj3XF1e8PgHT7l+9Jj1xZrgFZdmfMn4bIs2iGNYMERHJ0rnlFUXuNiu2W7WDH1HJ4kw3iFxZ6oaTlDJJM1GM1AbkrFOR64KAJlu6Hjy/JInn1zgVx6/+RS/GXnz4gaXPOk4oYcj263y7KlwsbG5fyFYdyAlBncgaSbPha3Ax4+f8/jie1x8/kdYXzwidFtc11MwnoLmiss76wY5oBfo18rm8hGaMzlFDvt79rt7Drsdu90d+/sbDvsd03Ss3gTGj0i1fFXN+JwXo50shVQHrQxH6yiyAh9sg6wtSEo0xuMv2Tg+iCAgIka2cILzjq4ChEv76rRBndLdpeVTd8dyxorK1j+NMRJjNQ0pJ4KF4QYzuTQ/e7uwh2HFMAy2wyfzs7c0vaL2JdEF+xImZkuBi+EEXbAgk6eRNE1MxyP73Y6Ly2vW2wt86PBB6JynDx3BucW2SoulsKJS08JTmn/+vheSUE3fjYy0nMRvnNdT668+rugyLn1OWT6d3bNzvcRXfaBiW0rheDxyd3fP27dvefP2HfMU6fuey6srHj9+zOPHj7m42uIkEGMhp0iZJ3yeWDnofJX7ysr9/T0A165j0wVWwbHuOzqv+HhE5gNFE3PJzNl8xbyvVtuVc1/UTE9jtIURNRLTxPpixWe/9pxuFem2iY+GjqTPuNz25GNhfJd4++XPGVaRq80VQ3hKCB+DW6F5At5C/oJB9sSScRM8urig++QR/tFTIp6kQk5adSac+Qc2JSFsrNgMRQteOlwX8KHnalhx9eQZWjLzfGA63LK7u2F/d8f+/p77uzv2hwMxpsoBKHhVHBEvjuyFWZVYFILN2cwq5IqpibMhJJHBJPn/oRgg8ifIxAVvgEacKKr4UElAtV241EWlut+WTM4n15ymtHoyyKxECnU19fd0/cDae0LnFv5AqBJMKSXG45HjYV/54bZgbIrYnIJFpLr09sz7iRQjXoCSKcykeeaw23Hc73j89BkXl48QejTb7uDEFJU054pYS631arrdOBLnQ0Y142movRlMSOsTPoQWpfX9W+CwtJ1i1NMT7wIaRiKc6BdI89YzS/Fpmri/v+f1q1e8e/eOaU740LG5uODTzx7z5PFjLi9M31FEmOeRcR4puRhYVUZW+UiIR+bxyGF/5HC3583XXwLwvc7RB6OMe02U0Vq2xu6MiGql5CYIgvNdJYVJ1WXAvnPJBtzmTAowHm9Ab+ldoITE00eOUNYcb0aKrLjMW66GG1ZuppMLfP8MDRekvCOPM770+LKn44Cf3iK8RA9vicd7shvIDnLA0H1vJYErUklPhWzqB2gVRNGcF4IXAM7h1hsu1gOb68eUFInjkfubd1Yy3N6wv78nzjMaG8nIWoJdcFW3wBNL5ZuIBZyiuWJArqpTf+DlAJzq3lxFE1G1OiklQjAJJVU1K6aS6+JOVSkm1b5sa6vVIWTxdbjILpbgV/T9QNd1hNBkywxnaItLsJS/fUnzPJFjNDAJyHG2sVdVur5DLq4gZcbjfVWFSbYgYyQrxGlCY2Q+jmwvL5iPB3NAipEyOzQmyIU4HhjjgSyeYbtup6DB+fUkAZyAPwPlW+aw4PScRMLOeoiNT9Fov4ARm04z6C3IaBXFnOaZw3Fkfzhwc3vLm9evOez3dH3PR8+/x0fPP+H68WOGvrNWYU7EaTThjzijueBRvEbK8Y79/WuOb1+ye/OS3e0th8ORdDgA8NjNtbtj8x3kVCGTFggKrliw8kXpTFkPFMyWpIJxZJxkJBScKGm8RQ9v0FVPyYmuFC4CaJmByOOnG3x5i6S3di3lLerWpNpR8QTIisSITxNpfsv0+ksSj/HrR7i14sURQmc+Fi7g1OPUMq5YMkm0zo7M5Dwb6Mx5qVeNcAn4oWfoN/SbS66fPOdwf8fduzfs7+447ndVdXtGk003+jNV5k4EMEA7UkhqKoy2CXzgtGGl0h/rLm4X5wlBzSlZHZSzBQZYdj6B6rcmtbtgnQNfvxATn7SWlaNbSEOhpvULAw+gMvpEoB9WttuHwDSOpGmsgGWdLAO6rqMTy1oKhXk8WhArVV6sKCmO7GJm2u2Jj64pxUggmsx6atzteff6JTc3e253E8PFFZ98/3NC39c58JPa7EIPqMGuql3RAgM1CW1/moZPY1CeDqm3nu5r2v22eMfxyH63Z3+353a3Z4wJ8Z6L6yd89v1f4frqisvLx4R+RUaZ0wxxxqUJyZFOE32ZiaN1Tm5u3rB7/RXHty+JuzvKcQ8pogihlhqdZihKqmVdEAvO1moMptrgYuXApCpe6hqnqgbLQpDIMGRWW1hfeC7DDfOb38UlxzgfKJNH8iWryVOmCSET88yo91Y/T6DuSIkFmY5Iblkl+Fxw84Hp9hU340846orh6mM2T79Hv7lkvS1sNlt8N9SU3ARIBGzh+0DRjlJSlcuP5CKmW4Aun98cBzr6dU/fb7m4fGTZ0+6e/X7H3e6O+9094/FIjgZMu0VLs1Q1JVNIEqmDWB/6AFHJhd1ub62TmCoOYGBdTpl5nBY2YAh+oQh7b1NUJybgOVHGnWUBliqmGVq7zsC/0w5q+6arCKsNkoSuX7ISipFQtA66uLares+w2eCDY39/x/3dDfOYcKng1fClOE+M97dMu1uUzLi/r0DiyItffMHLr1+x30+Mc+HpJ5/x0fNniBPrCxfDNoB6bk6YgGsGHvXz2iipnnBS2lxEo1Gf8gQ7JwaK7vYH7m5vub+94f7+hmkaERVWfs12fcVHn1yzubrk4vKCIRiKn7MyTyMpR0STLfw8ouM96XDLfPeSw+1bDjdvme7fcbh5SzrscTlXIUwL0FSjzJjtM6ViSkHDqiofZU+lWaAS8e7IZgMX28Cq95Qc2B+U/THic+TiCj797JLnn3Rsr2B7nfDTb1PeJmQamfcC6RFb9ymdXzOmwDgHpl1hfbej6yAzgvN4GZkSpNEz7zPzLhFI9HGi58Avvv6Ku/wL2D4G33Fx+ZiPP/uM5x9/yvryEWHY4PqV+VRUDUPnDLg2wNsbNpWhFKlDR2ZN5ovZk3kCrt+y6tb0m0su08z1NHK/u+W431nZen/Dcb8njiNFLUPyrknJmt9mG6z7tuMP4kr8feCvAB/XS+s3VfUvi8j/EvgfAq/qXf+Cqv61+pj/GfDPYNT7/7Gq/l9+2WvknNnvdvUCp+7AjvWwRlZ2ckLoWK1W9H23kChcNXY87ehttzuNVBqaSvW0k4UinHOqJUEbOKpjvW0F1XZN33UISnDgNFPyaGCM2mxBQlHvCKsNW29Elf3dLfNuTxxnXFGjgJaZkiemeWTa76Gq6N7d3FIQS4NxaBopcSQ5iDGT0szxsKtBYKojrFSpbTj1BozXLq0UclL/rSzuSK0WFcEVuHt7w09/9lOr8aeJnDPDauDi8VMeP3rC5fqS0PVoF3C9R1Cm6YBLCZczoSSCRkgj5XjP4fY1080LjrevSLtbiCPEkTBHViWRQzAXoVQXe21pAcyliYcAPlXpb0wgVhSViX6YePa84/vf3/D8o57NIJQ5cLgTbu+OHOcj1087Pv3sgutnhTAccGFE0y1EGKLiJ6XME4EIbkvoB7bbp4yutyzUb3DhAjesbApYIvH2hpv0lumYybplyoXSJy4uhfFwy/3hLVmFPF9zd/slP/29T7l8+kM2jz5iuNiw3gwGdgaxLolTRBrzv24olc1qxZkt36iFmBWqrbgTj++2bIYN3eaCNI2kOHG8v+Pm3Wvu3rzmuNuRZLIMubYpBf1DtwgT8C+o6t8SkUvgb4rIv1dv+1dV9X99fmcR+RPAfxv4k8CnwP9VRP6o/hKDdBFYrVbL7h5CWIA6QRjHkVIg+I5hWC12Wadx01rLPkC7T0GhGT/YTIH9nHKkzEYS6rrOSgekZco07rdWAQlKqS09+69UDCJlrbJOBbxjuLjEdx3HENi9fcd0ONbHZ1wp5DRbN0Ct25CLKRWpGksu55lcZkQDJU2k+UiKo10EWuXMa4vQ6QnHaArHuS2sonVAyDgNJlRpVmM+dEgplDiRppHtZs2zZ08JXcd6s2VYrSuT0sqLMU+kPBPIdGVmyJlunsjjPcfdO/Y3r9nfvGa6fQ3jPRIPuFLwVZBDCwTxSOgMKMsRSqx4jn1XlXBYFXuxcqmKDnpJ9MPIJ595/tgff8Jnnwa22wmX9zB58rZjvM5MqRDWB1abidUFSD+ajHnx1vYTIXSOlA/E6ciUOubjBWH7ERcXn8J6Q9he0a+e4lfXyBDAZcLuHfrsDYfbmeNuYr8TZidcb9fI4cBqPLLZbNhuBt7dCa9v9nxxeEf+SgmrjsvrFY+u1lxs1qxWgT5A8MZR8C6aQGk4DVW5NkBXTEotZyMJ5VoumMmpx3Vr1v1ACD2h6+m6wM3bNxx292iKkJOpChVF/jDW5Kr6FfBV/fe9iPw28NkvecifA/4tVZ2A3xORHwP/eeA/+q4HeO959OjRYhTZfNi8syCABqbJetAlQ/BhWajLRUQlZWr9PZzERpbit46Rdh4v5geXYkIoEMwgo4mOpDQzzzM5R3KK5HlmnkfmOJOjKcPmXKyPW0G3otaCC6uBNdeoKrclM6WIqlrdW5H4xtZrc1C56s1P08TxuGdwkOOElpmuqyVN/WJFi9l1N8uqKs9dNFLiaP6MaSanCpymDNkyF+c8PgS879gMHb/xo19lzgnx1roqatz6oljgckrvEk4ifUl06Uh5d8Pt179g/+4Fx7s3TId70jSiaaLDVHVDDValFHJ2JA2VFtumNxM5VS4zVA4HBFHAm49eASTj/IHrq4kf/fpjfvSjjvV6j8ZbNI14DYjrGbwyphFNhU5t9Ld4ofNbnA6kOCNuJnQJX2akFOYkzHdH0tETHq0pq2s228f460/oNs+gW5E00W0/4urxge54pLx4hX+5YyNbHj3uudjPvHrxlnV34PpyYru6YLXe8tVNx+v7yN0ucnd75HYzcX2V2W571oNj1Rd6PxP8SNcroQ84J2hlS3pfZz+ruIq1amsZ6Kt3RQWKcR3r7aVRKIK3eZj9Dp0npGT7HnLhu45/IExARH4I/KPA3wD+CeCfE5H/LvD/wbKFd1iA+OtnD/sFvzxoIGLae86FWnPLaWtA6LqOUoq1ncYJVanyyidoa5ms0xMY1oyqm+SXKbJrBRMFSYV5mhiP+wUpTynVrkNcFIE0mxNua/WUJn4hVt9pfWwzFMuqhhVcXnIpNkZ6vL9jGmdIeen9UrSSTLJ9wUGIpTBOI27wFDI+wMXW5Njv795x3N+zXV9Wi217jlgicxyZ00iMIylb8DIRklLfv1JSIadSiSMCPjBsVtYaFehcoBQz8DBbkIKmiZQPzMdbbt+8JL54yfT1a8abl+TpHtIIJZngjhaT+9ZsiL0TclbGORNri1JKNsNPwiKacToaI1IWoxLvE92Qefws8NkPBtbbe5R3lCrfLUXQOcGk5H1hDtA/vSSENXnwlNUVDANJ36D7LxmYrJxx1l4LKTKPb9lHGx9eXz/BP844n1AxfCqqcEiFL19/wbtXX+HcFc+/94zVqrA/KJtNT6cF0g5P4PH1NSlMHHIk73ryHNjnguTMfEgcOuViDUOIeDfiw4zvwXfWrQqdo+vMT9MyPbd0ukppRC1rl7YyV8TRDSuuHj3Bec+dE+JeIM5ozoRfstL/wEFARC6Avwr886p6JyL/GvAv1VX4LwH/CvA/+Ad4vj8P/HmAzz//HPORB0rTX6spoeqCjjvnSW1X7fqK8GPMviq33KC+JSgsrLtCLrOhsjESo+308zwvDK2iSimp6hiWM1KNLhRZQY144cQAl3oCklhToFQ+QRGbcR8urrn2nn4Y2L2G431izIW5EoEEwXUD3aqj26y5ePQY8ab9V0RwIXBxcQHAPI28+OpLurDm4vKaCUE1kksk5kgqsYpeJsjRPjfGPcg1EBiQUTOZohzu3xDWA8N6Rdhc0tHj1RswNd9zuH/H7ZuvePPyF+xfv8Td7/DHCZdGrFJs3ZJGJfYo3s6H2qhx0kQTgUltHsNV5mQt2WwUpLETPV0YQDK4Gd8XLq47Lq5BwojqjAYPuoK5ICHhguCDoGTiVAh5wLkLWH2KdhvSCDp/TZerEGzpWSVPTDDFicNxZiqe4fqSy8cX+MFRdIAizPs9b159zYuvfkwg8fTZEzZbz83tDeOxsBmecvfmNatLQWRmjr/g2XPPqB2aLjnshTJPjNlTJiEGIe2VVcgEn8AdEJ/pBkfooB+Efgj0XR2Nr3Z7TgIiwXDqYjThjG0GodLpu2FgXS7IceJIIR2gxGQclu84/kBBQEQ6LAD8G6r67wCo6ouz2/+3wP+5/vgF8P2zh39ef/fgUNXfBH4T4M/+2T+jc5yMGFOgmTs2ko5IZYu6QEpSp+qyETOc7R8C1qqrElwlmlFFnGN1scnENBHncfnZAkOTbKJekE3iqs6/L8nGiU3nWgeiGpxYnpGXuyk2D4GYaObq4or1ekPnzfgi+54UerrBs1lvuH70iIurR/SbLa4LdJ3HdYLrvJFi8OyfPeZ/8j//X/1Bvq5/6I7bISweeyb+4nEygC+oO+JDwYWIhIj4XM89ZvXVZ6RPuOzpcPgxEacj3eFId3WJZ426DV23JrlQv1pBU6DMAYuXE/v7I/eH12weveT49Kk9f1hzmDJvXr/m9t0bnl1c8ezZJcN6y93+JT/5vR/jiueTZx/zYv+Gq7Vje9Xx8uufc/3Jlj/+ox+yDY4vfz5yezeSpsRxSkzSEZ1ykBnHAdgh/miLf+NYrR2rlafrA33fEfoenLPa33dLa9ymQbPxXKRtXELXDWy2V0gujCoUP1PiH8KBSGxL/deB31bVv3T2++9VvADgvwn8Vv33vwv8myLylzBg8EfA/+uXvUYphcPhQClK1yYJOVGE3WI8AiF75nlCyeQSl6hYKv8/xlhT+kxKadnpDeSLqOZ6obmaKuea3rcM4qyLXle11pFeaqvFhlOqjTSGwpdmL4W5H1FnDoz2a2h9d3nFehq5Oh7xF1sutxc8ur7m4vKC0K9Nxw4Yho5uCIvgsojwH/7v/jfkLISwJvgBV+XYShUHaR2PxeVYrVtQmkAlAjnjUybkjKRMTDO5RIozuu31s8d8/vHHyOHAT/+T3+LF3/sxx9u3kI5onlDNkIs5Z7mqw1dsd7eZBE+zG8uVzVhytu+rmovI+R8HViRoZTg0BSSbEHVOKMEswufiyHgIK7vYNRs7ThJIRJkRUXoP83gg7jaE+xl1ewgJPx0gKm52iOGSxBlyCeRcOB4m3s4j5ScvkNWa1e0NMx1jCvj+gk+/9+t8/GRDYeRwPPDqFz/ly5/+jM++/yP69RXqesasfPzkis3uK3J8xfc++ZyLsGHrJv7+j295tR9NINRtmJ0g+UhJe0reI7IndEq/hvXWEy8C/coRes+w2jAMK4qfic4ZplOnaEUEslKqBVqzIu/7DXmdiHMixUL6wwCDWO3/TwH/qYj8x/V3fwH474jIP4ItlZ8A/yMAVf3bIvJvA38Hyxf/2V/WGaiPIedc236+qvbWNle9vQls5pKJ0UhEC9U1G88/ZQP6cl3YrcZfRBkbj7vW6dQUtTnimLdBqamttRX1fHtXUK8ssqBnj2uL1WP1rKImFVafSAXcsGJ1/YjnTigpMvQ962Fg2KzxYahSVqZqJKKL8o/3ZoGlaoCpsSXNKadoNFBxYU+e2iPLzASY5HqtS607YQtJNNM74fr6ko8/f87zp9dMbyJBDgR2rP2I00jSaG29AOdKwU3roH2PWrUEcp3AVLSi3dW+vdZPTVNQpEpi1dBrlmOOXEyLr0gk9A7fD2hYmUiHCibRkez0Uigl4bIxB9NBSV8fQG/ZskIGhz++w42KmwoyF0oezV1KheMs3O4cL+8Tr+JbXo3K1fcec/3xcx4/+5ynz77P0yefsOoz03RHHHccbt6xXXU8//g56wuTNaP3bB9d8/TwEWOK9D6yepSYPsrc3ymH/ZG7e2GeC4SAK7N9xpSRoqRxYj4m0ghxFFZbz2rTU2KixNkYqs5o9W2deFdt2kUWcqk0jKBf4/sJHaMFy+84/iDdgf+AJRF+cPy1X/KYfxn4l3+/5z4/BOiCp/PeFlAxf7WcMykawyqmxFxpkymmOu9fqpJta9mdFv3CsV9aCC0IAL7iCdoWcbuPUshVhKMpGlH5/S0FK8t7bhVDez1Hbfed8fwtFpgK0lX3mKtH12jJ1rILwaKNBNsPSxuHLXjX0eakUs6UVJjnSIplCWBNlaixKRsKLAAq5GzefCLgNeOqvXaaj8R5j5aZi2fX/NoPnvH5H/sUr4m3+8h6k3l86RgTzHtT4tUgiO9IQJW/XajIqElxabER2FzKEmibNHetoBbBFK1AK05sXBxXswjzgDDtvYntU3j88Yrh0vwCNF8aA05GYI/KDtxkIFkp+Dlw+y4Sd3f0dITLEZf2uEOCg4O9oqN1eY7R8fboeXv0vLwv3N8eWN1n/ujqEb/6J3+VX/9jf4qL7TPDOsqReRp5+/pAyZE/8Rs/4td+9APu90f6tWe16rlcXfH581/lZ7/4GePtOx4/6rnYHHn+UWG/h2neczhAKavaeZqQkhaQWnXkuJsRP9INytXjDdePHzOtBrrB0w09LlRWbAj0XU9wXdXGbJ4S1cHbdwybLdM0k+YP3JAUVebxwP7eMXoT4ki5knpSFfVMp5S3sfhKbTc1FaAm6a0NJJTWflJM+LItHuu3ttvPR3DPWYQLyuiW7YvmhKS5Eoyo4ibN+7B+Hq3UYedkyRgQMY75GX9fxVJna/8Ugnd1nNWS+JwyMRmQmWMB9ZRkn7togezJWsiqRK2didYVqDJVHqXTgsSRMh44Hu6Jh3vG+R19D/7yUwZ9Qpcv0TQTuGOzKexXoM4GclCQ7OouLKDeMBORWppZoG6DXcZjcAvwh1ah1xpURQqIP2Vp1cQlFxCf7MIuPYotosdPCmF1ROUK5z81gCzdo/4l6kfwB8RZW7ErHXovvHtrzLsnPxT6fkbmCNOacoRpv+dwzNweR26mwBgS8kjZDit+7Ud/hD/7n/vH+OEf+VNsL5/gJFK4Y9rd8fbFS96+vqVfP+Kz7/+Aq23H4e4VIU/0ec2ggevuAj/B1z/5CasfZjp1SJlZr7asV72pHpXOHJVKFX/Rmr3GTJlmSjkwMTHf3zHvD1xeX7G+WNOtOpPT64w9q10gdz0uBLw3CXwnpr+hTnEh0A8Dc53R+LbjgwgCqoXD/o55tFZd4z+3i9nq+ZMCTsMKSjFXGtGHtEhpXAGxZdkWhOmWtuGbswwBln+3GFDDwwK+nL3bGgiaY5EuEXh5fTkFoMUanSptVuoMuFhCmxW8C/hQh520QLGyZo4zcba6zlB/RXMdXQWyGs001wm1WOrkXe0Nu5LxJSIpUsYD8f6GtLshHu4gj4gfGa4G+nlAb78gv6596emWVSi4XpFOCL1NBmoWY/kWKM5SdzMCNS3+nJupi9LVz661+C9Q8Rs7GU4snS1SqgWXKROpKOIiIRSk9AhXbLrIqhdUD8AluDUiGww0uaddxpoKkgJEQaLn7kXi5mbHr6jn2feEviTycU2677l5N/Fql/n6WHgTIXUDTz9Z8ekPv8cf/5N/gh/8ymdcrAckjqT0huPuF7z76hWvvtyR5sInf+QHPHr2BPJIOdyRdjuSW5HGqSoFF776+Zd0XrjYPiceZzR1XKwvCe6CnK5IYWLyiThP5FmqIQnmcFwcJUOcj7we9+zvbnj87CkXV1v6dU/pHNp5tPPkYcB3Pb4zZWXnesNnagz2XUfou+9cfx9EEAAlTiOznlJyu8zbrZZzm7daXqivjShj4Bx1TbZpwvpc0nRzgLNFbzfJkkov8/WAUYZBzgDJ1lpv6T2qJzrDWdYBLCIcqloFQ9r7MXHBUmt4qWzFUJu4KSfmeSLNkwGc0WYncrSMqI1Iq1UrJDFcQOuIapOW6rXQ5wLjTNztOO7eEY93MO9xeUJKJPjCyil9LLC7Jb57yXTp8aEj3R+QPNMHRz90yEqYqu5BLIW5yq8ZYaUxNaVSsEFUCDWaplrSIc4Ud2sQ995KFcSZAq9YILW5kQQka4lpQNKGMgnpsMf7O5x7R54yjCMuF6QIpAATcPRINIbd7n7ixZd7ymWAvnC9csw7Zf8u8/Jr+OoWfnGAt37AP7vg06eP+KM/+j7f/3TF1eodfp5MG+Lwgps3P+Hrn37Juxth++x7fP7plnWI3L++5c1Xr7h7d0Pve3b7NyCe/e7IF1+84zAKz58P3Ow8u11GS0fwKzq3hm5gCIlpmpl9wZfKS4mJPBvIKgXmw8ThsGc8Hnn60ROePH2CDoESHHkIhFLwKeNyIYeCDxnnO1DTrPAOhr7/ztX3QQQBVWxW/Gw3PqnvsiyoUk5ThlSE34vDOOd52bVLVeZZdAlFqgxVXYxnO/WS4rfJPAoiVaFXzqS06uOWEkGXxiTwTVXek1RXAzcNUVeppmMu0PcmJpmygZ3jaPLnJZ2wkJwzJVoZFEsytmIl/GTJoBHJiVCUoBmXZtw8E+93xNt7xrs75vEOJ5HOK4OH3gtd8KaJO0fmw4HDzR27zYpuGDgeRuJxJDhH13Uk31iOVufnbP52jor4owTvwHU0bkYzNok5VfPMrn5+qj5kNeEshhd47/B0mB3bTFPn8Qhx8hxvA/JxwXUzRV8R45GcIr3e4YmQQZJQotmRH3Mi9omnv7Li6fd7Vo9muh60eOQI7APzIXMzJV7Okc0q83HOOB3R6QVz+RqSUuaRNL2D42s6vWfTDVx0W3T3M+53V7x9MfHz3/uCm7fv2F6uuD28YZqUL1+85eWryM1hz+54y1S2lOIpxSZk0SNoJsWZHK017n0gDD1ZJ9Jcr3/BRpNRDrsDJWVccTz56CklF1KK+FQIPfgEZaUECp6EK56ilqOe9Dq+eXwQQQDVKuvVRnktLf3G4ofKFDSabUnJUuuzmXuttfsDPGAJKCfAsAWH1hq04wTooUvDagH6tD6/lR9iGu/+pPm/BAtOQcB+Z/HDBE/A+cBQ07N5monTZFTfea4LX0lzXLTnYoqUFBf585JTndMvBJ2RnGCeSdMRmY7MxyPx9o682+FSZHBGxPIIQRzB2QBR0YJ3jjgW7t4dceGGYb0izjPzYaTMCU1Kipk5ZVJN250LQIZiJCHnTD5N6+iz0nCOyg6sPhCm7ygVtPJ4EVKKNRjUtisO5wPBq9mmque4d7z5OvPJpxv6q0jRPcpIdhORHZ4joomIMLvADrgPketfH/jVP/WEZ99X+hW4PLO6FvpHgf6jC/h6xZsfH/jyJzNv7m55+ypxfOdI147c780NqGQ6RvphZPVR4HgMZL/j1e/9Fu9uBl58Bb/zu1+ym3esHl3wi6/fcHub+Lt//xW/89Mdjz7aos4Rhg3erUGDtVp1pKSZNO+J84E8H5E8IXkmpbn6ZUo1kbXzlrUwj5lXX7/FS8f1k2tcL8QxkaLiU6JoRDEAXFxnlPJlvubbjw8jCGBjrbbLY7unNkKEHW0mvg35OJEKAmp1vWltvdqOWnbllq62wXMqmMUCWjksrbfhwLqI68Jt7UEtJ1FwhaV/qHXIY0HJ4YEdWMtKch008r6n7wOgxDhZt2McSWk2ADRm5jkxT/ZzSTMpznVuwAxLBEsd+5wI8UCeRqb9jri/tws3J2SaCHlGXHVVEjEegjjmIqR5omhk0B4ZBdkl8AfWa3Pa1SkSx8R4mJhTsjNXF6mvmoltQo0KBuZ8ysIUEOcJVXffubBkYG1+wVXnqJwMJAS3zOGrVOu27JiOHS+/PPLxJ4EhDAR/T8jvYD7gk41tpwhTHjgQeDNF4kXhs994zEd/VOi3B8SZMo8bMuuNw617uNwQL1fswz1/9/f2xL2jl4lVyPTuHV4jHsyUxCe6VWKlcIwTtzvP3ZfCT/5/M19/fST2QvdiZHZvefnyyN/+e2/4vZ/d8Ul5wnDZ8XT1hJLXBijrjOhkgK03Ad0Z8xLMFRA/XUfmcRFsaVt7eMy8efEWUcezj5+CFOuWSaFIopDph1InFo209n4pfH58EEFAVc3pRU5z7w+kxOtu0+p3Vxfg2TJfDC91SfXlwfNDk/u0nbwBdMszVD5Aa/udP8NJqai9n4YXCLki/+W9DOBcnBNs7Dn4Hu8tZZ6mI/M4WRYwTxYQ5pkYM3EyJaIUZ0gRUsKVjMvZpKa1An2HA2W8NwxhGtEcq46hIB0U70kKsZ4b69s7E8kovjYtekIOuBnYTczjRHB1JmE0wVdbnMZpl+ysNZjbJKWJqJjvYivpDPj0IVQAsEPEL9dhgWqJDsH3QKGqxOOd4Pxgg1lauy/a8/rNPT/+8UQ3PObZ9YY+HfBTQqZM3sF033HYr7k7OO72Ry5/uObZpytkGMmdoNLj6IE9Tme6NVzkgc8/3fCnZsc8Kd971vPxRx0XFzNeIy4pEq0jok5t6s87fPaoW/FktWZA2d/vOXrP/MXEV+9e8cWX9/zuz+54uyvsf/6KJF/yZ1Y/ZN13eHGkNJoSMCAl4dBanjlyceCdTZmq4STNECflYiWgKHmaeffqNV3wPPr4CT54jvFgHJbKmtUeQlCjsH9bk78eH0wQKMVIMW3xnKujnnbkuuvQ0nwsbddWAkC12GFp17Xn4PQc58v/m2+GJQVpJKDGIzhlI6f3bWPF1OEifVAGnH+AEDq878lKFU+Jppw0z5XpODNPI3GaSVMkj0d0jkhJ+JIJJSPzRJ6OlHkkH3fkw54wHSAbd9x7Rycmm0bwJC02Tlo1FlU8CW+tyxBshr0LqARyUsbDRJRMHzydD+bQXPkNks0fT0VNV6GaeWrFYJoqlIhfAFWpdlharbicNMC04gUx1/62r5hMpggInsJgX4X3FFHmKfDzL2f6VaJ8OvDYXROmQhlnjjthf9txd9vz+qawF+X7l1vWvVnZq39C1oESZkS/hny0z66JQQufXq/Zf37g6SeBJ1voXQLxiF+havwAo+VmvGQ6zQwl8GTT8/xZoPvpnpd3idfxyEjk1ZuRd4fChONwOKJfvuLxs1f8+q88x0vBpQkvESlaR9VnHMaXMNHQjuKtG+QQXPVrdIh5ZFb/jDJFXr94RRgGrh5fEqQnpplC9XfMkLuM86EK83778UEEATjV/6fFXuqU6YLtA7XtVO+rZ9lAI9Usv9OHVZBCZQZ+87YTfnB6L9/m524ioO0xVQ1GtGYDnHUBWIBJYCF2II48R+YY6/DSRJxnpuPIHEfidCSOEzrNME+4FHEl4VOEOKHHA4wHwjzh04yWSHBGGXXiqsadq+3H6rWAX1SCF5RjaZMa21KjUpwiJVlcTZC8lQ82XlzwYgu9aSKS0mK35hBD+J23UqySgJ0LUKXJs1oG57wgLoAWUolIVryv+IpG80pkoLhVFRC1NqhIR7wfKL8b2d0GrlcrJF6YqvMe7m8dd28jb25Hrp7Bn1xfQh+RVQerT+jcRzZ+zLE6zBa8RkIc2ZL57FHm+irQSwIyhBWq12g3oGlXy5V7mvWaS5HeTTx/fsGz55f8+M0bvn53ZF88xwizc2RfKE64nyd++sXP+f7nv07oHD4kSAfDBhAKCU0JxdSvQ19NULO1ZaUA2W5TMb6FeAsIeU68ffUGccL6ekuuYGMkYsOugnP5zOj2m8cHEQTOQbXWrmvmoCcA/qT8U/R8XLgBeXr660EWUVt6taRoxwMm4VKCtMeWJWK0ff8UKMqSKRRMWajYHWl/NQq0TUZ6+sHciKaYGGvqH2MkTjPTODIej8TpyDzuKfMEc4JpNHJ7ifgU8WkmpBFXZlyOZE1EVygORG3ha1FyTIh6s1ev9TmufY5mfFZ156oJa8LS++zUnJUJGCXXCFGoLdSSlaypYhPV0LNy2KkzA4pZZps2gxrbs1TNx1BzMCeV8yFV3di0BHCKOjPOSNmZ/p6jyqR3xOg4voaX7zy597zbOV69OXK7i4yTpxwLjsgfvVjzX+h6HvdHOl8Y+ku8ewrSk+PPQV8jZUKyotOREDsuKAzi0LJHXUK7FapbnLuCskIJuDzj3GgkqTxDuWe18jx7vsb/uGM3Fg4amBSyyxSfyZKIOvHq3Stu7t4Srh4ZezEdTGqtOLRZV1Kve2eaGeLrxpOA6nPpA6CpmrtW0Z39ga+/fMFH8pzV5UDGtBqEhJYRce7DDwKqlSdfV5NbggJLii2VCJDLCUD0vjH5Kmi3LOLW7oNmXGptQr8Em4dEoRpcck3JnDMwpaaoDoevfICiSlIWl1mKucRKbXtZGPAEvwJcLQNWTCWyLyNzOaJxRMYDfjwQ9nvk/g497JHxgEzmTOuSlQFeMy5NZpJJwruCGwTJHs0wFjNvlWwcCueDkXmKpf9FgVQW2m7J1mVQ582ySyHlCqR6arkVEbGSwDmPOmGaEzmabkDnzVAzlUCRuvs74wfk2h6kBoMZm6UoRl5ESnNebMir8f5DMFAwq9XFuU7HmYhUhxKIGhmnRCwwOuF2vuCrw8zLd7fsxwIEhlDYHhNv7o/8cFZWc8GNt9A5NO+QOJOyEn3m6JVZzCdwjEYlnmJHlwd0CuCPhgf4An2pLb4OSSB9QuOMpJGt79l0FgSj68neoXrAoRR1qM/Esmd3fMX1xsE8EnLE5YzL4OqsiVAQsbLLozYkRFdH05OxLIOv1HIloIR6PaZxz7uvv+QJzxguVowpksmm0o29t+86PowggLkEt4nBIq4i/vX2ZcFqbQsamUeLM/fiZRSY9xZ3BQSdULdDWIg9D4sFVaWRDpu8U6nPbcpvFehr4g61YyBQRU79sgs6H6w2dp6us2CQczGF3TjBNCLjEdntKbe3xFcvSYcDZZ5wqnTO0YvDqy2QlGeKJrKYsw4UiijWDDLQTlGKcErHtcmpNVpqbZWWXFejUYydr0h9MPGVmkPaqSr2vZgRptZWZ5VqzwY+ZXUUtcDtnUddqS0wQQKEKlSCGhCZSibnuAhtemeZWtGCJk9u/9aC81JxBFeDvNnGzTEy5gkQHm8vQT2vb4/cj5k5R+7vI1/94o75V9dc9wmnLyHcktMOpnt0LqToUfUUPMcYuNkVQgg8O16wOmZcFxF3C+xwqafkQtSA+ozvC24V0EMxb4Lc0VfRVK2ospe6u4s33X8plDyR80ygSt7lsuA1OMWJ4qWqTUkrdS39V2wTa1CYFFNuktodk5JJxyO7mxt894TQCTFFzHHVugzfdXwQQcBq04zzflmrResO32rsUkdOtSyqwlp126W2CNXy0AegXJskFHGok6VmhlNJ0IaPGlHIMn5FcqnZSR12AQgGfDktFgiCg76BXraGQmeKyN57nEDKs0X/4xE/zuTjyO7Va26/+or927fEww7NkSC2MMQ5stb2ItWqrF4Ic/VbaPMCRbs6aq1WtqotIqTO5otlLdm0vfDCothc4QGTUUvQBUcQs1AvOTPlSEy5zlXahaQVsXddh/cWiEubfbDmJdlO7hJgRF0VFVbb9bJd5FYWWNrSsjWKLCQkJ0Z0yWq8kDRGxuPEFE0PwlFYiePZpmfdb7g5Kvf7W+7HG/7O35/4jV97zOW6Y533eHeL14TGiXJUGDvS6NkfHDe7gS9eKuWu5/mvPmZ7daBPb+hkhrRCSo/LhaEGZc0Jn4G5EI+JNCZTDEZBk/E3fOWEOE9Rz3a1xqPM0xHwkK3jIzkjasrUYgYCNJNcA6Pt2nYiRv0T29CkKK4UpCgd5smgeWZ/f48fAldPrxadSdfcbr7j+DCCANW/rdo1lbYlLwCeNvoA3tfaXuzCsxNV03A5LWyRRmOVhaar2WScG1GodSXOg4GIyWIJauSXUuXIbMs3vSG1gWO8R70jO1k6FpZFFCgzIRh9tsQRd9whb9+xf/2S/Zu33L94yfj2Hfl4RNJso73BQQlk50hQh5AKSCF4e19FHUVCi5TkrBbxVQm1dVpyrqmkbQJSkmnNoYs0u2Erxj5MJZOdIJ1lMFTU2i42IbiAijNPvmznK0mHut4ozxmSyzQUBWxHzJUKXATUW/AJznQcpUq35zSRY1lAYZPHroOVmH4BpVKlY0HnjKaEJxNcLT1KZOuvGB494tmzx6R8z5e3t/xHvzXSrzZ89iSy8RDwuAR5cqRR2B09bw8dv/NC+P/+XmF2By5/cOTy2cCTDfgyIlkhdRa48hH0iKSEmzx5TIxT4H7M7KdsGIxkvNSSyQWKdHTdhmdPnuCcY55Ha1bnYjqMasGs5abWXaEGc106X7bP2YlxCM4prljXRlXpxKO+R3PkuD+wulgjwaElVf7LBx8EDCO1BecQ1+pFXW6DOr1Gm+Vv/cH6BO2fZ/z0ttjbAFLWRCnuDIhsGYDVEo1m7KqIY5GMSlnajop5D2rjC1TS0SJvrkaf9SUREPoipN2O/bt37N++Zf/1Sw5v35D2B3S3w08TLpmbTC7JJsooEDrTLax9eFVTnPXOUkJDjKjovNXYiwhKMYEOJ2oXVyk4takdEaqph40mU9LyOy+muZdLMqcf2ty6I2MzACmVitirmYEGc9/BuWpzJajzpgikRr2m8iu8E4a+r7qDVSsgx8U0hkbdLqbsvACtIgtjrnPBdBA9xndQU252BchHNAfWlxdcPfuY1eoJX755xd/82/ccPhc+2njWzhEUSnbsR/jqneP3vhZ+62cTf+frxERh+3ff8PwHl3TfUy4pDGXEJ9DoKHokaaaMMO6E3THwdu/4xZvMm30hu1AFW13N6ABZc7F9xOXFNSjEeSaXuvCcI4h9VptDqbzW2h2jBUsaW7Vi0jU7QGzgKmuuWW4giDFT53Gi3w4nMtuD8vfh8cEEgWUOvtZSWqXC7Hd1EMd7E/EqJ/UcUdP6E7FWFMKymFu3oRlqqrYx4/qaZ7oD1tuuc9jO1zFdwFn6q1Lr2QLiTb3FoYQiS7T2CCuBUBSXE/H2La9efM2br14w73aU4xGmGa9K76zfG+uuqWIpfCbThDbbAJJ3Yel85AoKlZLJxYxM+84ssan21l0IdVbCpgmxeb+FPSFq71m0EZ/qAquLsSkkqdhkX4qJaU5MMZmaEEKyMUayJtvZpKoYdz0i3sK22H0RxXmM+SbmOp2Tg+IgZ2IUYpooKVahk5OgjIgz1qE4eh9Y9SskJaYcKzpi4GIoBfJEuc28vb9j+2iNe3rFz194xt3EkwEGMkOw0vLNLvLT14W//4vI73w58fYYSMUx/dZr+qsd3T9+ya89uSLlPX2Zceo4JpjiQNp7dneen98W/vbXhf/kiyMvDpD9gHQr8B7XBfqhZ+gveHTxiPWwJSczZ5VSGHyH62pL11kJZ3bkuSZ52YhEZhhBA7u1BvlSg6Ri5V7LgpvyVZoSYTCX71If913HBxEE1DpUFu2KpYTNVdWOOm6a2wCQnnUQTEOgBcfzVL+lM7FJTAAAGURJREFU+8bBrsordee31Mue3TmpNbKaD0A1cyzYrl9ErX0ltgCdOLwYMhuK0GEDUDkZCeh+d8/h7pbD/R3jfk8eJ8gRUsS5qmlApnSABJPrLiBSjBGYUwWCnJUcNTORinsYr5z6OQ2Ea4KnDiE4YdFOIC/BL1fR1RA6HAZkWkxV1DmErnoz1hKqVJZaqWUIVtsXLaRsqWzTTA+VB2GUYGuJiu9qsM6GeleylSnpFjRRswqpbTILpN65pbRpbWGqFJxU/ckiHVk8qThSmRGFXrLhDwWON7fs7xJf98KrR1seX6y4XAkl3nA8HHmzn/jqXvnqTnnLwKHryLnwxbvE/+NvHAlzz3/mjw18/9may7XDa+BwCOyOMN3Dixcjv/Xlgb/504mf3cBROug2+NUF3apnvVmx2WzYDBesfSBlyzylFIIa1mOMwNMebbLzVoqKPrSfb61aitGLLQto6ZJHq9+EidpAjgmdM9L72n37wIMAIkgws4uu6+hCZ7rrztkFV5WFcpUDb4i/c2KdgZJxWghdWIgx50M9i/6A5gepkTYEtnUFF2RaFuJhCxY2/aamr4d5CISsNrI7zUyHo1lK37zjuN9RpsmszevAT0vbUxUbKaKor1+8t1rGNAMt5V4k16vKDoW6I0p9LrWdXspiO+0xerKv4JG1WLzpK+QWFC3aLuBo/Xw5wxRz3ZmElPNSAqRiuYRIqDZZhayW8YhYEF0A11apiat7tAGaviK+qlYadM7EM7M4SixETEq+aT2IeEKQ+j49JVoASznV+tZ4BFl6pDNFoUBBcqxgozJl2E2B3S7zdTiy7sF5xfk1s+uYQkE2pnrsJkeZZ3IUXrxR/v2/ceTLL0b+9G+s+fx7a4Z+zbsbx91d5O7tyM++2PO7b2Z+sQuMMuBXK/rVNd3mkmGzYbu9YL3esvYdOk1M45Heay0DsG5PViMP+yYt3qTrqcpJFfTWJmhX8YGsIKV2hersy3LesY4DUFLBd8FUtL87BnwYQcA7x6MnTxlWA33fVfORE9jWKLbjeGR/PDDHkTwnA7rUatrONwS6nPELmr1YzQyA1g6sdKMFe7CZ97IIiBpHYFHAwBehE4fLaqhuSpTRHHvH2zv2uwPj8WASUbWulaoRqCVWWfOmbFT9C4rN6DdhUtvps9WJVGCQvHDHvdi5Mi3FKprqrG5HbRBFfJ1adIZh4Kx08ZKhTvEpjhQzU4wUZbFam3Mytlqhjjdn6w4U8KGvOIWBTE58fU8Vg0CXEWHbiYzYUqjZmDdil1bswi5uqZZqSi/O1IBr5uCa76SA8x3qCt044aO5PnUFUlGSYDZpZEgJyXNljzbSk4MCMSppysa9DxntErMqXgMX3UDnPDkM+OwYCExl5CcvdhzmyE9fTFxceO4Oyu7uyO3Nkdd3hXdxYO43hNWaID191zP0nmG1oltdEvoLux4raJqLBUC7Pk8isFJctSFzFNd4HwkVw6xECjilCeSQ7XF1b6gcllZSWnfn/9/eucRIlh1l+Is452ZmTc+0H9jYg7HARt54BSMLeWF5CdibgZ1XeIHEBiRYsDDyxluQYIGEkEBYMgjhDSC8QeIhJFYYDPITyw/AEn6Awcjd011Vee89J1j8cbKK0XSDx9OdJXWGVKqsrKzKyHPviRPxxx8RrANjMxmUB2cIb4YRqNPE69/wRuWNSzmEBYPFt8l6+7rdQq2U/aRJwcusevXeWFejuIZKaKxYybw2Bw4CB3hlhBVJQ842ZfIIikCyyDRh/g+nQ2v0y5n54oL53n3mcxXxLOcXIjFFHDr+jjiu9ZUlx0j7wdXjqhw5BES6I7JPaNza4C2UYpQ09WrkudKXPbRGLYab0GXI7kpdjaeLTdlcRVWEXh2iZgs2zbnTIMxgMSDHZ8/JYW+9aZO1lv3ukzeRdemOUWt6Y3I1lMnIJiegwSDFMrbPG7IU16DWrOCQEXCKl2skME1IUjm5MJO6UdPNuS/E5YKvTSdihSV5IO6OlZ6h1IYSsGWWHUcGaj3gRIvSeb0wRcOiEFFxk0EJM+4tOy6+NfP1ewt1+rZqPObGvAQXrXDJxEIhurO1xqbvmVrFlpm+n1mYVQpsGpxrXQNhCI1bV0iX8zbIa5Ab+spYiE1p6UmNhjpX2Pj4Gxl+D5Vf9x4yBHn4vWITiB6VeClsn3o6U295s/uoJVAsXMzZeOWWF+pmR53OmfeXzJeXtGwrvl9meu9s6sTZ2Y460mTXDMDwEgad9qpLQNfCrvpeMSYD76pwXC8vOL97h/2duyzn56yXl+LSZ8rsgPAOQNOFKcxJthGiaNSSk2kpmjVn6s+n+18gYDHd0JupMk1O7wvrvNCaxllbrGwmZ6pF+fb8TIcwR+2ODhves7iIMdEmoFglqKyr2IM9grl3YhHYODgPXQ0BVbgSA0txasbtxUPUXoK+zjJeZcqwZDSzKOnFQMncv5FdkhL7qF6IIm7BNKnmfm3ydqrngNrdRj9bMLdZbEozNGAcDeiYVJ/XolCjU63jIaPUYsJ70HEalRrGQrD2xtobS9uLj9AWZiv0rtRou7fQ2QODCWmsGM1WgpmpOJtibGylzAUrW7ALenNarUxFHpyFXXmu5kwGE0nU1I2aX4mJZZKkFMX/Tr8CsgYOlh7zgeQVMriRI9UHlbt9ly3HH7kMV0nptnzucGjHIcYspTLVLX0AVi2okw6inifVMl9wfn7Bfr/n1tkZ2810aEQy/t9AYrT1u2J9hJj7uuK9M2FsI2Ceaffvs79zh3vf+hbz/fsC+DKjcAgp8mdhEhnr9xCvH6VxRimUuzPO04H4glpAeRh9XSkug9Fby1kKQpVrESV50IALQMaGLSL7/GXDVeLajZWA6ZibQMgQufLIrY/mLdcKsEL9Dwd+kJaFfEsKMjCkK6pKylWlF4P4U5QCLD6GwvXD5OSR7h2t5qu7ZulVZ501tcgyG2TR2U4Fjx01gvMG1PXgfawDR5iqWIxJUS7uWJev5K6QZe3iY4ATLiB6MrJmXwzIVTVSuj5WCDaJJ8npaRl/48HkjcmdGsJwfJ1F9Q6jNqdWp5bhURoTKveehhsfYqSqjF5JwUY2VSEzVaH1tXwM/QC0HvgkjFBT4GFn1Nlw8zEBXefB/5e2dnWwXf2MbqiBFRCRrrw671jRMMZ1Xbn7wl3uv3CXV99+hlfdvp2uEocW4REd1p6nsib8lggKnY0FZxhbgjC10Qoa+2j0rqYb5orflN/NeG4MBm2aNxgYpVSsJsMhT67i5YB8uxmlTriZTsMDL6Czj56lujma2kumjDzdSoTq5+nQ1/UwtXbw98WbIMuC49A8Ze0CixqJMhdkBJNUFHFVdzFatukmbeOwOnReHqxUYQIlL1Y2CIhrKcm8vpGnlghJGrBZqGpMQsCyKFXmWisBj5nKLU6vlXk3UYvR2sp2UZameKWWie6F0hvLasTq9FBZtfnoV1FExjoMck2AzYdbvWET0GtclZNHpZMZjuSdYFU4S1GKVGx+8LYyLZd4NEo3ai9sNhuSECij46ZwLnQ9FH6qTZ4sj9rllQxFfXBBstZC5lOGg/E3PhIIql6MKnLbfr9wuX4XcwcelxxaT0N+ks4ox0kIT4C5ezLbdgI7TEDSmrPZPJtjrvsL7r1wl8v7L2DReObpp1WZFUA0vK8QAuFKdujdmLErlV11tmbUFvRa2J1t2a23iItL+v6Sfe+Z0ss4HMt+byvLOlh14D5lEY7YeNFUgFNLAo9WdMO6zgFtfg0EgcjaBEsGXaEWl5FAHWNkF4tc2N5Zw4kyEeYHQG4g5RG6CawUbaQY3ZW0uXw0DTWRnjotExSyxsXJNGrGo/T03pKp2FE/u8kFdGYq1JoM7jowFsRoPHA9mo7bUa+xrp15EYhaqnbHyKXTVyIWYMWsYTQxIaMz4WJVVsdqYQpndme1rpmN6youxQGTuUr/yED5IR0pHEjxS/j13pEjnlcu39IIdFyFQgl9eqz4ch9rVQY+qvolTpXqualDMypG70uPdmh2o3oA/TdzhKEktjI85LDDeSmPNFPA4TnMdZoomy0d486de9yfLx+4926EEYgE1EgnURemZz18ovqZyzfTBfTqTLbh2h9wTtKDgWmqbGrlhTvf5utfXfi+Z9/I9varBgOeTd6QtTem3qjR2bnxVKlsErzCjHBnM22YnjKWZxYuL/e0ZsyXs8ZnV8C7Bm9kHru6+vCZi8xvgYaq9E7PgapuzlQ0TGO+vMhTT0yzlq6+AfQuhH5d6ZE1CddaeDfTad5CNFUvygtH6yx9yXx+P3gexUvOA9Bm1z5I2rZpnYsnezDvspqArZmxrjp99S+Tzk1eF4/DaacTKwe1mBpkjH7jfZQiJxcgLeYhdGlWshV59soLceOtK9wwW6nRqGtjXtU0pSNE3dyp3fT6poNhtGTzLuNlXUU3Ra7nQFLkJeWJq+Alsys+shqeQF1WtXYNZHXKgcWn23FV41xvh3uotxWrycxE93e0GKUp2uxZs6KDYuzyfgCS4Wq5RG4rEKbW86EQRd2tDc3pnFh65/zigvP9/oH778YYgXVZGIvoNg75tNxmuulIdzN721V3mDbEmYFp8or1PJX2C5tpy26z4+6371ADXu0TZ2cbCp3JhusP28mpvbM14QC+zAmCGbgzTRsmKyzLLe7dO+fyfGXOyWrrurLmVKPqhc2k0tqWyHqPkDHI/H5b1ZVnU6vovF0jpso0CUEelOXoajGV+fb9MrMsCoe8qEhHzD1hIWbiVSxdoYTGtTVaDKMk79wTTmqrxpFh6R3YKF2Vu4oXSoybbsRQPScJO27XT0jE79juFKqQnl3kqWbSoROs6yLjw6jLSGCzF1GOXaW38mQarc3EEjA51VIHguJBcV3HIGnMjWutuVSLYr3Ji8lY26IQnt4HIe9p9I6wESoqLVeSCDXA3ggZBHfp3+nprQlXspwH2HtD+HJThiTkWW7znrNEXd2yLMtdHkKmojx1IfEiyyK5sJHa1vWW0RKw2XunIa5IOFjNe5CgbnZMN712IHrn8uJSbqkLSa0mDpzBgZXWo2culEOMKYaasd2Jv27pZvX9Qi8zT+1uMd87Z72csf0lu11lW2Gb77FxmKzD3LBloV/OuvNrwWrRUI1VF6P3VU1Cpsq+Vg7kDTfMy2ETjzy9GmlqolAx1FCzdlrOFFAs19nuNnoNliGFZgw4Ktu1UvG6UUuunuO+CMKMJVTlN00TxQbDL9mBZrhNyR3oIi2hXHLLdmCl5Jlnrsc2SqdlMloCk631QxqquF+Vu5oKtTRCbvxfXZtq2TPQVPegnj0Z14bKlHWyCqzsqBHK2uaD99LXTrOuEdy5UYoXtptJPRMAt6aaegxDdQmGs8lJPUtrrDmkRcxyfc6li3I+oKfREyIyVBmfr5MzEnyU+dohGyPkJVT5mMCz6l8UErl3qjc2VqkDUcy/da/USaP3ag7hlQNq47gnMPqaE6VGfJyl6S3aVeu43CctQjUfm4lmMK+aQfCQsQM3wwj0CC73F7pZEiUOLzQfHsG1ph3WVDILB0vphNy2Uoi6gTrRs69aLYV6+1U8vZ14zbZyuxqb4lRUu73BKV3MuLicCTE6cNekn/28MM8Ns8KyLECw2Uw8dbaj9YZ3EYl6goOHDsil6gQu2agyqb6lOhaFdT/rNCjqP2id5OjvmdcZ84IXTfkJM3zaQu+5yVU30AnWTD26KT+uYibLLrMjaMzTLGMIsyzIGg1XElEqpqEg4+QfeWgGSs9wUbNMuajWok4qpe6t0Ra1EC/TGJSpcKStmi1pCYS13lkyxVqr457IdpbYljSglKLy5uyYqyGcyhTBqPdYWMRxFq9ABR54qckXSU5+bzjGpibI2IwyRqmNjVn0nr21Q/l1hZy4JMMQCUhrsKsK3gb/MtJ9L+m0Fg8m61TTe49AXoaRQ+rUB2Kd4WOMUGUQy0I044QERNpqaruv2M5wE05kpeBV2NDaB3X+hvcTiOi0ZS+OfK8acOFj4qw2TskuNz4wAb+GuBMQK8HCrjSeqsGtnTOvlbI749b33ubWVHmmL2z6QsUFTCUQtnSN6r4qHlLjCuWQZVnHqbPbbdhttrSnO+cX59y9f5fzuWfBElft0TI321YOp2jJqKCUHCG19kx3Kq5dl/QCyAxCqTqFotNIAMo6zYxm6r03vJF1XTJGJfv9aWO3EZKAYkhTGqq42Hhl1Ak0jSenO+pbrxO9ZRw/4veeRqGhtF4plVqy9Vvm1Iohtxf1JegD7AulUdckIoHjRS3GydN5O4HbNk9VMekGIGjWmWpVwRSV4o2pOPulsJ9XzJaDUcTkuuOdqcrFn0NGx83xmizTnAUYkXTdzEKsQRZfhdiRxZN30a5o6VgWkylV3BLa8Jyr4EXpYY9Vh0VcXRvRhIULNCIPOQXEyuBonXtvGfNnWXFmfJRWVei7piHoveNTxadJw2Bd2JHSxTc8HJDbtx6m2HZPpNbES58ombPWwlMc653JnZ0F3mdYL+nrBW09p7dzul9iZ8GuTpyVgq8Ltuxh0ZVSU47sy9qhFrXTioB1WZhbI4pTpw1l2soyl8rZquHZbW5A4/zCM4bWhS3pPvYI9vv9wZWepilZcLqQJXL2XtckZXEdQlbc5AktGY93pUXopvbRFEu6cBB9DKrgCumvSX0eN1NrGZZoYtPAXWpy1mOZAa546pF1BjE2wSibjgQTNfu2egKGADk7spo2QQ9t+t4UoqzLQqAWYnMaOm2uCl4PgNw2w5O2rKlnodEoZWIqObbdgaYCmwMJqcCmqke/15opW8XMngYnUKgpR0ebWw1RmjAlz0xPBJNVetHG0eAUdbFal5W1eaa07TBrUROss+FMKTlIJUMF64lhjCzLwB7EDxjI/gghCVRCzgF50F5QOiq388DPgiBZqpHDeTJD4tNEPxdhbIy6eym5GUaAgTvpg3h0AUQOMVIp0dV1FY0uJ/OnE+rB1+b79IsX4OKcsr/kLFY2U3C2gRorfd4T0ZgX3YArnSVG7FfxWoiSXLbMtZep4tNGc91MDvHKKmpmUa/4zWZijSyyGRwH5Kq1Jfv2my7ONFWgs8aSQ0QVqy7DCGSevIcnm27VjZWhUKez5Mj2tDtCqmOcfOneJ3ko75nDDMDOGHqpE96L47nhry6EOAJiaQ6keRT26MMJyCrpTdg197jJQJPTpK6FFIf27F0krzDLtggZ9wYZolky6Dqjiqu3nuCmombhakp9GvIW3TTa3rziVddLIUfLFGkTQDnV3PjZd9Ezu+GjWWvWpPlVc0534SUReYZgdBce0MnwxrLqtGfJVIgKXd3VsclV3VnKqK/Q9bDEVzrtwKeISL7ASJ6Ma5MZiOs9MgeQOehGY9BMrUoRjhDR/Wpg7ovF/tcNcCQxs/8E7gP/dWxdrsnrOOnzMLlp+sDN0+mm6fMDEfH6Fz95I4wAgJl9IiLecWw9hpz0ebjcNH3g5ul00/R5kDykwPAkJznJkyAnI3CSkzzhcpOMwG8fW4EXyUmfh8tN0wdunk43TZ+XlBuDCZzkJCc5jtwkT+AkJznJEeToRsDMfsLMvmBmXzazDxxJh6+Y2WfM7JNm9ol87rVm9hdm9qX8/ppHrMOHzeybZvbZa8+9pA4m+Y1cs0+b2XOPSZ8PmdnXcp0+aWbvvfa7X059vmBmP/4I9Hmzmf21mf2TmX3OzH4hnz/KGj1En6Ot0cuW62O+H/cXaozzz8BbgQ3wKeDtR9DjK8DrXvTcrwIfyMcfAH7lEevwbuA54LP/lw7Ae4E/Q/SRdwIff0z6fAj4pZd47dvz2m2Bt+Q1La+wPs8Cz+XjZ4Av5vseZY0eos/R1ujlfh3bE/hR4MsR8S8RMQMfBZ4/sk5Dngc+ko8/Avzko3yziPgb4L//nzo8D/xeSP4WeLWZPfsY9HmQPA98NCL2EfGvwJfRtX0l9flGRPxjPn4B+DzwJo60Rg/R50HyyNfo5cqxjcCbgH+79vNXefhCPioJ4M/N7B/M7GfzuTdExDfy8b8DbziCXg/S4Zjr9vPpXn/4Woj0WPUxsx8EfgT4ODdgjV6kD9yANfpO5NhG4KbIuyLiOeA9wM+Z2buv/zLkzx01jXITdAB+C/gh4IeBbwC/9rgVMLOngT8CfjEi7l7/3THW6CX0OfoafadybCPwNeDN137+/nzusUpEfC2/fxP4E+Sm/cdwH/P7Nx+3Xg/R4SjrFhH/EREtVP72O1y5s49FHzOb0Ib7g4j443z6aGv0Uvoce41ejhzbCPw98DYze4uZbYD3AR97nAqY2S0ze2Y8Bn4M+Gzq8f582fuBP32ceqU8SIePAT+dCPg7gTvXXOJHJi+KqX8KrdPQ531mtjWztwBvA/7uFX5vA34X+HxE/Pq1Xx1ljR6kzzHX6GXLsZFJhOJ+EaGlHzzC+78VobafAj43dAC+B/gr4EvAXwKvfcR6/CFyHxcUL/7Mg3RAiPdv5pp9BnjHY9Ln9/P9Po1u6mevvf6Dqc8XgPc8An3ehVz9TwOfzK/3HmuNHqLP0dbo5X6dGIMnOckTLscOB05ykpMcWU5G4CQnecLlZAROcpInXE5G4CQnecLlZAROcpInXE5G4CQnecLlZAROcpInXE5G4CQnecLlfwBmziQJPMEe0AAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Visualize results with Torch-TensorRT\n", + "plot_results(best_results_per_input_trt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We get similar results as before!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 6. Measuring Speedup\n", + "We can run the benchmark function again to see the speedup gained! Compare this result with the same batch-size of input in the case without Torch-TensorRT above." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - For input x, found user specified input dtype as Float16, however when inspecting the graph, the input type expected was inferred to be Float\n", + "The compiler is going to use the user setting Float16\n", + "This conflict may cause an error at runtime due to partial compilation being enabled and therefore\n", + "compatibility with PyTorch's data type convention is required.\n", + "If you do indeed see errors at runtime either:\n", + "- Remove the dtype spec for x\n", + "- Disable partial compilation by setting require_full_compilation to True\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n", + "WARNING: [Torch-TensorRT] - There may be undefined behavior using dynamic shape and aten::size\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 10/100, avg batch time 45.88 ms\n", + "Iteration 20/100, avg batch time 46.20 ms\n", + "Iteration 30/100, avg batch time 46.10 ms\n", + "Iteration 40/100, avg batch time 46.19 ms\n", + "Iteration 50/100, avg batch time 46.15 ms\n", + "Iteration 60/100, avg batch time 46.17 ms\n", + "Iteration 70/100, avg batch time 46.19 ms\n", + "Iteration 80/100, avg batch time 46.20 ms\n", + "Iteration 90/100, avg batch time 46.22 ms\n", + "Iteration 100/100, avg batch time 46.21 ms\n", + "Input shape: torch.Size([128, 3, 300, 300])\n", + "Output location prediction size: torch.Size([128, 4, 8732])\n", + "Output label prediction size: torch.Size([128, 81, 8732])\n", + "Average batch time: 46.21 ms\n" + ] + } + ], + "source": [ + "batch_size = 128\n", + "\n", + "# Recompiling with batch_size we use for evaluating performance\n", + "trt_model = torch_tensorrt.compile(traced_model,\n", + " inputs = [torch_tensorrt.Input((batch_size, 3, 300, 300), dtype=torch.half)],\n", + " enabled_precisions= {torch.half}, # Run with FP16\n", + " workspace_size= 1 << 20\n", + ")\n", + "\n", + "benchmark(trt_model, input_shape=(batch_size, 3, 300, 300), dtype='fp16', nruns=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 7. Conclusion\n", + "\n", + "In this notebook, we have walked through the complete process of compiling a TorchScript SSD300 model with Torch-TensorRT, and tested the performance impact of the optimization. We find that using the Torch-TensorRT compiled model, we gain significant speedup in inference without any noticeable drop in performance!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Details\n", + "For detailed information on model input and output,\n", + "training recipies, inference and performance visit:\n", + "[github](https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/Detection/SSD)\n", + "and/or [NGC](https://ngc.nvidia.com/catalog/model-scripts/nvidia:ssd_for_pytorch)\n", + "\n", + "### References\n", + "\n", + " - [SSD: Single Shot MultiBox Detector](https://arxiv.org/abs/1512.02325) paper\n", + " - [Speed/accuracy trade-offs for modern convolutional object detectors](https://arxiv.org/abs/1611.10012) paper\n", + " - [SSD on NGC](https://ngc.nvidia.com/catalog/model-scripts/nvidia:ssd_for_pytorch)\n", + " - [SSD on github](https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/Detection/SSD)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/v1.2.0/_sources/_notebooks/vgg-qat.ipynb.txt b/docs/v1.2.0/_sources/_notebooks/vgg-qat.ipynb.txt new file mode 100644 index 0000000000..cca771ad92 --- /dev/null +++ b/docs/v1.2.0/_sources/_notebooks/vgg-qat.ipynb.txt @@ -0,0 +1,1200 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8033b2eb", + "metadata": {}, + "source": [ + "# Deploying Quantization Aware Trained models in INT8 using Torch-TensorRT" + ] + }, + { + "cell_type": "markdown", + "id": "69ec3ca7", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "Quantization Aware training (QAT) simulates quantization during training by quantizing weights and activation layers. This will help to reduce the loss in accuracy when we convert the network trained in FP32 to INT8 for faster inference. QAT introduces additional nodes in the graph which will be used to learn the dynamic ranges of weights and activation layers. In this notebook, we illustrate the following steps from training to inference of a QAT model in Torch-TensorRT.\n", + "\n", + "1. [Requirements](#1)\n", + "2. [VGG16 Overview](#2)\n", + "3. [Training a baseline VGG16 model](#3)\n", + "4. [Apply Quantization](#4)\n", + "5. [Model calibration](#5)\n", + "6. [Quantization Aware training](#6)\n", + "7. [Export to Torchscript](#7)\n", + "8. [Inference using Torch-TensorRT](#8)\n", + "8. [References](#8)" + ] + }, + { + "cell_type": "markdown", + "id": "79655ea8", + "metadata": {}, + "source": [ + "\n", + "## 1. Requirements\n", + "Please install the required dependencies and import these libraries accordingly" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14a72941", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install ipywidgets --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "6493e915", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.1.0\n" + ] + } + ], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "import torch.optim as optim\n", + "import torch.utils.data as data\n", + "import torchvision.transforms as transforms\n", + "import torchvision.datasets as datasets\n", + "import torch_tensorrt\n", + "\n", + "from torch.utils.tensorboard import SummaryWriter\n", + "\n", + "import pytorch_quantization\n", + "from pytorch_quantization import nn as quant_nn\n", + "from pytorch_quantization import quant_modules\n", + "from pytorch_quantization.tensor_quant import QuantDescriptor\n", + "from pytorch_quantization import calib\n", + "from tqdm import tqdm\n", + "\n", + "print(pytorch_quantization.__version__)\n", + "\n", + "import os\n", + "import sys\n", + "sys.path.insert(0, \"../examples/int8/training/vgg16\")\n", + "from vgg16 import vgg16\n" + ] + }, + { + "cell_type": "markdown", + "id": "4de5060a", + "metadata": {}, + "source": [ + "\n", + "## 2. VGG16 Overview\n", + "### Very Deep Convolutional Networks for Large-Scale Image Recognition\n", + "VGG is one of the earliest family of image classification networks that first used small (3x3) convolution filters and achieved significant improvements on ImageNet recognition challenge. The network architecture looks as follows\n", + "\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "7a5afc49", + "metadata": {}, + "source": [ + "\n", + "## 3. Training a baseline VGG16 model\n", + "We train VGG16 on CIFAR10 dataset. Define training and testing datasets and dataloaders. This will download the CIFAR 10 data in your `data` directory. Data preprocessing is performed using `torchvision` transforms. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5d2c4c45", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Files already downloaded and verified\n", + "Files already downloaded and verified\n" + ] + } + ], + "source": [ + "classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')\n", + "\n", + "# ========== Define Training dataset and dataloaders =============#\n", + "training_dataset = datasets.CIFAR10(root='./data',\n", + " train=True,\n", + " download=True,\n", + " transform=transforms.Compose([\n", + " transforms.RandomCrop(32, padding=4),\n", + " transforms.RandomHorizontalFlip(),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),\n", + " ]))\n", + "\n", + "training_dataloader = torch.utils.data.DataLoader(training_dataset,\n", + " batch_size=32,\n", + " shuffle=True,\n", + " num_workers=2)\n", + "\n", + "# ========== Define Testing dataset and dataloaders =============#\n", + "testing_dataset = datasets.CIFAR10(root='./data',\n", + " train=False,\n", + " download=True,\n", + " transform=transforms.Compose([\n", + " transforms.ToTensor(),\n", + " transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),\n", + " ]))\n", + "\n", + "testing_dataloader = torch.utils.data.DataLoader(testing_dataset,\n", + " batch_size=16,\n", + " shuffle=False,\n", + " num_workers=2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2bd092b3", + "metadata": {}, + "outputs": [], + "source": [ + "def train(model, dataloader, crit, opt, epoch):\n", + "# global writer\n", + " model.train()\n", + " running_loss = 0.0\n", + " for batch, (data, labels) in enumerate(dataloader):\n", + " data, labels = data.cuda(), labels.cuda(non_blocking=True)\n", + " opt.zero_grad()\n", + " out = model(data)\n", + " loss = crit(out, labels)\n", + " loss.backward()\n", + " opt.step()\n", + "\n", + " running_loss += loss.item()\n", + " if batch % 500 == 499:\n", + " print(\"Batch: [%5d | %5d] loss: %.3f\" % (batch + 1, len(dataloader), running_loss / 100))\n", + " running_loss = 0.0\n", + " \n", + "def test(model, dataloader, crit, epoch):\n", + " global writer\n", + " global classes\n", + " total = 0\n", + " correct = 0\n", + " loss = 0.0\n", + " class_probs = []\n", + " class_preds = []\n", + " model.eval()\n", + " with torch.no_grad():\n", + " for data, labels in dataloader:\n", + " data, labels = data.cuda(), labels.cuda(non_blocking=True)\n", + " out = model(data)\n", + " loss += crit(out, labels)\n", + " preds = torch.max(out, 1)[1]\n", + " class_probs.append([F.softmax(i, dim=0) for i in out])\n", + " class_preds.append(preds)\n", + " total += labels.size(0)\n", + " correct += (preds == labels).sum().item()\n", + "\n", + " test_probs = torch.cat([torch.stack(batch) for batch in class_probs])\n", + " test_preds = torch.cat(class_preds)\n", + "\n", + " return loss / total, correct / total\n", + "\n", + "def save_checkpoint(state, ckpt_path=\"checkpoint.pth\"):\n", + " torch.save(state, ckpt_path)\n", + " print(\"Checkpoint saved\")" + ] + }, + { + "cell_type": "markdown", + "id": "c80a86cc", + "metadata": {}, + "source": [ + "*Define the VGG model that we are going to perfom QAT on.*" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "8c564b8f", + "metadata": {}, + "outputs": [], + "source": [ + "# CIFAR 10 has 10 classes\n", + "model = vgg16(num_classes=len(classes), init_weights=False)\n", + "model = model.cuda()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "abc00452", + "metadata": {}, + "outputs": [], + "source": [ + "# Declare Learning rate\n", + "lr = 0.1\n", + "state = {}\n", + "state[\"lr\"] = lr\n", + "\n", + "# Use cross entropy loss for classification and SGD optimizer\n", + "crit = nn.CrossEntropyLoss()\n", + "opt = optim.SGD(model.parameters(), lr=state[\"lr\"], momentum=0.9, weight_decay=1e-4)\n", + "\n", + "\n", + "# Adjust learning rate based on epoch number\n", + "def adjust_lr(optimizer, epoch):\n", + " global state\n", + " new_lr = lr * (0.5**(epoch // 12)) if state[\"lr\"] > 1e-7 else state[\"lr\"]\n", + " if new_lr != state[\"lr\"]:\n", + " state[\"lr\"] = new_lr\n", + " print(\"Updating learning rate: {}\".format(state[\"lr\"]))\n", + " for param_group in optimizer.param_groups:\n", + " param_group[\"lr\"] = state[\"lr\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d80865a2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: [ 1 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 13.288\n", + "Batch: [ 1000 | 1563] loss: 11.345\n", + "Batch: [ 1500 | 1563] loss: 11.008\n", + "Test Loss: 0.13388 Test Acc: 13.23%\n", + "Epoch: [ 2 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 10.742\n", + "Batch: [ 1000 | 1563] loss: 10.311\n", + "Batch: [ 1500 | 1563] loss: 10.141\n", + "Test Loss: 0.11888 Test Acc: 23.96%\n", + "Epoch: [ 3 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.877\n", + "Batch: [ 1000 | 1563] loss: 9.821\n", + "Batch: [ 1500 | 1563] loss: 9.818\n", + "Test Loss: 0.11879 Test Acc: 24.68%\n", + "Epoch: [ 4 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.677\n", + "Batch: [ 1000 | 1563] loss: 9.613\n", + "Batch: [ 1500 | 1563] loss: 9.504\n", + "Test Loss: 0.11499 Test Acc: 23.68%\n", + "Epoch: [ 5 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.560\n", + "Batch: [ 1000 | 1563] loss: 9.536\n", + "Batch: [ 1500 | 1563] loss: 9.309\n", + "Test Loss: 0.10990 Test Acc: 27.84%\n", + "Epoch: [ 6 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.254\n", + "Batch: [ 1000 | 1563] loss: 9.234\n", + "Batch: [ 1500 | 1563] loss: 9.188\n", + "Test Loss: 0.11594 Test Acc: 23.29%\n", + "Epoch: [ 7 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.141\n", + "Batch: [ 1000 | 1563] loss: 9.110\n", + "Batch: [ 1500 | 1563] loss: 9.013\n", + "Test Loss: 0.10732 Test Acc: 29.24%\n", + "Epoch: [ 8 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 9.120\n", + "Batch: [ 1000 | 1563] loss: 9.086\n", + "Batch: [ 1500 | 1563] loss: 8.948\n", + "Test Loss: 0.10732 Test Acc: 27.24%\n", + "Epoch: [ 9 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 8.941\n", + "Batch: [ 1000 | 1563] loss: 8.997\n", + "Batch: [ 1500 | 1563] loss: 9.028\n", + "Test Loss: 0.11299 Test Acc: 25.52%\n", + "Epoch: [ 10 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 8.927\n", + "Batch: [ 1000 | 1563] loss: 8.837\n", + "Batch: [ 1500 | 1563] loss: 8.860\n", + "Test Loss: 0.10130 Test Acc: 34.61%\n", + "Epoch: [ 11 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 8.953\n", + "Batch: [ 1000 | 1563] loss: 8.738\n", + "Batch: [ 1500 | 1563] loss: 8.724\n", + "Test Loss: 0.10018 Test Acc: 32.27%\n", + "Epoch: [ 12 / 25] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 8.721\n", + "Batch: [ 1000 | 1563] loss: 8.716\n", + "Batch: [ 1500 | 1563] loss: 8.701\n", + "Test Loss: 0.10070 Test Acc: 29.57%\n", + "Updating learning rate: 0.05\n", + "Epoch: [ 13 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 7.944\n", + "Batch: [ 1000 | 1563] loss: 7.649\n", + "Batch: [ 1500 | 1563] loss: 7.511\n", + "Test Loss: 0.08555 Test Acc: 44.62%\n", + "Epoch: [ 14 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 7.057\n", + "Batch: [ 1000 | 1563] loss: 6.944\n", + "Batch: [ 1500 | 1563] loss: 6.687\n", + "Test Loss: 0.08331 Test Acc: 52.27%\n", + "Epoch: [ 15 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 6.470\n", + "Batch: [ 1000 | 1563] loss: 6.439\n", + "Batch: [ 1500 | 1563] loss: 6.126\n", + "Test Loss: 0.07266 Test Acc: 58.02%\n", + "Epoch: [ 16 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 5.834\n", + "Batch: [ 1000 | 1563] loss: 5.801\n", + "Batch: [ 1500 | 1563] loss: 5.622\n", + "Test Loss: 0.06340 Test Acc: 65.17%\n", + "Epoch: [ 17 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 5.459\n", + "Batch: [ 1000 | 1563] loss: 5.442\n", + "Batch: [ 1500 | 1563] loss: 5.314\n", + "Test Loss: 0.05945 Test Acc: 67.22%\n", + "Epoch: [ 18 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 5.071\n", + "Batch: [ 1000 | 1563] loss: 5.145\n", + "Batch: [ 1500 | 1563] loss: 5.063\n", + "Test Loss: 0.06567 Test Acc: 64.46%\n", + "Epoch: [ 19 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 4.796\n", + "Batch: [ 1000 | 1563] loss: 4.781\n", + "Batch: [ 1500 | 1563] loss: 4.732\n", + "Test Loss: 0.05374 Test Acc: 71.87%\n", + "Epoch: [ 20 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 4.568\n", + "Batch: [ 1000 | 1563] loss: 4.564\n", + "Batch: [ 1500 | 1563] loss: 4.484\n", + "Test Loss: 0.05311 Test Acc: 71.12%\n", + "Epoch: [ 21 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 4.385\n", + "Batch: [ 1000 | 1563] loss: 4.302\n", + "Batch: [ 1500 | 1563] loss: 4.285\n", + "Test Loss: 0.05080 Test Acc: 74.29%\n", + "Epoch: [ 22 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 4.069\n", + "Batch: [ 1000 | 1563] loss: 4.105\n", + "Batch: [ 1500 | 1563] loss: 4.096\n", + "Test Loss: 0.04807 Test Acc: 75.20%\n", + "Epoch: [ 23 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 3.959\n", + "Batch: [ 1000 | 1563] loss: 3.898\n", + "Batch: [ 1500 | 1563] loss: 3.916\n", + "Test Loss: 0.04743 Test Acc: 75.81%\n", + "Epoch: [ 24 / 25] LR: 0.050000\n", + "Batch: [ 500 | 1563] loss: 3.738\n", + "Batch: [ 1000 | 1563] loss: 3.847\n", + "Batch: [ 1500 | 1563] loss: 3.797\n", + "Test Loss: 0.04609 Test Acc: 76.42%\n", + "Updating learning rate: 0.025\n", + "Epoch: [ 25 / 25] LR: 0.025000\n", + "Batch: [ 500 | 1563] loss: 2.952\n", + "Batch: [ 1000 | 1563] loss: 2.906\n", + "Batch: [ 1500 | 1563] loss: 2.735\n", + "Test Loss: 0.03466 Test Acc: 82.00%\n", + "Checkpoint saved\n" + ] + } + ], + "source": [ + "# Train the model for 25 epochs to get ~80% accuracy.\n", + "num_epochs=25\n", + "for epoch in range(num_epochs):\n", + " adjust_lr(opt, epoch)\n", + " print('Epoch: [%5d / %5d] LR: %f' % (epoch + 1, num_epochs, state[\"lr\"]))\n", + "\n", + " train(model, training_dataloader, crit, opt, epoch)\n", + " test_loss, test_acc = test(model, testing_dataloader, crit, epoch)\n", + "\n", + " print(\"Test Loss: {:.5f} Test Acc: {:.2f}%\".format(test_loss, 100 * test_acc))\n", + " \n", + "save_checkpoint({'epoch': epoch + 1,\n", + " 'model_state_dict': model.state_dict(),\n", + " 'acc': test_acc,\n", + " 'opt_state_dict': opt.state_dict(),\n", + " 'state': state},\n", + " ckpt_path=\"vgg16_base_ckpt\")" + ] + }, + { + "cell_type": "markdown", + "id": "e1044537", + "metadata": {}, + "source": [ + "\n", + "## 4. Apply Quantization" + ] + }, + { + "cell_type": "markdown", + "id": "c33b7f4e", + "metadata": {}, + "source": [ + "`quant_modules.initialize()` will ensure quantized version of modules will be called instead of original modules. For example, when you define a model with convolution, linear, pooling layers, `QuantConv2d`, `QuantLinear` and `QuantPooling` will be called. `QuantConv2d` basically wraps quantizer nodes around inputs and weights of regular `Conv2d`. Please refer to all the quantized modules in pytorch-quantization toolkit for more information. A `QuantConv2d` is represented in `pytorch-quantization` toolkit as follows.\n", + "\n", + "```\n", + "def forward(self, input):\n", + " # the actual quantization happens in the next level of the class hierarchy\n", + " quant_input, quant_weight = self._quant(input)\n", + "\n", + " if self.padding_mode == 'circular':\n", + " expanded_padding = ((self.padding[1] + 1) // 2, self.padding[1] // 2,\n", + " (self.padding[0] + 1) // 2, self.padding[0] // 2)\n", + " output = F.conv2d(F.pad(quant_input, expanded_padding, mode='circular'),\n", + " quant_weight, self.bias, self.stride,\n", + " _pair(0), self.dilation, self.groups)\n", + " else:\n", + " output = F.conv2d(quant_input, quant_weight, self.bias, self.stride, self.padding, self.dilation,\n", + " self.groups)\n", + "\n", + " return output\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "985dc59e", + "metadata": {}, + "outputs": [], + "source": [ + "quant_modules.initialize()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "164ce8cb", + "metadata": {}, + "outputs": [], + "source": [ + "# All the regular conv, FC layers will be converted to their quantozed counterparts due to quant_modules.initialize()\n", + "qat_model = vgg16(num_classes=len(classes), init_weights=False)\n", + "qat_model = qat_model.cuda()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8e5f7fb5", + "metadata": {}, + "outputs": [], + "source": [ + "# vgg16_base_ckpt is the checkpoint generated from Step 3 : Training a baseline VGG16 model.\n", + "ckpt = torch.load(\"./vgg16_base_ckpt\")\n", + "modified_state_dict={}\n", + "for key, val in ckpt[\"model_state_dict\"].items():\n", + " # Remove 'module.' from the key names\n", + " if key.startswith('module'):\n", + " modified_state_dict[key[7:]] = val\n", + " else:\n", + " modified_state_dict[key] = val\n", + "\n", + "# Load the pre-trained checkpoint\n", + "qat_model.load_state_dict(modified_state_dict)\n", + "opt.load_state_dict(ckpt[\"opt_state_dict\"])" + ] + }, + { + "cell_type": "markdown", + "id": "8f8a74e8", + "metadata": {}, + "source": [ + "\n", + "## 5. Model Calibration" + ] + }, + { + "cell_type": "markdown", + "id": "d2a321f9", + "metadata": {}, + "source": [ + "The quantizer nodes introduced in the model around desired layers capture the dynamic range (min_value, max_value) that is observed by the layer. Calibration is the process of computing the dynamic range of these layers by passing calibration data, which is usually a subset of training or validation data. There are different ways of calibration: `max`, `histogram` and `entropy`. We use `max` calibration technique as it is simple and effective. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "039423dc", + "metadata": {}, + "outputs": [], + "source": [ + "def compute_amax(model, **kwargs):\n", + " # Load calib result\n", + " for name, module in model.named_modules():\n", + " if isinstance(module, quant_nn.TensorQuantizer):\n", + " if module._calibrator is not None:\n", + " if isinstance(module._calibrator, calib.MaxCalibrator):\n", + " module.load_calib_amax()\n", + " else:\n", + " module.load_calib_amax(**kwargs)\n", + " print(F\"{name:40}: {module}\")\n", + " model.cuda()\n", + "\n", + "def collect_stats(model, data_loader, num_batches):\n", + " \"\"\"Feed data to the network and collect statistics\"\"\"\n", + " # Enable calibrators\n", + " for name, module in model.named_modules():\n", + " if isinstance(module, quant_nn.TensorQuantizer):\n", + " if module._calibrator is not None:\n", + " module.disable_quant()\n", + " module.enable_calib()\n", + " else:\n", + " module.disable()\n", + "\n", + " # Feed data to the network for collecting stats\n", + " for i, (image, _) in tqdm(enumerate(data_loader), total=num_batches):\n", + " model(image.cuda())\n", + " if i >= num_batches:\n", + " break\n", + "\n", + " # Disable calibrators\n", + " for name, module in model.named_modules():\n", + " if isinstance(module, quant_nn.TensorQuantizer):\n", + " if module._calibrator is not None:\n", + " module.enable_quant()\n", + " module.disable_calib()\n", + " else:\n", + " module.enable()\n", + "\n", + "def calibrate_model(model, model_name, data_loader, num_calib_batch, calibrator, hist_percentile, out_dir):\n", + " \"\"\"\n", + " Feed data to the network and calibrate.\n", + " Arguments:\n", + " model: classification model\n", + " model_name: name to use when creating state files\n", + " data_loader: calibration data set\n", + " num_calib_batch: amount of calibration passes to perform\n", + " calibrator: type of calibration to use (max/histogram)\n", + " hist_percentile: percentiles to be used for historgram calibration\n", + " out_dir: dir to save state files in\n", + " \"\"\"\n", + "\n", + " if num_calib_batch > 0:\n", + " print(\"Calibrating model\")\n", + " with torch.no_grad():\n", + " collect_stats(model, data_loader, num_calib_batch)\n", + "\n", + " if not calibrator == \"histogram\":\n", + " compute_amax(model, method=\"max\")\n", + " calib_output = os.path.join(\n", + " out_dir,\n", + " F\"{model_name}-max-{num_calib_batch*data_loader.batch_size}.pth\")\n", + " torch.save(model.state_dict(), calib_output)\n", + " else:\n", + " for percentile in hist_percentile:\n", + " print(F\"{percentile} percentile calibration\")\n", + " compute_amax(model, method=\"percentile\")\n", + " calib_output = os.path.join(\n", + " out_dir,\n", + " F\"{model_name}-percentile-{percentile}-{num_calib_batch*data_loader.batch_size}.pth\")\n", + " torch.save(model.state_dict(), calib_output)\n", + "\n", + " for method in [\"mse\", \"entropy\"]:\n", + " print(F\"{method} calibration\")\n", + " compute_amax(model, method=method)\n", + " calib_output = os.path.join(\n", + " out_dir,\n", + " F\"{model_name}-{method}-{num_calib_batch*data_loader.batch_size}.pth\")\n", + " torch.save(model.state_dict(), calib_output)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "78504a6f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Calibrating model\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████████████████████| 32/32 [00:00<00:00, 96.04it/s]\n", + "WARNING: Logging before flag parsing goes to stderr.\n", + "W1109 04:01:43.512364 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.513354 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.514046 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.514638 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.515270 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.515859 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.516441 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.517009 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.517600 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.518167 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.518752 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.519333 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.519911 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.520473 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.521038 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.521596 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.522170 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.522742 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.523360 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.523957 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.524581 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.525059 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.525366 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.525675 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.525962 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.526257 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.526566 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.526885 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.527188 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.527489 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.527792 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.528097 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.528387 139704147265344 tensor_quantizer.py:173] Disable MaxCalibrator\n", + "W1109 04:01:43.528834 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.529163 139704147265344 tensor_quantizer.py:238] Call .cuda() if running on GPU after loading calibrated amax.\n", + "W1109 04:01:43.532748 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([64, 1, 1, 1]).\n", + "W1109 04:01:43.533468 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.534033 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([64, 1, 1, 1]).\n", + "W1109 04:01:43.534684 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.535320 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([128, 1, 1, 1]).\n", + "W1109 04:01:43.535983 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.536569 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([128, 1, 1, 1]).\n", + "W1109 04:01:43.537248 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.537833 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([256, 1, 1, 1]).\n", + "W1109 04:01:43.538480 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.539074 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([256, 1, 1, 1]).\n", + "W1109 04:01:43.539724 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.540307 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([256, 1, 1, 1]).\n", + "W1109 04:01:43.540952 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.541534 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.542075 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.542596 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.543248 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.543719 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.544424 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.544952 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.545530 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.546114 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.546713 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.547292 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([512, 1, 1, 1]).\n", + "W1109 04:01:43.547902 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.548453 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.549015 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([4096, 1]).\n", + "W1109 04:01:43.549665 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.550436 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([4096, 1]).\n", + "W1109 04:01:43.551925 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([]).\n", + "W1109 04:01:43.553105 139704147265344 tensor_quantizer.py:237] Load calibrated amax, shape=torch.Size([10, 1]).\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "features.0._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=2.7537 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.0._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0263, 2.7454](64) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.3._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=27.5676 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.3._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0169, 1.8204](64) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.7._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=15.2002 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.7._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0493, 1.3207](128) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.10._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=7.7376 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.10._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0163, 0.9624](128) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.14._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=8.8351 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.14._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0622, 0.8791](256) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.17._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=12.5746 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.17._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0505, 0.5117](256) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.20._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=9.7203 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.20._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0296, 0.5335](256) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.24._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=8.9367 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.24._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0220, 0.3763](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.27._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=6.6539 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.27._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0151, 0.1777](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.30._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=3.7099 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.30._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0087, 0.1906](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.34._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=4.0491 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.34._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0106, 0.1971](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.37._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=2.1531 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.37._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0070, 0.2305](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.40._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=3.3631 calibrator=MaxCalibrator scale=1.0 quant)\n", + "features.40._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0023, 0.4726](512) calibrator=MaxCalibrator scale=1.0 quant)\n", + "avgpool._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=5.3550 calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.0._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=5.3550 calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.0._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0026, 0.5320](4096) calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.3._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=6.6733 calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.3._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.0018, 0.5172](4096) calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.6._input_quantizer : TensorQuantizer(8bit narrow fake per-tensor amax=9.4352 calibrator=MaxCalibrator scale=1.0 quant)\n", + "classifier.6._weight_quantizer : TensorQuantizer(8bit narrow fake axis=0 amax=[0.3877, 0.5620](10) calibrator=MaxCalibrator scale=1.0 quant)\n" + ] + } + ], + "source": [ + "#Calibrate the model using max calibration technique.\n", + "with torch.no_grad():\n", + " calibrate_model(\n", + " model=qat_model,\n", + " model_name=\"vgg16\",\n", + " data_loader=training_dataloader,\n", + " num_calib_batch=32,\n", + " calibrator=\"max\",\n", + " hist_percentile=[99.9, 99.99, 99.999, 99.9999],\n", + " out_dir=\"./\")" + ] + }, + { + "cell_type": "markdown", + "id": "1aa0c109", + "metadata": {}, + "source": [ + "\n", + "## 6. Quantization Aware Training" + ] + }, + { + "cell_type": "markdown", + "id": "9fe8ec11", + "metadata": {}, + "source": [ + "In this phase, we finetune the model weights and leave the quantizer node values frozen. The dynamic ranges for each layer obtained from the calibration are kept constant while the weights of the model are finetuned to be close to the accuracy of original FP32 model (model without quantizer nodes) is preserved. Usually the finetuning of QAT model should be quick compared to the full training of the original model. Use QAT to fine-tune for around 10% of the original training schedule with an annealing learning-rate. Please refer to Achieving FP32 Accuracy for INT8 Inference Using Quantization Aware Training with NVIDIA TensorRT for detailed recommendations. For this VGG model, it is enough to finetune for 1 epoch to get acceptable accuracy. \n", + "During finetuning with QAT, the quantization is applied as a composition of `max`, `clamp`, `round` and `mul` ops. \n", + "```\n", + "# amax is absolute maximum value for an input\n", + "# The upper bound for integer quantization (127 for int8)\n", + "max_bound = torch.tensor((2.0**(num_bits - 1 + int(unsigned))) - 1.0, device=amax.device)\n", + "scale = max_bound / amax\n", + "outputs = torch.clamp((inputs * scale).round_(), min_bound, max_bound)\n", + "```\n", + "tensor_quant function in `pytorch_quantization` toolkit is responsible for the above tensor quantization. Usually, per channel quantization is recommended for weights, while per tensor quantization is recommended for activations in a network.\n", + "During inference, we use `torch.fake_quantize_per_tensor_affine` and `torch.fake_quantize_per_channel_affine` to perform quantization as this is easier to convert into corresponding TensorRT operators. Please refer to next sections for more details on how these operators are exported in torchscript and converted in Torch-TensorRT." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "1f28d228", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Updating learning rate: 0.1\n", + "Epoch: [ 1 / 1] LR: 0.100000\n", + "Batch: [ 500 | 1563] loss: 2.635\n", + "Batch: [ 1000 | 1563] loss: 2.655\n", + "Batch: [ 1500 | 1563] loss: 2.646\n", + "Test Loss: 0.03291 Test Acc: 82.98%\n", + "Checkpoint saved\n" + ] + } + ], + "source": [ + "# Finetune the QAT model for 1 epoch\n", + "num_epochs=1\n", + "for epoch in range(num_epochs):\n", + " adjust_lr(opt, epoch)\n", + " print('Epoch: [%5d / %5d] LR: %f' % (epoch + 1, num_epochs, state[\"lr\"]))\n", + "\n", + " train(qat_model, training_dataloader, crit, opt, epoch)\n", + " test_loss, test_acc = test(qat_model, testing_dataloader, crit, epoch)\n", + "\n", + " print(\"Test Loss: {:.5f} Test Acc: {:.2f}%\".format(test_loss, 100 * test_acc))\n", + " \n", + "save_checkpoint({'epoch': epoch + 1,\n", + " 'model_state_dict': qat_model.state_dict(),\n", + " 'acc': test_acc,\n", + " 'opt_state_dict': opt.state_dict(),\n", + " 'state': state},\n", + " ckpt_path=\"vgg16_qat_ckpt\")" + ] + }, + { + "cell_type": "markdown", + "id": "7a4dcaa2", + "metadata": {}, + "source": [ + "\n", + "## 7. Export to Torchscript\n", + "Export the model to Torch script. Trace the model and convert it into torchscript for deployment. To learn more about Torchscript, please refer to https://pytorch.org/docs/stable/jit.html. Setting `quant_nn.TensorQuantizer.use_fb_fake_quant = True` enables the QAT model to use `torch.fake_quantize_per_tensor_affine` and `torch.fake_quantize_per_channel_affine` operators instead of `tensor_quant` function to export quantization operators. In torchscript, they are represented as `aten::fake_quantize_per_tensor_affine` and `aten::fake_quantize_per_channel_affine`. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "3d34f526", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "E1109 04:02:37.101168 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.102248 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.107194 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.107625 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.115269 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.115740 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.117969 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.118358 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.126382 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.126834 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.128674 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.129518 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.135453 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.135936 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.137858 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.138366 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.145539 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.146053 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.147871 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.148353 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.154252 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.154685 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.156558 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.157159 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.163197 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.163676 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.165549 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.165991 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.173305 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.173926 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.176034 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.176697 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.182843 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.183426 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.185377 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.185962 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.191966 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.192424 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.194325 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.194817 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.201988 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.202665 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.204763 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.205461 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.211393 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.211987 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.213899 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.214450 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.220892 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.221533 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.223519 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.224037 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.233809 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.234434 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.238212 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.239042 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.241022 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.241654 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.247820 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.248445 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.250366 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.250959 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.257248 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.257854 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.259968 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.260660 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "W1109 04:02:37.268160 139704147265344 tensor_quantizer.py:280] Use Pytorch's native experimental fake quantization.\n", + "/opt/conda/lib/python3.8/site-packages/pytorch_quantization/nn/modules/tensor_quantizer.py:285: TracerWarning: Converting a tensor to a Python number might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!\n", + " inputs, amax.item() / bound, 0,\n", + "/opt/conda/lib/python3.8/site-packages/pytorch_quantization/nn/modules/tensor_quantizer.py:291: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!\n", + " quant_dim = list(amax.shape).index(list(amax_sequeeze.shape)[0])\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "E1109 04:02:37.329273 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.330212 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.332529 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.333365 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.339547 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.340248 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.342257 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.342890 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.350619 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.351372 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.353470 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.354121 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.360090 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.360806 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.362803 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.363274 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.370369 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.371057 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.373071 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.373766 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.379890 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.380538 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.382532 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.383128 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.389077 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.389760 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.391815 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.392399 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.399809 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.400472 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.402399 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.402939 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.408818 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.409424 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.411513 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.412097 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.418537 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.419128 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.421343 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.421946 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.429382 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.430156 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.432259 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.433079 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.439297 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.440027 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.442149 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.442826 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.449377 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.449968 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.452122 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.452754 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.462532 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.463295 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.466963 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.467725 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.469692 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.470336 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.476204 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.476738 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.478809 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.479375 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.485666 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.486219 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.488416 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n", + "E1109 04:02:37.488986 139704147265344 tensor_quantizer.py:120] Fake quantize mode doesn't use scale explicitly!\n" + ] + } + ], + "source": [ + "quant_nn.TensorQuantizer.use_fb_fake_quant = True\n", + "with torch.no_grad():\n", + " data = iter(testing_dataloader)\n", + " images, _ = data.next()\n", + " jit_model = torch.jit.trace(qat_model, images.to(\"cuda\"))\n", + " torch.jit.save(jit_model, \"trained_vgg16_qat.jit.pt\")" + ] + }, + { + "cell_type": "markdown", + "id": "7341418a", + "metadata": {}, + "source": [ + "\n", + "## 8. Inference using Torch-TensorRT\n", + "In this phase, we run the exported torchscript graph of VGG QAT using Torch-TensorRT. Torch-TensorRT is a Pytorch-TensorRT compiler which converts Torchscript graphs into TensorRT. TensorRT 8.0 supports inference of quantization aware trained models and introduces new APIs; `QuantizeLayer` and `DequantizeLayer`. We can observe the entire VGG QAT graph quantization nodes from the debug log of Torch-TensorRT. To enable debug logging, you can set `torch_tensorrt.logging.set_reportable_log_level(torch_tensorrt.logging.Level.Debug)`. For example, `QuantConv2d` layer from `pytorch_quantization` toolkit is represented as follows in Torchscript\n", + "```\n", + "%quant_input : Tensor = aten::fake_quantize_per_tensor_affine(%x, %636, %637, %638, %639)\n", + "%quant_weight : Tensor = aten::fake_quantize_per_channel_affine(%394, %640, %641, %637, %638, %639)\n", + "%input.2 : Tensor = aten::_convolution(%quant_input, %quant_weight, %395, %687, %688, %689, %643, %690, %642, %643, %643, %644, %644)\n", + "```\n", + "`aten::fake_quantize_per_*_affine` is converted into `QuantizeLayer` + `DequantizeLayer` in Torch-TensorRT internally. Please refer to quantization op converters in Torch-TensorRT." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "aa7495e0", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: [Torch-TensorRT] - Cannot infer input type from calcuations in graph for input x.2. Assuming it is Float32. If not, specify input type explicity\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT] - Dilation not used in Max pooling converter\n", + "WARNING: [Torch-TensorRT TorchScript Conversion Context] - Detected invalid timing cache, setup a local cache instead\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "VGG QAT accuracy using TensorRT: 82.97%\n" + ] + } + ], + "source": [ + "qat_model = torch.jit.load(\"trained_vgg16_qat.jit.pt\").eval()\n", + "\n", + "compile_spec = {\"inputs\": [torch_tensorrt.Input([16, 3, 32, 32])],\n", + " \"enabled_precisions\": torch.int8,\n", + " }\n", + "trt_mod = torch_tensorrt.compile(qat_model, **compile_spec)\n", + "\n", + "test_loss, test_acc = test(trt_mod, testing_dataloader, crit, 0)\n", + "print(\"VGG QAT accuracy using TensorRT: {:.2f}%\".format(100 * test_acc))" + ] + }, + { + "cell_type": "markdown", + "id": "9df5a90e", + "metadata": {}, + "source": [ + "### Performance benchmarking" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "9eb2cd2d", + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import numpy as np\n", + "\n", + "import torch.backends.cudnn as cudnn\n", + "cudnn.benchmark = True\n", + "\n", + "# Helper function to benchmark the model\n", + "def benchmark(model, input_shape=(1024, 1, 32, 32), dtype='fp32', nwarmup=50, nruns=1000):\n", + " input_data = torch.randn(input_shape)\n", + " input_data = input_data.to(\"cuda\")\n", + " if dtype=='fp16':\n", + " input_data = input_data.half()\n", + " \n", + " print(\"Warm up ...\")\n", + " with torch.no_grad():\n", + " for _ in range(nwarmup):\n", + " features = model(input_data)\n", + " torch.cuda.synchronize()\n", + " print(\"Start timing ...\")\n", + " timings = []\n", + " with torch.no_grad():\n", + " for i in range(1, nruns+1):\n", + " start_time = time.time()\n", + " output = model(input_data)\n", + " torch.cuda.synchronize()\n", + " end_time = time.time()\n", + " timings.append(end_time - start_time)\n", + " if i%100==0:\n", + " print('Iteration %d/%d, avg batch time %.2f ms'%(i, nruns, np.mean(timings)*1000))\n", + "\n", + " print(\"Input shape:\", input_data.size())\n", + " print(\"Output shape:\", output.shape)\n", + " print('Average batch time: %.2f ms'%(np.mean(timings)*1000))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "5c2514ae", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, avg batch time 4.83 ms\n", + "Iteration 200/1000, avg batch time 4.83 ms\n", + "Iteration 300/1000, avg batch time 4.83 ms\n", + "Iteration 400/1000, avg batch time 4.83 ms\n", + "Iteration 500/1000, avg batch time 4.83 ms\n", + "Iteration 600/1000, avg batch time 4.83 ms\n", + "Iteration 700/1000, avg batch time 4.83 ms\n", + "Iteration 800/1000, avg batch time 4.83 ms\n", + "Iteration 900/1000, avg batch time 4.83 ms\n", + "Iteration 1000/1000, avg batch time 4.83 ms\n", + "Input shape: torch.Size([16, 3, 32, 32])\n", + "Output shape: torch.Size([16, 10])\n", + "Average batch time: 4.83 ms\n" + ] + } + ], + "source": [ + "benchmark(jit_model, input_shape=(16, 3, 32, 32))" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "c5378ed6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warm up ...\n", + "Start timing ...\n", + "Iteration 100/1000, avg batch time 1.87 ms\n", + "Iteration 200/1000, avg batch time 1.84 ms\n", + "Iteration 300/1000, avg batch time 1.85 ms\n", + "Iteration 400/1000, avg batch time 1.83 ms\n", + "Iteration 500/1000, avg batch time 1.82 ms\n", + "Iteration 600/1000, avg batch time 1.81 ms\n", + "Iteration 700/1000, avg batch time 1.81 ms\n", + "Iteration 800/1000, avg batch time 1.80 ms\n", + "Iteration 900/1000, avg batch time 1.80 ms\n", + "Iteration 1000/1000, avg batch time 1.79 ms\n", + "Input shape: torch.Size([16, 3, 32, 32])\n", + "Output shape: torch.Size([16, 10])\n", + "Average batch time: 1.79 ms\n" + ] + } + ], + "source": [ + "benchmark(trt_mod, input_shape=(16, 3, 32, 32))" + ] + }, + { + "cell_type": "markdown", + "id": "d6a5ec1c", + "metadata": {}, + "source": [ + "\n", + "## 9. References\n", + "* Very Deep Convolution Networks for large scale Image Recognition\n", + "* Achieving FP32 Accuracy for INT8 Inference Using Quantization Aware Training with NVIDIA TensorRT\n", + "* QAT workflow for VGG16\n", + "* Deploying VGG QAT model in C++ using Torch-TensorRT\n", + "* Pytorch-quantization toolkit from NVIDIA\n", + "* Pytorch quantization toolkit userguide\n", + "* Quantization basics" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/v1.2.0/_sources/cli/torchtrtc.rst.txt b/docs/v1.2.0/_sources/cli/torchtrtc.rst.txt new file mode 100644 index 0000000000..69292c491c --- /dev/null +++ b/docs/v1.2.0/_sources/cli/torchtrtc.rst.txt @@ -0,0 +1,149 @@ +.. _torchtrtc: + +torchtrtc +================================= + +``torchtrtc`` is a CLI application for using the Torch-TensorRT compiler. It serves as an easy way to compile a +TorchScript Module with Torch-TensorRT from the command-line to quickly check support or as part of +a deployment pipeline. All basic features of the compiler are supported including post training +quantization (though you must already have a calibration cache file to use the PTQ feature). The compiler can +output two formats, either a TorchScript program with the TensorRT engine embedded or +the TensorRT engine itself as a PLAN file. + +All that is required to run the program after compilation is for C++ linking against ``libtorchtrt.so`` +or in Python importing the torch_tensorrt package. All other aspects of using compiled modules are identical +to standard TorchScript. Load with ``torch.jit.load()`` and run like you would run any other module. + +.. code-block:: txt + + torchtrtc [input_file_path] [output_file_path] + [input_specs...] {OPTIONS} + + torchtrtc is a compiler for TorchScript, it will compile and optimize + TorchScript programs to run on NVIDIA GPUs using TensorRT + + OPTIONS: + + -h, --help Display this help menu + Verbiosity of the compiler + -v, --verbose Dumps debugging information about the + compilation process onto the console + -w, --warnings Disables warnings generated during + compilation onto the console (warnings + are on by default) + --i, --info Dumps info messages generated during + compilation onto the console + --build-debuggable-engine Creates a debuggable engine + --allow-gpu-fallback (Only used when targeting DLA + (device-type)) Lets engine run layers on + GPU if they are not supported on DLA + --require-full-compilation Require that the model should be fully + compiled to TensorRT or throw an error + --check-method-support=[method_name] + Check the support for end to end + compilation of a specified method in the + TorchScript module + --disable-tf32 Prevent Float32 layers from using the + TF32 data format + --sparse-weights Enable sparsity for weights of conv and + FC layers + -p[precision...], + --enable-precision=[precision...] (Repeatable) Enabling an operating + precision for kernels to use when + building the engine (Int8 requires a + calibration-cache argument) [ float | + float32 | f32 | fp32 | half | float16 | + f16 | fp16 | int8 | i8 | char ] + (default: float) + -d[type], --device-type=[type] The type of device the engine should be + built for [ gpu | dla ] (default: gpu) + --gpu-id=[gpu_id] GPU id if running on multi-GPU platform + (defaults to 0) + --dla-core=[dla_core] DLACore id if running on available DLA + (defaults to 0) + --engine-capability=[capability] The type of device the engine should be + built for [ standard | safety | + dla_standalone ] + --calibration-cache-file=[file_path] + Path to calibration cache file to use + for post training quantization + --teo=[op_name...], + --torch-executed-op=[op_name...] (Repeatable) Operator in the graph that + should always be run in PyTorch for + execution (partial compilation must be + enabled) + --tem=[module_name...], + --torch-executed-mod=[module_name...] + (Repeatable) Module that should always + be run in Pytorch for execution (partial + compilation must be enabled) + --mbs=[num_ops], + --min-block-size=[num_ops] Minimum number of contiguous TensorRT + supported ops to compile a subgraph to + TensorRT + --embed-engine Whether to treat input file as a + serialized TensorRT engine and embed it + into a TorchScript module (device spec + must be provided) + --num-avg-timing-iters=[num_iters] + Number of averaging timing iterations + used to select kernels + --workspace-size=[workspace_size] Maximum size of workspace given to + TensorRT + --dla-sram-size=[dla_sram_size] Fast software managed RAM used by DLA + to communicate within a layer. + --dla-local-dram-size=[dla_local_dram_size] Host RAM used by DLA to share + intermediate tensor data across operations. + --dla-global-dram-size=[dla_global_dram_size] Host RAM used by DLA to store + weights and metadata for execution + --atol=[atol] Absolute tolerance threshold for acceptable + numerical deviation from standard torchscript + output (default 1e-8) + --rtol=[rtol] Relative tolerance threshold for acceptable + numerical deviation from standard torchscript + output (default 1e-5) + --no-threshold-check Skip checking threshold compliance + --truncate-long-double, + --truncate, --truncate-64bit Truncate weights that are provided in + 64bit to 32bit (Long, Double to Int, + Float) + --save-engine Instead of compiling a full a + TorchScript program, save the created + engine to the path specified as the + output path + --custom-torch-ops (repeatable) Shared object/DLL containing custom torch operators + --custom-converters (repeatable) Shared object/DLL containing custom converters + input_file_path Path to input TorchScript file + output_file_path Path for compiled TorchScript (or + TensorRT engine) file + input_specs... Specs for inputs to engine, can either + be a single size or a range defined by + Min, Optimal, Max sizes, e.g. + "(N,..,C,H,W)" + "[(MIN_N,..,MIN_C,MIN_H,MIN_W);(OPT_N,..,OPT_C,OPT_H,OPT_W);(MAX_N,..,MAX_C,MAX_H,MAX_W)]". + Data Type and format can be specified by + adding an "@" followed by dtype and "%" + followed by format to the end of the + shape spec. e.g. "(3, 3, 32, + 32)@f16%NHWC" + "--" can be used to terminate flag options and force all following + arguments to be treated as positional options + +e.g. + +.. code-block:: shell + + torchtrtc tests/modules/ssd_traced.jit.pt ssd_trt.ts "[(1,3,300,300); (1,3,512,512); (1, 3, 1024, 1024)]@f16%contiguous" -p f16 + +- To include a set of custom operators + +.. code-block:: shell + + torchtrtc tests/modules/ssd_traced.jit.pt ssd_trt.ts --custom-torch-ops= "[(1,3,300,300); (1,3,512,512); (1, 3, 1024, 1024)]@fp16%contiguous" -p f16 + + +- To include a set of custom converters + +.. code-block:: shell + + torchtrtc tests/modules/ssd_traced.jit.pt ssd_trt.ts --custom-converters= "[(1,3,300,300); (1,3,512,512); (1, 3, 1024, 1024)]@fp16%contiguous" -p f16 diff --git a/docs/v1.2.0/_sources/contributors/conversion.rst.txt b/docs/v1.2.0/_sources/contributors/conversion.rst.txt new file mode 100644 index 0000000000..f19fc5eba8 --- /dev/null +++ b/docs/v1.2.0/_sources/contributors/conversion.rst.txt @@ -0,0 +1,53 @@ +.. _conversion: + +Conversion Phase +================== + +Once the graph has be simplified to a form thats easy to convert, we then set up a conversion context +to manage the construction of a TensorRT ``INetworkDefinition`` from the blocks nodes. The conversion context +records the set of converted nodes, block inputs and outputs and other information about the conversion +of the graph. This data is then used to help converters link together layers and also hold build time +information like weights required to construct the engine. After the context is created, the block +converter starts iterating through the list of nodes, for each node, the converter will look at its +inputs and assemble an array of resources to pass to the converter. Inputs can be in a couple of states: + +* The input is a block parameter + + * In this case the input should have already been stored in as an IValue in the + conversion context ``evaluated_value_map``. The conversion stage will add the IValue to the list of args for the + converter + +* The input is an output of a node that has already been converted + + * In this case the ITensor of the output has added to the ``value_tensor_map``, + The conversion stage will add the ITensor to the list of args for the converter + +* The input is from a node that produces a static value + + * There are nodes that produce static values, typically used to store parameters for operators, we need to + evaluate these nodes at conversion time to be able to convert a op. The conversion system will look for a node + evaluator in the evaluator registry and run it on the node. The IValue produced will be entered in the + conversion context ``evaluated_value_map`` and added to the list of args for the converter. If the node + to be evaluated takes inputs, the conversion stage will recursively resolve dependencies until the final + static value has been evaluated + +* The input is from a node that has not been converted + + * Torch-TensorRT will error out here + +Node Evaluation +----------------- +There are some nodes that contain static data and are resources for operations. These can be evaluated at +conversion time so that you can use those values when doing node conversion. In theory any node kind can have +a conversion time evaluator as long as it produces a static IValue, This IValue will be stored in the conversion +context so it can be consumed by any node that takes the evaluated node as an input. Common node types are +``prim::Constant`` which emits a constant and ``prim::ListConstruct`` which makes lists. + +Node Converters +---------------- + +Node converters map JIT nodes to layers or subgraphs of layers. They then associate outputs from the JIT graph +and the TRT graph together in the conversion context. This allows the conversion stage to assemble the inputs +for the next node. There are some cases where a node produces an output that is not a Tensor but a static result +from a calculation done on inputs which need to be converted first. In this case the converter may associate the outputs in +the ``evaluated_value_map`` instead of the ``value_tensor_map``. For more information take a look at: :ref:`writing_converters` diff --git a/docs/v1.2.0/_sources/contributors/lowering.rst.txt b/docs/v1.2.0/_sources/contributors/lowering.rst.txt new file mode 100644 index 0000000000..956c2004e1 --- /dev/null +++ b/docs/v1.2.0/_sources/contributors/lowering.rst.txt @@ -0,0 +1,207 @@ +.. _lowering: + +Lowering Phase +=============== + +The lowering phase is made up out of passes which are operations which map a graph from a high level representation +to a lower level one. Each pass does something specific for instance inlining method calls. The idea is to +significantly reduce what the conversion phase needs to be able to handle when actually mapping to TensorRT. +We aim for closer to 1->1 op conversion vs looking for applicable subgraphs, limiting the number of converters and +reduce the scope of each converter. + +You can see the effects of each pass by setting the log level to ``Level::kGraph`` + +Passes Used +------------- + +EliminateCommonSubexpression +*********************************** + + `torch/csrc/jit/passes/common_subexpression_elimination.h `_ + +Removes common subexpressions in the graph + + + +Eliminate Dead Code +************************** + + `torch/csrc/jit/passes/dead_code_elimination.h `_ + +Dead code elimination will check if a node has side effects and not delete it if it does. + +Eliminate Exeception Or Pass Pattern +*************************************** + + `Torch-TensorRT/core/lowering/passes/exception_elimination.cpp `_ + +A common pattern in scripted modules are dimension gaurds which will throw execptions if +the input dimension is not what was expected. + +.. code-block:: none + + %1013 : bool = aten::ne(%1012, %24) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/batchnorm.py:248:11 + = prim::If(%1013) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/batchnorm.py:248:8 + block0(): + = prim::RaiseException(%23) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/batchnorm.py:249:12 + -> () + block1(): + -> () + +Since we are resolving all of this at compile time and there are no execptions in the TensorRT graph, we just remove it. + +Eliminate Redundant Gaurds +*************************************** + + `torch/csrc/jit/passes/guard_elimination.h `_ + +Eliminate redundant guards for ops whose outputs are fully determined by their inputs i.e. if inputs to such ops are +guarded we are allowed to remove a guard on ops' outputs + +Freeze Module +*************************************** + + `torch/csrc/jit/passes/freeze_module.h `_ + +Freeze attributes and inline constants and modules. Propogates constants in the graph. + +Fuse AddMM Branches +*************************************** + + `Torch-TensorRT/core/lowering/passes/fuse_addmm_branches.cpp `_ + +A common pattern in scripted modules is tensors of different dimensions use different constructions for implementing linear layers. We fuse these +different varients into a single one that will get caught by the Unpack AddMM pass. + +.. code-block:: none + + %ret : Tensor = prim::If(%622) + block0(): + %ret.1 : Tensor = aten::addmm(%self.fc.bias, %x9.1, %3677, %3, %3) + -> (%ret.1) + block1(): + %output.1 : Tensor = aten::matmul(%x9.1, %3677) + %output0.1 : Tensor = aten::add_(%output.1, %self.fc.bias, %3) + -> (%output0.1) + +We fuse this set of blocks into a graph like this: + +.. code-block:: none + + %ret : Tensor = aten::addmm(%self.fc.bias, %x9.1, %3677, %3, %3) + +Fuse Linear +*************************************** + + `torch/csrc/jit/passes/fuse_linear.h `_ + +Match the ``aten::linear`` pattern and fuse it into a single ``aten::linear`` +This pass fuse the addmm or matmul + add generated by JIT back to linear + +Fuse Flatten Linear +*************************************** + + `Torch-TensorRT/core/lowering/passes/fuse_flatten_linear.cpp `_ + +TensorRT implicity flattens input layers into fully connected layers when they are higher than 1D. So when there is a +``aten::flatten`` -> ``aten::linear`` pattern we remove the ``aten::flatten``. + +Lower Graph +*************************************** + + `torch/csrc/jit/passes/lower_graph.h `_ + +Given a graph with of a method which first argument is %self, lower it to a graph where +all attributes accesses are replaced with explicit inputs of the graph +(rather than results of prim::GetAttr executed on %self). Returns a tuple +(graph, parameters) where the last module.parameters.size() inputs to the +graph are the trainable parameters used in this method. The remaining inputs +are the true inputs to the function. + +Lower Tuples +*************************************** + + `torch/csrc/jit/passes/lower_tuples.h `_ + +* ``LowerSimpleTuples``: + +Removes tuples where TupleConstruct and TupleUnpack are matched but leaves tuples in place across if statements, loops, and as inputs/outputs + +* ``LowerAllTuples``: + +Removes _all_ tuples and raises an error if some cannot be removed, this is used by ONNX to ensure there are not tuples before conversion, but will not work on graphs whose inputs contain tuples. + +Module Fallback +***************** + + `Torch-TensorRT/core/lowering/passes/module_fallback.cpp `_ + +Module fallback consists of two lowering passes that must be run as a pair. The first pass is run before freezing to place delimiters in the graph around modules +that should run in PyTorch. The second pass marks nodes between these delimiters after freezing to signify they should run in PyTorch. + +* ``NotateModuleForFallback`` + +Places delimiting nodes around module calls pre freezing to signify where in the graph nodes should run in PyTorch + +* ``MarkNodesForFallback`` + +Looks for delimiters then marks all nodes between the delimiters to tell partitioning to run them in PyTorch + +Peephole Optimze +*************************************** + + `torch/csrc/jit/passes/peephole_optimze.h `_ + +The intent for this optimization pass is to catch all of the small, easy to catch peephole optimizations you might be interested in doing. + +Right now, it does: + - Eliminate no-op 'expand' nodes + - Simply x.t().t() to x + + +Remove Contiguous +*************************************** + + `Torch-TensorRT/core/lowering/passes/remove_contiguous.cpp `_ + +Removes contiguous operators since we are doing TensorRT memory is already contiguous. + + +Remove Dropout +*************************************** + + `Torch-TensorRT/core/lowering/passes/remove_dropout.cpp `_ + +Removes dropout operators since we are doing inference. + +Remove To +*************************************** + + `Torch-TensorRT/core/lowering/passes/remove_to.cpp `_ + +Removes ``aten::to`` operators that do casting, since TensorRT mangages it itself. It is important that this is one of the last passes run so that +other passes have a change to move required cast operators out of the main namespace. + +Unpack AddMM +*************************************** + + `Torch-TensorRT/core/lowering/passes/unpack_addmm.cpp `_ + +Unpacks ``aten::addmm`` into ``aten::matmul`` and ``aten::add_`` (with an additional ``trt::const`` +op to freeze the bias in the TensorRT graph). This lets us reuse the ``aten::matmul`` and ``aten::add_`` +converters instead of needing a dedicated converter. + +Unpack LogSoftmax +*************************************** + + `Torch-TensorRT/core/lowering/passes/unpack_log_softmax.cpp `_ + +Unpacks ``aten::logsoftmax`` into ``aten::softmax`` and ``aten::log``. This lets us reuse the +``aten::softmax`` and ``aten::log`` converters instead of needing a dedicated converter. + +Unroll Loops +*************************************** + + `torch/csrc/jit/passes/loop_unrolling.h `_ + +Unrolls the operations of compatable loops (e.g. sufficently short) so that you only have to go through the loop once. diff --git a/docs/v1.2.0/_sources/contributors/partitioning.rst.txt b/docs/v1.2.0/_sources/contributors/partitioning.rst.txt new file mode 100644 index 0000000000..2d027c57f4 --- /dev/null +++ b/docs/v1.2.0/_sources/contributors/partitioning.rst.txt @@ -0,0 +1,93 @@ +.. _partitioning: + +Partitioning Phase +==================== + +The phase is optional and enabled by the user. It instructs the compiler to separate nodes into ones that should run in PyTorch and ones that should run in TensorRT. +Criteria for separation include: Lack of a converter, operator is explicitly set to run in PyTorch by the user or the node has a flag which tells partitioning to +run in PyTorch by the module fallback passes. + +On a high level, Torch-TensorRT partitioning phase does the following: + +* Segmentation. Go through the set of operators in order and verify if there is converter for each operator. Then, roughly separate the graph into parts that Torch-TensorRT can support and parts Torch-TensorRT cannot. + +* Dependency Analysis. For every to be compiled operator there is a "complete dependency graph", which means that every input can to traced back to an input as Tensor or TensorList. Go through all segments after segmentation then do dependency analysis to ensure that there are only Tensor/TensorList inputs and outputs for TensorRT segments. + +* Shape Analysis. For each segments, figure out the input and outputs shapes starting from the provided input shape from the user. Shapes can be calculated by running the graphs with JIT. + +* Conversion. Every TensorRT segments will be converted to TensorRT engine. This part is done in compiler.cpp, but it's still a phase in our partitioning process. + +* Stitching. Stitch all TensorRT engines with PyTorch nodes altogether. + +Here are the brief description of these functions of each file: + +PartitonInfo.h/.cpp +*********************************** + + `core/partitioning/PartitionInfo.h `_ + +The automatic fallback APIs that is used for partitioning. + + +SegmentedBlock.h/.cpp +*********************************** + + `core/partitioning/SegmentedBlock.h `_ + +The main data structures that is used to maintain information for each segments after segmentation. + + +shape_analysis.h/.cpp +*********************************** + + `core/partitioning/shape_analysis.h `_ + +Code implementation to get the shapes for each segments by running them in JIT. + + +partitioning.h/.cpp +*********************************** + `core/partitioning/partitioning.h `_ + +APIs and main code implementation for partitioning phase. + +Automatic Fallback +==================== + +To enable automatic fallback feature, you can set following attributes in Python: + +.. code-block:: none + + import torch + import torch_tensorrt as torchtrt + + ... + model = MyModel() + ts_model = torch.jit.script(model) + trt_model = torchtrt.ts.compile(model, **{ + ... + "min_block_size" : 3, + "torch_executed_ops": ["aten::add"], + "torch_executed_modules": [], + }) + +* enabled: By default automatic fallback will be off. It is enabled by setting it to True. +* min_block_size: The minimum number of consecutive operations that must satisfy to be converted to TensorRT. For example, if it's set to 3, then there must be 3 consecutive supported operators then this segments will be converted. +* forced_fallback_ops: A list of strings that will be the names of operations that the user explicitly want to be in PyTorch nodes. + + +.. code-block:: none + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + + ... + auto in = torch::randn({1, 3, 224, 224}, {torch::kCUDA}); + + auto mod = torch::jit::load("trt_ts_module.ts"); + auto input_sizes = std::vector{{in.sizes()}}; + torchtrt::ts::CompileSpec cfg(input_sizes); + cfg.min_block_size = 2; + cfg.torch_executed_ops.push_back("aten::relu"); + auto trt_mod = torchtrt::ts::compile(mod, cfg); + auto out = trt_mod.forward({in}); diff --git a/docs/v1.2.0/_sources/contributors/phases.rst.txt b/docs/v1.2.0/_sources/contributors/phases.rst.txt new file mode 100644 index 0000000000..e99af77faa --- /dev/null +++ b/docs/v1.2.0/_sources/contributors/phases.rst.txt @@ -0,0 +1,46 @@ +Compiler Phases +---------------- + +.. toctree:: + :caption: Compiler Phases + :maxdepth: 1 + :hidden: + + lowering + partitioning + conversion + runtime + +Lowering +^^^^^^^^^^^ +:ref:`lowering` + +The lowering is made up of a set of passes (some from PyTorch and some specific to Torch-TensorRT) +run over the graph IR to map the large PyTorch opset to a reduced opset that is easier to convert to +TensorRT. + +Partitioning +^^^^^^^^^^^^^ +:ref:`partitioning` + +The phase is optional and enabled by the user. It instructs the compiler to separate nodes into ones that should run in PyTorch and ones that should run in TensorRT. +Criteria for separation include: Lack of a converter, operator is explicitly set to run in PyTorch by the user or the node has a flag which tells partitioning to +run in PyTorch by the module fallback passes. + +Conversion +^^^^^^^^^^^ +:ref:`conversion` + +In the conversion phase we traverse the lowered graph and construct an equivalent TensorRT graph. +The conversion phase is made up of three main components, a context to manage compile time data, +a evaluator library which will execute operations that can be resolved at compile time and a converter +library which maps an op from JIT to TensorRT. + +Compilation and Runtime +^^^^^^^^^^^^^^^^^^^^^^^^ +:ref:`runtime` + +The final compilation phase constructs a TorchScript program to run the converted TensorRT engine. It +takes a serialized engine and instantiates it within a engine manager, then the compiler will +build out a JIT graph that references this engine and wraps it in a module to return to the user. +When the user executes the module, the JIT program run in the JIT runtime extended by Torch-TensorRT with the data providied from the user. diff --git a/docs/v1.2.0/_sources/contributors/runtime.rst.txt b/docs/v1.2.0/_sources/contributors/runtime.rst.txt new file mode 100644 index 0000000000..23d83b6db2 --- /dev/null +++ b/docs/v1.2.0/_sources/contributors/runtime.rst.txt @@ -0,0 +1,85 @@ +.. _execution: + +Runtime Phase +================ + +The Runtime phase is responsible for constructing self standing TorchScript graphs with embedded TensorRT engines and serving as the runtime +when these engines are called. The main interface accepts a serialized TensorRT engine. The execution phase +will deserialize and wrap this engine in a class which maintains a execution context for each engine +and some metadata about its inputs and outputs and is compatable with the TorchScript interpreter so that +it can be moved around and used like other TorchScript IValues. The engine is run by providing it and inputs +to the ``tensorrt::execute_engine`` operator which will take the engine and its inputs and return the results of engine exeuction. + + +Background +------------ +PyTorch JIT's runtime is based around a stack machine, all operators pop off arguments from the stack, pass them to +some implementation of the operator then push results back onto the stack. The actual elements of the stack +are ``torch::jit::IValues``, the same type we evaluate in the conversion phase (the realization of the abstract +torch::jit::Value type). + +TensorRT Engine Executor Op +---------------------------- + +When the Torch-TensorRT is loaded, it registers an operator in the PyTorch JIT operator library called +``trt::execute_engine(Tensor[] inputs, __torch__.torch.classes.tensorrt.Engine engine) -> Tensor[]`` which takes an +instantiated engine and list of inputs. Compiled graphs store this engine in an attribute so that it is portable and serializable. +When the op is called, an instnantiated engine and input tensors are popped off the runtime stack. These inputs are passed into a generic engine execution function which +will run the tensors through the TensorRT engine and return new tensors as results. These tensors are pushed on to the +stack so that the next op whatever it is can use it. + +Constructing the Resulting Graph +----------------------------------- + +Once the engine is deserialized and instantiated, the compiler will construct a graph that will execute the engine when the module is called. +Here is an example: + +.. code-block:: + + graph(%self_1 : __torch__.torchvision.models.resnet.___torch_mangle_4847.ResNet_trt, + %input_0 : Tensor): + %1 : __torch__.torch.classes.tensorrt.Engine = prim::GetAttr[name="__torch___torchvision_models_resnet____torch_mangle_4847_ResNet_trt_engine"](%self_1) + %3 : Tensor[] = prim::ListConstruct(%input_0) + %4 : Tensor[] = trt::execute_engine(%3, %1) + %5 : Tensor = prim::ListUnpack(%4) + return (%5) + +You can see the engine attribute in the graph and the ``trt::execute_engine`` op taking a list of input tensors and an engine in +and produces a list of output tensors which is returned. When ``forward`` is called on the module this graph is executed, thereby +running the TensorRT engine. + +In the case of multiple outputs, the compiled graph may repack output tensors into a Tuple to return back to the user. + +.. code-block:: + + graph(%self_1 : __torch__.PyTorch.Detection.SSD.src.model.SSD300_trt, + %input_0 : Tensor): + %1 : __torch__.torch.classes.tensorrt.Engine = prim::GetAttr[name="__torch___PyTorch_Detection_SSD_src_model_SSD300_trt_engine"](%self_1) + %3 : Tensor[] = prim::ListConstruct(%input_0) + %4 : Tensor[] = trt::execute_engine(%3, %1) + %5 : Tensor, %6 : Tensor = prim::ListUnpack(%4) + %7 : (Tensor, Tensor) = prim::TupleConstruct(%5, %6) + return (%7) + +Serialization and Deserialization +---------------------------------- + +Serialization and deserialization of TensorRT engines embedded in TorchScript graphs are handled by the holder class for the engine and TorchBind. +When a TorchScript module is saved, the pickler will run serilization on the cuda engine and store the serialized engine in the zip file created. +When deserializing, the depickler will call a constructor for the engine holder class with the serialized engine so that it can be set up again for +execution. + +ABI Versioning and Serialization Format +========================================= + +Torch-TensorRT programs are standard TorchScript with TensorRT engines as objects embedded in the graph. Therefore there is a serialization format +for the TensorRT engines. The format for Torch-TensorRT serialized programs are versioned with an "ABI" version which tells the runtime about runtime compatibility. + +> Current ABI version is 3 + +The format is a vector of serialized strings. They encode the following information + +* ABI Version for the program +* Name of the TRT engine +* Device information: Includes the target device the engine was built on, SM capability and other device information. This information is used at deserialization time to select the correct device to run the engine +* Serialized TensorRT engine diff --git a/docs/v1.2.0/_sources/contributors/system_overview.rst.txt b/docs/v1.2.0/_sources/contributors/system_overview.rst.txt new file mode 100644 index 0000000000..d16697e3a3 --- /dev/null +++ b/docs/v1.2.0/_sources/contributors/system_overview.rst.txt @@ -0,0 +1,29 @@ +.. _system_overview: + +System Overview +================ + +Torch-TensorRT is primarily a C++ Library with a Python API planned. We use Bazel as our build system and target Linux x86_64 and +Linux aarch64 (only natively) right now. The compiler we use is GCC 7.5.0 and the library is untested with compilers before that +version so there may be compilation errors if you try to use an older compiler. + +The repository is structured into: + +* core: Main compiler source code +* cpp: C++ API +* tests: tests of the C++ API, the core and converters +* py: Python API +* notebooks: Example applications built with Torch-TensorRT +* docs: Documentation +* docsrc: Documentation Source +* third_party: BUILD files for dependency libraries +* toolchains: Toolchains for different platforms + + +The C++ API is unstable and subject to change until the library matures, though most work is done under the hood in the core. + +The core has a couple major parts: The top level compiler interface which coordinates ingesting a module, lowering, +converting and generating a new module and returning it back to the user. There are the three main phases of the +compiler, the lowering phase, the conversion phase, and the execution phase. + +.. include:: phases.rst diff --git a/docs/v1.2.0/_sources/contributors/useful_links.rst.txt b/docs/v1.2.0/_sources/contributors/useful_links.rst.txt new file mode 100644 index 0000000000..d5903a16b0 --- /dev/null +++ b/docs/v1.2.0/_sources/contributors/useful_links.rst.txt @@ -0,0 +1,34 @@ +.. _useful_links: + +Useful Links for Torch-TensorRT Development +============================================== + +TensorRT Available Layers and Expected Dimensions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* https://docs.nvidia.com/deeplearning/sdk/tensorrt-support-matrix/index.html#layers-matrix + +TensorRT C++ Documentation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* https://docs.nvidia.com/deeplearning/tensorrt/api/c_api/index.html + +TensorRT Python Documentation (Sometimes easier to read) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/python_api/index.html + +PyTorch Functional API +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* https://pytorch.org/docs/stable/nn.functional.html + +PyTorch native_ops +^^^^^^^^^^^^^^^^^^^^^ + +* https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/native/native_functions.yaml + +PyTorch IR Documentation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* https://github.com/pytorch/pytorch/blob/master/torch/csrc/jit/OVERVIEW.md diff --git a/docs/v1.2.0/_sources/contributors/writing_converters.rst.txt b/docs/v1.2.0/_sources/contributors/writing_converters.rst.txt new file mode 100644 index 0000000000..990c4dc77d --- /dev/null +++ b/docs/v1.2.0/_sources/contributors/writing_converters.rst.txt @@ -0,0 +1,129 @@ +.. _writing_converters: + +Writing Converters +=================== + +Background +------------ + +In the JIT IR, operations are represented as nodes in a graph. A node has inputs and outputs, represented by ``torch::jit::Values`` +which are typed abstract representation of data flowing into and out of a node. TensorRT represents its graph though the +use of ``nvinfer1::ILayers`` and ``nvinfer1::ITensors`` which are its analogues to nodes and values. The goal of +converters create new ILayers and subgraphs that do operation specified by the node and associate produced ITensors +and Values together. + +Converters +------------ + +Converters should be functions which will use a list of inputs (either ``nvinfer1::ITensors`` or ``torch::jit::IValues``) to +construct an equivalent layer to the LibTorch op. + +Converters can be registered using the ``RegisterNodeConversionPatterns`` helper class where you instantiate a +RegisterNodeConversionPatterns object and call the pattern function on it (like below) which takes a string +which describes the function schema of the op that will cause the converter to be run and a lambda or function +which will do the actual conversion: + + Note the pattern function can be chained + +.. code-block:: c++ + + auto acthardtanh TORCHTRT_UNUSED = RegisterNodeConversionPatterns() + .pattern({ + "aten::hardtanh(Tensor self, Scalar min_val=-1, Scalar max_val=1) -> (Tensor)", + [](ConversionCtx* ctx, const torch::jit::Node* n, args& args) -> bool { + auto in = args[0].ITensor(); + auto min = args[1].unwrapToDouble(); + auto max = args[2].unwrapToDouble(); + + auto new_layer = ctx->net->addActivation(*in, nvinfer1::ActivationType::kCLIP); + TORCHTRT_CHECK(new_layer, "Unable to create layer for aten::hardtanh"); + + new_layer->setAlpha(min); + new_layer->setBeta(max); + + new_layer->setName(util::node_info(n).c_str()); + auto out_tensor = ctx->AssociateValueAndTensor(n->outputs()[0], new_layer->getOutput(0)); + + LOG_DEBUG("Output shape: " << out_tensor->getDimensions()); + return true; + } + }); + + +Converter Contract +---------------------- + +What is guaranteed to converters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +1. In the args there will be an entry for each node input value, either a ITensor or IValue +2. Inputs will be provided in order according to the function schema + +Responsibilities of a converter +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +1. Args must be guaranteed to be a type to unwrap the Arg union without checking, typically input tensor arguments can be expected to be ITensors +2. Any weights or static values must guaranteed to be valid until the end of conversion time + + a. A helpful tool is the Weights helper class described below + +3. Converters are expected to produce an IValue or ITensor for each output of a node. The compiler will check this and produce warnings if there are Values that don't have associated ITensors or IValues. +4. Outputs must be annotated + + a. There must be an association between a JIT nodes output values and the new TRT layers output tensors in the ``value_tensor_map`` in the conversion context + +5. Name your layers + + a. Its much easier to debug when we can track which layers and nodes correspond with each other. The system we are currently using is to use the "node info" of the node as the name of the layer + +6. Name your tensors + + a. Use the output value debug name as the name for the new ITensor (again for debugging) + +Conversion Context +-------------------- + +The conversion context maintains the state of conversion, it manages the Network Definition, two maps +one that stores associations between Values and IValues (the evaluated_value_map) and one that stores +associations between Values and ITensors, and any sort of memory that needs to live until the end of +conversion. The main apis that you will interface with in converters is directly accessing the network +definition to add layers ``ctx->net`` and data association functions ``ctx->AssociateValueAndTensor()`` +and ``ctx->AssociateValueAndIValue()``, which you will use to add layers to the TRT layers and log +pairs of node outputs and static values or TensorRT layer outputs. + +Args +------- + +Arguments provided to the converter are inspectable unions of ``nvinfer1::ITensors`` and ``torch::jit::IValues`` (i.e. +abstract dataflow in the TensorRT graph and static values). You are guaranteed that you will have some +argument for each input value for the node. They are provided in the order of the function schema. +It can be expected that inputs (meaning the parameters that would be passed into the forward +function of a module in PyTorch) will be ITensors but the Arg class also has mechanisms to inspect arguments safely +before unwrapping if you are unsure. Args also have deep unwrap methods that let you get straight to the +underlying data in an IValue if you know it's safe. You can also pass in a fallback value if there is a +chance the IValue is None. IValues have been extended to be able to hold a wrapper around ITensors only in the case of TensorLists. +You can get an ITensor from an IValue by a pattern similar to this: ``ivalue.toCustomClass()->tensor()``. +You can tell if an IValue contains a Tensor or an ITensor by using ``ivalue.isTensor()`` or ``ivalue.isCustomClass()``. + + +Weights +-------------- + +Weights are used during build time, so any weights need to be guaranteed to live until the end of the conversion phase. +TensorRT also uses its own weights structure to hold the weights. There is a wrapper around this class available +to converts which abstracts a lot of this. + +The weights wrapper class can accept either ``at::Tensors`` or singular values (right now). You also need to pass the +conversion context when constructing these weights because internally the weights class will allocate memory managed +by the conversion context to store a copy of the tensor data. This data gets freed when the conversion context +destructor gets destroyed so converters don't really need to think about it. + +There is metadata generated from the shape of the input data which becomes useful in interfacing with TensorRT, such +as number of input maps, number of output maps and kernel shape. + +Other advice +-------------- + +You have the benefit of the full aten library when dealing with weights and other static values. This means that you +can do quite a bit of work during conversion time to produce efficient conversion. A good example is batch_norm +converter where the converter does fusion of operations with PyTorch before creating the TensorRT layer. diff --git a/docs/v1.2.0/_sources/getting_started/getting_started_with_cpp_api.rst.txt b/docs/v1.2.0/_sources/getting_started/getting_started_with_cpp_api.rst.txt new file mode 100644 index 0000000000..7f7f60a669 --- /dev/null +++ b/docs/v1.2.0/_sources/getting_started/getting_started_with_cpp_api.rst.txt @@ -0,0 +1,338 @@ +.. _getting_started_cpp: + +Using Torch-TensorRT in C++ +============================== + +If you haven't already, acquire a tarball of the library by following the instructions in :ref:`Installation` + +Using Torch-TensorRT in C++ +*************************** +Torch-TensorRT C++ API accepts TorchScript modules (generated either from ``torch.jit.script`` or ``torch.jit.trace``) as an input and returns +a Torchscript module (optimized using TensorRT). This requires users to use Pytorch (in python) to generate torchscript modules beforehand. +Please refer to `Creating TorchScript modules in Python `_ section to generate torchscript graphs. + + +.. _torch_tensorrt_quickstart: + +[Torch-TensorRT Quickstart] Compiling TorchScript Modules with ``torchtrtc`` +--------------------------------------------------------------------------------- + +An easy way to get started with Torch-TensorRT and to check if your model can be supported without extra work is to run it through +``torchtrtc``, which supports almost all features of the compiler from the command line including post training quantization +(given a previously created calibration cache). For example we can compile our lenet model by setting our preferred operating +precision and input size. This new TorchScript file can be loaded into Python (note: you need to ``import torch_tensorrt`` before loading +these compiled modules because the compiler extends the PyTorch the deserializer and runtime to execute compiled modules). + +.. code-block:: shell + + ❯ torchtrtc -p f16 lenet_scripted.ts trt_lenet_scripted.ts "(1,1,32,32)" + + ❯ python3 + Python 3.6.9 (default, Apr 18 2020, 01:56:04) + [GCC 8.4.0] on linux + Type "help", "copyright", "credits" or "license" for more information. + >>> import torch + >>> import torch_tensorrt + >>> ts_model = torch.jit.load(“trt_lenet_scripted.ts”) + >>> ts_model(torch.randn((1,1,32,32)).to(“cuda”).half()) + +You can learn more about ``torchtrtc`` usage here: :ref:`torchtrtc` + +.. _ts_in_cc: + +Working with TorchScript in C++ +-------------------------------- + +If we are developing an application to deploy with C++, we can save either our traced or scripted module using ``torch.jit.save`` +which will serialize the TorchScript code, weights and other information into a package. This is also where our dependency on Python ends. + +.. code-block:: python + + torch_script_module.save("lenet.jit.pt") + +From here we can now load our TorchScript module in C++ + +.. code-block:: c++ + + #include // One-stop header. + + #include + #include + + int main(int argc, const char* argv[]) { + torch::jit::Module module; + try { + // Deserialize the ScriptModule from a file using torch::jit::load(). + module = torch::jit::load(""); + } + catch (const c10::Error& e) { + std::cerr << "error loading the model\n"; + return -1; + } + + std::cout << "ok\n"; + + +You can do full training and inference in C++ with PyTorch / LibTorch if you would like, you can even define your modules in C++ and +have access to the same powerful tensor library that backs PyTorch. (For more information: https://pytorch.org/cppdocs/). +For instance we can do inference with our LeNet module like this: + +.. code-block:: c++ + + mod.eval(); + torch::Tensor in = torch::randn({1, 1, 32, 32}); + auto out = mod.forward(in); + +and to run on the GPU: + +.. code-block:: c++ + + mod.eval(); + mod.to(torch::kCUDA); + torch::Tensor in = torch::randn({1, 1, 32, 32}, torch::kCUDA); + auto out = mod.forward(in); + +As you can see it is pretty similar to the Python API. When you call the ``forward`` method, you invoke the PyTorch JIT compiler, which will optimize and run your TorchScript code. + +.. _compile_cpp: + +Compiling with Torch-TensorRT in C++ +------------------------------------- +We are also at the point were we can compile and optimize our module with Torch-TensorRT, but instead of in a JIT fashion we must do it ahead-of-time (AOT) i.e. before we start doing actual inference work +since it takes a bit of time to optimize the module, it would not make sense to do this every time you run the module or even the first time you run it. + +With our module loaded, we can feed it into the Torch-TensorRT compiler. When we do so we must provide some information on the expected input size and also configure any additional settings. + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + ... + + mod.to(at::kCUDA); + mod.eval(); + + auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}); + auto trt_mod = torch_tensorrt::CompileGraph(mod, std::vector{{in.sizes()}}); + auto out = trt_mod.forward({in}); + +Thats it! Now the graph runs primarily not with the JIT compiler but using TensorRT (though we execute the graph using the JIT runtime). + +We can also set settings like operating precision to run in FP16. + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + ... + + mod.to(at::kCUDA); + mod.eval(); + + auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}).to(torch::kHALF); + auto input_sizes = std::vector({in.sizes()}); + torch_tensorrt::CompileSpec info(input_sizes); + info.enable_precisions.insert(torch::kHALF); + auto trt_mod = torch_tensorrt::CompileGraph(mod, info); + auto out = trt_mod.forward({in}); + +And now we are running the module in FP16 precision. You can then save the module to load later. + +.. code-block:: c++ + + trt_mod.save("") + +Torch-TensorRT compiled TorchScript modules are loaded in the same way as normal TorchScript module. Make sure your deployment application is linked against ``libtorchtrt.so`` + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + + int main(int argc, const char* argv[]) { + torch::jit::Module module; + try { + // Deserialize the ScriptModule from a file using torch::jit::load(). + module = torch::jit::load(""); + } + catch (const c10::Error& e) { + std::cerr << "error loading the model\n"; + return -1; + } + + torch::Tensor in = torch::randn({1, 1, 32, 32}, torch::kCUDA); + auto out = mod.forward(in); + + std::cout << "ok\n"; + } + +If you want to save the engine produced by Torch-TensorRT to use in a TensorRT application you can use the ``ConvertGraphToTRTEngine`` API. + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + ... + + mod.to(at::kCUDA); + mod.eval(); + + auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}).to(torch::kHALF); + auto input_sizes = std::vector({in.sizes()}); + torch_tensorrt::CompileSpec info(input_sizes); + info.enabled_precisions.insert(torch::kHALF); + auto trt_mod = torch_tensorrt::ConvertGraphToTRTEngine(mod, "forward", info); + std::ofstream out("/tmp/engine_converted_from_jit.trt"); + out << engine; + out.close(); + +.. _under_the_hood: + +Under The Hood +--------------- + +When a module is provided to Torch-TensorRT, the compiler starts by mapping a graph like you saw above to a graph like this: + +.. code-block:: none + + graph(%input.2 : Tensor): + %2 : Float(84, 10) = prim::Constant[value=]() + %3 : Float(120, 84) = prim::Constant[value=]() + %4 : Float(576, 120) = prim::Constant[value=]() + %5 : int = prim::Constant[value=-1]() # x.py:25:0 + %6 : int[] = prim::Constant[value=annotate(List[int], [])]() + %7 : int[] = prim::Constant[value=[2, 2]]() + %8 : int[] = prim::Constant[value=[0, 0]]() + %9 : int[] = prim::Constant[value=[1, 1]]() + %10 : bool = prim::Constant[value=1]() # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0 + %11 : int = prim::Constant[value=1]() # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0 + %12 : bool = prim::Constant[value=0]() # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0 + %self.classifer.fc3.bias : Float(10) = prim::Constant[value= 0.0464 0.0383 0.0678 0.0932 0.1045 -0.0805 -0.0435 -0.0818 0.0208 -0.0358 [ CUDAFloatType{10} ]]() + %self.classifer.fc2.bias : Float(84) = prim::Constant[value=]() + %self.classifer.fc1.bias : Float(120) = prim::Constant[value=]() + %self.feat.conv2.weight : Float(16, 6, 3, 3) = prim::Constant[value=]() + %self.feat.conv2.bias : Float(16) = prim::Constant[value=]() + %self.feat.conv1.weight : Float(6, 1, 3, 3) = prim::Constant[value=]() + %self.feat.conv1.bias : Float(6) = prim::Constant[value= 0.0530 -0.1691 0.2802 0.1502 0.1056 -0.1549 [ CUDAFloatType{6} ]]() + %input0.4 : Tensor = aten::_convolution(%input.2, %self.feat.conv1.weight, %self.feat.conv1.bias, %9, %8, %9, %12, %8, %11, %12, %12, %10) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0 + %input0.5 : Tensor = aten::relu(%input0.4) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0 + %input1.2 : Tensor = aten::max_pool2d(%input0.5, %7, %6, %8, %9, %12) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0 + %input0.6 : Tensor = aten::_convolution(%input1.2, %self.feat.conv2.weight, %self.feat.conv2.bias, %9, %8, %9, %12, %8, %11, %12, %12, %10) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0 + %input2.1 : Tensor = aten::relu(%input0.6) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0 + %x.1 : Tensor = aten::max_pool2d(%input2.1, %7, %6, %8, %9, %12) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0 + %input.1 : Tensor = aten::flatten(%x.1, %11, %5) # x.py:25:0 + %27 : Tensor = aten::matmul(%input.1, %4) + %28 : Tensor = trt::const(%self.classifer.fc1.bias) + %29 : Tensor = aten::add_(%28, %27, %11) + %input0.2 : Tensor = aten::relu(%29) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0 + %31 : Tensor = aten::matmul(%input0.2, %3) + %32 : Tensor = trt::const(%self.classifer.fc2.bias) + %33 : Tensor = aten::add_(%32, %31, %11) + %input1.1 : Tensor = aten::relu(%33) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0 + %35 : Tensor = aten::matmul(%input1.1, %2) + %36 : Tensor = trt::const(%self.classifer.fc3.bias) + %37 : Tensor = aten::add_(%36, %35, %11) + return (%37) + (CompileGraph) + +The graph has now been transformed from a collection of modules, each managing their own parameters into a single graph with the parameters inlined +into the graph and all of the operations laid out. Torch-TensorRT has also executed a number of optimizations and mappings to make the graph easier to translate to TensorRT. +From here the compiler can assemble the TensorRT engine by following the dataflow through the graph. + +When the graph construction phase is complete, Torch-TensorRT produces a serialized TensorRT engine. From here depending on the API, this engine is returned +to the user or moves into the graph construction phase. Here Torch-TensorRT creates a JIT Module to execute the TensorRT engine which will be instantiated and managed +by the Torch-TensorRT runtime. + +Here is the graph that you get back after compilation is complete: + +.. code-block:: none + + graph(%self_1 : __torch__.lenet, %input_0 : Tensor): + %1 : ...trt.Engine = prim::GetAttr[name="lenet"](%self_1) + %3 : Tensor[] = prim::ListConstruct(%input_0) + %4 : Tensor[] = trt::execute_engine(%3, %1) + %5 : Tensor = prim::ListUnpack(%4) + return (%5) + + +You can see the call where the engine is executed, after extracting the attribute containing the engine and constructing a list of inputs, then returns the tensors back to the user. + +.. _unsupported_ops: + +Working with Unsupported Operators +----------------------------------- + +Torch-TensorRT is a new library and the PyTorch operator library is quite large, so there will be ops that aren't supported natively by the compiler. You can either use the composition techinques +shown above to make modules are fully Torch-TensorRT supported and ones that are not and stitch the modules together in the deployment application or you can register converters for missing ops. + + You can check support without going through the full compilation pipleine using the ``torch_tensorrt::CheckMethodOperatorSupport(const torch::jit::Module& module, std::string method_name)`` api + to see what operators are not supported. ``torchtrtc`` automatically checks modules with this method before starting compilation and will print out a list of operators that are not supported. + +.. _custom_converters: + +Registering Custom Converters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Operations are mapped to TensorRT through the use of modular converters, a function that takes a node from a the JIT graph and produces an equivalent layer or subgraph in TensorRT. +Torch-TensorRT ships with a library of these converters stored in a registry, that will be executed depending on the node being parsed. For instance a ``aten::relu(%input0.4)`` instruction will trigger +the relu converter to be run on it, producing an activation layer in the TensorRT graph. But since this library is not exhaustive you may need to write your own to get Torch-TensorRT +to support your module. + +Shipped with the Torch-TensorRT distribution are the internal core API headers. You can therefore access the converter registry and add a converter for the op you need. + +For example, if we try to compile a graph with a build of Torch-TensorRT that doesn't support the flatten operation (``aten::flatten``) you may see this error: + +.. code-block:: none + + terminate called after throwing an instance of 'torch_tensorrt::Error' + what(): [enforce fail at core/conversion/conversion.cpp:109] Expected converter to be true but got false + Unable to convert node: %input.1 : Tensor = aten::flatten(%x.1, %11, %5) # x.py:25:0 (conversion.AddLayer) + Schema: aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor) + Converter for aten::flatten requested, but no such converter was found. + If you need a converter for this operator, you can try implementing one yourself + or request a converter: https://www.github.com/NVIDIA/Torch-TensorRT/issues + +We can register a converter for this operator in our application. All of the tools required to build a converter can be imported by including ``torch_tensorrt/core/conversion/converters/converters.h``. +We start by creating an instance of the self-registering class ``torch_tensorrt::core::conversion::converters::RegisterNodeConversionPatterns()`` which will register converters +in the global converter registry, associating a function schema like ``aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor)`` with a lambda that +will take the state of the conversion, the node/operation in question to convert and all of the inputs to the node and produces as a side effect a new layer in the TensorRT network. +Arguments are passed as a vector of inspectable unions of TensorRT ``ITensors`` and Torch ``IValues`` in the order arguments are listed in the schema. + +Below is a implementation of a ``aten::flatten`` converter that we can use in our application. You have full access to the Torch and TensorRT libraries in the converter implementation. So +for example we can quickly get the output size by just running the operation in PyTorch instead of implementing the full calculation outself like we do below for this flatten converter. + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + #include "torch_tensorrt/core/conversion/converters/converters.h" + + static auto flatten_converter = torch_tensorrt::core::conversion::converters::RegisterNodeConversionPatterns() + .pattern({ + "aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor)", + [](torch_tensorrt::core::conversion::ConversionCtx* ctx, + const torch::jit::Node* n, + torch_tensorrt::core::conversion::converters::args& args) -> bool { + auto in = args[0].ITensor(); + auto start_dim = args[1].unwrapToInt(); + auto end_dim = args[2].unwrapToInt(); + auto in_shape = torch_tensorrt::core::util::toVec(in->getDimensions()); + auto out_shape = torch::flatten(torch::rand(in_shape), start_dim, end_dim).sizes(); + + auto shuffle = ctx->net->addShuffle(*in); + shuffle->setReshapeDimensions(torch_tensorrt::core::util::toDims(out_shape)); + shuffle->setName(torch_tensorrt::core::util::node_info(n).c_str()); + + auto out_tensor = ctx->AssociateValueAndTensor(n->outputs()[0], shuffle->getOutput(0)); + return true; + } + }); + + int main() { + ... + +To use this converter in Python, it is recommended to use PyTorch's `C++ / CUDA Extention `_ +template to wrap your library of converters into a ``.so`` that you can load with ``ctypes.CDLL()`` in your Python application. + +You can find more information on all the details of writing converters in the contributors documentation (:ref:`writing_converters`). +If you find yourself with a large library of converter implementations, do consider upstreaming them, PRs are welcome and it would be great for the community to benefit as well. diff --git a/docs/v1.2.0/_sources/getting_started/getting_started_with_python_api.rst.txt b/docs/v1.2.0/_sources/getting_started/getting_started_with_python_api.rst.txt new file mode 100644 index 0000000000..fece176156 --- /dev/null +++ b/docs/v1.2.0/_sources/getting_started/getting_started_with_python_api.rst.txt @@ -0,0 +1,58 @@ +.. _getting_started_with_python_api: + +Using Torch-TensorRT in Python +******************************* + +The Torch-TensorRT Python API supports a number of unique usecases compared to the CLI and C++ APIs which solely support TorchScript compilation. + +Torch-TensorRT Python API can accept a ``torch.nn.Module``, ``torch.jit.ScriptModule``, or ``torch.fx.GraphModule`` as an input. +Depending on what is provided one of the two frontends (TorchScript or FX) will be selected to compile the module. Provided the +module type is supported, users may explicitly set which frontend they would like to use using the ``ir`` flag for ``compile``. +If given a ``torch.nn.Module`` and the ``ir`` flag is set to either ``default`` or ``torchscript`` the module will be run through +``torch.jit.script`` to convert the input module into a TorchScript module. + + +To compile your input ``torch.nn.Module`` with Torch-TensorRT, all you need to do is provide the module and inputs +to Torch-TensorRT and you will be returned an optimized TorchScript module to run or add into another PyTorch module. Inputs +is a list of ``torch_tensorrt.Input`` classes which define input's shape, datatype and memory format. You can also specify settings such as +operating precision for the engine or target device. After compilation you can save the module just like any other module +to load in a deployment application. In order to load a TensorRT/TorchScript module, make sure you first import ``torch_tensorrt``. + +.. code-block:: python + + import torch_tensorrt + + ... + + model = MyModel().eval() # torch module needs to be in eval (not training) mode + + inputs = [ + torch_tensorrt.Input( + min_shape=[1, 1, 16, 16], + opt_shape=[1, 1, 32, 32], + max_shape=[1, 1, 64, 64], + dtype=torch.half, + ) + ] + enabled_precisions = {torch.float, torch.half} # Run with fp16 + + trt_ts_module = torch_tensorrt.compile( + model, inputs=inputs, enabled_precisions=enabled_precisions + ) + + input_data = input_data.to("cuda").half() + result = trt_ts_module(input_data) + torch.jit.save(trt_ts_module, "trt_ts_module.ts") + +.. code-block:: python + + # Deployment application + import torch + import torch_tensorrt + + trt_ts_module = torch.jit.load("trt_ts_module.ts") + input_data = input_data.to("cuda").half() + result = trt_ts_module(input_data) + +Torch-TensorRT Python API also provides ``torch_tensorrt.ts.compile`` which accepts a TorchScript module as input and ``torch_tensorrt.fx.compile`` which accepts a FX GraphModule as input. + diff --git a/docs/v1.2.0/_sources/getting_started/getting_started_with_windows.rst.txt b/docs/v1.2.0/_sources/getting_started/getting_started_with_windows.rst.txt new file mode 100644 index 0000000000..04eba960e0 --- /dev/null +++ b/docs/v1.2.0/_sources/getting_started/getting_started_with_windows.rst.txt @@ -0,0 +1,78 @@ +.. _getting_started_windows: + +Building Torch-TensorRT on Windows +==================================== + +Torch-TensorRT has community support for Windows platform using CMake + +Prerequisite: + +* Microsoft Visual Studio +* LibTorch +* TensorRT +* CUDA +* cuDNN + + +Build configuration +------------------- + +* Open Microsoft Visual Studio +* Open Torch-TensorRT source code folder +* Open Manage configurations -> Edit JSON to open CMakeSettings.json file. +* Configure the CMake build configurations. Following is an example configuration: + +.. code-block:: none + + { + "configurations": [ + { + "name": "x64-Debug", + "generator": "Ninja", + "configurationType": "Debug", + "inheritEnvironments": [ "msvc_x64_x64" ], + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "-S . -B out", + "buildCommandArgs": "cmake --build out", + "ctestCommandArgs": "", + "variables": [ + { + "name": "CMAKE_MODULE_PATH", + "value": "$PWD\cmake\Modules", + "type": "FILEPATH" + }, + { + "name": "Torch_DIR", + "value": "\share\cmake\Torch", + "type": "FILEPATH" + }, + { + "name": "TensorRT_ROOT", + "value": "", + "type": "FILEPATH" + }, + { + "name": "CMAKE_BUILD_TYPE", + "value": "Release", + "type": " STRING" + } + ] + } + ] + } + + +Compilation +----------- + +* Click Build -> Build All or directly press Ctrl + Shift + B + +Note: After successful compilation, the build artifacts will be present at buildRoot path configured. + +Installation +------------ + +* Build -> Install Torch-TensorRT + +Note: After successful installation, the artifacts will be present at installRoot. \ No newline at end of file diff --git a/docs/v1.2.0/_sources/getting_started/installation.rst.txt b/docs/v1.2.0/_sources/getting_started/installation.rst.txt new file mode 100644 index 0000000000..937dd1dde9 --- /dev/null +++ b/docs/v1.2.0/_sources/getting_started/installation.rst.txt @@ -0,0 +1,362 @@ +.. _installation: + +Installation +============= + +Precompiled Binaries +********************* + +Dependencies +--------------- + +You need to have either PyTorch or LibTorch installed based on if you are using Python or C++ +and you must have CUDA, cuDNN and TensorRT installed. + + * https://www.pytorch.org + * https://developer.nvidia.com/cuda + * https://developer.nvidia.com/cudnn + * https://developer.nvidia.com/tensorrt + + +Python Package +--------------- + +You can install the python package using + +.. code-block:: sh + + pip3 install torch-tensorrt -f https://github.com/pytorch/TensorRT/releases + +.. _bin-dist: + +C++ Binary Distribution +------------------------ + +Precompiled tarballs for releases are provided here: https://github.com/pytorch/TensorRT/releases + +.. _compile-from-source: + +Compiling From Source +****************************************** + +.. _installing-deps: + +Dependencies for Compilation +------------------------------- + +Torch-TensorRT is built with Bazel, so begin by installing it. + + * The easiest way is to install bazelisk using the method of your choosing https://github.com/bazelbuild/bazelisk + * Otherwise you can use the following instructions to install binaries https://docs.bazel.build/versions/master/install.html + * Finally if you need to compile from source (e.g. aarch64 until bazel distributes binaries for the architecture) you can use these instructions + + .. code-block:: shell + + export BAZEL_VERSION=$(cat /.bazelversion) + mkdir bazel + cd bazel + curl -fSsL -O https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-dist.zip + unzip bazel-$BAZEL_VERSION-dist.zip + bash ./compile.sh + cp output/bazel /usr/local/bin/ + + +You will also need to have CUDA installed on the system (or if running in a container, the system must have +the CUDA driver installed and the container must have CUDA) + +The correct LibTorch version will be pulled down for you by bazel. + + NOTE: For best compatability with official PyTorch, use torch==1.10.0+cuda113, TensorRT 8.0 and cuDNN 8.2 for CUDA 11.3 however Torch-TensorRT itself supports + TensorRT and cuDNN for other CUDA versions for usecases such as using NVIDIA compiled distributions of PyTorch that use other versions of CUDA + e.g. aarch64 or custom compiled version of PyTorch. + +.. _abis: + +Choosing the Right ABI +^^^^^^^^^^^^^^^^^^^^^^^^ + +Likely the most complicated thing about compiling Torch-TensorRT is selecting the correct ABI. There are two options +which are incompatible with each other, pre-cxx11-abi and the cxx11-abi. The complexity comes from the fact that while +the most popular distribution of PyTorch (wheels downloaded from pytorch.org/pypi directly) use the pre-cxx11-abi, most +other distributions you might encounter (e.g. ones from NVIDIA - NGC containers, and builds for Jetson as well as certain +libtorch builds and likely if you build PyTorch from source) use the cxx11-abi. It is important you compile Torch-TensorRT +using the correct ABI to function properly. Below is a table with general pairings of PyTorch distribution sources and the +recommended commands: + ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| PyTorch Source | Recommended C++ Compilation Command | Recommended Python Compilation Command | ++=============================================================+==========================================================+====================================================================+ +| PyTorch whl file from PyTorch.org | bazel build //:libtorchtrt -c opt --config pre_cxx11_abi | python3 setup.py bdist_wheel | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| libtorch-shared-with-deps-*.zip from PyTorch.org | bazel build //:libtorchtrt -c opt --config pre_cxx11_abi | python3 setup.py bdist_wheel | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| libtorch-cxx11-abi-shared-with-deps-*.zip from PyTorch.org | bazel build //:libtorchtrt -c opt | python3 setup.py bdist_wheel --use-cxx11-abi | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| PyTorch preinstalled in an NGC container | bazel build //:libtorchtrt -c opt | python3 setup.py bdist_wheel --use-cxx11-abi | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| PyTorch from the NVIDIA Forums for Jetson | bazel build //:libtorchtrt -c opt | python3 setup.py bdist_wheel --jetpack-version 4.6 --use-cxx11-abi | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| PyTorch built from Source | bazel build //:libtorchtrt -c opt | python3 setup.py bdist_wheel --use-cxx11-abi | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ + + NOTE: For all of the above cases you must correctly declare the source of PyTorch you intend to use in your WORKSPACE file for both Python and C++ builds. See below for more information + +You then have two compilation options: + +.. _build-from-archive: + +**Building using cuDNN & TensorRT tarball distributions** +-------------------------------------------------------------- + + This is recommended so as to build Torch-TensorRT hermetically and insures any compilation errors are not caused by version issues + + Make sure when running Torch-TensorRT that these versions of the libraries are prioritized in your ``$LD_LIBRARY_PATH`` + +You need to download the tarball distributions of TensorRT and cuDNN from the NVIDIA website. + * https://developer.nvidia.com/cudnn + * https://developer.nvidia.com/tensorrt + +Place these files in a directory (the directories ``third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu]`` exist for this purpose) + +Then compile referencing the directory with the tarballs + + If you get errors regarding the packages, check their sha256 hashes and make sure they match the ones listed in ``WORKSPACE`` + +Release Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: shell + + bazel build //:libtorchtrt -c opt --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu] + +A tarball with the include files and library can then be found in ``bazel-bin`` + +.. _build-from-archive-debug: + +Debug Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +To build with debug symbols use the following command + +.. code-block:: shell + + bazel build //:libtorchtrt -c dbg --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu] + +A tarball with the include files and library can then be found in ``bazel-bin`` + +Pre CXX11 ABI Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +To build using the pre-CXX11 ABI use the ``pre_cxx11_abi`` config + +.. code-block:: shell + + bazel build //:libtorchtrt --config pre_cxx11_abi -c [dbg/opt] --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu] + +A tarball with the include files and library can then be found in ``bazel-bin`` + +.. _build-from-local: + +**Building using locally installed cuDNN & TensorRT** +-------------------------------------------------------------- + + If you encounter bugs and you compiled using this method please disclose that you used local sources in the issue (an ldd dump would be nice too) + +Install TensorRT, CUDA and cuDNN on the system before starting to compile. + +In WORKSPACE comment out: + +.. code-block:: python + + # Downloaded distributions to use with --distdir + http_archive( + name="cudnn", + urls=[ + "", + ], + build_file="@//third_party/cudnn/archive:BUILD", + sha256="", + strip_prefix="cuda", + ) + + http_archive( + name="tensorrt", + urls=[ + "", + ], + build_file="@//third_party/tensorrt/archive:BUILD", + sha256="", + strip_prefix="TensorRT-", + ) + +and uncomment + +.. code-block:: python + + # Locally installed dependencies + new_local_repository( + name="cudnn", path="/usr/", build_file="@//third_party/cudnn/local:BUILD" + ) + + new_local_repository( + name="tensorrt", path="/usr/", build_file="@//third_party/tensorrt/local:BUILD" + ) + +Release Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +Compile using: + +.. code-block:: shell + + bazel build //:libtorchtrt -c opt + +A tarball with the include files and library can then be found in ``bazel-bin`` + +.. _build-from-local-debug: + +Debug Build +^^^^^^^^^^^^ + +To build with debug symbols use the following command + +.. code-block:: shell + + bazel build //:libtorchtrt -c dbg + + +A tarball with the include files and library can then be found in ``bazel-bin`` + +Pre CXX11 ABI Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +To build using the pre-CXX11 ABI use the ``pre_cxx11_abi`` config + +.. code-block:: shell + + bazel build //:libtorchtrt --config pre_cxx11_abi -c [dbg/opt] + +**Building with CMake** +----------------------- + +It is possible to build the API libraries (in cpp/) and the torchtrtc executable using CMake instead of Bazel. +Currently, the python API and the tests cannot be built with CMake. +Begin by installing CMake. + + * Latest releases of CMake and instructions on how to install are available for different platforms + [on their website](https://cmake.org/download/). + +A few useful CMake options include: + + * CMake finders for TensorRT and cuDNN are provided in `cmake/Modules`. In order for CMake to use them, pass + `-DCMAKE_MODULE_PATH=cmake/Modules` when configuring the project with CMake. + * Libtorch provides its own CMake finder. In case CMake doesn't find it, pass the path to your install of + libtorch with `-DTorch_DIR=/share/cmake/Torch` + * If TensorRT is not found with the provided cmake finder, specify `-DTensorRT_ROOT=` + * Finally, configure and build the project in a build directory of your choice with the following command + from the root of Torch-TensorRT project: + + .. code-block:: shell + + cmake -S. -B \ + [-DCMAKE_MODULE_PATH=cmake/Module] \ + [-DTorch_DIR=/share/cmake/Torch] \ + [-DTensorRT_ROOT=] \ + [-DCMAKE_BUILD_TYPE=Debug|Release] + cmake --build + +**Building the Python package** +-------------------------------- + +Begin by installing ``ninja`` + +You can build the Python package using ``setup.py`` (this will also build the correct version of ``libtorchtrt.so``) + +.. code-block:: shell + + python3 setup.py [install/bdist_wheel] + +Debug Build +^^^^^^^^^^^^ + +.. code-block:: shell + + python3 setup.py develop [--user] + +This also compiles a debug build of ``libtorchtrt.so`` + +**Building Natively on aarch64 (Jetson)** +------------------------------------------- + +Prerequisites +^^^^^^^^^^^^^^ + +Install or compile a build of PyTorch/LibTorch for aarch64 + +NVIDIA hosts builds the latest release branch for Jetson here: + + https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-10-now-available/72048 + + +Enviorment Setup +^^^^^^^^^^^^^^^^^ + +To build natively on aarch64-linux-gnu platform, configure the ``WORKSPACE`` with local available dependencies. + +1. Replace ``WORKSPACE`` with the corresponding WORKSPACE file in ``//toolchains/jp_workspaces`` + +2. Configure the correct paths to directory roots containing local dependencies in the ``new_local_repository`` rules: + + NOTE: If you installed PyTorch using a pip package, the correct path is the path to the root of the python torch package. + In the case that you installed with ``sudo pip install`` this will be ``/usr/local/lib/python3.8/dist-packages/torch``. + In the case you installed with ``pip install --user`` this will be ``$HOME/.local/lib/python3.8/site-packages/torch``. + +In the case you are using NVIDIA compiled pip packages, set the path for both libtorch sources to the same path. This is because unlike +PyTorch on x86_64, NVIDIA aarch64 PyTorch uses the CXX11-ABI. If you compiled for source using the pre_cxx11_abi and only would like to +use that library, set the paths to the same path but when you compile make sure to add the flag ``--config=pre_cxx11_abi`` + +.. code-block:: shell + + new_local_repository( + name = "libtorch", + path = "/usr/local/lib/python3.8/dist-packages/torch", + build_file = "third_party/libtorch/BUILD" + ) + + new_local_repository( + name = "libtorch_pre_cxx11_abi", + path = "/usr/local/lib/python3.8/dist-packages/torch", + build_file = "third_party/libtorch/BUILD" + ) + + +Compile C++ Library and Compiler CLI +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + NOTE: Due to shifting dependency locations between Jetpack 4.5 and 4.6 there is a now a flag to inform bazel of the Jetpack version + + .. code-block:: shell + + --platforms //toolchains:jetpack_x.x + + +Compile Torch-TensorRT library using bazel command: + +.. code-block:: shell + + bazel build //:libtorchtrt --platforms //toolchains:jetpack_5.0 + +Compile Python API +^^^^^^^^^^^^^^^^^^^^ + + NOTE: Due to shifting dependencies locations between Jetpack 4.5 and newer Jetpack verisons there is now a flag for ``setup.py`` which sets the jetpack version (default: 5.0) + +Compile the Python API using the following command from the ``//py`` directory: + +.. code-block:: shell + + python3 setup.py install --use-cxx11-abi + +If you have a build of PyTorch that uses Pre-CXX11 ABI drop the ``--use-cxx11-abi`` flag + +If you are building for Jetpack 4.5 add the ``--jetpack-version 5.0`` flag diff --git a/docs/v1.2.0/_sources/index.rst.txt b/docs/v1.2.0/_sources/index.rst.txt new file mode 100644 index 0000000000..c0de8dd400 --- /dev/null +++ b/docs/v1.2.0/_sources/index.rst.txt @@ -0,0 +1,139 @@ +.. Torch-TensorRT documentation master file, created by + sphinx-quickstart on Mon May 4 13:43:16 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Torch-TensorRT +============== +Ahead-of-time compilation of TorchScript / PyTorch JIT for NVIDIA GPUs +----------------------------------------------------------------------- +Torch-TensorRT is a compiler for PyTorch/TorchScript, targeting NVIDIA GPUs via NVIDIA's TensorRT Deep Learning Optimizer and Runtime. +Unlike PyTorch's Just-In-Time (JIT) compiler, Torch-TensorRT is an Ahead-of-Time (AOT) compiler, meaning that before you deploy your +TorchScript code, you go through an explicit compile step to convert a standard TorchScript program into an module targeting +a TensorRT engine. Torch-TensorRT operates as a PyTorch extention and compiles modules that integrate into the JIT runtime seamlessly. +After compilation using the optimized graph should feel no different than running a TorchScript module. +You also have access to TensorRT's suite of configurations at compile time, so you are able to specify +operating precision (FP32/FP16/INT8) and other settings for your module. + +More Information / System Architecture: + +* `GTC 2020 Talk `_ + +Getting Started +---------------- +* :ref:`installation` +* :ref:`getting_started_with_python_api` +* :ref:`getting_started_cpp` + +.. toctree:: + :caption: Getting Started + :maxdepth: 1 + :hidden: + + getting_started/installation + getting_started/getting_started_with_python_api + getting_started/getting_started_with_cpp_api + + +Tutorials +------------ +* :ref:`creating_a_ts_mod` +* :ref:`getting_started_with_fx` +* :ref:`ptq` +* :ref:`runtime` +* :ref:`serving_torch_tensorrt_with_triton` +* :ref:`use_from_pytorch` +* :ref:`using_dla` +* :ref:`notebooks` + +.. toctree:: + :caption: Tutorials + :maxdepth: 1 + :hidden: + + tutorials/creating_torchscript_module_in_python + tutorials/getting_started_with_fx_path + tutorials/ptq + tutorials/runtime + tutorials/serving_torch_tensorrt_with_triton + tutorials/use_from_pytorch + tutorials/using_dla + tutorials/notebooks + +Python API Documenation +------------------------ +* :ref:`torch_tensorrt_py` +* :ref:`torch_tensorrt_logging_py` +* :ref:`torch_tensorrt_ptq_py` +* :ref:`torch_tensorrt_ts_py` +* :ref:`torch_tensorrt_fx_py` + +.. toctree:: + :caption: Python API Documenation + :maxdepth: 0 + :hidden: + + py_api/torch_tensorrt + py_api/logging + py_api/ptq + py_api/ts + py_api/fx + +C++ API Documenation +---------------------- +* :ref:`namespace_torch_tensorrt` +* :ref:`namespace_torch_tensorrt__logging` +* :ref:`namespace_torch_tensorrt__ptq` +* :ref:`namespace_torch_tensorrt__torchscript` + + +.. toctree:: + :caption: C++ API Documenation + :maxdepth: 1 + :hidden: + + _cpp_api/torch_tensort_cpp + _cpp_api/namespace_torch_tensorrt + _cpp_api/namespace_torch_tensorrt__logging + _cpp_api/namespace_torch_tensorrt__torchscript + _cpp_api/namespace_torch_tensorrt__ptq + +CLI Documentation +--------------------- +* :ref:`torchtrtc` + +.. toctree:: + :caption: CLI Documenation + :maxdepth: 0 + :hidden: + + cli/torchtrtc + + +Contributor Documentation +-------------------------------- +* :ref:`system_overview` +* :ref:`writing_converters` +* :ref:`useful_links` + +.. toctree:: + :caption: Contributor Documentation + :maxdepth: 1 + :hidden: + + contributors/system_overview + contributors/writing_converters + contributors/useful_links + +Indices +---------------- +* :ref:`supported_ops` +* :ref:`genindex` +* :ref:`search` + +.. toctree:: + :caption: Indices + :maxdepth: 1 + :hidden: + + indices/supported_ops diff --git a/docs/v1.2.0/_sources/indices/supported_ops.rst.txt b/docs/v1.2.0/_sources/indices/supported_ops.rst.txt new file mode 100644 index 0000000000..0367c02710 --- /dev/null +++ b/docs/v1.2.0/_sources/indices/supported_ops.rst.txt @@ -0,0 +1,285 @@ + +.. _supported_ops: + +================================= +Operators Supported +================================= + + +Operators Currently Supported Through Converters +------------------------------------------------- + +- aten::_convolution(Tensor input, Tensor weight, Tensor? bias, int[] stride, int[] padding, int[] dilation, bool transposed, int[] output_padding, int groups, bool benchmark, bool deterministic, bool cudnn_enabled, bool allow_tf32) -> (Tensor) +- aten::_convolution.deprecated(Tensor input, Tensor weight, Tensor? bias, int[] stride, int[] padding, int[] dilation, bool transposed, int[] output_padding, int groups, bool benchmark, bool deterministic, bool cudnn_enabled) -> (Tensor) +- aten::abs(Tensor self) -> (Tensor) +- aten::acos(Tensor self) -> (Tensor) +- aten::acosh(Tensor self) -> (Tensor) +- aten::adaptive_avg_pool1d(Tensor self, int[1] output_size) -> (Tensor) +- aten::adaptive_avg_pool2d(Tensor self, int[2] output_size) -> (Tensor) +- aten::adaptive_avg_pool3d(Tensor self, int[3] output_size) -> (Tensor) +- aten::adaptive_max_pool1d(Tensor self, int[2] output_size) -> (Tensor, Tensor) +- aten::adaptive_max_pool2d(Tensor self, int[2] output_size) -> (Tensor, Tensor) +- aten::adaptive_max_pool3d(Tensor self, int[3] output_size) -> (Tensor, Tensor) +- aten::add.Scalar(Tensor self, Scalar other, Scalar alpha=1) -> (Tensor) +- aten::add.Tensor(Tensor self, Tensor other, Scalar alpha=1) -> (Tensor) +- aten::add_.Tensor(Tensor(a!) self, Tensor other, *, Scalar alpha=1) -> (Tensor(a!)) +- aten::argmax(Tensor self, int dim, bool keepdim=False) -> (Tensor) +- aten::argmin(Tensor self, int dim, bool keepdim=False) -> (Tensor) +- aten::asin(Tensor self) -> (Tensor) +- aten::asinh(Tensor self) -> (Tensor) +- aten::atan(Tensor self) -> (Tensor) +- aten::atanh(Tensor self) -> (Tensor) +- aten::avg_pool1d(Tensor self, int[1] kernel_size, int[1] stride=[], int[1] padding=[0], bool ceil_mode=False, bool count_include_pad=True) -> (Tensor) +- aten::avg_pool2d(Tensor self, int[2] kernel_size, int[2] stride=[], int[2] padding=[0, 0], bool ceil_mode=False, bool count_include_pad=True, int? divisor_override=None) -> (Tensor) +- aten::avg_pool3d(Tensor self, int[3] kernel_size, int[3] stride=[], int[3] padding=[], bool ceil_mode=False, bool count_include_pad=True, int? divisor_override=None) -> (Tensor) +- aten::batch_norm(Tensor input, Tensor? gamma, Tensor? beta, Tensor? mean, Tensor? var, bool training, float momentum, float eps, bool cudnn_enabled) -> (Tensor) +- aten::bitwise_not(Tensor self) -> (Tensor) +- aten::bmm(Tensor self, Tensor mat2) -> (Tensor) +- aten::cat(Tensor[] tensors, int dim=0) -> (Tensor) +- aten::ceil(Tensor self) -> (Tensor) +- aten::clamp(Tensor self, Scalar? min=None, Scalar? max=None) -> (Tensor) +- aten::clamp_max(Tensor self, Scalar max) -> (Tensor) +- aten::clamp_min(Tensor self, Scalar min) -> (Tensor) +- aten::constant_pad_nd(Tensor self, int[] pad, Scalar value=0) -> (Tensor) +- aten::cos(Tensor self) -> (Tensor) +- aten::cosh(Tensor self) -> (Tensor) +- aten::cumsum(Tensor self, int dim, *, int? dtype=None) -> (Tensor) +- aten::div.Scalar(Tensor self, Scalar other) -> (Tensor) +- aten::div.Tensor(Tensor self, Tensor other) -> (Tensor) +- aten::div.Tensor_mode(Tensor self, Tensor other, *, str? rounding_mode) -> (Tensor) +- aten::div_.Scalar(Tensor(a!) self, Scalar other) -> (Tensor(a!)) +- aten::div_.Tensor(Tensor(a!) self, Tensor other) -> (Tensor(a!)) +- aten::elu(Tensor self, Scalar alpha=1, Scalar scale=1, Scalar input_scale=1) -> (Tensor) +- aten::embedding(Tensor weight, Tensor indices, int padding_idx=-1, bool scale_grad_by_freq=False, bool sparse=False) -> (Tensor) +- aten::eq.Scalar(Tensor self, Scalar other) -> (Tensor) +- aten::eq.Tensor(Tensor self, Tensor other) -> (Tensor) +- aten::erf(Tensor self) -> (Tensor) +- aten::exp(Tensor self) -> (Tensor) +- aten::expand(Tensor(a) self, int[] size, *, bool implicit=False) -> (Tensor(a)) +- aten::expand_as(Tensor(a) self, Tensor other) -> (Tensor(a)) +- aten::fake_quantize_per_channel_affine(Tensor self, Tensor scale, Tensor zero_point, int axis, int quant_min, int quant_max) -> (Tensor) +- aten::fake_quantize_per_tensor_affine(Tensor self, float scale, int zero_point, int quant_min, int quant_max) -> (Tensor) +- aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor) +- aten::floor(Tensor self) -> (Tensor) +- aten::floor_divide(Tensor self, Tensor other) -> (Tensor) +- aten::floor_divide.Scalar(Tensor self, Scalar other) -> (Tensor) +- aten::ge.Scalar(Tensor self, Scalar other) -> (Tensor) +- aten::ge.Tensor(Tensor self, Tensor other) -> (Tensor) +- aten::gru_cell(Tensor input, Tensor hx, Tensor w_ih, Tensor w_hh, Tensor? b_ih=None, Tensor? b_hh=None) -> (Tensor) +- aten::gt.Scalar(Tensor self, Scalar other) -> (Tensor) +- aten::gt.Tensor(Tensor self, Tensor other) -> (Tensor) +- aten::hardtanh(Tensor self, Scalar min_val=-1, Scalar max_val=1) -> (Tensor) +- aten::hardtanh_(Tensor(a!) self, Scalar min_val=-1, Scalar max_val=1) -> (Tensor(a!)) +- aten::index.Tensor(Tensor self, Tensor?[] indices) -> (Tensor) +- aten::instance_norm(Tensor input, Tensor? weight, Tensor? bias, Tensor? running_mean, Tensor? running_var, bool use_input_stats, float momentum, float eps, bool cudnn_enabled) -> (Tensor) +- aten::layer_norm(Tensor input, int[] normalized_shape, Tensor? gamma, Tensor? beta, float eps, bool cudnn_enabled) -> (Tensor) +- aten::le.Scalar(Tensor self, Scalar other) -> (Tensor) +- aten::le.Tensor(Tensor self, Tensor other) -> (Tensor) +- aten::leaky_relu(Tensor self, Scalar negative_slope=0.01) -> (Tensor) +- aten::leaky_relu_(Tensor(a!) self, Scalar negative_slope=0.01) -> (Tensor(a!)) +- aten::linear(Tensor input, Tensor weight, Tensor? bias=None) -> (Tensor) +- aten::log(Tensor self) -> (Tensor) +- aten::lstm_cell(Tensor input, Tensor[] hx, Tensor w_ih, Tensor w_hh, Tensor? b_ih=None, Tensor? b_hh=None) -> (Tensor, Tensor) +- aten::lt.Scalar(Tensor self, Scalar other) -> (Tensor) +- aten::lt.Tensor(Tensor self, Tensor other) -> (Tensor) +- aten::masked_fill.Scalar(Tensor self, Tensor mask, Scalar value) -> (Tensor) +- aten::matmul(Tensor self, Tensor other) -> (Tensor) +- aten::max(Tensor self) -> (Tensor) +- aten::max.dim(Tensor self, int dim, bool keepdim=False) -> (Tensor values, Tensor indices) +- aten::max.other(Tensor self, Tensor other) -> (Tensor) +- aten::max_pool1d(Tensor self, int[1] kernel_size, int[1] stride=[], int[1] padding=[], int[1] dilation=[], bool ceil_mode=False) -> (Tensor) +- aten::max_pool2d(Tensor self, int[2] kernel_size, int[2] stride=[], int[2] padding=[0, 0], int[2] dilation=[1, 1], bool ceil_mode=False) -> (Tensor) +- aten::max_pool3d(Tensor self, int[3] kernel_size, int[3] stride=[], int[3] padding=[], int[3] dilation=[], bool ceil_mode=False) -> (Tensor) +- aten::mean(Tensor self, *, int? dtype=None) -> (Tensor) +- aten::mean.dim(Tensor self, int[] dim, bool keepdim=False, *, int? dtype=None) -> (Tensor) +- aten::min(Tensor self) -> (Tensor) +- aten::min.dim(Tensor self, int dim, bool keepdim=False) -> (Tensor values, Tensor indices) +- aten::min.other(Tensor self, Tensor other) -> (Tensor) +- aten::mul.Scalar(Tensor self, Scalar other) -> (Tensor) +- aten::mul.Tensor(Tensor self, Tensor other) -> (Tensor) +- aten::mul_.Tensor(Tensor(a!) self, Tensor other) -> (Tensor(a!)) +- aten::narrow(Tensor(a) self, int dim, int start, int length) -> (Tensor(a)) +- aten::narrow.Tensor(Tensor(a) self, int dim, Tensor start, int length) -> (Tensor(a)) +- aten::ne.Scalar(Tensor self, Scalar other) -> (Tensor) +- aten::ne.Tensor(Tensor self, Tensor other) -> (Tensor) +- aten::neg(Tensor self) -> (Tensor) +- aten::norm.ScalarOpt_dim(Tensor self, Scalar? p, int[1] dim, bool keepdim=False) -> (Tensor) +- aten::permute(Tensor(a) self, int[] dims) -> (Tensor(a)) +- aten::pixel_shuffle(Tensor self, int upscale_factor) -> (Tensor) +- aten::pow.Tensor_Scalar(Tensor self, Scalar exponent) -> (Tensor) +- aten::pow.Tensor_Tensor(Tensor self, Tensor exponent) -> (Tensor) +- aten::prelu(Tensor self, Tensor weight) -> (Tensor) +- aten::prod(Tensor self, *, int? dtype=None) -> (Tensor) +- aten::prod.dim_int(Tensor self, int dim, bool keepdim=False, *, int? dtype=None) -> (Tensor) +- aten::reciprocal(Tensor self) -> (Tensor) +- aten::reflection_pad1d(Tensor self, int[2] padding) -> (Tensor) +- aten::reflection_pad2d(Tensor self, int[4] padding) -> (Tensor) +- aten::relu(Tensor input) -> (Tensor) +- aten::relu_(Tensor(a!) self) -> (Tensor(a!)) +- aten::repeat(Tensor self, int[] repeats) -> (Tensor) +- aten::repeat_interleave.self_int(Tensor self, int repeats, int? dim=None, *, int? output_size=None) -> (Tensor) +- aten::replication_pad1d(Tensor self, int[2] padding) -> (Tensor) +- aten::replication_pad2d(Tensor self, int[4] padding) -> (Tensor) +- aten::replication_pad3d(Tensor self, int[6] padding) -> (Tensor) +- aten::reshape(Tensor self, int[] shape) -> (Tensor) +- aten::roll(Tensor self, int[1] shifts, int[1] dims=[]) -> (Tensor) +- aten::rsub.Scalar(Tensor self, Scalar other, Scalar alpha=1) -> (Tensor) +- aten::rsub.Tensor(Tensor self, Tensor other, Scalar alpha=1) -> (Tensor) +- aten::scatter.src(Tensor self, int dim, Tensor index, Tensor src) -> (Tensor) +- aten::scatter.value(Tensor self, int dim, Tensor index, Scalar value) -> (Tensor) +- aten::select.int(Tensor(a) self, int dim, int index) -> (Tensor(a)) +- aten::sigmoid(Tensor input) -> (Tensor) +- aten::sigmoid_(Tensor(a!) self) -> (Tensor(a!)) +- aten::sin(Tensor self) -> (Tensor) +- aten::sinh(Tensor self) -> (Tensor) +- aten::slice.Tensor(Tensor(a) self, int dim=0, int? start=None, int? end=None, int step=1) -> (Tensor(a)) +- aten::softmax.int(Tensor self, int dim, int? dtype=None) -> (Tensor) +- aten::split(Tensor self, int[] split_sizes, int dim=0) -> (Tensor[]) +- aten::split.Tensor(Tensor(a) self, int split_size, int dim=0) -> (Tensor[]) +- aten::split.sizes(Tensor(a -> *) self, int[] split_size, int dim=0) -> (Tensor[]) +- aten::split_with_sizes(Tensor(a) self, int[] split_sizes, int dim=0) -> (Tensor[]) +- aten::sqrt(Tensor self) -> (Tensor) +- aten::square(Tensor self) -> (Tensor) +- aten::squeeze.dim(Tensor(a) self, int dim) -> (Tensor(a)) +- aten::stack(Tensor[] tensors, int dim=0) -> (Tensor) +- aten::sub.Scalar(Tensor self, Scalar other, Scalar alpha=1) -> (Tensor) +- aten::sub.Tensor(Tensor self, Tensor other, Scalar alpha=1) -> (Tensor) +- aten::sub_.Tensor(Tensor(a!) self, Tensor other, *, Scalar alpha=1) -> (Tensor(a!)) +- aten::sum(Tensor self, *, int? dtype=None) -> (Tensor) +- aten::sum.dim_IntList(Tensor self, int[1] dim, bool keepdim=False, *, int? dtype=None) -> (Tensor) +- aten::t(Tensor self) -> (Tensor) +- aten::tan(Tensor self) -> (Tensor) +- aten::tanh(Tensor input) -> (Tensor) +- aten::tanh_(Tensor(a!) self) -> (Tensor(a!)) +- aten::to.device(Tensor(a) self, Device device, int dtype, bool non_blocking=False, bool copy=False, int? memory_format=None) -> (Tensor(a)) +- aten::to.dtype(Tensor self, int dtype, bool non_blocking=False, bool copy=False, int? memory_format=None) -> (Tensor) +- aten::to.other(Tensor self, Tensor other, bool non_blocking=False, bool copy=False, int? memory_format=None) -> (Tensor) +- aten::to.prim_Device(Tensor(a) self, Device? device, int? dtype=None, bool non_blocking=False, bool copy=False) -> (Tensor(a|b)) +- aten::topk(Tensor self, int k, int dim=-1, bool largest=True, bool sorted=True) -> (Tensor values, Tensor indices) +- aten::transpose.int(Tensor(a) self, int dim0, int dim1) -> (Tensor(a)) +- aten::unbind.int(Tensor(a -> *) self, int dim=0) -> (Tensor[]) +- aten::unsqueeze(Tensor(a) self, int dim) -> (Tensor(a)) +- aten::upsample_bilinear2d(Tensor self, int[2] output_size, bool align_corners, float? scales_h=None, float? scales_w=None) -> (Tensor) +- aten::upsample_bilinear2d.vec(Tensor input, int[]? output_size, bool align_corners, float[]? scale_factors) -> (Tensor) +- aten::upsample_linear1d(Tensor self, int[1] output_size, bool align_corners, float? scales=None) -> (Tensor) +- aten::upsample_linear1d.vec(Tensor input, int[]? output_size, bool align_corners, float[]? scale_factors) -> (Tensor) +- aten::upsample_nearest1d(Tensor self, int[1] output_size, float? scales=None) -> (Tensor) +- aten::upsample_nearest1d.vec(Tensor input, int[]? output_size, float[]? scale_factors) -> (Tensor) +- aten::upsample_nearest2d(Tensor self, int[2] output_size, float? scales_h=None, float? scales_w=None) -> (Tensor) +- aten::upsample_nearest2d.vec(Tensor input, int[]? output_size, float[]? scale_factors) -> (Tensor) +- aten::upsample_nearest3d(Tensor self, int[3] output_size, float? scales_d=None, float? scales_h=None, float? scales_w=None) -> (Tensor) +- aten::upsample_nearest3d.vec(Tensor input, int[]? output_size, float[]? scale_factors) -> (Tensor) +- aten::upsample_trilinear3d(Tensor self, int[3] output_size, bool align_corners, float? scales_d=None, float? scales_h=None, float? scales_w=None) -> (Tensor) +- aten::upsample_trilinear3d.vec(Tensor input, int[]? output_size, bool align_corners, float[]? scale_factors) -> (Tensor) +- aten::view(Tensor(a) self, int[] size) -> (Tensor(a)) +- trt::const(Tensor self) -> (Tensor) + +Operators Currently Supported Through Evaluators +------------------------------------------------- + +- aten::Bool.float(float b) -> (bool) +- aten::Bool.int(int a) -> (bool) +- aten::Float.Scalar(Scalar a) -> float +- aten::Float.bool(bool a) -> float +- aten::Float.int(int a) -> float +- aten::Int.Scalar(Scalar a) -> int +- aten::Int.bool(bool a) -> int +- aten::Int.float(float a) -> int +- aten::Int.int(int a) -> int +- aten::__and__(int a, int b) -> (bool) +- aten::__and__.bool(bool a, bool b) -> (bool) +- aten::__derive_index(int idx, int start, int step) -> int +- aten::__getitem__.t(t[](a) list, int idx) -> (t(*)) +- aten::__is__(t1 self, t2 obj) -> bool +- aten::__isnot__(t1 self, t2 obj) -> bool +- aten::__not__(bool self) -> bool +- aten::__or__(int a, int b) -> (bool) +- aten::__range_length(int lo, int hi, int step) -> int +- aten::__round_to_zero_floordiv(int a, int b) -> (int) +- aten::__xor__(int a, int b) -> (bool) +- aten::add.float(float a, float b) -> (float) +- aten::add.int(int a, int b) -> (int) +- aten::add.str(str a, str b) -> (str) +- aten::add_.t(t[](a!) self, t[] b) -> (t[]) +- aten::append.t(t[](a!) self, t(c -> *) el) -> (t[](a!)) +- aten::arange(Scalar end, *, int? dtype=None, int? layout=None, + Device? device=None, bool? pin_memory=None) -> (Tensor) +- aten::arange.start(Scalar start, Scalar end, *, ScalarType? dtype=None, + Layout? layout=None, Device? device=None, bool? pin_memory=None) -> (Tensor) +- aten::arange.start_step(Scalar start, Scalar end, Scalar step, *, ScalarType? dtype=None, + Layout? layout=None, Device? device=None, bool? pin_memory=None) -> (Tensor) +- aten::clone(Tensor self, *, int? memory_format=None) -> (Tensor) +- aten::copy_(Tensor(a!) self, Tensor src, bool non_blocking=False) -> (Tensor(a!)) +- aten::dim(Tensor self) -> int +- aten::div.float(float a, float b) -> (float) +- aten::div.int(int a, int b) -> (float) +- aten::eq.bool(bool a, bool b) -> (bool) +- aten::eq.float(float a, float b) -> (bool) +- aten::eq.float_int(float a, int b) -> (bool) +- aten::eq.int(int a, int b) -> (bool) +- aten::eq.int_float(int a, float b) -> (bool) +- aten::eq.str(str a, str b) -> (bool) +- aten::extend.t(t[](a!) self, t[] other) -> () +- aten::floor.float(float a) -> (int) +- aten::floor.int(int a) -> (int) +- aten::floordiv.float(float a, float b) -> (int) +- aten::floordiv.int(int a, int b) -> (int) +- aten::format(str self, ...) -> (str) +- aten::ge.bool(bool a, bool b) -> (bool) +- aten::ge.float(float a, float b) -> (bool) +- aten::ge.float_int(float a, int b) -> (bool) +- aten::ge.int(int a, int b) -> (bool) +- aten::ge.int_float(int a, float b) -> (bool) +- aten::gt.bool(bool a, bool b) -> (bool) +- aten::gt.float(float a, float b) -> (bool) +- aten::gt.float_int(float a, int b) -> (bool) +- aten::gt.int(int a, int b) -> (bool) +- aten::gt.int_float(int a, float b) -> (bool) +- aten::is_floating_point(Tensor self) -> (bool) +- aten::le.bool(bool a, bool b) -> (bool) +- aten::le.float(float a, float b) -> (bool) +- aten::le.float_int(float a, int b) -> (bool) +- aten::le.int(int a, int b) -> (bool) +- aten::le.int_float(int a, float b) -> (bool) +- aten::len.t(t[] a) -> (int) +- aten::lt.bool(bool a, bool b) -> (bool) +- aten::lt.float(float a, float b) -> (bool) +- aten::lt.float_int(float a, int b) -> (bool) +- aten::lt.int(int a, int b) -> (bool) +- aten::lt.int_float(int a, float b) -> (bool) +- aten::mul.float(float a, float b) -> (float) +- aten::mul.int(int a, int b) -> (int) +- aten::ne.bool(bool a, bool b) -> (bool) +- aten::ne.float(float a, float b) -> (bool) +- aten::ne.float_int(float a, int b) -> (bool) +- aten::ne.int(int a, int b) -> (bool) +- aten::ne.int_float(int a, float b) -> (bool) +- aten::neg.int(int a) -> (int) +- aten::numel(Tensor self) -> int +- aten::pow.float(float a, float b) -> (float) +- aten::pow.float_int(float a, int b) -> (float) +- aten::pow.int(int a, int b) -> (float) +- aten::pow.int_float(int a, float b) -> (float) +- aten::size(Tensor self) -> (int[]) +- aten::size.int(Tensor self, int dim) -> (int) +- aten::slice.t(t[] l, int start, int end=9223372036854775807, int step=1) -> (t[]) +- aten::sqrt.float(float a) -> (float) +- aten::sqrt.int(int a) -> (float) +- aten::sub.float(float a, float b) -> (float) +- aten::sub.int(int a, int b) -> (int) +- aten::tensor(t[] data, *, int? dtype=None, Device? device=None, bool requires_grad=False) -> (Tensor) +- prim::TupleIndex(Any tup, int i) -> (Any) +- prim::dtype(Tensor a) -> (int) +- prim::max.bool(bool a, bool b) -> (bool) +- prim::max.float(float a, float b) -> (bool) +- prim::max.float_int(float a, int b) -> (bool) +- prim::max.int(int a, int b) -> (bool) +- prim::max.int_float(int a, float b) -> (bool) +- prim::max.self_int(int[] self) -> (int) +- prim::min.bool(bool a, bool b) -> (bool) +- prim::min.float(float a, float b) -> (bool) +- prim::min.float_int(float a, int b) -> (bool) +- prim::min.int(int a, int b) -> (bool) +- prim::min.int_float(int a, float b) -> (bool) +- prim::min.self_int(int[] self) -> (int) +- prim::shape(Tensor a) -> (int[]) diff --git a/docs/v1.2.0/_sources/py_api/fx.rst.txt b/docs/v1.2.0/_sources/py_api/fx.rst.txt new file mode 100644 index 0000000000..8ce591f5ee --- /dev/null +++ b/docs/v1.2.0/_sources/py_api/fx.rst.txt @@ -0,0 +1,31 @@ +.. _torch_tensorrt_fx_py: + +torch_tensorrt.fx +=================== + +.. currentmodule:: torch_tensorrt.fx + +.. automodule torch_tensorrt.ts + :undoc-members: + +.. automodule:: torch_tensorrt.fx + :members: + :undoc-members: + :show-inheritance: + +Functions +------------ + +.. autofunction:: compile + + +Classes +-------- + +.. autoclass:: TRTModule + +.. autoclass:: InputTensorSpec + +.. autoclass:: TRTInterpreter + +.. autoclass:: TRTInterpreterResult \ No newline at end of file diff --git a/docs/v1.2.0/_sources/py_api/logging.rst.txt b/docs/v1.2.0/_sources/py_api/logging.rst.txt new file mode 100644 index 0000000000..7918fe7f86 --- /dev/null +++ b/docs/v1.2.0/_sources/py_api/logging.rst.txt @@ -0,0 +1,13 @@ +.. _torch_tensorrt_logging_py: + +torch_tensorrt.logging +---------------------- + +.. currentmodule:: torch_tensorrt.logging + +.. automodule:: torch_tensorrt.logging + :members: + :undoc-members: + :show-inheritance: + +.. autoclass:: py torch_tensorrt.logging.Level diff --git a/docs/v1.2.0/_sources/py_api/ptq.rst.txt b/docs/v1.2.0/_sources/py_api/ptq.rst.txt new file mode 100644 index 0000000000..ec83662efb --- /dev/null +++ b/docs/v1.2.0/_sources/py_api/ptq.rst.txt @@ -0,0 +1,27 @@ +.. _torch_tensorrt_ptq_py: + +torch_tensorrt.ptq +=================== + +.. currentmodule:: torch_tensorrt.ptq + +.. automodule:: torch_tensorrt.ptq + :members: + :undoc-members: + :show-inheritance: + +Classes +--------- + +.. autoclass:: DataLoaderCalibrator + :members: + :special-members: __init__ + +.. autoclass:: CacheCalibrator + :members: + :special-members: __init__ + +Enums +------- + +.. autoclass:: CalibrationAlgo diff --git a/docs/v1.2.0/_sources/py_api/torch_tensorrt.rst.txt b/docs/v1.2.0/_sources/py_api/torch_tensorrt.rst.txt new file mode 100644 index 0000000000..2ccf7c60e2 --- /dev/null +++ b/docs/v1.2.0/_sources/py_api/torch_tensorrt.rst.txt @@ -0,0 +1,60 @@ +.. _torch_tensorrt_py: + +torch_tensorrt +=============== + +.. automodule torch_tensorrt + :undoc-members: + + + +.. automodule:: torch_tensorrt + :members: + :undoc-members: + :show-inheritance: + +Functions +------------ + +.. autofunction:: set_device + +.. autofunction:: compile + +.. autofunction:: convert_method_to_trt_engine + +.. autofunction:: get_build_info + +.. autofunction:: dump_build_info + +Classes +--------- + +.. autoclass:: Input + :members: + :special-members: __init__ + +.. autoclass:: Device + :members: + :special-members: __init__ + +Enums +------- + +.. autoclass:: dtype + +.. autoclass:: DeviceType + +.. autoclass:: EngineCapability + +.. autoclass:: TensorFormat + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + logging + ptq + ts + fx diff --git a/docs/v1.2.0/_sources/py_api/ts.rst.txt b/docs/v1.2.0/_sources/py_api/ts.rst.txt new file mode 100644 index 0000000000..45f6418eb7 --- /dev/null +++ b/docs/v1.2.0/_sources/py_api/ts.rst.txt @@ -0,0 +1,27 @@ +.. _torch_tensorrt_ts_py: + +torch_tensorrt.ts +=================== + +.. currentmodule:: torch_tensorrt.ts + +.. automodule torch_tensorrt.ts + :undoc-members: + +.. automodule:: torch_tensorrt.ts + :members: + :undoc-members: + :show-inheritance: + +Functions +------------ + +.. autofunction:: compile + +.. autofunction:: convert_method_to_trt_engine + +.. autofunction:: check_method_op_support + +.. autofunction:: embed_engine_in_new_module + +.. autofunction:: TensorRTCompileSpec diff --git a/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/changelog.rst.txt b/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/changelog.rst.txt new file mode 100644 index 0000000000..d1ad81a0df --- /dev/null +++ b/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/changelog.rst.txt @@ -0,0 +1,6 @@ + +********* +Changelog +********* + +v0.0.1 diff --git a/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/configuring.rst.txt b/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/configuring.rst.txt new file mode 100644 index 0000000000..3afcb7bc62 --- /dev/null +++ b/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/configuring.rst.txt @@ -0,0 +1,108 @@ + +************* +Configuration +************* + +You can configure different parts of the theme. + +Project-wide Configuration +========================== + +HTML Theme Options +------------------ + +The theme's project-wide options are defined in the ``pytorch_sphinx_theme/theme.conf`` +file of this repository, and can be defined in your project's ``conf.py`` via +``html_theme_options``. For example: + +.. code:: python + + html_theme_options = { + 'canonical_url': '', + 'analytics_id': '', + 'logo_only': False, + 'display_version': True, + 'prev_next_buttons_location': 'bottom', + 'style_external_links': False, + 'vcs_pageview_mode': '', + # Toc options + 'collapse_navigation': True, + 'sticky_navigation': True, + 'navigation_depth': 4, + 'includehidden': True, + 'titles_only': False + } + +The following options are available: + +Base options +~~~~~~~~~~~~ + +* ``canonical_url`` String. This will specify a `canonical url `__ + to let search engines know they should give higher ranking to latest version of the docs. + The url points to the root of the documentation and requires a trailing slash. +* ``analytics_id`` String. Change the Google Analytics ID that is included on pages. +* ``display_version`` Bool. With this disabled, the version number isn't shown at the top of the sidebar. +* ``prev_next_buttons_location`` String. can take the value ``bottom``, ``top``, ``both`` , or ``None`` + and will display the "Next" and "Previous" buttons accordingly. +* ``style_external_links`` Bool. Add an icon next to external links. Defaults to ``False``. +* ``vcs_pageview_mode`` String. Changes how to view files when using `display_github`, `display_gitlab`, etc. + When using Github or Gitlab this can be: `blob` (default), `edit`, or `raw`, + on Bitbucket, this can be either: `view` (default) or `edit`. + +TOC Options +~~~~~~~~~~~ + +These effect how we display the Table of Contents in the side bar. You can read more about them here: http://www.sphinx-doc.org/en/stable/templating.html#toctree + +* ``collapse_navigation`` Bool. With this enabled, you will lose the ``[+]`` drop downs next to each section in the sidebar. +* ``sticky_navigation`` Bool. This causes the sidebar to scroll with the main page content as you scroll the page. +* ``navigation_depth`` Int. Indicate the max depth of the tree; by default, 4 levels are included; + set it to -1 to allow unlimited depth. +* ``includehidden`` Bool. Specifies if the sidebar includes toctrees marked with the ``:hidden:`` option +* ``titles_only`` Bool. If True, removes headers within a page from the sidebar. + +.. note:: + + Setting ``collapse_navigation`` to False and using a high ``navigation_depth`` + can cause projects with many files and a deep file structure to generate HTML files + that are significantly larger in file size and much longer compilation times. + + +HTML Context Options +-------------------- + +TODO. + + +Page-level Configuration +======================== + +Pages support metadata that changes how the theme renders. +You can currently add the following: + +* ``:github_url:`` This will force the "Edit on GitHub" to the configured URL +* ``:bitbucket_url:`` This will force the "Edit on Bitbucket" to the configured URL +* ``:gitlab_url:`` This will force the "Edit on GitLab" to the configured URL + + +How the Table of Contents builds +================================ + +Currently the left menu will build based upon any ``toctree(s)`` defined in your ``index.rst`` file. +It outputs 2 levels of depth, which should give your visitors a high level of access to your +docs. If no toctrees are set the theme reverts to sphinx's usual local toctree. + +It's important to note that if you don't follow the same styling for your rST headers across +your documents, the toctree will misbuild, and the resulting menu might not show the correct +depth when it renders. + +Also note that by default the table of contents is set with ``includehidden=True``. This allows you +to set a hidden toc in your index file with the `:hidden: `_ property that will allow you +to build a toc without it rendering in your index. + +By default, the navigation will "stick" to the screen as you scroll. However if your toc +is vertically too large, it will revert to static positioning. To disable the sticky nav +altogether change the setting in ``conf.py``. + +.. _hidden: http://sphinx-doc.org/markup/toctree.html diff --git a/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/demo/api.rst.txt b/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/demo/api.rst.txt new file mode 100644 index 0000000000..b49bc248ac --- /dev/null +++ b/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/demo/api.rst.txt @@ -0,0 +1,53 @@ + +********************* +:mod:`test_py_module` +********************* + +.. contents:: Table of Contents + +.. automodule:: test_py_module.test + :members: + :private-members: + :special-members: + +Generated Index +=============== + +Part of the sphinx build process in generate and index file: :ref:`genindex`. + + +Optional parameter args +======================= + +At this point optional parameters `cannot be generated from code`_. +However, some projects will manually do it, like so: + +This example comes from `django-payments module docs`_. + +.. class:: payments.dotpay.DotpayProvider(seller_id, pin[, channel=0[, lock=False], lang='pl']) + + This backend implements payments using a popular Polish gateway, `Dotpay.pl `_. + + Due to API limitations there is no support for transferring purchased items. + + + :param seller_id: Seller ID assigned by Dotpay + :param pin: PIN assigned by Dotpay + :param channel: Default payment channel (consult reference guide) + :param lang: UI language + :param lock: Whether to disable channels other than the default selected above + +.. _cannot be generated from code: https://groups.google.com/forum/#!topic/sphinx-users/_qfsVT5Vxpw +.. _django-payments module docs: http://django-payments.readthedocs.org/en/latest/modules.html#payments.authorizenet.AuthorizeNetProvide + + +Data +==== + +.. data:: Data_item_1 + Data_item_2 + Data_item_3 + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce congue elit eu hendrerit mattis. + +Some data link :data:`Data_item_1`. diff --git a/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/demo/demo.rst.txt b/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/demo/demo.rst.txt new file mode 100644 index 0000000000..66f19cc899 --- /dev/null +++ b/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/demo/demo.rst.txt @@ -0,0 +1,475 @@ +.. This is a comment. Note how any initial comments are moved by + transforms to after the document title, subtitle, and docinfo. + +.. demo.rst from: http://docutils.sourceforge.net/docs/user/rst/demo.txt + +.. |EXAMPLE| image:: static/yi_jing_01_chien.jpg + :width: 1em + +********************** +Paragraph Level Markup +********************** + +.. contents:: Table of Contents + +Inline Markup +============= + +Paragraphs contain text and may contain inline markup: *emphasis*, **strong emphasis**, ``inline literals``, +standalone hyperlinks (http://www.python.org), external hyperlinks (Python_), internal cross-references (example_), +external hyperlinks with embedded URIs (`Python web site `__), footnote references +(manually numbered [1]_, anonymous auto-numbered [#]_, labeled auto-numbered [#label]_, or symbolic [*]_), +citation references ([12]_), substitution references (|example|), and _`inline hyperlink targets` +(see Targets_ below for a reference back to here). Character-level inline markup is also possible +(although exceedingly ugly!) in *re*\ ``Structured``\ *Text*. Problems are indicated by |problematic| +text (generated by processing errors; this one is intentional). + +Also with ``sphinx.ext.autodoc``, which I use in the demo, I can link to :class:`test_py_module.test.Foo`. +It will link you right my code documentation for it. + +The default role for interpreted text is `Title Reference`. Here are some explicit interpreted text roles: +a PEP reference (:PEP:`287`); an RFC reference (:RFC:`2822`); a :sub:`subscript`; a :sup:`superscript`; +and explicit roles for :emphasis:`standard` :strong:`inline` :literal:`markup`. + +GUI labels are a useful way to indicate that :guilabel:`Some action` is to be taken by the user. +The GUI label should not run over ``line-height`` so as not to :guilabel:`interfere` with text from adjacent lines. + +Key-bindings indicate that the read is to press a button on the keyboard or mouse, +for example :kbd:`MMB` and :kbd:`Shift-MMB`. Another useful markup to indicate a user action +is to use ``menuselection`` this can be used to show short and long menus in software. +For example, and ``menuselection`` can be seen here that breaks is too long to fit on this line. +:menuselection:`My --> Software --> Some menu --> Some sub menu 1 --> sub menu 2`. + +.. DO NOT RE-WRAP THE FOLLOWING PARAGRAPH! + +Let's test wrapping and whitespace significance in inline literals: +``This is an example of --inline-literal --text, --including some-- +strangely--hyphenated-words. Adjust-the-width-of-your-browser-window +to see how the text is wrapped. -- ---- -------- Now note the +spacing between the words of this sentence (words +should be grouped in pairs).`` + +If the ``--pep-references`` option was supplied, there should be a live link to PEP 258 here. + +Math +==== + +This is a test. Here is an equation: +:math:`X_{0:5} = (X_0, X_1, X_2, X_3, X_4)`. +Here is another: + +.. math:: + :label: This is a label + + \nabla^2 f = + \frac{1}{r^2} \frac{\partial}{\partial r} + \left( r^2 \frac{\partial f}{\partial r} \right) + + \frac{1}{r^2 \sin \theta} \frac{\partial f}{\partial \theta} + \left( \sin \theta \, \frac{\partial f}{\partial \theta} \right) + + \frac{1}{r^2 \sin^2\theta} \frac{\partial^2 f}{\partial \phi^2} + +You can add a link to equations like the one above :eq:`This is a label` by using ``:eq:``. + +Meta +==== + +.. meta:: + :keywords: reStructuredText, demonstration, demo, parser + :description lang=en: A demonstration of the reStructuredText + markup language, containing examples of all basic + constructs and many advanced constructs. + +Blocks +====== + +Literal Blocks +-------------- + +Literal blocks are indicated with a double-colon ("::") at the end of +the preceding paragraph (over there ``-->``). They can be indented:: + + if literal_block: + text = 'is left as-is' + spaces_and_linebreaks = 'are preserved' + markup_processing = None + +Or they can be quoted without indentation:: + +>> Great idea! +> +> Why didn't I think of that? + +Line Blocks +----------- + +| This is a line block. It ends with a blank line. +| Each new line begins with a vertical bar ("|"). +| Line breaks and initial indents are preserved. +| Continuation lines are wrapped portions of long lines; + they begin with a space in place of the vertical bar. +| The left edge of a continuation line need not be aligned with + the left edge of the text above it. + +| This is a second line block. +| +| Blank lines are permitted internally, but they must begin with a "|". + +Take it away, Eric the Orchestra Leader! + + | A one, two, a one two three four + | + | Half a bee, philosophically, + | must, *ipso facto*, half not be. + | But half the bee has got to be, + | *vis a vis* its entity. D'you see? + | + | But can a bee be said to be + | or not to be an entire bee, + | when half the bee is not a bee, + | due to some ancient injury? + | + | Singing... + +Block Quotes +------------ + +Block quotes consist of indented body elements: + + My theory by A. Elk. Brackets Miss, brackets. This theory goes + as follows and begins now. All brontosauruses are thin at one + end, much much thicker in the middle and then thin again at the + far end. That is my theory, it is mine, and belongs to me and I + own it, and what it is too. + + -- Anne Elk (Miss) + +Doctest Blocks +-------------- + +>>> print 'Python-specific usage examples; begun with ">>>"' +Python-specific usage examples; begun with ">>>" +>>> print '(cut and pasted from interactive Python sessions)' +(cut and pasted from interactive Python sessions) + +Code Blocks +----------- + +.. parsed-literal:: + + # parsed-literal test + curl -O http://someurl/release-|version|.tar-gz + + +.. code-block:: json + :caption: Code Blocks can have captions. + + { + "windows": [ + { + "panes": [ + { + "shell_command": [ + "echo 'did you know'", + "echo 'you can inline'" + ] + }, + { + "shell_command": "echo 'single commands'" + }, + "echo 'for panes'" + ], + "window_name": "long form" + } + ], + "session_name": "shorthands" + } + +Emphasized lines with line numbers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: python + :linenos: + :emphasize-lines: 3,5 + + def some_function(): + interesting = False + print 'This line is highlighted.' + print 'This one is not...' + print '...but this one is.' + +Sidebar +======= + +.. sidebar:: Ch'ien / The Creative + + .. image:: static/yi_jing_01_chien.jpg + + *Above* CH'IEN THE CREATIVE, HEAVEN + + *Below* CH'IEN THE CREATIVE, HEAVEN + +The first hexagram is made up of six unbroken lines. These unbroken lines stand for the primal power, +which is light-giving, active, strong, and of the spirit. The hexagram is consistently strong in character, +and since it is without weakness, its essence is power or energy. Its image is heaven. +Its energy is represented as unrestricted by any fixed conditions in space and is therefore conceived of as motion. +Time is regarded as the basis of this motion. +Thus the hexagram includes also the power of time and the power of persisting in time, that is, duration. + +The power represented by the hexagram is to be interpreted in a dual sense in terms of its action +on the universe and of its action on the world of men. In relation to the universe, the hexagram expresses the strong, +creative action of the Deity. In relation to the human world, it denotes the creative action of the holy man or sage, +of the ruler or leader of men, who through his power awakens and develops their higher nature. + +Code with Sidebar +----------------- + +.. sidebar:: A code example + + With a sidebar on the right. + +.. literalinclude:: test_py_module/test.py + :language: python + :caption: Literal includes can also have captions. + :linenos: + :lines: 1-40 + +References +========== + +Footnotes +--------- + +.. [1] A footnote contains body elements, consistently indented by at + least 3 spaces. + + This is the footnote's second paragraph. + +.. [#label] Footnotes may be numbered, either manually (as in [1]_) or + automatically using a "#"-prefixed label. This footnote has a + label so it can be referred to from multiple places, both as a + footnote reference ([#label]_) and as a hyperlink reference + (label_). + +.. [#] This footnote is numbered automatically and anonymously using a + label of "#" only. + +.. [*] Footnotes may also use symbols, specified with a "*" label. + Here's a reference to the next footnote: [*]_. + +.. [*] This footnote shows the next symbol in the sequence. + +.. [4] Here's an unreferenced footnote, with a reference to a + nonexistent footnote: [5]_. + +Citations +--------- + +.. [11] This is the citation I made, let's make this extremely long so that we can tell that it doesn't follow the normal responsive table stuff. + +.. [12] This citation has some ``code blocks`` in it, maybe some **bold** and + *italics* too. Heck, lets put a link to a meta citation [13]_ too. + +.. [13] This citation will have two backlinks. + + +Here's a reference to the above, [12]_, and a [nonexistent]_ citation. + +Here is another type of citation: `citation` + +Glossary +-------- + +This is a glossary with definition terms for thing like :term:`Writing`: + +.. glossary:: + + Documentation + Provides users with the knowledge they need to use something. + + Reading + The process of taking information into ones mind through the use of eyes. + + Writing + The process of putting thoughts into a medium for other people to :term:`read `. + +Targets +------- + +.. _example: + +This paragraph is pointed to by the explicit "example" target. +A reference can be found under `Inline Markup`_, above. `Inline +hyperlink targets`_ are also possible. + +Section headers are implicit targets, referred to by name. See +Targets_, which is a subsection of `Body Elements`_. + +Explicit external targets are interpolated into references such as "Python_". + +.. _Python: http://www.python.org/ + +Targets may be indirect and anonymous. Thus `this phrase`__ may also +refer to the Targets_ section. + +__ Targets_ + +Here's a `hyperlink reference without a target`_, which generates an error. + + +Directives +========== + +Contents +-------- + +.. contents:: :local: + +These are just a sample of the many reStructuredText Directives. For others, please see: +http://docutils.sourceforge.net/docs/ref/rst/directives.html. + + +Centered text +------------- + +You can create a statement with centered text with ``.. centered::`` + +.. centered:: This is centered text! + +Images & Figures +---------------- + +Images +^^^^^^ + +An image directive (also clickable -- a hyperlink reference): + +.. image:: static/yi_jing_01_chien.jpg + :target: directives_ + +Figures +^^^^^^^ + +.. figure:: static/yi_jing_01_chien.jpg + :alt: reStructuredText, the markup syntax + + A figure is an image with a caption and/or a legend: + + +------------+-----------------------------------------------+ + | re | Revised, revisited, based on 're' module. | + +------------+-----------------------------------------------+ + | Structured | Structure-enhanced text, structuredtext. | + +------------+-----------------------------------------------+ + | Text | Well it is, isn't it? | + +------------+-----------------------------------------------+ + + This paragraph is also part of the legend. + +A figure directive with center alignment + +.. figure:: static/yi_jing_01_chien.jpg + :align: center + + This caption should be centered. + +Admonitions +----------- + +.. Attention:: Directives at large. + +.. Caution:: Don't take any wooden nickels. + +.. DANGER:: Mad scientist at work! + +.. Error:: Does not compute. + +.. Hint:: It's bigger than a bread box. + +.. Important:: + - Wash behind your ears. + - Clean up your room. + + - Including the closet. + - The bathroom too. + + - Take the trash out of the bathroom. + - Clean the sink. + - Call your mother. + - Back up your data. + +.. Note:: This is a note. + Equations within a note: + :math:`G_{\mu\nu} = 8 \pi G (T_{\mu\nu} + \rho_\Lambda g_{\mu\nu})`. + +.. Tip:: 15% if the service is good. + + +---------+ + | Example | + +=========+ + | Thing1 | + +---------+ + | Thing2 | + +---------+ + | Thing3 | + +---------+ + +.. WARNING:: Strong prose may provoke extreme mental exertion. + Reader discretion is strongly advised. + +.. admonition:: And, by the way... + + You can make up your own admonition too. + +Topics, Sidebars, and Rubrics +----------------------------- + +.. sidebar:: Sidebar Title + :subtitle: Optional Subtitle + + This is a sidebar. It is for text outside the flow of the main + text. + + .. rubric:: This is a rubric inside a sidebar + + Sidebars often appears beside the main text with a border and + background color. + +.. topic:: Topic Title + + This is a topic. + +.. rubric:: This is a rubric + +Target Footnotes +---------------- + +.. target-notes:: + +Replacement Text +---------------- + +I recommend you try |Python|_. + +.. |Python| replace:: Python, *the* best language around + +Compound Paragraph +------------------ + +.. compound:: + + This paragraph contains a literal block:: + + Connecting... OK + Transmitting data... OK + Disconnecting... OK + + and thus consists of a simple paragraph, a literal block, and + another simple paragraph. Nonetheless it is semantically *one* + paragraph. + +This construct is called a *compound paragraph* and can be produced +with the "compound" directive. + +Download Links +============== + +:download:`This long long long long long long long long long long long long long long long download link should be blue, normal weight text with a leading icon, and should wrap white-spaces ` diff --git a/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/demo/lists_tables.rst.txt b/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/demo/lists_tables.rst.txt new file mode 100644 index 0000000000..a31d213924 --- /dev/null +++ b/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/demo/lists_tables.rst.txt @@ -0,0 +1,302 @@ + +************** +Lists & Tables +************** + +.. contents:: Table of Contents + +Lists +===== + +Enumerated Lists +---------------- + +1. Arabic numerals. + + a) lower alpha) + + (i) (lower roman) + + A. upper alpha. + + I) upper roman) + +2. Lists that don't start at 1: + + 3. Three + + 4. Four + + C. C + + D. D + + iii. iii + + iv. iv + +#. List items may also be auto-enumerated. + +Definition Lists +---------------- + +Term + Definition +Term : classifier + Definition paragraph 1. + + Definition paragraph 2. +Term + Definition + + +Option Lists +------------ + +For listing command-line options: + +-a command-line option "a" +-b file options can have arguments + and long descriptions +--long options can be long also +--input=file long options can also have + arguments + +--very-long-option + The description can also start on the next line. + + The description may contain multiple body elements, + regardless of where it starts. + +-x, -y, -z Multiple options are an "option group". +-v, --verbose Commonly-seen: short & long options. +-1 file, --one=file, --two file + Multiple options with arguments. +/V DOS/VMS-style options too + +There must be at least two spaces between the option and the description. + +Field list +---------- + +.. bibliographic fields (which also require a transform): + +:Author: David Goodger +:Address: 123 Example Street + Example, EX Canada + A1B 2C3 +:Contact: docutils-develop@lists.sourceforge.net +:Authors: Me; Myself; I +:organization: humankind +:date: $Date: 2012-01-03 19:23:53 +0000 (Tue, 03 Jan 2012) $ +:status: This is a "work in progress" +:revision: $Revision: 7302 $ +:version: 1 +:copyright: This document has been placed in the public domain. You + may do with it as you wish. You may copy, modify, + redistribute, reattribute, sell, buy, rent, lease, + destroy, or improve it, quote it at length, excerpt, + incorporate, collate, fold, staple, or mutilate it, or do + anything else to it that your or anyone else's heart + desires. +:field name: This is a generic bibliographic field. +:field name 2: + Generic bibliographic fields may contain multiple body elements. + + Like this. + +:Dedication: + + For Docutils users & co-developers. + +:abstract: + + This document is a demonstration of the reStructuredText markup + language, containing examples of all basic reStructuredText + constructs and many advanced constructs. + +Bullet Lists +------------ + +- A bullet list + + + Nested bullet list. + + Nested item 2. + +- Item 2. + + Paragraph 2 of item 2. + + * Nested bullet list. + * Nested item 2. + + - Third level. + - Item 2. + + * Nested item 3. + +- ``inline literall`` +- ``inline literall`` +- ``inline literall`` + +Second list level +^^^^^^^^^^^^^^^^^ + +- here is a list in a second-level section. +- `yahoo `_ +- `yahoo `_ + + - `yahoo `_ + - here is an inner bullet ``oh`` + + - one more ``with an inline literally``. `yahoo `_ + + heh heh. child. try to beat this embed: + + .. literalinclude:: test_py_module/test.py + :language: python + :linenos: + :lines: 1-10 + - and another. `yahoo `_ + - `yahoo `_ + - ``hi`` +- and hehe + +But deeper down the rabbit hole +""""""""""""""""""""""""""""""" + +- I kept saying that, "deeper down the rabbit hole". `yahoo `_ + + - I cackle at night `yahoo `_. +- I'm so lonely here in GZ ``guangzhou`` +- A man of python destiny, hopes and dreams. `yahoo `_ + + - `yahoo `_ + + - `yahoo `_ ``hi`` + - ``destiny`` + +Hlists +------ + +.. hlist:: + :columns: 2 + + - First item + - Second item + - Third item + - Forth item + - Fifth item + - Sixths item + +.. rubric:: Hlist with images + +.. hlist:: + :columns: 2 + + - .. figure:: static/yi_jing_01_chien.jpg + + This is a short caption for a figure. + + - .. figure:: static/yi_jing_01_chien.jpg + + This is a long caption for a figure. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Donec porttitor dolor in odio posuere, vitae ornare libero mattis. In lobortis justo vestibulum nibh aliquet, non. + +Numbered List +------------- + +#. One, +#. Two. +#. Three with long text. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Sed feugiat sagittis neque quis eleifend. Duis rutrum lectus sit amet mattis suscipit. + +- A) Using bullets and letters. (A) +- B) Using bullets and letters. (B) +- C) Using bullets and letters. (C) + +Tables +====== + +Grid Tables +----------- + +Here's a grid table followed by a simple table: + ++------------------------+------------+----------+----------+ +| Header row, column 1 | Header 2 | Header 3 | Header 4 | +| (header rows optional) | | | | ++========================+============+==========+==========+ +| body row 1, column 1 | column 2 | column 3 | column 4 | ++------------------------+------------+----------+----------+ +| body row 2 | Cells may span columns. | ++------------------------+------------+---------------------+ +| body row 3 | Cells may | - Table cells | ++------------------------+ span rows. | - contain | +| body row 4 | | - body elements. | ++------------------------+------------+----------+----------+ +| body row 5 | Cells may also be | | +| | empty: ``-->`` | | ++------------------------+-----------------------+----------+ + +===== ===== ====== + Inputs Output +------------ ------ + A B A or B +===== ===== ====== +False False False +True False True +False True True +True True True +===== ===== ====== + +Giant Tables +^^^^^^^^^^^^ + ++------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+ +| Header 1 | Header 2 | Header 3 | Header 1 | Header 2 | Header 3 | Header 1 | Header 2 | Header 3 | Header 1 | Header 2 | Header 3 | ++============+============+===========+============+============+===========+============+============+===========+============+============+===========+ +| body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | ++------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+ +| body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | ++------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+ +| body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | ++------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+ +| body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | body row 1 | column 2 | column 3 | ++------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+------------+------------+-----------+ + +List Tables +----------- + +.. list-table:: List tables can have captions like this one. + :widths: 10 5 10 50 + :header-rows: 1 + :stub-columns: 1 + + * - List table + - Header 1 + - Header 2 + - Header 3 long. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet mauris arcu. + * - Stub Row 1 + - Row 1 + - Column 2 + - Column 3 long. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet mauris arcu. + * - Stub Row 2 + - Row 2 + - Column 2 + - Column 3 long. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet mauris arcu. + * - Stub Row 3 + - Row 3 + - Column 2 + - Column 3 long. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet mauris arcu. + +.. list-table:: This is a list table with images in it. + + * - .. figure:: static/yi_jing_01_chien.jpg + + This is a short caption for a figure. + + - .. figure:: static/yi_jing_01_chien.jpg + + This is a long caption for a figure. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Donec porttitor dolor in odio posuere, vitae ornare libero mattis. In lobortis justo vestibulum nibh aliquet, non. diff --git a/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/demo/long.rst.txt b/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/demo/long.rst.txt new file mode 100644 index 0000000000..26b1add9d1 --- /dev/null +++ b/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/demo/long.rst.txt @@ -0,0 +1,214 @@ + +*************** +Long Sticky Nav +*************** + +.. contents:: Table of Contents + +This section demonstrates how the 'sticky_navigation' setting behaves when the menu is very long. +When this section is selected, it will make the menu and the main area scroll when you are at the top of the page. + + +Example Menu 1 +============== + +Just a place holder... + + +Example Menu 2 +============== + +Just a place holder... + + +Example Menu 3 +============== + +Just a place holder... + + +Example Menu 4 +============== + +Just a place holder... + + +Example Menu 5 +============== + +Just a place holder... + + +Example Menu 6 +============== + +Just a place holder... + + +Example Menu 7 +============== + +Just a place holder... + + +Example Menu 8 +============== + +Just a place holder... + + +Example Menu 9 +============== + +Just a place holder... + + +Example Menu 10 +=============== + +Just a place holder... + + +Example Menu 11 +=============== + +Just a place holder... + + +Example Menu 12 +=============== + +Just a place holder... + + +Example Menu 13 +=============== + +Just a place holder... + + +Example Menu 14 +=============== + +Just a place holder... + + +Example Menu 15 +=============== + +Just a place holder... + + +Example Menu 16 +=============== + +Just a place holder... + + +Example Menu 17 +=============== + +Just a place holder... + + +Example Menu 18 +=============== + +Just a place holder... + + +Example Menu 19 +=============== + +Just a place holder... + + +Example Menu 20 +=============== + +Just a place holder... + +Example Submenu 1 +================= + +Just a place holder... + +Submenu 1 +--------- + +Just a place holder... + +Subsubmenu 1 +^^^^^^^^^^^^ + +Just a place holder... + +Subsubmenu 2 +^^^^^^^^^^^^ + +Just a place holder... + +Submenu 2 +--------- + +Just a place holder... + +Subsubmenu 1 +^^^^^^^^^^^^ + +Just a place holder... + +Submenu 3 +--------- + +Just a place holder... + +Submenu 4 +--------- + +Just a place holder... + +Submenu 5 +--------- + +Just a place holder... + +Example Submenu 2 +================= + +Just a place holder... + +Submenu 1 +--------- + +Just a place holder... + +Subsubmenu 1 +^^^^^^^^^^^^ + +Just a place holder... + +Submenu 2 +--------- + +Just a place holder... + +Subsubmenu 1 +^^^^^^^^^^^^ + +Just a place holder... + +Submenu 3 +--------- + +Just a place holder... + +Submenu 4 +--------- + +Just a place holder... + +Submenu 5 +--------- + +Just a place holder... diff --git a/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/demo/structure.rst.txt b/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/demo/structure.rst.txt new file mode 100644 index 0000000000..d21fc96321 --- /dev/null +++ b/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/demo/structure.rst.txt @@ -0,0 +1,101 @@ + +******************* +Structural Elements +******************* + +.. contents:: Table of Contents + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec lorem neque, interdum in ipsum nec, +finibus dictum velit. Ut eu efficitur arcu, id aliquam erat. In sit amet diam gravida, imperdiet tellus eu, +gravida nisl. Praesent aliquet odio eget libero elementum, quis rhoncus tellus tincidunt. +Suspendisse quis volutpat ipsum. Sed lobortis scelerisque tristique. Aenean condimentum risus tellus, +quis accumsan ipsum laoreet ut. Integer porttitor maximus suscipit. Mauris in posuere sapien. +Aliquam accumsan feugiat ligula, nec fringilla libero commodo sed. Proin et erat pharetra. + +--------- + +Etiam turpis ante, luctus sed velit tristique, finibus volutpat dui. Nam sagittis vel ante nec malesuada. +Praesent dignissim mi nec ornare elementum. Nunc eu augue vel sem dignissim cursus sed et nulla. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Pellentesque dictum dui sem, non placerat tortor rhoncus in. Sed placerat nulla at rhoncus iaculis. + +Document Section +================ + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum nulla vel neque venenatis, +nec placerat lorem placerat. Cras purus eros, gravida vitae tincidunt id, vehicula nec nulla. +Fusce aliquet auctor cursus. Phasellus ex neque, vestibulum non est vitae, viverra fringilla tortor. +Donec vestibulum convallis justo, a faucibus lorem vulputate vel. Aliquam cursus odio eu felis sodales aliquet. +Aliquam erat volutpat. Maecenas eget dictum mauris. Suspendisse arcu eros, condimentum eget risus sed, +luctus efficitur arcu. Cras ut dictum mi. Nulla congue interdum lorem, semper semper enim commodo nec. + +Document Subsection +------------------- + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam efficitur in eros et blandit. Nunc maximus, +nisl at auctor vestibulum, justo ex sollicitudin ligula, id faucibus urna orci tristique nisl. +Duis auctor rutrum orci, in ornare lacus condimentum quis. Quisque arcu velit, facilisis quis interdum ac, +hendrerit auctor mauris. Curabitur urna nibh, porttitor at ante sit amet, vestibulum interdum dolor. +Duis dictum elit orci, tincidunt imperdiet sem pellentesque et. In vehicula pellentesque varius. +Phasellus a turpis sollicitudin, bibendum massa et, imperdiet neque. Integer quis sapien in magna rutrum bibendum. +Integer cursus ex sed magna vehicula finibus. Proin tempus orci quis dolor tempus, nec condimentum odio vestibulum. +Etiam efficitur sollicitudin libero, tincidunt volutpat ligula interdum sed. + +Document Subsubsection +^^^^^^^^^^^^^^^^^^^^^^ + +Donec non rutrum lorem. Aenean sagittis metus at pharetra fringilla. Nunc sapien dolor, cursus sed nisi at, +pretium tristique lectus. Sed pellentesque leo lectus, et convallis ipsum euismod a. +Integer at leo vitae felis pretium aliquam fringilla quis odio. Sed pharetra enim accumsan feugiat pretium. +Maecenas at pharetra tortor. Morbi semper eget mi vel finibus. Cras rutrum nulla eros, id feugiat arcu pellentesque ut. +Sed finibus tortor ac nisi ultrices viverra. Duis feugiat malesuada sapien, at commodo ante porttitor ac. +Curabitur posuere mauris mi, vel ornare orci scelerisque sit amet. Suspendisse nec fringilla dui. + +Document Paragraph +"""""""""""""""""" + +Pellentesque nec est in odio ultrices elementum. Vestibulum et hendrerit sapien, quis vulputate turpis. +Suspendisse potenti. Curabitur tristique sit amet lectus non viverra. Phasellus rutrum dapibus turpis sed imperdiet. +Mauris maximus viverra ante. Donec eu egestas mauris. Morbi vulputate tincidunt euismod. Integer vel porttitor neque. +Donec at lacus suscipit, lacinia lectus vel, sagittis lectus. + +********************* +Structural Elements 2 +********************* + +Etiam turpis ante, luctus sed velit tristique, finibus volutpat dui. Nam sagittis vel ante nec malesuada. +Praesent dignissim mi nec ornare elementum. Nunc eu augue vel sem dignissim cursus sed et nulla. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Pellentesque dictum dui sem, non placerat tortor rhoncus in. Sed placerat nulla at rhoncus iaculis. + +Document Section +================ + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum nulla vel neque venenatis, +nec placerat lorem placerat. Cras purus eros, gravida vitae tincidunt id, vehicula nec nulla. +Fusce aliquet auctor cursus. Phasellus ex neque, vestibulum non est vitae, viverra fringilla tortor. +Donec vestibulum convallis justo, a faucibus lorem vulputate vel. Aliquam cursus odio eu felis sodales aliquet. +Aliquam erat volutpat. Maecenas eget dictum mauris. Suspendisse arcu eros, condimentum eget risus sed, +luctus efficitur arcu. Cras ut dictum mi. Nulla congue interdum lorem, semper semper enim commodo nec. + +Document Subsection +------------------- + +.. figure:: static/yi_jing_01_chien.jpg + :align: right + :figwidth: 200px + + This is a caption for a figure. Text should wrap around the caption. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam efficitur in eros et blandit. Nunc maximus, +nisl at auctor vestibulum, justo ex sollicitudin ligula, id faucibus urna orci tristique nisl. +Duis auctor rutrum orci, in ornare lacus condimentum quis. Quisque arcu velit, facilisis quis interdum ac, +hendrerit auctor mauris. Curabitur urna nibh, porttitor at ante sit amet, vestibulum interdum dolor. +Duis dictum elit orci, tincidunt imperdiet sem pellentesque et. In vehicula pellentesque varius. +Phasellus a turpis sollicitudin, bibendum massa et, imperdiet neque. Integer quis sapien in magna rutrum bibendum. +Integer cursus ex sed magna vehicula finibus. Proin tempus orci quis dolor tempus, nec condimentum odio vestibulum. +Etiam efficitur sollicitudin libero, tincidunt volutpat ligula interdum sed. Praesent congue sagittis nisl et suscipit. +Vivamus sagittis risus et egestas commodo.Cras venenatis arcu in pharetra interdum. +Donec quis metus porttitor tellus cursus lobortis. Quisque et orci magna. Fusce rhoncus mi mi, +at vehicula massa rhoncus quis. Mauris augue leo, pretium eget molestie vitae, efficitur nec nulla. +In hac habitasse platea dictumst. Sed sit amet imperdiet purus. diff --git a/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/index.rst.txt b/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/index.rst.txt new file mode 100644 index 0000000000..ba42326fd7 --- /dev/null +++ b/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/index.rst.txt @@ -0,0 +1,27 @@ +.. include:: ../README.rst + +.. toctree:: + :caption: Theme Documentation + :maxdepth: 2 + + installing + configuring + changelog + + +.. toctree:: + :maxdepth: 2 + :numbered: + :caption: Demo Documents + + demo/structure + demo/demo + demo/lists_tables + demo/api + +.. toctree:: + :maxdepth: 3 + :numbered: + :caption: This is an incredibly long caption for a long menu + + demo/long diff --git a/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/installing.rst.txt b/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/installing.rst.txt new file mode 100644 index 0000000000..df406b999d --- /dev/null +++ b/docs/v1.2.0/_sources/src/pytorch-sphinx-theme/docs/installing.rst.txt @@ -0,0 +1,17 @@ + +************ +Installation +************ + +Via Git or Download +=================== + +Symlink or subtree the ``pytorch_sphinx_theme`` repository into your documentation at +``docs/_themes/pytorch_sphinx_theme`` then add the following two settings to your Sphinx +``conf.py`` file: + +.. code:: python + + html_theme = "pytorch_sphinx_theme" + html_theme_path = ["_themes", ] + diff --git a/docs/v1.2.0/_sources/tutorials/creating_torchscript_module_in_python.rst.txt b/docs/v1.2.0/_sources/tutorials/creating_torchscript_module_in_python.rst.txt new file mode 100644 index 0000000000..1d1cdba574 --- /dev/null +++ b/docs/v1.2.0/_sources/tutorials/creating_torchscript_module_in_python.rst.txt @@ -0,0 +1,140 @@ +.. _creating_a_ts_mod: + +Creating a TorchScript Module +------------------------------ +TorchScript is a way to create serializable and optimizable models from PyTorch code. +PyTorch has detailed documentation on how to do this https://pytorch.org/tutorials/beginner/Intro_to_TorchScript_tutorial.html but briefly here is the +here is key background information and the process: + +PyTorch programs are based around ``Module`` s which can be used to compose higher level modules. ``Modules`` contain a constructor to set up the modules, parameters and sub-modules +and a forward function which describes how to use the parameters and submodules when the module is invoked. + +For example, we can define a LeNet module like this: + +.. code-block:: python + :linenos: + + import torch.nn as nn + import torch.nn.functional as F + + + class LeNetFeatExtractor(nn.Module): + def __init__(self): + super(LeNetFeatExtractor, self).__init__() + self.conv1 = nn.Conv2d(1, 6, 3) + self.conv2 = nn.Conv2d(6, 16, 3) + + def forward(self, x): + x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) + x = F.max_pool2d(F.relu(self.conv2(x)), 2) + return x + + + class LeNetClassifier(nn.Module): + def __init__(self): + super(LeNetClassifier, self).__init__() + self.fc1 = nn.Linear(16 * 6 * 6, 120) + self.fc2 = nn.Linear(120, 84) + self.fc3 = nn.Linear(84, 10) + + def forward(self, x): + x = torch.flatten(x, 1) + x = F.relu(self.fc1(x)) + x = F.relu(self.fc2(x)) + x = self.fc3(x) + return x + + + class LeNet(nn.Module): + def __init__(self): + super(LeNet, self).__init__() + self.feat = LeNetFeatExtractor() + self.classifer = LeNetClassifier() + + def forward(self, x): + x = self.feat(x) + x = self.classifer(x) + return x + +. + + Obviously you may want to consolidate such a simple model into a single module but we can see the composability of PyTorch here + +From here are two pathways for going from PyTorch Python code to TorchScript code: Tracing and Scripting. + +Tracing follows the path of execution when the module is called and records what happens. +To trace an instance of our LeNet module, we can call ``torch.jit.trace`` with an example input. + +.. code-block:: python + + import torch + + model = LeNet() + input_data = torch.empty([1, 1, 32, 32]) + traced_model = torch.jit.trace(model, input_data) + +Scripting actually inspects your code with a compiler and generates an equivalent TorchScript program. The difference is that since tracing +is following the execution of your module, it cannot pick up control flow for instance. By working from the Python code, the compiler can +include these components. We can run the script compiler on our LeNet module by calling ``torch.jit.script`` + +.. code-block:: python + + import torch + + model = LeNet() + script_model = torch.jit.script(model) + +There are reasons to use one path or another, the PyTorch documentation has information on how to choose. From a Torch-TensorRT prespective, there is +better support (i.e your module is more likely to compile) for traced modules because it doesn't include all the complexities of a complete +programming language, though both paths supported. + +After scripting or tracing your module, you are given back a TorchScript Module. This contains the code and parameters used to run the module stored +in a intermediate representation that Torch-TensorRT can consume. + +Here is what the LeNet traced module IR looks like: + +.. code-block:: none + + graph(%self.1 : __torch__.___torch_mangle_10.LeNet, + %input.1 : Float(1, 1, 32, 32)): + %129 : __torch__.___torch_mangle_9.LeNetClassifier = prim::GetAttr[name="classifer"](%self.1) + %119 : __torch__.___torch_mangle_5.LeNetFeatExtractor = prim::GetAttr[name="feat"](%self.1) + %137 : Tensor = prim::CallMethod[name="forward"](%119, %input.1) + %138 : Tensor = prim::CallMethod[name="forward"](%129, %137) + return (%138) + +and the LeNet scripted module IR: + +.. code-block:: none + + graph(%self : __torch__.LeNet, + %x.1 : Tensor): + %2 : __torch__.LeNetFeatExtractor = prim::GetAttr[name="feat"](%self) + %x.3 : Tensor = prim::CallMethod[name="forward"](%2, %x.1) # x.py:38:12 + %5 : __torch__.LeNetClassifier = prim::GetAttr[name="classifer"](%self) + %x.5 : Tensor = prim::CallMethod[name="forward"](%5, %x.3) # x.py:39:12 + return (%x.5) + +You can see that the IR preserves the module structure we have in our python code. + +.. _ts_in_py: + +Working with TorchScript in Python +----------------------------------- + +TorchScript Modules are run the same way you run normal PyTorch modules. You can run the forward pass using the +``forward`` method or just calling the module ``torch_scirpt_module(in_tensor)`` The JIT compiler will compile +and optimize the module on the fly and then returns the results. + +Saving TorchScript Module to Disk +----------------------------------- + +For either traced or scripted modules, you can save the module to disk with the following command + +.. code-block:: python + + import torch + + model = LeNet() + script_model = torch.jit.script(model) + script_model.save("lenet_scripted.ts") diff --git a/docs/v1.2.0/_sources/tutorials/getting_started_with_cpp_api.rst.txt b/docs/v1.2.0/_sources/tutorials/getting_started_with_cpp_api.rst.txt new file mode 100644 index 0000000000..41b8a448c0 --- /dev/null +++ b/docs/v1.2.0/_sources/tutorials/getting_started_with_cpp_api.rst.txt @@ -0,0 +1,338 @@ +.. _getting_started: + +Getting Started with C++ +======================== + +If you haven't already, acquire a tarball of the library by following the instructions in :ref:`Installation` + +Using Torch-TensorRT in C++ +*************************** +Torch-TensorRT C++ API accepts TorchScript modules (generated either from ``torch.jit.script`` or ``torch.jit.trace``) as an input and returns +a Torchscript module (optimized using TensorRT). This requires users to use Pytorch (in python) to generate torchscript modules beforehand. +Please refer to `Creating TorchScript modules in Python `_ section to generate torchscript graphs. + + +.. _torch_tensorrt_quickstart: + +[Torch-TensorRT Quickstart] Compiling TorchScript Modules with ``torchtrtc`` +--------------------------------------------------------------------------------- + +An easy way to get started with Torch-TensorRT and to check if your model can be supported without extra work is to run it through +``torchtrtc``, which supports almost all features of the compiler from the command line including post training quantization +(given a previously created calibration cache). For example we can compile our lenet model by setting our preferred operating +precision and input size. This new TorchScript file can be loaded into Python (note: you need to ``import torch_tensorrt`` before loading +these compiled modules because the compiler extends the PyTorch the deserializer and runtime to execute compiled modules). + +.. code-block:: shell + + ❯ torchtrtc -p f16 lenet_scripted.ts trt_lenet_scripted.ts "(1,1,32,32)" + + ❯ python3 + Python 3.6.9 (default, Apr 18 2020, 01:56:04) + [GCC 8.4.0] on linux + Type "help", "copyright", "credits" or "license" for more information. + >>> import torch + >>> import torch_tensorrt + >>> ts_model = torch.jit.load(“trt_lenet_scripted.ts”) + >>> ts_model(torch.randn((1,1,32,32)).to(“cuda”).half()) + +You can learn more about ``torchtrtc`` usage here: :ref:`torchtrtc` + +.. _ts_in_cc: + +Working with TorchScript in C++ +-------------------------------- + +If we are developing an application to deploy with C++, we can save either our traced or scripted module using ``torch.jit.save`` +which will serialize the TorchScript code, weights and other information into a package. This is also where our dependency on Python ends. + +.. code-block:: python + + torch_script_module.save("lenet.jit.pt") + +From here we can now load our TorchScript module in C++ + +.. code-block:: c++ + + #include // One-stop header. + + #include + #include + + int main(int argc, const char* argv[]) { + torch::jit::Module module; + try { + // Deserialize the ScriptModule from a file using torch::jit::load(). + module = torch::jit::load(""); + } + catch (const c10::Error& e) { + std::cerr << "error loading the model\n"; + return -1; + } + + std::cout << "ok\n"; + + +You can do full training and inference in C++ with PyTorch / LibTorch if you would like, you can even define your modules in C++ and +have access to the same powerful tensor library that backs PyTorch. (For more information: https://pytorch.org/cppdocs/). +For instance we can do inference with our LeNet module like this: + +.. code-block:: c++ + + mod.eval(); + torch::Tensor in = torch::randn({1, 1, 32, 32}); + auto out = mod.forward(in); + +and to run on the GPU: + +.. code-block:: c++ + + mod.eval(); + mod.to(torch::kCUDA); + torch::Tensor in = torch::randn({1, 1, 32, 32}, torch::kCUDA); + auto out = mod.forward(in); + +As you can see it is pretty similar to the Python API. When you call the ``forward`` method, you invoke the PyTorch JIT compiler, which will optimize and run your TorchScript code. + +.. _compile_cpp: + +Compiling with Torch-TensorRT in C++ +------------------------------------- +We are also at the point were we can compile and optimize our module with Torch-TensorRT, but instead of in a JIT fashion we must do it ahead-of-time (AOT) i.e. before we start doing actual inference work +since it takes a bit of time to optimize the module, it would not make sense to do this every time you run the module or even the first time you run it. + +With our module loaded, we can feed it into the Torch-TensorRT compiler. When we do so we must provide some information on the expected input size and also configure any additional settings. + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + ... + + mod.to(at::kCUDA); + mod.eval(); + + auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}); + auto trt_mod = torch_tensorrt::CompileGraph(mod, std::vector{{in.sizes()}}); + auto out = trt_mod.forward({in}); + +Thats it! Now the graph runs primarily not with the JIT compiler but using TensorRT (though we execute the graph using the JIT runtime). + +We can also set settings like operating precision to run in FP16. + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + ... + + mod.to(at::kCUDA); + mod.eval(); + + auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}).to(torch::kHALF); + auto input_sizes = std::vector({in.sizes()}); + torch_tensorrt::CompileSpec info(input_sizes); + info.enable_precisions.insert(torch::kHALF); + auto trt_mod = torch_tensorrt::CompileGraph(mod, info); + auto out = trt_mod.forward({in}); + +And now we are running the module in FP16 precision. You can then save the module to load later. + +.. code-block:: c++ + + trt_mod.save("") + +Torch-TensorRT compiled TorchScript modules are loaded in the same way as normal TorchScript module. Make sure your deployment application is linked against ``libtorchtrt.so`` + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + + int main(int argc, const char* argv[]) { + torch::jit::Module module; + try { + // Deserialize the ScriptModule from a file using torch::jit::load(). + module = torch::jit::load(""); + } + catch (const c10::Error& e) { + std::cerr << "error loading the model\n"; + return -1; + } + + torch::Tensor in = torch::randn({1, 1, 32, 32}, torch::kCUDA); + auto out = mod.forward(in); + + std::cout << "ok\n"; + } + +If you want to save the engine produced by Torch-TensorRT to use in a TensorRT application you can use the ``ConvertGraphToTRTEngine`` API. + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + ... + + mod.to(at::kCUDA); + mod.eval(); + + auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}).to(torch::kHALF); + auto input_sizes = std::vector({in.sizes()}); + torch_tensorrt::CompileSpec info(input_sizes); + info.enabled_precisions.insert(torch::kHALF); + auto trt_mod = torch_tensorrt::ConvertGraphToTRTEngine(mod, "forward", info); + std::ofstream out("/tmp/engine_converted_from_jit.trt"); + out << engine; + out.close(); + +.. _under_the_hood: + +Under The Hood +--------------- + +When a module is provided to Torch-TensorRT, the compiler starts by mapping a graph like you saw above to a graph like this: + +.. code-block:: none + + graph(%input.2 : Tensor): + %2 : Float(84, 10) = prim::Constant[value=]() + %3 : Float(120, 84) = prim::Constant[value=]() + %4 : Float(576, 120) = prim::Constant[value=]() + %5 : int = prim::Constant[value=-1]() # x.py:25:0 + %6 : int[] = prim::Constant[value=annotate(List[int], [])]() + %7 : int[] = prim::Constant[value=[2, 2]]() + %8 : int[] = prim::Constant[value=[0, 0]]() + %9 : int[] = prim::Constant[value=[1, 1]]() + %10 : bool = prim::Constant[value=1]() # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0 + %11 : int = prim::Constant[value=1]() # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0 + %12 : bool = prim::Constant[value=0]() # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0 + %self.classifer.fc3.bias : Float(10) = prim::Constant[value= 0.0464 0.0383 0.0678 0.0932 0.1045 -0.0805 -0.0435 -0.0818 0.0208 -0.0358 [ CUDAFloatType{10} ]]() + %self.classifer.fc2.bias : Float(84) = prim::Constant[value=]() + %self.classifer.fc1.bias : Float(120) = prim::Constant[value=]() + %self.feat.conv2.weight : Float(16, 6, 3, 3) = prim::Constant[value=]() + %self.feat.conv2.bias : Float(16) = prim::Constant[value=]() + %self.feat.conv1.weight : Float(6, 1, 3, 3) = prim::Constant[value=]() + %self.feat.conv1.bias : Float(6) = prim::Constant[value= 0.0530 -0.1691 0.2802 0.1502 0.1056 -0.1549 [ CUDAFloatType{6} ]]() + %input0.4 : Tensor = aten::_convolution(%input.2, %self.feat.conv1.weight, %self.feat.conv1.bias, %9, %8, %9, %12, %8, %11, %12, %12, %10) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0 + %input0.5 : Tensor = aten::relu(%input0.4) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0 + %input1.2 : Tensor = aten::max_pool2d(%input0.5, %7, %6, %8, %9, %12) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0 + %input0.6 : Tensor = aten::_convolution(%input1.2, %self.feat.conv2.weight, %self.feat.conv2.bias, %9, %8, %9, %12, %8, %11, %12, %12, %10) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0 + %input2.1 : Tensor = aten::relu(%input0.6) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0 + %x.1 : Tensor = aten::max_pool2d(%input2.1, %7, %6, %8, %9, %12) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0 + %input.1 : Tensor = aten::flatten(%x.1, %11, %5) # x.py:25:0 + %27 : Tensor = aten::matmul(%input.1, %4) + %28 : Tensor = trt::const(%self.classifer.fc1.bias) + %29 : Tensor = aten::add_(%28, %27, %11) + %input0.2 : Tensor = aten::relu(%29) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0 + %31 : Tensor = aten::matmul(%input0.2, %3) + %32 : Tensor = trt::const(%self.classifer.fc2.bias) + %33 : Tensor = aten::add_(%32, %31, %11) + %input1.1 : Tensor = aten::relu(%33) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0 + %35 : Tensor = aten::matmul(%input1.1, %2) + %36 : Tensor = trt::const(%self.classifer.fc3.bias) + %37 : Tensor = aten::add_(%36, %35, %11) + return (%37) + (CompileGraph) + +The graph has now been transformed from a collection of modules, each managing their own parameters into a single graph with the parameters inlined +into the graph and all of the operations laid out. Torch-TensorRT has also executed a number of optimizations and mappings to make the graph easier to translate to TensorRT. +From here the compiler can assemble the TensorRT engine by following the dataflow through the graph. + +When the graph construction phase is complete, Torch-TensorRT produces a serialized TensorRT engine. From here depending on the API, this engine is returned +to the user or moves into the graph construction phase. Here Torch-TensorRT creates a JIT Module to execute the TensorRT engine which will be instantiated and managed +by the Torch-TensorRT runtime. + +Here is the graph that you get back after compilation is complete: + +.. code-block:: none + + graph(%self_1 : __torch__.lenet, %input_0 : Tensor): + %1 : ...trt.Engine = prim::GetAttr[name="lenet"](%self_1) + %3 : Tensor[] = prim::ListConstruct(%input_0) + %4 : Tensor[] = trt::execute_engine(%3, %1) + %5 : Tensor = prim::ListUnpack(%4) + return (%5) + + +You can see the call where the engine is executed, after extracting the attribute containing the engine and constructing a list of inputs, then returns the tensors back to the user. + +.. _unsupported_ops: + +Working with Unsupported Operators +----------------------------------- + +Torch-TensorRT is a new library and the PyTorch operator library is quite large, so there will be ops that aren't supported natively by the compiler. You can either use the composition techinques +shown above to make modules are fully Torch-TensorRT supported and ones that are not and stitch the modules together in the deployment application or you can register converters for missing ops. + + You can check support without going through the full compilation pipleine using the ``torch_tensorrt::CheckMethodOperatorSupport(const torch::jit::Module& module, std::string method_name)`` api + to see what operators are not supported. ``torchtrtc`` automatically checks modules with this method before starting compilation and will print out a list of operators that are not supported. + +.. _custom_converters: + +Registering Custom Converters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Operations are mapped to TensorRT through the use of modular converters, a function that takes a node from a the JIT graph and produces an equivalent layer or subgraph in TensorRT. +Torch-TensorRT ships with a library of these converters stored in a registry, that will be executed depending on the node being parsed. For instance a ``aten::relu(%input0.4)`` instruction will trigger +the relu converter to be run on it, producing an activation layer in the TensorRT graph. But since this library is not exhaustive you may need to write your own to get Torch-TensorRT +to support your module. + +Shipped with the Torch-TensorRT distribution are the internal core API headers. You can therefore access the converter registry and add a converter for the op you need. + +For example, if we try to compile a graph with a build of Torch-TensorRT that doesn't support the flatten operation (``aten::flatten``) you may see this error: + +.. code-block:: none + + terminate called after throwing an instance of 'torch_tensorrt::Error' + what(): [enforce fail at core/conversion/conversion.cpp:109] Expected converter to be true but got false + Unable to convert node: %input.1 : Tensor = aten::flatten(%x.1, %11, %5) # x.py:25:0 (conversion.AddLayer) + Schema: aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor) + Converter for aten::flatten requested, but no such converter was found. + If you need a converter for this operator, you can try implementing one yourself + or request a converter: https://www.github.com/NVIDIA/Torch-TensorRT/issues + +We can register a converter for this operator in our application. All of the tools required to build a converter can be imported by including ``torch_tensorrt/core/conversion/converters/converters.h``. +We start by creating an instance of the self-registering class ``torch_tensorrt::core::conversion::converters::RegisterNodeConversionPatterns()`` which will register converters +in the global converter registry, associating a function schema like ``aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor)`` with a lambda that +will take the state of the conversion, the node/operation in question to convert and all of the inputs to the node and produces as a side effect a new layer in the TensorRT network. +Arguments are passed as a vector of inspectable unions of TensorRT ``ITensors`` and Torch ``IValues`` in the order arguments are listed in the schema. + +Below is a implementation of a ``aten::flatten`` converter that we can use in our application. You have full access to the Torch and TensorRT libraries in the converter implementation. So +for example we can quickly get the output size by just running the operation in PyTorch instead of implementing the full calculation outself like we do below for this flatten converter. + +.. code-block:: c++ + + #include "torch/script.h" + #include "torch_tensorrt/torch_tensorrt.h" + #include "torch_tensorrt/core/conversion/converters/converters.h" + + static auto flatten_converter = torch_tensorrt::core::conversion::converters::RegisterNodeConversionPatterns() + .pattern({ + "aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor)", + [](torch_tensorrt::core::conversion::ConversionCtx* ctx, + const torch::jit::Node* n, + torch_tensorrt::core::conversion::converters::args& args) -> bool { + auto in = args[0].ITensor(); + auto start_dim = args[1].unwrapToInt(); + auto end_dim = args[2].unwrapToInt(); + auto in_shape = torch_tensorrt::core::util::toVec(in->getDimensions()); + auto out_shape = torch::flatten(torch::rand(in_shape), start_dim, end_dim).sizes(); + + auto shuffle = ctx->net->addShuffle(*in); + shuffle->setReshapeDimensions(torch_tensorrt::core::util::toDims(out_shape)); + shuffle->setName(torch_tensorrt::core::util::node_info(n).c_str()); + + auto out_tensor = ctx->AssociateValueAndTensor(n->outputs()[0], shuffle->getOutput(0)); + return true; + } + }); + + int main() { + ... + +To use this converter in Python, it is recommended to use PyTorch's `C++ / CUDA Extention `_ +template to wrap your library of converters into a ``.so`` that you can load with ``ctypes.CDLL()`` in your Python application. + +You can find more information on all the details of writing converters in the contributors documentation (:ref:`writing_converters`). +If you find yourself with a large library of converter implementations, do consider upstreaming them, PRs are welcome and it would be great for the community to benefit as well. diff --git a/docs/v1.2.0/_sources/tutorials/getting_started_with_fx_path.rst.txt b/docs/v1.2.0/_sources/tutorials/getting_started_with_fx_path.rst.txt new file mode 100644 index 0000000000..7d782445a2 --- /dev/null +++ b/docs/v1.2.0/_sources/tutorials/getting_started_with_fx_path.rst.txt @@ -0,0 +1,333 @@ +.. _getting_started_with_fx: + +Torch-TensorRT (FX Frontend) User Guide +======================== +Torch-TensorRT (FX Frontend) is a tool that can convert a PyTorch model through ``torch.fx`` to an +TensorRT engine optimized targeting running on Nvidia GPUs. TensorRT is the inference engine +developed by NVIDIA which composed of various kinds of optimization including kernel fusion, +graph optimization, low precision, etc.. This tool is developed in Python environment which allows this +workflow to be very accessible to researchers and engineers. There are a few stages that a +user want to use this tool and we will introduce them here. + +> Torch-TensorRT (FX Frontend) is in ``Beta`` and currently it is recommended to work with PyTorch nightly. + +.. code-block:: shell + + # Test an example by + $ python py/torch_tensorrt/fx/example/lower_example.py + + +Converting a PyTorch Model to TensorRT Engine +--------------------------------------------- +In general, users are welcome to use the ``compile()`` to finish the conversion from a model to tensorRT engine. It is a +wrapper API that consists of the major steps needed to finish this converison. Please refer to an example usage in ``lower_example.py`` file under ``examples/fx``. + +.. code-block:: shell + + def compile( + module: nn.Module, + input, + max_batch_size=2048, + max_workspace_size=33554432, + explicit_batch_dimension=False, + lower_precision=LowerPrecision.FP16, + verbose_log=False, + timing_cache_prefix="", + save_timing_cache=False, + cuda_graph_batch_size=-1, + dynamic_batch=True, + ) -> nn.Module: + + """ + Takes in original module, input and lowering setting, run lowering workflow to turn module + into lowered module, or so called TRTModule. + + Args: + module: Original module for lowering. + input: Input for module. + max_batch_size: Maximum batch size (must be >= 1 to be set, 0 means not set) + max_workspace_size: Maximum size of workspace given to TensorRT. + explicit_batch_dimension: Use explicit batch dimension in TensorRT if set True, otherwise use implicit batch dimension. + lower_precision: lower_precision config given to TRTModule. + verbose_log: Enable verbose log for TensorRT if set True. + timing_cache_prefix: Timing cache file name for timing cache used by fx2trt. + save_timing_cache: Update timing cache with current timing cache data if set to True. + cuda_graph_batch_size: Cuda graph batch size, default to be -1. + dynamic_batch: batch dimension (dim=0) is dynamic. + Returns: + A torch.nn.Module lowered by TensorRT. + """ + +In this section, we will go through an example to illustrate the major steps that fx path uses. +Users can refer to ``fx2trt_example.py`` file in ``examples/fx``. + +* **Step 1: Trace the model with acc_tracer** +Acc_tracer is a tracer inheritated from FX tracer. It comes with args normalizer to convert all args to kwargs and pass to TRT converters. + +.. code-block:: shell + + import torch_tensorrt.fx.tracer.acc_tracer.acc_tracer as acc_tracer + + # Build the model which needs to be a PyTorch nn.Module. + my_pytorch_model = build_model() + + # Prepare inputs to the model. Inputs have to be a List of Tensors + inputs = [Tensor, Tensor, ...] + + # Trace the model with acc_tracer. + acc_mod = acc_tracer.trace(my_pytorch_model, inputs) + +*Common Errors:* + +symbolically traced variables cannot be used as inputs to control flow +This means the model contains dynamic control flow. Please refer to section “Dynamic Control Flow” in `FX guide `_. + +* **Step 2: Build TensorRT engine** +There are `two different modes `_ for how TensorRT handles batch dimension, explicit batch dimension and implicit batch dimension. This mode was used by early versions of TensorRT, and is now deprecated but continues to be supported for backwards compatibility. In explicit batch mode, all dimensions are explicit and can be dynamic, that is their length can change at execution time. Many new features, such as dynamic shapes and loops, are available only in this mode. User can still choose to use implicit batch mode when they set ``explicit_batch_dimension=False`` in ``compile()``. We do not recommend to use it since it will lack of support in future TensorRT versions. + +Explicit batch is the default mode and it must be set for dynamic shape. For most of vision task, user can choose to enable ``dynamic_batch`` in ``compile()`` if they want to get the similar effects as implicit mode where only batch dimension changes. It has some requirements: +1. Shapes of inputs, outputs and activations are fixed except batch dimension. +2. Inputs, outputs and activations have batch dimension as the major dimension. +3. All the operators in the model do not modify batch dimension (permute, transpose, split, etc.) or compute over batch dimension (sum, softmax, etc.). + +For examples of the last path, if we have a 3D tensor t shaped as (batch, sequence, dimension), operations such as torch.transpose(0, 2). If any of these three are not satisfied, we’ll need to specify InputTensorSpec as inputs with dynamic range. + +c + + import deeplearning.trt.fx2trt.converter.converters + from torch.fx.experimental.fx2trt.fx2trt import InputTensorSpec, TRTInterpreter + + # InputTensorSpec is a dataclass we use to store input information. + # There're two ways we can build input_specs. + # Option 1, build it manually. + input_specs = [ + InputTensorSpec(shape=(1, 2, 3), dtype=torch.float32), + InputTensorSpec(shape=(1, 4, 5), dtype=torch.float32), + ] + # Option 2, build it using sample_inputs where user provide a sample + inputs = [ + torch.rand((1,2,3), dtype=torch.float32), + torch.rand((1,4,5), dtype=torch.float32), + ] + input_specs = InputTensorSpec.from_tensors(inputs) + + # IMPORTANT: If dynamic shape is needed, we need to build it slightly differently. + input_specs = [ + InputTensorSpec( + shape=(-1, 2, 3), + dtype=torch.float32, + # Currently we only support one set of dynamic range. User may set other dimensions but it is not promised to work for any models + # (min_shape, optimize_target_shape, max_shape) + # For more information refer to fx/input_tensor_spec.py + shape_ranges = [ + ((1, 2, 3), (4, 2, 3), (100, 2, 3)), + ], + ), + InputTensorSpec(shape=(1, 4, 5), dtype=torch.float32), + ] + + # Build a TRT interpreter. Set explicit_batch_dimension accordingly. + interpreter = TRTInterpreter( + acc_mod, input_specs, explicit_batch_dimension=True/False + ) + + # The output of TRTInterpreter run() is wrapped as TRTInterpreterResult. + # The TRTInterpreterResult contains required parameter to build TRTModule, + # and other informational output from TRTInterpreter run. + class TRTInterpreterResult(NamedTuple): + engine: Any + input_names: Sequence[str] + output_names: Sequence[str] + serialized_cache: bytearray + + #max_batch_size: set accordingly for maximum batch size you will use. + #max_workspace_size: set to the maximum size we can afford for temporary buffer + #lower_precision: the precision model layers are running on (TensorRT will choose the best perforamnce precision). + #sparse_weights: allow the builder to examine weights and use optimized functions when weights have suitable sparsity + #force_fp32_output: force output to be fp32 + #strict_type_constraints: Usually we should set it to False unless we want to control the precision of certain layer for numeric #reasons. + #algorithm_selector: set up algorithm selection for certain layer + #timing_cache: enable timing cache for TensorRT + #profiling_verbosity: TensorRT logging level + trt_interpreter_result = interpreter.run( + max_batch_size=64, + max_workspace_size=1 << 25, + sparse_weights=False, + force_fp32_output=False, + strict_type_constraints=False, + algorithm_selector=None, + timing_cache=None, + profiling_verbosity=None, + ) + + +*Common Errors:* + +RuntimeError: Conversion of function xxx not currently supported! +- This means we don’t have the support for this xxx operator. Please refer to section “How to add a missing op” below for further instructions. + +* **Step 3: Run the model** +One way is using TRTModule, which is basically a PyTorch nn.Module. + +.. code-block:: shell + + from torch_tensorrt.fx import TRTModule + mod = TRTModule( + trt_interpreter_result.engine, + trt_interpreter_result.input_names, + trt_interpreter_result.output_names) + # Just like all other PyTorch modules + outputs = mod(*inputs) + torch.save(mod, "trt.pt") + reload_trt_mod = torch.load("trt.pt") + reload_model_output = reload_trt_mod(*inputs) + +So far, we give a detailed explanation of major steps in convterting a PyTorch model into TensorRT engine. Users are welcome to refer to the source code for some parameters explanations. In the converting scheme, there are two important actions in it. One is acc tracer which helps us to convert a PyTorch model to acc graph. The other is FX path converter which helps to convert the acc graph's operation to corresponding TensorRT operation and build up the TensoRT engine for it. + +Acc Tracer +--------- + +Acc tracer is a custom FX symbolic tracer. It does a couple more things compare to the vanilla FX symbolic tracer. We mainly depend on it to convert PyTorch ops or builtin ops to acc ops. There are two main purposes for fx2trt to use acc ops: + +1. there’re many ops that do similar things in PyTorch ops and builtin ops such like torch.add, builtin.add and torch.Tensor.add. Using acc tracer, we normalize these three ops to a single acc_ops.add. This helps reduce the number of converters we need to write. +2. acc ops only have kwargs which makes writing converter easier as we don’t need to add additional logic to find arguments in args and kwargs. + +FX2TRT +-------- +After symbolic tracing, we have the graph representation of a PyTorch model. fx2trt leverages the power of fx.Interpreter. fx.Interpreter goes through the whole graph node by node and calls the function that node represents. fx2trt overrides the original behavior of calling the function with invoking corresponding converts for each node. Each converter function adds corresponding TensorRT layer(s). + +Below is an example of a converter function. The decorator is used to register this converter function with the corresponding node. In this example, we register this converter to a fx node whose target is acc_ops.sigmoid. + +.. code-block:: shell + + @tensorrt_converter(acc_ops.sigmoid) + def acc_ops_sigmoid(network, target, args, kwargs, name): + """ + network: TensorRT network. We'll be adding layers to it. + + The rest arguments are attributes of fx node. + """ + input_val = kwargs['input'] + + if not isinstance(input_val, trt.tensorrt.ITensor): + raise RuntimeError(f'Sigmoid received input {input_val} that is not part ' + 'of the TensorRT region!') + + layer = network.add_activation(input=input_val, type=trt.ActivationType.SIGMOID) + layer.name = name + return layer.get_output(0) + +How to Add a Missing Op +**************** + +You can actually add it wherever you want just need to remember import the file so that all acc ops and mapper will be registered before tracing with acc_tracer. + +* **Step 1. Add a new acc op** + +TODO: Need to explain more on the logistic of acc op like when we want to break down an op and when we want to reuse other ops. + +In `acc tracer `_, we convert nodes in the graph to acc ops if there’s a mapping registered for the node to an acc op. + +In order to make the conversion to acc ops to happen, there’re two things required. One is that there should be an acc op function defined and the other is there should be a mapping registered. + +Defining an acc op is simple, we first just need a function and register the function as an acc op via this decorator `acc_normalizer.py `_. e.g. the following code adds an acc op named foo() which adds two given inputs. + +.. code-block:: shell + + # NOTE: all acc ops should only take kwargs as inputs, therefore we need the "*" + # at the beginning. + @register_acc_op + def foo(*, input, other, alpha): + return input + alpha * other + +There’re two ways to register a mapping. One is `register_acc_op_mapping() `_. Let’s register a mapping from torch.add to foo() we just created above. We need to add decorator register_acc_op_mapping to it. + +.. code-block:: shell + + this_arg_is_optional = True + + @register_acc_op_mapping( + op_and_target=("call_function", torch.add), + arg_replacement_tuples=[ + ("input", "input"), + ("other", "other"), + ("alpha", "alpha", this_arg_is_optional), + ], + ) + @register_acc_op + def foo(*, input, other, alpha=1.0): + return input + alpha * other + +``op_and_target`` determines which node will trigger this mapping. op and target are the attributes of FX node. In acc_normalization when we see a node with the same op and target as set in the ``op_and_target``, we will trigger the mapping. Since we want to map from ``torch.add``, then op would be call_function and target would be ``torch.add``. ``arg_replacement_tuples`` determines how we construct kwargs for new acc op node using args and kwargs from original node. Each tuple in ``arg_replacement_tuples`` represents one argument mapping rule. It contains two or three elements. The third element is a boolean variable that determines whether this kwarg is optional in *original node*. We only need to specify the third element if it’s True. The first element is the argument name in original node which will be used as the acc op node’s argument whose name is the second element in the tuple. The sequence of the tuples does matter because the position of the tuple determines where the argument is in original node’s args. We use this information to map args from original node to kwargs in acc op node. +We don’t have to specify arg_replacement_tuples if none of the followings are true. + +1. kwargs of original nodes and acc op nodes have different name. +2. there’re optional arguments. + +The other way to register a mapping is through `register_custom_acc_mapper_fn() `_. This one is designed to reduce the redundant op registration as it allows you to use a function to map to one or more existing acc ops throught some combinations. In the function, you can do basically whatever you want. Let’s use an example to explain how it works. + +.. code-block:: shell + + @register_acc_op + def foo(*, input, other, alpha=1.0): + return input + alpha * other + + @register_custom_acc_mapper_fn( + op_and_target=("call_function", torch.add), + arg_replacement_tuples=[ + ("input", "input"), + ("other", "other"), + ("alpha", "alpha", this_arg_is_optional), + ], + ) + def custom_mapper(node: torch.fx.Node, _: nn.Module) -> torch.fx.Node: + """ + `node` is original node, which is a call_function node with target + being torch.add. + """ + alpha = 1 + if "alpha" in node.kwargs: + alpha = node.kwargs["alpha"] + foo_kwargs = {"input": node["input"], "other": node["other"], "alpha": alpha} + with node.graph.inserting_before(node): + foo_node = node.graph.call_function(foo, kwargs=foo_kwargs) + foo_node.meta = node.meta.copy() + return foo_node + + +In the custom mapper function, we construct an acc op node and return it. The node we returns here would take over all the children nodes of original nodes `acc_normalizer.py `_. + +The last step would be *adding unit test* for the new acc op or mapper function we added. The place to add the unit test is here `test_acc_tracer.py `_. + +* **Step 2. Add a new converter** + +All the developed converters for acc ops are all in `acc_op_converter.py `_. It could give you a good example of how the converter is added. + +Essentially, the converter is the mapping mechanism that maps the acc ops to a TensorRT layer. If we are able to find all the TensorRT layers we need we can get start to add a converter for the node using `TensorRT APIs `_. + +.. code-block:: shell + + @tensorrt_converter(acc_ops.sigmoid) + def acc_ops_sigmoid(network, target, args, kwargs, name): + """ + network: TensorRT network. We'll be adding layers to it. + + The rest arguments are attributes of fx node. + """ + input_val = kwargs['input'] + + if not isinstance(input_val, trt.tensorrt.ITensor): + raise RuntimeError(f'Sigmoid received input {input_val} that is not part ' + 'of the TensorRT region!') + + layer = network.add_activation(input=input_val, type=trt.ActivationType.SIGMOID) + layer.name = name + return layer.get_output(0) + +We need to use ``tensorrt_converter`` decorator to register the converter. The argument for the decorator is the target of the fx node that we need to convert. In the converter, we can find the inputs to the fx node in kwargs. As in the example, the original node is `acc_ops.sigmoid` which only has one argument “input” in acc_ops.py. We get the input and check if it’s a TensorRT tensor. After that, we add a sigmoid layer to TensorRT network and return the output of the layer. The output we returned will be passed to the children nodes of acc_ops.sigmoid by fx.Interpreter. + +**What if we can not find corresponding layers in TensorRT that do the same thing as the node.** + +In this case, we would need to do a bit more work. TensorRT provides plugins which serves as custom layers. *We have not implement this feature yet. We will update once it is enabled*. + +Last step would be adding the unit test for the new converter we added. User could add corresponding unit test in this `folder `_. diff --git a/docs/v1.2.0/_sources/tutorials/getting_started_with_python_api.rst.txt b/docs/v1.2.0/_sources/tutorials/getting_started_with_python_api.rst.txt new file mode 100644 index 0000000000..b63665c980 --- /dev/null +++ b/docs/v1.2.0/_sources/tutorials/getting_started_with_python_api.rst.txt @@ -0,0 +1,47 @@ +.. _getting_started_with_python_api: + +Using Torch-TensorRT in Python +******************************* + +Torch-TensorRT Python API accepts a ```torch.nn.Module`` as an input. Under the hood, it uses ``torch.jit.script`` to convert the input module into a +TorchScript module. To compile your input ```torch.nn.Module`` with Torch-TensorRT, all you need to do is provide the module and inputs +to Torch-TensorRT and you will be returned an optimized TorchScript module to run or add into another PyTorch module. Inputs +is a list of ``torch_tensorrt.Input`` classes which define input's shape, datatype and memory format. You can also specify settings such as +operating precision for the engine or target device. After compilation you can save the module just like any other module +to load in a deployment application. In order to load a TensorRT/TorchScript module, make sure you first import ``torch_tensorrt``. + +.. code-block:: python + + import torch_tensorrt + + ... + + model = MyModel().eval() # torch module needs to be in eval (not training) mode + + inputs = [torch_tensorrt.Input( + min_shape=[1, 1, 16, 16], + opt_shape=[1, 1, 32, 32], + max_shape=[1, 1, 64, 64], + dtype=torch.half, + )] + enabled_precisions = {torch.float, torch.half} # Run with fp16 + + trt_ts_module = torch_tensorrt.compile(model, inputs=inputs, enabled_precisions=enabled_precisions) + + input_data = input_data.to('cuda').half() + result = trt_ts_module(input_data) + torch.jit.save(trt_ts_module, "trt_ts_module.ts") + +.. code-block:: python + + # Deployment application + import torch + import torch_tensorrt + + trt_ts_module = torch.jit.load("trt_ts_module.ts") + input_data = input_data.to('cuda').half() + result = trt_ts_module(input_data) + +Torch-TensorRT python API also provides ``torch_tensorrt.ts.compile`` which accepts a TorchScript module as input. +The torchscript module can be obtained via scripting or tracing (refer to :ref:`creating_torchscript_module_in_python`). ``torch_tensorrt.ts.compile`` accepts a Torchscript module +and a list of ``torch_tensorrt.Input`` classes. diff --git a/docs/v1.2.0/_sources/tutorials/installation.rst.txt b/docs/v1.2.0/_sources/tutorials/installation.rst.txt new file mode 100644 index 0000000000..949fa2ddc9 --- /dev/null +++ b/docs/v1.2.0/_sources/tutorials/installation.rst.txt @@ -0,0 +1,387 @@ +.. _installation: + +Installation +============= + +Precompiled Binaries +********************* + +Dependencies +--------------- + +You need to have either PyTorch or LibTorch installed based on if you are using Python or C++ +and you must have CUDA, cuDNN and TensorRT installed. + + * https://www.pytorch.org + * https://developer.nvidia.com/cuda + * https://developer.nvidia.com/cudnn + * https://developer.nvidia.com/tensorrt + + +Python Package +--------------- + +You can install the python package using + +.. code-block:: sh + + pip3 install torch-tensorrt -f https://github.com/NVIDIA/Torch-TensorRT/releases + +.. _bin-dist: + +C++ Binary Distribution +------------------------ + +Precompiled tarballs for releases are provided here: https://github.com/NVIDIA/Torch-TensorRT/releases + +.. _compile-from-source: + +Compiling From Source +****************************************** + +.. _installing-deps: + +Dependencies for Compilation +------------------------------- + +Torch-TensorRT is built with Bazel, so begin by installing it. + + * The easiest way is to install bazelisk using the method of your choosing https://github.com/bazelbuild/bazelisk + * Otherwise you can use the following instructions to install binaries https://docs.bazel.build/versions/master/install.html + * Finally if you need to compile from source (e.g. aarch64 until bazel distributes binaries for the architecture) you can use these instructions + + .. code-block:: shell + + export BAZEL_VERSION=$(cat /.bazelversion) + mkdir bazel + cd bazel + curl -fSsL -O https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-dist.zip + unzip bazel-$BAZEL_VERSION-dist.zip + bash ./compile.sh + cp output/bazel /usr/local/bin/ + + +You will also need to have CUDA installed on the system (or if running in a container, the system must have +the CUDA driver installed and the container must have CUDA) + +The correct LibTorch version will be pulled down for you by bazel. + + NOTE: For best compatability with official PyTorch, use torch==1.10.0+cuda113, TensorRT 8.0 and cuDNN 8.2 for CUDA 11.3 however Torch-TensorRT itself supports + TensorRT and cuDNN for other CUDA versions for usecases such as using NVIDIA compiled distributions of PyTorch that use other versions of CUDA + e.g. aarch64 or custom compiled version of PyTorch. + +.. _abis: + +Choosing the Right ABI +^^^^^^^^^^^^^^^^^^^^^^^^ + +Likely the most complicated thing about compiling Torch-TensorRT is selecting the correct ABI. There are two options +which are incompatible with each other, pre-cxx11-abi and the cxx11-abi. The complexity comes from the fact that while +the most popular distribution of PyTorch (wheels downloaded from pytorch.org/pypi directly) use the pre-cxx11-abi, most +other distributions you might encounter (e.g. ones from NVIDIA - NGC containers, and builds for Jetson as well as certain +libtorch builds and likely if you build PyTorch from source) use the cxx11-abi. It is important you compile Torch-TensorRT +using the correct ABI to function properly. Below is a table with general pairings of PyTorch distribution sources and the +recommended commands: + ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| PyTorch Source | Recommended C++ Compilation Command | Recommended Python Compilation Command | ++=============================================================+==========================================================+====================================================================+ +| PyTorch whl file from PyTorch.org | bazel build //:libtorchtrt -c opt --config pre_cxx11_abi | python3 setup.py bdist_wheel | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| libtorch-shared-with-deps-*.zip from PyTorch.org | bazel build //:libtorchtrt -c opt --config pre_cxx11_abi | python3 setup.py bdist_wheel | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| libtorch-cxx11-abi-shared-with-deps-*.zip from PyTorch.org | bazel build //:libtorchtrt -c opt | python3 setup.py bdist_wheel --use-cxx11-abi | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| PyTorch preinstalled in an NGC container | bazel build //:libtorchtrt -c opt | python3 setup.py bdist_wheel --use-cxx11-abi | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| PyTorch from the NVIDIA Forums for Jetson | bazel build //:libtorchtrt -c opt | python3 setup.py bdist_wheel --jetpack-version 4.6 --use-cxx11-abi | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ +| PyTorch built from Source | bazel build //:libtorchtrt -c opt | python3 setup.py bdist_wheel --use-cxx11-abi | ++-------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------------+ + + NOTE: For all of the above cases you must correctly declare the source of PyTorch you intend to use in your WORKSPACE file for both Python and C++ builds. See below for more information + +You then have two compilation options: + +.. _build-from-archive: + +**Building using cuDNN & TensorRT tarball distributions** +-------------------------------------------------------------- + + This is recommended so as to build Torch-TensorRT hermetically and insures any compilation errors are not caused by version issues + + Make sure when running Torch-TensorRT that these versions of the libraries are prioritized in your ``$LD_LIBRARY_PATH`` + +You need to download the tarball distributions of TensorRT and cuDNN from the NVIDIA website. + * https://developer.nvidia.com/cudnn + * https://developer.nvidia.com/tensorrt + +Place these files in a directory (the directories ``third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu]`` exist for this purpose) + +Then compile referencing the directory with the tarballs + + If you get errors regarding the packages, check their sha256 hashes and make sure they match the ones listed in ``WORKSPACE`` + +Release Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: shell + + bazel build //:libtorchtrt -c opt --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu] + +A tarball with the include files and library can then be found in ``bazel-bin`` + +.. _build-from-archive-debug: + +Debug Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +To build with debug symbols use the following command + +.. code-block:: shell + + bazel build //:libtorchtrt -c dbg --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu] + +A tarball with the include files and library can then be found in ``bazel-bin`` + +Pre CXX11 ABI Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +To build using the pre-CXX11 ABI use the ``pre_cxx11_abi`` config + +.. code-block:: shell + + bazel build //:libtorchtrt --config pre_cxx11_abi -c [dbg/opt] --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu] + +A tarball with the include files and library can then be found in ``bazel-bin`` + +.. _build-from-local: + +**Building using locally installed cuDNN & TensorRT** +-------------------------------------------------------------- + + If you encounter bugs and you compiled using this method please disclose that you used local sources in the issue (an ldd dump would be nice too) + +Install TensorRT, CUDA and cuDNN on the system before starting to compile. + +In WORKSPACE comment out: + +.. code-block:: python + + # Downloaded distributions to use with --distdir + http_archive( + name = "cudnn", + urls = ["",], + + build_file = "@//third_party/cudnn/archive:BUILD", + sha256 = "", + strip_prefix = "cuda" + ) + + http_archive( + name = "tensorrt", + urls = ["",], + + build_file = "@//third_party/tensorrt/archive:BUILD", + sha256 = "", + strip_prefix = "TensorRT-" + ) + +and uncomment + +.. code-block:: python + + # Locally installed dependencies + new_local_repository( + name = "cudnn", + path = "/usr/", + build_file = "@//third_party/cudnn/local:BUILD" + ) + + new_local_repository( + name = "tensorrt", + path = "/usr/", + build_file = "@//third_party/tensorrt/local:BUILD" + ) + +Release Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +Compile using: + +.. code-block:: shell + + bazel build //:libtorchtrt -c opt + +A tarball with the include files and library can then be found in ``bazel-bin`` + +.. _build-from-local-debug: + +Debug Build +^^^^^^^^^^^^ + +To build with debug symbols use the following command + +.. code-block:: shell + + bazel build //:libtorchtrt -c dbg + + +A tarball with the include files and library can then be found in ``bazel-bin`` + +Pre CXX11 ABI Build +^^^^^^^^^^^^^^^^^^^^^^^^ + +To build using the pre-CXX11 ABI use the ``pre_cxx11_abi`` config + +.. code-block:: shell + + bazel build //:libtorchtrt --config pre_cxx11_abi -c [dbg/opt] + +**Building the Python package** +-------------------------------- + +Begin by installing ``ninja`` + +You can build the Python package using ``setup.py`` (this will also build the correct version of ``libtorchtrt.so``) + +.. code-block:: shell + + python3 setup.py [install/bdist_wheel] + +Debug Build +^^^^^^^^^^^^ + +.. code-block:: shell + + python3 setup.py develop [--user] + +This also compiles a debug build of ``libtorchtrt.so`` + +**Building Natively on aarch64 (Jetson)** +------------------------------------------- + +Prerequisites +^^^^^^^^^^^^^^ + +Install or compile a build of PyTorch/LibTorch for aarch64 + +NVIDIA hosts builds the latest release branch for Jetson here: + + https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-10-now-available/72048 + + +Enviorment Setup +^^^^^^^^^^^^^^^^^ + +To build natively on aarch64-linux-gnu platform, configure the ``WORKSPACE`` with local available dependencies. + +1. Disable the rules with ``http_archive`` for x86_64 by commenting the following rules: + +.. code-block:: shell + + #http_archive( + # name = "libtorch", + # build_file = "@//third_party/libtorch:BUILD", + # strip_prefix = "libtorch", + # urls = ["https://download.pytorch.org/libtorch/cu102/libtorch-cxx11-abi-shared-with-deps-1.5.1.zip"], + # sha256 = "cf0691493d05062fe3239cf76773bae4c5124f4b039050dbdd291c652af3ab2a" + #) + + #http_archive( + # name = "libtorch_pre_cxx11_abi", + # build_file = "@//third_party/libtorch:BUILD", + # strip_prefix = "libtorch", + # sha256 = "818977576572eadaf62c80434a25afe44dbaa32ebda3a0919e389dcbe74f8656", + # urls = ["https://download.pytorch.org/libtorch/cu102/libtorch-shared-with-deps-1.5.1.zip"], + #) + + # Download these tarballs manually from the NVIDIA website + # Either place them in the distdir directory in third_party and use the --distdir flag + # or modify the urls to "file:////.tar.gz + + #http_archive( + # name = "cudnn", + # urls = ["https://developer.nvidia.com/compute/machine-learning/cudnn/secure/8.0.1.13/10.2_20200626/cudnn-10.2-linux-x64-v8.0.1.13.tgz"], + # build_file = "@//third_party/cudnn/archive:BUILD", + # sha256 = "0c106ec84f199a0fbcf1199010166986da732f9b0907768c9ac5ea5b120772db", + # strip_prefix = "cuda" + #) + + #http_archive( + # name = "tensorrt", + # urls = ["https://developer.nvidia.com/compute/machine-learning/tensorrt/secure/7.1/tars/TensorRT-7.1.3.4.Ubuntu-18.04.x86_64-gnu.cuda-10.2.cudnn8.0.tar.gz"], + # build_file = "@//third_party/tensorrt/archive:BUILD", + # sha256 = "9205bed204e2ae7aafd2e01cce0f21309e281e18d5bfd7172ef8541771539d41", + # strip_prefix = "TensorRT-7.1.3.4" + #) + + NOTE: You may also need to configure the CUDA version to 10.2 by setting the path for the cuda new_local_repository + + +2. Configure the correct paths to directory roots containing local dependencies in the ``new_local_repository`` rules: + + NOTE: If you installed PyTorch using a pip package, the correct path is the path to the root of the python torch package. + In the case that you installed with ``sudo pip install`` this will be ``/usr/local/lib/python3.6/dist-packages/torch``. + In the case you installed with ``pip install --user`` this will be ``$HOME/.local/lib/python3.6/site-packages/torch``. + +In the case you are using NVIDIA compiled pip packages, set the path for both libtorch sources to the same path. This is because unlike +PyTorch on x86_64, NVIDIA aarch64 PyTorch uses the CXX11-ABI. If you compiled for source using the pre_cxx11_abi and only would like to +use that library, set the paths to the same path but when you compile make sure to add the flag ``--config=pre_cxx11_abi`` + +.. code-block:: shell + + new_local_repository( + name = "libtorch", + path = "/usr/local/lib/python3.6/dist-packages/torch", + build_file = "third_party/libtorch/BUILD" + ) + + new_local_repository( + name = "libtorch_pre_cxx11_abi", + path = "/usr/local/lib/python3.6/dist-packages/torch", + build_file = "third_party/libtorch/BUILD" + ) + + new_local_repository( + name = "cudnn", + path = "/usr/", + build_file = "@//third_party/cudnn/local:BUILD" + ) + + new_local_repository( + name = "tensorrt", + path = "/usr/", + build_file = "@//third_party/tensorrt/local:BUILD" + ) + +Compile C++ Library and Compiler CLI +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + NOTE: Due to shifting dependency locations between Jetpack 4.5 and 4.6 there is a now a flag to inform bazel of the Jetpack version + + .. code-block:: shell + + --platforms //toolchains:jetpack_4.x + + +Compile Torch-TensorRT library using bazel command: + +.. code-block:: shell + + bazel build //:libtorchtrt --platforms //toolchains:jetpack_4.6 + +Compile Python API +^^^^^^^^^^^^^^^^^^^^ + + NOTE: Due to shifting dependencies locations between Jetpack 4.5 and Jetpack 4.6 there is now a flag for ``setup.py`` which sets the jetpack version (default: 4.6) + +Compile the Python API using the following command from the ``//py`` directory: + +.. code-block:: shell + + python3 setup.py install --use-cxx11-abi + +If you have a build of PyTorch that uses Pre-CXX11 ABI drop the ``--use-cxx11-abi`` flag + +If you are building for Jetpack 4.5 add the ``--jetpack-version 4.5`` flag diff --git a/docs/v1.2.0/_sources/tutorials/notebooks.rst.txt b/docs/v1.2.0/_sources/tutorials/notebooks.rst.txt new file mode 100644 index 0000000000..df903fc353 --- /dev/null +++ b/docs/v1.2.0/_sources/tutorials/notebooks.rst.txt @@ -0,0 +1,154 @@ +.. _notebooks: + +Example notebooks +=================== + +There exists a number of notebooks which cover specific using specific features and models +with Torch-TensorRT + +Notebooks +------------ + +Compiling CitriNet with Torch-TensorRT +******************************************** + +Citrinet is an acoustic model used for the speech to text recognition task. It is a version +of QuartzNet that extends ContextNet, utilizing subword encoding (via Word Piece tokenization) +and Squeeze-and-Excitation(SE) mechanism and are therefore smaller than QuartzNet models. CitriNet +models take in audio segments and transcribe them to letter, byte pair, or word piece sequences. + +This notebook demonstrates the steps for optimizing a pretrained CitriNet model with Torch-TensorRT, +and running it to test the speedup obtained. + +* `Torch-TensorRT Getting Started - CitriNet `_ + + +Compiling EfficentNet with Torch-TensorRT +******************************************** + +EfficentNet is a feedforward CNN designed to achieve better performance and accuracy than alternative architectures +by using a "scaling method that uniformly scales all dimensions of depth/width/resolution using a simple yet highly effective compound coefficient". + +This notebook demonstrates the steps for optimizing a pretrained EfficentNet model with Torch-TensorRT, +and running it to test the speedup obtained. + +* `Torch-TensorRT Getting Started - EfficientNet-B0 `_ + + +Masked Language Modeling (MLM) with Hugging Face BERT Transformer accelerated by Torch-TensorRT +************************************************************************************************* + +"BERT is a transformer model pretrained on a large corpus of English data in a self-supervised fashion. +This way, the model learns an inner representation of the English language that can then be used to extract +features useful for downstream tasks: if you have a dataset of labeled sentences for instance, you can train +a standard classifier using the features produced by the BERT model as inputs." (https://huggingface.co/bert-base-uncased) + +This notebook demonstrates the steps for optimizing a pretrained EfficentNet model with Torch-TensorRT, +and running it to test the speedup obtained. + +* `Masked Language Modeling (MLM) with Hugging Face BERT Transformer `_ + + +Serving a model in C++ using Torch-TensorRT +********************************************** + +This example shows how you can load a pretrained ResNet-50 model, convert it to a Torch-TensorRT +optimized model (via the Torch-TensorRT Python API), save the model as a torchscript module, and +then finally load and serve the model with the PyTorch C++ API. + +* `ResNet C++ Serving Example `_ + + +Compiling ResNet50 with Torch-TensorRT +******************************************** + +This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a +pretrained ResNet-50 network, and running it to test the speedup obtained. + +* `Torch-TensorRT Getting Started - ResNet 50 `_ + + +Using Dynamic Shapes with Torch-TensorRT +******************************************** + +Making use of Dynamic Shaped Tensors in Torch TensorRT is quite simple. Let's say you are +using the ``torch_tensorrt.compile(...)`` function to compile a torchscript module. One +of the args in this function in this function is ``input``: which defines an input to a +module in terms of expected shape, data type and tensor format: ``torch_tensorrt.Input.`` + +For the purposes of this walkthrough we just need three kwargs: `min_shape`, `opt_shape`` and `max_shape`. + +.. code-block:: py + + torch_tensorrt.Input( + min_shape=(1, 224, 224, 3), + opt_shape=(1, 512, 512, 3), + max_shape=(1, 1024, 1024, 3), + dtype=torch.int32 + format=torch.channel_last + ) + ... + +In this example, we are going to use a simple ResNet model to demonstrate the use of the API. + +* `Torch-TensorRT - Using Dynamic Shapes `_ + +Using the FX Frontend with Torch-TensorRT +******************************************** + +The purpose of this example is to demostrate the overall flow of lowering a PyTorch model to TensorRT +conveniently with using FX. + +* `Using the FX Frontend with Torch-TensorRT `_ + + +Compiling a PyTorch model using FX Frontend with Torch-TensorRT +******************************************************************* + +The purpose of this example is to demonstrate the overall flow of lowering a PyTorch +model to TensorRT via FX with existing FX based tooling + +* `Compiling a PyTorch model using FX Frontend with Torch-TensorRT `_ + + +Compiling LeNet with Torch-TensorRT +******************************************************************* + +This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a simple LeNet network. + +* `Torch-TensorRT Getting Started - LeNet `_ + + +Accelerate Deep Learning Models using Quantization in Torch-TensorRT +******************************************************************* + +Model Quantization is a popular way of optimization which reduces the size of models thereby +accelerating inference, also opening up the possibilities of deployments on devices with lower +computation power such as Jetson. Simply put, quantization is a process of mapping input values + from a larger set to output values in a smaller set. In this notebook, we illustrate the workflow + that you can adopt while quantizing a deep learning model in Torch-TensorRT. The notebook takes + you through an example of Mobilenetv2 for a classification task on a subset of Imagenet Dataset + called Imagenette which has 10 classes. + +* `Accelerate Deep Learning Models using Quantization in Torch-TensorRT `_ + + +Object Detection with Torch-TensorRT (SSD) +******************************************************************* + +This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained SSD network, and running it to test the speedup obtained. + +* `Object Detection with Torch-TensorRT (SSD) `_ + + +Deploying Quantization Aware Trained models in INT8 using Torch-TensorRT +***************************************************************************** + +Quantization Aware training (QAT) simulates quantization during training by +quantizing weights and activation layers. This will help to reduce the loss in +accuracy when we convert the network trained in FP32 to INT8 for faster inference. +QAT introduces additional nodes in the graph which will be used to learn the dynamic +ranges of weights and activation layers. In this notebook, we illustrate the following +steps from training to inference of a QAT model in Torch-TensorRT. + +* `Deploying Quantization Aware Trained models in INT8 using Torch-TensorRT `_ diff --git a/docs/v1.2.0/_sources/tutorials/ptq.rst.txt b/docs/v1.2.0/_sources/tutorials/ptq.rst.txt new file mode 100644 index 0000000000..b62457109f --- /dev/null +++ b/docs/v1.2.0/_sources/tutorials/ptq.rst.txt @@ -0,0 +1,205 @@ +.. _ptq: + +Post Training Quantization (PTQ) +================================= + +Post Training Quantization (PTQ) is a technique to reduce the required computational resources for inference +while still preserving the accuracy of your model by mapping the traditional FP32 activation space to a reduced +INT8 space. TensorRT uses a calibration step which executes your model with sample data from the target domain +and track the activations in FP32 to calibrate a mapping to INT8 that minimizes the information loss between +FP32 inference and INT8 inference. + +Users writing TensorRT applications are required to setup a calibrator class which will provide sample data to +the TensorRT calibrator. With Torch-TensorRT we look to leverage existing infrastructure in PyTorch to make implementing +calibrators easier. + +LibTorch provides a ``DataLoader`` and ``Dataset`` API which steamlines preprocessing and batching input data. +These APIs are exposed via both C++ and Python interface which makes it easier for the end user. +For C++ interface, we use ``torch::Dataset`` and ``torch::data::make_data_loader`` objects to construct and perform pre-processing on datasets. +The equivalent functionality in python interface uses ``torch.utils.data.Dataset`` and ``torch.utils.data.DataLoader``. +This section of the PyTorch documentation has more information https://pytorch.org/tutorials/advanced/cpp_frontend.html#loading-data and https://pytorch.org/tutorials/recipes/recipes/loading_data_recipe.html. +Torch-TensorRT uses Dataloaders as the base of a generic calibrator implementation. So you will be able to reuse or quickly +implement a ``torch::Dataset`` for your target domain, place it in a DataLoader and create a INT8 Calibrator +which you can provide to Torch-TensorRT to run INT8 Calibration during compliation of your module. + +.. _writing_ptq_cpp: + +How to create your own PTQ application in C++ +----------------------------------------------- + +Here is an example interface of a ``torch::Dataset`` class for CIFAR10: + +.. code-block:: c++ + :linenos: + + //cpp/ptq/datasets/cifar10.h + #pragma once + + #include "torch/data/datasets/base.h" + #include "torch/data/example.h" + #include "torch/types.h" + + #include + #include + + namespace datasets { + // The CIFAR10 Dataset + class CIFAR10 : public torch::data::datasets::Dataset { + public: + // The mode in which the dataset is loaded + enum class Mode { kTrain, kTest }; + + // Loads CIFAR10 from un-tarred file + // Dataset can be found https://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz + // Root path should be the directory that contains the content of tarball + explicit CIFAR10(const std::string& root, Mode mode = Mode::kTrain); + + // Returns the pair at index in the dataset + torch::data::Example<> get(size_t index) override; + + // The size of the dataset + c10::optional size() const override; + + // The mode the dataset is in + bool is_train() const noexcept; + + // Returns all images stacked into a single tensor + const torch::Tensor& images() const; + + // Returns all targets stacked into a single tensor + const torch::Tensor& targets() const; + + // Trims the dataset to the first n pairs + CIFAR10&& use_subset(int64_t new_size); + + + private: + Mode mode_; + torch::Tensor images_, targets_; + }; + } // namespace datasets + + +This class's implementation reads from the binary distribution of the CIFAR10 dataset and builds two tensors which hold the images and labels. + +We use a subset of the dataset to use for calibration, since we don't need the the full dataset for effective calibration and calibration does +some take time, then define the preprocessing to apply to the images in the dataset and create a DataLoader from the dataset which will batch the data: + +.. code-block:: c++ + + auto calibration_dataset = datasets::CIFAR10(data_dir, datasets::CIFAR10::Mode::kTest) + .use_subset(320) + .map(torch::data::transforms::Normalize<>({0.4914, 0.4822, 0.4465}, + {0.2023, 0.1994, 0.2010})) + .map(torch::data::transforms::Stack<>()); + auto calibration_dataloader = torch::data::make_data_loader(std::move(calibration_dataset), + torch::data::DataLoaderOptions().batch_size(32) + .workers(2)); + + +Next we create a calibrator from the ``calibration_dataloader`` using the calibrator factory (found in ``torch_tensorrt/ptq.h``): + +.. code-block:: c++ + + #include "torch_tensorrt/ptq.h" + ... + + auto calibrator = torch_tensorrt::ptq::make_int8_calibrator(std::move(calibration_dataloader), calibration_cache_file, true); + +Here we also define a location to write a calibration cache file to which we can use to reuse the calibration data without needing the dataset and whether or not +we should use the cache file if it exists. There also exists a ``torch_tensorrt::ptq::make_int8_cache_calibrator`` factory which creates a calibrator that uses the cache +only for cases where you may do engine building on a machine that has limited storage (i.e. no space for a full dataset) or to have a simpiler deployment application. + +The calibrator factories create a calibrator that inherits from a ``nvinfer1::IInt8Calibrator`` virtual class (``nvinfer1::IInt8EntropyCalibrator2`` by default) which +defines the calibration algorithm used when calibrating. You can explicitly make the selection of calibration algorithm like this: + +.. code-block:: c++ + + // MinMax Calibrator is geared more towards NLP tasks + auto calibrator = torch_tensorrt::ptq::make_int8_calibrator(std::move(calibration_dataloader), calibration_cache_file, true); + +Then all thats required to setup the module for INT8 calibration is to set the following compile settings in the `torch_tensorrt::CompileSpec` struct and compiling the module: + +.. code-block:: c++ + + std::vector> input_shape = {{32, 3, 32, 32}}; + /// Configure settings for compilation + auto compile_spec = torch_tensorrt::CompileSpec({input_shape}); + /// Set operating precision to INT8 + compile_spec.enabled_precisions.insert(torch::kF16); + compile_spec.enabled_precisions.insert(torch::kI8); + /// Use the TensorRT Entropy Calibrator + compile_spec.ptq_calibrator = calibrator; + + auto trt_mod = torch_tensorrt::CompileGraph(mod, compile_spec); + +If you have an existing Calibrator implementation for TensorRT you may directly set the ``ptq_calibrator`` field with a pointer to your calibrator and it will work as well. +From here not much changes in terms of how to execution works. You are still able to fully use LibTorch as the sole interface for inference. Data should remain +in FP32 precision when it's passed into `trt_mod.forward`. There exists an example application in the Torch-TensorRT demo that takes you from training a VGG16 network on +CIFAR10 to deploying in INT8 with Torch-TensorRT here: https://github.com/pytorch/TensorRT/tree/master/cpp/ptq + +.. _writing_ptq_python: + +How to create your own PTQ application in Python +-------------------------------------------------- + +Torch-TensorRT Python API provides an easy and convenient way to use pytorch dataloaders with TensorRT calibrators. ``DataLoaderCalibrator`` class can be used to create +a TensorRT calibrator by providing desired configuration. The following code demonstrates an example on how to use it + +.. code-block:: python + + testing_dataset = torchvision.datasets.CIFAR10( + root="./data", + train=False, + download=True, + transform=transforms.Compose( + [ + transforms.ToTensor(), + transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), + ] + ), + ) + + testing_dataloader = torch.utils.data.DataLoader( + testing_dataset, batch_size=1, shuffle=False, num_workers=1 + ) + calibrator = torch_tensorrt.ptq.DataLoaderCalibrator( + testing_dataloader, + cache_file="./calibration.cache", + use_cache=False, + algo_type=torch_tensorrt.ptq.CalibrationAlgo.ENTROPY_CALIBRATION_2, + device=torch.device("cuda:0"), + ) + + trt_mod = torch_tensorrt.compile(model, inputs=[torch_tensorrt.Input((1, 3, 32, 32))], + enabled_precisions={torch.float, torch.half, torch.int8}, + calibrator=calibrator, + device={ + "device_type": torch_tensorrt.DeviceType.GPU, + "gpu_id": 0, + "dla_core": 0, + "allow_gpu_fallback": False, + "disable_tf32": False + }) + +In the cases where there is a pre-existing calibration cache file that users want to use, ``CacheCalibrator`` can be used without any dataloaders. The following example demonstrates how +to use ``CacheCalibrator`` to use in INT8 mode. + +.. code-block:: python + + calibrator = torch_tensorrt.ptq.CacheCalibrator("./calibration.cache") + + trt_mod = torch_tensorrt.compile(model, inputs=[torch_tensorrt.Input([1, 3, 32, 32])], + enabled_precisions={torch.float, torch.half, torch.int8}, + calibrator=calibrator) + +If you already have an existing calibrator class (implemented directly using TensorRT API), you can directly set the calibrator field to your class which can be very convenient. +For a demo on how PTQ can be performed on a VGG network using Torch-TensorRT API, you can refer to https://github.com/pytorch/TensorRT/blob/master/tests/py/test_ptq_dataloader_calibrator.py +and https://github.com/pytorch/TensorRT/blob/master/tests/py/test_ptq_trt_calibrator.py + +Citations +^^^^^^^^^^^ + +Krizhevsky, A., & Hinton, G. (2009). Learning multiple layers of features from tiny images. + +Simonyan, K., & Zisserman, A. (2014). Very deep convolutional networks for large-scale image recognition. arXiv preprint arXiv:1409.1556. diff --git a/docs/v1.2.0/_sources/tutorials/runtime.rst.txt b/docs/v1.2.0/_sources/tutorials/runtime.rst.txt new file mode 100644 index 0000000000..0cfc93200f --- /dev/null +++ b/docs/v1.2.0/_sources/tutorials/runtime.rst.txt @@ -0,0 +1,36 @@ +.. _runtime: + +Deploying Torch-TensorRT Programs +==================================== + +After compiling and saving Torch-TensorRT programs there is no longer a strict dependency on the full +Torch-TensorRT library. All that is required to run a compiled program is the runtime. There are therfore a couple +options to deploy your programs other than shipping the full Torch-TensorRT compiler with your applications. + +Torch-TensorRT package / libtorchtrt.so +-------------------------------------------- + +Once a program is compiled, you run it using the standard PyTorch APIs. All that is required is that the package +must be imported in python or linked in C++. + +Runtime Library +----------------- + +Distributed with the C++ distribution is ``libtorchtrt_runtime.so``. This library only contains the components +necessary to run Torch-TensorRT programs. Instead of linking ``libtorchtrt.so`` or importing ``torch_tensorrt`` you can +link ``libtorchtrt_runtime.so`` in your deployment programs or use ``DL_OPEN`` or ``LD_PRELOAD``. For python +you can load the runtime with ``torch.ops.load_library("libtorchtrt_runtime.so")``. You can then continue to use +programs just as you would otherwise via PyTorch API. + +.. note:: If you are using the standard distribution of PyTorch in Python on x86, likely you will need the pre-cxx11-abi variant of ``libtorchtrt_runtime.so``, check :ref:`Installation` documentation for more details. + +.. note:: If you are linking ``libtorchtrt_runtime.so``, likely using the following flags will help ``-Wl,--no-as-needed -ltorchtrt -Wl,--as-needed`` as theres no direct symbol dependency to anything in the Torch-TensorRT runtime for most Torch-TensorRT runtime applications + +An example of how to use ``libtorchtrt_runtime.so`` can be found here: https://github.com/pytorch/TensorRT/tree/master/examples/torchtrt_runtime_example + +Plugin Library +--------------- + +In the case you use Torch-TensorRT as a converter to a TensorRT engine and your engine uses plugins provided by Torch-TensorRT, Torch-TensorRT +ships the library ``libtorchtrt_plugins.so`` which contains the implementation of the TensorRT plugins used by Torch-TensorRT during +compilation. This library can be ``DL_OPEN`` or ``LD_PRELOAD`` similar to other TensorRT plugin libraries. diff --git a/docs/v1.2.0/_sources/tutorials/serving_torch_tensorrt_with_triton.rst.txt b/docs/v1.2.0/_sources/tutorials/serving_torch_tensorrt_with_triton.rst.txt new file mode 100644 index 0000000000..a713d563c2 --- /dev/null +++ b/docs/v1.2.0/_sources/tutorials/serving_torch_tensorrt_with_triton.rst.txt @@ -0,0 +1,216 @@ +.. _serving_torch_tensorrt_with_triton: + +Serving a Torch-TensorRT model with Triton +========================================== + +Optimization and deployment go hand in hand in a discussion about Machine +Learning infrastructure. Once network level optimzation are done +to get the maximum performance, the next step would be to deploy it. + +However, serving this optimized model comes with it's own set of considerations +and challenges like: building an infrastructure to support concorrent model +executions, supporting clients over HTTP or gRPC and more. + +The `Triton Inference Server `__ +solves the aforementioned and more. Let's discuss step-by-step, the process of +optimizing a model with Torch-TensorRT, deploying it on Triton Inference +Server, and building a client to query the model. + +Step 1: Optimize your model with Torch-TensorRT +----------------------------------------------- + +Most Torch-TensorRT users will be familiar with this step. For the purpose of +this demonstration, we will be using a ResNet50 model from Torchhub. + +Let’s first pull the `NGC PyTorch Docker container `__. You may need to create +an account and get the API key from `here `__. +Sign up and login with your key (follow the instructions +`here `__ after signing up). + +:: + + # is the yy:mm for the publishing tag for NVIDIA's Pytorch + # container; eg. 22.04 + + docker run -it --gpus all -v ${PWD}:/scratch_space nvcr.io/nvidia/pytorch:-py3 + cd /scratch_space + +Once inside the container, we can proceed to download a ResNet model from +Torchhub and optimize it with Torch-TensorRT. + +:: + + import torch + import torch_tensorrt + torch.hub._validate_not_a_forked_repo=lambda a,b,c: True + + # load model + model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True).eval().to("cuda") + + # Compile with Torch TensorRT; + trt_model = torch_tensorrt.compile(model, + inputs= [torch_tensorrt.Input((1, 3, 224, 224))], + enabled_precisions= { torch.half} # Run with FP32 + ) + + # Save the model + torch.jit.save(trt_model, "model.pt") + +After copying the model, exit the container. The next step in the process +is to set up a Triton Inference Server. + +Step 2: Set Up Triton Inference Server +-------------------------------------- + +If you are new to the Triton Inference Server and want to learn more, we +highly recommend to checking our `Github +Repository `__. + +To use Triton, we need to make a model repository. A model repository, as the +name suggested, is a repository of the models the Inference server hosts. While +Triton can serve models from multiple repositories, in this example, we will +discuss the simplest possible form of the model repository. + +The structure of this repository should look something like this: + +:: + + model_repository + | + +-- resnet50 + | + +-- config.pbtxt + +-- 1 + | + +-- model.pt + +There are two files that Triton requires to serve the model: the model itself +and a model configuration file which is typically provided in ``config.pbtxt``. +For the model we prepared in step 1, the following configuration can be used: + +:: + + name: "resnet50" + platform: "pytorch_libtorch" + max_batch_size : 0 + input [ + { + name: "input__0" + data_type: TYPE_FP32 + dims: [ 3, 224, 224 ] + reshape { shape: [ 1, 3, 224, 224 ] } + } + ] + output [ + { + name: "output__0" + data_type: TYPE_FP32 + dims: [ 1, 1000 ,1, 1] + reshape { shape: [ 1, 1000 ] } + } + ] + +The ``config.pbtxt`` file is used to describe the exact model configuration +with details like the names and shapes of the input and output layer(s), +datatypes, scheduling and batching details and more. If you are new to Triton, +we highly encourage you to check out this `section of our +documentation `__ +for more details. + +With the model repository setup, we can proceed to launch the Triton server +with the docker command below. Refer `this page `__ for the pull tag for the container. + +:: + + # Make sure that the TensorRT version in the Triton container + # and TensorRT version in the environment used to optimize the model + # are the same. + + docker run --gpus all --rm -p 8000:8000 -p 8001:8001 -p 8002:8002 -v /full/path/to/the_model_repository/model_repository:/models nvcr.io/nvidia/tritonserver:-py3 tritonserver --model-repository=/models + +This should spin up a Triton Inference server. Next step, building a simple +http client to query the server. + +Step 3: Building a Triton Client to Query the Server +---------------------------------------------------- + +Before proceeding, make sure to have a sample image on hand. If you don't +have one, download an example image to test inference. In this section, we +will be going over a very basic client. For a variety of more fleshed out +examples, refer to the `Triton Client Repository `__ + +:: + + wget -O img1.jpg "https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg" + +We then need to install dependencies for building a python client. These will +change from client to client. For a full list of all languages supported by Triton, +please refer to `Triton's client repository `__. + +:: + + pip install torchvision + pip install attrdict + pip install nvidia-pyindex + pip install tritonclient[all] + +Let's jump into the client. Firstly, we write a small preprocessing function to +resize and normalize the query image. + +:: + + import numpy as np + from torchvision import transforms + from PIL import Image + import tritonclient.http as httpclient + from tritonclient.utils import triton_to_np_dtype + + # preprocessing function + def rn50_preprocess(img_path="img1.jpg"): + img = Image.open(img_path) + preprocess = transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), + ]) + return preprocess(img).numpy() + + transformed_img = rn50_preprocess() + +Building a client requires three basic points. Firstly, we setup a connection +with the Triton Inference Server. + +:: + + # Setting up client + client = httpclient.InferenceServerClient(url="localhost:8000") + +Secondly, we specify the names of the input and output layer(s) of our model. + +:: + + inputs = httpclient.InferInput("input__0", transformed_img.shape, datatype="FP32") + inputs.set_data_from_numpy(transformed_img, binary_data=True) + + outputs = httpclient.InferRequestedOutput("output__0", binary_data=True, class_count=1000) + +Lastly, we send an inference request to the Triton Inference Server. + +:: + + # Querying the server + results = client.infer(model_name="resnet50", inputs=[inputs], outputs=[outputs]) + inference_output = results.as_numpy('output__0') + print(inference_output[:5]) + +The output of the same should look like below: + +:: + + [b'12.468750:90' b'11.523438:92' b'9.664062:14' b'8.429688:136' + b'8.234375:11'] + +The output format here is ``:``. +To learn how to map these to the label names and more, refer to Triton Inference Server's +`documentation `__. diff --git a/docs/v1.2.0/_sources/tutorials/torchtrtc.rst.txt b/docs/v1.2.0/_sources/tutorials/torchtrtc.rst.txt new file mode 100644 index 0000000000..b841c891e5 --- /dev/null +++ b/docs/v1.2.0/_sources/tutorials/torchtrtc.rst.txt @@ -0,0 +1,128 @@ +.. _torchtrtc: + +torchtrtc +================================= + +``torchtrtc`` is a CLI application for using the Torch-TensorRT compiler. It serves as an easy way to compile a +TorchScript Module with Torch-TensorRT from the command-line to quickly check support or as part of +a deployment pipeline. All basic features of the compiler are supported including post training +quantization (though you must already have a calibration cache file to use the PTQ feature). The compiler can +output two formats, either a TorchScript program with the TensorRT engine embedded or +the TensorRT engine itself as a PLAN file. + +All that is required to run the program after compilation is for C++ linking against ``libtorchtrt.so`` +or in Python importing the torch_tensorrt package. All other aspects of using compiled modules are identical +to standard TorchScript. Load with ``torch.jit.load()`` and run like you would run any other module. + +.. code-block:: txt + + torchtrtc [input_file_path] [output_file_path] + [input_specs...] {OPTIONS} + + torchtrtc is a compiler for TorchScript, it will compile and optimize + TorchScript programs to run on NVIDIA GPUs using TensorRT + + OPTIONS: + + -h, --help Display this help menu + Verbiosity of the compiler + -v, --verbose Dumps debugging information about the + compilation process onto the console + -w, --warnings Disables warnings generated during + compilation onto the console (warnings + are on by default) + --i, --info Dumps info messages generated during + compilation onto the console + --build-debuggable-engine Creates a debuggable engine + --allow-gpu-fallback (Only used when targeting DLA + (device-type)) Lets engine run layers on + GPU if they are not supported on DLA + --require-full-compilation Require that the model should be fully + compiled to TensorRT or throw an error + --check-method-support=[method_name] + Check the support for end to end + compilation of a specified method in the + TorchScript module + --disable-tf32 Prevent Float32 layers from using the + TF32 data format + --sparse-weights Enable sparsity for weights of conv and + FC layers + -p[precision...], + --enable-precision=[precision...] (Repeatable) Enabling an operating + precision for kernels to use when + building the engine (Int8 requires a + calibration-cache argument) [ float | + float32 | f32 | fp32 | half | float16 | + f16 | fp16 | int8 | i8 | char ] + (default: float) + -d[type], --device-type=[type] The type of device the engine should be + built for [ gpu | dla ] (default: gpu) + --gpu-id=[gpu_id] GPU id if running on multi-GPU platform + (defaults to 0) + --dla-core=[dla_core] DLACore id if running on available DLA + (defaults to 0) + --engine-capability=[capability] The type of device the engine should be + built for [ standard | safety | + dla_standalone ] + --calibration-cache-file=[file_path] + Path to calibration cache file to use + for post training quantization + --teo=[op_name...], + --torch-executed-op=[op_name...] (Repeatable) Operator in the graph that + should always be run in PyTorch for + execution (partial compilation must be + enabled) + --tem=[module_name...], + --torch-executed-mod=[module_name...] + (Repeatable) Module that should always + be run in Pytorch for execution (partial + compilation must be enabled) + --mbs=[num_ops], + --min-block-size=[num_ops] Minimum number of contiguous TensorRT + supported ops to compile a subgraph to + TensorRT + --embed-engine Whether to treat input file as a + serialized TensorRT engine and embed it + into a TorchScript module (device spec + must be provided) + --num-min-timing-iter=[num_iters] Number of minimization timing iterations + used to select kernels + --num-avg-timing-iters=[num_iters] + Number of averaging timing iterations + used to select kernels + --workspace-size=[workspace_size] Maximum size of workspace given to + TensorRT + -t[threshold], + --threshold=[threshold] Maximum acceptable numerical deviation + from standard torchscript output + (default 2e-5) + --no-threshold-check Skip checking threshold compliance + --truncate-long-double, + --truncate, --truncate-64bit Truncate weights that are provided in + 64bit to 32bit (Long, Double to Int, + Float) + --save-engine Instead of compiling a full a + TorchScript program, save the created + engine to the path specified as the + output path + input_file_path Path to input TorchScript file + output_file_path Path for compiled TorchScript (or + TensorRT engine) file + input_specs... Specs for inputs to engine, can either + be a single size or a range defined by + Min, Optimal, Max sizes, e.g. + "(N,..,C,H,W)" + "[(MIN_N,..,MIN_C,MIN_H,MIN_W);(OPT_N,..,OPT_C,OPT_H,OPT_W);(MAX_N,..,MAX_C,MAX_H,MAX_W)]". + Data Type and format can be specified by + adding an "@" followed by dtype and "%" + followed by format to the end of the + shape spec. e.g. "(3, 3, 32, + 32)@f16%NHWC" + "--" can be used to terminate flag options and force all following + arguments to be treated as positional options + +e.g. + +.. code-block:: shell + + torchtrtc tests/modules/ssd_traced.jit.pt ssd_trt.ts "[(1,3,300,300); (1,3,512,512); (1, 3, 1024, 1024)]@f16%contiguous" -p f16 diff --git a/docs/v1.2.0/_sources/tutorials/use_from_pytorch.rst.txt b/docs/v1.2.0/_sources/tutorials/use_from_pytorch.rst.txt new file mode 100644 index 0000000000..296e4c3c32 --- /dev/null +++ b/docs/v1.2.0/_sources/tutorials/use_from_pytorch.rst.txt @@ -0,0 +1,64 @@ +.. _use_from_pytorch: + +Using Torch-TensorRT Directly From PyTorch +============================================ + +You will now be able to directly access TensorRT from PyTorch APIs. The process to use this feature +is very similar to the compilation workflow described in :ref:`getting_started_with_python_api` + +Start by loading ``torch_tensorrt`` into your application. + +.. code-block:: python + + import torch + import torch_tensorrt + + +Then given a TorchScript module, you can compile it with TensorRT using the ``torch._C._jit_to_backend("tensorrt", ...)`` API. + +.. code-block:: python + + import torchvision.models as models + + model = models.mobilenet_v2(pretrained=True) + script_model = torch.jit.script(model) + +Unlike the ``compile`` API in Torch-TensorRT which assumes you are trying to compile the ``forward`` function of a module +or the ``convert_method_to_trt_engine`` which converts a specified function to a TensorRT engine, the backend API +will take a dictionary which maps names of functions to compile to Compilation Spec objects which wrap the same +sort of dictionary you would provide to ``compile``. For more information on the compile spec dictionary take a look +at the documentation for the Torch-TensorRT ``TensorRTCompileSpec`` API. + +.. code-block:: python + + spec = { + "forward": torch_tensorrt.ts.TensorRTCompileSpec( + { + "inputs": [torch_tensorrt.Input([1, 3, 300, 300])], + "enabled_precisions": {torch.float, torch.half}, + "refit": False, + "debug": False, + "device": { + "device_type": torch_tensorrt.DeviceType.GPU, + "gpu_id": 0, + "dla_core": 0, + "allow_gpu_fallback": True, + }, + "capability": torch_tensorrt.EngineCapability.default, + "num_avg_timing_iters": 1, + } + ) + } + +Now to compile with Torch-TensorRT, provide the target module objects and the spec dictionary to ``torch._C._jit_to_backend("tensorrt", ...)`` + +.. code-block:: python + + trt_model = torch._C._jit_to_backend("tensorrt", script_model, spec) + +To run explicitly call the function of the method you want to run (vs. how you can just call on the module itself in standard PyTorch) + +.. code-block:: python + + input = torch.randn((1, 3, 300, 300)).to("cuda").to(torch.half) + print(trt_model.forward(input)) diff --git a/docs/v1.2.0/_sources/tutorials/using_dla.rst.txt b/docs/v1.2.0/_sources/tutorials/using_dla.rst.txt new file mode 100644 index 0000000000..9b062f7053 --- /dev/null +++ b/docs/v1.2.0/_sources/tutorials/using_dla.rst.txt @@ -0,0 +1,47 @@ +.. _using_dla: + +DLA +================================= + +``DLA`` NVIDIA Deep Learning Accelerator is a fixed-function accelerator engine targeted for deep learning operations. DLA is designed to do full hardware acceleration of convolutional neural networks. DLA supports various layers such as convolution, deconvolution, fully-connected, activation, pooling, batch normalization, etc. ``torch_tensorrt`` supports compilation of TorchScript Module and deployment pipeline on the DLA hardware available on NVIDIA embedded platforms. + +NOTE: DLA supports fp16 and int8 precision only. + +Using DLA with torchtrtc + +.. code-block:: shell + + torchtrtc [input_file_path] [output_file_path] [input_shapes...] -p f16 -d dla {OPTIONS} + +Using DLA in a C++ application + +.. code-block:: c++ + + std::vector> input_shape = {{32, 3, 32, 32}}; + auto compile_spec = torch_tensorrt::CompileSpec({input_shape}); + + # Set a precision. DLA supports fp16 or int8 only + compile_spec.enabled_precisions = {torch::kF16}; + compile_spec.device.device_type = torch_tensorrt::CompileSpec::DeviceType::kDLA; + + # Make sure the gpu id is set to Xavier id for DLA + compile_spec.device.gpu_id = 0; + + # Set the DLA core id + compile_spec.device.dla_core = 1; + + # If a layer fails to run on DLA it will fallback to GPU + compile_spec.device.allow_gpu_fallback = true; + + +Using DLA in a python application + +.. code-block:: python + + compile_spec = { + "inputs": [torch_tensorrt.Input(self.input.shape)], + "device": torch_tensorrt.Device("dla:0", allow_gpu_fallback=True), + "enalbed_precisions": {torch.half}, + } + + trt_mod = torch_tensorrt.compile(self.scripted_model, compile_spec) diff --git a/docs/v1.2.0/_static/basic.css b/docs/v1.2.0/_static/basic.css new file mode 100644 index 0000000000..bf18350b65 --- /dev/null +++ b/docs/v1.2.0/_static/basic.css @@ -0,0 +1,906 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 450px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +dl.footnote > dt, +dl.citation > dt { + float: left; + margin-right: 0.5em; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dt:after { + content: ":"; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/v1.2.0/_static/collapsible-lists/LICENSE.md b/docs/v1.2.0/_static/collapsible-lists/LICENSE.md new file mode 100644 index 0000000000..ef81a64535 --- /dev/null +++ b/docs/v1.2.0/_static/collapsible-lists/LICENSE.md @@ -0,0 +1,7 @@ +This code is the fruit of Kate Morley's labor, taken from here: + +- http://code.iamkate.com/javascript/collapsible-lists/ + +She includes a generous CC0 1.0 license for all materials on her site: + +- http://code.iamkate.com/ diff --git a/docs/v1.2.0/_static/collapsible-lists/css/button-closed.png b/docs/v1.2.0/_static/collapsible-lists/css/button-closed.png new file mode 100644 index 0000000000..417eb2fc40 Binary files /dev/null and b/docs/v1.2.0/_static/collapsible-lists/css/button-closed.png differ diff --git a/docs/v1.2.0/_static/collapsible-lists/css/button-open.png b/docs/v1.2.0/_static/collapsible-lists/css/button-open.png new file mode 100644 index 0000000000..ac4a6ef32a Binary files /dev/null and b/docs/v1.2.0/_static/collapsible-lists/css/button-open.png differ diff --git a/docs/v1.2.0/_static/collapsible-lists/css/button.png b/docs/v1.2.0/_static/collapsible-lists/css/button.png new file mode 100644 index 0000000000..631d734d13 Binary files /dev/null and b/docs/v1.2.0/_static/collapsible-lists/css/button.png differ diff --git a/docs/v1.2.0/_static/collapsible-lists/css/list-item-contents.png b/docs/v1.2.0/_static/collapsible-lists/css/list-item-contents.png new file mode 100644 index 0000000000..bc082929dc Binary files /dev/null and b/docs/v1.2.0/_static/collapsible-lists/css/list-item-contents.png differ diff --git a/docs/v1.2.0/_static/collapsible-lists/css/list-item-last-open.png b/docs/v1.2.0/_static/collapsible-lists/css/list-item-last-open.png new file mode 100644 index 0000000000..cf4cf9bdb9 Binary files /dev/null and b/docs/v1.2.0/_static/collapsible-lists/css/list-item-last-open.png differ diff --git a/docs/v1.2.0/_static/collapsible-lists/css/list-item-last.png b/docs/v1.2.0/_static/collapsible-lists/css/list-item-last.png new file mode 100644 index 0000000000..1eb1c64a25 Binary files /dev/null and b/docs/v1.2.0/_static/collapsible-lists/css/list-item-last.png differ diff --git a/docs/v1.2.0/_static/collapsible-lists/css/list-item-open.png b/docs/v1.2.0/_static/collapsible-lists/css/list-item-open.png new file mode 100644 index 0000000000..0889c801a9 Binary files /dev/null and b/docs/v1.2.0/_static/collapsible-lists/css/list-item-open.png differ diff --git a/docs/v1.2.0/_static/collapsible-lists/css/list-item-root.png b/docs/v1.2.0/_static/collapsible-lists/css/list-item-root.png new file mode 100644 index 0000000000..874417106a Binary files /dev/null and b/docs/v1.2.0/_static/collapsible-lists/css/list-item-root.png differ diff --git a/docs/v1.2.0/_static/collapsible-lists/css/list-item.png b/docs/v1.2.0/_static/collapsible-lists/css/list-item.png new file mode 100644 index 0000000000..81934f9b82 Binary files /dev/null and b/docs/v1.2.0/_static/collapsible-lists/css/list-item.png differ diff --git a/docs/v1.2.0/_static/collapsible-lists/css/tree_view.css b/docs/v1.2.0/_static/collapsible-lists/css/tree_view.css new file mode 100644 index 0000000000..fa21ac4e84 --- /dev/null +++ b/docs/v1.2.0/_static/collapsible-lists/css/tree_view.css @@ -0,0 +1,61 @@ +/* Source taken directly from: + * view-source:http://code.iamkate.com/javascript/collapsible-lists/ + * + * Kate Morley's license for this code is CC0: + * Created by [Kate Morley](http://iamkate.com/). Except where explicitly + * stated otherwise, all content is released under the terms of the + * [CC0 1.0 Universal legal code](http://creativecommons.org/publicdomain/zero/1.0/legalcode). + */ +.treeView{ + -moz-user-select:none; + position:relative; +} + +.treeView ul{ + margin:0 0 0 -1.5em ! important; + padding:0 0 0 1.5em ! important; +} + +.treeView ul ul{ + background:url('list-item-contents.png') repeat-y left ! important; +} + +.treeView li.lastChild > ul{ + background-image:none ! important; +} + +.treeView li{ + margin:0 ! important; + padding:0 ! important; + background:url('list-item-root.png') no-repeat top left ! important; + list-style-position:inside ! important; + list-style-image:url('button.png') ! important; + cursor:auto; +} + +.treeView li.collapsibleListOpen{ + list-style-image:url('button-open.png') ! important; + cursor:pointer; +} + +.treeView li.collapsibleListClosed{ + list-style-image:url('button-closed.png') ! important; + cursor:pointer; +} + +.treeView li li{ + background-image:url('list-item.png') ! important; + padding-left:1.5em ! important; +} + +.treeView li.lastChild{ + background-image:url('list-item-last.png') ! important; +} + +.treeView li.collapsibleListOpen{ + background-image:url('list-item-open.png') ! important; +} + +.treeView li.collapsibleListOpen.lastChild{ + background-image:url('list-item-last-open.png') ! important; +} diff --git a/docs/v1.2.0/_static/collapsible-lists/js/CollapsibleLists.compressed.js b/docs/v1.2.0/_static/collapsible-lists/js/CollapsibleLists.compressed.js new file mode 100644 index 0000000000..429406cf39 --- /dev/null +++ b/docs/v1.2.0/_static/collapsible-lists/js/CollapsibleLists.compressed.js @@ -0,0 +1,83 @@ +/* + +CollapsibleLists.js + +An object allowing lists to dynamically expand and collapse + +Created by Kate Morley - http://code.iamkate.com/ - and released under +the terms of the CC0 1.0 Universal legal code: + +http://creativecommons.org/publicdomain/zero/1.0/legalcode + +*/ + +var CollapsibleLists=new function(){ +this.apply=function(_1){ +var _2=document.getElementsByTagName("ul"); +for(var _3=0;_3<_2.length;_3++){ +if(_2[_3].className.match(/(^| )collapsibleList( |$)/)){ +this.applyTo(_2[_3],true); +if(!_1){ +var _4=_2[_3].getElementsByTagName("ul"); +for(var _5=0;_5<_4.length;_5++){ +_4[_5].className+=" collapsibleList"; +} +} +} +} +}; +this.applyTo=function(_6,_7){ +var _8=_6.getElementsByTagName("li"); +for(var _9=0;_9<_8.length;_9++){ +if(!_7||_6==_8[_9].parentNode){ +if(_8[_9].addEventListener){ +_8[_9].addEventListener("mousedown",function(e){ +e.preventDefault(); +},false); +}else{ +_8[_9].attachEvent("onselectstart",function(){ +event.returnValue=false; +}); +} +if(_8[_9].addEventListener){ +_8[_9].addEventListener("click",_a(_8[_9]),false); +}else{ +_8[_9].attachEvent("onclick",_a(_8[_9])); +} +_b(_8[_9]); +} +} +}; +function _a(_c){ +return function(e){ +if(!e){ +e=window.event; +} +var _d=(e.target?e.target:e.srcElement); +while(_d.nodeName!="LI"){ +_d=_d.parentNode; +} +if(_d==_c){ +_b(_c); +} +}; +}; +function _b(_e){ +var _f=_e.className.match(/(^| )collapsibleListClosed( |$)/); +var uls=_e.getElementsByTagName("ul"); +for(var _10=0;_100){ +_e.className+=" collapsibleList"+(_f?"Open":"Closed"); +} +}; +}(); + diff --git a/docs/v1.2.0/_static/collapsible-lists/js/apply-collapsible-lists.js b/docs/v1.2.0/_static/collapsible-lists/js/apply-collapsible-lists.js new file mode 100644 index 0000000000..e848bb9811 --- /dev/null +++ b/docs/v1.2.0/_static/collapsible-lists/js/apply-collapsible-lists.js @@ -0,0 +1,3 @@ +$(document).ready(function() { + CollapsibleLists.apply(); +}); diff --git a/docs/v1.2.0/_static/css/theme.css b/docs/v1.2.0/_static/css/theme.css new file mode 100644 index 0000000000..335a5b8346 --- /dev/null +++ b/docs/v1.2.0/_static/css/theme.css @@ -0,0 +1,12441 @@ +@charset "UTF-8"; +/*! + * Bootstrap v4.0.0 (https://getbootstrap.com) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +:root { + --blue: #007bff; + --indigo: #6610f2; + --purple: #6f42c1; + --pink: #e83e8c; + --red: #dc3545; + --orange: #fd7e14; + --yellow: #ffc107; + --green: #28a745; + --teal: #20c997; + --cyan: #17a2b8; + --white: #fff; + --gray: #6c757d; + --gray-dark: #343a40; + --primary: #007bff; + --secondary: #6c757d; + --success: #28a745; + --info: #17a2b8; + --warning: #ffc107; + --danger: #dc3545; + --light: #f8f9fa; + --dark: #343a40; + --breakpoint-xs: 0; + --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 992px; + --breakpoint-xl: 1200px; + --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +*, +*::before, +*::after { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + -ms-overflow-style: scrollbar; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +@-ms-viewport { + width: device-width; +} +article, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; +} + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: left; + background-color: #fff; +} + +[tabindex="-1"]:focus { + outline: 0 !important; +} + +hr { + -webkit-box-sizing: content-box; + box-sizing: content-box; + height: 0; + overflow: visible; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: .5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +dfn { + font-style: italic; +} + +b, +strong { + font-weight: bolder; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -.25em; +} + +sup { + top: -.5em; +} + +a { + color: #007bff; + text-decoration: none; + background-color: transparent; + -webkit-text-decoration-skip: objects; +} +a:hover { + color: #0056b3; + text-decoration: underline; +} + +a:not([href]):not([tabindex]) { + color: inherit; + text-decoration: none; +} +a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { + color: inherit; + text-decoration: none; +} +a:not([href]):not([tabindex]):focus { + outline: 0; +} + +pre, +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + -ms-overflow-style: scrollbar; +} + +figure { + margin: 0 0 1rem; +} + +img { + vertical-align: middle; + border-style: none; +} + +svg:not(:root) { + overflow: hidden; +} + +table { + border-collapse: collapse; +} + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #6c757d; + text-align: left; + caption-side: bottom; +} + +th { + text-align: inherit; +} + +label { + display: inline-block; + margin-bottom: .5rem; +} + +button { + border-radius: 0; +} + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + padding: 0; + border-style: none; +} + +input[type="radio"], +input[type="checkbox"] { + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} + +input[type="date"], +input[type="time"], +input[type="datetime-local"], +input[type="month"] { + -webkit-appearance: listbox; +} + +textarea { + overflow: auto; + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; +} + +progress { + vertical-align: baseline; +} + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + outline-offset: -2px; + -webkit-appearance: none; +} + +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +summary { + display: list-item; + cursor: pointer; +} + +template { + display: none; +} + +[hidden] { + display: none !important; +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-bottom: 0.5rem; + font-family: inherit; + font-weight: 500; + line-height: 1.2; + color: inherit; +} + +h1, .h1 { + font-size: 2.5rem; +} + +h2, .h2 { + font-size: 2rem; +} + +h3, .h3 { + font-size: 1.75rem; +} + +h4, .h4 { + font-size: 1.5rem; +} + +h5, .h5 { + font-size: 1.25rem; +} + +h6, .h6 { + font-size: 1rem; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.2; +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.2; +} + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +small, +.small { + font-size: 80%; + font-weight: 400; +} + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} + +.blockquote-footer { + display: block; + font-size: 80%; + color: #6c757d; +} +.blockquote-footer::before { + content: "\2014 \00A0"; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: 0.25rem; + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 90%; + color: #6c757d; +} + +code, +kbd, +pre, +samp { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +code { + font-size: 87.5%; + color: #e83e8c; + word-break: break-word; +} +a > code { + color: inherit; +} + +kbd { + padding: 0.2rem 0.4rem; + font-size: 87.5%; + color: #fff; + background-color: #212529; + border-radius: 0.2rem; +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; +} + +pre { + display: block; + font-size: 87.5%; + color: #212529; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 576px) { + .container { + max-width: 540px; + } +} +@media (min-width: 768px) { + .container { + max-width: 720px; + } +} +@media (min-width: 992px) { + .container { + max-width: 960px; + } +} +@media (min-width: 1200px) { + .container { + max-width: 1140px; + } +} + +.container-fluid { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +.row { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +.no-gutters { + margin-right: 0; + margin-left: 0; +} +.no-gutters > .col, +.no-gutters > [class*="col-"] { + padding-right: 0; + padding-left: 0; +} + +.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, +.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, +.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, +.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, +.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, +.col-xl-auto { + position: relative; + width: 100%; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} + +.col { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; +} + +.col-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none; +} + +.col-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.3333333333%; + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; +} + +.col-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.6666666667%; + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; +} + +.col-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; +} + +.col-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.3333333333%; + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; +} + +.col-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.6666666667%; + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; +} + +.col-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; +} + +.col-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.3333333333%; + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; +} + +.col-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.6666666667%; + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; +} + +.col-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; +} + +.col-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.3333333333%; + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; +} + +.col-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.6666666667%; + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; +} + +.col-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; +} + +.order-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1; +} + +.order-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13; +} + +.order-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0; +} + +.order-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; +} + +.order-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; +} + +.order-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; +} + +.order-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4; +} + +.order-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5; +} + +.order-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6; +} + +.order-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7; +} + +.order-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8; +} + +.order-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9; +} + +.order-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10; +} + +.order-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11; +} + +.order-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12; +} + +.offset-1 { + margin-left: 8.3333333333%; +} + +.offset-2 { + margin-left: 16.6666666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.3333333333%; +} + +.offset-5 { + margin-left: 41.6666666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.3333333333%; +} + +.offset-8 { + margin-left: 66.6666666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.3333333333%; +} + +.offset-11 { + margin-left: 91.6666666667%; +} + +@media (min-width: 576px) { + .col-sm { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + + .col-sm-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none; + } + + .col-sm-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.3333333333%; + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-sm-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.6666666667%; + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-sm-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + + .col-sm-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.3333333333%; + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-sm-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.6666666667%; + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-sm-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + + .col-sm-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.3333333333%; + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-sm-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.6666666667%; + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-sm-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + + .col-sm-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.3333333333%; + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-sm-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.6666666667%; + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-sm-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + + .order-sm-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1; + } + + .order-sm-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13; + } + + .order-sm-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0; + } + + .order-sm-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; + } + + .order-sm-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; + } + + .order-sm-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; + } + + .order-sm-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4; + } + + .order-sm-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5; + } + + .order-sm-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6; + } + + .order-sm-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7; + } + + .order-sm-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8; + } + + .order-sm-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9; + } + + .order-sm-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10; + } + + .order-sm-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11; + } + + .order-sm-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12; + } + + .offset-sm-0 { + margin-left: 0; + } + + .offset-sm-1 { + margin-left: 8.3333333333%; + } + + .offset-sm-2 { + margin-left: 16.6666666667%; + } + + .offset-sm-3 { + margin-left: 25%; + } + + .offset-sm-4 { + margin-left: 33.3333333333%; + } + + .offset-sm-5 { + margin-left: 41.6666666667%; + } + + .offset-sm-6 { + margin-left: 50%; + } + + .offset-sm-7 { + margin-left: 58.3333333333%; + } + + .offset-sm-8 { + margin-left: 66.6666666667%; + } + + .offset-sm-9 { + margin-left: 75%; + } + + .offset-sm-10 { + margin-left: 83.3333333333%; + } + + .offset-sm-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 768px) { + .col-md { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + + .col-md-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none; + } + + .col-md-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.3333333333%; + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-md-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.6666666667%; + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-md-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + + .col-md-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.3333333333%; + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-md-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.6666666667%; + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-md-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + + .col-md-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.3333333333%; + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-md-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.6666666667%; + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-md-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + + .col-md-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.3333333333%; + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-md-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.6666666667%; + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-md-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + + .order-md-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1; + } + + .order-md-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13; + } + + .order-md-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0; + } + + .order-md-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; + } + + .order-md-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; + } + + .order-md-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; + } + + .order-md-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4; + } + + .order-md-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5; + } + + .order-md-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6; + } + + .order-md-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7; + } + + .order-md-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8; + } + + .order-md-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9; + } + + .order-md-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10; + } + + .order-md-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11; + } + + .order-md-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12; + } + + .offset-md-0 { + margin-left: 0; + } + + .offset-md-1 { + margin-left: 8.3333333333%; + } + + .offset-md-2 { + margin-left: 16.6666666667%; + } + + .offset-md-3 { + margin-left: 25%; + } + + .offset-md-4 { + margin-left: 33.3333333333%; + } + + .offset-md-5 { + margin-left: 41.6666666667%; + } + + .offset-md-6 { + margin-left: 50%; + } + + .offset-md-7 { + margin-left: 58.3333333333%; + } + + .offset-md-8 { + margin-left: 66.6666666667%; + } + + .offset-md-9 { + margin-left: 75%; + } + + .offset-md-10 { + margin-left: 83.3333333333%; + } + + .offset-md-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 992px) { + .col-lg { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + + .col-lg-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none; + } + + .col-lg-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.3333333333%; + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-lg-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.6666666667%; + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-lg-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + + .col-lg-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.3333333333%; + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-lg-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.6666666667%; + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-lg-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + + .col-lg-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.3333333333%; + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-lg-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.6666666667%; + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-lg-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + + .col-lg-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.3333333333%; + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-lg-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.6666666667%; + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-lg-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + + .order-lg-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1; + } + + .order-lg-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13; + } + + .order-lg-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0; + } + + .order-lg-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; + } + + .order-lg-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; + } + + .order-lg-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; + } + + .order-lg-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4; + } + + .order-lg-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5; + } + + .order-lg-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6; + } + + .order-lg-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7; + } + + .order-lg-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8; + } + + .order-lg-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9; + } + + .order-lg-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10; + } + + .order-lg-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11; + } + + .order-lg-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12; + } + + .offset-lg-0 { + margin-left: 0; + } + + .offset-lg-1 { + margin-left: 8.3333333333%; + } + + .offset-lg-2 { + margin-left: 16.6666666667%; + } + + .offset-lg-3 { + margin-left: 25%; + } + + .offset-lg-4 { + margin-left: 33.3333333333%; + } + + .offset-lg-5 { + margin-left: 41.6666666667%; + } + + .offset-lg-6 { + margin-left: 50%; + } + + .offset-lg-7 { + margin-left: 58.3333333333%; + } + + .offset-lg-8 { + margin-left: 66.6666666667%; + } + + .offset-lg-9 { + margin-left: 75%; + } + + .offset-lg-10 { + margin-left: 83.3333333333%; + } + + .offset-lg-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 1200px) { + .col-xl { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + + .col-xl-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none; + } + + .col-xl-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.3333333333%; + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-xl-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.6666666667%; + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-xl-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + + .col-xl-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.3333333333%; + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-xl-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.6666666667%; + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-xl-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + + .col-xl-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.3333333333%; + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-xl-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.6666666667%; + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-xl-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + + .col-xl-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.3333333333%; + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-xl-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.6666666667%; + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-xl-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + + .order-xl-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1; + } + + .order-xl-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13; + } + + .order-xl-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0; + } + + .order-xl-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; + } + + .order-xl-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; + } + + .order-xl-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; + } + + .order-xl-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4; + } + + .order-xl-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5; + } + + .order-xl-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6; + } + + .order-xl-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7; + } + + .order-xl-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8; + } + + .order-xl-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9; + } + + .order-xl-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10; + } + + .order-xl-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11; + } + + .order-xl-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12; + } + + .offset-xl-0 { + margin-left: 0; + } + + .offset-xl-1 { + margin-left: 8.3333333333%; + } + + .offset-xl-2 { + margin-left: 16.6666666667%; + } + + .offset-xl-3 { + margin-left: 25%; + } + + .offset-xl-4 { + margin-left: 33.3333333333%; + } + + .offset-xl-5 { + margin-left: 41.6666666667%; + } + + .offset-xl-6 { + margin-left: 50%; + } + + .offset-xl-7 { + margin-left: 58.3333333333%; + } + + .offset-xl-8 { + margin-left: 66.6666666667%; + } + + .offset-xl-9 { + margin-left: 75%; + } + + .offset-xl-10 { + margin-left: 83.3333333333%; + } + + .offset-xl-11 { + margin-left: 91.6666666667%; + } +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 1rem; + background-color: transparent; +} +.table th, +.table td { + padding: 0.75rem; + vertical-align: top; + border-top: 1px solid #dee2e6; +} +.table thead th { + vertical-align: bottom; + border-bottom: 2px solid #dee2e6; +} +.table tbody + tbody { + border-top: 2px solid #dee2e6; +} +.table .table { + background-color: #fff; +} + +.table-sm th, +.table-sm td { + padding: 0.3rem; +} + +.table-bordered { + border: 1px solid #dee2e6; +} +.table-bordered th, +.table-bordered td { + border: 1px solid #dee2e6; +} +.table-bordered thead th, +.table-bordered thead td { + border-bottom-width: 2px; +} + +.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(0, 0, 0, 0.05); +} + +.table-hover tbody tr:hover { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-primary, +.table-primary > th, +.table-primary > td { + background-color: #b8daff; +} + +.table-hover .table-primary:hover { + background-color: #9fcdff; +} +.table-hover .table-primary:hover > td, +.table-hover .table-primary:hover > th { + background-color: #9fcdff; +} + +.table-secondary, +.table-secondary > th, +.table-secondary > td { + background-color: #d6d8db; +} + +.table-hover .table-secondary:hover { + background-color: #c8cbcf; +} +.table-hover .table-secondary:hover > td, +.table-hover .table-secondary:hover > th { + background-color: #c8cbcf; +} + +.table-success, +.table-success > th, +.table-success > td { + background-color: #c3e6cb; +} + +.table-hover .table-success:hover { + background-color: #b1dfbb; +} +.table-hover .table-success:hover > td, +.table-hover .table-success:hover > th { + background-color: #b1dfbb; +} + +.table-info, +.table-info > th, +.table-info > td { + background-color: #bee5eb; +} + +.table-hover .table-info:hover { + background-color: #abdde5; +} +.table-hover .table-info:hover > td, +.table-hover .table-info:hover > th { + background-color: #abdde5; +} + +.table-warning, +.table-warning > th, +.table-warning > td { + background-color: #ffeeba; +} + +.table-hover .table-warning:hover { + background-color: #ffe8a1; +} +.table-hover .table-warning:hover > td, +.table-hover .table-warning:hover > th { + background-color: #ffe8a1; +} + +.table-danger, +.table-danger > th, +.table-danger > td { + background-color: #f5c6cb; +} + +.table-hover .table-danger:hover { + background-color: #f1b0b7; +} +.table-hover .table-danger:hover > td, +.table-hover .table-danger:hover > th { + background-color: #f1b0b7; +} + +.table-light, +.table-light > th, +.table-light > td { + background-color: #fdfdfe; +} + +.table-hover .table-light:hover { + background-color: #ececf6; +} +.table-hover .table-light:hover > td, +.table-hover .table-light:hover > th { + background-color: #ececf6; +} + +.table-dark, +.table-dark > th, +.table-dark > td { + background-color: #c6c8ca; +} + +.table-hover .table-dark:hover { + background-color: #b9bbbe; +} +.table-hover .table-dark:hover > td, +.table-hover .table-dark:hover > th { + background-color: #b9bbbe; +} + +.table-active, +.table-active > th, +.table-active > td { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-hover .table-active:hover { + background-color: rgba(0, 0, 0, 0.075); +} +.table-hover .table-active:hover > td, +.table-hover .table-active:hover > th { + background-color: rgba(0, 0, 0, 0.075); +} + +.table .thead-dark th { + color: #fff; + background-color: #212529; + border-color: #32383e; +} +.table .thead-light th { + color: #495057; + background-color: #e9ecef; + border-color: #dee2e6; +} + +.table-dark { + color: #fff; + background-color: #212529; +} +.table-dark th, +.table-dark td, +.table-dark thead th { + border-color: #32383e; +} +.table-dark.table-bordered { + border: 0; +} +.table-dark.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(255, 255, 255, 0.05); +} +.table-dark.table-hover tbody tr:hover { + background-color: rgba(255, 255, 255, 0.075); +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-sm > .table-bordered { + border: 0; + } +} +@media (max-width: 767.98px) { + .table-responsive-md { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-md > .table-bordered { + border: 0; + } +} +@media (max-width: 991.98px) { + .table-responsive-lg { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-lg > .table-bordered { + border: 0; + } +} +@media (max-width: 1199.98px) { + .table-responsive-xl { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-xl > .table-bordered { + border: 0; + } +} +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; +} +.table-responsive > .table-bordered { + border: 0; +} + +.form-control { + display: block; + width: 100%; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + color: #495057; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + border-radius: 0.25rem; + -webkit-transition: border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control:focus { + color: #495057; + background-color: #fff; + border-color: #80bdff; + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} +.form-control::-webkit-input-placeholder { + color: #6c757d; + opacity: 1; +} +.form-control::-moz-placeholder { + color: #6c757d; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #6c757d; + opacity: 1; +} +.form-control::-ms-input-placeholder { + color: #6c757d; + opacity: 1; +} +.form-control::placeholder { + color: #6c757d; + opacity: 1; +} +.form-control:disabled, .form-control[readonly] { + background-color: #e9ecef; + opacity: 1; +} + +select.form-control:not([size]):not([multiple]) { + height: calc(2.25rem + 2px); +} +select.form-control:focus::-ms-value { + color: #495057; + background-color: #fff; +} + +.form-control-file, +.form-control-range { + display: block; + width: 100%; +} + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; + line-height: 1.5; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; + line-height: 1.5; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding-top: 0.375rem; + padding-bottom: 0.375rem; + margin-bottom: 0; + line-height: 1.5; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} +.form-control-plaintext.form-control-sm, .input-group-sm > .form-control-plaintext.form-control, +.input-group-sm > .input-group-prepend > .form-control-plaintext.input-group-text, +.input-group-sm > .input-group-append > .form-control-plaintext.input-group-text, +.input-group-sm > .input-group-prepend > .form-control-plaintext.btn, +.input-group-sm > .input-group-append > .form-control-plaintext.btn, .form-control-plaintext.form-control-lg, .input-group-lg > .form-control-plaintext.form-control, +.input-group-lg > .input-group-prepend > .form-control-plaintext.input-group-text, +.input-group-lg > .input-group-append > .form-control-plaintext.input-group-text, +.input-group-lg > .input-group-prepend > .form-control-plaintext.btn, +.input-group-lg > .input-group-append > .form-control-plaintext.btn { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm, .input-group-sm > .form-control, +.input-group-sm > .input-group-prepend > .input-group-text, +.input-group-sm > .input-group-append > .input-group-text, +.input-group-sm > .input-group-prepend > .btn, +.input-group-sm > .input-group-append > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +select.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]), +.input-group-sm > .input-group-prepend > select.input-group-text:not([size]):not([multiple]), +.input-group-sm > .input-group-append > select.input-group-text:not([size]):not([multiple]), +.input-group-sm > .input-group-prepend > select.btn:not([size]):not([multiple]), +.input-group-sm > .input-group-append > select.btn:not([size]):not([multiple]) { + height: calc(1.8125rem + 2px); +} + +.form-control-lg, .input-group-lg > .form-control, +.input-group-lg > .input-group-prepend > .input-group-text, +.input-group-lg > .input-group-append > .input-group-text, +.input-group-lg > .input-group-prepend > .btn, +.input-group-lg > .input-group-append > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]), +.input-group-lg > .input-group-prepend > select.input-group-text:not([size]):not([multiple]), +.input-group-lg > .input-group-append > select.input-group-text:not([size]):not([multiple]), +.input-group-lg > .input-group-prepend > select.btn:not([size]):not([multiple]), +.input-group-lg > .input-group-append > select.btn:not([size]):not([multiple]) { + height: calc(2.875rem + 2px); +} + +.form-group { + margin-bottom: 1rem; +} + +.form-text { + display: block; + margin-top: 0.25rem; +} + +.form-row { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px; +} +.form-row > .col, +.form-row > [class*="col-"] { + padding-right: 5px; + padding-left: 5px; +} + +.form-check { + position: relative; + display: block; + padding-left: 1.25rem; +} + +.form-check-input { + position: absolute; + margin-top: 0.3rem; + margin-left: -1.25rem; +} +.form-check-input:disabled ~ .form-check-label { + color: #6c757d; +} + +.form-check-label { + margin-bottom: 0; +} + +.form-check-inline { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding-left: 0; + margin-right: 0.75rem; +} +.form-check-inline .form-check-input { + position: static; + margin-top: 0; + margin-right: 0.3125rem; + margin-left: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #28a745; +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: .5rem; + margin-top: .1rem; + font-size: .875rem; + line-height: 1; + color: #fff; + background-color: rgba(40, 167, 69, 0.8); + border-radius: .2rem; +} + +.was-validated .form-control:valid, .form-control.is-valid, +.was-validated .custom-select:valid, +.custom-select.is-valid { + border-color: #28a745; +} +.was-validated .form-control:valid:focus, .form-control.is-valid:focus, +.was-validated .custom-select:valid:focus, +.custom-select.is-valid:focus { + border-color: #28a745; + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} +.was-validated .form-control:valid ~ .valid-feedback, +.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback, +.form-control.is-valid ~ .valid-tooltip, +.was-validated .custom-select:valid ~ .valid-feedback, +.was-validated .custom-select:valid ~ .valid-tooltip, +.custom-select.is-valid ~ .valid-feedback, +.custom-select.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #28a745; +} +.was-validated .form-check-input:valid ~ .valid-feedback, +.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, +.form-check-input.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { + color: #28a745; +} +.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { + background-color: #71dd8a; +} +.was-validated .custom-control-input:valid ~ .valid-feedback, +.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback, +.custom-control-input.is-valid ~ .valid-tooltip { + display: block; +} +.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { + background-color: #34ce57; +} +.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { + -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(40, 167, 69, 0.25); + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} + +.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { + border-color: #28a745; +} +.was-validated .custom-file-input:valid ~ .custom-file-label::before, .custom-file-input.is-valid ~ .custom-file-label::before { + border-color: inherit; +} +.was-validated .custom-file-input:valid ~ .valid-feedback, +.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback, +.custom-file-input.is-valid ~ .valid-tooltip { + display: block; +} +.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #dc3545; +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: .5rem; + margin-top: .1rem; + font-size: .875rem; + line-height: 1; + color: #fff; + background-color: rgba(220, 53, 69, 0.8); + border-radius: .2rem; +} + +.was-validated .form-control:invalid, .form-control.is-invalid, +.was-validated .custom-select:invalid, +.custom-select.is-invalid { + border-color: #dc3545; +} +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus, +.was-validated .custom-select:invalid:focus, +.custom-select.is-invalid:focus { + border-color: #dc3545; + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} +.was-validated .form-control:invalid ~ .invalid-feedback, +.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback, +.form-control.is-invalid ~ .invalid-tooltip, +.was-validated .custom-select:invalid ~ .invalid-feedback, +.was-validated .custom-select:invalid ~ .invalid-tooltip, +.custom-select.is-invalid ~ .invalid-feedback, +.custom-select.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #dc3545; +} +.was-validated .form-check-input:invalid ~ .invalid-feedback, +.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, +.form-check-input.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { + color: #dc3545; +} +.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { + background-color: #efa2a9; +} +.was-validated .custom-control-input:invalid ~ .invalid-feedback, +.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback, +.custom-control-input.is-invalid ~ .invalid-tooltip { + display: block; +} +.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { + background-color: #e4606d; +} +.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { + -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(220, 53, 69, 0.25); + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} + +.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { + border-color: #dc3545; +} +.was-validated .custom-file-input:invalid ~ .custom-file-label::before, .custom-file-input.is-invalid ~ .custom-file-label::before { + border-color: inherit; +} +.was-validated .custom-file-input:invalid ~ .invalid-feedback, +.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback, +.custom-file-input.is-invalid ~ .invalid-tooltip { + display: block; +} +.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} + +.form-inline { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.form-inline .form-check { + width: 100%; +} +@media (min-width: 576px) { + .form-inline label { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin-bottom: 0; + } + .form-inline .form-group { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin-bottom: 0; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-plaintext { + display: inline-block; + } + .form-inline .input-group { + width: auto; + } + .form-inline .form-check { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + width: auto; + padding-left: 0; + } + .form-inline .form-check-input { + position: relative; + margin-top: 0; + margin-right: 0.25rem; + margin-left: 0; + } + .form-inline .custom-control { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + } + .form-inline .custom-control-label { + margin-bottom: 0; + } +} + +.btn { + display: inline-block; + font-weight: 400; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: 0.25rem; + -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; +} +.btn:hover, .btn:focus { + text-decoration: none; +} +.btn:focus, .btn.focus { + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} +.btn.disabled, .btn:disabled { + opacity: 0.65; +} +.btn:not(:disabled):not(.disabled) { + cursor: pointer; +} +.btn:not(:disabled):not(.disabled):active, .btn:not(:disabled):not(.disabled).active { + background-image: none; +} + +a.btn.disabled, +fieldset:disabled a.btn { + pointer-events: none; +} + +.btn-primary { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} +.btn-primary:hover { + color: #fff; + background-color: #0069d9; + border-color: #0062cc; +} +.btn-primary:focus, .btn-primary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); +} +.btn-primary.disabled, .btn-primary:disabled { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} +.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, .show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #0062cc; + border-color: #005cbf; +} +.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-primary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); +} + +.btn-secondary { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} +.btn-secondary:hover { + color: #fff; + background-color: #5a6268; + border-color: #545b62; +} +.btn-secondary:focus, .btn-secondary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); +} +.btn-secondary.disabled, .btn-secondary:disabled { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} +.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, .show > .btn-secondary.dropdown-toggle { + color: #fff; + background-color: #545b62; + border-color: #4e555b; +} +.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-secondary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); +} + +.btn-success { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} +.btn-success:hover { + color: #fff; + background-color: #218838; + border-color: #1e7e34; +} +.btn-success:focus, .btn-success.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} +.btn-success.disabled, .btn-success:disabled { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} +.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, .show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #1e7e34; + border-color: #1c7430; +} +.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, .show > .btn-success.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-info { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} +.btn-info:hover { + color: #fff; + background-color: #138496; + border-color: #117a8b; +} +.btn-info:focus, .btn-info.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} +.btn-info.disabled, .btn-info:disabled { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} +.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, .show > .btn-info.dropdown-toggle { + color: #fff; + background-color: #117a8b; + border-color: #10707f; +} +.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, .show > .btn-info.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-warning { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} +.btn-warning:hover { + color: #212529; + background-color: #e0a800; + border-color: #d39e00; +} +.btn-warning:focus, .btn-warning.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} +.btn-warning.disabled, .btn-warning:disabled { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} +.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, .show > .btn-warning.dropdown-toggle { + color: #212529; + background-color: #d39e00; + border-color: #c69500; +} +.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-warning.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-danger { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} +.btn-danger:hover { + color: #fff; + background-color: #c82333; + border-color: #bd2130; +} +.btn-danger:focus, .btn-danger.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} +.btn-danger.disabled, .btn-danger:disabled { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} +.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, .show > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #bd2130; + border-color: #b21f2d; +} +.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-danger.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-light { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-light:hover { + color: #212529; + background-color: #e2e6ea; + border-color: #dae0e5; +} +.btn-light:focus, .btn-light.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} +.btn-light.disabled, .btn-light:disabled { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, .show > .btn-light.dropdown-toggle { + color: #212529; + background-color: #dae0e5; + border-color: #d3d9df; +} +.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, .show > .btn-light.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-dark { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} +.btn-dark:hover { + color: #fff; + background-color: #23272b; + border-color: #1d2124; +} +.btn-dark:focus, .btn-dark.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} +.btn-dark.disabled, .btn-dark:disabled { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} +.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, .show > .btn-dark.dropdown-toggle { + color: #fff; + background-color: #1d2124; + border-color: #171a1d; +} +.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-dark.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-outline-primary { + color: #007bff; + background-color: transparent; + background-image: none; + border-color: #007bff; +} +.btn-outline-primary:hover { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} +.btn-outline-primary:focus, .btn-outline-primary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); +} +.btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #007bff; + background-color: transparent; +} +.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, .show > .btn-outline-primary.dropdown-toggle { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} +.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-primary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); +} + +.btn-outline-secondary { + color: #6c757d; + background-color: transparent; + background-image: none; + border-color: #6c757d; +} +.btn-outline-secondary:hover { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} +.btn-outline-secondary:focus, .btn-outline-secondary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); +} +.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #6c757d; + background-color: transparent; +} +.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, .show > .btn-outline-secondary.dropdown-toggle { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} +.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-secondary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); +} + +.btn-outline-success { + color: #28a745; + background-color: transparent; + background-image: none; + border-color: #28a745; +} +.btn-outline-success:hover { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} +.btn-outline-success:focus, .btn-outline-success.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} +.btn-outline-success.disabled, .btn-outline-success:disabled { + color: #28a745; + background-color: transparent; +} +.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, .show > .btn-outline-success.dropdown-toggle { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} +.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-success.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-outline-info { + color: #17a2b8; + background-color: transparent; + background-image: none; + border-color: #17a2b8; +} +.btn-outline-info:hover { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} +.btn-outline-info:focus, .btn-outline-info.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} +.btn-outline-info.disabled, .btn-outline-info:disabled { + color: #17a2b8; + background-color: transparent; +} +.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, .show > .btn-outline-info.dropdown-toggle { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} +.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-info.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-outline-warning { + color: #ffc107; + background-color: transparent; + background-image: none; + border-color: #ffc107; +} +.btn-outline-warning:hover { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} +.btn-outline-warning:focus, .btn-outline-warning.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} +.btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #ffc107; + background-color: transparent; +} +.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, .show > .btn-outline-warning.dropdown-toggle { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} +.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-warning.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-outline-danger { + color: #dc3545; + background-color: transparent; + background-image: none; + border-color: #dc3545; +} +.btn-outline-danger:hover { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} +.btn-outline-danger:focus, .btn-outline-danger.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} +.btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #dc3545; + background-color: transparent; +} +.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, .show > .btn-outline-danger.dropdown-toggle { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} +.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-danger.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-outline-light { + color: #f8f9fa; + background-color: transparent; + background-image: none; + border-color: #f8f9fa; +} +.btn-outline-light:hover { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-outline-light:focus, .btn-outline-light.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} +.btn-outline-light.disabled, .btn-outline-light:disabled { + color: #f8f9fa; + background-color: transparent; +} +.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, .show > .btn-outline-light.dropdown-toggle { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-light.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-outline-dark { + color: #343a40; + background-color: transparent; + background-image: none; + border-color: #343a40; +} +.btn-outline-dark:hover { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} +.btn-outline-dark:focus, .btn-outline-dark.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} +.btn-outline-dark.disabled, .btn-outline-dark:disabled { + color: #343a40; + background-color: transparent; +} +.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, .show > .btn-outline-dark.dropdown-toggle { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} +.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-dark.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-link { + font-weight: 400; + color: #007bff; + background-color: transparent; +} +.btn-link:hover { + color: #0056b3; + text-decoration: underline; + background-color: transparent; + border-color: transparent; +} +.btn-link:focus, .btn-link.focus { + text-decoration: underline; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link:disabled, .btn-link.disabled { + color: #6c757d; +} + +.btn-lg, .btn-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 0.5rem; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.show { + opacity: 1; +} + +.collapse { + display: none; +} +.collapse.show { + display: block; +} + +tr.collapse.show { + display: table-row; +} + +tbody.collapse.show { + display: table-row-group; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle::after { + display: inline-block; + width: 0; + height: 0; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0.125rem 0 0; + font-size: 1rem; + color: #212529; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} + +.dropup .dropdown-menu { + margin-top: 0; + margin-bottom: 0.125rem; +} +.dropup .dropdown-toggle::after { + display: inline-block; + width: 0; + height: 0; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropright .dropdown-menu { + margin-top: 0; + margin-left: 0.125rem; +} +.dropright .dropdown-toggle::after { + display: inline-block; + width: 0; + height: 0; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} +.dropright .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropright .dropdown-toggle::after { + vertical-align: 0; +} + +.dropleft .dropdown-menu { + margin-top: 0; + margin-right: 0.125rem; +} +.dropleft .dropdown-toggle::after { + display: inline-block; + width: 0; + height: 0; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} +.dropleft .dropdown-toggle::after { + display: none; +} +.dropleft .dropdown-toggle::before { + display: inline-block; + width: 0; + height: 0; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} +.dropleft .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropleft .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid #e9ecef; +} + +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1.5rem; + clear: both; + font-weight: 400; + color: #212529; + text-align: inherit; + white-space: nowrap; + background-color: transparent; + border: 0; +} +.dropdown-item:hover, .dropdown-item:focus { + color: #16181b; + text-decoration: none; + background-color: #f8f9fa; +} +.dropdown-item.active, .dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #007bff; +} +.dropdown-item.disabled, .dropdown-item:disabled { + color: #6c757d; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: 0.5rem 1.5rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #6c757d; + white-space: nowrap; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + -webkit-box-flex: 0; + -ms-flex: 0 1 auto; + flex: 0 1 auto; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover { + z-index: 1; +} +.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group, +.btn-group-vertical .btn + .btn, +.btn-group-vertical .btn + .btn-group, +.btn-group-vertical .btn-group + .btn, +.btn-group-vertical .btn-group + .btn-group { + margin-left: -1px; +} + +.btn-toolbar { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} +.btn-toolbar .input-group { + width: auto; +} + +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} +.dropdown-toggle-split::after { + margin-left: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group-vertical { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} +.btn-group-vertical .btn, +.btn-group-vertical .btn-group { + width: 100%; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.btn-group-toggle > .btn, +.btn-group-toggle > .btn-group > .btn { + margin-bottom: 0; +} +.btn-group-toggle > .btn input[type="radio"], +.btn-group-toggle > .btn input[type="checkbox"], +.btn-group-toggle > .btn-group > .btn input[type="radio"], +.btn-group-toggle > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} + +.input-group { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .custom-select, +.input-group > .custom-file { + position: relative; + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + width: 1%; + margin-bottom: 0; +} +.input-group > .form-control:focus, +.input-group > .custom-select:focus, +.input-group > .custom-file:focus { + z-index: 3; +} +.input-group > .form-control + .form-control, +.input-group > .form-control + .custom-select, +.input-group > .form-control + .custom-file, +.input-group > .custom-select + .form-control, +.input-group > .custom-select + .custom-select, +.input-group > .custom-select + .custom-file, +.input-group > .custom-file + .form-control, +.input-group > .custom-file + .custom-select, +.input-group > .custom-file + .custom-file { + margin-left: -1px; +} +.input-group > .form-control:not(:last-child), +.input-group > .custom-select:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group > .form-control:not(:first-child), +.input-group > .custom-select:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group > .custom-file { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.input-group > .custom-file:not(:last-child) .custom-file-label, .input-group > .custom-file:not(:last-child) .custom-file-label::before { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group > .custom-file:not(:first-child) .custom-file-label, .input-group > .custom-file:not(:first-child) .custom-file-label::before { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.input-group-prepend, +.input-group-append { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.input-group-prepend .btn, +.input-group-append .btn { + position: relative; + z-index: 2; +} +.input-group-prepend .btn + .btn, +.input-group-prepend .btn + .input-group-text, +.input-group-prepend .input-group-text + .input-group-text, +.input-group-prepend .input-group-text + .btn, +.input-group-append .btn + .btn, +.input-group-append .btn + .input-group-text, +.input-group-append .input-group-text + .input-group-text, +.input-group-append .input-group-text + .btn { + margin-left: -1px; +} + +.input-group-prepend { + margin-right: -1px; +} + +.input-group-append { + margin-left: -1px; +} + +.input-group-text { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 0.375rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #ced4da; + border-radius: 0.25rem; +} +.input-group-text input[type="radio"], +.input-group-text input[type="checkbox"] { + margin-top: 0; +} + +.input-group > .input-group-prepend > .btn, +.input-group > .input-group-prepend > .input-group-text, +.input-group > .input-group-append:not(:last-child) > .btn, +.input-group > .input-group-append:not(:last-child) > .input-group-text, +.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group > .input-group-append > .btn, +.input-group > .input-group-append > .input-group-text, +.input-group > .input-group-prepend:not(:first-child) > .btn, +.input-group > .input-group-prepend:not(:first-child) > .input-group-text, +.input-group > .input-group-prepend:first-child > .btn:not(:first-child), +.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.custom-control { + position: relative; + display: block; + min-height: 1.5rem; + padding-left: 1.5rem; +} + +.custom-control-inline { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + margin-right: 1rem; +} + +.custom-control-input { + position: absolute; + z-index: -1; + opacity: 0; +} +.custom-control-input:checked ~ .custom-control-label::before { + color: #fff; + background-color: #007bff; +} +.custom-control-input:focus ~ .custom-control-label::before { + -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} +.custom-control-input:active ~ .custom-control-label::before { + color: #fff; + background-color: #b3d7ff; +} +.custom-control-input:disabled ~ .custom-control-label { + color: #6c757d; +} +.custom-control-input:disabled ~ .custom-control-label::before { + background-color: #e9ecef; +} + +.custom-control-label { + margin-bottom: 0; +} +.custom-control-label::before { + position: absolute; + top: 0.25rem; + left: 0; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + content: ""; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: #dee2e6; +} +.custom-control-label::after { + position: absolute; + top: 0.25rem; + left: 0; + display: block; + width: 1rem; + height: 1rem; + content: ""; + background-repeat: no-repeat; + background-position: center center; + background-size: 50% 50%; +} + +.custom-checkbox .custom-control-label::before { + border-radius: 0.25rem; +} +.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before { + background-color: #007bff; +} +.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E"); +} +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { + background-color: #007bff; +} +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E"); +} +.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} +.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} + +.custom-radio .custom-control-label::before { + border-radius: 50%; +} +.custom-radio .custom-control-input:checked ~ .custom-control-label::before { + background-color: #007bff; +} +.custom-radio .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E"); +} +.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} + +.custom-select { + display: inline-block; + width: 100%; + height: calc(2.25rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + line-height: 1.5; + color: #495057; + vertical-align: middle; + background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center; + background-size: 8px 10px; + border: 1px solid #ced4da; + border-radius: 0.25rem; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.custom-select:focus { + border-color: #80bdff; + outline: 0; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075), 0 0 5px rgba(128, 189, 255, 0.5); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075), 0 0 5px rgba(128, 189, 255, 0.5); +} +.custom-select:focus::-ms-value { + color: #495057; + background-color: #fff; +} +.custom-select[multiple], .custom-select[size]:not([size="1"]) { + height: auto; + padding-right: 0.75rem; + background-image: none; +} +.custom-select:disabled { + color: #6c757d; + background-color: #e9ecef; +} +.custom-select::-ms-expand { + opacity: 0; +} + +.custom-select-sm { + height: calc(1.8125rem + 2px); + padding-top: 0.375rem; + padding-bottom: 0.375rem; + font-size: 75%; +} + +.custom-select-lg { + height: calc(2.875rem + 2px); + padding-top: 0.375rem; + padding-bottom: 0.375rem; + font-size: 125%; +} + +.custom-file { + position: relative; + display: inline-block; + width: 100%; + height: calc(2.25rem + 2px); + margin-bottom: 0; +} + +.custom-file-input { + position: relative; + z-index: 2; + width: 100%; + height: calc(2.25rem + 2px); + margin: 0; + opacity: 0; +} +.custom-file-input:focus ~ .custom-file-control { + border-color: #80bdff; + -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} +.custom-file-input:focus ~ .custom-file-control::before { + border-color: #80bdff; +} +.custom-file-input:lang(en) ~ .custom-file-label::after { + content: "Browse"; +} + +.custom-file-label { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + height: calc(2.25rem + 2px); + padding: 0.375rem 0.75rem; + line-height: 1.5; + color: #495057; + background-color: #fff; + border: 1px solid #ced4da; + border-radius: 0.25rem; +} +.custom-file-label::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 3; + display: block; + height: calc(calc(2.25rem + 2px) - 1px * 2); + padding: 0.375rem 0.75rem; + line-height: 1.5; + color: #495057; + content: "Browse"; + background-color: #e9ecef; + border-left: 1px solid #ced4da; + border-radius: 0 0.25rem 0.25rem 0; +} + +.nav { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: 0.5rem 1rem; +} +.nav-link:hover, .nav-link:focus { + text-decoration: none; +} +.nav-link.disabled { + color: #6c757d; +} + +.nav-tabs { + border-bottom: 1px solid #dee2e6; +} +.nav-tabs .nav-item { + margin-bottom: -1px; +} +.nav-tabs .nav-link { + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + border-color: #e9ecef #e9ecef #dee2e6; +} +.nav-tabs .nav-link.disabled { + color: #6c757d; + background-color: transparent; + border-color: transparent; +} +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #495057; + background-color: #fff; + border-color: #dee2e6 #dee2e6 #fff; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills .nav-link { + border-radius: 0.25rem; +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #007bff; +} + +.nav-fill .nav-item { + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + text-align: center; +} + +.nav-justified .nav-item { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + text-align: center; +} + +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} + +.navbar { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 0.5rem 1rem; +} +.navbar > .container, +.navbar > .container-fluid { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.navbar-brand { + display: inline-block; + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 1rem; + font-size: 1.25rem; + line-height: inherit; + white-space: nowrap; +} +.navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; +} + +.navbar-nav { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; +} +.navbar-nav .dropdown-menu { + position: static; + float: none; +} + +.navbar-text { + display: inline-block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.navbar-collapse { + -ms-flex-preferred-size: 100%; + flex-basis: 100%; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; +} +.navbar-toggler:hover, .navbar-toggler:focus { + text-decoration: none; +} +.navbar-toggler:not(:disabled):not(.disabled) { + cursor: pointer; +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: no-repeat center center; + background-size: 100% 100%; +} + +@media (max-width: 575.98px) { + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 576px) { + .navbar-expand-sm { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .dropdown-menu-right { + right: 0; + left: auto; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-sm .navbar-collapse { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } + .navbar-expand-sm .dropup .dropdown-menu { + top: auto; + bottom: 100%; + } +} +@media (max-width: 767.98px) { + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 768px) { + .navbar-expand-md { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .dropdown-menu-right { + right: 0; + left: auto; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-md .navbar-collapse { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } + .navbar-expand-md .dropup .dropdown-menu { + top: auto; + bottom: 100%; + } +} +@media (max-width: 991.98px) { + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 992px) { + .navbar-expand-lg { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .dropdown-menu-right { + right: 0; + left: auto; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-lg .navbar-collapse { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } + .navbar-expand-lg .dropup .dropdown-menu { + top: auto; + bottom: 100%; + } +} +@media (max-width: 1199.98px) { + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 1200px) { + .navbar-expand-xl { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .dropdown-menu-right { + right: 0; + left: auto; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-xl .navbar-collapse { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } + .navbar-expand-xl .dropup .dropdown-menu { + top: auto; + bottom: 100%; + } +} +.navbar-expand { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} +.navbar-expand > .container, +.navbar-expand > .container-fluid { + padding-right: 0; + padding-left: 0; +} +.navbar-expand .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; +} +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} +.navbar-expand .navbar-nav .dropdown-menu-right { + right: 0; + left: auto; +} +.navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; +} +.navbar-expand > .container, +.navbar-expand > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; +} +.navbar-expand .navbar-collapse { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; +} +.navbar-expand .navbar-toggler { + display: none; +} +.navbar-expand .dropup .dropdown-menu { + top: auto; + bottom: 100%; +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.5); +} +.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { + color: rgba(0, 0, 0, 0.7); +} +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .active > .nav-link, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.5); + border-color: rgba(0, 0, 0, 0.1); +} +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); +} +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.5); +} +.navbar-light .navbar-text a { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-dark .navbar-brand { + color: #fff; +} +.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { + color: #fff; +} +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.5); +} +.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { + color: rgba(255, 255, 255, 0.75); +} +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .active > .nav-link, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .nav-link.active { + color: #fff; +} +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.5); + border-color: rgba(255, 255, 255, 0.1); +} +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); +} +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.5); +} +.navbar-dark .navbar-text a { + color: #fff; +} +.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus { + color: #fff; +} + +.card { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(0, 0, 0, 0.125); + border-radius: 0.25rem; +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group:first-child .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.card > .list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.card-body { + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 1.25rem; +} + +.card-title { + margin-bottom: 0.75rem; +} + +.card-subtitle { + margin-top: -0.375rem; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link:hover { + text-decoration: none; +} +.card-link + .card-link { + margin-left: 1.25rem; +} + +.card-header { + padding: 0.75rem 1.25rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, 0.03); + border-bottom: 1px solid rgba(0, 0, 0, 0.125); +} +.card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; +} +.card-header + .list-group .list-group-item:first-child { + border-top: 0; +} + +.card-footer { + padding: 0.75rem 1.25rem; + background-color: rgba(0, 0, 0, 0.03); + border-top: 1px solid rgba(0, 0, 0, 0.125); +} +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); +} + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -0.75rem; + margin-left: -0.625rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem; +} + +.card-img { + width: 100%; + border-radius: calc(0.25rem - 1px); +} + +.card-img-top { + width: 100%; + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} + +.card-img-bottom { + width: 100%; + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} + +.card-deck { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} +.card-deck .card { + margin-bottom: 15px; +} +@media (min-width: 576px) { + .card-deck { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + margin-right: -15px; + margin-left: -15px; + } + .card-deck .card { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex: 1 0 0%; + flex: 1 0 0%; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + margin-right: 15px; + margin-bottom: 0; + margin-left: 15px; + } +} + +.card-group { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} +.card-group > .card { + margin-bottom: 15px; +} +@media (min-width: 576px) { + .card-group { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + } + .card-group > .card { + -webkit-box-flex: 1; + -ms-flex: 1 0 0%; + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:first-child { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:first-child .card-img-top, + .card-group > .card:first-child .card-header { + border-top-right-radius: 0; + } + .card-group > .card:first-child .card-img-bottom, + .card-group > .card:first-child .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:last-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:last-child .card-img-top, + .card-group > .card:last-child .card-header { + border-top-left-radius: 0; + } + .card-group > .card:last-child .card-img-bottom, + .card-group > .card:last-child .card-footer { + border-bottom-left-radius: 0; + } + .card-group > .card:only-child { + border-radius: 0.25rem; + } + .card-group > .card:only-child .card-img-top, + .card-group > .card:only-child .card-header { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; + } + .card-group > .card:only-child .card-img-bottom, + .card-group > .card:only-child .card-footer { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + } + .card-group > .card:not(:first-child):not(:last-child):not(:only-child) { + border-radius: 0; + } + .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-top, + .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom, + .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-header, + .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-footer { + border-radius: 0; + } +} + +.card-columns .card { + margin-bottom: 0.75rem; +} +@media (min-width: 576px) { + .card-columns { + -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; + -webkit-column-gap: 1.25rem; + -moz-column-gap: 1.25rem; + column-gap: 1.25rem; + } + .card-columns .card { + display: inline-block; + width: 100%; + } +} + +.breadcrumb { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding: 0.75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #e9ecef; + border-radius: 0.25rem; +} + +.breadcrumb-item + .breadcrumb-item::before { + display: inline-block; + padding-right: 0.5rem; + padding-left: 0.5rem; + color: #6c757d; + content: "/"; +} +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: underline; +} +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: none; +} +.breadcrumb-item.active { + color: #6c757d; +} + +.pagination { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + padding-left: 0; + list-style: none; + border-radius: 0.25rem; +} + +.page-link { + position: relative; + display: block; + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #007bff; + background-color: #fff; + border: 1px solid #dee2e6; +} +.page-link:hover { + color: #0056b3; + text-decoration: none; + background-color: #e9ecef; + border-color: #dee2e6; +} +.page-link:focus { + z-index: 2; + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} +.page-link:not(:disabled):not(.disabled) { + cursor: pointer; +} + +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; +} +.page-item.active .page-link { + z-index: 1; + color: #fff; + background-color: #007bff; + border-color: #007bff; +} +.page-item.disabled .page-link { + color: #6c757d; + pointer-events: none; + cursor: auto; + background-color: #fff; + border-color: #dee2e6; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5; +} +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; +} +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; +} +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} + +.badge { + display: inline-block; + padding: 0.25em 0.4em; + font-size: 75%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; +} +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.badge-pill { + padding-right: 0.6em; + padding-left: 0.6em; + border-radius: 10rem; +} + +.badge-primary { + color: #fff; + background-color: #007bff; +} +.badge-primary[href]:hover, .badge-primary[href]:focus { + color: #fff; + text-decoration: none; + background-color: #0062cc; +} + +.badge-secondary { + color: #fff; + background-color: #6c757d; +} +.badge-secondary[href]:hover, .badge-secondary[href]:focus { + color: #fff; + text-decoration: none; + background-color: #545b62; +} + +.badge-success { + color: #fff; + background-color: #28a745; +} +.badge-success[href]:hover, .badge-success[href]:focus { + color: #fff; + text-decoration: none; + background-color: #1e7e34; +} + +.badge-info { + color: #fff; + background-color: #17a2b8; +} +.badge-info[href]:hover, .badge-info[href]:focus { + color: #fff; + text-decoration: none; + background-color: #117a8b; +} + +.badge-warning { + color: #212529; + background-color: #ffc107; +} +.badge-warning[href]:hover, .badge-warning[href]:focus { + color: #212529; + text-decoration: none; + background-color: #d39e00; +} + +.badge-danger { + color: #fff; + background-color: #dc3545; +} +.badge-danger[href]:hover, .badge-danger[href]:focus { + color: #fff; + text-decoration: none; + background-color: #bd2130; +} + +.badge-light { + color: #212529; + background-color: #f8f9fa; +} +.badge-light[href]:hover, .badge-light[href]:focus { + color: #212529; + text-decoration: none; + background-color: #dae0e5; +} + +.badge-dark { + color: #fff; + background-color: #343a40; +} +.badge-dark[href]:hover, .badge-dark[href]:focus { + color: #fff; + text-decoration: none; + background-color: #1d2124; +} + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #e9ecef; + border-radius: 0.3rem; +} +@media (min-width: 576px) { + .jumbotron { + padding: 4rem 2rem; + } +} + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0; +} + +.alert { + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; +} + +.alert-dismissible { + padding-right: 4rem; +} +.alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + padding: 0.75rem 1.25rem; + color: inherit; +} + +.alert-primary { + color: #004085; + background-color: #cce5ff; + border-color: #b8daff; +} +.alert-primary hr { + border-top-color: #9fcdff; +} +.alert-primary .alert-link { + color: #002752; +} + +.alert-secondary { + color: #383d41; + background-color: #e2e3e5; + border-color: #d6d8db; +} +.alert-secondary hr { + border-top-color: #c8cbcf; +} +.alert-secondary .alert-link { + color: #202326; +} + +.alert-success { + color: #155724; + background-color: #d4edda; + border-color: #c3e6cb; +} +.alert-success hr { + border-top-color: #b1dfbb; +} +.alert-success .alert-link { + color: #0b2e13; +} + +.alert-info { + color: #0c5460; + background-color: #d1ecf1; + border-color: #bee5eb; +} +.alert-info hr { + border-top-color: #abdde5; +} +.alert-info .alert-link { + color: #062c33; +} + +.alert-warning { + color: #856404; + background-color: #fff3cd; + border-color: #ffeeba; +} +.alert-warning hr { + border-top-color: #ffe8a1; +} +.alert-warning .alert-link { + color: #533f03; +} + +.alert-danger { + color: #721c24; + background-color: #f8d7da; + border-color: #f5c6cb; +} +.alert-danger hr { + border-top-color: #f1b0b7; +} +.alert-danger .alert-link { + color: #491217; +} + +.alert-light { + color: #818182; + background-color: #fefefe; + border-color: #fdfdfe; +} +.alert-light hr { + border-top-color: #ececf6; +} +.alert-light .alert-link { + color: #686868; +} + +.alert-dark { + color: #1b1e21; + background-color: #d6d8d9; + border-color: #c6c8ca; +} +.alert-dark hr { + border-top-color: #b9bbbe; +} +.alert-dark .alert-link { + color: #040505; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} +.progress { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + height: 1rem; + overflow: hidden; + font-size: 0.75rem; + background-color: #e9ecef; + border-radius: 0.25rem; +} + +.progress-bar { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + color: #fff; + text-align: center; + background-color: #007bff; + -webkit-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem; +} + +.progress-bar-animated { + -webkit-animation: progress-bar-stripes 1s linear infinite; + animation: progress-bar-stripes 1s linear infinite; +} + +.media { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; +} + +.media-body { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; +} + +.list-group { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; +} + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit; +} +.list-group-item-action:hover, .list-group-item-action:focus { + color: #495057; + text-decoration: none; + background-color: #f8f9fa; +} +.list-group-item-action:active { + color: #212529; + background-color: #e9ecef; +} + +.list-group-item { + position: relative; + display: block; + padding: 0.75rem 1.25rem; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); +} +.list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.list-group-item:hover, .list-group-item:focus { + z-index: 1; + text-decoration: none; +} +.list-group-item.disabled, .list-group-item:disabled { + color: #6c757d; + background-color: #fff; +} +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.list-group-flush .list-group-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} +.list-group-flush:first-child .list-group-item:first-child { + border-top: 0; +} +.list-group-flush:last-child .list-group-item:last-child { + border-bottom: 0; +} + +.list-group-item-primary { + color: #004085; + background-color: #b8daff; +} +.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #004085; + background-color: #9fcdff; +} +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #004085; + border-color: #004085; +} + +.list-group-item-secondary { + color: #383d41; + background-color: #d6d8db; +} +.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #383d41; + background-color: #c8cbcf; +} +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #383d41; + border-color: #383d41; +} + +.list-group-item-success { + color: #155724; + background-color: #c3e6cb; +} +.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #155724; + background-color: #b1dfbb; +} +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #155724; + border-color: #155724; +} + +.list-group-item-info { + color: #0c5460; + background-color: #bee5eb; +} +.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #0c5460; + background-color: #abdde5; +} +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #0c5460; + border-color: #0c5460; +} + +.list-group-item-warning { + color: #856404; + background-color: #ffeeba; +} +.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #856404; + background-color: #ffe8a1; +} +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #856404; + border-color: #856404; +} + +.list-group-item-danger { + color: #721c24; + background-color: #f5c6cb; +} +.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #721c24; + background-color: #f1b0b7; +} +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #721c24; + border-color: #721c24; +} + +.list-group-item-light { + color: #818182; + background-color: #fdfdfe; +} +.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #818182; + background-color: #ececf6; +} +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #818182; + border-color: #818182; +} + +.list-group-item-dark { + color: #1b1e21; + background-color: #c6c8ca; +} +.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #1b1e21; + background-color: #b9bbbe; +} +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #1b1e21; + border-color: #1b1e21; +} + +.close { + float: right; + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .5; +} +.close:hover, .close:focus { + color: #000; + text-decoration: none; + opacity: .75; +} +.close:not(:disabled):not(.disabled) { + cursor: pointer; +} + +button.close { + padding: 0; + background-color: transparent; + border: 0; + -webkit-appearance: none; +} + +.modal-open { + overflow: hidden; +} + +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + outline: 0; +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform 0.3s ease-out; + transition: -webkit-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out; + -webkit-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.show .modal-dialog { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); +} + +.modal-dialog-centered { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + min-height: calc(100% - (0.5rem * 2)); +} + +.modal-content { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-header { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 1rem; + border-bottom: 1px solid #e9ecef; + border-top-left-radius: 0.3rem; + border-top-right-radius: 0.3rem; +} +.modal-header .close { + padding: 1rem; + margin: -1rem -1rem -1rem auto; +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5; +} + +.modal-body { + position: relative; + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 1rem; +} + +.modal-footer { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + padding: 1rem; + border-top: 1px solid #e9ecef; +} +.modal-footer > :not(:first-child) { + margin-left: .25rem; +} +.modal-footer > :not(:last-child) { + margin-right: .25rem; +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto; + } + + .modal-dialog-centered { + min-height: calc(100% - (1.75rem * 2)); + } + + .modal-sm { + max-width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + max-width: 800px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + opacity: 0; +} +.tooltip.show { + opacity: 0.9; +} +.tooltip .arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; +} +.tooltip .arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] { + padding: 0.4rem 0; +} +.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow { + bottom: 0; +} +.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before { + top: 0; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000; +} + +.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] { + padding: 0 0.4rem; +} +.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before { + right: 0; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000; +} + +.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] { + padding: 0.4rem 0; +} +.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow { + top: 0; +} +.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before { + bottom: 0; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000; +} + +.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] { + padding: 0 0.4rem; +} +.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before { + left: 0; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000; +} + +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 0.25rem; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; +} +.popover .arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; + margin: 0 0.3rem; +} +.popover .arrow::before, .popover .arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-popover-top, .bs-popover-auto[x-placement^="top"] { + margin-bottom: 0.5rem; +} +.bs-popover-top .arrow, .bs-popover-auto[x-placement^="top"] .arrow { + bottom: calc((0.5rem + 1px) * -1); +} +.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^="top"] .arrow::before, +.bs-popover-top .arrow::after, +.bs-popover-auto[x-placement^="top"] .arrow::after { + border-width: 0.5rem 0.5rem 0; +} +.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^="top"] .arrow::before { + bottom: 0; + border-top-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-top .arrow::after, .bs-popover-auto[x-placement^="top"] .arrow::after { + bottom: 1px; + border-top-color: #fff; +} + +.bs-popover-right, .bs-popover-auto[x-placement^="right"] { + margin-left: 0.5rem; +} +.bs-popover-right .arrow, .bs-popover-auto[x-placement^="right"] .arrow { + left: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} +.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^="right"] .arrow::before, +.bs-popover-right .arrow::after, +.bs-popover-auto[x-placement^="right"] .arrow::after { + border-width: 0.5rem 0.5rem 0.5rem 0; +} +.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^="right"] .arrow::before { + left: 0; + border-right-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-right .arrow::after, .bs-popover-auto[x-placement^="right"] .arrow::after { + left: 1px; + border-right-color: #fff; +} + +.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] { + margin-top: 0.5rem; +} +.bs-popover-bottom .arrow, .bs-popover-auto[x-placement^="bottom"] .arrow { + top: calc((0.5rem + 1px) * -1); +} +.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^="bottom"] .arrow::before, +.bs-popover-bottom .arrow::after, +.bs-popover-auto[x-placement^="bottom"] .arrow::after { + border-width: 0 0.5rem 0.5rem 0.5rem; +} +.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^="bottom"] .arrow::before { + top: 0; + border-bottom-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-bottom .arrow::after, .bs-popover-auto[x-placement^="bottom"] .arrow::after { + top: 1px; + border-bottom-color: #fff; +} +.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #f7f7f7; +} + +.bs-popover-left, .bs-popover-auto[x-placement^="left"] { + margin-right: 0.5rem; +} +.bs-popover-left .arrow, .bs-popover-auto[x-placement^="left"] .arrow { + right: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} +.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^="left"] .arrow::before, +.bs-popover-left .arrow::after, +.bs-popover-auto[x-placement^="left"] .arrow::after { + border-width: 0.5rem 0 0.5rem 0.5rem; +} +.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^="left"] .arrow::before { + right: 0; + border-left-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-left .arrow::after, .bs-popover-auto[x-placement^="left"] .arrow::after { + right: 1px; + border-left-color: #fff; +} + +.popover-header { + padding: 0.5rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + color: inherit; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} +.popover-header:empty { + display: none; +} + +.popover-body { + padding: 0.5rem 0.75rem; + color: #212529; +} + +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-item { + position: relative; + display: none; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + width: 100%; + -webkit-transition: -webkit-transform 0.6s ease; + transition: -webkit-transform 0.6s ease; + transition: transform 0.6s ease; + transition: transform 0.6s ease, -webkit-transform 0.6s ease; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next, +.carousel-item-prev { + position: absolute; + top: 0; +} + +.carousel-item-next.carousel-item-left, +.carousel-item-prev.carousel-item-right { + -webkit-transform: translateX(0); + transform: translateX(0); +} +@supports (transform-style: preserve-3d) { + .carousel-item-next.carousel-item-left, + .carousel-item-prev.carousel-item-right { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.carousel-item-next, +.active.carousel-item-right { + -webkit-transform: translateX(100%); + transform: translateX(100%); +} +@supports (transform-style: preserve-3d) { + .carousel-item-next, + .active.carousel-item-right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.carousel-item-prev, +.active.carousel-item-left { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); +} +@supports (transform-style: preserve-3d) { + .carousel-item-prev, + .active.carousel-item-left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + width: 15%; + color: #fff; + text-align: center; + opacity: 0.5; +} +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: .9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 20px; + height: 20px; + background: transparent no-repeat center center; + background-size: 100% 100%; +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 10px; + left: 0; + z-index: 15; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none; +} +.carousel-indicators li { + position: relative; + -webkit-box-flex: 0; + -ms-flex: 0 1 auto; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + background-color: rgba(255, 255, 255, 0.5); +} +.carousel-indicators li::before { + position: absolute; + top: -10px; + left: 0; + display: inline-block; + width: 100%; + height: 10px; + content: ""; +} +.carousel-indicators li::after { + position: absolute; + bottom: -10px; + left: 0; + display: inline-block; + width: 100%; + height: 10px; + content: ""; +} +.carousel-indicators .active { + background-color: #fff; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.bg-primary { + background-color: #007bff !important; +} + +a.bg-primary:hover, a.bg-primary:focus, +button.bg-primary:hover, +button.bg-primary:focus { + background-color: #0062cc !important; +} + +.bg-secondary { + background-color: #6c757d !important; +} + +a.bg-secondary:hover, a.bg-secondary:focus, +button.bg-secondary:hover, +button.bg-secondary:focus { + background-color: #545b62 !important; +} + +.bg-success { + background-color: #28a745 !important; +} + +a.bg-success:hover, a.bg-success:focus, +button.bg-success:hover, +button.bg-success:focus { + background-color: #1e7e34 !important; +} + +.bg-info { + background-color: #17a2b8 !important; +} + +a.bg-info:hover, a.bg-info:focus, +button.bg-info:hover, +button.bg-info:focus { + background-color: #117a8b !important; +} + +.bg-warning { + background-color: #ffc107 !important; +} + +a.bg-warning:hover, a.bg-warning:focus, +button.bg-warning:hover, +button.bg-warning:focus { + background-color: #d39e00 !important; +} + +.bg-danger { + background-color: #dc3545 !important; +} + +a.bg-danger:hover, a.bg-danger:focus, +button.bg-danger:hover, +button.bg-danger:focus { + background-color: #bd2130 !important; +} + +.bg-light { + background-color: #f8f9fa !important; +} + +a.bg-light:hover, a.bg-light:focus, +button.bg-light:hover, +button.bg-light:focus { + background-color: #dae0e5 !important; +} + +.bg-dark { + background-color: #343a40 !important; +} + +a.bg-dark:hover, a.bg-dark:focus, +button.bg-dark:hover, +button.bg-dark:focus { + background-color: #1d2124 !important; +} + +.bg-white { + background-color: #fff !important; +} + +.bg-transparent { + background-color: transparent !important; +} + +.border { + border: 1px solid #dee2e6 !important; +} + +.border-top { + border-top: 1px solid #dee2e6 !important; +} + +.border-right { + border-right: 1px solid #dee2e6 !important; +} + +.border-bottom { + border-bottom: 1px solid #dee2e6 !important; +} + +.border-left { + border-left: 1px solid #dee2e6 !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-right-0 { + border-right: 0 !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-left-0 { + border-left: 0 !important; +} + +.border-primary { + border-color: #007bff !important; +} + +.border-secondary { + border-color: #6c757d !important; +} + +.border-success { + border-color: #28a745 !important; +} + +.border-info { + border-color: #17a2b8 !important; +} + +.border-warning { + border-color: #ffc107 !important; +} + +.border-danger { + border-color: #dc3545 !important; +} + +.border-light { + border-color: #f8f9fa !important; +} + +.border-dark { + border-color: #343a40 !important; +} + +.border-white { + border-color: #fff !important; +} + +.rounded { + border-radius: 0.25rem !important; +} + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; +} + +.rounded-right { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; +} + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-left { + border-top-left-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.d-none { + display: none !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; +} + +.d-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; +} + +@media (min-width: 576px) { + .d-sm-none { + display: none !important; + } + + .d-sm-inline { + display: inline !important; + } + + .d-sm-inline-block { + display: inline-block !important; + } + + .d-sm-block { + display: block !important; + } + + .d-sm-table { + display: table !important; + } + + .d-sm-table-row { + display: table-row !important; + } + + .d-sm-table-cell { + display: table-cell !important; + } + + .d-sm-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } + + .d-sm-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} +@media (min-width: 768px) { + .d-md-none { + display: none !important; + } + + .d-md-inline { + display: inline !important; + } + + .d-md-inline-block { + display: inline-block !important; + } + + .d-md-block { + display: block !important; + } + + .d-md-table { + display: table !important; + } + + .d-md-table-row { + display: table-row !important; + } + + .d-md-table-cell { + display: table-cell !important; + } + + .d-md-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } + + .d-md-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} +@media (min-width: 992px) { + .d-lg-none { + display: none !important; + } + + .d-lg-inline { + display: inline !important; + } + + .d-lg-inline-block { + display: inline-block !important; + } + + .d-lg-block { + display: block !important; + } + + .d-lg-table { + display: table !important; + } + + .d-lg-table-row { + display: table-row !important; + } + + .d-lg-table-cell { + display: table-cell !important; + } + + .d-lg-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } + + .d-lg-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} +@media (min-width: 1200px) { + .d-xl-none { + display: none !important; + } + + .d-xl-inline { + display: inline !important; + } + + .d-xl-inline-block { + display: inline-block !important; + } + + .d-xl-block { + display: block !important; + } + + .d-xl-table { + display: table !important; + } + + .d-xl-table-row { + display: table-row !important; + } + + .d-xl-table-cell { + display: table-cell !important; + } + + .d-xl-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } + + .d-xl-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} +@media print { + .d-print-none { + display: none !important; + } + + .d-print-inline { + display: inline !important; + } + + .d-print-inline-block { + display: inline-block !important; + } + + .d-print-block { + display: block !important; + } + + .d-print-table { + display: table !important; + } + + .d-print-table-row { + display: table-row !important; + } + + .d-print-table-cell { + display: table-cell !important; + } + + .d-print-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } + + .d-print-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden; +} +.embed-responsive::before { + display: block; + content: ""; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} + +.embed-responsive-21by9::before { + padding-top: 42.8571428571%; +} + +.embed-responsive-16by9::before { + padding-top: 56.25%; +} + +.embed-responsive-4by3::before { + padding-top: 75%; +} + +.embed-responsive-1by1::before { + padding-top: 100%; +} + +.flex-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important; +} + +.flex-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important; +} + +.flex-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; +} + +.flex-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; +} + +.flex-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; +} + +.justify-content-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; +} + +.justify-content-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; +} + +.justify-content-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; +} + +.justify-content-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; +} + +.justify-content-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; +} + +.align-items-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; +} + +.align-items-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; +} + +.align-items-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important; +} + +.align-items-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; +} + +.align-items-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; +} + +.align-content-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; +} + +.align-content-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; +} + +.align-content-center { + -ms-flex-line-pack: center !important; + align-content: center !important; +} + +.align-content-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; +} + +.align-content-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; +} + +.align-content-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; +} + +.align-self-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; +} + +.align-self-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; +} + +.align-self-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; +} + +.align-self-center { + -ms-flex-item-align: center !important; + align-self: center !important; +} + +.align-self-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; +} + +.align-self-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; +} + +@media (min-width: 576px) { + .flex-sm-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important; + } + + .flex-sm-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important; + } + + .flex-sm-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + + .flex-sm-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + + .flex-sm-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + + .flex-sm-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + + .flex-sm-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + + .justify-content-sm-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + + .justify-content-sm-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + + .justify-content-sm-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; + } + + .justify-content-sm-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + + .justify-content-sm-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + + .align-items-sm-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; + } + + .align-items-sm-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; + } + + .align-items-sm-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important; + } + + .align-items-sm-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + + .align-items-sm-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + + .align-content-sm-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + + .align-content-sm-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + + .align-content-sm-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + + .align-content-sm-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + + .align-content-sm-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + + .align-content-sm-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + + .align-self-sm-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + + .align-self-sm-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + + .align-self-sm-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + + .align-self-sm-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + + .align-self-sm-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + + .align-self-sm-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} +@media (min-width: 768px) { + .flex-md-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important; + } + + .flex-md-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important; + } + + .flex-md-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + + .flex-md-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + + .flex-md-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + + .flex-md-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + + .flex-md-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + + .justify-content-md-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + + .justify-content-md-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + + .justify-content-md-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; + } + + .justify-content-md-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + + .justify-content-md-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + + .align-items-md-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; + } + + .align-items-md-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; + } + + .align-items-md-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important; + } + + .align-items-md-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + + .align-items-md-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + + .align-content-md-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + + .align-content-md-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + + .align-content-md-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + + .align-content-md-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + + .align-content-md-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + + .align-content-md-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + + .align-self-md-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + + .align-self-md-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + + .align-self-md-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + + .align-self-md-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + + .align-self-md-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + + .align-self-md-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} +@media (min-width: 992px) { + .flex-lg-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important; + } + + .flex-lg-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important; + } + + .flex-lg-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + + .flex-lg-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + + .flex-lg-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + + .flex-lg-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + + .flex-lg-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + + .justify-content-lg-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + + .justify-content-lg-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + + .justify-content-lg-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; + } + + .justify-content-lg-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + + .justify-content-lg-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + + .align-items-lg-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; + } + + .align-items-lg-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; + } + + .align-items-lg-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important; + } + + .align-items-lg-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + + .align-items-lg-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + + .align-content-lg-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + + .align-content-lg-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + + .align-content-lg-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + + .align-content-lg-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + + .align-content-lg-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + + .align-content-lg-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + + .align-self-lg-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + + .align-self-lg-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + + .align-self-lg-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + + .align-self-lg-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + + .align-self-lg-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + + .align-self-lg-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} +@media (min-width: 1200px) { + .flex-xl-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important; + } + + .flex-xl-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important; + } + + .flex-xl-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + + .flex-xl-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + + .flex-xl-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + + .flex-xl-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + + .flex-xl-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + + .justify-content-xl-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + + .justify-content-xl-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + + .justify-content-xl-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; + } + + .justify-content-xl-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + + .justify-content-xl-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + + .align-items-xl-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; + } + + .align-items-xl-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; + } + + .align-items-xl-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important; + } + + .align-items-xl-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + + .align-items-xl-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + + .align-content-xl-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + + .align-content-xl-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + + .align-content-xl-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + + .align-content-xl-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + + .align-content-xl-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + + .align-content-xl-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + + .align-self-xl-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + + .align-self-xl-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + + .align-self-xl-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + + .align-self-xl-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + + .align-self-xl-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + + .align-self-xl-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} +.float-left { + float: left !important; +} + +.float-right { + float: right !important; +} + +.float-none { + float: none !important; +} + +@media (min-width: 576px) { + .float-sm-left { + float: left !important; + } + + .float-sm-right { + float: right !important; + } + + .float-sm-none { + float: none !important; + } +} +@media (min-width: 768px) { + .float-md-left { + float: left !important; + } + + .float-md-right { + float: right !important; + } + + .float-md-none { + float: none !important; + } +} +@media (min-width: 992px) { + .float-lg-left { + float: left !important; + } + + .float-lg-right { + float: right !important; + } + + .float-lg-none { + float: none !important; + } +} +@media (min-width: 1200px) { + .float-xl-left { + float: left !important; + } + + .float-xl-right { + float: right !important; + } + + .float-xl-none { + float: none !important; + } +} +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: sticky !important; +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +@supports (position: sticky) { + .sticky-top { + position: sticky; + top: 0; + z-index: 1020; + } +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + -webkit-clip-path: inset(50%); + clip-path: inset(50%); + border: 0; +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; + -webkit-clip-path: none; + clip-path: none; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.m-0 { + margin: 0 !important; +} + +.mt-0, +.my-0 { + margin-top: 0 !important; +} + +.mr-0, +.mx-0 { + margin-right: 0 !important; +} + +.mb-0, +.my-0 { + margin-bottom: 0 !important; +} + +.ml-0, +.mx-0 { + margin-left: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.mt-1, +.my-1 { + margin-top: 0.25rem !important; +} + +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; +} + +.mb-1, +.my-1 { + margin-bottom: 0.25rem !important; +} + +.ml-1, +.mx-1 { + margin-left: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.mt-2, +.my-2 { + margin-top: 0.5rem !important; +} + +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; +} + +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; +} + +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.mt-3, +.my-3 { + margin-top: 1rem !important; +} + +.mr-3, +.mx-3 { + margin-right: 1rem !important; +} + +.mb-3, +.my-3 { + margin-bottom: 1rem !important; +} + +.ml-3, +.mx-3 { + margin-left: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.mt-4, +.my-4 { + margin-top: 1.5rem !important; +} + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important; +} + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; +} + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.mt-5, +.my-5 { + margin-top: 3rem !important; +} + +.mr-5, +.mx-5 { + margin-right: 3rem !important; +} + +.mb-5, +.my-5 { + margin-bottom: 3rem !important; +} + +.ml-5, +.mx-5 { + margin-left: 3rem !important; +} + +.p-0 { + padding: 0 !important; +} + +.pt-0, +.py-0 { + padding-top: 0 !important; +} + +.pr-0, +.px-0 { + padding-right: 0 !important; +} + +.pb-0, +.py-0 { + padding-bottom: 0 !important; +} + +.pl-0, +.px-0 { + padding-left: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.pt-1, +.py-1 { + padding-top: 0.25rem !important; +} + +.pr-1, +.px-1 { + padding-right: 0.25rem !important; +} + +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; +} + +.pl-1, +.px-1 { + padding-left: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.pt-2, +.py-2 { + padding-top: 0.5rem !important; +} + +.pr-2, +.px-2 { + padding-right: 0.5rem !important; +} + +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; +} + +.pl-2, +.px-2 { + padding-left: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.pt-3, +.py-3 { + padding-top: 1rem !important; +} + +.pr-3, +.px-3 { + padding-right: 1rem !important; +} + +.pb-3, +.py-3 { + padding-bottom: 1rem !important; +} + +.pl-3, +.px-3 { + padding-left: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.pt-4, +.py-4 { + padding-top: 1.5rem !important; +} + +.pr-4, +.px-4 { + padding-right: 1.5rem !important; +} + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; +} + +.pl-4, +.px-4 { + padding-left: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.pt-5, +.py-5 { + padding-top: 3rem !important; +} + +.pr-5, +.px-5 { + padding-right: 3rem !important; +} + +.pb-5, +.py-5 { + padding-bottom: 3rem !important; +} + +.pl-5, +.px-5 { + padding-left: 3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mt-auto, +.my-auto { + margin-top: auto !important; +} + +.mr-auto, +.mx-auto { + margin-right: auto !important; +} + +.mb-auto, +.my-auto { + margin-bottom: auto !important; +} + +.ml-auto, +.mx-auto { + margin-left: auto !important; +} + +@media (min-width: 576px) { + .m-sm-0 { + margin: 0 !important; + } + + .mt-sm-0, + .my-sm-0 { + margin-top: 0 !important; + } + + .mr-sm-0, + .mx-sm-0 { + margin-right: 0 !important; + } + + .mb-sm-0, + .my-sm-0 { + margin-bottom: 0 !important; + } + + .ml-sm-0, + .mx-sm-0 { + margin-left: 0 !important; + } + + .m-sm-1 { + margin: 0.25rem !important; + } + + .mt-sm-1, + .my-sm-1 { + margin-top: 0.25rem !important; + } + + .mr-sm-1, + .mx-sm-1 { + margin-right: 0.25rem !important; + } + + .mb-sm-1, + .my-sm-1 { + margin-bottom: 0.25rem !important; + } + + .ml-sm-1, + .mx-sm-1 { + margin-left: 0.25rem !important; + } + + .m-sm-2 { + margin: 0.5rem !important; + } + + .mt-sm-2, + .my-sm-2 { + margin-top: 0.5rem !important; + } + + .mr-sm-2, + .mx-sm-2 { + margin-right: 0.5rem !important; + } + + .mb-sm-2, + .my-sm-2 { + margin-bottom: 0.5rem !important; + } + + .ml-sm-2, + .mx-sm-2 { + margin-left: 0.5rem !important; + } + + .m-sm-3 { + margin: 1rem !important; + } + + .mt-sm-3, + .my-sm-3 { + margin-top: 1rem !important; + } + + .mr-sm-3, + .mx-sm-3 { + margin-right: 1rem !important; + } + + .mb-sm-3, + .my-sm-3 { + margin-bottom: 1rem !important; + } + + .ml-sm-3, + .mx-sm-3 { + margin-left: 1rem !important; + } + + .m-sm-4 { + margin: 1.5rem !important; + } + + .mt-sm-4, + .my-sm-4 { + margin-top: 1.5rem !important; + } + + .mr-sm-4, + .mx-sm-4 { + margin-right: 1.5rem !important; + } + + .mb-sm-4, + .my-sm-4 { + margin-bottom: 1.5rem !important; + } + + .ml-sm-4, + .mx-sm-4 { + margin-left: 1.5rem !important; + } + + .m-sm-5 { + margin: 3rem !important; + } + + .mt-sm-5, + .my-sm-5 { + margin-top: 3rem !important; + } + + .mr-sm-5, + .mx-sm-5 { + margin-right: 3rem !important; + } + + .mb-sm-5, + .my-sm-5 { + margin-bottom: 3rem !important; + } + + .ml-sm-5, + .mx-sm-5 { + margin-left: 3rem !important; + } + + .p-sm-0 { + padding: 0 !important; + } + + .pt-sm-0, + .py-sm-0 { + padding-top: 0 !important; + } + + .pr-sm-0, + .px-sm-0 { + padding-right: 0 !important; + } + + .pb-sm-0, + .py-sm-0 { + padding-bottom: 0 !important; + } + + .pl-sm-0, + .px-sm-0 { + padding-left: 0 !important; + } + + .p-sm-1 { + padding: 0.25rem !important; + } + + .pt-sm-1, + .py-sm-1 { + padding-top: 0.25rem !important; + } + + .pr-sm-1, + .px-sm-1 { + padding-right: 0.25rem !important; + } + + .pb-sm-1, + .py-sm-1 { + padding-bottom: 0.25rem !important; + } + + .pl-sm-1, + .px-sm-1 { + padding-left: 0.25rem !important; + } + + .p-sm-2 { + padding: 0.5rem !important; + } + + .pt-sm-2, + .py-sm-2 { + padding-top: 0.5rem !important; + } + + .pr-sm-2, + .px-sm-2 { + padding-right: 0.5rem !important; + } + + .pb-sm-2, + .py-sm-2 { + padding-bottom: 0.5rem !important; + } + + .pl-sm-2, + .px-sm-2 { + padding-left: 0.5rem !important; + } + + .p-sm-3 { + padding: 1rem !important; + } + + .pt-sm-3, + .py-sm-3 { + padding-top: 1rem !important; + } + + .pr-sm-3, + .px-sm-3 { + padding-right: 1rem !important; + } + + .pb-sm-3, + .py-sm-3 { + padding-bottom: 1rem !important; + } + + .pl-sm-3, + .px-sm-3 { + padding-left: 1rem !important; + } + + .p-sm-4 { + padding: 1.5rem !important; + } + + .pt-sm-4, + .py-sm-4 { + padding-top: 1.5rem !important; + } + + .pr-sm-4, + .px-sm-4 { + padding-right: 1.5rem !important; + } + + .pb-sm-4, + .py-sm-4 { + padding-bottom: 1.5rem !important; + } + + .pl-sm-4, + .px-sm-4 { + padding-left: 1.5rem !important; + } + + .p-sm-5 { + padding: 3rem !important; + } + + .pt-sm-5, + .py-sm-5 { + padding-top: 3rem !important; + } + + .pr-sm-5, + .px-sm-5 { + padding-right: 3rem !important; + } + + .pb-sm-5, + .py-sm-5 { + padding-bottom: 3rem !important; + } + + .pl-sm-5, + .px-sm-5 { + padding-left: 3rem !important; + } + + .m-sm-auto { + margin: auto !important; + } + + .mt-sm-auto, + .my-sm-auto { + margin-top: auto !important; + } + + .mr-sm-auto, + .mx-sm-auto { + margin-right: auto !important; + } + + .mb-sm-auto, + .my-sm-auto { + margin-bottom: auto !important; + } + + .ml-sm-auto, + .mx-sm-auto { + margin-left: auto !important; + } +} +@media (min-width: 768px) { + .m-md-0 { + margin: 0 !important; + } + + .mt-md-0, + .my-md-0 { + margin-top: 0 !important; + } + + .mr-md-0, + .mx-md-0 { + margin-right: 0 !important; + } + + .mb-md-0, + .my-md-0 { + margin-bottom: 0 !important; + } + + .ml-md-0, + .mx-md-0 { + margin-left: 0 !important; + } + + .m-md-1 { + margin: 0.25rem !important; + } + + .mt-md-1, + .my-md-1 { + margin-top: 0.25rem !important; + } + + .mr-md-1, + .mx-md-1 { + margin-right: 0.25rem !important; + } + + .mb-md-1, + .my-md-1 { + margin-bottom: 0.25rem !important; + } + + .ml-md-1, + .mx-md-1 { + margin-left: 0.25rem !important; + } + + .m-md-2 { + margin: 0.5rem !important; + } + + .mt-md-2, + .my-md-2 { + margin-top: 0.5rem !important; + } + + .mr-md-2, + .mx-md-2 { + margin-right: 0.5rem !important; + } + + .mb-md-2, + .my-md-2 { + margin-bottom: 0.5rem !important; + } + + .ml-md-2, + .mx-md-2 { + margin-left: 0.5rem !important; + } + + .m-md-3 { + margin: 1rem !important; + } + + .mt-md-3, + .my-md-3 { + margin-top: 1rem !important; + } + + .mr-md-3, + .mx-md-3 { + margin-right: 1rem !important; + } + + .mb-md-3, + .my-md-3 { + margin-bottom: 1rem !important; + } + + .ml-md-3, + .mx-md-3 { + margin-left: 1rem !important; + } + + .m-md-4 { + margin: 1.5rem !important; + } + + .mt-md-4, + .my-md-4 { + margin-top: 1.5rem !important; + } + + .mr-md-4, + .mx-md-4 { + margin-right: 1.5rem !important; + } + + .mb-md-4, + .my-md-4 { + margin-bottom: 1.5rem !important; + } + + .ml-md-4, + .mx-md-4 { + margin-left: 1.5rem !important; + } + + .m-md-5 { + margin: 3rem !important; + } + + .mt-md-5, + .my-md-5 { + margin-top: 3rem !important; + } + + .mr-md-5, + .mx-md-5 { + margin-right: 3rem !important; + } + + .mb-md-5, + .my-md-5 { + margin-bottom: 3rem !important; + } + + .ml-md-5, + .mx-md-5 { + margin-left: 3rem !important; + } + + .p-md-0 { + padding: 0 !important; + } + + .pt-md-0, + .py-md-0 { + padding-top: 0 !important; + } + + .pr-md-0, + .px-md-0 { + padding-right: 0 !important; + } + + .pb-md-0, + .py-md-0 { + padding-bottom: 0 !important; + } + + .pl-md-0, + .px-md-0 { + padding-left: 0 !important; + } + + .p-md-1 { + padding: 0.25rem !important; + } + + .pt-md-1, + .py-md-1 { + padding-top: 0.25rem !important; + } + + .pr-md-1, + .px-md-1 { + padding-right: 0.25rem !important; + } + + .pb-md-1, + .py-md-1 { + padding-bottom: 0.25rem !important; + } + + .pl-md-1, + .px-md-1 { + padding-left: 0.25rem !important; + } + + .p-md-2 { + padding: 0.5rem !important; + } + + .pt-md-2, + .py-md-2 { + padding-top: 0.5rem !important; + } + + .pr-md-2, + .px-md-2 { + padding-right: 0.5rem !important; + } + + .pb-md-2, + .py-md-2 { + padding-bottom: 0.5rem !important; + } + + .pl-md-2, + .px-md-2 { + padding-left: 0.5rem !important; + } + + .p-md-3 { + padding: 1rem !important; + } + + .pt-md-3, + .py-md-3 { + padding-top: 1rem !important; + } + + .pr-md-3, + .px-md-3 { + padding-right: 1rem !important; + } + + .pb-md-3, + .py-md-3 { + padding-bottom: 1rem !important; + } + + .pl-md-3, + .px-md-3 { + padding-left: 1rem !important; + } + + .p-md-4 { + padding: 1.5rem !important; + } + + .pt-md-4, + .py-md-4 { + padding-top: 1.5rem !important; + } + + .pr-md-4, + .px-md-4 { + padding-right: 1.5rem !important; + } + + .pb-md-4, + .py-md-4 { + padding-bottom: 1.5rem !important; + } + + .pl-md-4, + .px-md-4 { + padding-left: 1.5rem !important; + } + + .p-md-5 { + padding: 3rem !important; + } + + .pt-md-5, + .py-md-5 { + padding-top: 3rem !important; + } + + .pr-md-5, + .px-md-5 { + padding-right: 3rem !important; + } + + .pb-md-5, + .py-md-5 { + padding-bottom: 3rem !important; + } + + .pl-md-5, + .px-md-5 { + padding-left: 3rem !important; + } + + .m-md-auto { + margin: auto !important; + } + + .mt-md-auto, + .my-md-auto { + margin-top: auto !important; + } + + .mr-md-auto, + .mx-md-auto { + margin-right: auto !important; + } + + .mb-md-auto, + .my-md-auto { + margin-bottom: auto !important; + } + + .ml-md-auto, + .mx-md-auto { + margin-left: auto !important; + } +} +@media (min-width: 992px) { + .m-lg-0 { + margin: 0 !important; + } + + .mt-lg-0, + .my-lg-0 { + margin-top: 0 !important; + } + + .mr-lg-0, + .mx-lg-0 { + margin-right: 0 !important; + } + + .mb-lg-0, + .my-lg-0 { + margin-bottom: 0 !important; + } + + .ml-lg-0, + .mx-lg-0 { + margin-left: 0 !important; + } + + .m-lg-1 { + margin: 0.25rem !important; + } + + .mt-lg-1, + .my-lg-1 { + margin-top: 0.25rem !important; + } + + .mr-lg-1, + .mx-lg-1 { + margin-right: 0.25rem !important; + } + + .mb-lg-1, + .my-lg-1 { + margin-bottom: 0.25rem !important; + } + + .ml-lg-1, + .mx-lg-1 { + margin-left: 0.25rem !important; + } + + .m-lg-2 { + margin: 0.5rem !important; + } + + .mt-lg-2, + .my-lg-2 { + margin-top: 0.5rem !important; + } + + .mr-lg-2, + .mx-lg-2 { + margin-right: 0.5rem !important; + } + + .mb-lg-2, + .my-lg-2 { + margin-bottom: 0.5rem !important; + } + + .ml-lg-2, + .mx-lg-2 { + margin-left: 0.5rem !important; + } + + .m-lg-3 { + margin: 1rem !important; + } + + .mt-lg-3, + .my-lg-3 { + margin-top: 1rem !important; + } + + .mr-lg-3, + .mx-lg-3 { + margin-right: 1rem !important; + } + + .mb-lg-3, + .my-lg-3 { + margin-bottom: 1rem !important; + } + + .ml-lg-3, + .mx-lg-3 { + margin-left: 1rem !important; + } + + .m-lg-4 { + margin: 1.5rem !important; + } + + .mt-lg-4, + .my-lg-4 { + margin-top: 1.5rem !important; + } + + .mr-lg-4, + .mx-lg-4 { + margin-right: 1.5rem !important; + } + + .mb-lg-4, + .my-lg-4 { + margin-bottom: 1.5rem !important; + } + + .ml-lg-4, + .mx-lg-4 { + margin-left: 1.5rem !important; + } + + .m-lg-5 { + margin: 3rem !important; + } + + .mt-lg-5, + .my-lg-5 { + margin-top: 3rem !important; + } + + .mr-lg-5, + .mx-lg-5 { + margin-right: 3rem !important; + } + + .mb-lg-5, + .my-lg-5 { + margin-bottom: 3rem !important; + } + + .ml-lg-5, + .mx-lg-5 { + margin-left: 3rem !important; + } + + .p-lg-0 { + padding: 0 !important; + } + + .pt-lg-0, + .py-lg-0 { + padding-top: 0 !important; + } + + .pr-lg-0, + .px-lg-0 { + padding-right: 0 !important; + } + + .pb-lg-0, + .py-lg-0 { + padding-bottom: 0 !important; + } + + .pl-lg-0, + .px-lg-0 { + padding-left: 0 !important; + } + + .p-lg-1 { + padding: 0.25rem !important; + } + + .pt-lg-1, + .py-lg-1 { + padding-top: 0.25rem !important; + } + + .pr-lg-1, + .px-lg-1 { + padding-right: 0.25rem !important; + } + + .pb-lg-1, + .py-lg-1 { + padding-bottom: 0.25rem !important; + } + + .pl-lg-1, + .px-lg-1 { + padding-left: 0.25rem !important; + } + + .p-lg-2 { + padding: 0.5rem !important; + } + + .pt-lg-2, + .py-lg-2 { + padding-top: 0.5rem !important; + } + + .pr-lg-2, + .px-lg-2 { + padding-right: 0.5rem !important; + } + + .pb-lg-2, + .py-lg-2 { + padding-bottom: 0.5rem !important; + } + + .pl-lg-2, + .px-lg-2 { + padding-left: 0.5rem !important; + } + + .p-lg-3 { + padding: 1rem !important; + } + + .pt-lg-3, + .py-lg-3 { + padding-top: 1rem !important; + } + + .pr-lg-3, + .px-lg-3 { + padding-right: 1rem !important; + } + + .pb-lg-3, + .py-lg-3 { + padding-bottom: 1rem !important; + } + + .pl-lg-3, + .px-lg-3 { + padding-left: 1rem !important; + } + + .p-lg-4 { + padding: 1.5rem !important; + } + + .pt-lg-4, + .py-lg-4 { + padding-top: 1.5rem !important; + } + + .pr-lg-4, + .px-lg-4 { + padding-right: 1.5rem !important; + } + + .pb-lg-4, + .py-lg-4 { + padding-bottom: 1.5rem !important; + } + + .pl-lg-4, + .px-lg-4 { + padding-left: 1.5rem !important; + } + + .p-lg-5 { + padding: 3rem !important; + } + + .pt-lg-5, + .py-lg-5 { + padding-top: 3rem !important; + } + + .pr-lg-5, + .px-lg-5 { + padding-right: 3rem !important; + } + + .pb-lg-5, + .py-lg-5 { + padding-bottom: 3rem !important; + } + + .pl-lg-5, + .px-lg-5 { + padding-left: 3rem !important; + } + + .m-lg-auto { + margin: auto !important; + } + + .mt-lg-auto, + .my-lg-auto { + margin-top: auto !important; + } + + .mr-lg-auto, + .mx-lg-auto { + margin-right: auto !important; + } + + .mb-lg-auto, + .my-lg-auto { + margin-bottom: auto !important; + } + + .ml-lg-auto, + .mx-lg-auto { + margin-left: auto !important; + } +} +@media (min-width: 1200px) { + .m-xl-0 { + margin: 0 !important; + } + + .mt-xl-0, + .my-xl-0 { + margin-top: 0 !important; + } + + .mr-xl-0, + .mx-xl-0 { + margin-right: 0 !important; + } + + .mb-xl-0, + .my-xl-0 { + margin-bottom: 0 !important; + } + + .ml-xl-0, + .mx-xl-0 { + margin-left: 0 !important; + } + + .m-xl-1 { + margin: 0.25rem !important; + } + + .mt-xl-1, + .my-xl-1 { + margin-top: 0.25rem !important; + } + + .mr-xl-1, + .mx-xl-1 { + margin-right: 0.25rem !important; + } + + .mb-xl-1, + .my-xl-1 { + margin-bottom: 0.25rem !important; + } + + .ml-xl-1, + .mx-xl-1 { + margin-left: 0.25rem !important; + } + + .m-xl-2 { + margin: 0.5rem !important; + } + + .mt-xl-2, + .my-xl-2 { + margin-top: 0.5rem !important; + } + + .mr-xl-2, + .mx-xl-2 { + margin-right: 0.5rem !important; + } + + .mb-xl-2, + .my-xl-2 { + margin-bottom: 0.5rem !important; + } + + .ml-xl-2, + .mx-xl-2 { + margin-left: 0.5rem !important; + } + + .m-xl-3 { + margin: 1rem !important; + } + + .mt-xl-3, + .my-xl-3 { + margin-top: 1rem !important; + } + + .mr-xl-3, + .mx-xl-3 { + margin-right: 1rem !important; + } + + .mb-xl-3, + .my-xl-3 { + margin-bottom: 1rem !important; + } + + .ml-xl-3, + .mx-xl-3 { + margin-left: 1rem !important; + } + + .m-xl-4 { + margin: 1.5rem !important; + } + + .mt-xl-4, + .my-xl-4 { + margin-top: 1.5rem !important; + } + + .mr-xl-4, + .mx-xl-4 { + margin-right: 1.5rem !important; + } + + .mb-xl-4, + .my-xl-4 { + margin-bottom: 1.5rem !important; + } + + .ml-xl-4, + .mx-xl-4 { + margin-left: 1.5rem !important; + } + + .m-xl-5 { + margin: 3rem !important; + } + + .mt-xl-5, + .my-xl-5 { + margin-top: 3rem !important; + } + + .mr-xl-5, + .mx-xl-5 { + margin-right: 3rem !important; + } + + .mb-xl-5, + .my-xl-5 { + margin-bottom: 3rem !important; + } + + .ml-xl-5, + .mx-xl-5 { + margin-left: 3rem !important; + } + + .p-xl-0 { + padding: 0 !important; + } + + .pt-xl-0, + .py-xl-0 { + padding-top: 0 !important; + } + + .pr-xl-0, + .px-xl-0 { + padding-right: 0 !important; + } + + .pb-xl-0, + .py-xl-0 { + padding-bottom: 0 !important; + } + + .pl-xl-0, + .px-xl-0 { + padding-left: 0 !important; + } + + .p-xl-1 { + padding: 0.25rem !important; + } + + .pt-xl-1, + .py-xl-1 { + padding-top: 0.25rem !important; + } + + .pr-xl-1, + .px-xl-1 { + padding-right: 0.25rem !important; + } + + .pb-xl-1, + .py-xl-1 { + padding-bottom: 0.25rem !important; + } + + .pl-xl-1, + .px-xl-1 { + padding-left: 0.25rem !important; + } + + .p-xl-2 { + padding: 0.5rem !important; + } + + .pt-xl-2, + .py-xl-2 { + padding-top: 0.5rem !important; + } + + .pr-xl-2, + .px-xl-2 { + padding-right: 0.5rem !important; + } + + .pb-xl-2, + .py-xl-2 { + padding-bottom: 0.5rem !important; + } + + .pl-xl-2, + .px-xl-2 { + padding-left: 0.5rem !important; + } + + .p-xl-3 { + padding: 1rem !important; + } + + .pt-xl-3, + .py-xl-3 { + padding-top: 1rem !important; + } + + .pr-xl-3, + .px-xl-3 { + padding-right: 1rem !important; + } + + .pb-xl-3, + .py-xl-3 { + padding-bottom: 1rem !important; + } + + .pl-xl-3, + .px-xl-3 { + padding-left: 1rem !important; + } + + .p-xl-4 { + padding: 1.5rem !important; + } + + .pt-xl-4, + .py-xl-4 { + padding-top: 1.5rem !important; + } + + .pr-xl-4, + .px-xl-4 { + padding-right: 1.5rem !important; + } + + .pb-xl-4, + .py-xl-4 { + padding-bottom: 1.5rem !important; + } + + .pl-xl-4, + .px-xl-4 { + padding-left: 1.5rem !important; + } + + .p-xl-5 { + padding: 3rem !important; + } + + .pt-xl-5, + .py-xl-5 { + padding-top: 3rem !important; + } + + .pr-xl-5, + .px-xl-5 { + padding-right: 3rem !important; + } + + .pb-xl-5, + .py-xl-5 { + padding-bottom: 3rem !important; + } + + .pl-xl-5, + .px-xl-5 { + padding-left: 3rem !important; + } + + .m-xl-auto { + margin: auto !important; + } + + .mt-xl-auto, + .my-xl-auto { + margin-top: auto !important; + } + + .mr-xl-auto, + .mx-xl-auto { + margin-right: auto !important; + } + + .mb-xl-auto, + .my-xl-auto { + margin-bottom: auto !important; + } + + .ml-xl-auto, + .mx-xl-auto { + margin-left: auto !important; + } +} +.text-justify { + text-align: justify !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +@media (min-width: 576px) { + .text-sm-left { + text-align: left !important; + } + + .text-sm-right { + text-align: right !important; + } + + .text-sm-center { + text-align: center !important; + } +} +@media (min-width: 768px) { + .text-md-left { + text-align: left !important; + } + + .text-md-right { + text-align: right !important; + } + + .text-md-center { + text-align: center !important; + } +} +@media (min-width: 992px) { + .text-lg-left { + text-align: left !important; + } + + .text-lg-right { + text-align: right !important; + } + + .text-lg-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .text-xl-left { + text-align: left !important; + } + + .text-xl-right { + text-align: right !important; + } + + .text-xl-center { + text-align: center !important; + } +} +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.font-weight-light { + font-weight: 300 !important; +} + +.font-weight-normal { + font-weight: 400 !important; +} + +.font-weight-bold { + font-weight: 700 !important; +} + +.font-italic { + font-style: italic !important; +} + +.text-white { + color: #fff !important; +} + +.text-primary { + color: #007bff !important; +} + +a.text-primary:hover, a.text-primary:focus { + color: #0062cc !important; +} + +.text-secondary { + color: #6c757d !important; +} + +a.text-secondary:hover, a.text-secondary:focus { + color: #545b62 !important; +} + +.text-success { + color: #28a745 !important; +} + +a.text-success:hover, a.text-success:focus { + color: #1e7e34 !important; +} + +.text-info { + color: #17a2b8 !important; +} + +a.text-info:hover, a.text-info:focus { + color: #117a8b !important; +} + +.text-warning { + color: #ffc107 !important; +} + +a.text-warning:hover, a.text-warning:focus { + color: #d39e00 !important; +} + +.text-danger { + color: #dc3545 !important; +} + +a.text-danger:hover, a.text-danger:focus { + color: #bd2130 !important; +} + +.text-light { + color: #f8f9fa !important; +} + +a.text-light:hover, a.text-light:focus { + color: #dae0e5 !important; +} + +.text-dark { + color: #343a40 !important; +} + +a.text-dark:hover, a.text-dark:focus { + color: #1d2124 !important; +} + +.text-muted { + color: #6c757d !important; +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +@media print { + *, + *::before, + *::after { + text-shadow: none !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + + a:not(.btn) { + text-decoration: underline; + } + + abbr[title]::after { + content: " (" attr(title) ")"; + } + + pre { + white-space: pre-wrap !important; + } + + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + + thead { + display: table-header-group; + } + + tr, + img { + page-break-inside: avoid; + } + + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + + h2, + h3 { + page-break-after: avoid; + } + + @page { + size: a3; + } + body { + min-width: 992px !important; + } + + .container { + min-width: 992px !important; + } + + .navbar { + display: none; + } + + .badge { + border: 1px solid #000; + } + + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +/*Github syntax highlighting theme via Rouge*/ +.highlight table td { + padding: 5px; +} + +.highlight table pre { + margin: 0; +} + +.highlight .cm { + color: #999988; + font-style: italic; +} + +.highlight .cp { + color: #999999; + font-weight: bold; +} + +.highlight .c1 { + color: #999988; + font-style: italic; +} + +.highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; +} + +.highlight .c, .highlight .cd { + color: #999988; + font-style: italic; +} + +.highlight .err { + color: #a61717; + background-color: #e3d2d2; +} + +.highlight .gd { + color: #000000; + background-color: #ffdddd; +} + +.highlight .ge { + color: #000000; + font-style: italic; +} + +.highlight .gr { + color: #aa0000; +} + +.highlight .gh { + color: #999999; +} + +.highlight .gi { + color: #000000; + background-color: #ddffdd; +} + +.highlight .go { + color: #888888; +} + +.highlight .gp { + color: #555555; +} + +.highlight .gs { + font-weight: bold; +} + +.highlight .gu { + color: #aaaaaa; +} + +.highlight .gt { + color: #aa0000; +} + +.highlight .kc { + color: #000000; + font-weight: bold; +} + +.highlight .kd { + color: #000000; + font-weight: bold; +} + +.highlight .kn { + color: #000000; + font-weight: bold; +} + +.highlight .kp { + color: #000000; + font-weight: bold; +} + +.highlight .kr { + color: #000000; + font-weight: bold; +} + +.highlight .kt { + color: #445588; + font-weight: bold; +} + +.highlight .k, .highlight .kv { + color: #000000; + font-weight: bold; +} + +.highlight .mf { + color: #009999; +} + +.highlight .mh { + color: #009999; +} + +.highlight .il { + color: #009999; +} + +.highlight .mi { + color: #009999; +} + +.highlight .mo { + color: #009999; +} + +.highlight .m, .highlight .mb, .highlight .mx { + color: #009999; +} + +.highlight .sb { + color: #d14; +} + +.highlight .sc { + color: #d14; +} + +.highlight .sd { + color: #d14; +} + +.highlight .s2 { + color: #d14; +} + +.highlight .se { + color: #d14; +} + +.highlight .sh { + color: #d14; +} + +.highlight .si { + color: #d14; +} + +.highlight .sx { + color: #d14; +} + +.highlight .sr { + color: #009926; +} + +.highlight .s1 { + color: #d14; +} + +.highlight .ss { + color: #990073; +} + +.highlight .s { + color: #d14; +} + +.highlight .na { + color: #008080; +} + +.highlight .bp { + color: #525252; +} + +.highlight .nb { + color: #0086B3; +} + +.highlight .nc { + color: #445588; + font-weight: bold; +} + +.highlight .no { + color: #008080; +} + +.highlight .nd { + color: #3c5d5d; + font-weight: bold; +} + +.highlight .ni { + color: #800080; +} + +.highlight .ne { + color: #990000; + font-weight: bold; +} + +.highlight .nf { + color: #990000; + font-weight: bold; +} + +.highlight .nl { + color: #990000; + font-weight: bold; +} + +.highlight .nn { + color: #555555; +} + +.highlight .nt { + color: #000080; +} + +.highlight .vc { + color: #008080; +} + +.highlight .vg { + color: #008080; +} + +.highlight .vi { + color: #008080; +} + +.highlight .nv { + color: #008080; +} + +.highlight .ow { + color: #000000; + font-weight: bold; +} + +.highlight .o { + color: #000000; + font-weight: bold; +} + +.highlight .n { + color: #000000; + font-weight: bold; +} + +.highlight .p { + color: #000000; + font-weight: bold; +} + +.highlight .w { + color: #bbbbbb; +} + +.highlight { + background-color: #f8f8f8; +} + +@font-face { + font-family: FreightSans; + font-weight: 700; + font-style: normal; + src: url("../fonts/FreightSans/freight-sans-bold.woff2") format("woff2"), url("../fonts/FreightSans/freight-sans-bold.woff") format("woff"); +} +@font-face { + font-family: FreightSans; + font-weight: 700; + font-style: italic; + src: url("../fonts/FreightSans/freight-sans-bold-italic.woff2") format("woff2"), url("../fonts/FreightSans/freight-sans-bold-italic.woff") format("woff"); +} +@font-face { + font-family: FreightSans; + font-weight: 500; + font-style: normal; + src: url("../fonts/FreightSans/freight-sans-medium.woff2") format("woff2"), url("../fonts/FreightSans/freight-sans-medium.woff") format("woff"); +} +@font-face { + font-family: FreightSans; + font-weight: 500; + font-style: italic; + src: url("../fonts/FreightSans/freight-sans-medium-italic.woff2") format("woff2"), url("../fonts/FreightSans/freight-sans-medium-italic.woff") format("woff"); +} +@font-face { + font-family: FreightSans; + font-weight: 100; + font-style: normal; + src: url("../fonts/FreightSans/freight-sans-light.woff2") format("woff2"), url("../fonts/FreightSans/freight-sans-light.woff") format("woff"); +} +@font-face { + font-family: FreightSans; + font-weight: 100; + font-style: italic; + src: url("../fonts/FreightSans/freight-sans-light-italic.woff2") format("woff2"), url("../fonts/FreightSans/freight-sans-light-italic.woff") format("woff"); +} +@font-face { + font-family: FreightSans; + font-weight: 400; + font-style: italic; + src: url("../fonts/FreightSans/freight-sans-book-italic.woff2") format("woff2"), url("../fonts/FreightSans/freight-sans-book-italic.woff") format("woff"); +} +@font-face { + font-family: FreightSans; + font-weight: 400; + font-style: normal; + src: url("../fonts/FreightSans/freight-sans-book.woff2") format("woff2"), url("../fonts/FreightSans/freight-sans-book.woff") format("woff"); +} +@font-face { + font-family: IBMPlexMono; + font-weight: 600; + font-style: normal; + unicode-range: u+0020-007f; + src: local("IBMPlexMono-SemiBold"), url("../fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff2") format("woff2"), url("../fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff") format("woff"); +} +@font-face { + font-family: IBMPlexMono; + font-weight: 500; + font-style: normal; + unicode-range: u+0020-007f; + src: local("IBMPlexMono-Medium"), url("../fonts/IBMPlexMono/IBMPlexMono-Medium.woff2") format("woff2"), url("../fonts/IBMPlexMono/IBMPlexMono-Medium.woff") format("woff"); +} +@font-face { + font-family: IBMPlexMono; + font-weight: 400; + font-style: normal; + unicode-range: u+0020-007f; + src: local("IBMPlexMono-Regular"), url("../fonts/IBMPlexMono/IBMPlexMono-Regular.woff2") format("woff2"), url("../fonts/IBMPlexMono/IBMPlexMono-Regular.woff") format("woff"); +} +@font-face { + font-family: IBMPlexMono; + font-weight: 300; + font-style: normal; + unicode-range: u+0020-007f; + src: local("IBMPlexMono-Light"), url("../fonts/IBMPlexMono/IBMPlexMono-Light.woff2") format("woff2"), url("../fonts/IBMPlexMono/IBMPlexMono-Light.woff") format("woff"); +} +html { + position: relative; + min-height: 100%; + font-size: 12px; +} +@media screen and (min-width: 768px) { + html { + font-size: 16px; + } +} + +* { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +body { + font-family: FreightSans, Helvetica Neue, Helvetica, Arial, sans-serif; +} + +a:link, +a:visited, +a:hover { + text-decoration: none; + color: #e44c2c; +} + +a.with-right-arrow, .btn.with-right-arrow { + padding-right: 1.375rem; + position: relative; + background-image: url("../images/chevron-right-orange.svg"); + background-size: 6px 13px; + background-position: center right 5px; + background-repeat: no-repeat; +} +@media screen and (min-width: 768px) { + a.with-right-arrow, .btn.with-right-arrow { + background-size: 8px 14px; + background-position: center right 12px; + padding-right: 2rem; + } +} + +::-webkit-input-placeholder { + color: #e44c2c; +} + +::-moz-placeholder { + color: #e44c2c; +} + +:-ms-input-placeholder { + color: #e44c2c; +} + +:-moz-placeholder { + color: #e44c2c; +} + +.email-subscribe-form input.email { + color: #e44c2c; + border: none; + border-bottom: 1px solid #939393; + width: 100%; + background-color: transparent; + outline: none; + font-size: 1.125rem; + letter-spacing: 0.25px; + line-height: 2.25rem; +} +.email-subscribe-form input[type="submit"] { + position: absolute; + right: 0; + top: 10px; + height: 15px; + width: 15px; + background-image: url("../images/arrow-right-with-tail.svg"); + background-color: transparent; + background-repeat: no-repeat; + background-size: 15px 15px; + background-position: center center; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border: 0; +} + +.email-subscribe-form-fields-wrapper { + position: relative; +} + +.anchorjs-link { + color: #6c6c6d !important; +} +@media screen and (min-width: 768px) { + .anchorjs-link:hover { + color: inherit; + text-decoration: none !important; + } +} + +.pytorch-article #table-of-contents { + display: none; +} + +code, kbd, pre, samp { + font-family: IBMPlexMono,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace; +} +code span, kbd span, pre span, samp span { + font-family: IBMPlexMono,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace; +} + +pre { + padding: 1.125rem; +} +pre code { + font-size: 0.875rem; +} +pre.highlight { + background-color: #f3f4f7; + line-height: 1.3125rem; +} + +code.highlighter-rouge { + color: #6c6c6d; + background-color: #f3f4f7; + padding: 2px 6px; +} + +a:link code.highlighter-rouge, +a:visited code.highlighter-rouge, +a:hover code.highlighter-rouge { + color: #4974D1; +} +a:link.has-code, +a:visited.has-code, +a:hover.has-code { + color: #4974D1; +} + +p code, +h1 code, +h2 code, +h3 code, +h4 code, +h5 code, +h6 code { + font-size: 78.5%; +} + +pre { + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; +} + +.header-holder { + height: 68px; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + left: 0; + margin-left: auto; + margin-right: auto; + position: fixed; + right: 0; + top: 0; + width: 100%; + z-index: 9999; + background-color: #ffffff; + border-bottom: 1px solid #e2e2e2; +} +@media screen and (min-width: 1100px) { + .header-holder { + height: 90px; + } +} + +.header-container { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.header-container:before, .header-container:after { + content: ""; + display: table; +} +.header-container:after { + clear: both; +} +.header-container { + *zoom: 1; +} +@media screen and (min-width: 1100px) { + .header-container { + display: block; + } +} + +.header-logo { + height: 23px; + width: 93px; + background-image: url("../images/logo.svg"); + background-repeat: no-repeat; + background-size: 93px 23px; + display: block; + float: left; + z-index: 10; +} +@media screen and (min-width: 1100px) { + .header-logo { + background-size: 108px 27px; + position: absolute; + height: 27px; + width: 108px; + top: 4px; + float: none; + } +} + +.main-menu-open-button { + background-image: url("../images/icon-menu-dots.svg"); + background-position: center center; + background-size: 25px 7px; + background-repeat: no-repeat; + width: 25px; + height: 17px; + position: absolute; + right: 0; + top: 4px; +} +@media screen and (min-width: 1100px) { + .main-menu-open-button { + display: none; + } +} + +.header-holder .main-menu { + display: none; +} +@media screen and (min-width: 1100px) { + .header-holder .main-menu { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + } +} +.header-holder .main-menu ul { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin: 0; +} +.header-holder .main-menu ul li { + display: inline-block; + margin-right: 40px; + position: relative; +} +.header-holder .main-menu ul li.active:after { + content: "•"; + bottom: -24px; + color: #e44c2c; + font-size: 1.375rem; + left: 0; + position: absolute; + right: 0; + text-align: center; +} +.header-holder .main-menu ul li.active a { + color: #e44c2c; +} +.header-holder .main-menu ul li.docs-active:after { + content: "•"; + bottom: -24px; + color: #e44c2c; + font-size: 1.375rem; + left: -24px; + position: absolute; + right: 0; + text-align: center; +} +.header-holder .main-menu ul li:last-of-type { + margin-right: 0; +} +.header-holder .main-menu ul li a { + color: #ffffff; + font-size: 1.3rem; + letter-spacing: 0; + line-height: 2.125rem; + text-align: center; + text-decoration: none; +} +@media screen and (min-width: 1100px) { + .header-holder .main-menu ul li a:hover { + color: #e44c2c; + } +} + +.mobile-main-menu { + display: none; +} +.mobile-main-menu.open { + background-color: #262626; + display: block; + height: 100%; + left: 0; + margin-left: auto; + margin-right: auto; + min-height: 100%; + position: fixed; + right: 0; + top: 0; + width: 100%; + z-index: 99999; +} + +.mobile-main-menu .container-fluid { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + height: 68px; + position: relative; +} +.mobile-main-menu .container-fluid:before, .mobile-main-menu .container-fluid:after { + content: ""; + display: table; +} +.mobile-main-menu .container-fluid:after { + clear: both; +} +.mobile-main-menu .container-fluid { + *zoom: 1; +} + +.mobile-main-menu.open ul { + list-style-type: none; + padding: 0; +} +.mobile-main-menu.open ul li a, .mobile-main-menu.open .resources-mobile-menu-title { + font-size: 2rem; + color: #ffffff; + letter-spacing: 0; + line-height: 4rem; + text-decoration: none; +} +.mobile-main-menu.open ul li.active a { + color: #e44c2c; +} + +.main-menu-close-button { + background-image: url("../images/icon-close.svg"); + background-position: center center; + background-repeat: no-repeat; + background-size: 24px 24px; + height: 24px; + position: absolute; + right: 0; + width: 24px; + top: -4px; +} + +.mobile-main-menu-header-container { + position: relative; +} + +.mobile-main-menu-links-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding-left: 2.8125rem; + height: 90vh; + margin-top: -25px; + padding-top: 50%; + overflow-y: scroll; +} +.mobile-main-menu-links-container .main-menu { + height: 100vh; +} + +.mobile-main-menu-links-container ul.resources-mobile-menu-items li { + padding-left: 15px; +} + +.site-footer { + padding: 2.5rem 0; + width: 100%; + background: #000000; + background-size: 100%; + margin-left: 0; + margin-right: 0; + position: relative; + z-index: 201; +} +@media screen and (min-width: 768px) { + .site-footer { + padding: 5rem 0; + } +} + +.site-footer p { + color: #ffffff; +} +.site-footer ul { + list-style-type: none; + padding-left: 0; + margin-bottom: 0; +} + +.site-footer ul li { + font-size: 1.125rem; + line-height: 2rem; + color: #A0A0A1; + padding-bottom: 0.375rem; +} +.site-footer ul li.list-title { + padding-bottom: 0.75rem; + color: #ffffff; +} +.site-footer a:link, +.site-footer a:visited { + color: inherit; +} +@media screen and (min-width: 768px) { + .site-footer a:hover { + color: #e44c2c; + } +} + +.site-footer .privacy-policy { + background: #000000; + display: flex; + border-bottom: 1px solid white; + padding-bottom: 10px; +} + +.site-footer .privacy-policy-links { + background: #000000; + display: flex; + padding-top: 1rem; + padding-right: 1rem; + display: inline-flex; + color: white; +} + +.site-footer .footer-links-wrapper { + display: flex; + flex-wrap: wrap; + border-bottom: 1px solid white; + padding-bottom: 1rem; +} + +.site-footer .copyright { + padding-top: 1rem; + padding-right: 1rem; + display: inline-flex; + color: white; +} + +.site-footer .copyright p { + color: white; +} + +.site-footer .copyright a { + color: red; +} + +.docs-tutorials-resources { + background-color: #262626; + color: #ffffff; + padding-top: 2.5rem; + padding-bottom: 2.5rem; + position: relative; + z-index: 201; +} +@media screen and (min-width: 768px) { + .docs-tutorials-resources { + padding-top: 5rem; + padding-bottom: 5rem; + } +} +.docs-tutorials-resources p { + color: #929292; + font-size: 1.125rem; +} +.docs-tutorials-resources h2 { + font-size: 1.5rem; + letter-spacing: -0.25px; + text-transform: none; + margin-bottom: 0.25rem; +} +@media screen and (min-width: 768px) { + .docs-tutorials-resources h2 { + margin-bottom: 1.25rem; + } +} +.docs-tutorials-resources .col-md-4 { + margin-bottom: 2rem; + text-align: center; +} +@media screen and (min-width: 768px) { + .docs-tutorials-resources .col-md-4 { + margin-bottom: 0; + } +} +.docs-tutorials-resources .with-right-arrow { + margin-left: 12px; +} +.docs-tutorials-resources .with-right-arrow:hover { + background-image: url("../images/chevron-right-white.svg"); +} +.docs-tutorials-resources p { + font-size: 1rem; + line-height: 1.5rem; + letter-spacing: 0.22px; + color: #939393; + margin-bottom: 0; +} +@media screen and (min-width: 768px) { + .docs-tutorials-resources p { + margin-bottom: 1.25rem; + } +} +.docs-tutorials-resources a { + font-size: 1.125rem; + color: #e44c2c; +} +.docs-tutorials-resources a:hover { + color: #ffffff; +} + +.footer-container { + position: relative; +} + +@media screen and (min-width: 768px) { + .footer-logo-wrapper { + position: absolute; + top: 0; + left: 30px; + } +} + +.footer-logo { + background-image: url("../images/logo-icon.svg"); + background-position: center; + background-repeat: no-repeat; + background-size: 20px 24px; + display: block; + height: 24px; + margin-bottom: 2.8125rem; + width: 20px; +} +@media screen and (min-width: 768px) { + .footer-logo { + background-size: 29px 36px; + height: 36px; + margin-bottom: 0; + margin-bottom: 0; + width: 29px; + } +} + +.footer-links-wrapper { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} +@media screen and (min-width: 768px) { + .footer-links-wrapper { + -ms-flex-wrap: initial; + flex-wrap: initial; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + } +} + +.footer-links-col { + margin-bottom: 3.75rem; + width: 50%; +} +@media screen and (min-width: 768px) { + .footer-links-col { + margin-bottom: 0; + width: 14%; + margin-right: 23px; + } + .footer-links-col.follow-us-col { + width: 18%; + margin-right: 0; + } +} +@media (min-width: 768px) and (max-width: 1239px) { + .footer-links-col { + width: 18%; + margin-right: 30px; + } +} + +.footer-social-icons { + margin: 8.5625rem 0 2.5rem 0; +} +.footer-social-icons a { + height: 32px; + width: 32px; + display: inline-block; + background-color: #CCCDD1; + border-radius: 50%; + margin-right: 5px; +} +.footer-social-icons a.facebook { + background-image: url("../images/logo-facebook-dark.svg"); + background-position: center center; + background-size: 9px 18px; + background-repeat: no-repeat; +} +.footer-social-icons a.twitter { + background-image: url("../images/logo-twitter-dark.svg"); + background-position: center center; + background-size: 17px 17px; + background-repeat: no-repeat; +} +.footer-social-icons a.youtube { + background-image: url("../images/logo-youtube-dark.svg"); + background-position: center center; + background-repeat: no-repeat; +} + +.site-footer .mc-field-group { + margin-top: -2px; +} + +article.pytorch-article { + max-width: 920px; + margin: 0 auto; +} +article.pytorch-article h2, +article.pytorch-article h3, +article.pytorch-article h4, +article.pytorch-article h5, +article.pytorch-article h6 { + margin: 1.375rem 0; + color: #262626; +} +article.pytorch-article h2 { + font-size: 1.625rem; + letter-spacing: 1.33px; + line-height: 2rem; + text-transform: none; +} +article.pytorch-article h3 { + font-size: 1.5rem; + letter-spacing: -0.25px; + line-height: 1.875rem; + text-transform: none; +} +article.pytorch-article h4, +article.pytorch-article h5, +article.pytorch-article h6 { + font-size: 1.125rem; + letter-spacing: -0.19px; + line-height: 1.875rem; +} +article.pytorch-article p { + margin-bottom: 1.125rem; +} +article.pytorch-article p, +article.pytorch-article ul li, +article.pytorch-article ol li, +article.pytorch-article dl dt, +article.pytorch-article dl dd, +article.pytorch-article blockquote { + font-size: 1rem; + line-height: 1.375rem; + color: #262626; + letter-spacing: 0.01px; + font-weight: 500; +} +article.pytorch-article table { + margin-bottom: 2.5rem; + width: 100%; +} +article.pytorch-article table thead { + border-bottom: 1px solid #cacaca; +} +article.pytorch-article table th { + padding: 0.625rem; + color: #262626; +} +article.pytorch-article table td { + padding: 0.3125rem; +} +article.pytorch-article table tr th:first-of-type, +article.pytorch-article table tr td:first-of-type { + padding-left: 0; +} +article.pytorch-article table.docutils.field-list th.field-name { + padding: 0.3125rem; + padding-left: 0; +} +article.pytorch-article table.docutils.field-list td.field-body { + padding: 0.3125rem; +} +article.pytorch-article table.docutils.field-list td.field-body p:last-of-type { + margin-bottom: 0; +} +article.pytorch-article ul, +article.pytorch-article ol { + margin: 1.5rem 0 3.125rem 0; +} +@media screen and (min-width: 768px) { + article.pytorch-article ul, + article.pytorch-article ol { + padding-left: 6.25rem; + } +} +article.pytorch-article ul li, +article.pytorch-article ol li { + margin-bottom: 0.625rem; +} +article.pytorch-article dl { + margin-bottom: 1.5rem; +} +article.pytorch-article dl dt { + margin-bottom: 0.75rem; +} +article.pytorch-article pre { + margin-bottom: 2.5rem; +} +article.pytorch-article hr { + margin-top: 4.6875rem; + margin-bottom: 4.6875rem; +} +article.pytorch-article blockquote { + margin: 0 auto; + margin-bottom: 2.5rem; + width: 65%; +} +article.pytorch-article img { + width: 100%; +} + +html { + height: 100%; +} +@media screen and (min-width: 768px) { + html { + font-size: 16px; + } +} + +body { + background: #ffffff; + height: 100%; + margin: 0; +} +body.no-scroll { + height: 100%; + overflow: hidden; +} + +p { + margin-top: 0; + margin-bottom: 1.125rem; +} +p a:link, +p a:visited, +p a:hover { + color: #e44c2c; + text-decoration: none; +} +@media screen and (min-width: 768px) { + p a:hover { + text-decoration: underline; + } +} +p a:link, +p a:visited, +p a:hover { + color: #ee4c2c; +} + +.wy-breadcrumbs li a { + color: #ee4c2c; +} + +ul.pytorch-breadcrumbs { + padding-left: 0; + list-style-type: none; +} +ul.pytorch-breadcrumbs li { + display: inline-block; + font-size: 0.875rem; +} +ul.pytorch-breadcrumbs a { + color: #ee4c2c; + text-decoration: none; +} + +.table-of-contents-link-wrapper { + display: block; + margin-top: 0; + padding: 1.25rem 1.875rem; + background-color: #f3f4f7; + position: relative; + color: #262626; + font-size: 1.25rem; +} +.table-of-contents-link-wrapper.is-open .toggle-table-of-contents { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); +} +@media screen and (min-width: 1100px) { + .table-of-contents-link-wrapper { + display: none; + } +} + +.toggle-table-of-contents { + background-image: url("../images/chevron-down-grey.svg"); + background-position: center center; + background-repeat: no-repeat; + background-size: 18px 18px; + height: 100%; + position: absolute; + right: 21px; + width: 30px; + top: 0; +} + +.tutorials-header .header-logo { + background-image: url("../images/logo-dark.svg"); +} +.tutorials-header .main-menu ul li a { + color: #262626; +} +.tutorials-header .main-menu-open-button { + background-image: url("../images/icon-menu-dots-dark.svg"); +} + +.rst-content footer .rating-hr.hr-top { + margin-bottom: -0.0625rem; +} +.rst-content footer .rating-hr.hr-bottom { + margin-top: -0.0625rem; +} +.rst-content footer .rating-container { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + font-size: 1.125rem; +} +.rst-content footer .rating-container .rating-prompt, .rst-content footer .rating-container .was-helpful-thank-you { + padding: 0.625rem 1.25rem 0.625rem 1.25rem; +} +.rst-content footer .rating-container .was-helpful-thank-you { + display: none; +} +.rst-content footer .rating-container .rating-prompt.yes-link, .rst-content footer .rating-container .rating-prompt.no-link { + color: #e44c2c; + cursor: pointer; +} +.rst-content footer .rating-container .rating-prompt.yes-link:hover, .rst-content footer .rating-container .rating-prompt.no-link:hover { + background-color: #e44c2c; + color: #ffffff; +} +.rst-content footer .rating-container .stars-outer { + display: inline-block; + position: relative; + font-family: FontAwesome; + padding: 0.625rem 1.25rem 0.625rem 1.25rem; +} +.rst-content footer .rating-container .stars-outer i { + cursor: pointer; +} +.rst-content footer .rating-container .stars-outer .star-fill { + color: #ee4c2c; +} +.rst-content footer div[role="contentinfo"] { + padding-top: 2.5rem; +} +.rst-content footer div[role="contentinfo"] p { + margin-bottom: 0; +} + +h1 { + font-size: 2rem; + letter-spacing: 1.78px; + line-height: 2.5rem; + text-transform: uppercase; + margin: 1.375rem 0; +} + +span.pre { + color: #6c6c6d; + background-color: #f3f4f7; + padding: 2px 0px; +} + +pre { + padding: 1.375rem; +} + +.highlight .c1 { + color: #6c6c6d; +} + +.headerlink { + display: none !important; +} + +a:link.has-code, +a:hover.has-code, +a:visited.has-code { + color: #4974D1; +} +a:link.has-code span, +a:hover.has-code span, +a:visited.has-code span { + color: #4974D1; +} + +article.pytorch-article ul, +article.pytorch-article ol { + padding-left: 1.875rem; + margin: 0; +} +article.pytorch-article ul li, +article.pytorch-article ol li { + margin: 0; + line-height: 1.75rem; +} +article.pytorch-article ul p, +article.pytorch-article ol p { + line-height: 1.75rem; + margin-bottom: 0; +} +article.pytorch-article ul ul, +article.pytorch-article ul ol, +article.pytorch-article ol ul, +article.pytorch-article ol ol { + margin: 0; +} +article.pytorch-article h1, +article.pytorch-article h2, +article.pytorch-article h3, +article.pytorch-article h4, +article.pytorch-article h5, +article.pytorch-article h6 { + font-weight: normal; +} +article.pytorch-article h1 a, +article.pytorch-article h2 a, +article.pytorch-article h3 a, +article.pytorch-article h4 a, +article.pytorch-article h5 a, +article.pytorch-article h6 a { + color: #262626; +} +article.pytorch-article p.caption { + margin-top: 1.25rem; +} + +article.pytorch-article .section:first-of-type h1:first-of-type { + margin-top: 0; +} + +article.pytorch-article .sphx-glr-thumbcontainer { + margin: 0; + border: 1px solid #d6d7d8; + border-radius: 0; + width: 45%; + text-align: center; + margin-bottom: 5%; +} +@media screen and (max-width: 1100px) { + article.pytorch-article .sphx-glr-thumbcontainer:nth-child(odd) { + margin-left: 0; + margin-right: 2.5%; + } + article.pytorch-article .sphx-glr-thumbcontainer:nth-child(even) { + margin-right: 0; + margin-left: 2.5%; + } + article.pytorch-article .sphx-glr-thumbcontainer .figure { + width: 40%; + } +} +@media screen and (min-width: 1101px) { + article.pytorch-article .sphx-glr-thumbcontainer { + margin-right: 3%; + margin-bottom: 3%; + width: 30%; + } +} +article.pytorch-article .sphx-glr-thumbcontainer .caption-text a { + font-size: 1rem; + color: #262626; + letter-spacing: 0; + line-height: 1.5rem; + text-decoration: none; +} +article.pytorch-article .sphx-glr-thumbcontainer:hover { + -webkit-box-shadow: none; + box-shadow: none; + border-bottom-color: #ffffff; +} +article.pytorch-article .sphx-glr-thumbcontainer:hover .figure:before { + bottom: 100%; +} +article.pytorch-article .sphx-glr-thumbcontainer .figure { + width: 80%; +} +article.pytorch-article .sphx-glr-thumbcontainer .figure:before { + content: ""; + display: block; + position: absolute; + top: 0; + bottom: 35%; + left: 0; + right: 0; + background: #8A94B3; + opacity: 0.10; +} +article.pytorch-article .sphx-glr-thumbcontainer .figure a.reference.internal { + text-align: left; +} +@media screen and (min-width: 768px) { + article.pytorch-article .sphx-glr-thumbcontainer:after { + content: ""; + display: block; + width: 0; + height: 1px; + position: absolute; + bottom: 0; + left: 0; + background-color: #e44c2c; + -webkit-transition: width .250s ease-in-out; + transition: width .250s ease-in-out; + } + article.pytorch-article .sphx-glr-thumbcontainer:hover:after { + width: 100%; + } +} +@media screen and (min-width: 768px) { + article.pytorch-article .sphx-glr-thumbcontainer:after { + background-color: #ee4c2c; + } +} + +article.pytorch-article .section :not(dt) > code { + color: #262626; + border-top: solid 2px #ffffff; + background-color: #ffffff; + border-bottom: solid 2px #ffffff; + padding: 0px 3px; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; +} +article.pytorch-article .section :not(dt) > code .pre { + outline: 0px; + padding: 0px; +} +article.pytorch-article .function dt, article.pytorch-article .attribute dt, article.pytorch-article .class .attribute dt, article.pytorch-article .class dt { + position: relative; + background: #f3f4f7; + padding: 0.5rem; + border-left: 3px solid #ee4c2c; + word-wrap: break-word; + padding-right: 100px; +} +article.pytorch-article .function dt em.property, article.pytorch-article .attribute dt em.property, article.pytorch-article .class dt em.property { + font-family: inherit; +} +article.pytorch-article .function dt em, article.pytorch-article .attribute dt em, article.pytorch-article .class .attribute dt em, article.pytorch-article .class dt em, article.pytorch-article .function dt .sig-paren, article.pytorch-article .attribute dt .sig-paren, article.pytorch-article .class dt .sig-paren { + font-family: IBMPlexMono,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace; + font-size: 87.5%; +} +article.pytorch-article .function dt a, article.pytorch-article .attribute dt a, article.pytorch-article .class .attribute dt a, article.pytorch-article .class dt a { + right: 30px; + padding-right: 0; + top: 50%; + -webkit-transform: perspective(1px) translateY(-50%); + transform: perspective(1px) translateY(-50%); +} +article.pytorch-article .function dt:hover .viewcode-link, article.pytorch-article .attribute dt:hover .viewcode-link, article.pytorch-article .class dt:hover .viewcode-link { + color: #ee4c2c; +} +article.pytorch-article .function .anchorjs-link, article.pytorch-article .attribute .anchorjs-link, article.pytorch-article .class .anchorjs-link { + display: inline; + position: absolute; + right: 8px; + font-size: 1.5625rem !important; + padding-left: 0; +} +article.pytorch-article .function dt > code, article.pytorch-article .attribute dt > code, article.pytorch-article .class .attribute dt > code, article.pytorch-article .class dt > code { + color: #262626; + border-top: solid 2px #f3f4f7; + background-color: #f3f4f7; + border-bottom: solid 2px #f3f4f7; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; +} +article.pytorch-article .function .viewcode-link, article.pytorch-article .attribute .viewcode-link, article.pytorch-article .class .viewcode-link { + padding-left: 0.6rem; + position: absolute; + font-size: 0.875rem; + color: #979797; + letter-spacing: 0; + line-height: 1.5rem; + text-transform: uppercase; +} +article.pytorch-article .function dd, article.pytorch-article .attribute dd, article.pytorch-article .class .attribute dd, article.pytorch-article .class dd { + padding-left: 3.75rem; +} +article.pytorch-article .function dd p, article.pytorch-article .attribute dd p, article.pytorch-article .class .attribute dd p, article.pytorch-article .class dd p { + color: #262626; +} +article.pytorch-article .function table tbody tr th.field-name, article.pytorch-article .attribute table tbody tr th.field-name, article.pytorch-article .class table tbody tr th.field-name { + white-space: nowrap; + color: #262626; + width: 20%; +} +@media screen and (min-width: 768px) { + article.pytorch-article .function table tbody tr th.field-name, article.pytorch-article .attribute table tbody tr th.field-name, article.pytorch-article .class table tbody tr th.field-name { + width: 15%; + } +} +article.pytorch-article .function table tbody tr td.field-body, article.pytorch-article .attribute table tbody tr td.field-body, article.pytorch-article .class table tbody tr td.field-body { + padding: 0.625rem; + width: 80%; + color: #262626; +} +@media screen and (min-width: 768px) { + article.pytorch-article .function table tbody tr td.field-body, article.pytorch-article .attribute table tbody tr td.field-body, article.pytorch-article .class table tbody tr td.field-body { + width: 85%; + } +} +@media screen and (min-width: 1600px) { + article.pytorch-article .function table tbody tr td.field-body, article.pytorch-article .attribute table tbody tr td.field-body, article.pytorch-article .class table tbody tr td.field-body { + padding-left: 1.25rem; + } +} +article.pytorch-article .function table tbody tr td.field-body p, article.pytorch-article .attribute table tbody tr td.field-body p, article.pytorch-article .class table tbody tr td.field-body p { + padding-left: 0px; +} +article.pytorch-article .function table tbody tr td.field-body p:last-of-type, article.pytorch-article .attribute table tbody tr td.field-body p:last-of-type, article.pytorch-article .class table tbody tr td.field-body p:last-of-type { + margin-bottom: 0; +} +article.pytorch-article .function table tbody tr td.field-body ol, article.pytorch-article .attribute table tbody tr td.field-body ol, article.pytorch-article .class table tbody tr td.field-body ol, article.pytorch-article .function table tbody tr td.field-body ul, article.pytorch-article .attribute table tbody tr td.field-body ul, article.pytorch-article .class table tbody tr td.field-body ul { + padding-left: 1rem; + padding-bottom: 0; +} +article.pytorch-article .function table.docutils.field-list, article.pytorch-article .attribute table.docutils.field-list, article.pytorch-article .class table.docutils.field-list { + margin-bottom: 0.75rem; +} +article.pytorch-article .attribute .has-code { + float: none; +} +article.pytorch-article .class dt { + border-left: none; + border-top: 3px solid #ee4c2c; + padding-left: 4em; +} +article.pytorch-article .class dt em.property { + position: absolute; + left: 0.5rem; +} +article.pytorch-article .class dd .docutils dt { + padding-left: 0.5rem; +} +article.pytorch-article .class em.property { + text-transform: uppercase; + font-style: normal; + color: #ee4c2c; + font-size: 1rem; + letter-spacing: 0; + padding-right: 0.75rem; +} +article.pytorch-article .class dl dt em.property { + position: static; + left: 0; + padding-right: 0; +} +article.pytorch-article .class .method dt, +article.pytorch-article .class .staticmethod dt { + border-left: 3px solid #ee4c2c; + border-top: none; +} +article.pytorch-article .class .method dt, +article.pytorch-article .class .staticmethod dt { + padding-left: 0.5rem; +} +article.pytorch-article .class .attribute dt { + border-top: none; +} +article.pytorch-article .class .attribute dt em.property { + position: relative; + left: 0; +} +article.pytorch-article table { + table-layout: fixed; +} + +div.deprecated p { + display: inline; +} +div.deprecated, +div.versionchanged { + margin-top: 0.5rem; + padding: 0.5rem; + margin-bottom: 0.5rem; + border: none; +} +div.versionadded { + margin: 1rem 0; +} +div.deprecated p:last-child, +div.versionchanged p:last-child, +div.versionadded p:last-child { + margin-bottom: 0 +} +div.deprecated { + color: #b94a48; + background-color: #fdede9; +} +div.versionchanged { + background-color: #fffbe8; +} + +article.pytorch-article .note, +article.pytorch-article .warning, +article.pytorch-article .tip, +article.pytorch-article .seealso, +article.pytorch-article .hint, +article.pytorch-article .important, +article.pytorch-article .caution, +article.pytorch-article .danger, +article.pytorch-article .attention, +article.pytorch-article .error { + background: #f3f4f7; + margin-top: 1.875rem; + margin-bottom: 1.125rem; +} +article.pytorch-article .note .admonition-title, +article.pytorch-article .warning .admonition-title, +article.pytorch-article .tip .admonition-title, +article.pytorch-article .seealso .admonition-title, +article.pytorch-article .hint .admonition-title, +article.pytorch-article .important .admonition-title, +article.pytorch-article .caution .admonition-title, +article.pytorch-article .danger .admonition-title, +article.pytorch-article .attention .admonition-title, +article.pytorch-article .error .admonition-title { + color: #ffffff; + letter-spacing: 1px; + text-transform: uppercase; + margin-bottom: 1.125rem; + padding: 3px 0 3px 1.375rem; + position: relative; + font-size: 0.875rem; +} +article.pytorch-article .note .admonition-title:before, +article.pytorch-article .warning .admonition-title:before, +article.pytorch-article .tip .admonition-title:before, +article.pytorch-article .seealso .admonition-title:before, +article.pytorch-article .hint .admonition-title:before, +article.pytorch-article .important .admonition-title:before, +article.pytorch-article .caution .admonition-title:before, +article.pytorch-article .danger .admonition-title:before, +article.pytorch-article .attention .admonition-title:before, +article.pytorch-article .error .admonition-title:before { + content: "\2022"; + position: absolute; + left: 9px; + color: #ffffff; + top: 2px; +} +article.pytorch-article .note p:nth-child(n + 2), +article.pytorch-article .warning p:nth-child(n + 2), +article.pytorch-article .tip p:nth-child(n + 2), +article.pytorch-article .seealso p:nth-child(n + 2), +article.pytorch-article .hint p:nth-child(n + 2), +article.pytorch-article .important p:nth-child(n + 2), +article.pytorch-article .caution p:nth-child(n + 2), +article.pytorch-article .danger p:nth-child(n + 2), +article.pytorch-article .attention p:nth-child(n + 2), +article.pytorch-article .error p:nth-child(n + 2) { + padding: 0 1.375rem; +} +article.pytorch-article .note table, +article.pytorch-article .warning table, +article.pytorch-article .tip table, +article.pytorch-article .seealso table, +article.pytorch-article .hint table, +article.pytorch-article .important table, +article.pytorch-article .caution table, +article.pytorch-article .danger table, +article.pytorch-article .attention table, +article.pytorch-article .error table { + margin: 0 2rem; + width: auto; +} +article.pytorch-article .note :not(dt) > code, +article.pytorch-article .warning :not(dt) > code, +article.pytorch-article .tip :not(dt) > code, +article.pytorch-article .seealso :not(dt) > code, +article.pytorch-article .hint :not(dt) > code, +article.pytorch-article .important :not(dt) > code, +article.pytorch-article .caution :not(dt) > code, +article.pytorch-article .danger :not(dt) > code, +article.pytorch-article .attention :not(dt) > code, +article.pytorch-article .error :not(dt) > code { + border-top: solid 2px #ffffff; + background-color: #ffffff; + border-bottom: solid 2px #ffffff; + padding: 0px 3px; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; + outline: 1px solid #e9e9e9; +} +article.pytorch-article .note :not(dt) > code .pre, +article.pytorch-article .warning :not(dt) > code .pre, +article.pytorch-article .tip :not(dt) > code .pre, +article.pytorch-article .seealso :not(dt) > code .pre, +article.pytorch-article .hint :not(dt) > code .pre, +article.pytorch-article .important :not(dt) > code .pre, +article.pytorch-article .caution :not(dt) > code .pre, +article.pytorch-article .danger :not(dt) > code .pre, +article.pytorch-article .attention :not(dt) > code .pre, +article.pytorch-article .error :not(dt) > code .pre { + outline: 0px; + padding: 0px; +} +article.pytorch-article .note pre, +article.pytorch-article .warning pre, +article.pytorch-article .tip pre, +article.pytorch-article .seealso pre, +article.pytorch-article .hint pre, +article.pytorch-article .important pre, +article.pytorch-article .caution pre, +article.pytorch-article .danger pre, +article.pytorch-article .attention pre, +article.pytorch-article .error pre { + margin-bottom: 0; +} +article.pytorch-article .note .highlight, +article.pytorch-article .warning .highlight, +article.pytorch-article .tip .highlight, +article.pytorch-article .seealso .highlight, +article.pytorch-article .hint .highlight, +article.pytorch-article .important .highlight, +article.pytorch-article .caution .highlight, +article.pytorch-article .danger .highlight, +article.pytorch-article .attention .highlight, +article.pytorch-article .error .highlight { + margin: 0 2rem 1.125rem 2rem; +} +article.pytorch-article .note ul, +article.pytorch-article .note ol, +article.pytorch-article .warning ul, +article.pytorch-article .warning ol, +article.pytorch-article .tip ul, +article.pytorch-article .tip ol, +article.pytorch-article .seealso ul, +article.pytorch-article .seealso ol, +article.pytorch-article .hint ul, +article.pytorch-article .hint ol, +article.pytorch-article .important ul, +article.pytorch-article .important ol, +article.pytorch-article .caution ul, +article.pytorch-article .caution ol, +article.pytorch-article .danger ul, +article.pytorch-article .danger ol, +article.pytorch-article .attention ul, +article.pytorch-article .attention ol, +article.pytorch-article .error ul, +article.pytorch-article .error ol { + padding-left: 3.25rem; +} +article.pytorch-article .note ul li, +article.pytorch-article .note ol li, +article.pytorch-article .warning ul li, +article.pytorch-article .warning ol li, +article.pytorch-article .tip ul li, +article.pytorch-article .tip ol li, +article.pytorch-article .seealso ul li, +article.pytorch-article .seealso ol li, +article.pytorch-article .hint ul li, +article.pytorch-article .hint ol li, +article.pytorch-article .important ul li, +article.pytorch-article .important ol li, +article.pytorch-article .caution ul li, +article.pytorch-article .caution ol li, +article.pytorch-article .danger ul li, +article.pytorch-article .danger ol li, +article.pytorch-article .attention ul li, +article.pytorch-article .attention ol li, +article.pytorch-article .error ul li, +article.pytorch-article .error ol li { + color: #262626; +} +article.pytorch-article .note p, +article.pytorch-article .warning p, +article.pytorch-article .tip p, +article.pytorch-article .seealso p, +article.pytorch-article .hint p, +article.pytorch-article .important p, +article.pytorch-article .caution p, +article.pytorch-article .danger p, +article.pytorch-article .attention p, +article.pytorch-article .error p { + margin-top: 1.125rem; +} +article.pytorch-article .note .admonition-title { + background: #54c7ec; +} +article.pytorch-article .warning .admonition-title { + background: #e94f3b; +} +article.pytorch-article .tip .admonition-title { + background: #6bcebb; +} +article.pytorch-article .seealso .admonition-title { + background: #6bcebb; +} +article.pytorch-article .hint .admonition-title { + background: #a2cdde; +} +article.pytorch-article .important .admonition-title { + background: #5890ff; +} +article.pytorch-article .caution .admonition-title { + background: #f7923a; +} +article.pytorch-article .danger .admonition-title { + background: #db2c49; +} +article.pytorch-article .attention .admonition-title { + background: #f5a623; +} +article.pytorch-article .error .admonition-title { + background: #cc2f90; +} +article.pytorch-article .sphx-glr-download-link-note.admonition.note, +article.pytorch-article .reference.download.internal, article.pytorch-article .sphx-glr-signature { + display: none; +} +article.pytorch-article .admonition > p:last-of-type { + margin-bottom: 0; + padding-bottom: 1.125rem !important; +} + +.pytorch-article div.sphx-glr-download a { + background-color: #f3f4f7; + background-image: url("../images/arrow-down-orange.svg"); + background-repeat: no-repeat; + background-position: left 10px center; + background-size: 15px 15px; + border-radius: 0; + border: none; + display: block; + text-align: left; + padding: 0.9375rem 3.125rem; + position: relative; + margin: 1.25rem auto; +} +@media screen and (min-width: 768px) { + .pytorch-article div.sphx-glr-download a:after { + content: ""; + display: block; + width: 0; + height: 1px; + position: absolute; + bottom: 0; + left: 0; + background-color: #e44c2c; + -webkit-transition: width .250s ease-in-out; + transition: width .250s ease-in-out; + } + .pytorch-article div.sphx-glr-download a:hover:after { + width: 100%; + } +} +@media screen and (min-width: 768px) { + .pytorch-article div.sphx-glr-download a:after { + background-color: #ee4c2c; + } +} +@media screen and (min-width: 768px) { + .pytorch-article div.sphx-glr-download a { + background-position: left 20px center; + } +} +.pytorch-article div.sphx-glr-download a:hover { + -webkit-box-shadow: none; + box-shadow: none; + text-decoration: none; + background-image: url("../images/arrow-down-orange.svg"); + background-color: #f3f4f7; +} +.pytorch-article div.sphx-glr-download a span.pre { + background-color: transparent; + font-size: 1.125rem; + padding: 0; + color: #262626; +} +.pytorch-article div.sphx-glr-download a code, .pytorch-article div.sphx-glr-download a kbd, .pytorch-article div.sphx-glr-download a pre, .pytorch-article div.sphx-glr-download a samp, .pytorch-article div.sphx-glr-download a span.pre { + font-family: FreightSans, Helvetica Neue, Helvetica, Arial, sans-serif; +} + +.pytorch-article p.sphx-glr-script-out { + margin-bottom: 1.125rem; +} + +.pytorch-article div.sphx-glr-script-out { + margin-bottom: 2.5rem; +} +.pytorch-article div.sphx-glr-script-out .highlight { + margin-left: 0; + margin-top: 0; +} +.pytorch-article div.sphx-glr-script-out .highlight pre { + background-color: #fdede9; + padding: 1.5625rem; + color: #837b79; +} +.pytorch-article div.sphx-glr-script-out + p { + margin-top: unset; +} + +article.pytorch-article .wy-table-responsive table { + border: none; + border-color: #ffffff !important; + table-layout: fixed; +} +article.pytorch-article .wy-table-responsive table thead tr { + border-bottom: 2px solid #6c6c6d; +} +article.pytorch-article .wy-table-responsive table thead th { + line-height: 1.75rem; + padding-left: 0.9375rem; + padding-right: 0.9375rem; +} +article.pytorch-article .wy-table-responsive table tbody .row-odd { + background-color: #f3f4f7; +} +article.pytorch-article .wy-table-responsive table tbody td { + color: #6c6c6d; + white-space: normal; + padding: 0.9375rem; + font-size: 1rem; + line-height: 1.375rem; +} +article.pytorch-article .wy-table-responsive table tbody td .pre { + background: #ffffff; + color: #ee4c2c; + font-size: 87.5%; +} +article.pytorch-article .wy-table-responsive table tbody td code { + font-size: 87.5%; +} + +a[rel~="prev"], a[rel~="next"] { + padding: 0.375rem 0 0 0; +} + +img.next-page, +img.previous-page { + width: 8px; + height: 10px; + position: relative; + top: -1px; +} + +img.previous-page { + -webkit-transform: scaleX(-1); + transform: scaleX(-1); +} + +.rst-footer-buttons { + margin-top: 1.875rem; + margin-bottom: 1.875rem; +} +.rst-footer-buttons .btn:focus, +.rst-footer-buttons .btn.focus { + -webkit-box-shadow: none; + box-shadow: none; +} + +article.pytorch-article blockquote { + margin-left: 3.75rem; + color: #6c6c6d; +} + +article.pytorch-article .caption { + color: #6c6c6d; + letter-spacing: 0.25px; + line-height: 2.125rem; +} + +article.pytorch-article .math { + color: #262626; + width: auto; + text-align: center; +} +article.pytorch-article .math img { + width: auto; +} + +.pytorch-breadcrumbs-wrapper { + width: 100%; +} +@media screen and (min-width: 1101px) { + .pytorch-breadcrumbs-wrapper { + float: left; + margin-left: 3%; + width: 75%; + } +} +@media screen and (min-width: 1600px) { + .pytorch-breadcrumbs-wrapper { + width: 850px; + margin-left: 1.875rem; + } +} +.pytorch-breadcrumbs-wrapper .pytorch-breadcrumbs-aside { + float: right; +} +.pytorch-breadcrumbs-wrapper .pytorch-breadcrumbs-aside .fa.fa-github { + margin-top: 5px; + display: block; +} + +.pytorch-article .container { + padding-left: 0; + padding-right: 0; + max-width: none; +} + +a:link, +a:visited, +a:hover { + color: #ee4c2c; +} + +::-webkit-input-placeholder { + color: #ee4c2c; +} + +::-moz-placeholder { + color: #ee4c2c; +} + +:-ms-input-placeholder { + color: #ee4c2c; +} + +:-moz-placeholder { + color: #ee4c2c; +} + +@media screen and (min-width: 768px) { + .site-footer a:hover { + color: #ee4c2c; + } +} + +.docs-tutorials-resources a { + color: #ee4c2c; +} + +.header-holder { + position: relative; + z-index: 201; +} + +.header-holder .main-menu ul li.active:after { + color: #ee4c2c; +} +.header-holder .main-menu ul li.active a { + color: #ee4c2c; +} +@media screen and (min-width: 1100px) { + .header-holder .main-menu ul li a:hover { + color: #ee4c2c; + } +} + +.mobile-main-menu.open ul li.active a { + color: #ee4c2c; +} + +.version { + padding-bottom: 1rem; +} + +.pytorch-call-to-action-links { + padding-top: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +@media screen and (min-width: 768px) { + .pytorch-call-to-action-links { + padding-top: 2.5rem; + } +} +@media (min-width: 768px) and (max-width: 1239px) { + .pytorch-call-to-action-links { + padding-top: 0; + } +} +@media (min-width: 1100px) and (max-width: 1239px) { + .pytorch-call-to-action-links { + padding-top: 2.5rem; + } +} +.pytorch-call-to-action-links #tutorial-type { + display: none; +} +.pytorch-call-to-action-links .call-to-action-img, .pytorch-call-to-action-links .call-to-action-notebook-img { + height: 1.375rem; + width: 1.375rem; + margin-right: 10px; +} +.pytorch-call-to-action-links .call-to-action-notebook-img { + height: 1rem; +} +.pytorch-call-to-action-links a { + padding-right: 1.25rem; + color: #000000; + cursor: pointer; +} +.pytorch-call-to-action-links a:hover { + color: #e44c2c; +} +.pytorch-call-to-action-links a .call-to-action-desktop-view { + display: none; +} +@media screen and (min-width: 768px) { + .pytorch-call-to-action-links a .call-to-action-desktop-view { + display: block; + } +} +.pytorch-call-to-action-links a .call-to-action-mobile-view { + display: block; +} +@media screen and (min-width: 768px) { + .pytorch-call-to-action-links a .call-to-action-mobile-view { + display: none; + } +} +.pytorch-call-to-action-links a #google-colab-link, .pytorch-call-to-action-links a #download-notebook-link, +.pytorch-call-to-action-links a #github-view-link { + padding-bottom: 0.625rem; + border-bottom: 1px solid #f3f4f7; + padding-right: 2.5rem; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.pytorch-call-to-action-links a #google-colab-link:hover, .pytorch-call-to-action-links a #download-notebook-link:hover, +.pytorch-call-to-action-links a #github-view-link:hover { + border-bottom-color: #e44c2c; + color: #e44c2c; +} + +#tutorial-cards-container #tutorial-cards { + width: 100%; +} +#tutorial-cards-container .tutorials-nav { + padding-left: 0; + padding-right: 0; + padding-bottom: 0; +} +#tutorial-cards-container .tutorials-hr { + margin-top: 1rem; + margin-bottom: 1rem; +} +#tutorial-cards-container .card.tutorials-card { + border-radius: 0; + border-color: #f3f4f7; + height: 98px; + margin-bottom: 1.25rem; + margin-bottom: 1.875rem; + overflow: scroll; + background-color: #f3f4f7; + cursor: pointer; +} +@media screen and (min-width: 1240px) { + #tutorial-cards-container .card.tutorials-card { + height: 200px; + overflow: inherit; + } +} +@media (min-width: 768px) and (max-width: 1239px) { + #tutorial-cards-container .card.tutorials-card { + height: 200px; + overflow: scroll; + } +} +#tutorial-cards-container .card.tutorials-card .tutorials-image { + position: absolute; + top: 0px; + right: 0px; + height: 96px; + width: 96px; + opacity: 0.5; +} +#tutorial-cards-container .card.tutorials-card .tutorials-image img { + height: 100%; + width: 100%; +} +@media screen and (min-width: 768px) { + #tutorial-cards-container .card.tutorials-card .tutorials-image { + height: 100%; + width: 25%; + } +} +@media (min-width: 768px) and (max-width: 1239px) { + #tutorial-cards-container .card.tutorials-card .tutorials-image { + height: 100%; + width: 198px; + } +} +#tutorial-cards-container .card.tutorials-card .tutorials-image:before { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + z-index: 1; + background: #000000; + opacity: .075; +} +#tutorial-cards-container .card.tutorials-card .card-title-container { + width: 70%; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; +} +@media screen and (min-width: 768px) { + #tutorial-cards-container .card.tutorials-card .card-title-container { + width: 75%; + } +} +@media (min-width: 768px) and (max-width: 1239px) { + #tutorial-cards-container .card.tutorials-card .card-title-container { + width: 70%; + } +} +#tutorial-cards-container .card.tutorials-card .card-title-container h4 { + margin-bottom: 1.125rem; + margin-top: 0; + font-size: 1.5rem; +} +#tutorial-cards-container .card.tutorials-card p.card-summary, #tutorial-cards-container .card.tutorials-card p.tags { + font-size: 0.9375rem; + line-height: 1.5rem; + margin-bottom: 0; + color: #6c6c6d; + font-weight: 400; + width: 70%; +} +@media screen and (min-width: 768px) { + #tutorial-cards-container .card.tutorials-card p.card-summary, #tutorial-cards-container .card.tutorials-card p.tags { + width: 75%; + } +} +@media (min-width: 768px) and (max-width: 1239px) { + #tutorial-cards-container .card.tutorials-card p.card-summary, #tutorial-cards-container .card.tutorials-card p.tags { + width: 70%; + } +} +#tutorial-cards-container .card.tutorials-card p.tags { + margin-top: 30px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +#tutorial-cards-container .card.tutorials-card h4 { + color: #262626; + margin-bottom: 1.125rem; +} +#tutorial-cards-container .card.tutorials-card a { + height: 100%; +} +@media screen and (min-width: 768px) { + #tutorial-cards-container .card.tutorials-card a { + min-height: 190px; + } +} +@media (min-width: 768px) and (max-width: 1239px) { + #tutorial-cards-container .card.tutorials-card a { + min-height: 234px; + } +} +@media screen and (min-width: 768px) { + #tutorial-cards-container .card.tutorials-card:after { + content: ""; + display: block; + width: 0; + height: 1px; + position: absolute; + bottom: 0; + left: 0; + background-color: #e44c2c; + -webkit-transition: width .250s ease-in-out; + transition: width .250s ease-in-out; + } + #tutorial-cards-container .card.tutorials-card:hover:after { + width: 100%; + } +} +#tutorial-cards-container .card.tutorials-card:hover { + background-color: #ffffff; + border: 1px solid #e2e2e2; + border-bottom: none; +} +#tutorial-cards-container .card.tutorials-card:hover p.card-summary { + color: #262626; +} +#tutorial-cards-container .card.tutorials-card:hover .tutorials-image { + opacity: unset; +} +#tutorial-cards-container .tutorial-tags-container { + width: 75%; +} +#tutorial-cards-container .tutorial-tags-container.active { + width: 0; +} +#tutorial-cards-container .tutorial-filter-menu ul { + list-style-type: none; + padding-left: 1.25rem; +} +#tutorial-cards-container .tutorial-filter-menu ul li { + padding-right: 1.25rem; + word-break: break-all; +} +#tutorial-cards-container .tutorial-filter-menu ul li a { + color: #979797; +} +#tutorial-cards-container .tutorial-filter-menu ul li a:hover { + color: #e44c2c; +} +#tutorial-cards-container .tutorial-filter { + cursor: pointer; +} +#tutorial-cards-container .filter-btn { + color: #979797; + border: 1px solid #979797; + display: inline-block; + text-align: center; + white-space: nowrap; + vertical-align: middle; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + margin-bottom: 5px; +} +#tutorial-cards-container .filter-btn:hover { + border: 1px solid #e44c2c; + color: #e44c2c; +} +#tutorial-cards-container .filter-btn.selected { + background-color: #e44c2c; + border: 1px solid #e44c2c; + color: #ffffff; +} +#tutorial-cards-container .all-tag-selected { + background-color: #979797; + color: #ffffff; +} +#tutorial-cards-container .all-tag-selected:hover { + border-color: #979797; + color: #ffffff; +} +#tutorial-cards-container .pagination .page { + border: 1px solid #dee2e6; + padding: 0.5rem 0.75rem; +} +#tutorial-cards-container .pagination .active .page { + background-color: #dee2e6; +} + +article.pytorch-article .tutorials-callout-container { + padding-bottom: 50px; +} +article.pytorch-article .tutorials-callout-container .col-md-6 { + padding-bottom: 10px; +} +article.pytorch-article .tutorials-callout-container .text-container { + padding: 10px 0px 30px 0px; + padding-bottom: 10px; +} +article.pytorch-article .tutorials-callout-container .text-container .body-paragraph { + color: #666666; + font-weight: 300; + font-size: 1.125rem; + line-height: 1.875rem; +} +article.pytorch-article .tutorials-callout-container .btn.callout-button { + font-size: 1.125rem; + border-radius: 0; + border: none; + background-color: #f3f4f7; + color: #6c6c6d; + font-weight: 400; + position: relative; + letter-spacing: 0.25px; +} +@media screen and (min-width: 768px) { + article.pytorch-article .tutorials-callout-container .btn.callout-button:after { + content: ""; + display: block; + width: 0; + height: 1px; + position: absolute; + bottom: 0; + left: 0; + background-color: #e44c2c; + -webkit-transition: width .250s ease-in-out; + transition: width .250s ease-in-out; + } + article.pytorch-article .tutorials-callout-container .btn.callout-button:hover:after { + width: 100%; + } +} +article.pytorch-article .tutorials-callout-container .btn.callout-button a { + color: inherit; +} + +.pytorch-container { + margin: 0 auto; + padding: 0 1.875rem; + width: auto; + position: relative; +} +@media screen and (min-width: 1100px) { + .pytorch-container { + padding: 0; + } +} +@media screen and (min-width: 1101px) { + .pytorch-container { + margin-left: 25%; + } +} +@media screen and (min-width: 1600px) { + .pytorch-container { + margin-left: 350px; + } +} +.pytorch-container:before, .pytorch-container:after { + content: ""; + display: table; +} +.pytorch-container:after { + clear: both; +} +.pytorch-container { + *zoom: 1; +} + +.pytorch-content-wrap { + background-color: #ffffff; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + position: relative; + padding-top: 0; +} +.pytorch-content-wrap:before, .pytorch-content-wrap:after { + content: ""; + display: table; +} +.pytorch-content-wrap:after { + clear: both; +} +.pytorch-content-wrap { + *zoom: 1; +} +@media screen and (min-width: 1101px) { + .pytorch-content-wrap { + padding-top: 45px; + float: left; + width: 100%; + display: block; + } +} +@media screen and (min-width: 1600px) { + .pytorch-content-wrap { + width: 100%; + } +} + +.pytorch-content { + background: #ffffff; + width: 100%; + max-width: 700px; + position: relative; +} + +.pytorch-content-left { + min-height: 100vh; + margin-top: 2.5rem; + width: 100%; +} +@media screen and (min-width: 1101px) { + .pytorch-content-left { + margin-top: 0; + margin-left: 3%; + width: 75%; + float: left; + } +} +@media screen and (min-width: 1600px) { + .pytorch-content-left { + width: 850px; + margin-left: 30px; + } +} +.pytorch-content-left .main-content { + padding-top: 0.9375rem; +} +.pytorch-content-left .main-content ul.simple { + padding-bottom: 1.25rem; +} +.pytorch-content-left .main-content .note:nth-child(1), .pytorch-content-left .main-content .warning:nth-child(1) { + margin-top: 0; +} + +.pytorch-content-right { + display: none; + position: relative; + overflow-x: hidden; + overflow-y: hidden; +} +@media screen and (min-width: 1101px) { + .pytorch-content-right { + display: block; + margin-left: 0; + width: 19%; + float: left; + height: 100%; + } +} +@media screen and (min-width: 1600px) { + .pytorch-content-right { + width: 280px; + } +} + +@media screen and (min-width: 1101px) { + .pytorch-side-scroll { + position: relative; + overflow-x: hidden; + overflow-y: scroll; + height: 100%; + } +} + +.pytorch-menu-vertical { + padding: 1.25rem 1.875rem 2.5rem 1.875rem; +} +@media screen and (min-width: 1101px) { + .pytorch-menu-vertical { + display: block; + padding-top: 0; + padding-right: 13.5%; + padding-bottom: 5.625rem; + } +} +@media screen and (min-width: 1600px) { + .pytorch-menu-vertical { + padding-left: 0; + padding-right: 1.5625rem; + } +} + +.pytorch-left-menu { + display: none; + background-color: #f3f4f7; + color: #262626; + overflow: scroll; +} +@media screen and (min-width: 1101px) { + .pytorch-left-menu { + display: block; + overflow-x: hidden; + overflow-y: hidden; + padding-bottom: 110px; + padding: 0 1.875rem 0 0; + width: 25%; + z-index: 200; + float: left; + } + .pytorch-left-menu.make-fixed { + position: fixed; + top: 0; + bottom: 0; + left: 0; + float: none; + } +} +@media screen and (min-width: 1600px) { + .pytorch-left-menu { + padding: 0 0 0 1.875rem; + width: 350px; + } +} + +.expand-menu, .hide-menu { + color: #6c6c6d; + padding-left: 10px; + cursor: pointer; +} + +.collapse { + display: none; +} + +.left-nav-top-caption { + padding-top: 1rem; +} + +.pytorch-left-menu p.caption { + color: #262626; + display: block; + font-size: 1rem; + line-height: 1.375rem; + margin-bottom: 1rem; + text-transform: none; + white-space: normal; +} + +.pytorch-left-menu-search { + margin-bottom: 2.5rem; +} +@media screen and (min-width: 1101px) { + .pytorch-left-menu-search { + margin: 1.25rem 0.625rem 1.875rem 0; + } +} + +.pytorch-left-menu-search ::-webkit-input-placeholder { + color: #262626; +} +.pytorch-left-menu-search ::-moz-placeholder { + color: #262626; +} +.pytorch-left-menu-search :-ms-input-placeholder { + color: #262626; +} +.pytorch-left-menu-search ::-ms-input-placeholder { + color: #262626; +} +.pytorch-left-menu-search ::placeholder { + color: #262626; +} + +.pytorch-left-menu-search :focus::-webkit-input-placeholder { + color: transparent; +} +.pytorch-left-menu-search :focus::-moz-placeholder { + color: transparent; +} +.pytorch-left-menu-search :focus:-ms-input-placeholder { + color: transparent; +} +.pytorch-left-menu-search :focus::-ms-input-placeholder { + color: transparent; +} +.pytorch-left-menu-search :focus::placeholder { + color: transparent; +} + +.pytorch-left-menu-search input[type=text] { + border-radius: 0; + padding: 0.5rem 0.75rem; + border-color: #ffffff; + color: #262626; + border-style: solid; + font-size: 1rem; + width: 100%; + background-color: #f3f4f7; + background-image: url("../images/search-icon.svg"); + background-repeat: no-repeat; + background-size: 18px 18px; + background-position: 12px 10px; + padding-left: 40px; + background-color: #ffffff; +} +.pytorch-left-menu-search input[type=text]:focus { + outline: 0; +} + +@media screen and (min-width: 1101px) { + .pytorch-left-menu .pytorch-side-scroll { + width: 120%; + } +} +@media screen and (min-width: 1600px) { + .pytorch-left-menu .pytorch-side-scroll { + width: 340px; + } +} + +.pytorch-right-menu { + min-height: 100px; + overflow-x: hidden; + overflow-y: hidden; + left: 0; + z-index: 200; + padding-top: 0; + position: relative; +} +@media screen and (min-width: 1101px) { + .pytorch-right-menu { + width: 100%; + } + .pytorch-right-menu.scrolling-fixed { + position: fixed; + top: 45px; + left: 83.5%; + width: 14%; + } + .pytorch-right-menu.scrolling-absolute { + position: absolute; + left: 0; + } +} +@media screen and (min-width: 1600px) { + .pytorch-right-menu { + left: 0; + width: 380px; + } + .pytorch-right-menu.scrolling-fixed { + position: fixed; + top: 45px; + left: 1230px; + } + .pytorch-right-menu.scrolling-absolute { + position: absolute; + left: 0; + } +} + +.pytorch-left-menu ul, +.pytorch-right-menu ul { + list-style-type: none; + padding-left: 0; + margin-bottom: 2.5rem; +} +.pytorch-left-menu > ul, +.pytorch-right-menu > ul { + margin-bottom: 2.5rem; +} +.pytorch-left-menu a:link, +.pytorch-left-menu a:visited, +.pytorch-left-menu a:hover, +.pytorch-right-menu a:link, +.pytorch-right-menu a:visited, +.pytorch-right-menu a:hover { + color: #6c6c6d; + font-size: 0.875rem; + line-height: 1rem; + padding: 0; + text-decoration: none; +} +.pytorch-left-menu a:link.reference.internal, +.pytorch-left-menu a:visited.reference.internal, +.pytorch-left-menu a:hover.reference.internal, +.pytorch-right-menu a:link.reference.internal, +.pytorch-right-menu a:visited.reference.internal, +.pytorch-right-menu a:hover.reference.internal { + margin-bottom: 0.3125rem; + position: relative; +} +.pytorch-left-menu li code, +.pytorch-right-menu li code { + border: none; + background: inherit; + color: inherit; + padding-left: 0; + padding-right: 0; +} +.pytorch-left-menu li span.toctree-expand, +.pytorch-right-menu li span.toctree-expand { + display: block; + float: left; + margin-left: -1.2em; + font-size: 0.8em; + line-height: 1.6em; +} +.pytorch-left-menu li.on a, .pytorch-left-menu li.current > a, +.pytorch-right-menu li.on a, +.pytorch-right-menu li.current > a { + position: relative; + border: none; +} +.pytorch-left-menu li.on a span.toctree-expand, .pytorch-left-menu li.current > a span.toctree-expand, +.pytorch-right-menu li.on a span.toctree-expand, +.pytorch-right-menu li.current > a span.toctree-expand { + display: block; + font-size: 0.8em; + line-height: 1.6em; +} +.pytorch-left-menu li.toctree-l1.current > a, +.pytorch-right-menu li.toctree-l1.current > a { + color: #ee4c2c; +} +.pytorch-left-menu li.toctree-l1.current > a:before, +.pytorch-right-menu li.toctree-l1.current > a:before { + content: "\2022"; + display: inline-block; + position: absolute; + left: -15px; + top: -10%; + font-size: 1.375rem; + color: #ee4c2c; +} +@media screen and (min-width: 1101px) { + .pytorch-left-menu li.toctree-l1.current > a:before, + .pytorch-right-menu li.toctree-l1.current > a:before { + left: -20px; + } +} +.pytorch-left-menu li.toctree-l1.current li.toctree-l2 > ul, .pytorch-left-menu li.toctree-l2.current li.toctree-l3 > ul, +.pytorch-right-menu li.toctree-l1.current li.toctree-l2 > ul, +.pytorch-right-menu li.toctree-l2.current li.toctree-l3 > ul { + display: none; +} +.pytorch-left-menu li.toctree-l1.current li.toctree-l2.current > ul, .pytorch-left-menu li.toctree-l2.current li.toctree-l3.current > ul, +.pytorch-right-menu li.toctree-l1.current li.toctree-l2.current > ul, +.pytorch-right-menu li.toctree-l2.current li.toctree-l3.current > ul { + display: block; +} +.pytorch-left-menu li.toctree-l2.current li.toctree-l3 > a, +.pytorch-right-menu li.toctree-l2.current li.toctree-l3 > a { + display: block; +} +.pytorch-left-menu li.toctree-l3, +.pytorch-right-menu li.toctree-l3 { + font-size: 0.9em; +} +.pytorch-left-menu li.toctree-l3.current li.toctree-l4 > a, +.pytorch-right-menu li.toctree-l3.current li.toctree-l4 > a { + display: block; +} +.pytorch-left-menu li.toctree-l4, +.pytorch-right-menu li.toctree-l4 { + font-size: 0.9em; +} +.pytorch-left-menu li.current ul, +.pytorch-right-menu li.current ul { + display: block; +} +.pytorch-left-menu li ul, +.pytorch-right-menu li ul { + margin-bottom: 0; + display: none; +} +.pytorch-left-menu li ul li a, +.pytorch-right-menu li ul li a { + margin-bottom: 0; +} +.pytorch-left-menu a, +.pytorch-right-menu a { + display: inline-block; + position: relative; +} +.pytorch-left-menu a:hover, +.pytorch-right-menu a:hover { + cursor: pointer; +} +.pytorch-left-menu a:active, +.pytorch-right-menu a:active { + cursor: pointer; +} + +.pytorch-left-menu ul { + padding-left: 0; +} + +.pytorch-right-menu a:link, +.pytorch-right-menu a:visited, +.pytorch-right-menu a:hover { + color: #6c6c6d; +} +.pytorch-right-menu a:link span.pre, +.pytorch-right-menu a:visited span.pre, +.pytorch-right-menu a:hover span.pre { + color: #6c6c6d; +} +.pytorch-right-menu a.reference.internal.expanded:before { + content: "-"; + font-family: monospace; + position: absolute; + left: -12px; +} +.pytorch-right-menu a.reference.internal.not-expanded:before { + content: "+"; + font-family: monospace; + position: absolute; + left: -12px; +} +.pytorch-right-menu li.active > a { + color: #ee4c2c; +} +.pytorch-right-menu li.active > a span.pre, .pytorch-right-menu li.active > a:before { + color: #ee4c2c; +} +.pytorch-right-menu li.active > a:after { + content: "\2022"; + color: #e44c2c; + display: inline-block; + font-size: 1.375rem; + left: -17px; + position: absolute; + top: 1px; +} +.pytorch-right-menu .pytorch-side-scroll > ul > li > ul > li { + margin-bottom: 0; +} +.pytorch-right-menu ul ul { + padding-left: 0; +} +.pytorch-right-menu ul ul li { + padding-left: 0px; +} +.pytorch-right-menu ul ul li a.reference.internal { + padding-left: 0; +} +.pytorch-right-menu ul ul li ul { + display: none; + padding-left: 10px; +} +.pytorch-right-menu ul ul li li a.reference.internal { + padding-left: 0; +} +.pytorch-right-menu li ul { + display: block; +} + +.pytorch-right-menu .pytorch-side-scroll { + padding-top: 20px; +} +@media screen and (min-width: 1101px) { + .pytorch-right-menu .pytorch-side-scroll { + width: 120%; + } +} +@media screen and (min-width: 1600px) { + .pytorch-right-menu .pytorch-side-scroll { + width: 400px; + } +} +.pytorch-right-menu .pytorch-side-scroll > ul { + padding-left: 10%; + padding-right: 10%; + margin-bottom: 0; +} +@media screen and (min-width: 1600px) { + .pytorch-right-menu .pytorch-side-scroll > ul { + padding-left: 25px; + } +} +.pytorch-right-menu .pytorch-side-scroll > ul > li > a.reference.internal { + color: #262626; + font-weight: 500; +} +.pytorch-right-menu .pytorch-side-scroll ul li { + position: relative; +} + +#pytorch-right-menu .side-scroll-highlight { + color: #ee4c2c; +} + +.header-container { + max-width: none; + margin-top: 4px; +} +@media screen and (min-width: 1101px) { + .header-container { + margin-top: 0; + } +} +@media screen and (min-width: 1600px) { + .header-container { + margin-top: 0; + } +} + +.container-fluid.header-holder { + padding-right: 0; + padding-left: 0; +} + +.header-holder .container { + max-width: none; + padding-right: 1.875rem; + padding-left: 1.875rem; +} +@media screen and (min-width: 1101px) { + .header-holder .container { + padding-right: 1.875rem; + padding-left: 1.875rem; + } +} + +.header-holder .main-menu { + -webkit-box-pack: unset; + -ms-flex-pack: unset; + justify-content: unset; + position: relative; +} +@media screen and (min-width: 1101px) { + .header-holder .main-menu ul { + padding-left: 0; + margin-left: 26%; + } +} +@media screen and (min-width: 1600px) { + .header-holder .main-menu ul { + padding-left: 38px; + margin-left: 310px; + } +} + +.pytorch-page-level-bar { + display: none; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + background-color: #ffffff; + border-bottom: 1px solid #e2e2e2; + width: 100%; + z-index: 201; +} +@media screen and (min-width: 1101px) { + .pytorch-page-level-bar { + left: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + height: 45px; + padding-left: 0; + width: 100%; + position: absolute; + z-index: 1; + } + .pytorch-page-level-bar.left-menu-is-fixed { + position: fixed; + top: 0; + left: 25%; + padding-left: 0; + right: 0; + width: 75%; + } +} +@media screen and (min-width: 1600px) { + .pytorch-page-level-bar { + left: 0; + right: 0; + width: auto; + z-index: 1; + } + .pytorch-page-level-bar.left-menu-is-fixed { + left: 350px; + right: 0; + width: auto; + } +} +.pytorch-page-level-bar ul, .pytorch-page-level-bar li { + margin: 0; +} + +.pytorch-shortcuts-wrapper { + display: none; +} +@media screen and (min-width: 1101px) { + .pytorch-shortcuts-wrapper { + font-size: 0.875rem; + float: left; + margin-left: 2%; + } +} +@media screen and (min-width: 1600px) { + .pytorch-shortcuts-wrapper { + margin-left: 1.875rem; + } +} + +.cookie-banner-wrapper { + display: none; +} +.cookie-banner-wrapper .container { + padding-left: 1.875rem; + padding-right: 1.875rem; + max-width: 1240px; +} +.cookie-banner-wrapper.is-visible { + display: block; + position: fixed; + bottom: 0; + background-color: #f3f4f7; + min-height: 100px; + width: 100%; + z-index: 401; + border-top: 3px solid #ededee; +} +.cookie-banner-wrapper .gdpr-notice { + color: #6c6c6d; + margin-top: 1.5625rem; + text-align: left; + max-width: 1440px; +} +@media screen and (min-width: 768px) { + .cookie-banner-wrapper .gdpr-notice { + width: 77%; + } +} +@media (min-width: 768px) and (max-width: 1239px) { + .cookie-banner-wrapper .gdpr-notice { + width: inherit; + } +} +.cookie-banner-wrapper .gdpr-notice .cookie-policy-link { + color: #343434; +} +.cookie-banner-wrapper .close-button { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background: transparent; + border: 1px solid #f3f4f7; + height: 1.3125rem; + position: absolute; + bottom: 42px; + right: 0; + top: 0; + cursor: pointer; + outline: none; +} +@media screen and (min-width: 768px) { + .cookie-banner-wrapper .close-button { + right: 20%; + top: inherit; + } +} +@media (min-width: 768px) and (max-width: 1239px) { + .cookie-banner-wrapper .close-button { + right: 0; + top: 0; + } +} + +.main-menu ul li .resources-dropdown a { + cursor: pointer; +} +.main-menu ul li .dropdown-menu { + border-radius: 0; + padding: 0; +} +.main-menu ul li .dropdown-menu .dropdown-item { + color: #6c6c6d; + border-bottom: 1px solid #e2e2e2; +} +.main-menu ul li .dropdown-menu .dropdown-item:last-of-type { + border-bottom-color: transparent; +} +.main-menu ul li .dropdown-menu .dropdown-item:hover { + background-color: #e44c2c; +} +.main-menu ul li .dropdown-menu .dropdown-item p { + font-size: 1rem; + color: #979797; +} +.main-menu ul li .dropdown-menu a.dropdown-item:hover { + color: #ffffff; +} +.main-menu ul li .dropdown-menu a.dropdown-item:hover p { + color: #ffffff; +} + +.resources-dropdown-menu { + left: -75px; + width: 226px; + display: none; + position: absolute; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: 0.5rem 0; + font-size: 1rem; + color: #212529; + text-align: left; + list-style: none; + background-color: #ffffff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} + +.resources-dropdown:hover .resources-dropdown-menu { + display: block; +} + +.main-menu ul li .resources-dropdown-menu { + border-radius: 0; + padding: 0; +} +.main-menu ul li.active:hover .resources-dropdown-menu { + display: block; +} + +.main-menu ul li .resources-dropdown-menu .dropdown-item { + color: #6c6c6d; + border-bottom: 1px solid #e2e2e2; +} + +.resources-dropdown .with-down-orange-arrow { + padding-right: 2rem; + position: relative; + background: url("../images/chevron-down-orange.svg"); + background-size: 14px 18px; + background-position: top 7px right 10px; + background-repeat: no-repeat; +} + +.with-down-arrow { + padding-right: 2rem; + position: relative; + background-image: url("../images/chevron-down-black.svg"); + background-size: 14px 18px; + background-position: top 7px right 10px; + background-repeat: no-repeat; +} +.with-down-arrow:hover { + background-image: url("../images/chevron-down-orange.svg"); + background-repeat: no-repeat; +} + +.header-holder .main-menu ul li .resources-dropdown .doc-dropdown-option { + padding-top: 1rem; +} + +.header-holder .main-menu ul li a.nav-dropdown-item { + display: block; + font-size: 1rem; + line-height: 1.3125rem; + width: 100%; + padding: 0.25rem 1.5rem; + clear: both; + font-weight: 400; + color: #979797; + text-align: center; + background-color: transparent; + border-bottom: 1px solid #e2e2e2; +} +.header-holder .main-menu ul li a.nav-dropdown-item:last-of-type { + border-bottom-color: transparent; +} +.header-holder .main-menu ul li a.nav-dropdown-item:hover { + background-color: #e44c2c; + color: white; +} +.header-holder .main-menu ul li a.nav-dropdown-item .dropdown-title { + font-size: 1.125rem; + color: #6c6c6d; + letter-spacing: 0; + line-height: 34px; +} + +.header-holder .main-menu ul li a.nav-dropdown-item:hover .dropdown-title { + background-color: #e44c2c; + color: white; +} + +/*# sourceMappingURL=theme.css.map */ diff --git a/docs/v1.2.0/_static/doctools.js b/docs/v1.2.0/_static/doctools.js new file mode 100644 index 0000000000..e1bfd708b7 --- /dev/null +++ b/docs/v1.2.0/_static/doctools.js @@ -0,0 +1,358 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + this.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated === 'undefined') + return string; + return (typeof translated === 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated === 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) === 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + var url = new URL(window.location); + url.searchParams.delete('highlight'); + window.history.replaceState({}, '', url); + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar : function() { + $('input[name=q]').first().focus(); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this === '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, + + initOnKeyListeners: function() { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) + return; + + $(document).keydown(function(event) { + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box, textarea, dropdown or button + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' + && activeElementType !== 'BUTTON') { + if (event.altKey || event.ctrlKey || event.metaKey) + return; + + if (!event.shiftKey) { + switch (event.key) { + case 'ArrowLeft': + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) + break; + var prevHref = $('link[rel="prev"]').prop('href'); + if (prevHref) { + window.location.href = prevHref; + return false; + } + break; + case 'ArrowRight': + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) + break; + var nextHref = $('link[rel="next"]').prop('href'); + if (nextHref) { + window.location.href = nextHref; + return false; + } + break; + case 'Escape': + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) + break; + Documentation.hideSearchWords(); + return false; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case '/': + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) + break; + Documentation.focusSearchBar(); + return false; + } + } + }); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/docs/v1.2.0/_static/documentation_options.js b/docs/v1.2.0/_static/documentation_options.js new file mode 100644 index 0000000000..7e8ecffa6a --- /dev/null +++ b/docs/v1.2.0/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: 'master', + LANGUAGE: 'None', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/docs/v1.2.0/_static/file.png b/docs/v1.2.0/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/docs/v1.2.0/_static/file.png differ diff --git a/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-bold-italic.woff b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-bold-italic.woff new file mode 100644 index 0000000000..e317248423 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-bold-italic.woff differ diff --git a/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-bold-italic.woff2 b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-bold-italic.woff2 new file mode 100644 index 0000000000..cec2dc94fb Binary files /dev/null and b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-bold-italic.woff2 differ diff --git a/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-bold.woff b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-bold.woff new file mode 100644 index 0000000000..de46625edf Binary files /dev/null and b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-bold.woff differ diff --git a/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-bold.woff2 b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-bold.woff2 new file mode 100644 index 0000000000..dc05cd82bc Binary files /dev/null and b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-bold.woff2 differ diff --git a/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-book-italic.woff b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-book-italic.woff new file mode 100644 index 0000000000..a50e5038a4 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-book-italic.woff differ diff --git a/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-book-italic.woff2 b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-book-italic.woff2 new file mode 100644 index 0000000000..fe284db661 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-book-italic.woff2 differ diff --git a/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-book.woff b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-book.woff new file mode 100644 index 0000000000..6ab8775f00 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-book.woff differ diff --git a/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-book.woff2 b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-book.woff2 new file mode 100644 index 0000000000..2688739f1f Binary files /dev/null and b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-book.woff2 differ diff --git a/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-light-italic.woff b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-light-italic.woff new file mode 100644 index 0000000000..beda58d4e2 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-light-italic.woff differ diff --git a/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-light-italic.woff2 b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-light-italic.woff2 new file mode 100644 index 0000000000..e2fa0134b1 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-light-italic.woff2 differ diff --git a/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-light.woff b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-light.woff new file mode 100644 index 0000000000..226a0bf835 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-light.woff differ diff --git a/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-light.woff2 b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-light.woff2 new file mode 100644 index 0000000000..6d8ff2c045 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-light.woff2 differ diff --git a/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-medium-italic.woff b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-medium-italic.woff new file mode 100644 index 0000000000..a42115d63b Binary files /dev/null and b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-medium-italic.woff differ diff --git a/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-medium-italic.woff2 b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-medium-italic.woff2 new file mode 100644 index 0000000000..16a7713a45 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-medium-italic.woff2 differ diff --git a/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-medium.woff b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-medium.woff new file mode 100644 index 0000000000..5ea34539c6 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-medium.woff differ diff --git a/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-medium.woff2 b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-medium.woff2 new file mode 100644 index 0000000000..c58b6a528b Binary files /dev/null and b/docs/v1.2.0/_static/fonts/FreightSans/freight-sans-medium.woff2 differ diff --git a/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-Light.woff b/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-Light.woff new file mode 100644 index 0000000000..cf37a5c50b Binary files /dev/null and b/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-Light.woff differ diff --git a/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-Light.woff2 b/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-Light.woff2 new file mode 100644 index 0000000000..955a6eab5b Binary files /dev/null and b/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-Light.woff2 differ diff --git a/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-Medium.woff b/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-Medium.woff new file mode 100644 index 0000000000..fc65a679c2 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-Medium.woff differ diff --git a/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-Medium.woff2 b/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-Medium.woff2 new file mode 100644 index 0000000000..c352e40e34 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-Medium.woff2 differ diff --git a/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-Regular.woff b/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-Regular.woff new file mode 100644 index 0000000000..7d63d89f24 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-Regular.woff differ diff --git a/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-Regular.woff2 b/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-Regular.woff2 new file mode 100644 index 0000000000..d0d7ded907 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-Regular.woff2 differ diff --git a/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff b/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff new file mode 100644 index 0000000000..1da7753cf2 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff differ diff --git a/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff2 b/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff2 new file mode 100644 index 0000000000..79dffdb85f Binary files /dev/null and b/docs/v1.2.0/_static/fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff2 differ diff --git a/docs/v1.2.0/_static/fonts/font-awesome.css b/docs/v1.2.0/_static/fonts/font-awesome.css new file mode 100644 index 0000000000..e7dcefb822 --- /dev/null +++ b/docs/v1.2.0/_static/fonts/font-awesome.css @@ -0,0 +1 @@ +@charset "utf-8";/*!* Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license(Font:SIL OFL 1.1,CSS:MIT License) */@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(specimen/FontAwesome.woff2) format("woff2"),url(specimen/FontAwesome.woff) format("woff"),url(specimen/FontAwesome.ttf) format("truetype")}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0,mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2,mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} \ No newline at end of file diff --git a/docs/v1.2.0/_static/fonts/material-icons.css b/docs/v1.2.0/_static/fonts/material-icons.css new file mode 100644 index 0000000000..76de20cb10 --- /dev/null +++ b/docs/v1.2.0/_static/fonts/material-icons.css @@ -0,0 +1 @@ +@charset "utf-8";/*!* Licensed under the Apache License,Version 2.0(the "License");you may not * use this file except in compliance with the License. You may obtain a copy * of the License at:* * http://www.apache.org/licenses/LICENSE-2.0 * * UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING,SOFTWARE * DISTRIBUTED UNDER THE LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,EITHER EXPRESS OR IMPLIED. * SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING PERMISSIONS AND * LIMITATIONS UNDER THE LICENSE. */@font-face{font-display:swap;font-family:"Material Icons";font-style:normal;font-weight:400;src:local("Material Icons"),local("MaterialIcons-Regular"),url(specimen/MaterialIcons-Regular.woff2) format("woff2"),url(specimen/MaterialIcons-Regular.woff) format("woff"),url(specimen/MaterialIcons-Regular.ttf) format("truetype")} \ No newline at end of file diff --git a/docs/v1.2.0/_static/fonts/specimen/FontAwesome.ttf b/docs/v1.2.0/_static/fonts/specimen/FontAwesome.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/specimen/FontAwesome.ttf differ diff --git a/docs/v1.2.0/_static/fonts/specimen/FontAwesome.woff b/docs/v1.2.0/_static/fonts/specimen/FontAwesome.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/specimen/FontAwesome.woff differ diff --git a/docs/v1.2.0/_static/fonts/specimen/FontAwesome.woff2 b/docs/v1.2.0/_static/fonts/specimen/FontAwesome.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/specimen/FontAwesome.woff2 differ diff --git a/docs/v1.2.0/_static/fonts/specimen/MaterialIcons-Regular.ttf b/docs/v1.2.0/_static/fonts/specimen/MaterialIcons-Regular.ttf new file mode 100644 index 0000000000..7015564ad1 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/specimen/MaterialIcons-Regular.ttf differ diff --git a/docs/v1.2.0/_static/fonts/specimen/MaterialIcons-Regular.woff b/docs/v1.2.0/_static/fonts/specimen/MaterialIcons-Regular.woff new file mode 100644 index 0000000000..b648a3eea2 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/specimen/MaterialIcons-Regular.woff differ diff --git a/docs/v1.2.0/_static/fonts/specimen/MaterialIcons-Regular.woff2 b/docs/v1.2.0/_static/fonts/specimen/MaterialIcons-Regular.woff2 new file mode 100644 index 0000000000..9fa2112520 Binary files /dev/null and b/docs/v1.2.0/_static/fonts/specimen/MaterialIcons-Regular.woff2 differ diff --git a/docs/v1.2.0/_static/images/arrow-down-orange.svg b/docs/v1.2.0/_static/images/arrow-down-orange.svg new file mode 100644 index 0000000000..e9d8e9ecf2 --- /dev/null +++ b/docs/v1.2.0/_static/images/arrow-down-orange.svg @@ -0,0 +1,19 @@ + + + + Group 5 + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_static/images/arrow-right-with-tail.svg b/docs/v1.2.0/_static/images/arrow-right-with-tail.svg new file mode 100644 index 0000000000..5843588fca --- /dev/null +++ b/docs/v1.2.0/_static/images/arrow-right-with-tail.svg @@ -0,0 +1,19 @@ + + + + Page 1 + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_static/images/chevron-down-black.svg b/docs/v1.2.0/_static/images/chevron-down-black.svg new file mode 100644 index 0000000000..097bc076ec --- /dev/null +++ b/docs/v1.2.0/_static/images/chevron-down-black.svg @@ -0,0 +1,16 @@ + + + Created with Sketch. + + + + + + + + + + + + + diff --git a/docs/v1.2.0/_static/images/chevron-down-grey.svg b/docs/v1.2.0/_static/images/chevron-down-grey.svg new file mode 100644 index 0000000000..82d6514f25 --- /dev/null +++ b/docs/v1.2.0/_static/images/chevron-down-grey.svg @@ -0,0 +1,18 @@ + + + + +Created with Sketch. + + + + + + + + + + + + diff --git a/docs/v1.2.0/_static/images/chevron-down-orange.svg b/docs/v1.2.0/_static/images/chevron-down-orange.svg new file mode 100644 index 0000000000..fd79a57854 --- /dev/null +++ b/docs/v1.2.0/_static/images/chevron-down-orange.svg @@ -0,0 +1,16 @@ + + + Created with Sketch. + + + + + + + + + + + + + diff --git a/docs/v1.2.0/_static/images/chevron-down-white.svg b/docs/v1.2.0/_static/images/chevron-down-white.svg new file mode 100644 index 0000000000..e6c94e27b6 --- /dev/null +++ b/docs/v1.2.0/_static/images/chevron-down-white.svg @@ -0,0 +1,16 @@ + + + Created with Sketch. + + + + + + + + + + + + + diff --git a/docs/v1.2.0/_static/images/chevron-right-orange.svg b/docs/v1.2.0/_static/images/chevron-right-orange.svg new file mode 100644 index 0000000000..7033fc93bf --- /dev/null +++ b/docs/v1.2.0/_static/images/chevron-right-orange.svg @@ -0,0 +1,17 @@ + + + + +Page 1 +Created with Sketch. + + + + + + + + + + diff --git a/docs/v1.2.0/_static/images/chevron-right-white.svg b/docs/v1.2.0/_static/images/chevron-right-white.svg new file mode 100644 index 0000000000..dd9e77f261 --- /dev/null +++ b/docs/v1.2.0/_static/images/chevron-right-white.svg @@ -0,0 +1,17 @@ + + + + +Page 1 +Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_static/images/favicon.png b/docs/v1.2.0/_static/images/favicon.png new file mode 100644 index 0000000000..76d17f57ad Binary files /dev/null and b/docs/v1.2.0/_static/images/favicon.png differ diff --git a/docs/v1.2.0/_static/images/home-footer-background.jpg b/docs/v1.2.0/_static/images/home-footer-background.jpg new file mode 100644 index 0000000000..b307bb57f4 Binary files /dev/null and b/docs/v1.2.0/_static/images/home-footer-background.jpg differ diff --git a/docs/v1.2.0/_static/images/icon-close.svg b/docs/v1.2.0/_static/images/icon-close.svg new file mode 100644 index 0000000000..348964e79f --- /dev/null +++ b/docs/v1.2.0/_static/images/icon-close.svg @@ -0,0 +1,21 @@ + + + + Page 1 + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_static/images/icon-menu-dots-dark.svg b/docs/v1.2.0/_static/images/icon-menu-dots-dark.svg new file mode 100644 index 0000000000..fa2ad044b3 --- /dev/null +++ b/docs/v1.2.0/_static/images/icon-menu-dots-dark.svg @@ -0,0 +1,42 @@ + + + + Page 1 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/_static/images/icons/bitbucket.1b09e088.svg b/docs/v1.2.0/_static/images/icons/bitbucket.1b09e088.svg new file mode 100644 index 0000000000..cf58c14fbc --- /dev/null +++ b/docs/v1.2.0/_static/images/icons/bitbucket.1b09e088.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/v1.2.0/_static/images/icons/bitbucket.svg b/docs/v1.2.0/_static/images/icons/bitbucket.svg new file mode 100644 index 0000000000..cf58c14fbc --- /dev/null +++ b/docs/v1.2.0/_static/images/icons/bitbucket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/v1.2.0/_static/images/icons/github.f0b8504a.svg b/docs/v1.2.0/_static/images/icons/github.f0b8504a.svg new file mode 100644 index 0000000000..3d13b19751 --- /dev/null +++ b/docs/v1.2.0/_static/images/icons/github.f0b8504a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/v1.2.0/_static/images/icons/github.svg b/docs/v1.2.0/_static/images/icons/github.svg new file mode 100644 index 0000000000..3d13b19751 --- /dev/null +++ b/docs/v1.2.0/_static/images/icons/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/v1.2.0/_static/images/icons/gitlab.6dd19c00.svg b/docs/v1.2.0/_static/images/icons/gitlab.6dd19c00.svg new file mode 100644 index 0000000000..1d9fffa74f --- /dev/null +++ b/docs/v1.2.0/_static/images/icons/gitlab.6dd19c00.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/v1.2.0/_static/images/icons/gitlab.svg b/docs/v1.2.0/_static/images/icons/gitlab.svg new file mode 100644 index 0000000000..1d9fffa74f --- /dev/null +++ b/docs/v1.2.0/_static/images/icons/gitlab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/v1.2.0/_static/images/logo-dark.svg b/docs/v1.2.0/_static/images/logo-dark.svg new file mode 100644 index 0000000000..9b4c1a56ac --- /dev/null +++ b/docs/v1.2.0/_static/images/logo-dark.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/docs/v1.2.0/_static/images/logo-facebook-dark.svg b/docs/v1.2.0/_static/images/logo-facebook-dark.svg new file mode 100644 index 0000000000..cff17915c4 --- /dev/null +++ b/docs/v1.2.0/_static/images/logo-facebook-dark.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/docs/v1.2.0/_static/images/logo-icon.svg b/docs/v1.2.0/_static/images/logo-icon.svg new file mode 100644 index 0000000000..575f6823e4 --- /dev/null +++ b/docs/v1.2.0/_static/images/logo-icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/docs/v1.2.0/_static/images/logo-twitter-dark.svg b/docs/v1.2.0/_static/images/logo-twitter-dark.svg new file mode 100644 index 0000000000..1572570f88 --- /dev/null +++ b/docs/v1.2.0/_static/images/logo-twitter-dark.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/docs/v1.2.0/_static/images/logo-youtube-dark.svg b/docs/v1.2.0/_static/images/logo-youtube-dark.svg new file mode 100644 index 0000000000..e3cfedd79d --- /dev/null +++ b/docs/v1.2.0/_static/images/logo-youtube-dark.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/v1.2.0/_static/images/logo.svg b/docs/v1.2.0/_static/images/logo.svg new file mode 100644 index 0000000000..f8d44b9842 --- /dev/null +++ b/docs/v1.2.0/_static/images/logo.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/docs/v1.2.0/_static/images/pytorch-colab.svg b/docs/v1.2.0/_static/images/pytorch-colab.svg new file mode 100644 index 0000000000..2ab15e2f30 --- /dev/null +++ b/docs/v1.2.0/_static/images/pytorch-colab.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + diff --git a/docs/v1.2.0/_static/images/pytorch-download.svg b/docs/v1.2.0/_static/images/pytorch-download.svg new file mode 100644 index 0000000000..cc37d638e9 --- /dev/null +++ b/docs/v1.2.0/_static/images/pytorch-download.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/docs/v1.2.0/_static/images/pytorch-github.svg b/docs/v1.2.0/_static/images/pytorch-github.svg new file mode 100644 index 0000000000..2c2570da1d --- /dev/null +++ b/docs/v1.2.0/_static/images/pytorch-github.svg @@ -0,0 +1,15 @@ + + + + + + diff --git a/docs/v1.2.0/_static/images/pytorch-x.svg b/docs/v1.2.0/_static/images/pytorch-x.svg new file mode 100644 index 0000000000..74856ea9fd --- /dev/null +++ b/docs/v1.2.0/_static/images/pytorch-x.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/docs/v1.2.0/_static/images/search-icon.svg b/docs/v1.2.0/_static/images/search-icon.svg new file mode 100644 index 0000000000..ebb0df8677 --- /dev/null +++ b/docs/v1.2.0/_static/images/search-icon.svg @@ -0,0 +1,19 @@ + + + + Created with Sketch. + + + + + + + + + + + + + + + diff --git a/docs/v1.2.0/_static/images/view-page-source-icon.svg b/docs/v1.2.0/_static/images/view-page-source-icon.svg new file mode 100644 index 0000000000..6f5bbe0748 --- /dev/null +++ b/docs/v1.2.0/_static/images/view-page-source-icon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/docs/v1.2.0/_static/javascripts/application.js b/docs/v1.2.0/_static/javascripts/application.js new file mode 100644 index 0000000000..7c724d2e4f --- /dev/null +++ b/docs/v1.2.0/_static/javascripts/application.js @@ -0,0 +1,2540 @@ +! function(e, t) { + for (var n in t) e[n] = t[n] +}(window, function(n) { + var r = {}; + + function i(e) { + if (r[e]) return r[e].exports; + var t = r[e] = { + i: e, + l: !1, + exports: {} + }; + return n[e].call(t.exports, t, t.exports, i), t.l = !0, t.exports + } + return i.m = n, i.c = r, i.d = function(e, t, n) { + i.o(e, t) || Object.defineProperty(e, t, { + enumerable: !0, + get: n + }) + }, i.r = function(e) { + "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { + value: "Module" + }), Object.defineProperty(e, "__esModule", { + value: !0 + }) + }, i.t = function(t, e) { + if (1 & e && (t = i(t)), 8 & e) return t; + if (4 & e && "object" == typeof t && t && t.__esModule) return t; + var n = Object.create(null); + if (i.r(n), Object.defineProperty(n, "default", { + enumerable: !0, + value: t + }), 2 & e && "string" != typeof t) + for (var r in t) i.d(n, r, function(e) { + return t[e] + }.bind(null, r)); + return n + }, i.n = function(e) { + var t = e && e.__esModule ? function() { + return e.default + } : function() { + return e + }; + return i.d(t, "a", t), t + }, i.o = function(e, t) { + return Object.prototype.hasOwnProperty.call(e, t) + }, i.p = "", i(i.s = 13) +}([function(e, t, n) { + "use strict"; + var r = { + Listener: function() { + function e(e, t, n) { + var r = this; + this.els_ = Array.prototype.slice.call("string" == typeof e ? document.querySelectorAll(e) : [].concat(e)), this.handler_ = "function" == typeof n ? { + update: n + } : n, this.events_ = [].concat(t), this.update_ = function(e) { + return r.handler_.update(e) + } + } + var t = e.prototype; + return t.listen = function() { + var n = this; + this.els_.forEach(function(t) { + n.events_.forEach(function(e) { + t.addEventListener(e, n.update_, !1) + }) + }), "function" == typeof this.handler_.setup && this.handler_.setup() + }, t.unlisten = function() { + var n = this; + this.els_.forEach(function(t) { + n.events_.forEach(function(e) { + t.removeEventListener(e, n.update_) + }) + }), "function" == typeof this.handler_.reset && this.handler_.reset() + }, e + }(), + MatchMedia: function(e, t) { + this.handler_ = function(e) { + e.matches ? t.listen() : t.unlisten() + }; + var n = window.matchMedia(e); + n.addListener(this.handler_), this.handler_(n) + } + }, + i = { + Shadow: function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement && n.parentNode instanceof HTMLElement)) throw new ReferenceError; + if (this.el_ = n.parentNode, !((n = "string" == typeof t ? document.querySelector(t) : t) instanceof HTMLElement)) throw new ReferenceError; + this.header_ = n, this.height_ = 0, this.active_ = !1 + } + var t = e.prototype; + return t.setup = function() { + for (var e = this.el_; e = e.previousElementSibling;) { + if (!(e instanceof HTMLElement)) throw new ReferenceError; + this.height_ += e.offsetHeight + } + this.update() + }, t.update = function(e) { + if (!e || "resize" !== e.type && "orientationchange" !== e.type) { + var t = window.pageYOffset >= this.height_; + t !== this.active_ && (this.header_.dataset.mdState = (this.active_ = t) ? "shadow" : "") + } else this.height_ = 0, this.setup() + }, t.reset = function() { + this.header_.dataset.mdState = "", this.height_ = 0, this.active_ = !1 + }, e + }(), + Title: function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + if (this.el_ = n, !((n = "string" == typeof t ? document.querySelector(t) : t) instanceof HTMLHeadingElement)) throw new ReferenceError; + this.header_ = n, this.active_ = !1 + } + var t = e.prototype; + return t.setup = function() { + var t = this; + Array.prototype.forEach.call(this.el_.children, function(e) { + e.style.width = t.el_.offsetWidth - 20 + "px" + }) + }, t.update = function(e) { + var t = this, + n = window.pageYOffset >= this.header_.offsetTop; + n !== this.active_ && (this.el_.dataset.mdState = (this.active_ = n) ? "active" : ""), "resize" !== e.type && "orientationchange" !== e.type || Array.prototype.forEach.call(this.el_.children, function(e) { + e.style.width = t.el_.offsetWidth - 20 + "px" + }) + }, t.reset = function() { + this.el_.dataset.mdState = "", this.el_.style.width = "", this.active_ = !1 + }, e + }() + }, + o = { + Blur: function() { + function e(e) { + this.els_ = "string" == typeof e ? document.querySelectorAll(e) : e, this.index_ = 0, this.offset_ = window.pageYOffset, this.dir_ = !1, this.anchors_ = [].reduce.call(this.els_, function(e, t) { + var n = decodeURIComponent(t.hash); + return e.concat(document.getElementById(n.substring(1)) || []) + }, []) + } + var t = e.prototype; + return t.setup = function() { + this.update() + }, t.update = function() { + var e = window.pageYOffset, + t = this.offset_ - e < 0; + if (this.dir_ !== t && (this.index_ = this.index_ = t ? 0 : this.els_.length - 1), 0 !== this.anchors_.length) { + if (this.offset_ <= e) + for (var n = this.index_ + 1; n < this.els_.length && this.anchors_[n].offsetTop - 80 <= e; n++) 0 < n && (this.els_[n - 1].dataset.mdState = "blur"), this.index_ = n; + else + for (var r = this.index_; 0 <= r; r--) { + if (!(this.anchors_[r].offsetTop - 80 > e)) { + this.index_ = r; + break + } + 0 < r && (this.els_[r - 1].dataset.mdState = "") + } + this.offset_ = e, this.dir_ = t + } + }, t.reset = function() { + Array.prototype.forEach.call(this.els_, function(e) { + e.dataset.mdState = "" + }), this.index_ = 0, this.offset_ = window.pageYOffset + }, e + }(), + Collapse: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + this.el_ = t + } + var t = e.prototype; + return t.setup = function() { + var e = this.el_.getBoundingClientRect().height; + this.el_.style.display = e ? "block" : "none", this.el_.style.overflow = e ? "visible" : "hidden" + }, t.update = function() { + var e = this, + t = this.el_.getBoundingClientRect().height; + this.el_.style.display = "block", this.el_.style.overflow = ""; + var r = this.el_.previousElementSibling.previousElementSibling.checked; + if (r) this.el_.style.maxHeight = t + "px", requestAnimationFrame(function() { + e.el_.setAttribute("data-md-state", "animate"), e.el_.style.maxHeight = "0px" + }); + else { + this.el_.setAttribute("data-md-state", "expand"), this.el_.style.maxHeight = ""; + var n = this.el_.getBoundingClientRect().height; + this.el_.removeAttribute("data-md-state"), this.el_.style.maxHeight = "0px", requestAnimationFrame(function() { + e.el_.setAttribute("data-md-state", "animate"), e.el_.style.maxHeight = n + "px" + }) + } + this.el_.addEventListener("transitionend", function e(t) { + var n = t.target; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + n.removeAttribute("data-md-state"), n.style.maxHeight = "", n.style.display = r ? "none" : "block", n.style.overflow = r ? "hidden" : "visible", n.removeEventListener("transitionend", e) + }, !1) + }, t.reset = function() { + this.el_.dataset.mdState = "", this.el_.style.maxHeight = "", this.el_.style.display = "", this.el_.style.overflow = "" + }, e + }(), + Scrolling: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + this.el_ = t + } + var t = e.prototype; + return t.setup = function() { + this.el_.children[this.el_.children.length - 1].style.webkitOverflowScrolling = "touch"; + var e = this.el_.querySelectorAll("[data-md-toggle]"); + Array.prototype.forEach.call(e, function(e) { + if (!(e instanceof HTMLInputElement)) throw new ReferenceError; + if (e.checked) { + var t = e.nextElementSibling; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + for (; + "NAV" !== t.tagName && t.nextElementSibling;) t = t.nextElementSibling; + if (!(e.parentNode instanceof HTMLElement && e.parentNode.parentNode instanceof HTMLElement)) throw new ReferenceError; + var n = e.parentNode.parentNode, + r = t.children[t.children.length - 1]; + n.style.webkitOverflowScrolling = "", r.style.webkitOverflowScrolling = "touch" + } + }) + }, t.update = function(e) { + var t = e.target; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + var n = t.nextElementSibling; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + for (; + "NAV" !== n.tagName && n.nextElementSibling;) n = n.nextElementSibling; + if (!(t.parentNode instanceof HTMLElement && t.parentNode.parentNode instanceof HTMLElement)) throw new ReferenceError; + var r = t.parentNode.parentNode, + i = n.children[n.children.length - 1]; + if (r.style.webkitOverflowScrolling = "", i.style.webkitOverflowScrolling = "", !t.checked) { + n.addEventListener("transitionend", function e() { + n instanceof HTMLElement && (r.style.webkitOverflowScrolling = "touch", n.removeEventListener("transitionend", e)) + }, !1) + } + if (t.checked) { + n.addEventListener("transitionend", function e() { + n instanceof HTMLElement && (i.style.webkitOverflowScrolling = "touch", n.removeEventListener("transitionend", e)) + }, !1) + } + }, t.reset = function() { + this.el_.children[1].style.webkitOverflowScrolling = ""; + var e = this.el_.querySelectorAll("[data-md-toggle]"); + Array.prototype.forEach.call(e, function(e) { + if (!(e instanceof HTMLInputElement)) throw new ReferenceError; + if (e.checked) { + var t = e.nextElementSibling; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + for (; + "NAV" !== t.tagName && t.nextElementSibling;) t = t.nextElementSibling; + if (!(e.parentNode instanceof HTMLElement && e.parentNode.parentNode instanceof HTMLElement)) throw new ReferenceError; + var n = e.parentNode.parentNode, + r = t.children[t.children.length - 1]; + n.style.webkitOverflowScrolling = "", r.style.webkitOverflowScrolling = "" + } + }) + }, e + }() + }, + a = { + Lock: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLInputElement)) throw new ReferenceError; + if (this.el_ = t, !document.body) throw new ReferenceError; + this.lock_ = document.body + } + var t = e.prototype; + return t.setup = function() { + this.update() + }, t.update = function() { + var e = this; + this.el_.checked ? (this.offset_ = window.pageYOffset, setTimeout(function() { + window.scrollTo(0, 0), e.el_.checked && (e.lock_.dataset.mdState = "lock") + }, 400)) : (this.lock_.dataset.mdState = "", setTimeout(function() { + void 0 !== e.offset_ && window.scrollTo(0, e.offset_) + }, 100)) + }, t.reset = function() { + "lock" === this.lock_.dataset.mdState && window.scrollTo(0, this.offset_), this.lock_.dataset.mdState = "" + }, e + }(), + Result: n(9).a + }, + s = { + Position: function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement && n.parentNode instanceof HTMLElement)) throw new ReferenceError; + if (this.el_ = n, this.parent_ = n.parentNode, !((n = "string" == typeof t ? document.querySelector(t) : t) instanceof HTMLElement)) throw new ReferenceError; + this.header_ = n, this.height_ = 0, this.pad_ = "fixed" === window.getComputedStyle(this.header_).position + } + var t = e.prototype; + return t.setup = function() { + var e = Array.prototype.reduce.call(this.parent_.children, function(e, t) { + return Math.max(e, t.offsetTop) + }, 0); + this.offset_ = e - (this.pad_ ? this.header_.offsetHeight : 0), this.update() + }, t.update = function(e) { + var t = window.pageYOffset, + n = window.innerHeight; + e && "resize" === e.type && this.setup(); + var r = this.pad_ ? this.header_.offsetHeight : 0, + i = this.parent_.offsetTop + this.parent_.offsetHeight, + o = n - r - Math.max(0, this.offset_ - t) - Math.max(0, t + n - i); + o !== this.height_ && (this.el_.style.height = (this.height_ = o) + "px"), t >= this.offset_ ? "lock" !== this.el_.dataset.mdState && (this.el_.dataset.mdState = "lock") : "lock" === this.el_.dataset.mdState && (this.el_.dataset.mdState = "") + }, t.reset = function() { + this.el_.dataset.mdState = "", this.el_.style.height = "", this.height_ = 0 + }, e + }() + }, + c = n(6), + l = n.n(c); + var u = { + Adapter: { + GitHub: function(o) { + var e, t; + + function n(e) { + var t; + t = o.call(this, e) || this; + var n = /^.+github\.com\/([^/]+)\/?([^/]+)?.*$/.exec(t.base_); + if (n && 3 === n.length) { + var r = n[1], + i = n[2]; + t.base_ = "https://api.github.com/users/" + r + "/repos", t.name_ = i + } + return t + } + return t = o, (e = n).prototype = Object.create(t.prototype), (e.prototype.constructor = e).__proto__ = t, n.prototype.fetch_ = function() { + var i = this; + return function n(r) { + return void 0 === r && (r = 0), fetch(i.base_ + "?per_page=30&page=" + r).then(function(e) { + return e.json() + }).then(function(e) { + if (!(e instanceof Array)) throw new TypeError; + if (i.name_) { + var t = e.find(function(e) { + return e.name === i.name_ + }); + return t || 30 !== e.length ? t ? [i.format_(t.stargazers_count) + " Stars", i.format_(t.forks_count) + " Forks"] : [] : n(r + 1) + } + return [e.length + " Repositories"] + }) + }() + }, n + }(function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLAnchorElement)) throw new ReferenceError; + this.el_ = t, this.base_ = this.el_.href, this.salt_ = this.hash_(this.base_) + } + var t = e.prototype; + return t.fetch = function() { + var n = this; + return new Promise(function(t) { + var e = l.a.getJSON(n.salt_ + ".cache-source"); + void 0 !== e ? t(e) : n.fetch_().then(function(e) { + l.a.set(n.salt_ + ".cache-source", e, { + expires: 1 / 96 + }), t(e) + }) + }) + }, t.fetch_ = function() { + throw new Error("fetch_(): Not implemented") + }, t.format_ = function(e) { + return 1e4 < e ? (e / 1e3).toFixed(0) + "k" : 1e3 < e ? (e / 1e3).toFixed(1) + "k" : "" + e + }, t.hash_ = function(e) { + var t = 0; + if (0 === e.length) return t; + for (var n = 0, r = e.length; n < r; n++) t = (t << 5) - t + e.charCodeAt(n), t |= 0; + return t + }, e + }()) + }, + Repository: n(10).a + }, + f = { + Toggle: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof Node)) throw new ReferenceError; + this.el_ = t; + var n = document.querySelector("[data-md-component=header]"); + this.height_ = n.offsetHeight, this.active_ = !1 + } + var t = e.prototype; + return t.update = function() { + var e = window.pageYOffset >= this.el_.children[0].offsetTop + (5 - this.height_); + e !== this.active_ && (this.el_.dataset.mdState = (this.active_ = e) ? "hidden" : "") + }, t.reset = function() { + this.el_.dataset.mdState = "", this.active_ = !1 + }, e + }() + }; + t.a = { + Event: r, + Header: i, + Nav: o, + Search: a, + Sidebar: s, + Source: u, + Tabs: f + } +}, function(t, e, n) { + (function(e) { + t.exports = e.lunr = n(24) + }).call(this, n(4)) +}, function(e, f, d) { + "use strict"; + (function(t) { + var e = d(8), + n = setTimeout; + + function r() {} + + function o(e) { + if (!(this instanceof o)) throw new TypeError("Promises must be constructed via new"); + if ("function" != typeof e) throw new TypeError("not a function"); + this._state = 0, this._handled = !1, this._value = void 0, this._deferreds = [], u(e, this) + } + + function i(n, r) { + for (; 3 === n._state;) n = n._value; + 0 !== n._state ? (n._handled = !0, o._immediateFn(function() { + var e = 1 === n._state ? r.onFulfilled : r.onRejected; + if (null !== e) { + var t; + try { + t = e(n._value) + } catch (e) { + return void s(r.promise, e) + } + a(r.promise, t) + } else(1 === n._state ? a : s)(r.promise, n._value) + })) : n._deferreds.push(r) + } + + function a(t, e) { + try { + if (e === t) throw new TypeError("A promise cannot be resolved with itself."); + if (e && ("object" == typeof e || "function" == typeof e)) { + var n = e.then; + if (e instanceof o) return t._state = 3, t._value = e, void c(t); + if ("function" == typeof n) return void u((r = n, i = e, function() { + r.apply(i, arguments) + }), t) + } + t._state = 1, t._value = e, c(t) + } catch (e) { + s(t, e) + } + var r, i + } + + function s(e, t) { + e._state = 2, e._value = t, c(e) + } + + function c(e) { + 2 === e._state && 0 === e._deferreds.length && o._immediateFn(function() { + e._handled || o._unhandledRejectionFn(e._value) + }); + for (var t = 0, n = e._deferreds.length; t < n; t++) i(e, e._deferreds[t]); + e._deferreds = null + } + + function l(e, t, n) { + this.onFulfilled = "function" == typeof e ? e : null, this.onRejected = "function" == typeof t ? t : null, this.promise = n + } + + function u(e, t) { + var n = !1; + try { + e(function(e) { + n || (n = !0, a(t, e)) + }, function(e) { + n || (n = !0, s(t, e)) + }) + } catch (e) { + if (n) return; + n = !0, s(t, e) + } + } + o.prototype.catch = function(e) { + return this.then(null, e) + }, o.prototype.then = function(e, t) { + var n = new this.constructor(r); + return i(this, new l(e, t, n)), n + }, o.prototype.finally = e.a, o.all = function(t) { + return new o(function(r, i) { + if (!t || void 0 === t.length) throw new TypeError("Promise.all accepts an array"); + var o = Array.prototype.slice.call(t); + if (0 === o.length) return r([]); + var a = o.length; + + function s(t, e) { + try { + if (e && ("object" == typeof e || "function" == typeof e)) { + var n = e.then; + if ("function" == typeof n) return void n.call(e, function(e) { + s(t, e) + }, i) + } + o[t] = e, 0 == --a && r(o) + } catch (e) { + i(e) + } + } + for (var e = 0; e < o.length; e++) s(e, o[e]) + }) + }, o.resolve = function(t) { + return t && "object" == typeof t && t.constructor === o ? t : new o(function(e) { + e(t) + }) + }, o.reject = function(n) { + return new o(function(e, t) { + t(n) + }) + }, o.race = function(i) { + return new o(function(e, t) { + for (var n = 0, r = i.length; n < r; n++) i[n].then(e, t) + }) + }, o._immediateFn = "function" == typeof t && function(e) { + t(e) + } || function(e) { + n(e, 0) + }, o._unhandledRejectionFn = function(e) { + "undefined" != typeof console && console && console.warn("Possible Unhandled Promise Rejection:", e) + }, f.a = o + }).call(this, d(21).setImmediate) +}, function(e, t, n) { + "use strict"; + + function r(e, t) { + var n = document.createElement(e); + t && Array.prototype.forEach.call(Object.keys(t), function(e) { + n.setAttribute(e, t[e]) + }); + for (var r = arguments.length, i = new Array(2 < r ? r - 2 : 0), o = 2; o < r; o++) i[o - 2] = arguments[o]; + return function t(e) { + Array.prototype.forEach.call(e, function(e) { + "string" == typeof e || "number" == typeof e ? n.textContent += e : Array.isArray(e) ? t(e) : void 0 !== e.__html ? n.innerHTML += e.__html : e instanceof Node && n.appendChild(e) + }) + }(i), n + } + n.r(t), n.d(t, "createElement", function() { + return r + }) +}, function(e, t) { + var n; + n = function() { + return this + }(); + try { + n = n || new Function("return this")() + } catch (e) { + "object" == typeof window && (n = window) + } + e.exports = n +}, function(e, t, n) { + var r; + r = function() { + return function(n) { + var r = {}; + + function i(e) { + if (r[e]) return r[e].exports; + var t = r[e] = { + i: e, + l: !1, + exports: {} + }; + return n[e].call(t.exports, t, t.exports, i), t.l = !0, t.exports + } + return i.m = n, i.c = r, i.d = function(e, t, n) { + i.o(e, t) || Object.defineProperty(e, t, { + enumerable: !0, + get: n + }) + }, i.r = function(e) { + "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { + value: "Module" + }), Object.defineProperty(e, "__esModule", { + value: !0 + }) + }, i.t = function(t, e) { + if (1 & e && (t = i(t)), 8 & e) return t; + if (4 & e && "object" == typeof t && t && t.__esModule) return t; + var n = Object.create(null); + if (i.r(n), Object.defineProperty(n, "default", { + enumerable: !0, + value: t + }), 2 & e && "string" != typeof t) + for (var r in t) i.d(n, r, function(e) { + return t[e] + }.bind(null, r)); + return n + }, i.n = function(e) { + var t = e && e.__esModule ? function() { + return e.default + } : function() { + return e + }; + return i.d(t, "a", t), t + }, i.o = function(e, t) { + return Object.prototype.hasOwnProperty.call(e, t) + }, i.p = "", i(i.s = 0) + }([function(e, t, n) { + "use strict"; + var i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e + }, + o = function() { + function r(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r) + } + } + return function(e, t, n) { + return t && r(e.prototype, t), n && r(e, n), e + } + }(), + a = r(n(1)), + s = r(n(3)), + c = r(n(4)); + + function r(e) { + return e && e.__esModule ? e : { + default: e + } + } + var l = function(e) { + function r(e, t) { + ! function(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") + }(this, r); + var n = function(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || "object" != typeof t && "function" != typeof t ? e : t + }(this, (r.__proto__ || Object.getPrototypeOf(r)).call(this)); + return n.resolveOptions(t), n.listenClick(e), n + } + return function(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) + }(r, s.default), o(r, [{ + key: "resolveOptions", + value: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}; + this.action = "function" == typeof e.action ? e.action : this.defaultAction, this.target = "function" == typeof e.target ? e.target : this.defaultTarget, this.text = "function" == typeof e.text ? e.text : this.defaultText, this.container = "object" === i(e.container) ? e.container : document.body + } + }, { + key: "listenClick", + value: function(e) { + var t = this; + this.listener = (0, c.default)(e, "click", function(e) { + return t.onClick(e) + }) + } + }, { + key: "onClick", + value: function(e) { + var t = e.delegateTarget || e.currentTarget; + this.clipboardAction && (this.clipboardAction = null), this.clipboardAction = new a.default({ + action: this.action(t), + target: this.target(t), + text: this.text(t), + container: this.container, + trigger: t, + emitter: this + }) + } + }, { + key: "defaultAction", + value: function(e) { + return u("action", e) + } + }, { + key: "defaultTarget", + value: function(e) { + var t = u("target", e); + if (t) return document.querySelector(t) + } + }, { + key: "defaultText", + value: function(e) { + return u("text", e) + } + }, { + key: "destroy", + value: function() { + this.listener.destroy(), this.clipboardAction && (this.clipboardAction.destroy(), this.clipboardAction = null) + } + }], [{ + key: "isSupported", + value: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : ["copy", "cut"], + t = "string" == typeof e ? [e] : e, + n = !!document.queryCommandSupported; + return t.forEach(function(e) { + n = n && !!document.queryCommandSupported(e) + }), n + } + }]), r + }(); + + function u(e, t) { + var n = "data-clipboard-" + e; + if (t.hasAttribute(n)) return t.getAttribute(n) + } + e.exports = l + }, function(e, t, n) { + "use strict"; + var r, i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e + }, + o = function() { + function r(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r) + } + } + return function(e, t, n) { + return t && r(e.prototype, t), n && r(e, n), e + } + }(), + a = n(2), + s = (r = a) && r.__esModule ? r : { + default: r + }; + var c = function() { + function t(e) { + ! function(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") + }(this, t), this.resolveOptions(e), this.initSelection() + } + return o(t, [{ + key: "resolveOptions", + value: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}; + this.action = e.action, this.container = e.container, this.emitter = e.emitter, this.target = e.target, this.text = e.text, this.trigger = e.trigger, this.selectedText = "" + } + }, { + key: "initSelection", + value: function() { + this.text ? this.selectFake() : this.target && this.selectTarget() + } + }, { + key: "selectFake", + value: function() { + var e = this, + t = "rtl" == document.documentElement.getAttribute("dir"); + this.removeFake(), this.fakeHandlerCallback = function() { + return e.removeFake() + }, this.fakeHandler = this.container.addEventListener("click", this.fakeHandlerCallback) || !0, this.fakeElem = document.createElement("textarea"), this.fakeElem.style.fontSize = "12pt", this.fakeElem.style.border = "0", this.fakeElem.style.padding = "0", this.fakeElem.style.margin = "0", this.fakeElem.style.position = "absolute", this.fakeElem.style[t ? "right" : "left"] = "-9999px"; + var n = window.pageYOffset || document.documentElement.scrollTop; + this.fakeElem.style.top = n + "px", this.fakeElem.setAttribute("readonly", ""), this.fakeElem.value = this.text, this.container.appendChild(this.fakeElem), this.selectedText = (0, s.default)(this.fakeElem), this.copyText() + } + }, { + key: "removeFake", + value: function() { + this.fakeHandler && (this.container.removeEventListener("click", this.fakeHandlerCallback), this.fakeHandler = null, this.fakeHandlerCallback = null), this.fakeElem && (this.container.removeChild(this.fakeElem), this.fakeElem = null) + } + }, { + key: "selectTarget", + value: function() { + this.selectedText = (0, s.default)(this.target), this.copyText() + } + }, { + key: "copyText", + value: function() { + var t = void 0; + try { + t = document.execCommand(this.action) + } catch (e) { + t = !1 + } + this.handleResult(t) + } + }, { + key: "handleResult", + value: function(e) { + this.emitter.emit(e ? "success" : "error", { + action: this.action, + text: this.selectedText, + trigger: this.trigger, + clearSelection: this.clearSelection.bind(this) + }) + } + }, { + key: "clearSelection", + value: function() { + this.trigger && this.trigger.focus(), window.getSelection().removeAllRanges() + } + }, { + key: "destroy", + value: function() { + this.removeFake() + } + }, { + key: "action", + set: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : "copy"; + if (this._action = e, "copy" !== this._action && "cut" !== this._action) throw new Error('Invalid "action" value, use either "copy" or "cut"') + }, + get: function() { + return this._action + } + }, { + key: "target", + set: function(e) { + if (void 0 !== e) { + if (!e || "object" !== (void 0 === e ? "undefined" : i(e)) || 1 !== e.nodeType) throw new Error('Invalid "target" value, use a valid Element'); + if ("copy" === this.action && e.hasAttribute("disabled")) throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'); + if ("cut" === this.action && (e.hasAttribute("readonly") || e.hasAttribute("disabled"))) throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes'); + this._target = e + } + }, + get: function() { + return this._target + } + }]), t + }(); + e.exports = c + }, function(e, t) { + e.exports = function(e) { + var t; + if ("SELECT" === e.nodeName) e.focus(), t = e.value; + else if ("INPUT" === e.nodeName || "TEXTAREA" === e.nodeName) { + var n = e.hasAttribute("readonly"); + n || e.setAttribute("readonly", ""), e.select(), e.setSelectionRange(0, e.value.length), n || e.removeAttribute("readonly"), t = e.value + } else { + e.hasAttribute("contenteditable") && e.focus(); + var r = window.getSelection(), + i = document.createRange(); + i.selectNodeContents(e), r.removeAllRanges(), r.addRange(i), t = r.toString() + } + return t + } + }, function(e, t) { + function n() {} + n.prototype = { + on: function(e, t, n) { + var r = this.e || (this.e = {}); + return (r[e] || (r[e] = [])).push({ + fn: t, + ctx: n + }), this + }, + once: function(e, t, n) { + var r = this; + + function i() { + r.off(e, i), t.apply(n, arguments) + } + return i._ = t, this.on(e, i, n) + }, + emit: function(e) { + for (var t = [].slice.call(arguments, 1), n = ((this.e || (this.e = {}))[e] || []).slice(), r = 0, i = n.length; r < i; r++) n[r].fn.apply(n[r].ctx, t); + return this + }, + off: function(e, t) { + var n = this.e || (this.e = {}), + r = n[e], + i = []; + if (r && t) + for (var o = 0, a = r.length; o < a; o++) r[o].fn !== t && r[o].fn._ !== t && i.push(r[o]); + return i.length ? n[e] = i : delete n[e], this + } + }, e.exports = n + }, function(e, t, n) { + var d = n(5), + h = n(6); + e.exports = function(e, t, n) { + if (!e && !t && !n) throw new Error("Missing required arguments"); + if (!d.string(t)) throw new TypeError("Second argument must be a String"); + if (!d.fn(n)) throw new TypeError("Third argument must be a Function"); + if (d.node(e)) return u = t, f = n, (l = e).addEventListener(u, f), { + destroy: function() { + l.removeEventListener(u, f) + } + }; + if (d.nodeList(e)) return a = e, s = t, c = n, Array.prototype.forEach.call(a, function(e) { + e.addEventListener(s, c) + }), { + destroy: function() { + Array.prototype.forEach.call(a, function(e) { + e.removeEventListener(s, c) + }) + } + }; + if (d.string(e)) return r = e, i = t, o = n, h(document.body, r, i, o); + throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList"); + var r, i, o, a, s, c, l, u, f + } + }, function(e, n) { + n.node = function(e) { + return void 0 !== e && e instanceof HTMLElement && 1 === e.nodeType + }, n.nodeList = function(e) { + var t = Object.prototype.toString.call(e); + return void 0 !== e && ("[object NodeList]" === t || "[object HTMLCollection]" === t) && "length" in e && (0 === e.length || n.node(e[0])) + }, n.string = function(e) { + return "string" == typeof e || e instanceof String + }, n.fn = function(e) { + return "[object Function]" === Object.prototype.toString.call(e) + } + }, function(e, t, n) { + var a = n(7); + + function o(e, t, n, r, i) { + var o = function(t, n, e, r) { + return function(e) { + e.delegateTarget = a(e.target, n), e.delegateTarget && r.call(t, e) + } + }.apply(this, arguments); + return e.addEventListener(n, o, i), { + destroy: function() { + e.removeEventListener(n, o, i) + } + } + } + e.exports = function(e, t, n, r, i) { + return "function" == typeof e.addEventListener ? o.apply(null, arguments) : "function" == typeof n ? o.bind(null, document).apply(null, arguments) : ("string" == typeof e && (e = document.querySelectorAll(e)), Array.prototype.map.call(e, function(e) { + return o(e, t, n, r, i) + })) + } + }, function(e, t) { + if ("undefined" != typeof Element && !Element.prototype.matches) { + var n = Element.prototype; + n.matches = n.matchesSelector || n.mozMatchesSelector || n.msMatchesSelector || n.oMatchesSelector || n.webkitMatchesSelector + } + e.exports = function(e, t) { + for (; e && 9 !== e.nodeType;) { + if ("function" == typeof e.matches && e.matches(t)) return e; + e = e.parentNode + } + } + }]) + }, e.exports = r() +}, function(r, i, o) { + var a, s; + ! function(e) { + if (void 0 === (s = "function" == typeof(a = e) ? a.call(i, o, i, r) : a) || (r.exports = s), !0, r.exports = e(), !!0) { + var t = window.Cookies, + n = window.Cookies = e(); + n.noConflict = function() { + return window.Cookies = t, n + } + } + }(function() { + function m() { + for (var e = 0, t = {}; e < arguments.length; e++) { + var n = arguments[e]; + for (var r in n) t[r] = n[r] + } + return t + } + return function e(h) { + function p(e, t, n) { + var r; + if ("undefined" != typeof document) { + if (1 < arguments.length) { + if ("number" == typeof(n = m({ + path: "/" + }, p.defaults, n)).expires) { + var i = new Date; + i.setMilliseconds(i.getMilliseconds() + 864e5 * n.expires), n.expires = i + } + n.expires = n.expires ? n.expires.toUTCString() : ""; + try { + r = JSON.stringify(t), /^[\{\[]/.test(r) && (t = r) + } catch (e) {} + t = h.write ? h.write(t, e) : encodeURIComponent(String(t)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent), e = (e = (e = encodeURIComponent(String(e))).replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)).replace(/[\(\)]/g, escape); + var o = ""; + for (var a in n) n[a] && (o += "; " + a, !0 !== n[a] && (o += "=" + n[a])); + return document.cookie = e + "=" + t + o + } + e || (r = {}); + for (var s = document.cookie ? document.cookie.split("; ") : [], c = /(%[0-9A-Z]{2})+/g, l = 0; l < s.length; l++) { + var u = s[l].split("="), + f = u.slice(1).join("="); + this.json || '"' !== f.charAt(0) || (f = f.slice(1, -1)); + try { + var d = u[0].replace(c, decodeURIComponent); + if (f = h.read ? h.read(f, d) : h(f, d) || f.replace(c, decodeURIComponent), this.json) try { + f = JSON.parse(f) + } catch (e) {} + if (e === d) { + r = f; + break + } + e || (r[d] = f) + } catch (e) {} + } + return r + } + } + return (p.set = p).get = function(e) { + return p.call(p, e) + }, p.getJSON = function() { + return p.apply({ + json: !0 + }, [].slice.call(arguments)) + }, p.defaults = {}, p.remove = function(e, t) { + p(e, "", m(t, { + expires: -1 + })) + }, p.withConverter = e, p + }(function() {}) + }) +}, function(e, t, n) { + "use strict"; + n.r(t); + var r = "function" == typeof fetch ? fetch.bind() : function(i, o) { + return o = o || {}, new Promise(function(e, t) { + var n = new XMLHttpRequest; + for (var r in n.open(o.method || "get", i, !0), o.headers) n.setRequestHeader(r, o.headers[r]); + + function s() { + var r, i = [], + o = [], + a = {}; + return n.getAllResponseHeaders().replace(/^(.*?):[^\S\n]*([\s\S]*?)$/gm, function(e, t, n) { + i.push(t = t.toLowerCase()), o.push([t, n]), r = a[t], a[t] = r ? r + "," + n : n + }), { + ok: 2 == (n.status / 100 | 0), + status: n.status, + statusText: n.statusText, + url: n.responseURL, + clone: s, + text: function() { + return Promise.resolve(n.responseText) + }, + json: function() { + return Promise.resolve(n.responseText).then(JSON.parse) + }, + blob: function() { + return Promise.resolve(new Blob([n.response])) + }, + headers: { + keys: function() { + return i + }, + entries: function() { + return o + }, + get: function(e) { + return a[e.toLowerCase()] + }, + has: function(e) { + return e.toLowerCase() in a + } + } + } + } + n.withCredentials = "include" == o.credentials, n.onload = function() { + e(s()) + }, n.onerror = t, n.send(o.body || null) + }) + }; + t.default = r +}, function(e, t, n) { + "use strict"; + t.a = function(t) { + var n = this.constructor; + return this.then(function(e) { + return n.resolve(t()).then(function() { + return e + }) + }, function(e) { + return n.resolve(t()).then(function() { + return n.reject(e) + }) + }) + } +}, function(e, n, r) { + "use strict"; + (function(f) { + r.d(n, "a", function() { + return t + }); + var e = r(1), + d = r.n(e), + h = function(e) { + var t = document.getElementsByName("lang:" + e)[0]; + if (!(t instanceof HTMLMetaElement)) throw new ReferenceError; + return t.content + }, + t = function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + this.el_ = n; + var r = Array.prototype.slice.call(this.el_.children), + i = r[0], + o = r[1]; + this.data_ = t, this.meta_ = i, this.list_ = o, this.message_ = { + placeholder: this.meta_.textContent, + none: h("search.result.none"), + one: h("search.result.one"), + other: h("search.result.other") + }; + var a = h("search.tokenizer"); + a.length && (d.a.tokenizer.separator = a), this.lang_ = h("search.language").split(",").filter(Boolean).map(function(e) { + return e.trim() + }) + } + return e.prototype.update = function(e) { + var t, a = this; + if ("focus" !== e.type || this.index_) { + if ("focus" === e.type || "keyup" === e.type) { + var n = e.target; + if (!(n instanceof HTMLInputElement)) throw new ReferenceError; + if (!this.index_ || n.value === this.value_) return; + for (; this.list_.firstChild;) this.list_.removeChild(this.list_.firstChild); + if (this.value_ = n.value, 0 === this.value_.length) return void(this.meta_.textContent = this.message_.placeholder); + var r = this.index_.query(function(t) { + a.value_.toLowerCase().split(" ").filter(Boolean).forEach(function(e) { + t.term(e, { + wildcard: d.a.Query.wildcard.TRAILING + }) + }) + }).reduce(function(e, t) { + var n = a.docs_.get(t.ref); + if (n.parent) { + var r = n.parent.location; + e.set(r, (e.get(r) || []).concat(t)) + } else { + var i = n.location; + e.set(i, e.get(i) || []) + } + return e + }, new Map), + i = (t = this.value_.trim(), t.replace(/[|\\{}()[\]^$+*?.-]/g, "\\$&")).replace(new RegExp(d.a.tokenizer.separator, "img"), "|"), + s = new RegExp("(^|" + d.a.tokenizer.separator + ")(" + i + ")", "img"), + c = function(e, t, n) { + return t + "" + n + "" + }; + this.stack_ = [], r.forEach(function(e, t) { + var n, r = a.docs_.get(t), + i = f.createElement("li", { + class: "md-search-result__item" + }, f.createElement("a", { + href: r.location, + title: r.title, + class: "md-search-result__link", + tabindex: "-1" + }, f.createElement("article", { + class: "md-search-result__article md-search-result__article--document" + }, f.createElement("h1", { + class: "md-search-result__title" + }, { + __html: r.title.replace(s, c) + }), r.text.length ? f.createElement("p", { + class: "md-search-result__teaser" + }, { + __html: r.text.replace(s, c) + }) : {}))), + o = e.map(function(t) { + return function() { + var e = a.docs_.get(t.ref); + i.appendChild(f.createElement("a", { + href: e.location, + title: e.title, + class: "md-search-result__link", + "data-md-rel": "anchor", + tabindex: "-1" + }, f.createElement("article", { + class: "md-search-result__article" + }, f.createElement("h1", { + class: "md-search-result__title" + }, { + __html: e.title.replace(s, c) + }), e.text.length ? f.createElement("p", { + class: "md-search-result__teaser" + }, { + __html: function(e, t) { + var n = t; + if (e.length > n) { + for (; + " " !== e[n] && 0 < --n;); + return e.substring(0, n) + "..." + } + return e + }(e.text.replace(s, c), 400) + }) : {}))) + } + }); + (n = a.stack_).push.apply(n, [function() { + return a.list_.appendChild(i) + }].concat(o)) + }); + var o = this.el_.parentNode; + if (!(o instanceof HTMLElement)) throw new ReferenceError; + for (; this.stack_.length && o.offsetHeight >= o.scrollHeight - 16;) this.stack_.shift()(); + var l = this.list_.querySelectorAll("[data-md-rel=anchor]"); + switch (Array.prototype.forEach.call(l, function(r) { + ["click", "keydown"].forEach(function(n) { + r.addEventListener(n, function(e) { + if ("keydown" !== n || 13 === e.keyCode) { + var t = document.querySelector("[data-md-toggle=search]"); + if (!(t instanceof HTMLInputElement)) throw new ReferenceError; + t.checked && (t.checked = !1, t.dispatchEvent(new CustomEvent("change"))), e.preventDefault(), setTimeout(function() { + document.location.href = r.href + }, 100) + } + }) + }) + }), r.size) { + case 0: + this.meta_.textContent = this.message_.none; + break; + case 1: + this.meta_.textContent = this.message_.one; + break; + default: + this.meta_.textContent = this.message_.other.replace("#", r.size) + } + } + } else { + var u = function(e) { + a.docs_ = e.reduce(function(e, t) { + var n, r, i, o = t.location.split("#"), + a = o[0], + s = o[1]; + return t.text = (n = t.text, r = document.createTextNode(n), (i = document.createElement("p")).appendChild(r), i.innerHTML), s && (t.parent = e.get(a), t.parent && !t.parent.done && (t.parent.title = t.title, t.parent.text = t.text, t.parent.done = !0)), t.text = t.text.replace(/\n/g, " ").replace(/\s+/g, " ").replace(/\s+([,.:;!?])/g, function(e, t) { + return t + }), t.parent && t.parent.title === t.title || e.set(t.location, t), e + }, new Map); + var i = a.docs_, + o = a.lang_; + a.stack_ = [], a.index_ = d()(function() { + var e, t = this, + n = { + "search.pipeline.trimmer": d.a.trimmer, + "search.pipeline.stopwords": d.a.stopWordFilter + }, + r = Object.keys(n).reduce(function(e, t) { + return h(t).match(/^false$/i) || e.push(n[t]), e + }, []); + this.pipeline.reset(), r && (e = this.pipeline).add.apply(e, r), 1 === o.length && "en" !== o[0] && d.a[o[0]] ? this.use(d.a[o[0]]) : 1 < o.length && this.use(d.a.multiLanguage.apply(d.a, o)), this.field("title", { + boost: 10 + }), this.field("text"), this.ref("location"), i.forEach(function(e) { + return t.add(e) + }) + }); + var t = a.el_.parentNode; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + t.addEventListener("scroll", function() { + for (; a.stack_.length && t.scrollTop + t.offsetHeight >= t.scrollHeight - 16;) a.stack_.splice(0, 10).forEach(function(e) { + return e() + }) + }) + }; + setTimeout(function() { + return "function" == typeof a.data_ ? a.data_().then(u) : u(a.data_) + }, 250) + } + }, e + }() + }).call(this, r(3)) +}, function(e, n, r) { + "use strict"; + (function(t) { + r.d(n, "a", function() { + return e + }); + var e = function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + this.el_ = t + } + return e.prototype.initialize = function(e) { + e.length && this.el_.children.length && this.el_.children[this.el_.children.length - 1].appendChild(t.createElement("ul", { + class: "md-source__facts" + }, e.map(function(e) { + return t.createElement("li", { + class: "md-source__fact" + }, e) + }))), this.el_.dataset.mdState = "done" + }, e + }() + }).call(this, r(3)) +}, , , function(e, n, c) { + "use strict"; + c.r(n), + function(o) { + c.d(n, "app", function() { + return t + }); + c(14), c(15), c(16), c(17), c(18), c(19), c(20); + var r = c(2), + e = c(5), + a = c.n(e), + i = c(0); + window.Promise = window.Promise || r.a; + var s = function(e) { + var t = document.getElementsByName("lang:" + e)[0]; + if (!(t instanceof HTMLMetaElement)) throw new ReferenceError; + return t.content + }; + var t = { + initialize: function(t) { + new i.a.Event.Listener(document, "DOMContentLoaded", function() { + if (!(document.body instanceof HTMLElement)) throw new ReferenceError; + Modernizr.addTest("ios", function() { + return !!navigator.userAgent.match(/(iPad|iPhone|iPod)/g) + }); + var e = document.querySelectorAll("table:not([class])"); + if (Array.prototype.forEach.call(e, function(e) { + var t = o.createElement("div", { + class: "md-typeset__scrollwrap" + }, o.createElement("div", { + class: "md-typeset__table" + })); + e.nextSibling ? e.parentNode.insertBefore(t, e.nextSibling) : e.parentNode.appendChild(t), t.children[0].appendChild(e) + }), a.a.isSupported()) { + var t = document.querySelectorAll(".codehilite > pre, pre > code"); + Array.prototype.forEach.call(t, function(e, t) { + var n = "__code_" + t, + r = o.createElement("button", { + class: "md-clipboard", + title: s("clipboard.copy"), + "data-clipboard-target": "#" + n + " pre, #" + n + " code" + }, o.createElement("span", { + class: "md-clipboard__message" + })), + i = e.parentNode; + i.id = n, i.insertBefore(r, e) + }), new a.a(".md-clipboard").on("success", function(e) { + var t = e.trigger.querySelector(".md-clipboard__message"); + if (!(t instanceof HTMLElement)) throw new ReferenceError; + e.clearSelection(), t.dataset.mdTimer && clearTimeout(parseInt(t.dataset.mdTimer, 10)), t.classList.add("md-clipboard__message--active"), t.innerHTML = s("clipboard.copied"), t.dataset.mdTimer = setTimeout(function() { + t.classList.remove("md-clipboard__message--active"), t.dataset.mdTimer = "" + }, 2e3).toString() + }) + } + if (!Modernizr.details) { + var n = document.querySelectorAll("details > summary"); + Array.prototype.forEach.call(n, function(e) { + e.addEventListener("click", function(e) { + var t = e.target.parentNode; + t.hasAttribute("open") ? t.removeAttribute("open") : t.setAttribute("open", "") + }) + }) + } + var r = function() { + if (document.location.hash) { + var e = document.getElementById(document.location.hash.substring(1)); + if (!e) return; + for (var t = e.parentNode; t && !(t instanceof HTMLDetailsElement);) t = t.parentNode; + if (t && !t.open) { + t.open = !0; + var n = location.hash; + location.hash = " ", location.hash = n + } + } + }; + if (window.addEventListener("hashchange", r), r(), Modernizr.ios) { + var i = document.querySelectorAll("[data-md-scrollfix]"); + Array.prototype.forEach.call(i, function(t) { + t.addEventListener("touchstart", function() { + var e = t.scrollTop; + 0 === e ? t.scrollTop = 1 : e + t.offsetHeight === t.scrollHeight && (t.scrollTop = e - 1) + }) + }) + } + }).listen(), new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Header.Shadow("[data-md-component=container]", "[data-md-component=header]")).listen(), new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Header.Title("[data-md-component=title]", ".md-typeset h1")).listen(), document.querySelector("[data-md-component=hero]") && new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Tabs.Toggle("[data-md-component=hero]")).listen(), document.querySelector("[data-md-component=tabs]") && new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Tabs.Toggle("[data-md-component=tabs]")).listen(), new i.a.Event.MatchMedia("(min-width: 1220px)", new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Sidebar.Position("[data-md-component=navigation]", "[data-md-component=header]"))), document.querySelector("[data-md-component=toc]") && new i.a.Event.MatchMedia("(min-width: 960px)", new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Sidebar.Position("[data-md-component=toc]", "[data-md-component=header]"))), new i.a.Event.MatchMedia("(min-width: 960px)", new i.a.Event.Listener(window, "scroll", new i.a.Nav.Blur("[data-md-component=toc] .md-nav__link"))); + var e = document.querySelectorAll("[data-md-component=collapsible]"); + Array.prototype.forEach.call(e, function(e) { + new i.a.Event.MatchMedia("(min-width: 1220px)", new i.a.Event.Listener(e.previousElementSibling, "click", new i.a.Nav.Collapse(e))) + }), new i.a.Event.MatchMedia("(max-width: 1219px)", new i.a.Event.Listener("[data-md-component=navigation] [data-md-toggle]", "change", new i.a.Nav.Scrolling("[data-md-component=navigation] nav"))), document.querySelector("[data-md-component=search]") && (new i.a.Event.MatchMedia("(max-width: 959px)", new i.a.Event.Listener("[data-md-toggle=search]", "change", new i.a.Search.Lock("[data-md-toggle=search]")))), + new i.a.Event.Listener(document.body, "keydown", function(e) { + if (9 === e.keyCode) { + var t = document.querySelectorAll("[data-md-component=navigation] .md-nav__link[for]:not([tabindex])"); + Array.prototype.forEach.call(t, function(e) { + e.offsetHeight && (e.tabIndex = 0) + }) + } + }).listen(), new i.a.Event.Listener(document.body, "mousedown", function() { + var e = document.querySelectorAll("[data-md-component=navigation] .md-nav__link[tabindex]"); + Array.prototype.forEach.call(e, function(e) { + e.removeAttribute("tabIndex") + }) + }).listen(), document.body.addEventListener("click", function() { + "tabbing" === document.body.dataset.mdState && (document.body.dataset.mdState = "") + }), new i.a.Event.MatchMedia("(max-width: 959px)", new i.a.Event.Listener("[data-md-component=navigation] [href^='#']", "click", function() { + var e = document.querySelector("[data-md-toggle=drawer]"); + if (!(e instanceof HTMLInputElement)) throw new ReferenceError; + e.checked && (e.checked = !1, e.dispatchEvent(new CustomEvent("change"))) + })), + function() { + var e = document.querySelector("[data-md-source]"); + if (!e) return r.a.resolve([]); + if (!(e instanceof HTMLAnchorElement)) throw new ReferenceError; + switch (e.dataset.mdSource) { + case "github": + return new i.a.Source.Adapter.GitHub(e).fetch(); + default: + return r.a.resolve([]) + } + }().then(function(t) { + var e = document.querySelectorAll("[data-md-source]"); + Array.prototype.forEach.call(e, function(e) { + new i.a.Source.Repository(e).initialize(t) + }) + }); + var n = function() { + var e = document.querySelectorAll("details"); + Array.prototype.forEach.call(e, function(e) { + e.setAttribute("open", "") + }) + }; + new i.a.Event.MatchMedia("print", { + listen: n, + unlisten: function() {} + }), window.onbeforeprint = n + } + } + }.call(this, c(3)) +}, function(e, t, n) { + e.exports = n.p + "assets/images/icons/bitbucket.1b09e088.svg" +}, function(e, t, n) { + e.exports = n.p + "assets/images/icons/github.f0b8504a.svg" +}, function(e, t, n) { + e.exports = n.p + "assets/images/icons/gitlab.6dd19c00.svg" +}, function(e, t) { + e.exports = "/Users/squidfunk/Desktop/General/Sources/mkdocs-material/material/application.4031d38b.css" +}, function(e, t) { + e.exports = "/Users/squidfunk/Desktop/General/Sources/mkdocs-material/material/application-palette.224b79ff.css" +}, function(e, t) { + ! function() { + if ("undefined" != typeof window) try { + var e = new window.CustomEvent("test", { + cancelable: !0 + }); + if (e.preventDefault(), !0 !== e.defaultPrevented) throw new Error("Could not prevent default") + } catch (e) { + var t = function(e, t) { + var n, r; + return (t = t || {}).bubbles = !!t.bubbles, t.cancelable = !!t.cancelable, (n = document.createEvent("CustomEvent")).initCustomEvent(e, t.bubbles, t.cancelable, t.detail), r = n.preventDefault, n.preventDefault = function() { + r.call(this); + try { + Object.defineProperty(this, "defaultPrevented", { + get: function() { + return !0 + } + }) + } catch (e) { + this.defaultPrevented = !0 + } + }, n + }; + t.prototype = window.Event.prototype, window.CustomEvent = t + } + }() +}, function(e, t, n) { + window.fetch || (window.fetch = n(7).default || n(7)) +}, function(e, i, o) { + (function(e) { + var t = void 0 !== e && e || "undefined" != typeof self && self || window, + n = Function.prototype.apply; + + function r(e, t) { + this._id = e, this._clearFn = t + } + i.setTimeout = function() { + return new r(n.call(setTimeout, t, arguments), clearTimeout) + }, i.setInterval = function() { + return new r(n.call(setInterval, t, arguments), clearInterval) + }, i.clearTimeout = i.clearInterval = function(e) { + e && e.close() + }, r.prototype.unref = r.prototype.ref = function() {}, r.prototype.close = function() { + this._clearFn.call(t, this._id) + }, i.enroll = function(e, t) { + clearTimeout(e._idleTimeoutId), e._idleTimeout = t + }, i.unenroll = function(e) { + clearTimeout(e._idleTimeoutId), e._idleTimeout = -1 + }, i._unrefActive = i.active = function(e) { + clearTimeout(e._idleTimeoutId); + var t = e._idleTimeout; + 0 <= t && (e._idleTimeoutId = setTimeout(function() { + e._onTimeout && e._onTimeout() + }, t)) + }, o(22), i.setImmediate = "undefined" != typeof self && self.setImmediate || void 0 !== e && e.setImmediate || this && this.setImmediate, i.clearImmediate = "undefined" != typeof self && self.clearImmediate || void 0 !== e && e.clearImmediate || this && this.clearImmediate + }).call(this, o(4)) +}, function(e, t, n) { + (function(e, p) { + ! function(n, r) { + "use strict"; + if (!n.setImmediate) { + var i, o, t, a, e, s = 1, + c = {}, + l = !1, + u = n.document, + f = Object.getPrototypeOf && Object.getPrototypeOf(n); + f = f && f.setTimeout ? f : n, i = "[object process]" === {}.toString.call(n.process) ? function(e) { + p.nextTick(function() { + h(e) + }) + } : function() { + if (n.postMessage && !n.importScripts) { + var e = !0, + t = n.onmessage; + return n.onmessage = function() { + e = !1 + }, n.postMessage("", "*"), n.onmessage = t, e + } + }() ? (a = "setImmediate$" + Math.random() + "$", e = function(e) { + e.source === n && "string" == typeof e.data && 0 === e.data.indexOf(a) && h(+e.data.slice(a.length)) + }, n.addEventListener ? n.addEventListener("message", e, !1) : n.attachEvent("onmessage", e), function(e) { + n.postMessage(a + e, "*") + }) : n.MessageChannel ? ((t = new MessageChannel).port1.onmessage = function(e) { + h(e.data) + }, function(e) { + t.port2.postMessage(e) + }) : u && "onreadystatechange" in u.createElement("script") ? (o = u.documentElement, function(e) { + var t = u.createElement("script"); + t.onreadystatechange = function() { + h(e), t.onreadystatechange = null, o.removeChild(t), t = null + }, o.appendChild(t) + }) : function(e) { + setTimeout(h, 0, e) + }, f.setImmediate = function(e) { + "function" != typeof e && (e = new Function("" + e)); + for (var t = new Array(arguments.length - 1), n = 0; n < t.length; n++) t[n] = arguments[n + 1]; + var r = { + callback: e, + args: t + }; + return c[s] = r, i(s), s++ + }, f.clearImmediate = d + } + + function d(e) { + delete c[e] + } + + function h(e) { + if (l) setTimeout(h, 0, e); + else { + var t = c[e]; + if (t) { + l = !0; + try { + ! function(e) { + var t = e.callback, + n = e.args; + switch (n.length) { + case 0: + t(); + break; + case 1: + t(n[0]); + break; + case 2: + t(n[0], n[1]); + break; + case 3: + t(n[0], n[1], n[2]); + break; + default: + t.apply(r, n) + } + }(t) + } finally { + d(e), l = !1 + } + } + } + } + }("undefined" == typeof self ? void 0 === e ? this : e : self) + }).call(this, n(4), n(23)) +}, function(e, t) { + var n, r, i = e.exports = {}; + + function o() { + throw new Error("setTimeout has not been defined") + } + + function a() { + throw new Error("clearTimeout has not been defined") + } + + function s(t) { + if (n === setTimeout) return setTimeout(t, 0); + if ((n === o || !n) && setTimeout) return n = setTimeout, setTimeout(t, 0); + try { + return n(t, 0) + } catch (e) { + try { + return n.call(null, t, 0) + } catch (e) { + return n.call(this, t, 0) + } + } + }! function() { + try { + n = "function" == typeof setTimeout ? setTimeout : o + } catch (e) { + n = o + } + try { + r = "function" == typeof clearTimeout ? clearTimeout : a + } catch (e) { + r = a + } + }(); + var c, l = [], + u = !1, + f = -1; + + function d() { + u && c && (u = !1, c.length ? l = c.concat(l) : f = -1, l.length && h()) + } + + function h() { + if (!u) { + var e = s(d); + u = !0; + for (var t = l.length; t;) { + for (c = l, l = []; ++f < t;) c && c[f].run(); + f = -1, t = l.length + } + c = null, u = !1, + function(t) { + if (r === clearTimeout) return clearTimeout(t); + if ((r === a || !r) && clearTimeout) return r = clearTimeout, clearTimeout(t); + try { + r(t) + } catch (e) { + try { + return r.call(null, t) + } catch (e) { + return r.call(this, t) + } + } + }(e) + } + } + + function p(e, t) { + this.fun = e, this.array = t + } + + function m() {} + i.nextTick = function(e) { + var t = new Array(arguments.length - 1); + if (1 < arguments.length) + for (var n = 1; n < arguments.length; n++) t[n - 1] = arguments[n]; + l.push(new p(e, t)), 1 !== l.length || u || s(h) + }, p.prototype.run = function() { + this.fun.apply(null, this.array) + }, i.title = "browser", i.browser = !0, i.env = {}, i.argv = [], i.version = "", i.versions = {}, i.on = m, i.addListener = m, i.once = m, i.off = m, i.removeListener = m, i.removeAllListeners = m, i.emit = m, i.prependListener = m, i.prependOnceListener = m, i.listeners = function(e) { + return [] + }, i.binding = function(e) { + throw new Error("process.binding is not supported") + }, i.cwd = function() { + return "/" + }, i.chdir = function(e) { + throw new Error("process.chdir is not supported") + }, i.umask = function() { + return 0 + } +}, function(i, o, a) { + var s, c; + /** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.6 + * Copyright (C) 2019 Oliver Nightingale + * @license MIT + */ + ! function() { + var t, l, u, e, n, f, d, h, p, m, y, v, g, w, _, E, x, b, k, S, T, L, R, O, C, r, D = function(e) { + var t = new D.Builder; + return t.pipeline.add(D.trimmer, D.stopWordFilter, D.stemmer), t.searchPipeline.add(D.stemmer), e.call(t, t), t.build() + }; + D.version = "2.3.6", D.utils = {}, D.utils.warn = (t = this, function(e) { + t.console && console.warn && console.warn(e) + }), D.utils.asString = function(e) { + return null == e ? "" : e.toString() + }, D.utils.clone = function(e) { + if (null == e) return e; + for (var t = Object.create(null), n = Object.keys(e), r = 0; r < n.length; r++) { + var i = n[r], + o = e[i]; + if (Array.isArray(o)) t[i] = o.slice(); + else { + if ("string" != typeof o && "number" != typeof o && "boolean" != typeof o) throw new TypeError("clone is not deep and does not support nested objects"); + t[i] = o + } + } + return t + }, D.FieldRef = function(e, t, n) { + this.docRef = e, this.fieldName = t, this._stringValue = n + }, D.FieldRef.joiner = "/", D.FieldRef.fromString = function(e) { + var t = e.indexOf(D.FieldRef.joiner); + if (-1 === t) throw "malformed field ref string"; + var n = e.slice(0, t), + r = e.slice(t + 1); + return new D.FieldRef(r, n, e) + }, D.FieldRef.prototype.toString = function() { + return null == this._stringValue && (this._stringValue = this.fieldName + D.FieldRef.joiner + this.docRef), this._stringValue + }, D.Set = function(e) { + if (this.elements = Object.create(null), e) { + this.length = e.length; + for (var t = 0; t < this.length; t++) this.elements[e[t]] = !0 + } else this.length = 0 + }, D.Set.complete = { + intersect: function(e) { + return e + }, + union: function(e) { + return e + }, + contains: function() { + return !0 + } + }, D.Set.empty = { + intersect: function() { + return this + }, + union: function(e) { + return e + }, + contains: function() { + return !1 + } + }, D.Set.prototype.contains = function(e) { + return !!this.elements[e] + }, D.Set.prototype.intersect = function(e) { + var t, n, r, i = []; + if (e === D.Set.complete) return this; + if (e === D.Set.empty) return e; + n = this.length < e.length ? (t = this, e) : (t = e, this), r = Object.keys(t.elements); + for (var o = 0; o < r.length; o++) { + var a = r[o]; + a in n.elements && i.push(a) + } + return new D.Set(i) + }, D.Set.prototype.union = function(e) { + return e === D.Set.complete ? D.Set.complete : e === D.Set.empty ? this : new D.Set(Object.keys(this.elements).concat(Object.keys(e.elements))) + }, D.idf = function(e, t) { + var n = 0; + for (var r in e) "_index" != r && (n += Object.keys(e[r]).length); + var i = (t - n + .5) / (n + .5); + return Math.log(1 + Math.abs(i)) + }, D.Token = function(e, t) { + this.str = e || "", this.metadata = t || {} + }, D.Token.prototype.toString = function() { + return this.str + }, D.Token.prototype.update = function(e) { + return this.str = e(this.str, this.metadata), this + }, D.Token.prototype.clone = function(e) { + return e = e || function(e) { + return e + }, new D.Token(e(this.str, this.metadata), this.metadata) + }, D.tokenizer = function(e, t) { + if (null == e || null == e) return []; + if (Array.isArray(e)) return e.map(function(e) { + return new D.Token(D.utils.asString(e).toLowerCase(), D.utils.clone(t)) + }); + for (var n = e.toString().trim().toLowerCase(), r = n.length, i = [], o = 0, a = 0; o <= r; o++) { + var s = o - a; + if (n.charAt(o).match(D.tokenizer.separator) || o == r) { + if (0 < s) { + var c = D.utils.clone(t) || {}; + c.position = [a, s], c.index = i.length, i.push(new D.Token(n.slice(a, o), c)) + } + a = o + 1 + } + } + return i + }, D.tokenizer.separator = /[\s\-]+/, D.Pipeline = function() { + this._stack = [] + }, D.Pipeline.registeredFunctions = Object.create(null), D.Pipeline.registerFunction = function(e, t) { + t in this.registeredFunctions && D.utils.warn("Overwriting existing registered function: " + t), e.label = t, D.Pipeline.registeredFunctions[e.label] = e + }, D.Pipeline.warnIfFunctionNotRegistered = function(e) { + e.label && e.label in this.registeredFunctions || D.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n", e) + }, D.Pipeline.load = function(e) { + var n = new D.Pipeline; + return e.forEach(function(e) { + var t = D.Pipeline.registeredFunctions[e]; + if (!t) throw new Error("Cannot load unregistered function: " + e); + n.add(t) + }), n + }, D.Pipeline.prototype.add = function() { + Array.prototype.slice.call(arguments).forEach(function(e) { + D.Pipeline.warnIfFunctionNotRegistered(e), this._stack.push(e) + }, this) + }, D.Pipeline.prototype.after = function(e, t) { + D.Pipeline.warnIfFunctionNotRegistered(t); + var n = this._stack.indexOf(e); + if (-1 == n) throw new Error("Cannot find existingFn"); + n += 1, this._stack.splice(n, 0, t) + }, D.Pipeline.prototype.before = function(e, t) { + D.Pipeline.warnIfFunctionNotRegistered(t); + var n = this._stack.indexOf(e); + if (-1 == n) throw new Error("Cannot find existingFn"); + this._stack.splice(n, 0, t) + }, D.Pipeline.prototype.remove = function(e) { + var t = this._stack.indexOf(e); - 1 != t && this._stack.splice(t, 1) + }, D.Pipeline.prototype.run = function(e) { + for (var t = this._stack.length, n = 0; n < t; n++) { + for (var r = this._stack[n], i = [], o = 0; o < e.length; o++) { + var a = r(e[o], o, e); + if (void 0 !== a && "" !== a) + if (Array.isArray(a)) + for (var s = 0; s < a.length; s++) i.push(a[s]); + else i.push(a) + } + e = i + } + return e + }, D.Pipeline.prototype.runString = function(e, t) { + var n = new D.Token(e, t); + return this.run([n]).map(function(e) { + return e.toString() + }) + }, D.Pipeline.prototype.reset = function() { + this._stack = [] + }, D.Pipeline.prototype.toJSON = function() { + return this._stack.map(function(e) { + return D.Pipeline.warnIfFunctionNotRegistered(e), e.label + }) + }, D.Vector = function(e) { + this._magnitude = 0, this.elements = e || [] + }, D.Vector.prototype.positionForIndex = function(e) { + if (0 == this.elements.length) return 0; + for (var t = 0, n = this.elements.length / 2, r = n - t, i = Math.floor(r / 2), o = this.elements[2 * i]; 1 < r && (o < e && (t = i), e < o && (n = i), o != e);) r = n - t, i = t + Math.floor(r / 2), o = this.elements[2 * i]; + return o == e ? 2 * i : e < o ? 2 * i : o < e ? 2 * (i + 1) : void 0 + }, D.Vector.prototype.insert = function(e, t) { + this.upsert(e, t, function() { + throw "duplicate index" + }) + }, D.Vector.prototype.upsert = function(e, t, n) { + this._magnitude = 0; + var r = this.positionForIndex(e); + this.elements[r] == e ? this.elements[r + 1] = n(this.elements[r + 1], t) : this.elements.splice(r, 0, e, t) + }, D.Vector.prototype.magnitude = function() { + if (this._magnitude) return this._magnitude; + for (var e = 0, t = this.elements.length, n = 1; n < t; n += 2) { + var r = this.elements[n]; + e += r * r + } + return this._magnitude = Math.sqrt(e) + }, D.Vector.prototype.dot = function(e) { + for (var t = 0, n = this.elements, r = e.elements, i = n.length, o = r.length, a = 0, s = 0, c = 0, l = 0; c < i && l < o;)(a = n[c]) < (s = r[l]) ? c += 2 : s < a ? l += 2 : a == s && (t += n[c + 1] * r[l + 1], c += 2, l += 2); + return t + }, D.Vector.prototype.similarity = function(e) { + return this.dot(e) / this.magnitude() || 0 + }, D.Vector.prototype.toArray = function() { + for (var e = new Array(this.elements.length / 2), t = 1, n = 0; t < this.elements.length; t += 2, n++) e[n] = this.elements[t]; + return e + }, D.Vector.prototype.toJSON = function() { + return this.elements + }, D.stemmer = (l = { + ational: "ate", + tional: "tion", + enci: "ence", + anci: "ance", + izer: "ize", + bli: "ble", + alli: "al", + entli: "ent", + eli: "e", + ousli: "ous", + ization: "ize", + ation: "ate", + ator: "ate", + alism: "al", + iveness: "ive", + fulness: "ful", + ousness: "ous", + aliti: "al", + iviti: "ive", + biliti: "ble", + logi: "log" + }, u = { + icate: "ic", + ative: "", + alize: "al", + iciti: "ic", + ical: "ic", + ful: "", + ness: "" + }, e = "[aeiouy]", n = "[^aeiou][^aeiouy]*", f = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*"), d = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*[aeiouy][aeiou]*[^aeiou][^aeiouy]*"), h = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*([aeiouy][aeiou]*)?$"), p = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy]"), m = /^(.+?)(ss|i)es$/, y = /^(.+?)([^s])s$/, v = /^(.+?)eed$/, g = /^(.+?)(ed|ing)$/, w = /.$/, _ = /(at|bl|iz)$/, E = new RegExp("([^aeiouylsz])\\1$"), x = new RegExp("^" + n + e + "[^aeiouwxy]$"), b = /^(.+?[^aeiou])y$/, k = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/, S = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/, T = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/, L = /^(.+?)(s|t)(ion)$/, R = /^(.+?)e$/, O = /ll$/, C = new RegExp("^" + n + e + "[^aeiouwxy]$"), r = function(e) { + var t, n, r, i, o, a, s; + if (e.length < 3) return e; + if ("y" == (r = e.substr(0, 1)) && (e = r.toUpperCase() + e.substr(1)), o = y, (i = m).test(e) ? e = e.replace(i, "$1$2") : o.test(e) && (e = e.replace(o, "$1$2")), o = g, (i = v).test(e)) { + var c = i.exec(e); + (i = f).test(c[1]) && (i = w, e = e.replace(i, "")) + } else if (o.test(e)) { + t = (c = o.exec(e))[1], (o = p).test(t) && (a = E, s = x, (o = _).test(e = t) ? e += "e" : a.test(e) ? (i = w, e = e.replace(i, "")) : s.test(e) && (e += "e")) + }(i = b).test(e) && (e = (t = (c = i.exec(e))[1]) + "i"); + (i = k).test(e) && (t = (c = i.exec(e))[1], n = c[2], (i = f).test(t) && (e = t + l[n])); + (i = S).test(e) && (t = (c = i.exec(e))[1], n = c[2], (i = f).test(t) && (e = t + u[n])); + if (o = L, (i = T).test(e)) t = (c = i.exec(e))[1], (i = d).test(t) && (e = t); + else if (o.test(e)) { + t = (c = o.exec(e))[1] + c[2], (o = d).test(t) && (e = t) + }(i = R).test(e) && (t = (c = i.exec(e))[1], o = h, a = C, ((i = d).test(t) || o.test(t) && !a.test(t)) && (e = t)); + return o = d, (i = O).test(e) && o.test(e) && (i = w, e = e.replace(i, "")), "y" == r && (e = r.toLowerCase() + e.substr(1)), e + }, function(e) { + return e.update(r) + }), D.Pipeline.registerFunction(D.stemmer, "stemmer"), D.generateStopWordFilter = function(e) { + var t = e.reduce(function(e, t) { + return e[t] = t, e + }, {}); + return function(e) { + if (e && t[e.toString()] !== e.toString()) return e + } + }, D.stopWordFilter = D.generateStopWordFilter(["a", "able", "about", "across", "after", "all", "almost", "also", "am", "among", "an", "and", "any", "are", "as", "at", "be", "because", "been", "but", "by", "can", "cannot", "could", "dear", "did", "do", "does", "either", "else", "ever", "every", "for", "from", "get", "got", "had", "has", "have", "he", "her", "hers", "him", "his", "how", "however", "i", "if", "in", "into", "is", "it", "its", "just", "least", "let", "like", "likely", "may", "me", "might", "most", "must", "my", "neither", "no", "nor", "not", "of", "off", "often", "on", "only", "or", "other", "our", "own", "rather", "said", "say", "says", "she", "should", "since", "so", "some", "than", "that", "the", "their", "them", "then", "there", "these", "they", "this", "tis", "to", "too", "twas", "us", "wants", "was", "we", "were", "what", "when", "where", "which", "while", "who", "whom", "why", "will", "with", "would", "yet", "you", "your"]), D.Pipeline.registerFunction(D.stopWordFilter, "stopWordFilter"), D.trimmer = function(e) { + return e.update(function(e) { + return e.replace(/^\W+/, "").replace(/\W+$/, "") + }) + }, D.Pipeline.registerFunction(D.trimmer, "trimmer"), D.TokenSet = function() { + this.final = !1, this.edges = {}, this.id = D.TokenSet._nextId, D.TokenSet._nextId += 1 + }, D.TokenSet._nextId = 1, D.TokenSet.fromArray = function(e) { + for (var t = new D.TokenSet.Builder, n = 0, r = e.length; n < r; n++) t.insert(e[n]); + return t.finish(), t.root + }, D.TokenSet.fromClause = function(e) { + return "editDistance" in e ? D.TokenSet.fromFuzzyString(e.term, e.editDistance) : D.TokenSet.fromString(e.term) + }, D.TokenSet.fromFuzzyString = function(e, t) { + for (var n = new D.TokenSet, r = [{ + node: n, + editsRemaining: t, + str: e + }]; r.length;) { + var i = r.pop(); + if (0 < i.str.length) { + var o, a = i.str.charAt(0); + a in i.node.edges ? o = i.node.edges[a] : (o = new D.TokenSet, i.node.edges[a] = o), 1 == i.str.length && (o.final = !0), r.push({ + node: o, + editsRemaining: i.editsRemaining, + str: i.str.slice(1) + }) + } + if (0 != i.editsRemaining) { + if ("*" in i.node.edges) var s = i.node.edges["*"]; + else { + s = new D.TokenSet; + i.node.edges["*"] = s + } + if (0 == i.str.length && (s.final = !0), r.push({ + node: s, + editsRemaining: i.editsRemaining - 1, + str: i.str + }), 1 < i.str.length && r.push({ + node: i.node, + editsRemaining: i.editsRemaining - 1, + str: i.str.slice(1) + }), 1 == i.str.length && (i.node.final = !0), 1 <= i.str.length) { + if ("*" in i.node.edges) var c = i.node.edges["*"]; + else { + c = new D.TokenSet; + i.node.edges["*"] = c + } + 1 == i.str.length && (c.final = !0), r.push({ + node: c, + editsRemaining: i.editsRemaining - 1, + str: i.str.slice(1) + }) + } + if (1 < i.str.length) { + var l, u = i.str.charAt(0), + f = i.str.charAt(1); + f in i.node.edges ? l = i.node.edges[f] : (l = new D.TokenSet, i.node.edges[f] = l), 1 == i.str.length && (l.final = !0), r.push({ + node: l, + editsRemaining: i.editsRemaining - 1, + str: u + i.str.slice(2) + }) + } + } + } + return n + }, D.TokenSet.fromString = function(e) { + for (var t = new D.TokenSet, n = t, r = 0, i = e.length; r < i; r++) { + var o = e[r], + a = r == i - 1; + if ("*" == o)(t.edges[o] = t).final = a; + else { + var s = new D.TokenSet; + s.final = a, t.edges[o] = s, t = s + } + } + return n + }, D.TokenSet.prototype.toArray = function() { + for (var e = [], t = [{ + prefix: "", + node: this + }]; t.length;) { + var n = t.pop(), + r = Object.keys(n.node.edges), + i = r.length; + n.node.final && (n.prefix.charAt(0), e.push(n.prefix)); + for (var o = 0; o < i; o++) { + var a = r[o]; + t.push({ + prefix: n.prefix.concat(a), + node: n.node.edges[a] + }) + } + } + return e + }, D.TokenSet.prototype.toString = function() { + if (this._str) return this._str; + for (var e = this.final ? "1" : "0", t = Object.keys(this.edges).sort(), n = t.length, r = 0; r < n; r++) { + var i = t[r]; + e = e + i + this.edges[i].id + } + return e + }, D.TokenSet.prototype.intersect = function(e) { + for (var t = new D.TokenSet, n = void 0, r = [{ + qNode: e, + output: t, + node: this + }]; r.length;) { + n = r.pop(); + for (var i = Object.keys(n.qNode.edges), o = i.length, a = Object.keys(n.node.edges), s = a.length, c = 0; c < o; c++) + for (var l = i[c], u = 0; u < s; u++) { + var f = a[u]; + if (f == l || "*" == l) { + var d = n.node.edges[f], + h = n.qNode.edges[l], + p = d.final && h.final, + m = void 0; + f in n.output.edges ? (m = n.output.edges[f]).final = m.final || p : ((m = new D.TokenSet).final = p, n.output.edges[f] = m), r.push({ + qNode: h, + output: m, + node: d + }) + } + } + } + return t + }, D.TokenSet.Builder = function() { + this.previousWord = "", this.root = new D.TokenSet, this.uncheckedNodes = [], this.minimizedNodes = {} + }, D.TokenSet.Builder.prototype.insert = function(e) { + var t, n = 0; + if (e < this.previousWord) throw new Error("Out of order word insertion"); + for (var r = 0; r < e.length && r < this.previousWord.length && e[r] == this.previousWord[r]; r++) n++; + this.minimize(n), t = 0 == this.uncheckedNodes.length ? this.root : this.uncheckedNodes[this.uncheckedNodes.length - 1].child; + for (r = n; r < e.length; r++) { + var i = new D.TokenSet, + o = e[r]; + t.edges[o] = i, this.uncheckedNodes.push({ + parent: t, + char: o, + child: i + }), t = i + } + t.final = !0, this.previousWord = e + }, D.TokenSet.Builder.prototype.finish = function() { + this.minimize(0) + }, D.TokenSet.Builder.prototype.minimize = function(e) { + for (var t = this.uncheckedNodes.length - 1; e <= t; t--) { + var n = this.uncheckedNodes[t], + r = n.child.toString(); + r in this.minimizedNodes ? n.parent.edges[n.char] = this.minimizedNodes[r] : (n.child._str = r, this.minimizedNodes[r] = n.child), this.uncheckedNodes.pop() + } + }, D.Index = function(e) { + this.invertedIndex = e.invertedIndex, this.fieldVectors = e.fieldVectors, this.tokenSet = e.tokenSet, this.fields = e.fields, this.pipeline = e.pipeline + }, D.Index.prototype.search = function(t) { + return this.query(function(e) { + new D.QueryParser(t, e).parse() + }) + }, D.Index.prototype.query = function(e) { + for (var t = new D.Query(this.fields), n = Object.create(null), r = Object.create(null), i = Object.create(null), o = Object.create(null), a = Object.create(null), s = 0; s < this.fields.length; s++) r[this.fields[s]] = new D.Vector; + e.call(t, t); + for (s = 0; s < t.clauses.length; s++) { + var c = t.clauses[s], + l = null, + u = D.Set.complete; + l = c.usePipeline ? this.pipeline.runString(c.term, { + fields: c.fields + }) : [c.term]; + for (var f = 0; f < l.length; f++) { + var d = l[f]; + c.term = d; + var h = D.TokenSet.fromClause(c), + p = this.tokenSet.intersect(h).toArray(); + if (0 === p.length && c.presence === D.Query.presence.REQUIRED) { + for (var m = 0; m < c.fields.length; m++) { + o[Q = c.fields[m]] = D.Set.empty + } + break + } + for (var y = 0; y < p.length; y++) { + var v = p[y], + g = this.invertedIndex[v], + w = g._index; + for (m = 0; m < c.fields.length; m++) { + var _ = g[Q = c.fields[m]], + E = Object.keys(_), + x = v + "/" + Q, + b = new D.Set(E); + if (c.presence == D.Query.presence.REQUIRED && (u = u.union(b), void 0 === o[Q] && (o[Q] = D.Set.complete)), c.presence != D.Query.presence.PROHIBITED) { + if (r[Q].upsert(w, c.boost, function(e, t) { + return e + t + }), !i[x]) { + for (var k = 0; k < E.length; k++) { + var S, T = E[k], + L = new D.FieldRef(T, Q), + R = _[T]; + void 0 === (S = n[L]) ? n[L] = new D.MatchData(v, Q, R) : S.add(v, Q, R) + } + i[x] = !0 + } + } else void 0 === a[Q] && (a[Q] = D.Set.empty), a[Q] = a[Q].union(b) + } + } + } + if (c.presence === D.Query.presence.REQUIRED) + for (m = 0; m < c.fields.length; m++) { + o[Q = c.fields[m]] = o[Q].intersect(u) + } + } + var O = D.Set.complete, + C = D.Set.empty; + for (s = 0; s < this.fields.length; s++) { + var Q; + o[Q = this.fields[s]] && (O = O.intersect(o[Q])), a[Q] && (C = C.union(a[Q])) + } + var P = Object.keys(n), + A = [], + I = Object.create(null); + if (t.isNegated()) { + P = Object.keys(this.fieldVectors); + for (s = 0; s < P.length; s++) { + L = P[s]; + var M = D.FieldRef.fromString(L); + n[L] = new D.MatchData + } + } + for (s = 0; s < P.length; s++) { + var N = (M = D.FieldRef.fromString(P[s])).docRef; + if (O.contains(N) && !C.contains(N)) { + var j, F = this.fieldVectors[M], + H = r[M.fieldName].similarity(F); + if (void 0 !== (j = I[N])) j.score += H, j.matchData.combine(n[M]); + else { + var q = { + ref: N, + score: H, + matchData: n[M] + }; + I[N] = q, A.push(q) + } + } + } + return A.sort(function(e, t) { + return t.score - e.score + }) + }, D.Index.prototype.toJSON = function() { + var e = Object.keys(this.invertedIndex).sort().map(function(e) { + return [e, this.invertedIndex[e]] + }, this), + t = Object.keys(this.fieldVectors).map(function(e) { + return [e, this.fieldVectors[e].toJSON()] + }, this); + return { + version: D.version, + fields: this.fields, + fieldVectors: t, + invertedIndex: e, + pipeline: this.pipeline.toJSON() + } + }, D.Index.load = function(e) { + var t = {}, + n = {}, + r = e.fieldVectors, + i = Object.create(null), + o = e.invertedIndex, + a = new D.TokenSet.Builder, + s = D.Pipeline.load(e.pipeline); + e.version != D.version && D.utils.warn("Version mismatch when loading serialised index. Current version of lunr '" + D.version + "' does not match serialized index '" + e.version + "'"); + for (var c = 0; c < r.length; c++) { + var l = (f = r[c])[0], + u = f[1]; + n[l] = new D.Vector(u) + } + for (c = 0; c < o.length; c++) { + var f, d = (f = o[c])[0], + h = f[1]; + a.insert(d), i[d] = h + } + return a.finish(), t.fields = e.fields, t.fieldVectors = n, t.invertedIndex = i, t.tokenSet = a.root, t.pipeline = s, new D.Index(t) + }, D.Builder = function() { + this._ref = "id", this._fields = Object.create(null), this._documents = Object.create(null), this.invertedIndex = Object.create(null), this.fieldTermFrequencies = {}, this.fieldLengths = {}, this.tokenizer = D.tokenizer, this.pipeline = new D.Pipeline, this.searchPipeline = new D.Pipeline, this.documentCount = 0, this._b = .75, this._k1 = 1.2, this.termIndex = 0, this.metadataWhitelist = [] + }, D.Builder.prototype.ref = function(e) { + this._ref = e + }, D.Builder.prototype.field = function(e, t) { + if (/\//.test(e)) throw new RangeError("Field '" + e + "' contains illegal character '/'"); + this._fields[e] = t || {} + }, D.Builder.prototype.b = function(e) { + this._b = e < 0 ? 0 : 1 < e ? 1 : e + }, D.Builder.prototype.k1 = function(e) { + this._k1 = e + }, D.Builder.prototype.add = function(e, t) { + var n = e[this._ref], + r = Object.keys(this._fields); + this._documents[n] = t || {}, this.documentCount += 1; + for (var i = 0; i < r.length; i++) { + var o = r[i], + a = this._fields[o].extractor, + s = a ? a(e) : e[o], + c = this.tokenizer(s, { + fields: [o] + }), + l = this.pipeline.run(c), + u = new D.FieldRef(n, o), + f = Object.create(null); + this.fieldTermFrequencies[u] = f, this.fieldLengths[u] = 0, this.fieldLengths[u] += l.length; + for (var d = 0; d < l.length; d++) { + var h = l[d]; + if (null == f[h] && (f[h] = 0), f[h] += 1, null == this.invertedIndex[h]) { + var p = Object.create(null); + p._index = this.termIndex, this.termIndex += 1; + for (var m = 0; m < r.length; m++) p[r[m]] = Object.create(null); + this.invertedIndex[h] = p + } + null == this.invertedIndex[h][o][n] && (this.invertedIndex[h][o][n] = Object.create(null)); + for (var y = 0; y < this.metadataWhitelist.length; y++) { + var v = this.metadataWhitelist[y], + g = h.metadata[v]; + null == this.invertedIndex[h][o][n][v] && (this.invertedIndex[h][o][n][v] = []), this.invertedIndex[h][o][n][v].push(g) + } + } + } + }, D.Builder.prototype.calculateAverageFieldLengths = function() { + for (var e = Object.keys(this.fieldLengths), t = e.length, n = {}, r = {}, i = 0; i < t; i++) { + var o = D.FieldRef.fromString(e[i]), + a = o.fieldName; + r[a] || (r[a] = 0), r[a] += 1, n[a] || (n[a] = 0), n[a] += this.fieldLengths[o] + } + var s = Object.keys(this._fields); + for (i = 0; i < s.length; i++) { + var c = s[i]; + n[c] = n[c] / r[c] + } + this.averageFieldLength = n + }, D.Builder.prototype.createFieldVectors = function() { + for (var e = {}, t = Object.keys(this.fieldTermFrequencies), n = t.length, r = Object.create(null), i = 0; i < n; i++) { + for (var o = D.FieldRef.fromString(t[i]), a = o.fieldName, s = this.fieldLengths[o], c = new D.Vector, l = this.fieldTermFrequencies[o], u = Object.keys(l), f = u.length, d = this._fields[a].boost || 1, h = this._documents[o.docRef].boost || 1, p = 0; p < f; p++) { + var m, y, v, g = u[p], + w = l[g], + _ = this.invertedIndex[g]._index; + void 0 === r[g] ? (m = D.idf(this.invertedIndex[g], this.documentCount), r[g] = m) : m = r[g], y = m * ((this._k1 + 1) * w) / (this._k1 * (1 - this._b + this._b * (s / this.averageFieldLength[a])) + w), y *= d, y *= h, v = Math.round(1e3 * y) / 1e3, c.insert(_, v) + } + e[o] = c + } + this.fieldVectors = e + }, D.Builder.prototype.createTokenSet = function() { + this.tokenSet = D.TokenSet.fromArray(Object.keys(this.invertedIndex).sort()) + }, D.Builder.prototype.build = function() { + return this.calculateAverageFieldLengths(), this.createFieldVectors(), this.createTokenSet(), new D.Index({ + invertedIndex: this.invertedIndex, + fieldVectors: this.fieldVectors, + tokenSet: this.tokenSet, + fields: Object.keys(this._fields), + pipeline: this.searchPipeline + }) + }, D.Builder.prototype.use = function(e) { + var t = Array.prototype.slice.call(arguments, 1); + t.unshift(this), e.apply(this, t) + }, D.MatchData = function(e, t, n) { + for (var r = Object.create(null), i = Object.keys(n || {}), o = 0; o < i.length; o++) { + var a = i[o]; + r[a] = n[a].slice() + } + this.metadata = Object.create(null), void 0 !== e && (this.metadata[e] = Object.create(null), this.metadata[e][t] = r) + }, D.MatchData.prototype.combine = function(e) { + for (var t = Object.keys(e.metadata), n = 0; n < t.length; n++) { + var r = t[n], + i = Object.keys(e.metadata[r]); + null == this.metadata[r] && (this.metadata[r] = Object.create(null)); + for (var o = 0; o < i.length; o++) { + var a = i[o], + s = Object.keys(e.metadata[r][a]); + null == this.metadata[r][a] && (this.metadata[r][a] = Object.create(null)); + for (var c = 0; c < s.length; c++) { + var l = s[c]; + null == this.metadata[r][a][l] ? this.metadata[r][a][l] = e.metadata[r][a][l] : this.metadata[r][a][l] = this.metadata[r][a][l].concat(e.metadata[r][a][l]) + } + } + } + }, D.MatchData.prototype.add = function(e, t, n) { + if (!(e in this.metadata)) return this.metadata[e] = Object.create(null), void(this.metadata[e][t] = n); + if (t in this.metadata[e]) + for (var r = Object.keys(n), i = 0; i < r.length; i++) { + var o = r[i]; + o in this.metadata[e][t] ? this.metadata[e][t][o] = this.metadata[e][t][o].concat(n[o]) : this.metadata[e][t][o] = n[o] + } else this.metadata[e][t] = n + }, D.Query = function(e) { + this.clauses = [], this.allFields = e + }, D.Query.wildcard = new String("*"), D.Query.wildcard.NONE = 0, D.Query.wildcard.LEADING = 1, D.Query.wildcard.TRAILING = 2, D.Query.presence = { + OPTIONAL: 1, + REQUIRED: 2, + PROHIBITED: 3 + }, D.Query.prototype.clause = function(e) { + return "fields" in e || (e.fields = this.allFields), "boost" in e || (e.boost = 1), "usePipeline" in e || (e.usePipeline = !0), "wildcard" in e || (e.wildcard = D.Query.wildcard.NONE), e.wildcard & D.Query.wildcard.LEADING && e.term.charAt(0) != D.Query.wildcard && (e.term = "*" + e.term), e.wildcard & D.Query.wildcard.TRAILING && e.term.slice(-1) != D.Query.wildcard && (e.term = e.term + "*"), "presence" in e || (e.presence = D.Query.presence.OPTIONAL), this.clauses.push(e), this + }, D.Query.prototype.isNegated = function() { + for (var e = 0; e < this.clauses.length; e++) + if (this.clauses[e].presence != D.Query.presence.PROHIBITED) return !1; + return !0 + }, D.Query.prototype.term = function(e, t) { + if (Array.isArray(e)) return e.forEach(function(e) { + this.term(e, D.utils.clone(t)) + }, this), this; + var n = t || {}; + return n.term = e.toString(), this.clause(n), this + }, D.QueryParseError = function(e, t, n) { + this.name = "QueryParseError", this.message = e, this.start = t, this.end = n + }, D.QueryParseError.prototype = new Error, D.QueryLexer = function(e) { + this.lexemes = [], this.str = e, this.length = e.length, this.pos = 0, this.start = 0, this.escapeCharPositions = [] + }, D.QueryLexer.prototype.run = function() { + for (var e = D.QueryLexer.lexText; e;) e = e(this) + }, D.QueryLexer.prototype.sliceString = function() { + for (var e = [], t = this.start, n = this.pos, r = 0; r < this.escapeCharPositions.length; r++) n = this.escapeCharPositions[r], e.push(this.str.slice(t, n)), t = n + 1; + return e.push(this.str.slice(t, this.pos)), this.escapeCharPositions.length = 0, e.join("") + }, D.QueryLexer.prototype.emit = function(e) { + this.lexemes.push({ + type: e, + str: this.sliceString(), + start: this.start, + end: this.pos + }), this.start = this.pos + }, D.QueryLexer.prototype.escapeCharacter = function() { + this.escapeCharPositions.push(this.pos - 1), this.pos += 1 + }, D.QueryLexer.prototype.next = function() { + if (this.pos >= this.length) return D.QueryLexer.EOS; + var e = this.str.charAt(this.pos); + return this.pos += 1, e + }, D.QueryLexer.prototype.width = function() { + return this.pos - this.start + }, D.QueryLexer.prototype.ignore = function() { + this.start == this.pos && (this.pos += 1), this.start = this.pos + }, D.QueryLexer.prototype.backup = function() { + this.pos -= 1 + }, D.QueryLexer.prototype.acceptDigitRun = function() { + for (var e, t; 47 < (t = (e = this.next()).charCodeAt(0)) && t < 58;); + e != D.QueryLexer.EOS && this.backup() + }, D.QueryLexer.prototype.more = function() { + return this.pos < this.length + }, D.QueryLexer.EOS = "EOS", D.QueryLexer.FIELD = "FIELD", D.QueryLexer.TERM = "TERM", D.QueryLexer.EDIT_DISTANCE = "EDIT_DISTANCE", D.QueryLexer.BOOST = "BOOST", D.QueryLexer.PRESENCE = "PRESENCE", D.QueryLexer.lexField = function(e) { + return e.backup(), e.emit(D.QueryLexer.FIELD), e.ignore(), D.QueryLexer.lexText + }, D.QueryLexer.lexTerm = function(e) { + if (1 < e.width() && (e.backup(), e.emit(D.QueryLexer.TERM)), e.ignore(), e.more()) return D.QueryLexer.lexText + }, D.QueryLexer.lexEditDistance = function(e) { + return e.ignore(), e.acceptDigitRun(), e.emit(D.QueryLexer.EDIT_DISTANCE), D.QueryLexer.lexText + }, D.QueryLexer.lexBoost = function(e) { + return e.ignore(), e.acceptDigitRun(), e.emit(D.QueryLexer.BOOST), D.QueryLexer.lexText + }, D.QueryLexer.lexEOS = function(e) { + 0 < e.width() && e.emit(D.QueryLexer.TERM) + }, D.QueryLexer.termSeparator = D.tokenizer.separator, D.QueryLexer.lexText = function(e) { + for (;;) { + var t = e.next(); + if (t == D.QueryLexer.EOS) return D.QueryLexer.lexEOS; + if (92 != t.charCodeAt(0)) { + if (":" == t) return D.QueryLexer.lexField; + if ("~" == t) return e.backup(), 0 < e.width() && e.emit(D.QueryLexer.TERM), D.QueryLexer.lexEditDistance; + if ("^" == t) return e.backup(), 0 < e.width() && e.emit(D.QueryLexer.TERM), D.QueryLexer.lexBoost; + if ("+" == t && 1 === e.width()) return e.emit(D.QueryLexer.PRESENCE), D.QueryLexer.lexText; + if ("-" == t && 1 === e.width()) return e.emit(D.QueryLexer.PRESENCE), D.QueryLexer.lexText; + if (t.match(D.QueryLexer.termSeparator)) return D.QueryLexer.lexTerm + } else e.escapeCharacter() + } + }, D.QueryParser = function(e, t) { + this.lexer = new D.QueryLexer(e), this.query = t, this.currentClause = {}, this.lexemeIdx = 0 + }, D.QueryParser.prototype.parse = function() { + this.lexer.run(), this.lexemes = this.lexer.lexemes; + for (var e = D.QueryParser.parseClause; e;) e = e(this); + return this.query + }, D.QueryParser.prototype.peekLexeme = function() { + return this.lexemes[this.lexemeIdx] + }, D.QueryParser.prototype.consumeLexeme = function() { + var e = this.peekLexeme(); + return this.lexemeIdx += 1, e + }, D.QueryParser.prototype.nextClause = function() { + var e = this.currentClause; + this.query.clause(e), this.currentClause = {} + }, D.QueryParser.parseClause = function(e) { + var t = e.peekLexeme(); + if (null != t) switch (t.type) { + case D.QueryLexer.PRESENCE: + return D.QueryParser.parsePresence; + case D.QueryLexer.FIELD: + return D.QueryParser.parseField; + case D.QueryLexer.TERM: + return D.QueryParser.parseTerm; + default: + var n = "expected either a field or a term, found " + t.type; + throw 1 <= t.str.length && (n += " with value '" + t.str + "'"), new D.QueryParseError(n, t.start, t.end) + } + }, D.QueryParser.parsePresence = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + switch (t.str) { + case "-": + e.currentClause.presence = D.Query.presence.PROHIBITED; + break; + case "+": + e.currentClause.presence = D.Query.presence.REQUIRED; + break; + default: + var n = "unrecognised presence operator'" + t.str + "'"; + throw new D.QueryParseError(n, t.start, t.end) + } + var r = e.peekLexeme(); + if (null == r) { + n = "expecting term or field, found nothing"; + throw new D.QueryParseError(n, t.start, t.end) + } + switch (r.type) { + case D.QueryLexer.FIELD: + return D.QueryParser.parseField; + case D.QueryLexer.TERM: + return D.QueryParser.parseTerm; + default: + n = "expecting term or field, found '" + r.type + "'"; + throw new D.QueryParseError(n, r.start, r.end) + } + } + }, D.QueryParser.parseField = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + if (-1 == e.query.allFields.indexOf(t.str)) { + var n = e.query.allFields.map(function(e) { + return "'" + e + "'" + }).join(", "), + r = "unrecognised field '" + t.str + "', possible fields: " + n; + throw new D.QueryParseError(r, t.start, t.end) + } + e.currentClause.fields = [t.str]; + var i = e.peekLexeme(); + if (null == i) { + r = "expecting term, found nothing"; + throw new D.QueryParseError(r, t.start, t.end) + } + switch (i.type) { + case D.QueryLexer.TERM: + return D.QueryParser.parseTerm; + default: + r = "expecting term, found '" + i.type + "'"; + throw new D.QueryParseError(r, i.start, i.end) + } + } + }, D.QueryParser.parseTerm = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + e.currentClause.term = t.str.toLowerCase(), -1 != t.str.indexOf("*") && (e.currentClause.usePipeline = !1); + var n = e.peekLexeme(); + if (null != n) switch (n.type) { + case D.QueryLexer.TERM: + return e.nextClause(), D.QueryParser.parseTerm; + case D.QueryLexer.FIELD: + return e.nextClause(), D.QueryParser.parseField; + case D.QueryLexer.EDIT_DISTANCE: + return D.QueryParser.parseEditDistance; + case D.QueryLexer.BOOST: + return D.QueryParser.parseBoost; + case D.QueryLexer.PRESENCE: + return e.nextClause(), D.QueryParser.parsePresence; + default: + var r = "Unexpected lexeme type '" + n.type + "'"; + throw new D.QueryParseError(r, n.start, n.end) + } else e.nextClause() + } + }, D.QueryParser.parseEditDistance = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + var n = parseInt(t.str, 10); + if (isNaN(n)) { + var r = "edit distance must be numeric"; + throw new D.QueryParseError(r, t.start, t.end) + } + e.currentClause.editDistance = n; + var i = e.peekLexeme(); + if (null != i) switch (i.type) { + case D.QueryLexer.TERM: + return e.nextClause(), D.QueryParser.parseTerm; + case D.QueryLexer.FIELD: + return e.nextClause(), D.QueryParser.parseField; + case D.QueryLexer.EDIT_DISTANCE: + return D.QueryParser.parseEditDistance; + case D.QueryLexer.BOOST: + return D.QueryParser.parseBoost; + case D.QueryLexer.PRESENCE: + return e.nextClause(), D.QueryParser.parsePresence; + default: + r = "Unexpected lexeme type '" + i.type + "'"; + throw new D.QueryParseError(r, i.start, i.end) + } else e.nextClause() + } + }, D.QueryParser.parseBoost = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + var n = parseInt(t.str, 10); + if (isNaN(n)) { + var r = "boost must be numeric"; + throw new D.QueryParseError(r, t.start, t.end) + } + e.currentClause.boost = n; + var i = e.peekLexeme(); + if (null != i) switch (i.type) { + case D.QueryLexer.TERM: + return e.nextClause(), D.QueryParser.parseTerm; + case D.QueryLexer.FIELD: + return e.nextClause(), D.QueryParser.parseField; + case D.QueryLexer.EDIT_DISTANCE: + return D.QueryParser.parseEditDistance; + case D.QueryLexer.BOOST: + return D.QueryParser.parseBoost; + case D.QueryLexer.PRESENCE: + return e.nextClause(), D.QueryParser.parsePresence; + default: + r = "Unexpected lexeme type '" + i.type + "'"; + throw new D.QueryParseError(r, i.start, i.end) + } else e.nextClause() + } + }, void 0 === (c = "function" == typeof(s = function() { + return D + }) ? s.call(o, a, o, i) : s) || (i.exports = c) + }() +}])); \ No newline at end of file diff --git a/docs/v1.2.0/_static/javascripts/lunr/lunr.da.js b/docs/v1.2.0/_static/javascripts/lunr/lunr.da.js new file mode 100644 index 0000000000..34910dfe5f --- /dev/null +++ b/docs/v1.2.0/_static/javascripts/lunr/lunr.da.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,m,i;e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWordFilter,e.da.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.da.stemmer))},e.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.da.trimmer=e.trimmerSupport.generateTrimmer(e.da.wordCharacters),e.Pipeline.registerFunction(e.da.trimmer,"trimmer-da"),e.da.stemmer=(r=e.stemmerSupport.Among,m=e.stemmerSupport.SnowballProgram,i=new function(){var i,t,n,s=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],o=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],a=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],u=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],c=new m;function l(){var e,r=c.limit-c.cursor;c.cursor>=t&&(e=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,c.find_among_b(o,4)?(c.bra=c.cursor,c.limit_backward=e,c.cursor=c.limit-r,c.cursor>c.limit_backward&&(c.cursor--,c.bra=c.cursor,c.slice_del())):c.limit_backward=e)}this.setCurrent=function(e){c.setCurrent(e)},this.getCurrent=function(){return c.getCurrent()},this.stem=function(){var e,r=c.cursor;return function(){var e,r=c.cursor+3;if(t=c.limit,0<=r&&r<=c.limit){for(i=r;;){if(e=c.cursor,c.in_grouping(d,97,248)){c.cursor=e;break}if((c.cursor=e)>=c.limit)return;c.cursor++}for(;!c.out_grouping(d,97,248);){if(c.cursor>=c.limit)return;c.cursor++}(t=c.cursor)=t&&(r=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,e=c.find_among_b(s,32),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:c.in_grouping_b(u,97,229)&&c.slice_del()}}(),c.cursor=c.limit,l(),c.cursor=c.limit,function(){var e,r,i,n=c.limit-c.cursor;if(c.ket=c.cursor,c.eq_s_b(2,"st")&&(c.bra=c.cursor,c.eq_s_b(2,"ig")&&c.slice_del()),c.cursor=c.limit-n,c.cursor>=t&&(r=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,e=c.find_among_b(a,5),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del(),i=c.limit-c.cursor,l(),c.cursor=c.limit-i;break;case 2:c.slice_from("løs")}}(),c.cursor=c.limit,c.cursor>=t&&(e=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,c.out_grouping_b(d,97,248)?(c.bra=c.cursor,n=c.slice_to(n),c.limit_backward=e,c.eq_v_b(n)&&c.slice_del()):c.limit_backward=e),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}}); \ No newline at end of file diff --git a/docs/v1.2.0/_static/javascripts/lunr/lunr.de.js b/docs/v1.2.0/_static/javascripts/lunr/lunr.de.js new file mode 100644 index 0000000000..1529892c82 --- /dev/null +++ b/docs/v1.2.0/_static/javascripts/lunr/lunr.de.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var _,p,r;e.de=function(){this.pipeline.reset(),this.pipeline.add(e.de.trimmer,e.de.stopWordFilter,e.de.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.de.stemmer))},e.de.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.de.trimmer=e.trimmerSupport.generateTrimmer(e.de.wordCharacters),e.Pipeline.registerFunction(e.de.trimmer,"trimmer-de"),e.de.stemmer=(_=e.stemmerSupport.Among,p=e.stemmerSupport.SnowballProgram,r=new function(){var r,n,i,s=[new _("",-1,6),new _("U",0,2),new _("Y",0,1),new _("ä",0,3),new _("ö",0,4),new _("ü",0,5)],o=[new _("e",-1,2),new _("em",-1,1),new _("en",-1,2),new _("ern",-1,1),new _("er",-1,1),new _("s",-1,3),new _("es",5,2)],c=[new _("en",-1,1),new _("er",-1,1),new _("st",-1,2),new _("est",2,1)],u=[new _("ig",-1,1),new _("lich",-1,1)],a=[new _("end",-1,1),new _("ig",-1,2),new _("ung",-1,1),new _("lich",-1,3),new _("isch",-1,2),new _("ik",-1,2),new _("heit",-1,3),new _("keit",-1,4)],t=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32,8],d=[117,30,5],l=[117,30,4],m=new p;function h(e,r,n){return!(!m.eq_s(1,e)||(m.ket=m.cursor,!m.in_grouping(t,97,252)))&&(m.slice_from(r),m.cursor=n,!0)}function w(){for(;!m.in_grouping(t,97,252);){if(m.cursor>=m.limit)return!0;m.cursor++}for(;!m.out_grouping(t,97,252);){if(m.cursor>=m.limit)return!0;m.cursor++}return!1}function f(){return i<=m.cursor}function b(){return n<=m.cursor}this.setCurrent=function(e){m.setCurrent(e)},this.getCurrent=function(){return m.getCurrent()},this.stem=function(){var e=m.cursor;return function(){for(var e,r,n,i,s=m.cursor;;)if(e=m.cursor,m.bra=e,m.eq_s(1,"ß"))m.ket=m.cursor,m.slice_from("ss");else{if(e>=m.limit)break;m.cursor=e+1}for(m.cursor=s;;)for(r=m.cursor;;){if(n=m.cursor,m.in_grouping(t,97,252)){if(i=m.cursor,m.bra=i,h("u","U",n))break;if(m.cursor=i,h("y","Y",n))break}if(n>=m.limit)return m.cursor=r;m.cursor=n+1}}(),m.cursor=e,function(){i=m.limit,n=i;var e=m.cursor+3;0<=e&&e<=m.limit&&(r=e,w()||((i=m.cursor)=m.limit)return;m.cursor++}}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.de.stemmer,"stemmer-de"),e.de.stopWordFilter=e.generateStopWordFilter("aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daß dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures für gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines können könnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte während würde würden zu zum zur zwar zwischen über".split(" ")),e.Pipeline.registerFunction(e.de.stopWordFilter,"stopWordFilter-de")}}); \ No newline at end of file diff --git a/docs/v1.2.0/_static/javascripts/lunr/lunr.du.js b/docs/v1.2.0/_static/javascripts/lunr/lunr.du.js new file mode 100644 index 0000000000..52632004a2 --- /dev/null +++ b/docs/v1.2.0/_static/javascripts/lunr/lunr.du.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var v,q,r;console.warn('[Lunr Languages] Please use the "nl" instead of the "du". The "nl" code is the standard code for Dutch language, and "du" will be removed in the next major versions.'),e.du=function(){this.pipeline.reset(),this.pipeline.add(e.du.trimmer,e.du.stopWordFilter,e.du.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.du.stemmer))},e.du.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.du.trimmer=e.trimmerSupport.generateTrimmer(e.du.wordCharacters),e.Pipeline.registerFunction(e.du.trimmer,"trimmer-du"),e.du.stemmer=(v=e.stemmerSupport.Among,q=e.stemmerSupport.SnowballProgram,r=new function(){var r,i,u,o=[new v("",-1,6),new v("á",0,1),new v("ä",0,1),new v("é",0,2),new v("ë",0,2),new v("í",0,3),new v("ï",0,3),new v("ó",0,4),new v("ö",0,4),new v("ú",0,5),new v("ü",0,5)],n=[new v("",-1,3),new v("I",0,2),new v("Y",0,1)],t=[new v("dd",-1,-1),new v("kk",-1,-1),new v("tt",-1,-1)],c=[new v("ene",-1,2),new v("se",-1,3),new v("en",-1,2),new v("heden",2,1),new v("s",-1,3)],a=[new v("end",-1,1),new v("ig",-1,2),new v("ing",-1,1),new v("lijk",-1,3),new v("baar",-1,4),new v("bar",-1,5)],l=[new v("aa",-1,-1),new v("ee",-1,-1),new v("oo",-1,-1),new v("uu",-1,-1)],m=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],d=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],f=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],_=new q;function s(e){return(_.cursor=e)>=_.limit||(_.cursor++,!1)}function w(){for(;!_.in_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}for(;!_.out_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}function b(){return i<=_.cursor}function p(){return r<=_.cursor}function g(){var e=_.limit-_.cursor;_.find_among_b(t,3)&&(_.cursor=_.limit-e,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del()))}function h(){var e;u=!1,_.ket=_.cursor,_.eq_s_b(1,"e")&&(_.bra=_.cursor,b()&&(e=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-e,_.slice_del(),u=!0,g())))}function k(){var e;b()&&(e=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-e,_.eq_s_b(3,"gem")||(_.cursor=_.limit-e,_.slice_del(),g())))}this.setCurrent=function(e){_.setCurrent(e)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var e=_.cursor;return function(){for(var e,r,i,n=_.cursor;;){if(_.bra=_.cursor,e=_.find_among(o,11))switch(_.ket=_.cursor,e){case 1:_.slice_from("a");continue;case 2:_.slice_from("e");continue;case 3:_.slice_from("i");continue;case 4:_.slice_from("o");continue;case 5:_.slice_from("u");continue;case 6:if(_.cursor>=_.limit)break;_.cursor++;continue}break}for(_.cursor=n,_.bra=n,_.eq_s(1,"y")?(_.ket=_.cursor,_.slice_from("Y")):_.cursor=n;;)if(r=_.cursor,_.in_grouping(m,97,232)){if(i=_.cursor,_.bra=i,_.eq_s(1,"i"))_.ket=_.cursor,_.in_grouping(m,97,232)&&(_.slice_from("I"),_.cursor=r);else if(_.cursor=i,_.eq_s(1,"y"))_.ket=_.cursor,_.slice_from("Y"),_.cursor=r;else if(s(r))break}else if(s(r))break}(),_.cursor=e,i=_.limit,r=i,w()||((i=_.cursor)<3&&(i=3),w()||(r=_.cursor)),_.limit_backward=e,_.cursor=_.limit,function(){var e,r,i,n,o,t,s=_.limit-_.cursor;if(_.ket=_.cursor,e=_.find_among_b(c,5))switch(_.bra=_.cursor,e){case 1:b()&&_.slice_from("heid");break;case 2:k();break;case 3:b()&&_.out_grouping_b(f,97,232)&&_.slice_del()}if(_.cursor=_.limit-s,h(),_.cursor=_.limit-s,_.ket=_.cursor,_.eq_s_b(4,"heid")&&(_.bra=_.cursor,p()&&(r=_.limit-_.cursor,_.eq_s_b(1,"c")||(_.cursor=_.limit-r,_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"en")&&(_.bra=_.cursor,k())))),_.cursor=_.limit-s,_.ket=_.cursor,e=_.find_among_b(a,6))switch(_.bra=_.cursor,e){case 1:if(p()){if(_.slice_del(),i=_.limit-_.cursor,_.ket=_.cursor,_.eq_s_b(2,"ig")&&(_.bra=_.cursor,p()&&(n=_.limit-_.cursor,!_.eq_s_b(1,"e")))){_.cursor=_.limit-n,_.slice_del();break}_.cursor=_.limit-i,g()}break;case 2:p()&&(o=_.limit-_.cursor,_.eq_s_b(1,"e")||(_.cursor=_.limit-o,_.slice_del()));break;case 3:p()&&(_.slice_del(),h());break;case 4:p()&&_.slice_del();break;case 5:p()&&u&&_.slice_del()}_.cursor=_.limit-s,_.out_grouping_b(d,73,232)&&(t=_.limit-_.cursor,_.find_among_b(l,4)&&_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-t,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del())))}(),_.cursor=_.limit_backward,function(){for(var e;;)if(_.bra=_.cursor,e=_.find_among(n,3))switch(_.ket=_.cursor,e){case 1:_.slice_from("y");break;case 2:_.slice_from("i");break;case 3:if(_.cursor>=_.limit)return;_.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.du.stemmer,"stemmer-du"),e.du.stopWordFilter=e.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),e.Pipeline.registerFunction(e.du.stopWordFilter,"stopWordFilter-du")}}); \ No newline at end of file diff --git a/docs/v1.2.0/_static/javascripts/lunr/lunr.es.js b/docs/v1.2.0/_static/javascripts/lunr/lunr.es.js new file mode 100644 index 0000000000..9de6c09cb4 --- /dev/null +++ b/docs/v1.2.0/_static/javascripts/lunr/lunr.es.js @@ -0,0 +1 @@ +!function(e,s){"function"==typeof define&&define.amd?define(s):"object"==typeof exports?module.exports=s():s()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var C,P,s;e.es=function(){this.pipeline.reset(),this.pipeline.add(e.es.trimmer,e.es.stopWordFilter,e.es.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.es.stemmer))},e.es.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.es.trimmer=e.trimmerSupport.generateTrimmer(e.es.wordCharacters),e.Pipeline.registerFunction(e.es.trimmer,"trimmer-es"),e.es.stemmer=(C=e.stemmerSupport.Among,P=e.stemmerSupport.SnowballProgram,s=new function(){var r,n,i,a=[new C("",-1,6),new C("á",0,1),new C("é",0,2),new C("í",0,3),new C("ó",0,4),new C("ú",0,5)],t=[new C("la",-1,-1),new C("sela",0,-1),new C("le",-1,-1),new C("me",-1,-1),new C("se",-1,-1),new C("lo",-1,-1),new C("selo",5,-1),new C("las",-1,-1),new C("selas",7,-1),new C("les",-1,-1),new C("los",-1,-1),new C("selos",10,-1),new C("nos",-1,-1)],o=[new C("ando",-1,6),new C("iendo",-1,6),new C("yendo",-1,7),new C("ándo",-1,2),new C("iéndo",-1,1),new C("ar",-1,6),new C("er",-1,6),new C("ir",-1,6),new C("ár",-1,3),new C("ér",-1,4),new C("ír",-1,5)],s=[new C("ic",-1,-1),new C("ad",-1,-1),new C("os",-1,-1),new C("iv",-1,1)],u=[new C("able",-1,1),new C("ible",-1,1),new C("ante",-1,1)],w=[new C("ic",-1,1),new C("abil",-1,1),new C("iv",-1,1)],c=[new C("ica",-1,1),new C("ancia",-1,2),new C("encia",-1,5),new C("adora",-1,2),new C("osa",-1,1),new C("ista",-1,1),new C("iva",-1,9),new C("anza",-1,1),new C("logía",-1,3),new C("idad",-1,8),new C("able",-1,1),new C("ible",-1,1),new C("ante",-1,2),new C("mente",-1,7),new C("amente",13,6),new C("ación",-1,2),new C("ución",-1,4),new C("ico",-1,1),new C("ismo",-1,1),new C("oso",-1,1),new C("amiento",-1,1),new C("imiento",-1,1),new C("ivo",-1,9),new C("ador",-1,2),new C("icas",-1,1),new C("ancias",-1,2),new C("encias",-1,5),new C("adoras",-1,2),new C("osas",-1,1),new C("istas",-1,1),new C("ivas",-1,9),new C("anzas",-1,1),new C("logías",-1,3),new C("idades",-1,8),new C("ables",-1,1),new C("ibles",-1,1),new C("aciones",-1,2),new C("uciones",-1,4),new C("adores",-1,2),new C("antes",-1,2),new C("icos",-1,1),new C("ismos",-1,1),new C("osos",-1,1),new C("amientos",-1,1),new C("imientos",-1,1),new C("ivos",-1,9)],m=[new C("ya",-1,1),new C("ye",-1,1),new C("yan",-1,1),new C("yen",-1,1),new C("yeron",-1,1),new C("yendo",-1,1),new C("yo",-1,1),new C("yas",-1,1),new C("yes",-1,1),new C("yais",-1,1),new C("yamos",-1,1),new C("yó",-1,1)],l=[new C("aba",-1,2),new C("ada",-1,2),new C("ida",-1,2),new C("ara",-1,2),new C("iera",-1,2),new C("ía",-1,2),new C("aría",5,2),new C("ería",5,2),new C("iría",5,2),new C("ad",-1,2),new C("ed",-1,2),new C("id",-1,2),new C("ase",-1,2),new C("iese",-1,2),new C("aste",-1,2),new C("iste",-1,2),new C("an",-1,2),new C("aban",16,2),new C("aran",16,2),new C("ieran",16,2),new C("ían",16,2),new C("arían",20,2),new C("erían",20,2),new C("irían",20,2),new C("en",-1,1),new C("asen",24,2),new C("iesen",24,2),new C("aron",-1,2),new C("ieron",-1,2),new C("arán",-1,2),new C("erán",-1,2),new C("irán",-1,2),new C("ado",-1,2),new C("ido",-1,2),new C("ando",-1,2),new C("iendo",-1,2),new C("ar",-1,2),new C("er",-1,2),new C("ir",-1,2),new C("as",-1,2),new C("abas",39,2),new C("adas",39,2),new C("idas",39,2),new C("aras",39,2),new C("ieras",39,2),new C("ías",39,2),new C("arías",45,2),new C("erías",45,2),new C("irías",45,2),new C("es",-1,1),new C("ases",49,2),new C("ieses",49,2),new C("abais",-1,2),new C("arais",-1,2),new C("ierais",-1,2),new C("íais",-1,2),new C("aríais",55,2),new C("eríais",55,2),new C("iríais",55,2),new C("aseis",-1,2),new C("ieseis",-1,2),new C("asteis",-1,2),new C("isteis",-1,2),new C("áis",-1,2),new C("éis",-1,1),new C("aréis",64,2),new C("eréis",64,2),new C("iréis",64,2),new C("ados",-1,2),new C("idos",-1,2),new C("amos",-1,2),new C("ábamos",70,2),new C("áramos",70,2),new C("iéramos",70,2),new C("íamos",70,2),new C("aríamos",74,2),new C("eríamos",74,2),new C("iríamos",74,2),new C("emos",-1,1),new C("aremos",78,2),new C("eremos",78,2),new C("iremos",78,2),new C("ásemos",78,2),new C("iésemos",78,2),new C("imos",-1,2),new C("arás",-1,2),new C("erás",-1,2),new C("irás",-1,2),new C("ís",-1,2),new C("ará",-1,2),new C("erá",-1,2),new C("irá",-1,2),new C("aré",-1,2),new C("eré",-1,2),new C("iré",-1,2),new C("ió",-1,2)],d=[new C("a",-1,1),new C("e",-1,2),new C("o",-1,1),new C("os",-1,1),new C("á",-1,1),new C("é",-1,2),new C("í",-1,1),new C("ó",-1,1)],b=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,4,10],f=new P;function _(){if(f.out_grouping(b,97,252)){for(;!f.in_grouping(b,97,252);){if(f.cursor>=f.limit)return!0;f.cursor++}return!1}return!0}function h(){var e,s=f.cursor;if(function(){if(f.in_grouping(b,97,252)){var e=f.cursor;if(_()){if(f.cursor=e,!f.in_grouping(b,97,252))return!0;for(;!f.out_grouping(b,97,252);){if(f.cursor>=f.limit)return!0;f.cursor++}}return!1}return!0}()){if(f.cursor=s,!f.out_grouping(b,97,252))return;if(e=f.cursor,_()){if(f.cursor=e,!f.in_grouping(b,97,252)||f.cursor>=f.limit)return;f.cursor++}}i=f.cursor}function v(){for(;!f.in_grouping(b,97,252);){if(f.cursor>=f.limit)return!1;f.cursor++}for(;!f.out_grouping(b,97,252);){if(f.cursor>=f.limit)return!1;f.cursor++}return!0}function p(){return i<=f.cursor}function g(){return r<=f.cursor}function k(e,s){if(!g())return!0;f.slice_del(),f.ket=f.cursor;var r=f.find_among_b(e,s);return r&&(f.bra=f.cursor,1==r&&g()&&f.slice_del()),!1}function y(e){return!g()||(f.slice_del(),f.ket=f.cursor,f.eq_s_b(2,e)&&(f.bra=f.cursor,g()&&f.slice_del()),!1)}function q(){var e;if(f.ket=f.cursor,e=f.find_among_b(c,46)){switch(f.bra=f.cursor,e){case 1:if(!g())return!1;f.slice_del();break;case 2:if(y("ic"))return!1;break;case 3:if(!g())return!1;f.slice_from("log");break;case 4:if(!g())return!1;f.slice_from("u");break;case 5:if(!g())return!1;f.slice_from("ente");break;case 6:if(!(n<=f.cursor))return!1;f.slice_del(),f.ket=f.cursor,(e=f.find_among_b(s,4))&&(f.bra=f.cursor,g()&&(f.slice_del(),1==e&&(f.ket=f.cursor,f.eq_s_b(2,"at")&&(f.bra=f.cursor,g()&&f.slice_del()))));break;case 7:if(k(u,3))return!1;break;case 8:if(k(w,3))return!1;break;case 9:if(y("at"))return!1}return!0}return!1}this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var e,s=f.cursor;return e=f.cursor,i=f.limit,r=n=i,h(),f.cursor=e,v()&&(n=f.cursor,v()&&(r=f.cursor)),f.limit_backward=s,f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,f.find_among_b(t,13)&&(f.bra=f.cursor,(e=f.find_among_b(o,11))&&p()))switch(e){case 1:f.bra=f.cursor,f.slice_from("iendo");break;case 2:f.bra=f.cursor,f.slice_from("ando");break;case 3:f.bra=f.cursor,f.slice_from("ar");break;case 4:f.bra=f.cursor,f.slice_from("er");break;case 5:f.bra=f.cursor,f.slice_from("ir");break;case 6:f.slice_del();break;case 7:f.eq_s_b(1,"u")&&f.slice_del()}}(),f.cursor=f.limit,q()||(f.cursor=f.limit,function(){var e,s;if(f.cursor>=i&&(s=f.limit_backward,f.limit_backward=i,f.ket=f.cursor,e=f.find_among_b(m,12),f.limit_backward=s,e)){if(f.bra=f.cursor,1==e){if(!f.eq_s_b(1,"u"))return!1;f.slice_del()}return!0}return!1}()||(f.cursor=f.limit,function(){var e,s,r,n;if(f.cursor>=i&&(s=f.limit_backward,f.limit_backward=i,f.ket=f.cursor,e=f.find_among_b(l,96),f.limit_backward=s,e))switch(f.bra=f.cursor,e){case 1:r=f.limit-f.cursor,f.eq_s_b(1,"u")?(n=f.limit-f.cursor,f.eq_s_b(1,"g")?f.cursor=f.limit-n:f.cursor=f.limit-r):f.cursor=f.limit-r,f.bra=f.cursor;case 2:f.slice_del()}}())),f.cursor=f.limit,function(){var e,s;if(f.ket=f.cursor,e=f.find_among_b(d,8))switch(f.bra=f.cursor,e){case 1:p()&&f.slice_del();break;case 2:p()&&(f.slice_del(),f.ket=f.cursor,f.eq_s_b(1,"u")&&(f.bra=f.cursor,s=f.limit-f.cursor,f.eq_s_b(1,"g")&&(f.cursor=f.limit-s,p()&&f.slice_del())))}}(),f.cursor=f.limit_backward,function(){for(var e;;){if(f.bra=f.cursor,e=f.find_among(a,6))switch(f.ket=f.cursor,e){case 1:f.slice_from("a");continue;case 2:f.slice_from("e");continue;case 3:f.slice_from("i");continue;case 4:f.slice_from("o");continue;case 5:f.slice_from("u");continue;case 6:if(f.cursor>=f.limit)break;f.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return s.setCurrent(e),s.stem(),s.getCurrent()}):(s.setCurrent(e),s.stem(),s.getCurrent())}),e.Pipeline.registerFunction(e.es.stemmer,"stemmer-es"),e.es.stopWordFilter=e.generateStopWordFilter("a al algo algunas algunos ante antes como con contra cual cuando de del desde donde durante e el ella ellas ellos en entre era erais eran eras eres es esa esas ese eso esos esta estaba estabais estaban estabas estad estada estadas estado estados estamos estando estar estaremos estará estarán estarás estaré estaréis estaría estaríais estaríamos estarían estarías estas este estemos esto estos estoy estuve estuviera estuvierais estuvieran estuvieras estuvieron estuviese estuvieseis estuviesen estuvieses estuvimos estuviste estuvisteis estuviéramos estuviésemos estuvo está estábamos estáis están estás esté estéis estén estés fue fuera fuerais fueran fueras fueron fuese fueseis fuesen fueses fui fuimos fuiste fuisteis fuéramos fuésemos ha habida habidas habido habidos habiendo habremos habrá habrán habrás habré habréis habría habríais habríamos habrían habrías habéis había habíais habíamos habían habías han has hasta hay haya hayamos hayan hayas hayáis he hemos hube hubiera hubierais hubieran hubieras hubieron hubiese hubieseis hubiesen hubieses hubimos hubiste hubisteis hubiéramos hubiésemos hubo la las le les lo los me mi mis mucho muchos muy más mí mía mías mío míos nada ni no nos nosotras nosotros nuestra nuestras nuestro nuestros o os otra otras otro otros para pero poco por porque que quien quienes qué se sea seamos sean seas seremos será serán serás seré seréis sería seríais seríamos serían serías seáis sido siendo sin sobre sois somos son soy su sus suya suyas suyo suyos sí también tanto te tendremos tendrá tendrán tendrás tendré tendréis tendría tendríais tendríamos tendrían tendrías tened tenemos tenga tengamos tengan tengas tengo tengáis tenida tenidas tenido tenidos teniendo tenéis tenía teníais teníamos tenían tenías ti tiene tienen tienes todo todos tu tus tuve tuviera tuvierais tuvieran tuvieras tuvieron tuviese tuvieseis tuviesen tuvieses tuvimos tuviste tuvisteis tuviéramos tuviésemos tuvo tuya tuyas tuyo tuyos tú un una uno unos vosotras vosotros vuestra vuestras vuestro vuestros y ya yo él éramos".split(" ")),e.Pipeline.registerFunction(e.es.stopWordFilter,"stopWordFilter-es")}}); \ No newline at end of file diff --git a/docs/v1.2.0/_static/javascripts/lunr/lunr.fi.js b/docs/v1.2.0/_static/javascripts/lunr/lunr.fi.js new file mode 100644 index 0000000000..2f9bf5aebd --- /dev/null +++ b/docs/v1.2.0/_static/javascripts/lunr/lunr.fi.js @@ -0,0 +1 @@ +!function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===i.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var v,C,e;i.fi=function(){this.pipeline.reset(),this.pipeline.add(i.fi.trimmer,i.fi.stopWordFilter,i.fi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(i.fi.stemmer))},i.fi.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",i.fi.trimmer=i.trimmerSupport.generateTrimmer(i.fi.wordCharacters),i.Pipeline.registerFunction(i.fi.trimmer,"trimmer-fi"),i.fi.stemmer=(v=i.stemmerSupport.Among,C=i.stemmerSupport.SnowballProgram,e=new function(){var n,t,l,o,r=[new v("pa",-1,1),new v("sti",-1,2),new v("kaan",-1,1),new v("han",-1,1),new v("kin",-1,1),new v("hän",-1,1),new v("kään",-1,1),new v("ko",-1,1),new v("pä",-1,1),new v("kö",-1,1)],s=[new v("lla",-1,-1),new v("na",-1,-1),new v("ssa",-1,-1),new v("ta",-1,-1),new v("lta",3,-1),new v("sta",3,-1)],a=[new v("llä",-1,-1),new v("nä",-1,-1),new v("ssä",-1,-1),new v("tä",-1,-1),new v("ltä",3,-1),new v("stä",3,-1)],u=[new v("lle",-1,-1),new v("ine",-1,-1)],c=[new v("nsa",-1,3),new v("mme",-1,3),new v("nne",-1,3),new v("ni",-1,2),new v("si",-1,1),new v("an",-1,4),new v("en",-1,6),new v("än",-1,5),new v("nsä",-1,3)],i=[new v("aa",-1,-1),new v("ee",-1,-1),new v("ii",-1,-1),new v("oo",-1,-1),new v("uu",-1,-1),new v("ää",-1,-1),new v("öö",-1,-1)],m=[new v("a",-1,8),new v("lla",0,-1),new v("na",0,-1),new v("ssa",0,-1),new v("ta",0,-1),new v("lta",4,-1),new v("sta",4,-1),new v("tta",4,9),new v("lle",-1,-1),new v("ine",-1,-1),new v("ksi",-1,-1),new v("n",-1,7),new v("han",11,1),new v("den",11,-1,q),new v("seen",11,-1,j),new v("hen",11,2),new v("tten",11,-1,q),new v("hin",11,3),new v("siin",11,-1,q),new v("hon",11,4),new v("hän",11,5),new v("hön",11,6),new v("ä",-1,8),new v("llä",22,-1),new v("nä",22,-1),new v("ssä",22,-1),new v("tä",22,-1),new v("ltä",26,-1),new v("stä",26,-1),new v("ttä",26,9)],w=[new v("eja",-1,-1),new v("mma",-1,1),new v("imma",1,-1),new v("mpa",-1,1),new v("impa",3,-1),new v("mmi",-1,1),new v("immi",5,-1),new v("mpi",-1,1),new v("impi",7,-1),new v("ejä",-1,-1),new v("mmä",-1,1),new v("immä",10,-1),new v("mpä",-1,1),new v("impä",12,-1)],_=[new v("i",-1,-1),new v("j",-1,-1)],k=[new v("mma",-1,1),new v("imma",0,-1)],b=[17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],e=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],f=[17,97,24,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],h=new C;function p(){for(var i;i=h.cursor,!h.in_grouping(d,97,246);){if((h.cursor=i)>=h.limit)return!0;h.cursor++}for(h.cursor=i;!h.out_grouping(d,97,246);){if(h.cursor>=h.limit)return!0;h.cursor++}return!1}function g(){var i,e;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(r,10)){switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:if(!h.in_grouping_b(f,97,246))return;break;case 2:if(!(l<=h.cursor))return}h.slice_del()}else h.limit_backward=e}function j(){return h.find_among_b(i,7)}function q(){return h.eq_s_b(1,"i")&&h.in_grouping_b(e,97,246)}this.setCurrent=function(i){h.setCurrent(i)},this.getCurrent=function(){return h.getCurrent()},this.stem=function(){var i,e=h.cursor;return o=h.limit,l=o,p()||(o=h.cursor,p()||(l=h.cursor)),n=!1,h.limit_backward=e,h.cursor=h.limit,g(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(c,9))switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:r=h.limit-h.cursor,h.eq_s_b(1,"k")||(h.cursor=h.limit-r,h.slice_del());break;case 2:h.slice_del(),h.ket=h.cursor,h.eq_s_b(3,"kse")&&(h.bra=h.cursor,h.slice_from("ksi"));break;case 3:h.slice_del();break;case 4:h.find_among_b(s,6)&&h.slice_del();break;case 5:h.find_among_b(a,6)&&h.slice_del();break;case 6:h.find_among_b(u,2)&&h.slice_del()}else h.limit_backward=e}(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(m,30)){switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:if(!h.eq_s_b(1,"a"))return;break;case 2:case 9:if(!h.eq_s_b(1,"e"))return;break;case 3:if(!h.eq_s_b(1,"i"))return;break;case 4:if(!h.eq_s_b(1,"o"))return;break;case 5:if(!h.eq_s_b(1,"ä"))return;break;case 6:if(!h.eq_s_b(1,"ö"))return;break;case 7:if(r=h.limit-h.cursor,!j()&&(h.cursor=h.limit-r,!h.eq_s_b(2,"ie"))){h.cursor=h.limit-r;break}if(h.cursor=h.limit-r,h.cursor<=h.limit_backward){h.cursor=h.limit-r;break}h.cursor--,h.bra=h.cursor;break;case 8:if(!h.in_grouping_b(d,97,246)||!h.out_grouping_b(d,97,246))return}h.slice_del(),n=!0}else h.limit_backward=e}(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=l)if(e=h.limit_backward,h.limit_backward=l,h.ket=h.cursor,i=h.find_among_b(w,14)){if(h.bra=h.cursor,h.limit_backward=e,1==i){if(r=h.limit-h.cursor,h.eq_s_b(2,"po"))return;h.cursor=h.limit-r}h.slice_del()}else h.limit_backward=e}(),h.cursor=h.limit,h.cursor=(n?h.cursor>=o&&(i=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,h.find_among_b(_,2)?(h.bra=h.cursor,h.limit_backward=i,h.slice_del()):h.limit_backward=i):(h.cursor=h.limit,function(){var i,e,r,n,t,s;if(h.cursor>=o){if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,h.eq_s_b(1,"t")&&(h.bra=h.cursor,r=h.limit-h.cursor,h.in_grouping_b(d,97,246)&&(h.cursor=h.limit-r,h.slice_del(),h.limit_backward=e,n=h.limit-h.cursor,h.cursor>=l&&(h.cursor=l,t=h.limit_backward,h.limit_backward=h.cursor,h.cursor=h.limit-n,h.ket=h.cursor,i=h.find_among_b(k,2))))){if(h.bra=h.cursor,h.limit_backward=t,1==i){if(s=h.limit-h.cursor,h.eq_s_b(2,"po"))return;h.cursor=h.limit-s}return h.slice_del()}h.limit_backward=e}}()),h.limit),function(){var i,e,r,n;if(h.cursor>=o){for(i=h.limit_backward,h.limit_backward=o,e=h.limit-h.cursor,j()&&(h.cursor=h.limit-e,h.ket=h.cursor,h.cursor>h.limit_backward&&(h.cursor--,h.bra=h.cursor,h.slice_del())),h.cursor=h.limit-e,h.ket=h.cursor,h.in_grouping_b(b,97,228)&&(h.bra=h.cursor,h.out_grouping_b(d,97,246)&&h.slice_del()),h.cursor=h.limit-e,h.ket=h.cursor,h.eq_s_b(1,"j")&&(h.bra=h.cursor,r=h.limit-h.cursor,h.eq_s_b(1,"o")?h.slice_del():(h.cursor=h.limit-r,h.eq_s_b(1,"u")&&h.slice_del())),h.cursor=h.limit-e,h.ket=h.cursor,h.eq_s_b(1,"o")&&(h.bra=h.cursor,h.eq_s_b(1,"j")&&h.slice_del()),h.cursor=h.limit-e,h.limit_backward=i;;){if(n=h.limit-h.cursor,h.out_grouping_b(d,97,246)){h.cursor=h.limit-n;break}if(h.cursor=h.limit-n,h.cursor<=h.limit_backward)return;h.cursor--}h.ket=h.cursor,h.cursor>h.limit_backward&&(h.cursor--,h.bra=h.cursor,t=h.slice_to(),h.eq_v_b(t)&&h.slice_del())}}(),!0}},function(i){return"function"==typeof i.update?i.update(function(i){return e.setCurrent(i),e.stem(),e.getCurrent()}):(e.setCurrent(i),e.stem(),e.getCurrent())}),i.Pipeline.registerFunction(i.fi.stemmer,"stemmer-fi"),i.fi.stopWordFilter=i.generateStopWordFilter("ei eivät emme en et ette että he heidän heidät heihin heille heillä heiltä heissä heistä heitä hän häneen hänelle hänellä häneltä hänen hänessä hänestä hänet häntä itse ja johon joiden joihin joiksi joilla joille joilta joina joissa joista joita joka joksi jolla jolle jolta jona jonka jos jossa josta jota jotka kanssa keiden keihin keiksi keille keillä keiltä keinä keissä keistä keitä keneen keneksi kenelle kenellä keneltä kenen kenenä kenessä kenestä kenet ketkä ketkä ketä koska kuin kuka kun me meidän meidät meihin meille meillä meiltä meissä meistä meitä mihin miksi mikä mille millä miltä minkä minkä minua minulla minulle minulta minun minussa minusta minut minuun minä minä missä mistä mitkä mitä mukaan mutta ne niiden niihin niiksi niille niillä niiltä niin niin niinä niissä niistä niitä noiden noihin noiksi noilla noille noilta noin noina noissa noista noita nuo nyt näiden näihin näiksi näille näillä näiltä näinä näissä näistä näitä nämä ole olemme olen olet olette oli olimme olin olisi olisimme olisin olisit olisitte olisivat olit olitte olivat olla olleet ollut on ovat poikki se sekä sen siihen siinä siitä siksi sille sillä sillä siltä sinua sinulla sinulle sinulta sinun sinussa sinusta sinut sinuun sinä sinä sitä tai te teidän teidät teihin teille teillä teiltä teissä teistä teitä tuo tuohon tuoksi tuolla tuolle tuolta tuon tuona tuossa tuosta tuota tähän täksi tälle tällä tältä tämä tämän tänä tässä tästä tätä vaan vai vaikka yli".split(" ")),i.Pipeline.registerFunction(i.fi.stopWordFilter,"stopWordFilter-fi")}}); \ No newline at end of file diff --git a/docs/v1.2.0/_static/javascripts/lunr/lunr.fr.js b/docs/v1.2.0/_static/javascripts/lunr/lunr.fr.js new file mode 100644 index 0000000000..078d0cab70 --- /dev/null +++ b/docs/v1.2.0/_static/javascripts/lunr/lunr.fr.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,y,s;e.fr=function(){this.pipeline.reset(),this.pipeline.add(e.fr.trimmer,e.fr.stopWordFilter,e.fr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.fr.stemmer))},e.fr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.fr.trimmer=e.trimmerSupport.generateTrimmer(e.fr.wordCharacters),e.Pipeline.registerFunction(e.fr.trimmer,"trimmer-fr"),e.fr.stemmer=(r=e.stemmerSupport.Among,y=e.stemmerSupport.SnowballProgram,s=new function(){var s,i,t,n=[new r("col",-1,-1),new r("par",-1,-1),new r("tap",-1,-1)],u=[new r("",-1,4),new r("I",0,1),new r("U",0,2),new r("Y",0,3)],o=[new r("iqU",-1,3),new r("abl",-1,3),new r("Ièr",-1,4),new r("ièr",-1,4),new r("eus",-1,2),new r("iv",-1,1)],c=[new r("ic",-1,2),new r("abil",-1,1),new r("iv",-1,3)],a=[new r("iqUe",-1,1),new r("atrice",-1,2),new r("ance",-1,1),new r("ence",-1,5),new r("logie",-1,3),new r("able",-1,1),new r("isme",-1,1),new r("euse",-1,11),new r("iste",-1,1),new r("ive",-1,8),new r("if",-1,8),new r("usion",-1,4),new r("ation",-1,2),new r("ution",-1,4),new r("ateur",-1,2),new r("iqUes",-1,1),new r("atrices",-1,2),new r("ances",-1,1),new r("ences",-1,5),new r("logies",-1,3),new r("ables",-1,1),new r("ismes",-1,1),new r("euses",-1,11),new r("istes",-1,1),new r("ives",-1,8),new r("ifs",-1,8),new r("usions",-1,4),new r("ations",-1,2),new r("utions",-1,4),new r("ateurs",-1,2),new r("ments",-1,15),new r("ements",30,6),new r("issements",31,12),new r("ités",-1,7),new r("ment",-1,15),new r("ement",34,6),new r("issement",35,12),new r("amment",34,13),new r("emment",34,14),new r("aux",-1,10),new r("eaux",39,9),new r("eux",-1,1),new r("ité",-1,7)],l=[new r("ira",-1,1),new r("ie",-1,1),new r("isse",-1,1),new r("issante",-1,1),new r("i",-1,1),new r("irai",4,1),new r("ir",-1,1),new r("iras",-1,1),new r("ies",-1,1),new r("îmes",-1,1),new r("isses",-1,1),new r("issantes",-1,1),new r("îtes",-1,1),new r("is",-1,1),new r("irais",13,1),new r("issais",13,1),new r("irions",-1,1),new r("issions",-1,1),new r("irons",-1,1),new r("issons",-1,1),new r("issants",-1,1),new r("it",-1,1),new r("irait",21,1),new r("issait",21,1),new r("issant",-1,1),new r("iraIent",-1,1),new r("issaIent",-1,1),new r("irent",-1,1),new r("issent",-1,1),new r("iront",-1,1),new r("ît",-1,1),new r("iriez",-1,1),new r("issiez",-1,1),new r("irez",-1,1),new r("issez",-1,1)],w=[new r("a",-1,3),new r("era",0,2),new r("asse",-1,3),new r("ante",-1,3),new r("ée",-1,2),new r("ai",-1,3),new r("erai",5,2),new r("er",-1,2),new r("as",-1,3),new r("eras",8,2),new r("âmes",-1,3),new r("asses",-1,3),new r("antes",-1,3),new r("âtes",-1,3),new r("ées",-1,2),new r("ais",-1,3),new r("erais",15,2),new r("ions",-1,1),new r("erions",17,2),new r("assions",17,3),new r("erons",-1,2),new r("ants",-1,3),new r("és",-1,2),new r("ait",-1,3),new r("erait",23,2),new r("ant",-1,3),new r("aIent",-1,3),new r("eraIent",26,2),new r("èrent",-1,2),new r("assent",-1,3),new r("eront",-1,2),new r("ât",-1,3),new r("ez",-1,2),new r("iez",32,2),new r("eriez",33,2),new r("assiez",33,3),new r("erez",32,2),new r("é",-1,2)],f=[new r("e",-1,3),new r("Ière",0,2),new r("ière",0,2),new r("ion",-1,1),new r("Ier",-1,2),new r("ier",-1,2),new r("ë",-1,4)],m=[new r("ell",-1,-1),new r("eill",-1,-1),new r("enn",-1,-1),new r("onn",-1,-1),new r("ett",-1,-1)],_=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5],b=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128],d=new y;function k(e,r,s){return!(!d.eq_s(1,e)||(d.ket=d.cursor,!d.in_grouping(_,97,251)))&&(d.slice_from(r),d.cursor=s,!0)}function p(e,r,s){return!!d.eq_s(1,e)&&(d.ket=d.cursor,d.slice_from(r),d.cursor=s,!0)}function g(){for(;!d.in_grouping(_,97,251);){if(d.cursor>=d.limit)return!0;d.cursor++}for(;!d.out_grouping(_,97,251);){if(d.cursor>=d.limit)return!0;d.cursor++}return!1}function q(){return t<=d.cursor}function v(){return i<=d.cursor}function h(){return s<=d.cursor}function z(){if(!function(){var e,r;if(d.ket=d.cursor,e=d.find_among_b(a,43)){switch(d.bra=d.cursor,e){case 1:if(!h())return!1;d.slice_del();break;case 2:if(!h())return!1;d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"ic")&&(d.bra=d.cursor,h()?d.slice_del():d.slice_from("iqU"));break;case 3:if(!h())return!1;d.slice_from("log");break;case 4:if(!h())return!1;d.slice_from("u");break;case 5:if(!h())return!1;d.slice_from("ent");break;case 6:if(!q())return!1;if(d.slice_del(),d.ket=d.cursor,e=d.find_among_b(o,6))switch(d.bra=d.cursor,e){case 1:h()&&(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,h()&&d.slice_del()));break;case 2:h()?d.slice_del():v()&&d.slice_from("eux");break;case 3:h()&&d.slice_del();break;case 4:q()&&d.slice_from("i")}break;case 7:if(!h())return!1;if(d.slice_del(),d.ket=d.cursor,e=d.find_among_b(c,3))switch(d.bra=d.cursor,e){case 1:h()?d.slice_del():d.slice_from("abl");break;case 2:h()?d.slice_del():d.slice_from("iqU");break;case 3:h()&&d.slice_del()}break;case 8:if(!h())return!1;if(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,h()&&(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"ic")))){d.bra=d.cursor,h()?d.slice_del():d.slice_from("iqU");break}break;case 9:d.slice_from("eau");break;case 10:if(!v())return!1;d.slice_from("al");break;case 11:if(h())d.slice_del();else{if(!v())return!1;d.slice_from("eux")}break;case 12:if(!v()||!d.out_grouping_b(_,97,251))return!1;d.slice_del();break;case 13:return q()&&d.slice_from("ant"),!1;case 14:return q()&&d.slice_from("ent"),!1;case 15:return r=d.limit-d.cursor,d.in_grouping_b(_,97,251)&&q()&&(d.cursor=d.limit-r,d.slice_del()),!1}return!0}return!1}()&&(d.cursor=d.limit,!function(){var e,r;if(d.cursor=t){if(s=d.limit_backward,d.limit_backward=t,d.ket=d.cursor,e=d.find_among_b(f,7))switch(d.bra=d.cursor,e){case 1:if(h()){if(i=d.limit-d.cursor,!d.eq_s_b(1,"s")&&(d.cursor=d.limit-i,!d.eq_s_b(1,"t")))break;d.slice_del()}break;case 2:d.slice_from("i");break;case 3:d.slice_del();break;case 4:d.eq_s_b(2,"gu")&&d.slice_del()}d.limit_backward=s}}();d.cursor=d.limit,d.ket=d.cursor,d.eq_s_b(1,"Y")?(d.bra=d.cursor,d.slice_from("i")):(d.cursor=d.limit,d.eq_s_b(1,"ç")&&(d.bra=d.cursor,d.slice_from("c")))}this.setCurrent=function(e){d.setCurrent(e)},this.getCurrent=function(){return d.getCurrent()},this.stem=function(){var e,r=d.cursor;return function(){for(var e,r;;){if(e=d.cursor,d.in_grouping(_,97,251)){if(d.bra=d.cursor,r=d.cursor,k("u","U",e))continue;if(d.cursor=r,k("i","I",e))continue;if(d.cursor=r,p("y","Y",e))continue}if(d.cursor=e,!k("y","Y",d.bra=e)){if(d.cursor=e,d.eq_s(1,"q")&&(d.bra=d.cursor,p("u","U",e)))continue;if((d.cursor=e)>=d.limit)return;d.cursor++}}}(),d.cursor=r,function(){var e=d.cursor;if(t=d.limit,s=i=t,d.in_grouping(_,97,251)&&d.in_grouping(_,97,251)&&d.cursor=d.limit){d.cursor=t;break}d.cursor++}while(!d.in_grouping(_,97,251))}t=d.cursor,d.cursor=e,g()||(i=d.cursor,g()||(s=d.cursor))}(),d.limit_backward=r,d.cursor=d.limit,z(),d.cursor=d.limit,e=d.limit-d.cursor,d.find_among_b(m,5)&&(d.cursor=d.limit-e,d.ket=d.cursor,d.cursor>d.limit_backward&&(d.cursor--,d.bra=d.cursor,d.slice_del())),d.cursor=d.limit,function(){for(var e,r=1;d.out_grouping_b(_,97,251);)r--;if(r<=0){if(d.ket=d.cursor,e=d.limit-d.cursor,!d.eq_s_b(1,"é")&&(d.cursor=d.limit-e,!d.eq_s_b(1,"è")))return;d.bra=d.cursor,d.slice_from("e")}}(),d.cursor=d.limit_backward,function(){for(var e,r;r=d.cursor,d.bra=r,e=d.find_among(u,4);)switch(d.ket=d.cursor,e){case 1:d.slice_from("i");break;case 2:d.slice_from("u");break;case 3:d.slice_from("y");break;case 4:if(d.cursor>=d.limit)return;d.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return s.setCurrent(e),s.stem(),s.getCurrent()}):(s.setCurrent(e),s.stem(),s.getCurrent())}),e.Pipeline.registerFunction(e.fr.stemmer,"stemmer-fr"),e.fr.stopWordFilter=e.generateStopWordFilter("ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci celà ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux eûmes eût eûtes furent fus fusse fussent fusses fussiez fussions fut fûmes fût fûtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon même n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y à étaient étais était étant étiez étions été étée étées étés êtes".split(" ")),e.Pipeline.registerFunction(e.fr.stopWordFilter,"stopWordFilter-fr")}}); \ No newline at end of file diff --git a/docs/v1.2.0/_static/javascripts/lunr/lunr.hu.js b/docs/v1.2.0/_static/javascripts/lunr/lunr.hu.js new file mode 100644 index 0000000000..56a4b0dc19 --- /dev/null +++ b/docs/v1.2.0/_static/javascripts/lunr/lunr.hu.js @@ -0,0 +1 @@ +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var p,_,n;e.hu=function(){this.pipeline.reset(),this.pipeline.add(e.hu.trimmer,e.hu.stopWordFilter,e.hu.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hu.stemmer))},e.hu.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.hu.trimmer=e.trimmerSupport.generateTrimmer(e.hu.wordCharacters),e.Pipeline.registerFunction(e.hu.trimmer,"trimmer-hu"),e.hu.stemmer=(p=e.stemmerSupport.Among,_=e.stemmerSupport.SnowballProgram,n=new function(){var r,i=[new p("cs",-1,-1),new p("dzs",-1,-1),new p("gy",-1,-1),new p("ly",-1,-1),new p("ny",-1,-1),new p("sz",-1,-1),new p("ty",-1,-1),new p("zs",-1,-1)],n=[new p("á",-1,1),new p("é",-1,2)],a=[new p("bb",-1,-1),new p("cc",-1,-1),new p("dd",-1,-1),new p("ff",-1,-1),new p("gg",-1,-1),new p("jj",-1,-1),new p("kk",-1,-1),new p("ll",-1,-1),new p("mm",-1,-1),new p("nn",-1,-1),new p("pp",-1,-1),new p("rr",-1,-1),new p("ccs",-1,-1),new p("ss",-1,-1),new p("zzs",-1,-1),new p("tt",-1,-1),new p("vv",-1,-1),new p("ggy",-1,-1),new p("lly",-1,-1),new p("nny",-1,-1),new p("tty",-1,-1),new p("ssz",-1,-1),new p("zz",-1,-1)],t=[new p("al",-1,1),new p("el",-1,2)],e=[new p("ba",-1,-1),new p("ra",-1,-1),new p("be",-1,-1),new p("re",-1,-1),new p("ig",-1,-1),new p("nak",-1,-1),new p("nek",-1,-1),new p("val",-1,-1),new p("vel",-1,-1),new p("ul",-1,-1),new p("nál",-1,-1),new p("nél",-1,-1),new p("ból",-1,-1),new p("ról",-1,-1),new p("tól",-1,-1),new p("bõl",-1,-1),new p("rõl",-1,-1),new p("tõl",-1,-1),new p("ül",-1,-1),new p("n",-1,-1),new p("an",19,-1),new p("ban",20,-1),new p("en",19,-1),new p("ben",22,-1),new p("képpen",22,-1),new p("on",19,-1),new p("ön",19,-1),new p("képp",-1,-1),new p("kor",-1,-1),new p("t",-1,-1),new p("at",29,-1),new p("et",29,-1),new p("ként",29,-1),new p("anként",32,-1),new p("enként",32,-1),new p("onként",32,-1),new p("ot",29,-1),new p("ért",29,-1),new p("öt",29,-1),new p("hez",-1,-1),new p("hoz",-1,-1),new p("höz",-1,-1),new p("vá",-1,-1),new p("vé",-1,-1)],s=[new p("án",-1,2),new p("én",-1,1),new p("ánként",-1,3)],c=[new p("stul",-1,2),new p("astul",0,1),new p("ástul",0,3),new p("stül",-1,2),new p("estül",3,1),new p("éstül",3,4)],w=[new p("á",-1,1),new p("é",-1,2)],o=[new p("k",-1,7),new p("ak",0,4),new p("ek",0,6),new p("ok",0,5),new p("ák",0,1),new p("ék",0,2),new p("ök",0,3)],l=[new p("éi",-1,7),new p("áéi",0,6),new p("ééi",0,5),new p("é",-1,9),new p("ké",3,4),new p("aké",4,1),new p("eké",4,1),new p("oké",4,1),new p("áké",4,3),new p("éké",4,2),new p("öké",4,1),new p("éé",3,8)],u=[new p("a",-1,18),new p("ja",0,17),new p("d",-1,16),new p("ad",2,13),new p("ed",2,13),new p("od",2,13),new p("ád",2,14),new p("éd",2,15),new p("öd",2,13),new p("e",-1,18),new p("je",9,17),new p("nk",-1,4),new p("unk",11,1),new p("ánk",11,2),new p("énk",11,3),new p("ünk",11,1),new p("uk",-1,8),new p("juk",16,7),new p("ájuk",17,5),new p("ük",-1,8),new p("jük",19,7),new p("éjük",20,6),new p("m",-1,12),new p("am",22,9),new p("em",22,9),new p("om",22,9),new p("ám",22,10),new p("ém",22,11),new p("o",-1,18),new p("á",-1,19),new p("é",-1,20)],m=[new p("id",-1,10),new p("aid",0,9),new p("jaid",1,6),new p("eid",0,9),new p("jeid",3,6),new p("áid",0,7),new p("éid",0,8),new p("i",-1,15),new p("ai",7,14),new p("jai",8,11),new p("ei",7,14),new p("jei",10,11),new p("ái",7,12),new p("éi",7,13),new p("itek",-1,24),new p("eitek",14,21),new p("jeitek",15,20),new p("éitek",14,23),new p("ik",-1,29),new p("aik",18,26),new p("jaik",19,25),new p("eik",18,26),new p("jeik",21,25),new p("áik",18,27),new p("éik",18,28),new p("ink",-1,20),new p("aink",25,17),new p("jaink",26,16),new p("eink",25,17),new p("jeink",28,16),new p("áink",25,18),new p("éink",25,19),new p("aitok",-1,21),new p("jaitok",32,20),new p("áitok",-1,22),new p("im",-1,5),new p("aim",35,4),new p("jaim",36,1),new p("eim",35,4),new p("jeim",38,1),new p("áim",35,2),new p("éim",35,3)],k=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,52,14],f=new _;function b(){return r<=f.cursor}function d(){var e=f.limit-f.cursor;return!!f.find_among_b(a,23)&&(f.cursor=f.limit-e,!0)}function g(){if(f.cursor>f.limit_backward){f.cursor--,f.ket=f.cursor;var e=f.cursor-1;f.limit_backward<=e&&e<=f.limit&&(f.cursor=e,f.bra=e,f.slice_del())}}function h(){f.ket=f.cursor,f.find_among_b(e,44)&&(f.bra=f.cursor,b()&&(f.slice_del(),function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(n,2))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("a");break;case 2:f.slice_from("e")}}()))}this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var e=f.cursor;return function(){var e,n=f.cursor;if(r=f.limit,f.in_grouping(k,97,252))for(;;){if(e=f.cursor,f.out_grouping(k,97,252))return f.cursor=e,f.find_among(i,8)||(f.cursor=e)=f.limit)return r=e;f.cursor++}if(f.cursor=n,f.out_grouping(k,97,252)){for(;!f.in_grouping(k,97,252);){if(f.cursor>=f.limit)return;f.cursor++}r=f.cursor}}(),f.limit_backward=e,f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(t,2))&&(f.bra=f.cursor,b())){if((1==e||2==e)&&!d())return;f.slice_del(),g()}}(),f.cursor=f.limit,h(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(s,3))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("e");break;case 2:case 3:f.slice_from("a")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(c,6))&&(f.bra=f.cursor,b()))switch(e){case 1:case 2:f.slice_del();break;case 3:f.slice_from("a");break;case 4:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(w,2))&&(f.bra=f.cursor,b())){if((1==e||2==e)&&!d())return;f.slice_del(),g()}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(l,12))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 7:case 9:f.slice_del();break;case 2:case 5:case 8:f.slice_from("e");break;case 3:case 6:f.slice_from("a")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(u,31))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 7:case 8:case 9:case 12:case 13:case 16:case 17:case 18:f.slice_del();break;case 2:case 5:case 10:case 14:case 19:f.slice_from("a");break;case 3:case 6:case 11:case 15:case 20:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(m,42))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 5:case 6:case 9:case 10:case 11:case 14:case 15:case 16:case 17:case 20:case 21:case 24:case 25:case 26:case 29:f.slice_del();break;case 2:case 7:case 12:case 18:case 22:case 27:f.slice_from("a");break;case 3:case 8:case 13:case 19:case 23:case 28:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(o,7))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("a");break;case 2:f.slice_from("e");break;case 3:case 4:case 5:case 6:case 7:f.slice_del()}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.hu.stemmer,"stemmer-hu"),e.hu.stopWordFilter=e.generateStopWordFilter("a abban ahhoz ahogy ahol aki akik akkor alatt amely amelyek amelyekben amelyeket amelyet amelynek ami amikor amit amolyan amíg annak arra arról az azok azon azonban azt aztán azután azzal azért be belül benne bár cikk cikkek cikkeket csak de e ebben eddig egy egyes egyetlen egyik egyre egyéb egész ehhez ekkor el ellen elsõ elég elõ elõször elõtt emilyen ennek erre ez ezek ezen ezt ezzel ezért fel felé hanem hiszen hogy hogyan igen ill ill. illetve ilyen ilyenkor ismét ison itt jobban jó jól kell kellett keressünk keresztül ki kívül között közül legalább legyen lehet lehetett lenne lenni lesz lett maga magát majd majd meg mellett mely melyek mert mi mikor milyen minden mindenki mindent mindig mint mintha mit mivel miért most már más másik még míg nagy nagyobb nagyon ne nekem neki nem nincs néha néhány nélkül olyan ott pedig persze rá s saját sem semmi sok sokat sokkal szemben szerint szinte számára talán tehát teljes tovább továbbá több ugyanis utolsó után utána vagy vagyis vagyok valaki valami valamint való van vannak vele vissza viszont volna volt voltak voltam voltunk által általában át én éppen és így õ õk õket össze úgy új újabb újra".split(" ")),e.Pipeline.registerFunction(e.hu.stopWordFilter,"stopWordFilter-hu")}}); \ No newline at end of file diff --git a/docs/v1.2.0/_static/javascripts/lunr/lunr.it.js b/docs/v1.2.0/_static/javascripts/lunr/lunr.it.js new file mode 100644 index 0000000000..50dddaa04b --- /dev/null +++ b/docs/v1.2.0/_static/javascripts/lunr/lunr.it.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var z,P,r;e.it=function(){this.pipeline.reset(),this.pipeline.add(e.it.trimmer,e.it.stopWordFilter,e.it.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.it.stemmer))},e.it.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.it.trimmer=e.trimmerSupport.generateTrimmer(e.it.wordCharacters),e.Pipeline.registerFunction(e.it.trimmer,"trimmer-it"),e.it.stemmer=(z=e.stemmerSupport.Among,P=e.stemmerSupport.SnowballProgram,r=new function(){var o,t,s,a=[new z("",-1,7),new z("qu",0,6),new z("á",0,1),new z("é",0,2),new z("í",0,3),new z("ó",0,4),new z("ú",0,5)],u=[new z("",-1,3),new z("I",0,1),new z("U",0,2)],c=[new z("la",-1,-1),new z("cela",0,-1),new z("gliela",0,-1),new z("mela",0,-1),new z("tela",0,-1),new z("vela",0,-1),new z("le",-1,-1),new z("cele",6,-1),new z("gliele",6,-1),new z("mele",6,-1),new z("tele",6,-1),new z("vele",6,-1),new z("ne",-1,-1),new z("cene",12,-1),new z("gliene",12,-1),new z("mene",12,-1),new z("sene",12,-1),new z("tene",12,-1),new z("vene",12,-1),new z("ci",-1,-1),new z("li",-1,-1),new z("celi",20,-1),new z("glieli",20,-1),new z("meli",20,-1),new z("teli",20,-1),new z("veli",20,-1),new z("gli",20,-1),new z("mi",-1,-1),new z("si",-1,-1),new z("ti",-1,-1),new z("vi",-1,-1),new z("lo",-1,-1),new z("celo",31,-1),new z("glielo",31,-1),new z("melo",31,-1),new z("telo",31,-1),new z("velo",31,-1)],w=[new z("ando",-1,1),new z("endo",-1,1),new z("ar",-1,2),new z("er",-1,2),new z("ir",-1,2)],r=[new z("ic",-1,-1),new z("abil",-1,-1),new z("os",-1,-1),new z("iv",-1,1)],n=[new z("ic",-1,1),new z("abil",-1,1),new z("iv",-1,1)],i=[new z("ica",-1,1),new z("logia",-1,3),new z("osa",-1,1),new z("ista",-1,1),new z("iva",-1,9),new z("anza",-1,1),new z("enza",-1,5),new z("ice",-1,1),new z("atrice",7,1),new z("iche",-1,1),new z("logie",-1,3),new z("abile",-1,1),new z("ibile",-1,1),new z("usione",-1,4),new z("azione",-1,2),new z("uzione",-1,4),new z("atore",-1,2),new z("ose",-1,1),new z("ante",-1,1),new z("mente",-1,1),new z("amente",19,7),new z("iste",-1,1),new z("ive",-1,9),new z("anze",-1,1),new z("enze",-1,5),new z("ici",-1,1),new z("atrici",25,1),new z("ichi",-1,1),new z("abili",-1,1),new z("ibili",-1,1),new z("ismi",-1,1),new z("usioni",-1,4),new z("azioni",-1,2),new z("uzioni",-1,4),new z("atori",-1,2),new z("osi",-1,1),new z("anti",-1,1),new z("amenti",-1,6),new z("imenti",-1,6),new z("isti",-1,1),new z("ivi",-1,9),new z("ico",-1,1),new z("ismo",-1,1),new z("oso",-1,1),new z("amento",-1,6),new z("imento",-1,6),new z("ivo",-1,9),new z("ità",-1,8),new z("istà",-1,1),new z("istè",-1,1),new z("istì",-1,1)],l=[new z("isca",-1,1),new z("enda",-1,1),new z("ata",-1,1),new z("ita",-1,1),new z("uta",-1,1),new z("ava",-1,1),new z("eva",-1,1),new z("iva",-1,1),new z("erebbe",-1,1),new z("irebbe",-1,1),new z("isce",-1,1),new z("ende",-1,1),new z("are",-1,1),new z("ere",-1,1),new z("ire",-1,1),new z("asse",-1,1),new z("ate",-1,1),new z("avate",16,1),new z("evate",16,1),new z("ivate",16,1),new z("ete",-1,1),new z("erete",20,1),new z("irete",20,1),new z("ite",-1,1),new z("ereste",-1,1),new z("ireste",-1,1),new z("ute",-1,1),new z("erai",-1,1),new z("irai",-1,1),new z("isci",-1,1),new z("endi",-1,1),new z("erei",-1,1),new z("irei",-1,1),new z("assi",-1,1),new z("ati",-1,1),new z("iti",-1,1),new z("eresti",-1,1),new z("iresti",-1,1),new z("uti",-1,1),new z("avi",-1,1),new z("evi",-1,1),new z("ivi",-1,1),new z("isco",-1,1),new z("ando",-1,1),new z("endo",-1,1),new z("Yamo",-1,1),new z("iamo",-1,1),new z("avamo",-1,1),new z("evamo",-1,1),new z("ivamo",-1,1),new z("eremo",-1,1),new z("iremo",-1,1),new z("assimo",-1,1),new z("ammo",-1,1),new z("emmo",-1,1),new z("eremmo",54,1),new z("iremmo",54,1),new z("immo",-1,1),new z("ano",-1,1),new z("iscano",58,1),new z("avano",58,1),new z("evano",58,1),new z("ivano",58,1),new z("eranno",-1,1),new z("iranno",-1,1),new z("ono",-1,1),new z("iscono",65,1),new z("arono",65,1),new z("erono",65,1),new z("irono",65,1),new z("erebbero",-1,1),new z("irebbero",-1,1),new z("assero",-1,1),new z("essero",-1,1),new z("issero",-1,1),new z("ato",-1,1),new z("ito",-1,1),new z("uto",-1,1),new z("avo",-1,1),new z("evo",-1,1),new z("ivo",-1,1),new z("ar",-1,1),new z("ir",-1,1),new z("erà",-1,1),new z("irà",-1,1),new z("erò",-1,1),new z("irò",-1,1)],m=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2,1],f=[17,65,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2],v=[17],b=new P;function d(e,r,n){return!(!b.eq_s(1,e)||(b.ket=b.cursor,!b.in_grouping(m,97,249)))&&(b.slice_from(r),b.cursor=n,!0)}function _(e){if(b.cursor=e,!b.in_grouping(m,97,249))return!1;for(;!b.out_grouping(m,97,249);){if(b.cursor>=b.limit)return!1;b.cursor++}return!0}function g(){var e,r=b.cursor;if(!function(){if(b.in_grouping(m,97,249)){var e=b.cursor;if(b.out_grouping(m,97,249)){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return _(e);b.cursor++}return!0}return _(e)}return!1}()){if(b.cursor=r,!b.out_grouping(m,97,249))return;if(e=b.cursor,b.out_grouping(m,97,249)){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return b.cursor=e,void(b.in_grouping(m,97,249)&&b.cursor=b.limit)return;b.cursor++}s=b.cursor}function p(){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return!1;b.cursor++}for(;!b.out_grouping(m,97,249);){if(b.cursor>=b.limit)return!1;b.cursor++}return!0}function k(){return s<=b.cursor}function h(){return o<=b.cursor}function q(){var e;if(b.ket=b.cursor,!(e=b.find_among_b(i,51)))return!1;switch(b.bra=b.cursor,e){case 1:if(!h())return!1;b.slice_del();break;case 2:if(!h())return!1;b.slice_del(),b.ket=b.cursor,b.eq_s_b(2,"ic")&&(b.bra=b.cursor,h()&&b.slice_del());break;case 3:if(!h())return!1;b.slice_from("log");break;case 4:if(!h())return!1;b.slice_from("u");break;case 5:if(!h())return!1;b.slice_from("ente");break;case 6:if(!k())return!1;b.slice_del();break;case 7:if(!(t<=b.cursor))return!1;b.slice_del(),b.ket=b.cursor,(e=b.find_among_b(r,4))&&(b.bra=b.cursor,h()&&(b.slice_del(),1==e&&(b.ket=b.cursor,b.eq_s_b(2,"at")&&(b.bra=b.cursor,h()&&b.slice_del()))));break;case 8:if(!h())return!1;b.slice_del(),b.ket=b.cursor,(e=b.find_among_b(n,3))&&(b.bra=b.cursor,1==e&&h()&&b.slice_del());break;case 9:if(!h())return!1;b.slice_del(),b.ket=b.cursor,b.eq_s_b(2,"at")&&(b.bra=b.cursor,h()&&(b.slice_del(),b.ket=b.cursor,b.eq_s_b(2,"ic")&&(b.bra=b.cursor,h()&&b.slice_del())))}return!0}function C(){var e;e=b.limit-b.cursor,b.ket=b.cursor,b.in_grouping_b(f,97,242)&&(b.bra=b.cursor,k()&&(b.slice_del(),b.ket=b.cursor,b.eq_s_b(1,"i")&&(b.bra=b.cursor,k())))?b.slice_del():b.cursor=b.limit-e,b.ket=b.cursor,b.eq_s_b(1,"h")&&(b.bra=b.cursor,b.in_grouping_b(v,99,103)&&k()&&b.slice_del())}this.setCurrent=function(e){b.setCurrent(e)},this.getCurrent=function(){return b.getCurrent()},this.stem=function(){var e,r,n,i=b.cursor;return function(){for(var e,r,n,i,o=b.cursor;;){if(b.bra=b.cursor,e=b.find_among(a,7))switch(b.ket=b.cursor,e){case 1:b.slice_from("à");continue;case 2:b.slice_from("è");continue;case 3:b.slice_from("ì");continue;case 4:b.slice_from("ò");continue;case 5:b.slice_from("ù");continue;case 6:b.slice_from("qU");continue;case 7:if(b.cursor>=b.limit)break;b.cursor++;continue}break}for(b.cursor=o;;)for(r=b.cursor;;){if(n=b.cursor,b.in_grouping(m,97,249)){if(b.bra=b.cursor,i=b.cursor,d("u","U",n))break;if(b.cursor=i,d("i","I",n))break}if(b.cursor=n,b.cursor>=b.limit)return b.cursor=r;b.cursor++}}(),b.cursor=i,e=b.cursor,s=b.limit,o=t=s,g(),b.cursor=e,p()&&(t=b.cursor,p()&&(o=b.cursor)),b.limit_backward=i,b.cursor=b.limit,function(){var e;if(b.ket=b.cursor,b.find_among_b(c,37)&&(b.bra=b.cursor,(e=b.find_among_b(w,5))&&k()))switch(e){case 1:b.slice_del();break;case 2:b.slice_from("e")}}(),b.cursor=b.limit,q()||(b.cursor=b.limit,b.cursor>=s&&(n=b.limit_backward,b.limit_backward=s,b.ket=b.cursor,(r=b.find_among_b(l,87))&&(b.bra=b.cursor,1==r&&b.slice_del()),b.limit_backward=n)),b.cursor=b.limit,C(),b.cursor=b.limit_backward,function(){for(var e;b.bra=b.cursor,e=b.find_among(u,3);)switch(b.ket=b.cursor,e){case 1:b.slice_from("i");break;case 2:b.slice_from("u");break;case 3:if(b.cursor>=b.limit)return;b.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.it.stemmer,"stemmer-it"),e.it.stopWordFilter=e.generateStopWordFilter("a abbia abbiamo abbiano abbiate ad agl agli ai al all alla alle allo anche avemmo avendo avesse avessero avessi avessimo aveste avesti avete aveva avevamo avevano avevate avevi avevo avrai avranno avrebbe avrebbero avrei avremmo avremo avreste avresti avrete avrà avrò avuta avute avuti avuto c che chi ci coi col come con contro cui da dagl dagli dai dal dall dalla dalle dallo degl degli dei del dell della delle dello di dov dove e ebbe ebbero ebbi ed era erano eravamo eravate eri ero essendo faccia facciamo facciano facciate faccio facemmo facendo facesse facessero facessi facessimo faceste facesti faceva facevamo facevano facevate facevi facevo fai fanno farai faranno farebbe farebbero farei faremmo faremo fareste faresti farete farà farò fece fecero feci fosse fossero fossi fossimo foste fosti fu fui fummo furono gli ha hai hanno ho i il in io l la le lei li lo loro lui ma mi mia mie miei mio ne negl negli nei nel nell nella nelle nello noi non nostra nostre nostri nostro o per perché più quale quanta quante quanti quanto quella quelle quelli quello questa queste questi questo sarai saranno sarebbe sarebbero sarei saremmo saremo sareste saresti sarete sarà sarò se sei si sia siamo siano siate siete sono sta stai stando stanno starai staranno starebbe starebbero starei staremmo staremo stareste staresti starete starà starò stava stavamo stavano stavate stavi stavo stemmo stesse stessero stessi stessimo steste stesti stette stettero stetti stia stiamo stiano stiate sto su sua sue sugl sugli sui sul sull sulla sulle sullo suo suoi ti tra tu tua tue tuo tuoi tutti tutto un una uno vi voi vostra vostre vostri vostro è".split(" ")),e.Pipeline.registerFunction(e.it.stopWordFilter,"stopWordFilter-it")}}); \ No newline at end of file diff --git a/docs/v1.2.0/_static/javascripts/lunr/lunr.ja.js b/docs/v1.2.0/_static/javascripts/lunr/lunr.ja.js new file mode 100644 index 0000000000..69f620250d --- /dev/null +++ b/docs/v1.2.0/_static/javascripts/lunr/lunr.ja.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(m){if(void 0===m)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===m.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var l="2"==m.version[0];m.ja=function(){this.pipeline.reset(),this.pipeline.add(m.ja.trimmer,m.ja.stopWordFilter,m.ja.stemmer),l?this.tokenizer=m.ja.tokenizer:(m.tokenizer&&(m.tokenizer=m.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=m.ja.tokenizer))};var j=new m.TinySegmenter;m.ja.tokenizer=function(e){var r,t,i,n,o,s,p,a,u;if(!arguments.length||null==e||null==e)return[];if(Array.isArray(e))return e.map(function(e){return l?new m.Token(e.toLowerCase()):e.toLowerCase()});for(r=(t=e.toString().toLowerCase().replace(/^\s+/,"")).length-1;0<=r;r--)if(/\S/.test(t.charAt(r))){t=t.substring(0,r+1);break}for(o=[],i=t.length,p=a=0;a<=i;a++)if(s=a-p,t.charAt(a).match(/\s/)||a==i){if(0=_.limit||(_.cursor++,!1)}function w(){for(;!_.in_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}for(;!_.out_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}function b(){return i<=_.cursor}function p(){return e<=_.cursor}function g(){var r=_.limit-_.cursor;_.find_among_b(t,3)&&(_.cursor=_.limit-r,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del()))}function h(){var r;u=!1,_.ket=_.cursor,_.eq_s_b(1,"e")&&(_.bra=_.cursor,b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.slice_del(),u=!0,g())))}function k(){var r;b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.eq_s_b(3,"gem")||(_.cursor=_.limit-r,_.slice_del(),g())))}this.setCurrent=function(r){_.setCurrent(r)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var r=_.cursor;return function(){for(var r,e,i,n=_.cursor;;){if(_.bra=_.cursor,r=_.find_among(o,11))switch(_.ket=_.cursor,r){case 1:_.slice_from("a");continue;case 2:_.slice_from("e");continue;case 3:_.slice_from("i");continue;case 4:_.slice_from("o");continue;case 5:_.slice_from("u");continue;case 6:if(_.cursor>=_.limit)break;_.cursor++;continue}break}for(_.cursor=n,_.bra=n,_.eq_s(1,"y")?(_.ket=_.cursor,_.slice_from("Y")):_.cursor=n;;)if(e=_.cursor,_.in_grouping(m,97,232)){if(i=_.cursor,_.bra=i,_.eq_s(1,"i"))_.ket=_.cursor,_.in_grouping(m,97,232)&&(_.slice_from("I"),_.cursor=e);else if(_.cursor=i,_.eq_s(1,"y"))_.ket=_.cursor,_.slice_from("Y"),_.cursor=e;else if(s(e))break}else if(s(e))break}(),_.cursor=r,i=_.limit,e=i,w()||((i=_.cursor)<3&&(i=3),w()||(e=_.cursor)),_.limit_backward=r,_.cursor=_.limit,function(){var r,e,i,n,o,t,s=_.limit-_.cursor;if(_.ket=_.cursor,r=_.find_among_b(c,5))switch(_.bra=_.cursor,r){case 1:b()&&_.slice_from("heid");break;case 2:k();break;case 3:b()&&_.out_grouping_b(f,97,232)&&_.slice_del()}if(_.cursor=_.limit-s,h(),_.cursor=_.limit-s,_.ket=_.cursor,_.eq_s_b(4,"heid")&&(_.bra=_.cursor,p()&&(e=_.limit-_.cursor,_.eq_s_b(1,"c")||(_.cursor=_.limit-e,_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"en")&&(_.bra=_.cursor,k())))),_.cursor=_.limit-s,_.ket=_.cursor,r=_.find_among_b(a,6))switch(_.bra=_.cursor,r){case 1:if(p()){if(_.slice_del(),i=_.limit-_.cursor,_.ket=_.cursor,_.eq_s_b(2,"ig")&&(_.bra=_.cursor,p()&&(n=_.limit-_.cursor,!_.eq_s_b(1,"e")))){_.cursor=_.limit-n,_.slice_del();break}_.cursor=_.limit-i,g()}break;case 2:p()&&(o=_.limit-_.cursor,_.eq_s_b(1,"e")||(_.cursor=_.limit-o,_.slice_del()));break;case 3:p()&&(_.slice_del(),h());break;case 4:p()&&_.slice_del();break;case 5:p()&&u&&_.slice_del()}_.cursor=_.limit-s,_.out_grouping_b(d,73,232)&&(t=_.limit-_.cursor,_.find_among_b(l,4)&&_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-t,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del())))}(),_.cursor=_.limit_backward,function(){for(var r;;)if(_.bra=_.cursor,r=_.find_among(n,3))switch(_.ket=_.cursor,r){case 1:_.slice_from("y");break;case 2:_.slice_from("i");break;case 3:if(_.cursor>=_.limit)return;_.cursor++}}(),!0}},function(r){return"function"==typeof r.update?r.update(function(r){return e.setCurrent(r),e.stem(),e.getCurrent()}):(e.setCurrent(r),e.stem(),e.getCurrent())}),r.Pipeline.registerFunction(r.nl.stemmer,"stemmer-nl"),r.nl.stopWordFilter=r.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),r.Pipeline.registerFunction(r.nl.stopWordFilter,"stopWordFilter-nl")}}); \ No newline at end of file diff --git a/docs/v1.2.0/_static/javascripts/lunr/lunr.no.js b/docs/v1.2.0/_static/javascripts/lunr/lunr.no.js new file mode 100644 index 0000000000..3d156b9c19 --- /dev/null +++ b/docs/v1.2.0/_static/javascripts/lunr/lunr.no.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,n,i;e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWordFilter,e.no.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.no.stemmer))},e.no.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.no.trimmer=e.trimmerSupport.generateTrimmer(e.no.wordCharacters),e.Pipeline.registerFunction(e.no.trimmer,"trimmer-no"),e.no.stemmer=(r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){var o,s,a=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],m=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],u=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],d=[119,125,149,1],c=new n;this.setCurrent=function(e){c.setCurrent(e)},this.getCurrent=function(){return c.getCurrent()},this.stem=function(){var e,r,n,i,t=c.cursor;return function(){var e,r=c.cursor+3;if(s=c.limit,0<=r||r<=c.limit){for(o=r;;){if(e=c.cursor,c.in_grouping(u,97,248)){c.cursor=e;break}if(e>=c.limit)return;c.cursor=e+1}for(;!c.out_grouping(u,97,248);){if(c.cursor>=c.limit)return;c.cursor++}(s=c.cursor)=s&&(r=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,e=c.find_among_b(a,29),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:n=c.limit-c.cursor,c.in_grouping_b(d,98,122)?c.slice_del():(c.cursor=c.limit-n,c.eq_s_b(1,"k")&&c.out_grouping_b(u,97,248)&&c.slice_del());break;case 3:c.slice_from("er")}}(),c.cursor=c.limit,r=c.limit-c.cursor,c.cursor>=s&&(e=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,c.find_among_b(m,2)?(c.bra=c.cursor,c.limit_backward=e,c.cursor=c.limit-r,c.cursor>c.limit_backward&&(c.cursor--,c.bra=c.cursor,c.slice_del())):c.limit_backward=e),c.cursor=c.limit,c.cursor>=s&&(i=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,(n=c.find_among_b(l,11))?(c.bra=c.cursor,c.limit_backward=i,1==n&&c.slice_del()):c.limit_backward=i),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}}); \ No newline at end of file diff --git a/docs/v1.2.0/_static/javascripts/lunr/lunr.pt.js b/docs/v1.2.0/_static/javascripts/lunr/lunr.pt.js new file mode 100644 index 0000000000..f50fc9fa6d --- /dev/null +++ b/docs/v1.2.0/_static/javascripts/lunr/lunr.pt.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var j,C,r;e.pt=function(){this.pipeline.reset(),this.pipeline.add(e.pt.trimmer,e.pt.stopWordFilter,e.pt.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.pt.stemmer))},e.pt.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.pt.trimmer=e.trimmerSupport.generateTrimmer(e.pt.wordCharacters),e.Pipeline.registerFunction(e.pt.trimmer,"trimmer-pt"),e.pt.stemmer=(j=e.stemmerSupport.Among,C=e.stemmerSupport.SnowballProgram,r=new function(){var s,n,i,o=[new j("",-1,3),new j("ã",0,1),new j("õ",0,2)],a=[new j("",-1,3),new j("a~",0,1),new j("o~",0,2)],r=[new j("ic",-1,-1),new j("ad",-1,-1),new j("os",-1,-1),new j("iv",-1,1)],t=[new j("ante",-1,1),new j("avel",-1,1),new j("ível",-1,1)],u=[new j("ic",-1,1),new j("abil",-1,1),new j("iv",-1,1)],w=[new j("ica",-1,1),new j("ância",-1,1),new j("ência",-1,4),new j("ira",-1,9),new j("adora",-1,1),new j("osa",-1,1),new j("ista",-1,1),new j("iva",-1,8),new j("eza",-1,1),new j("logía",-1,2),new j("idade",-1,7),new j("ante",-1,1),new j("mente",-1,6),new j("amente",12,5),new j("ável",-1,1),new j("ível",-1,1),new j("ución",-1,3),new j("ico",-1,1),new j("ismo",-1,1),new j("oso",-1,1),new j("amento",-1,1),new j("imento",-1,1),new j("ivo",-1,8),new j("aça~o",-1,1),new j("ador",-1,1),new j("icas",-1,1),new j("ências",-1,4),new j("iras",-1,9),new j("adoras",-1,1),new j("osas",-1,1),new j("istas",-1,1),new j("ivas",-1,8),new j("ezas",-1,1),new j("logías",-1,2),new j("idades",-1,7),new j("uciones",-1,3),new j("adores",-1,1),new j("antes",-1,1),new j("aço~es",-1,1),new j("icos",-1,1),new j("ismos",-1,1),new j("osos",-1,1),new j("amentos",-1,1),new j("imentos",-1,1),new j("ivos",-1,8)],m=[new j("ada",-1,1),new j("ida",-1,1),new j("ia",-1,1),new j("aria",2,1),new j("eria",2,1),new j("iria",2,1),new j("ara",-1,1),new j("era",-1,1),new j("ira",-1,1),new j("ava",-1,1),new j("asse",-1,1),new j("esse",-1,1),new j("isse",-1,1),new j("aste",-1,1),new j("este",-1,1),new j("iste",-1,1),new j("ei",-1,1),new j("arei",16,1),new j("erei",16,1),new j("irei",16,1),new j("am",-1,1),new j("iam",20,1),new j("ariam",21,1),new j("eriam",21,1),new j("iriam",21,1),new j("aram",20,1),new j("eram",20,1),new j("iram",20,1),new j("avam",20,1),new j("em",-1,1),new j("arem",29,1),new j("erem",29,1),new j("irem",29,1),new j("assem",29,1),new j("essem",29,1),new j("issem",29,1),new j("ado",-1,1),new j("ido",-1,1),new j("ando",-1,1),new j("endo",-1,1),new j("indo",-1,1),new j("ara~o",-1,1),new j("era~o",-1,1),new j("ira~o",-1,1),new j("ar",-1,1),new j("er",-1,1),new j("ir",-1,1),new j("as",-1,1),new j("adas",47,1),new j("idas",47,1),new j("ias",47,1),new j("arias",50,1),new j("erias",50,1),new j("irias",50,1),new j("aras",47,1),new j("eras",47,1),new j("iras",47,1),new j("avas",47,1),new j("es",-1,1),new j("ardes",58,1),new j("erdes",58,1),new j("irdes",58,1),new j("ares",58,1),new j("eres",58,1),new j("ires",58,1),new j("asses",58,1),new j("esses",58,1),new j("isses",58,1),new j("astes",58,1),new j("estes",58,1),new j("istes",58,1),new j("is",-1,1),new j("ais",71,1),new j("eis",71,1),new j("areis",73,1),new j("ereis",73,1),new j("ireis",73,1),new j("áreis",73,1),new j("éreis",73,1),new j("íreis",73,1),new j("ásseis",73,1),new j("ésseis",73,1),new j("ísseis",73,1),new j("áveis",73,1),new j("íeis",73,1),new j("aríeis",84,1),new j("eríeis",84,1),new j("iríeis",84,1),new j("ados",-1,1),new j("idos",-1,1),new j("amos",-1,1),new j("áramos",90,1),new j("éramos",90,1),new j("íramos",90,1),new j("ávamos",90,1),new j("íamos",90,1),new j("aríamos",95,1),new j("eríamos",95,1),new j("iríamos",95,1),new j("emos",-1,1),new j("aremos",99,1),new j("eremos",99,1),new j("iremos",99,1),new j("ássemos",99,1),new j("êssemos",99,1),new j("íssemos",99,1),new j("imos",-1,1),new j("armos",-1,1),new j("ermos",-1,1),new j("irmos",-1,1),new j("ámos",-1,1),new j("arás",-1,1),new j("erás",-1,1),new j("irás",-1,1),new j("eu",-1,1),new j("iu",-1,1),new j("ou",-1,1),new j("ará",-1,1),new j("erá",-1,1),new j("irá",-1,1)],c=[new j("a",-1,1),new j("i",-1,1),new j("o",-1,1),new j("os",-1,1),new j("á",-1,1),new j("í",-1,1),new j("ó",-1,1)],l=[new j("e",-1,1),new j("ç",-1,2),new j("é",-1,1),new j("ê",-1,1)],f=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,3,19,12,2],d=new C;function v(){if(d.out_grouping(f,97,250)){for(;!d.in_grouping(f,97,250);){if(d.cursor>=d.limit)return!0;d.cursor++}return!1}return!0}function p(){var e,r,s=d.cursor;if(d.in_grouping(f,97,250))if(e=d.cursor,v()){if(d.cursor=e,function(){if(d.in_grouping(f,97,250))for(;!d.out_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}return i=d.cursor,!0}())return}else i=d.cursor;if(d.cursor=s,d.out_grouping(f,97,250)){if(r=d.cursor,v()){if(d.cursor=r,!d.in_grouping(f,97,250)||d.cursor>=d.limit)return;d.cursor++}i=d.cursor}}function _(){for(;!d.in_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}for(;!d.out_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}return!0}function h(){return i<=d.cursor}function b(){return s<=d.cursor}function g(){var e;if(d.ket=d.cursor,!(e=d.find_among_b(w,45)))return!1;switch(d.bra=d.cursor,e){case 1:if(!b())return!1;d.slice_del();break;case 2:if(!b())return!1;d.slice_from("log");break;case 3:if(!b())return!1;d.slice_from("u");break;case 4:if(!b())return!1;d.slice_from("ente");break;case 5:if(!(n<=d.cursor))return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(r,4))&&(d.bra=d.cursor,b()&&(d.slice_del(),1==e&&(d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,b()&&d.slice_del()))));break;case 6:if(!b())return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(t,3))&&(d.bra=d.cursor,1==e&&b()&&d.slice_del());break;case 7:if(!b())return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(u,3))&&(d.bra=d.cursor,1==e&&b()&&d.slice_del());break;case 8:if(!b())return!1;d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,b()&&d.slice_del());break;case 9:if(!h()||!d.eq_s_b(1,"e"))return!1;d.slice_from("ir")}return!0}function k(e,r){if(d.eq_s_b(1,e)){d.bra=d.cursor;var s=d.limit-d.cursor;if(d.eq_s_b(1,r))return d.cursor=d.limit-s,h()&&d.slice_del(),!1}return!0}function q(){if(!g()&&(d.cursor=d.limit,!function(){var e,r;if(d.cursor>=i){if(r=d.limit_backward,d.limit_backward=i,d.ket=d.cursor,e=d.find_among_b(m,120))return d.bra=d.cursor,1==e&&d.slice_del(),d.limit_backward=r,!0;d.limit_backward=r}return!1}()))return d.cursor=d.limit,d.ket=d.cursor,void((e=d.find_among_b(c,7))&&(d.bra=d.cursor,1==e&&h()&&d.slice_del()));var e;d.cursor=d.limit,d.ket=d.cursor,d.eq_s_b(1,"i")&&(d.bra=d.cursor,d.eq_s_b(1,"c")&&(d.cursor=d.limit,h()&&d.slice_del()))}this.setCurrent=function(e){d.setCurrent(e)},this.getCurrent=function(){return d.getCurrent()},this.stem=function(){var e,r=d.cursor;return function(){for(var e;;){if(d.bra=d.cursor,e=d.find_among(o,3))switch(d.ket=d.cursor,e){case 1:d.slice_from("a~");continue;case 2:d.slice_from("o~");continue;case 3:if(d.cursor>=d.limit)break;d.cursor++;continue}break}}(),d.cursor=r,e=d.cursor,i=d.limit,s=n=i,p(),d.cursor=e,_()&&(n=d.cursor,_()&&(s=d.cursor)),d.limit_backward=r,d.cursor=d.limit,q(),d.cursor=d.limit,function(){var e;if(d.ket=d.cursor,e=d.find_among_b(l,4))switch(d.bra=d.cursor,e){case 1:h()&&(d.slice_del(),d.ket=d.cursor,d.limit,d.cursor,k("u","g")&&k("i","c"));break;case 2:d.slice_from("c")}}(),d.cursor=d.limit_backward,function(){for(var e;;){if(d.bra=d.cursor,e=d.find_among(a,3))switch(d.ket=d.cursor,e){case 1:d.slice_from("ã");continue;case 2:d.slice_from("õ");continue;case 3:if(d.cursor>=d.limit)break;d.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.pt.stemmer,"stemmer-pt"),e.pt.stopWordFilter=e.generateStopWordFilter("a ao aos aquela aquelas aquele aqueles aquilo as até com como da das de dela delas dele deles depois do dos e ela elas ele eles em entre era eram essa essas esse esses esta estamos estas estava estavam este esteja estejam estejamos estes esteve estive estivemos estiver estivera estiveram estiverem estivermos estivesse estivessem estivéramos estivéssemos estou está estávamos estão eu foi fomos for fora foram forem formos fosse fossem fui fôramos fôssemos haja hajam hajamos havemos hei houve houvemos houver houvera houveram houverei houverem houveremos houveria houveriam houvermos houverá houverão houveríamos houvesse houvessem houvéramos houvéssemos há hão isso isto já lhe lhes mais mas me mesmo meu meus minha minhas muito na nas nem no nos nossa nossas nosso nossos num numa não nós o os ou para pela pelas pelo pelos por qual quando que quem se seja sejam sejamos sem serei seremos seria seriam será serão seríamos seu seus somos sou sua suas são só também te tem temos tenha tenham tenhamos tenho terei teremos teria teriam terá terão teríamos teu teus teve tinha tinham tive tivemos tiver tivera tiveram tiverem tivermos tivesse tivessem tivéramos tivéssemos tu tua tuas tém tínhamos um uma você vocês vos à às éramos".split(" ")),e.Pipeline.registerFunction(e.pt.stopWordFilter,"stopWordFilter-pt")}}); \ No newline at end of file diff --git a/docs/v1.2.0/_static/javascripts/lunr/lunr.ro.js b/docs/v1.2.0/_static/javascripts/lunr/lunr.ro.js new file mode 100644 index 0000000000..b19627e1b3 --- /dev/null +++ b/docs/v1.2.0/_static/javascripts/lunr/lunr.ro.js @@ -0,0 +1 @@ +!function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var h,z,i;e.ro=function(){this.pipeline.reset(),this.pipeline.add(e.ro.trimmer,e.ro.stopWordFilter,e.ro.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ro.stemmer))},e.ro.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.ro.trimmer=e.trimmerSupport.generateTrimmer(e.ro.wordCharacters),e.Pipeline.registerFunction(e.ro.trimmer,"trimmer-ro"),e.ro.stemmer=(h=e.stemmerSupport.Among,z=e.stemmerSupport.SnowballProgram,i=new function(){var r,n,t,a,o=[new h("",-1,3),new h("I",0,1),new h("U",0,2)],s=[new h("ea",-1,3),new h("aţia",-1,7),new h("aua",-1,2),new h("iua",-1,4),new h("aţie",-1,7),new h("ele",-1,3),new h("ile",-1,5),new h("iile",6,4),new h("iei",-1,4),new h("atei",-1,6),new h("ii",-1,4),new h("ului",-1,1),new h("ul",-1,1),new h("elor",-1,3),new h("ilor",-1,4),new h("iilor",14,4)],c=[new h("icala",-1,4),new h("iciva",-1,4),new h("ativa",-1,5),new h("itiva",-1,6),new h("icale",-1,4),new h("aţiune",-1,5),new h("iţiune",-1,6),new h("atoare",-1,5),new h("itoare",-1,6),new h("ătoare",-1,5),new h("icitate",-1,4),new h("abilitate",-1,1),new h("ibilitate",-1,2),new h("ivitate",-1,3),new h("icive",-1,4),new h("ative",-1,5),new h("itive",-1,6),new h("icali",-1,4),new h("atori",-1,5),new h("icatori",18,4),new h("itori",-1,6),new h("ători",-1,5),new h("icitati",-1,4),new h("abilitati",-1,1),new h("ivitati",-1,3),new h("icivi",-1,4),new h("ativi",-1,5),new h("itivi",-1,6),new h("icităi",-1,4),new h("abilităi",-1,1),new h("ivităi",-1,3),new h("icităţi",-1,4),new h("abilităţi",-1,1),new h("ivităţi",-1,3),new h("ical",-1,4),new h("ator",-1,5),new h("icator",35,4),new h("itor",-1,6),new h("ător",-1,5),new h("iciv",-1,4),new h("ativ",-1,5),new h("itiv",-1,6),new h("icală",-1,4),new h("icivă",-1,4),new h("ativă",-1,5),new h("itivă",-1,6)],u=[new h("ica",-1,1),new h("abila",-1,1),new h("ibila",-1,1),new h("oasa",-1,1),new h("ata",-1,1),new h("ita",-1,1),new h("anta",-1,1),new h("ista",-1,3),new h("uta",-1,1),new h("iva",-1,1),new h("ic",-1,1),new h("ice",-1,1),new h("abile",-1,1),new h("ibile",-1,1),new h("isme",-1,3),new h("iune",-1,2),new h("oase",-1,1),new h("ate",-1,1),new h("itate",17,1),new h("ite",-1,1),new h("ante",-1,1),new h("iste",-1,3),new h("ute",-1,1),new h("ive",-1,1),new h("ici",-1,1),new h("abili",-1,1),new h("ibili",-1,1),new h("iuni",-1,2),new h("atori",-1,1),new h("osi",-1,1),new h("ati",-1,1),new h("itati",30,1),new h("iti",-1,1),new h("anti",-1,1),new h("isti",-1,3),new h("uti",-1,1),new h("işti",-1,3),new h("ivi",-1,1),new h("ităi",-1,1),new h("oşi",-1,1),new h("ităţi",-1,1),new h("abil",-1,1),new h("ibil",-1,1),new h("ism",-1,3),new h("ator",-1,1),new h("os",-1,1),new h("at",-1,1),new h("it",-1,1),new h("ant",-1,1),new h("ist",-1,3),new h("ut",-1,1),new h("iv",-1,1),new h("ică",-1,1),new h("abilă",-1,1),new h("ibilă",-1,1),new h("oasă",-1,1),new h("ată",-1,1),new h("ită",-1,1),new h("antă",-1,1),new h("istă",-1,3),new h("ută",-1,1),new h("ivă",-1,1)],w=[new h("ea",-1,1),new h("ia",-1,1),new h("esc",-1,1),new h("ăsc",-1,1),new h("ind",-1,1),new h("ând",-1,1),new h("are",-1,1),new h("ere",-1,1),new h("ire",-1,1),new h("âre",-1,1),new h("se",-1,2),new h("ase",10,1),new h("sese",10,2),new h("ise",10,1),new h("use",10,1),new h("âse",10,1),new h("eşte",-1,1),new h("ăşte",-1,1),new h("eze",-1,1),new h("ai",-1,1),new h("eai",19,1),new h("iai",19,1),new h("sei",-1,2),new h("eşti",-1,1),new h("ăşti",-1,1),new h("ui",-1,1),new h("ezi",-1,1),new h("âi",-1,1),new h("aşi",-1,1),new h("seşi",-1,2),new h("aseşi",29,1),new h("seseşi",29,2),new h("iseşi",29,1),new h("useşi",29,1),new h("âseşi",29,1),new h("işi",-1,1),new h("uşi",-1,1),new h("âşi",-1,1),new h("aţi",-1,2),new h("eaţi",38,1),new h("iaţi",38,1),new h("eţi",-1,2),new h("iţi",-1,2),new h("âţi",-1,2),new h("arăţi",-1,1),new h("serăţi",-1,2),new h("aserăţi",45,1),new h("seserăţi",45,2),new h("iserăţi",45,1),new h("userăţi",45,1),new h("âserăţi",45,1),new h("irăţi",-1,1),new h("urăţi",-1,1),new h("ârăţi",-1,1),new h("am",-1,1),new h("eam",54,1),new h("iam",54,1),new h("em",-1,2),new h("asem",57,1),new h("sesem",57,2),new h("isem",57,1),new h("usem",57,1),new h("âsem",57,1),new h("im",-1,2),new h("âm",-1,2),new h("ăm",-1,2),new h("arăm",65,1),new h("serăm",65,2),new h("aserăm",67,1),new h("seserăm",67,2),new h("iserăm",67,1),new h("userăm",67,1),new h("âserăm",67,1),new h("irăm",65,1),new h("urăm",65,1),new h("ârăm",65,1),new h("au",-1,1),new h("eau",76,1),new h("iau",76,1),new h("indu",-1,1),new h("ându",-1,1),new h("ez",-1,1),new h("ească",-1,1),new h("ară",-1,1),new h("seră",-1,2),new h("aseră",84,1),new h("seseră",84,2),new h("iseră",84,1),new h("useră",84,1),new h("âseră",84,1),new h("iră",-1,1),new h("ură",-1,1),new h("âră",-1,1),new h("ează",-1,1)],i=[new h("a",-1,1),new h("e",-1,1),new h("ie",1,1),new h("i",-1,1),new h("ă",-1,1)],m=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0,4],l=new z;function f(e,i){l.eq_s(1,e)&&(l.ket=l.cursor,l.in_grouping(m,97,259)&&l.slice_from(i))}function p(){if(l.out_grouping(m,97,259)){for(;!l.in_grouping(m,97,259);){if(l.cursor>=l.limit)return!0;l.cursor++}return!1}return!0}function d(){var e,i,r=l.cursor;if(l.in_grouping(m,97,259)){if(e=l.cursor,!p())return void(a=l.cursor);if(l.cursor=e,!function(){if(l.in_grouping(m,97,259))for(;!l.out_grouping(m,97,259);){if(l.cursor>=l.limit)return!0;l.cursor++}return!1}())return void(a=l.cursor)}l.cursor=r,l.out_grouping(m,97,259)&&(i=l.cursor,p()&&(l.cursor=i,l.in_grouping(m,97,259)&&l.cursor=l.limit)return!1;l.cursor++}for(;!l.out_grouping(m,97,259);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function v(){return t<=l.cursor}function _(){var e,i=l.limit-l.cursor;if(l.ket=l.cursor,(e=l.find_among_b(c,46))&&(l.bra=l.cursor,v())){switch(e){case 1:l.slice_from("abil");break;case 2:l.slice_from("ibil");break;case 3:l.slice_from("iv");break;case 4:l.slice_from("ic");break;case 5:l.slice_from("at");break;case 6:l.slice_from("it")}return r=!0,l.cursor=l.limit-i,!0}return!1}function g(){var e,i;for(r=!1;;)if(i=l.limit-l.cursor,!_()){l.cursor=l.limit-i;break}if(l.ket=l.cursor,(e=l.find_among_b(u,62))&&(l.bra=l.cursor,n<=l.cursor)){switch(e){case 1:l.slice_del();break;case 2:l.eq_s_b(1,"ţ")&&(l.bra=l.cursor,l.slice_from("t"));break;case 3:l.slice_from("ist")}r=!0}}function k(){var e;l.ket=l.cursor,(e=l.find_among_b(i,5))&&(l.bra=l.cursor,a<=l.cursor&&1==e&&l.slice_del())}this.setCurrent=function(e){l.setCurrent(e)},this.getCurrent=function(){return l.getCurrent()},this.stem=function(){var e,i=l.cursor;return function(){for(var e,i;e=l.cursor,l.in_grouping(m,97,259)&&(i=l.cursor,l.bra=i,f("u","U"),l.cursor=i,f("i","I")),l.cursor=e,!(l.cursor>=l.limit);)l.cursor++}(),l.cursor=i,e=l.cursor,a=l.limit,n=t=a,d(),l.cursor=e,b()&&(t=l.cursor,b()&&(n=l.cursor)),l.limit_backward=i,l.cursor=l.limit,function(){var e,i;if(l.ket=l.cursor,(e=l.find_among_b(s,16))&&(l.bra=l.cursor,v()))switch(e){case 1:l.slice_del();break;case 2:l.slice_from("a");break;case 3:l.slice_from("e");break;case 4:l.slice_from("i");break;case 5:i=l.limit-l.cursor,l.eq_s_b(2,"ab")||(l.cursor=l.limit-i,l.slice_from("i"));break;case 6:l.slice_from("at");break;case 7:l.slice_from("aţi")}}(),l.cursor=l.limit,g(),l.cursor=l.limit,r||(l.cursor=l.limit,function(){var e,i,r;if(l.cursor>=a){if(i=l.limit_backward,l.limit_backward=a,l.ket=l.cursor,e=l.find_among_b(w,94))switch(l.bra=l.cursor,e){case 1:if(r=l.limit-l.cursor,!l.out_grouping_b(m,97,259)&&(l.cursor=l.limit-r,!l.eq_s_b(1,"u")))break;case 2:l.slice_del()}l.limit_backward=i}}(),l.cursor=l.limit),k(),l.cursor=l.limit_backward,function(){for(var e;;){if(l.bra=l.cursor,e=l.find_among(o,3))switch(l.ket=l.cursor,e){case 1:l.slice_from("i");continue;case 2:l.slice_from("u");continue;case 3:if(l.cursor>=l.limit)break;l.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.ro.stemmer,"stemmer-ro"),e.ro.stopWordFilter=e.generateStopWordFilter("acea aceasta această aceea acei aceia acel acela acele acelea acest acesta aceste acestea aceşti aceştia acolo acord acum ai aia aibă aici al ale alea altceva altcineva am ar are asemenea asta astea astăzi asupra au avea avem aveţi azi aş aşadar aţi bine bucur bună ca care caut ce cel ceva chiar cinci cine cineva contra cu cum cumva curând curînd când cât câte câtva câţi cînd cît cîte cîtva cîţi că căci cărei căror cărui către da dacă dar datorită dată dau de deci deja deoarece departe deşi din dinaintea dintr- dintre doi doilea două drept după dă ea ei el ele eram este eu eşti face fata fi fie fiecare fii fim fiu fiţi frumos fără graţie halbă iar ieri la le li lor lui lângă lîngă mai mea mei mele mereu meu mi mie mine mult multă mulţi mulţumesc mâine mîine mă ne nevoie nici nicăieri nimeni nimeri nimic nişte noastre noastră noi noroc nostru nouă noştri nu opt ori oricare orice oricine oricum oricând oricât oricînd oricît oriunde patra patru patrulea pe pentru peste pic poate pot prea prima primul prin puţin puţina puţină până pînă rog sa sale sau se spate spre sub sunt suntem sunteţi sută sînt sîntem sînteţi să săi său ta tale te timp tine toate toată tot totuşi toţi trei treia treilea tu tăi tău un una unde undeva unei uneia unele uneori unii unor unora unu unui unuia unul vi voastre voastră voi vostru vouă voştri vreme vreo vreun vă zece zero zi zice îi îl îmi împotriva în înainte înaintea încotro încât încît între întrucât întrucît îţi ăla ălea ăsta ăstea ăştia şapte şase şi ştiu ţi ţie".split(" ")),e.Pipeline.registerFunction(e.ro.stopWordFilter,"stopWordFilter-ro")}}); \ No newline at end of file diff --git a/docs/v1.2.0/_static/javascripts/lunr/lunr.ru.js b/docs/v1.2.0/_static/javascripts/lunr/lunr.ru.js new file mode 100644 index 0000000000..ac99248044 --- /dev/null +++ b/docs/v1.2.0/_static/javascripts/lunr/lunr.ru.js @@ -0,0 +1 @@ +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var h,g,n;e.ru=function(){this.pipeline.reset(),this.pipeline.add(e.ru.trimmer,e.ru.stopWordFilter,e.ru.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ru.stemmer))},e.ru.wordCharacters="Ѐ-҄҇-ԯᴫᵸⷠ-ⷿꙀ-ꚟ︮︯",e.ru.trimmer=e.trimmerSupport.generateTrimmer(e.ru.wordCharacters),e.Pipeline.registerFunction(e.ru.trimmer,"trimmer-ru"),e.ru.stemmer=(h=e.stemmerSupport.Among,g=e.stemmerSupport.SnowballProgram,n=new function(){var n,e,r=[new h("в",-1,1),new h("ив",0,2),new h("ыв",0,2),new h("вши",-1,1),new h("ивши",3,2),new h("ывши",3,2),new h("вшись",-1,1),new h("ившись",6,2),new h("ывшись",6,2)],t=[new h("ее",-1,1),new h("ие",-1,1),new h("ое",-1,1),new h("ые",-1,1),new h("ими",-1,1),new h("ыми",-1,1),new h("ей",-1,1),new h("ий",-1,1),new h("ой",-1,1),new h("ый",-1,1),new h("ем",-1,1),new h("им",-1,1),new h("ом",-1,1),new h("ым",-1,1),new h("его",-1,1),new h("ого",-1,1),new h("ему",-1,1),new h("ому",-1,1),new h("их",-1,1),new h("ых",-1,1),new h("ею",-1,1),new h("ою",-1,1),new h("ую",-1,1),new h("юю",-1,1),new h("ая",-1,1),new h("яя",-1,1)],w=[new h("ем",-1,1),new h("нн",-1,1),new h("вш",-1,1),new h("ивш",2,2),new h("ывш",2,2),new h("щ",-1,1),new h("ющ",5,1),new h("ующ",6,2)],i=[new h("сь",-1,1),new h("ся",-1,1)],u=[new h("ла",-1,1),new h("ила",0,2),new h("ыла",0,2),new h("на",-1,1),new h("ена",3,2),new h("ете",-1,1),new h("ите",-1,2),new h("йте",-1,1),new h("ейте",7,2),new h("уйте",7,2),new h("ли",-1,1),new h("или",10,2),new h("ыли",10,2),new h("й",-1,1),new h("ей",13,2),new h("уй",13,2),new h("л",-1,1),new h("ил",16,2),new h("ыл",16,2),new h("ем",-1,1),new h("им",-1,2),new h("ым",-1,2),new h("н",-1,1),new h("ен",22,2),new h("ло",-1,1),new h("ило",24,2),new h("ыло",24,2),new h("но",-1,1),new h("ено",27,2),new h("нно",27,1),new h("ет",-1,1),new h("ует",30,2),new h("ит",-1,2),new h("ыт",-1,2),new h("ют",-1,1),new h("уют",34,2),new h("ят",-1,2),new h("ны",-1,1),new h("ены",37,2),new h("ть",-1,1),new h("ить",39,2),new h("ыть",39,2),new h("ешь",-1,1),new h("ишь",-1,2),new h("ю",-1,2),new h("ую",44,2)],s=[new h("а",-1,1),new h("ев",-1,1),new h("ов",-1,1),new h("е",-1,1),new h("ие",3,1),new h("ье",3,1),new h("и",-1,1),new h("еи",6,1),new h("ии",6,1),new h("ами",6,1),new h("ями",6,1),new h("иями",10,1),new h("й",-1,1),new h("ей",12,1),new h("ией",13,1),new h("ий",12,1),new h("ой",12,1),new h("ам",-1,1),new h("ем",-1,1),new h("ием",18,1),new h("ом",-1,1),new h("ям",-1,1),new h("иям",21,1),new h("о",-1,1),new h("у",-1,1),new h("ах",-1,1),new h("ях",-1,1),new h("иях",26,1),new h("ы",-1,1),new h("ь",-1,1),new h("ю",-1,1),new h("ию",30,1),new h("ью",30,1),new h("я",-1,1),new h("ия",33,1),new h("ья",33,1)],o=[new h("ост",-1,1),new h("ость",-1,1)],c=[new h("ейше",-1,1),new h("н",-1,2),new h("ейш",-1,1),new h("ь",-1,3)],m=[33,65,8,232],l=new g;function f(){for(;!l.in_grouping(m,1072,1103);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function a(){for(;!l.out_grouping(m,1072,1103);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function p(e,n){var r,t;if(l.ket=l.cursor,r=l.find_among_b(e,n)){switch(l.bra=l.cursor,r){case 1:if(t=l.limit-l.cursor,!l.eq_s_b(1,"а")&&(l.cursor=l.limit-t,!l.eq_s_b(1,"я")))return!1;case 2:l.slice_del()}return!0}return!1}function d(e,n){var r;return l.ket=l.cursor,!!(r=l.find_among_b(e,n))&&(l.bra=l.cursor,1==r&&l.slice_del(),!0)}function _(){return!!d(t,26)&&(p(w,8),!0)}function b(){var e;l.ket=l.cursor,(e=l.find_among_b(o,2))&&(l.bra=l.cursor,n<=l.cursor&&1==e&&l.slice_del())}this.setCurrent=function(e){l.setCurrent(e)},this.getCurrent=function(){return l.getCurrent()},this.stem=function(){return e=l.limit,n=e,f()&&(e=l.cursor,a()&&f()&&a()&&(n=l.cursor)),l.cursor=l.limit,!(l.cursor>3]&1<<(7&s))return this.cursor++,!0}return!1},in_grouping_b:function(r,t,i){if(this.cursor>this.limit_backward){var s=b.charCodeAt(this.cursor-1);if(s<=i&&t<=s&&r[(s-=t)>>3]&1<<(7&s))return this.cursor--,!0}return!1},out_grouping:function(r,t,i){if(this.cursor>3]&1<<(7&s)))return this.cursor++,!0}return!1},out_grouping_b:function(r,t,i){if(this.cursor>this.limit_backward){var s=b.charCodeAt(this.cursor-1);if(i>3]&1<<(7&s)))return this.cursor--,!0}return!1},eq_s:function(r,t){if(this.limit-this.cursor>1),a=0,f=u=(l=r[i]).s_size){if(this.cursor=e+l.s_size,!l.method)return l.result;var m=l.method();if(this.cursor=e+l.s_size,m)return l.result}if((i=l.substring_i)<0)return 0}},find_among_b:function(r,t){for(var i=0,s=t,e=this.cursor,n=this.limit_backward,u=0,o=0,h=!1;;){for(var c=i+(s-i>>1),a=0,f=u=(_=r[i]).s_size){if(this.cursor=e-_.s_size,!_.method)return _.result;var m=_.method();if(this.cursor=e-_.s_size,m)return _.result}if((i=_.substring_i)<0)return 0}},replace_s:function(r,t,i){var s=i.length-(t-r);return b=b.substring(0,r)+i+b.substring(t),this.limit+=s,this.cursor>=t?this.cursor+=s:this.cursor>r&&(this.cursor=r),s},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>b.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),b.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}}); \ No newline at end of file diff --git a/docs/v1.2.0/_static/javascripts/lunr/lunr.sv.js b/docs/v1.2.0/_static/javascripts/lunr/lunr.sv.js new file mode 100644 index 0000000000..6daf5f9d80 --- /dev/null +++ b/docs/v1.2.0/_static/javascripts/lunr/lunr.sv.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,l,n;e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=(r=e.stemmerSupport.Among,l=e.stemmerSupport.SnowballProgram,n=new function(){var n,t,i=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],s=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],a=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],o=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],u=[119,127,149],m=new l;this.setCurrent=function(e){m.setCurrent(e)},this.getCurrent=function(){return m.getCurrent()},this.stem=function(){var e,r=m.cursor;return function(){var e,r=m.cursor+3;if(t=m.limit,0<=r||r<=m.limit){for(n=r;;){if(e=m.cursor,m.in_grouping(o,97,246)){m.cursor=e;break}if(m.cursor=e,m.cursor>=m.limit)return;m.cursor++}for(;!m.out_grouping(o,97,246);){if(m.cursor>=m.limit)return;m.cursor++}(t=m.cursor)=t&&(m.limit_backward=t,m.cursor=m.limit,m.ket=m.cursor,e=m.find_among_b(i,37),m.limit_backward=r,e))switch(m.bra=m.cursor,e){case 1:m.slice_del();break;case 2:m.in_grouping_b(u,98,121)&&m.slice_del()}}(),m.cursor=m.limit,e=m.limit_backward,m.cursor>=t&&(m.limit_backward=t,m.cursor=m.limit,m.find_among_b(s,7)&&(m.cursor=m.limit,m.ket=m.cursor,m.cursor>m.limit_backward&&(m.bra=--m.cursor,m.slice_del())),m.limit_backward=e),m.cursor=m.limit,function(){var e,r;if(m.cursor>=t){if(r=m.limit_backward,m.limit_backward=t,m.cursor=m.limit,m.ket=m.cursor,e=m.find_among_b(a,5))switch(m.bra=m.cursor,e){case 1:m.slice_del();break;case 2:m.slice_from("lös");break;case 3:m.slice_from("full")}m.limit_backward=r}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}}); \ No newline at end of file diff --git a/docs/v1.2.0/_static/javascripts/lunr/lunr.th.js b/docs/v1.2.0/_static/javascripts/lunr/lunr.th.js new file mode 100644 index 0000000000..ee8ef373a0 --- /dev/null +++ b/docs/v1.2.0/_static/javascripts/lunr/lunr.th.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(t){if(void 0===t)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===t.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==t.version[0];t.th=function(){this.pipeline.reset(),this.pipeline.add(t.th.trimmer),i?this.tokenizer=t.th.tokenizer:(t.tokenizer&&(t.tokenizer=t.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=t.th.tokenizer))},t.th.wordCharacters="[฀-๿]",t.th.trimmer=t.trimmerSupport.generateTrimmer(t.th.wordCharacters),t.Pipeline.registerFunction(t.th.trimmer,"trimmer-th");var n=t.wordcut;n.init(),t.th.tokenizer=function(e){if(!arguments.length||null==e||null==e)return[];if(Array.isArray(e))return e.map(function(e){return i?new t.Token(e):e});var r=e.toString().replace(/^\s+/,"");return n.cut(r).split("|")}}}); \ No newline at end of file diff --git a/docs/v1.2.0/_static/javascripts/lunr/lunr.tr.js b/docs/v1.2.0/_static/javascripts/lunr/lunr.tr.js new file mode 100644 index 0000000000..e8fb5a7df6 --- /dev/null +++ b/docs/v1.2.0/_static/javascripts/lunr/lunr.tr.js @@ -0,0 +1 @@ +!function(r,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var mr,dr,i;r.tr=function(){this.pipeline.reset(),this.pipeline.add(r.tr.trimmer,r.tr.stopWordFilter,r.tr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(r.tr.stemmer))},r.tr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.tr.trimmer=r.trimmerSupport.generateTrimmer(r.tr.wordCharacters),r.Pipeline.registerFunction(r.tr.trimmer,"trimmer-tr"),r.tr.stemmer=(mr=r.stemmerSupport.Among,dr=r.stemmerSupport.SnowballProgram,i=new function(){var t,r=[new mr("m",-1,-1),new mr("n",-1,-1),new mr("miz",-1,-1),new mr("niz",-1,-1),new mr("muz",-1,-1),new mr("nuz",-1,-1),new mr("müz",-1,-1),new mr("nüz",-1,-1),new mr("mız",-1,-1),new mr("nız",-1,-1)],i=[new mr("leri",-1,-1),new mr("ları",-1,-1)],e=[new mr("ni",-1,-1),new mr("nu",-1,-1),new mr("nü",-1,-1),new mr("nı",-1,-1)],n=[new mr("in",-1,-1),new mr("un",-1,-1),new mr("ün",-1,-1),new mr("ın",-1,-1)],u=[new mr("a",-1,-1),new mr("e",-1,-1)],o=[new mr("na",-1,-1),new mr("ne",-1,-1)],s=[new mr("da",-1,-1),new mr("ta",-1,-1),new mr("de",-1,-1),new mr("te",-1,-1)],c=[new mr("nda",-1,-1),new mr("nde",-1,-1)],l=[new mr("dan",-1,-1),new mr("tan",-1,-1),new mr("den",-1,-1),new mr("ten",-1,-1)],a=[new mr("ndan",-1,-1),new mr("nden",-1,-1)],m=[new mr("la",-1,-1),new mr("le",-1,-1)],d=[new mr("ca",-1,-1),new mr("ce",-1,-1)],f=[new mr("im",-1,-1),new mr("um",-1,-1),new mr("üm",-1,-1),new mr("ım",-1,-1)],b=[new mr("sin",-1,-1),new mr("sun",-1,-1),new mr("sün",-1,-1),new mr("sın",-1,-1)],w=[new mr("iz",-1,-1),new mr("uz",-1,-1),new mr("üz",-1,-1),new mr("ız",-1,-1)],_=[new mr("siniz",-1,-1),new mr("sunuz",-1,-1),new mr("sünüz",-1,-1),new mr("sınız",-1,-1)],k=[new mr("lar",-1,-1),new mr("ler",-1,-1)],p=[new mr("niz",-1,-1),new mr("nuz",-1,-1),new mr("nüz",-1,-1),new mr("nız",-1,-1)],g=[new mr("dir",-1,-1),new mr("tir",-1,-1),new mr("dur",-1,-1),new mr("tur",-1,-1),new mr("dür",-1,-1),new mr("tür",-1,-1),new mr("dır",-1,-1),new mr("tır",-1,-1)],y=[new mr("casına",-1,-1),new mr("cesine",-1,-1)],z=[new mr("di",-1,-1),new mr("ti",-1,-1),new mr("dik",-1,-1),new mr("tik",-1,-1),new mr("duk",-1,-1),new mr("tuk",-1,-1),new mr("dük",-1,-1),new mr("tük",-1,-1),new mr("dık",-1,-1),new mr("tık",-1,-1),new mr("dim",-1,-1),new mr("tim",-1,-1),new mr("dum",-1,-1),new mr("tum",-1,-1),new mr("düm",-1,-1),new mr("tüm",-1,-1),new mr("dım",-1,-1),new mr("tım",-1,-1),new mr("din",-1,-1),new mr("tin",-1,-1),new mr("dun",-1,-1),new mr("tun",-1,-1),new mr("dün",-1,-1),new mr("tün",-1,-1),new mr("dın",-1,-1),new mr("tın",-1,-1),new mr("du",-1,-1),new mr("tu",-1,-1),new mr("dü",-1,-1),new mr("tü",-1,-1),new mr("dı",-1,-1),new mr("tı",-1,-1)],h=[new mr("sa",-1,-1),new mr("se",-1,-1),new mr("sak",-1,-1),new mr("sek",-1,-1),new mr("sam",-1,-1),new mr("sem",-1,-1),new mr("san",-1,-1),new mr("sen",-1,-1)],v=[new mr("miş",-1,-1),new mr("muş",-1,-1),new mr("müş",-1,-1),new mr("mış",-1,-1)],q=[new mr("b",-1,1),new mr("c",-1,2),new mr("d",-1,3),new mr("ğ",-1,4)],C=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,8,0,0,0,0,0,0,1],P=[1,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,1],F=[65],S=[65],W=[["a",[1,64,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],97,305],["e",[17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130],101,252],["ı",[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],97,305],["i",[17],101,105],["o",F,111,117],["ö",S,246,252],["u",F,111,117]],L=new dr;function x(r,i,e){for(;;){var n=L.limit-L.cursor;if(L.in_grouping_b(r,i,e)){L.cursor=L.limit-n;break}if(L.cursor=L.limit-n,L.cursor<=L.limit_backward)return!1;L.cursor--}return!0}function A(){var r,i;r=L.limit-L.cursor,x(C,97,305);for(var e=0;eL.limit_backward&&(L.cursor--,e=L.limit-L.cursor,i()))?(L.cursor=L.limit-e,!0):(L.cursor=L.limit-n,r()?(L.cursor=L.limit-n,!1):(L.cursor=L.limit-n,!(L.cursor<=L.limit_backward)&&(L.cursor--,!!i()&&(L.cursor=L.limit-n,!0))))}function j(r){return E(r,function(){return L.in_grouping_b(C,97,305)})}function T(){return j(function(){return L.eq_s_b(1,"n")})}function Z(){return j(function(){return L.eq_s_b(1,"y")})}function B(){return L.find_among_b(r,10)&&E(function(){return L.in_grouping_b(P,105,305)},function(){return L.out_grouping_b(C,97,305)})}function D(){return A()&&L.in_grouping_b(P,105,305)&&j(function(){return L.eq_s_b(1,"s")})}function G(){return L.find_among_b(i,2)}function H(){return A()&&L.find_among_b(n,4)&&T()}function I(){return A()&&L.find_among_b(s,4)}function J(){return A()&&L.find_among_b(c,2)}function K(){return A()&&L.find_among_b(f,4)&&Z()}function M(){return A()&&L.find_among_b(b,4)}function N(){return A()&&L.find_among_b(w,4)&&Z()}function O(){return L.find_among_b(_,4)}function Q(){return A()&&L.find_among_b(k,2)}function R(){return A()&&L.find_among_b(g,8)}function U(){return A()&&L.find_among_b(z,32)&&Z()}function V(){return L.find_among_b(h,8)&&Z()}function X(){return A()&&L.find_among_b(v,4)&&Z()}function Y(){var r=L.limit-L.cursor;return!(X()||(L.cursor=L.limit-r,U()||(L.cursor=L.limit-r,V()||(L.cursor=L.limit-r,L.eq_s_b(3,"ken")&&Z()))))}function $(){if(L.find_among_b(y,2)){var r=L.limit-L.cursor;if(O()||(L.cursor=L.limit-r,Q()||(L.cursor=L.limit-r,K()||(L.cursor=L.limit-r,M()||(L.cursor=L.limit-r,N()||(L.cursor=L.limit-r))))),X())return!1}return!0}function rr(){if(!A()||!L.find_among_b(p,4))return!0;var r=L.limit-L.cursor;return!U()&&(L.cursor=L.limit-r,!V())}function ir(){var r,i,e,n=L.limit-L.cursor;if(L.ket=L.cursor,t=!0,Y()&&(L.cursor=L.limit-n,$()&&(L.cursor=L.limit-n,function(){if(Q()){L.bra=L.cursor,L.slice_del();var r=L.limit-L.cursor;return L.ket=L.cursor,R()||(L.cursor=L.limit-r,U()||(L.cursor=L.limit-r,V()||(L.cursor=L.limit-r,X()||(L.cursor=L.limit-r)))),t=!1}return!0}()&&(L.cursor=L.limit-n,rr()&&(L.cursor=L.limit-n,e=L.limit-L.cursor,!(O()||(L.cursor=L.limit-e,N()||(L.cursor=L.limit-e,M()||(L.cursor=L.limit-e,K()))))||(L.bra=L.cursor,L.slice_del(),i=L.limit-L.cursor,L.ket=L.cursor,X()||(L.cursor=L.limit-i),0)))))){if(L.cursor=L.limit-n,!R())return;L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,r=L.limit-L.cursor,O()||(L.cursor=L.limit-r,Q()||(L.cursor=L.limit-r,K()||(L.cursor=L.limit-r,M()||(L.cursor=L.limit-r,N()||(L.cursor=L.limit-r))))),X()||(L.cursor=L.limit-r)}L.bra=L.cursor,L.slice_del()}function er(){var r,i,e,n;if(L.ket=L.cursor,L.eq_s_b(2,"ki")){if(r=L.limit-L.cursor,I())return L.bra=L.cursor,L.slice_del(),i=L.limit-L.cursor,L.ket=L.cursor,Q()?(L.bra=L.cursor,L.slice_del(),er()):(L.cursor=L.limit-i,B()&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er()))),!0;if(L.cursor=L.limit-r,H()){if(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,e=L.limit-L.cursor,G())L.bra=L.cursor,L.slice_del();else{if(L.cursor=L.limit-e,L.ket=L.cursor,!B()&&(L.cursor=L.limit-e,!D()&&(L.cursor=L.limit-e,!er())))return!0;L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())}return!0}if(L.cursor=L.limit-r,J()){if(n=L.limit-L.cursor,G())L.bra=L.cursor,L.slice_del();else if(L.cursor=L.limit-n,D())L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er());else if(L.cursor=L.limit-n,!er())return!1;return!0}}return!1}function nr(r){if(L.ket=L.cursor,!J()&&(L.cursor=L.limit-r,!A()||!L.find_among_b(o,2)))return!1;var i=L.limit-L.cursor;if(G())L.bra=L.cursor,L.slice_del();else if(L.cursor=L.limit-i,D())L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er());else if(L.cursor=L.limit-i,!er())return!1;return!0}function tr(r){if(L.ket=L.cursor,!(A()&&L.find_among_b(a,2)||(L.cursor=L.limit-r,A()&&L.find_among_b(e,4))))return!1;var i=L.limit-L.cursor;return!(!D()&&(L.cursor=L.limit-i,!G()))&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er()),!0)}function ur(){var r,i=L.limit-L.cursor;return L.ket=L.cursor,!!(H()||(L.cursor=L.limit-i,A()&&L.find_among_b(m,2)&&Z()))&&(L.bra=L.cursor,L.slice_del(),r=L.limit-L.cursor,L.ket=L.cursor,!(!Q()||(L.bra=L.cursor,L.slice_del(),!er()))||(L.cursor=L.limit-r,L.ket=L.cursor,(B()||(L.cursor=L.limit-r,D()||(L.cursor=L.limit-r,er())))&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())),!0))}function or(){var r,i,e=L.limit-L.cursor;if(L.ket=L.cursor,!(I()||(L.cursor=L.limit-e,A()&&L.in_grouping_b(P,105,305)&&Z()||(L.cursor=L.limit-e,A()&&L.find_among_b(u,2)&&Z()))))return!1;if(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,r=L.limit-L.cursor,B())L.bra=L.cursor,L.slice_del(),i=L.limit-L.cursor,L.ket=L.cursor,Q()||(L.cursor=L.limit-i);else if(L.cursor=L.limit-r,!Q())return!0;return L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,er(),!0}function sr(){var r,i,e=L.limit-L.cursor;if(L.ket=L.cursor,Q())return L.bra=L.cursor,L.slice_del(),void er();if(L.cursor=L.limit-e,L.ket=L.cursor,A()&&L.find_among_b(d,2)&&T())if(L.bra=L.cursor,L.slice_del(),r=L.limit-L.cursor,L.ket=L.cursor,G())L.bra=L.cursor,L.slice_del();else{if(L.cursor=L.limit-r,L.ket=L.cursor,!B()&&(L.cursor=L.limit-r,!D())){if(L.cursor=L.limit-r,L.ket=L.cursor,!Q())return;if(L.bra=L.cursor,L.slice_del(),!er())return}L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())}else if(L.cursor=L.limit-e,!nr(e)&&(L.cursor=L.limit-e,!tr(e))){if(L.cursor=L.limit-e,L.ket=L.cursor,A()&&L.find_among_b(l,4))return L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,i=L.limit-L.cursor,void(B()?(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())):(L.cursor=L.limit-i,Q()?(L.bra=L.cursor,L.slice_del()):L.cursor=L.limit-i,er()));if(L.cursor=L.limit-e,!ur()){if(L.cursor=L.limit-e,G())return L.bra=L.cursor,void L.slice_del();L.cursor=L.limit-e,er()||(L.cursor=L.limit-e,or()||(L.cursor=L.limit-e,L.ket=L.cursor,(B()||(L.cursor=L.limit-e,D()))&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er()))))}}}function cr(r,i,e){if(L.cursor=L.limit-r,function(){for(;;){var r=L.limit-L.cursor;if(L.in_grouping_b(C,97,305)){L.cursor=L.limit-r;break}if(L.cursor=L.limit-r,L.cursor<=L.limit_backward)return!1;L.cursor--}return!0}()){var n=L.limit-L.cursor;if(!L.eq_s_b(1,i)&&(L.cursor=L.limit-n,!L.eq_s_b(1,e)))return!0;L.cursor=L.limit-r;var t=L.cursor;return L.insert(L.cursor,L.cursor,e),L.cursor=t,!1}return!0}function lr(r,i,e){for(;!L.eq_s(i,e);){if(L.cursor>=L.limit)return!0;L.cursor++}return i!=L.limit||(L.cursor=r,!1)}function ar(){var r,i,e=L.cursor;return!(!lr(r=L.cursor,2,"ad")||!lr(L.cursor=r,5,"soyad"))&&(L.limit_backward=e,L.cursor=L.limit,i=L.limit-L.cursor,(L.eq_s_b(1,"d")||(L.cursor=L.limit-i,L.eq_s_b(1,"g")))&&cr(i,"a","ı")&&cr(i,"e","i")&&cr(i,"o","u")&&cr(i,"ö","ü"),L.cursor=L.limit,function(){var r;if(L.ket=L.cursor,r=L.find_among_b(q,4))switch(L.bra=L.cursor,r){case 1:L.slice_from("p");break;case 2:L.slice_from("ç");break;case 3:L.slice_from("t");break;case 4:L.slice_from("k")}}(),!0)}this.setCurrent=function(r){L.setCurrent(r)},this.getCurrent=function(){return L.getCurrent()},this.stem=function(){return!!(function(){for(var r,i=L.cursor,e=2;;){for(r=L.cursor;!L.in_grouping(C,97,305);){if(L.cursor>=L.limit)return L.cursor=r,!(0e&&(this._events[n].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[n].length),"function"==typeof console.trace&&console.trace()));return this},r.prototype.once=function(n,t){if(!a(t))throw TypeError("listener must be a function");var e=!1;function r(){this.removeListener(n,r),e||(e=!0,t.apply(this,arguments))}return r.listener=t,this.on(n,r),this},r.prototype.removeListener=function(n,t){var e,r,i,o;if(!a(t))throw TypeError("listener must be a function");if(!this._events||!this._events[n])return this;if(i=(e=this._events[n]).length,r=-1,e===t||a(e.listener)&&e.listener===t)delete this._events[n],this._events.removeListener&&this.emit("removeListener",n,t);else if(c(e)){for(o=i;0this.maxLength)return i();if(!this.stat&&p(this.cache,o)){var t=this.cache[o];if(Array.isArray(t)&&(t="DIR"),!n||"DIR"===t)return i(null,t);if(n&&"FILE"===t)return i()}var e=this.statCache[o];if(void 0!==e){if(!1===e)return i(null,e);var s=e.isDirectory()?"DIR":"FILE";return n&&"FILE"===s?i():i(null,s,e)}var a=this,c=d("stat\0"+o,function(n,e){{if(e&&e.isSymbolicLink())return u.stat(o,function(n,t){n?a._stat2(r,o,null,e,i):a._stat2(r,o,n,t,i)});a._stat2(r,o,n,e,i)}});c&&u.lstat(o,c)},b.prototype._stat2=function(n,t,e,r,i){if(e)return this.statCache[t]=!1,i();var o="/"===n.slice(-1);if(this.statCache[t]=r,"/"===t.slice(-1)&&!r.isDirectory())return i(null,!1,r);var s=r.isDirectory()?"DIR":"FILE";return this.cache[t]=this.cache[t]||s,o&&"DIR"!==s?i():i(null,s,r)}}).call(this,_("_process"))},{"./common.js":15,"./sync.js":17,_process:24,assert:9,events:14,fs:12,inflight:18,inherits:19,minimatch:20,once:21,path:22,"path-is-absolute":23,util:28}],17:[function(e,r,n){(function(i){(r.exports=n).GlobSync=h;var s=e("fs"),c=e("minimatch"),g=(c.Minimatch,e("./glob.js").Glob,e("util"),e("path")),u=e("assert"),l=e("path-is-absolute"),t=e("./common.js"),o=(t.alphasort,t.alphasorti,t.setopts),a=t.ownProp,f=t.childrenIgnored;function n(n,t){if("function"==typeof t||3===arguments.length)throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");return new h(n,t).found}function h(n,t){if(!n)throw new Error("must provide pattern");if("function"==typeof t||3===arguments.length)throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");if(!(this instanceof h))return new h(n,t);if(o(this,n,t),this.noprocess)return this;var e=this.minimatch.set.length;this.matches=new Array(e);for(var r=0;rthis.maxLength)return!1;if(!this.stat&&a(this.cache,t)){var r=this.cache[t];if(Array.isArray(r)&&(r="DIR"),!e||"DIR"===r)return r;if(e&&"FILE"===r)return!1}var i=this.statCache[t];if(!i){var o;try{o=s.lstatSync(t)}catch(n){return!1}if(o.isSymbolicLink())try{i=s.statSync(t)}catch(n){i=o}else i=o}r=(this.statCache[t]=i).isDirectory()?"DIR":"FILE";return this.cache[t]=this.cache[t]||r,(!e||"DIR"===r)&&r},h.prototype._mark=function(n){return t.mark(this,n)},h.prototype._makeAbs=function(n){return t.makeAbs(this,n)}}).call(this,e("_process"))},{"./common.js":15,"./glob.js":16,_process:24,assert:9,fs:12,minimatch:20,path:22,"path-is-absolute":23,util:28}],18:[function(t,r,n){(function(s){var n=t("wrappy"),a=Object.create(null),e=t("once");r.exports=n(function(n,t){return a[n]?(a[n].push(t),null):(a[n]=[t],o=n,e(function n(){var t=a[o],e=t.length,r=function(n){for(var t=n.length,e=[],r=0;re?(t.splice(0,e),s.nextTick(function(){n.apply(null,r)})):delete a[o]}}));var o})}).call(this,t("_process"))},{_process:24,once:21,wrappy:29}],19:[function(n,t,e){"function"==typeof Object.create?t.exports=function(n,t){n.super_=t,n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(n,t){n.super_=t;var e=function(){};e.prototype=t.prototype,n.prototype=new e,n.prototype.constructor=n}},{}],20:[function(n,t,e){(t.exports=s).Minimatch=i;var u={sep:"/"};try{u=n("path")}catch(n){}var M=s.GLOBSTAR=i.GLOBSTAR={},r=n("brace-expansion"),C={"!":{open:"(?:(?!(?:",close:"))[^/]*?)"},"?":{open:"(?:",close:")?"},"+":{open:"(?:",close:")+"},"*":{open:"(?:",close:")*"},"@":{open:"(?:",close:")"}},P="[^/]",z=P+"*?",B="().*{}+?[]^$\\!".split("").reduce(function(n,t){return n[t]=!0,n},{});var l=/\/+/;function o(t,e){t=t||{},e=e||{};var r={};return Object.keys(e).forEach(function(n){r[n]=e[n]}),Object.keys(t).forEach(function(n){r[n]=t[n]}),r}function s(n,t,e){if("string"!=typeof t)throw new TypeError("glob pattern string required");return e||(e={}),!(!e.nocomment&&"#"===t.charAt(0))&&(""===t.trim()?""===n:new i(t,e).match(n))}function i(n,t){if(!(this instanceof i))return new i(n,t);if("string"!=typeof n)throw new TypeError("glob pattern string required");t||(t={}),n=n.trim(),"/"!==u.sep&&(n=n.split(u.sep).join("/")),this.options=t,this.set=[],this.pattern=n,this.regexp=null,this.negate=!1,this.comment=!1,this.empty=!1,this.make()}function a(n,t){if(t||(t=this instanceof i?this.options:{}),void 0===(n=void 0===n?this.pattern:n))throw new TypeError("undefined pattern");return t.nobrace||!n.match(/\{.*\}/)?[n]:r(n)}s.filter=function(r,i){return i=i||{},function(n,t,e){return s(n,r,i)}},s.defaults=function(r){if(!r||!Object.keys(r).length)return s;var i=s,n=function(n,t,e){return i.minimatch(n,t,o(r,e))};return n.Minimatch=function(n,t){return new i.Minimatch(n,o(r,t))},n},i.defaults=function(n){return n&&Object.keys(n).length?s.defaults(n).Minimatch:i},i.prototype.debug=function(){},i.prototype.make=function(){if(this._made)return;var n=this.pattern,t=this.options;if(!t.nocomment&&"#"===n.charAt(0))return void(this.comment=!0);if(!n)return void(this.empty=!0);this.parseNegate();var e=this.globSet=this.braceExpand();t.debug&&(this.debug=console.error);this.debug(this.pattern,e),e=this.globParts=e.map(function(n){return n.split(l)}),this.debug(this.pattern,e),e=e.map(function(n,t,e){return n.map(this.parse,this)},this),this.debug(this.pattern,e),e=e.filter(function(n){return-1===n.indexOf(!1)}),this.debug(this.pattern,e),this.set=e},i.prototype.parseNegate=function(){var n=this.pattern,t=!1,e=this.options,r=0;if(e.nonegate)return;for(var i=0,o=n.length;i>> no match, partial?",n,f,t,h),f!==s))}if("string"==typeof u?(c=r.nocase?l.toLowerCase()===u.toLowerCase():l===u,this.debug("string match",u,l,c)):(c=l.match(u),this.debug("pattern match",u,l,c)),!c)return!1}if(i===s&&o===a)return!0;if(i===s)return e;if(o===a)return i===s-1&&""===n[i];throw new Error("wtf?")}},{"brace-expansion":11,path:22}],21:[function(n,t,e){var r=n("wrappy");function i(n){var t=function(){return t.called?t.value:(t.called=!0,t.value=n.apply(this,arguments))};return t.called=!1,t}function o(n){var t=function(){if(t.called)throw new Error(t.onceError);return t.called=!0,t.value=n.apply(this,arguments)},e=n.name||"Function wrapped with `once`";return t.onceError=e+" shouldn't be called more than once",t.called=!1,t}t.exports=r(i),t.exports.strict=r(o),i.proto=i(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return i(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return o(this)},configurable:!0})})},{wrappy:29}],22:[function(n,t,u){(function(i){function o(n,t){for(var e=0,r=n.length-1;0<=r;r--){var i=n[r];"."===i?n.splice(r,1):".."===i?(n.splice(r,1),e++):e&&(n.splice(r,1),e--)}if(t)for(;e--;e)n.unshift("..");return n}var t=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,s=function(n){return t.exec(n).slice(1)};function a(n,t){if(n.filter)return n.filter(t);for(var e=[],r=0;r":">",'"':""","'":"'","`":"`"},D=d.invert(N),F=function(t){var e=function(n){return t[n]},n="(?:"+d.keys(t).join("|")+")",r=RegExp(n),i=RegExp(n,"g");return function(n){return n=null==n?"":""+n,r.test(n)?n.replace(i,e):n}};d.escape=F(N),d.unescape=F(D),d.result=function(n,t,e){var r=null==n?void 0:n[t];return void 0===r&&(r=e),d.isFunction(r)?r.call(n):r};var M=0;d.uniqueId=function(n){var t=++M+"";return n?n+t:t},d.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var C=/(.)^/,P={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},z=/\\|'|\r|\n|\u2028|\u2029/g,B=function(n){return"\\"+P[n]};d.template=function(o,n,t){!n&&t&&(n=t),n=d.defaults({},n,d.templateSettings);var e=RegExp([(n.escape||C).source,(n.interpolate||C).source,(n.evaluate||C).source].join("|")+"|$","g"),s=0,a="__p+='";o.replace(e,function(n,t,e,r,i){return a+=o.slice(s,i).replace(z,B),s=i+n.length,t?a+="'+\n((__t=("+t+"))==null?'':_.escape(__t))+\n'":e?a+="'+\n((__t=("+e+"))==null?'':__t)+\n'":r&&(a+="';\n"+r+"\n__p+='"),n}),a+="';\n",n.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{var r=new Function(n.variable||"obj","_",a)}catch(n){throw n.source=a,n}var i=function(n){return r.call(this,n,d)},c=n.variable||"obj";return i.source="function("+c+"){\n"+a+"}",i},d.chain=function(n){var t=d(n);return t._chain=!0,t};var U=function(n,t){return n._chain?d(t).chain():t};d.mixin=function(e){d.each(d.functions(e),function(n){var t=d[n]=e[n];d.prototype[n]=function(){var n=[this._wrapped];return i.apply(n,arguments),U(this,t.apply(d,n))}})},d.mixin(d),d.each(["pop","push","reverse","shift","sort","splice","unshift"],function(t){var e=r[t];d.prototype[t]=function(){var n=this._wrapped;return e.apply(n,arguments),"shift"!==t&&"splice"!==t||0!==n.length||delete n[0],U(this,n)}}),d.each(["concat","join","slice"],function(n){var t=r[n];d.prototype[n]=function(){return U(this,t.apply(this._wrapped,arguments))}}),d.prototype.value=function(){return this._wrapped},d.prototype.valueOf=d.prototype.toJSON=d.prototype.value,d.prototype.toString=function(){return""+this._wrapped}}).call(this)},{}],26:[function(n,t,e){arguments[4][19][0].apply(e,arguments)},{dup:19}],27:[function(n,t,e){t.exports=function(n){return n&&"object"==typeof n&&"function"==typeof n.copy&&"function"==typeof n.fill&&"function"==typeof n.readUInt8}},{}],28:[function(h,n,k){(function(r,i){var a=/%[sdj%]/g;k.format=function(n){if(!_(n)){for(var t=[],e=0;e elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.5.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.5 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2020-03-14 + */ +( function( window ) { +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[ i ] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] + // or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + nonHex : + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android<4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + + // Can't trust NodeList.length + while ( ( target[ j++ ] = els[ i++ ] ) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split( "|" ), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[ i ] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( ( cur = cur.nextSibling ) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return ( name === "input" || name === "button" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem.namespaceURI, + docElem = ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find[ "TAG" ] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll( "[name=d]" ).length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + } ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + } : + function( a, b ) { + if ( b ) { + while ( ( b = b.parentNode ) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == preferredDoc && + contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document || b.ownerDocument == preferredDoc && + contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( ( cur = cur.parentNode ) ) { + ap.unshift( cur ); + } + cur = b; + while ( ( cur = cur.parentNode ) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[ i ] === bp[ i ] ) { + i++; + } + + return i ? + + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[ i ], bp[ i ] ) : + + // Otherwise nodes in our document sort first + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || + match[ 5 ] || "" ).replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( + className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + /* eslint-disable max-len */ + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + /* eslint-enable max-len */ + + }; + }, + + "CHILD": function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + "not": markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element (issue #299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + "has": markFunction( function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + } ), + + "contains": markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && + ( !document.hasFocus || document.hasFocus() ) && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); + }, + + "selected": function( elem ) { + + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos[ "empty" ]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo( function() { + return [ 0 ]; + } ), + + "last": createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + "even": createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "odd": createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rcombinators.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( + selector || "*", + context.nodeType ? [ context ] : context, + [] + ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens + .slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( + selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) + ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find[ "ID" ]( token.matches[ 0 ] + .replace( runescape, funescape ), context ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || + context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + } ); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert( function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + } ); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; + } + } ); +} + +return Sizzle; + +} )( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + return result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px"; + tr.style.height = "1px"; + trChild.style.height = "9px"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( + dataPriv.get( cur, "events" ) || Object.create( null ) + )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script + if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

torchtrtc

+

torchtrtc is a CLI application for using the Torch-TensorRT compiler. It serves as an easy way to compile a +TorchScript Module with Torch-TensorRT from the command-line to quickly check support or as part of +a deployment pipeline. All basic features of the compiler are supported including post training +quantization (though you must already have a calibration cache file to use the PTQ feature). The compiler can +output two formats, either a TorchScript program with the TensorRT engine embedded or +the TensorRT engine itself as a PLAN file.

+

All that is required to run the program after compilation is for C++ linking against libtorchtrt.so +or in Python importing the torch_tensorrt package. All other aspects of using compiled modules are identical +to standard TorchScript. Load with torch.jit.load() and run like you would run any other module.

+
torchtrtc [input_file_path] [output_file_path]
+  [input_specs...] {OPTIONS}
+
+  torchtrtc is a compiler for TorchScript, it will compile and optimize
+  TorchScript programs to run on NVIDIA GPUs using TensorRT
+
+OPTIONS:
+
+    -h, --help                        Display this help menu
+    Verbiosity of the compiler
+      -v, --verbose                     Dumps debugging information about the
+                                        compilation process onto the console
+      -w, --warnings                    Disables warnings generated during
+                                        compilation onto the console (warnings
+                                        are on by default)
+      --i, --info                       Dumps info messages generated during
+                                        compilation onto the console
+    --build-debuggable-engine         Creates a debuggable engine
+    --allow-gpu-fallback              (Only used when targeting DLA
+                                      (device-type)) Lets engine run layers on
+                                      GPU if they are not supported on DLA
+    --require-full-compilation        Require that the model should be fully
+                                      compiled to TensorRT or throw an error
+    --check-method-support=[method_name]
+                                      Check the support for end to end
+                                      compilation of a specified method in the
+                                      TorchScript module
+    --disable-tf32                    Prevent Float32 layers from using the
+                                      TF32 data format
+    --sparse-weights                  Enable sparsity for weights of conv and
+                                      FC layers
+    -p[precision...],
+    --enable-precision=[precision...] (Repeatable) Enabling an operating
+                                      precision for kernels to use when
+                                      building the engine (Int8 requires a
+                                      calibration-cache argument) [ float |
+                                      float32 | f32 | fp32 | half | float16 |
+                                      f16 | fp16 | int8 | i8 | char ]
+                                      (default: float)
+    -d[type], --device-type=[type]    The type of device the engine should be
+                                      built for [ gpu | dla ] (default: gpu)
+    --gpu-id=[gpu_id]                 GPU id if running on multi-GPU platform
+                                      (defaults to 0)
+    --dla-core=[dla_core]             DLACore id if running on available DLA
+                                      (defaults to 0)
+    --engine-capability=[capability]  The type of device the engine should be
+                                      built for [ standard | safety |
+                                      dla_standalone ]
+    --calibration-cache-file=[file_path]
+                                      Path to calibration cache file to use
+                                      for post training quantization
+    --teo=[op_name...],
+    --torch-executed-op=[op_name...]  (Repeatable) Operator in the graph that
+                                      should always be run in PyTorch for
+                                      execution (partial compilation must be
+                                      enabled)
+    --tem=[module_name...],
+    --torch-executed-mod=[module_name...]
+                                      (Repeatable) Module that should always
+                                      be run in Pytorch for execution (partial
+                                      compilation must be enabled)
+    --mbs=[num_ops],
+    --min-block-size=[num_ops]        Minimum number of contiguous TensorRT
+                                      supported ops to compile a subgraph to
+                                      TensorRT
+    --embed-engine                    Whether to treat input file as a
+                                      serialized TensorRT engine and embed it
+                                      into a TorchScript module (device spec
+                                      must be provided)
+    --num-avg-timing-iters=[num_iters]
+                                      Number of averaging timing iterations
+                                      used to select kernels
+    --workspace-size=[workspace_size] Maximum size of workspace given to
+                                      TensorRT
+    --dla-sram-size=[dla_sram_size]   Fast software managed RAM used by DLA
+                                      to communicate within a layer.
+    --dla-local-dram-size=[dla_local_dram_size]  Host RAM used by DLA to share
+                                      intermediate tensor data across operations.
+    --dla-global-dram-size=[dla_global_dram_size] Host RAM used by DLA to store
+                                      weights and metadata for execution
+    --atol=[atol]                     Absolute tolerance threshold for acceptable
+                                      numerical deviation from standard torchscript
+                                      output (default 1e-8)
+    --rtol=[rtol]                     Relative tolerance threshold for acceptable
+                                      numerical deviation from standard torchscript
+                                      output  (default 1e-5)
+    --no-threshold-check              Skip checking threshold compliance
+    --truncate-long-double,
+    --truncate, --truncate-64bit      Truncate weights that are provided in
+                                      64bit to 32bit (Long, Double to Int,
+                                      Float)
+    --save-engine                     Instead of compiling a full a
+                                      TorchScript program, save the created
+                                      engine to the path specified as the
+                                      output path
+    --custom-torch-ops                (repeatable) Shared object/DLL containing custom torch operators
+    --custom-converters               (repeatable) Shared object/DLL containing custom converters
+    input_file_path                   Path to input TorchScript file
+    output_file_path                  Path for compiled TorchScript (or
+                                      TensorRT engine) file
+    input_specs...                    Specs for inputs to engine, can either
+                                      be a single size or a range defined by
+                                      Min, Optimal, Max sizes, e.g.
+                                      "(N,..,C,H,W)"
+                                      "[(MIN_N,..,MIN_C,MIN_H,MIN_W);(OPT_N,..,OPT_C,OPT_H,OPT_W);(MAX_N,..,MAX_C,MAX_H,MAX_W)]".
+                                      Data Type and format can be specified by
+                                      adding an "@" followed by dtype and "%"
+                                      followed by format to the end of the
+                                      shape spec. e.g. "(3, 3, 32,
+                                      32)@f16%NHWC"
+    "--" can be used to terminate flag options and force all following
+    arguments to be treated as positional options
+
+
+

e.g.

+
torchtrtc tests/modules/ssd_traced.jit.pt ssd_trt.ts "[(1,3,300,300); (1,3,512,512); (1, 3, 1024, 1024)]@f16%contiguous" -p f16
+
+
+
    +
  • To include a set of custom operators

  • +
+
torchtrtc tests/modules/ssd_traced.jit.pt ssd_trt.ts --custom-torch-ops=<path to custom library .so file> "[(1,3,300,300); (1,3,512,512); (1, 3, 1024, 1024)]@fp16%contiguous" -p f16
+
+
+
    +
  • To include a set of custom converters

  • +
+
torchtrtc tests/modules/ssd_traced.jit.pt ssd_trt.ts --custom-converters=<path to custom library .so file> "[(1,3,300,300); (1,3,512,512); (1, 3, 1024, 1024)]@fp16%contiguous" -p f16
+
+
+
+ + +
+ +
+ + +
+
+ +
+
+
+ + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/contributors/conversion.html b/docs/v1.2.0/contributors/conversion.html new file mode 100644 index 0000000000..9045bbc78e --- /dev/null +++ b/docs/v1.2.0/contributors/conversion.html @@ -0,0 +1,726 @@ + + + + + + + + + + + + + Conversion Phase — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Conversion Phase

+

Once the graph has be simplified to a form thats easy to convert, we then set up a conversion context +to manage the construction of a TensorRT INetworkDefinition from the blocks nodes. The conversion context +records the set of converted nodes, block inputs and outputs and other information about the conversion +of the graph. This data is then used to help converters link together layers and also hold build time +information like weights required to construct the engine. After the context is created, the block +converter starts iterating through the list of nodes, for each node, the converter will look at its +inputs and assemble an array of resources to pass to the converter. Inputs can be in a couple of states:

+
    +
  • The input is a block parameter

    +
      +
    • In this case the input should have already been stored in as an IValue in the +conversion context evaluated_value_map. The conversion stage will add the IValue to the list of args for the +converter

    • +
    +
  • +
  • The input is an output of a node that has already been converted

    +
      +
    • In this case the ITensor of the output has added to the value_tensor_map, +The conversion stage will add the ITensor to the list of args for the converter

    • +
    +
  • +
  • The input is from a node that produces a static value

    +
      +
    • There are nodes that produce static values, typically used to store parameters for operators, we need to +evaluate these nodes at conversion time to be able to convert a op. The conversion system will look for a node +evaluator in the evaluator registry and run it on the node. The IValue produced will be entered in the +conversion context evaluated_value_map and added to the list of args for the converter. If the node +to be evaluated takes inputs, the conversion stage will recursively resolve dependencies until the final +static value has been evaluated

    • +
    +
  • +
  • The input is from a node that has not been converted

    +
      +
    • Torch-TensorRT will error out here

    • +
    +
  • +
+
+

Node Evaluation

+

There are some nodes that contain static data and are resources for operations. These can be evaluated at +conversion time so that you can use those values when doing node conversion. In theory any node kind can have +a conversion time evaluator as long as it produces a static IValue, This IValue will be stored in the conversion +context so it can be consumed by any node that takes the evaluated node as an input. Common node types are +prim::Constant which emits a constant and prim::ListConstruct which makes lists.

+
+
+

Node Converters

+

Node converters map JIT nodes to layers or subgraphs of layers. They then associate outputs from the JIT graph +and the TRT graph together in the conversion context. This allows the conversion stage to assemble the inputs +for the next node. There are some cases where a node produces an output that is not a Tensor but a static result +from a calculation done on inputs which need to be converted first. In this case the converter may associate the outputs in +the evaluated_value_map instead of the value_tensor_map. For more information take a look at: Writing Converters

+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/contributors/lowering.html b/docs/v1.2.0/contributors/lowering.html new file mode 100644 index 0000000000..8d07aea200 --- /dev/null +++ b/docs/v1.2.0/contributors/lowering.html @@ -0,0 +1,888 @@ + + + + + + + + + + + + + Lowering Phase — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Lowering Phase

+

The lowering phase is made up out of passes which are operations which map a graph from a high level representation +to a lower level one. Each pass does something specific for instance inlining method calls. The idea is to +significantly reduce what the conversion phase needs to be able to handle when actually mapping to TensorRT. +We aim for closer to 1->1 op conversion vs looking for applicable subgraphs, limiting the number of converters and +reduce the scope of each converter.

+

You can see the effects of each pass by setting the log level to Level::kGraph

+
+

Passes Used

+
+

EliminateCommonSubexpression

+
+
+

Removes common subexpressions in the graph

+
+
+

Eliminate Dead Code

+
+
+

Dead code elimination will check if a node has side effects and not delete it if it does.

+
+
+

Eliminate Exeception Or Pass Pattern

+
+
+

A common pattern in scripted modules are dimension gaurds which will throw execptions if +the input dimension is not what was expected.

+
%1013 : bool = aten::ne(%1012, %24) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/batchnorm.py:248:11
+    = prim::If(%1013) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/batchnorm.py:248:8
+    block0():
+        = prim::RaiseException(%23) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/batchnorm.py:249:12
+    -> ()
+    block1():
+    -> ()
+
+
+

Since we are resolving all of this at compile time and there are no execptions in the TensorRT graph, we just remove it.

+
+
+

Eliminate Redundant Gaurds

+
+
+

Eliminate redundant guards for ops whose outputs are fully determined by their inputs i.e. if inputs to such ops are +guarded we are allowed to remove a guard on ops’ outputs

+
+
+

Freeze Module

+
+
+

Freeze attributes and inline constants and modules. Propogates constants in the graph.

+
+
+

Fuse AddMM Branches

+
+
+

A common pattern in scripted modules is tensors of different dimensions use different constructions for implementing linear layers. We fuse these +different varients into a single one that will get caught by the Unpack AddMM pass.

+
%ret : Tensor = prim::If(%622)
+block0():
+  %ret.1 : Tensor = aten::addmm(%self.fc.bias, %x9.1, %3677, %3, %3)
+  -> (%ret.1)
+block1():
+  %output.1 : Tensor = aten::matmul(%x9.1, %3677)
+  %output0.1 : Tensor = aten::add_(%output.1, %self.fc.bias, %3)
+  -> (%output0.1)
+
+
+

We fuse this set of blocks into a graph like this:

+
%ret : Tensor = aten::addmm(%self.fc.bias, %x9.1, %3677, %3, %3)
+
+
+
+
+

Fuse Linear

+
+
+

Match the aten::linear pattern and fuse it into a single aten::linear +This pass fuse the addmm or matmul + add generated by JIT back to linear

+
+
+

Fuse Flatten Linear

+
+
+

TensorRT implicity flattens input layers into fully connected layers when they are higher than 1D. So when there is a +aten::flatten -> aten::linear pattern we remove the aten::flatten.

+
+
+

Lower Graph

+
+
+

Given a graph with of a method which first argument is %self, lower it to a graph where +all attributes accesses are replaced with explicit inputs of the graph +(rather than results of prim::GetAttr executed on %self). Returns a tuple +(graph, parameters) where the last module.parameters.size() inputs to the +graph are the trainable parameters used in this method. The remaining inputs +are the true inputs to the function.

+
+
+

Lower Tuples

+
+
+
    +
  • LowerSimpleTuples:

  • +
+

Removes tuples where TupleConstruct and TupleUnpack are matched but leaves tuples in place across if statements, loops, and as inputs/outputs

+
    +
  • LowerAllTuples:

  • +
+

Removes _all_ tuples and raises an error if some cannot be removed, this is used by ONNX to ensure there are not tuples before conversion, but will not work on graphs whose inputs contain tuples.

+
+
+

Module Fallback

+
+
+

Module fallback consists of two lowering passes that must be run as a pair. The first pass is run before freezing to place delimiters in the graph around modules +that should run in PyTorch. The second pass marks nodes between these delimiters after freezing to signify they should run in PyTorch.

+
    +
  • NotateModuleForFallback

  • +
+

Places delimiting nodes around module calls pre freezing to signify where in the graph nodes should run in PyTorch

+
    +
  • MarkNodesForFallback

  • +
+

Looks for delimiters then marks all nodes between the delimiters to tell partitioning to run them in PyTorch

+
+
+

Peephole Optimze

+
+
+

The intent for this optimization pass is to catch all of the small, easy to catch peephole optimizations you might be interested in doing.

+
+
Right now, it does:
    +
  • Eliminate no-op ‘expand’ nodes

  • +
  • Simply x.t().t() to x

  • +
+
+
+
+
+

Remove Contiguous

+
+
+

Removes contiguous operators since we are doing TensorRT memory is already contiguous.

+
+
+

Remove Dropout

+
+
+

Removes dropout operators since we are doing inference.

+
+
+

Remove To

+
+
+

Removes aten::to operators that do casting, since TensorRT mangages it itself. It is important that this is one of the last passes run so that +other passes have a change to move required cast operators out of the main namespace.

+
+
+

Unpack AddMM

+
+
+

Unpacks aten::addmm into aten::matmul and aten::add_ (with an additional trt::const +op to freeze the bias in the TensorRT graph). This lets us reuse the aten::matmul and aten::add_ +converters instead of needing a dedicated converter.

+
+
+

Unpack LogSoftmax

+
+
+

Unpacks aten::logsoftmax into aten::softmax and aten::log. This lets us reuse the +aten::softmax and aten::log converters instead of needing a dedicated converter.

+
+
+

Unroll Loops

+
+
+

Unrolls the operations of compatable loops (e.g. sufficently short) so that you only have to go through the loop once.

+
+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/contributors/partitioning.html b/docs/v1.2.0/contributors/partitioning.html new file mode 100644 index 0000000000..84173f1cbf --- /dev/null +++ b/docs/v1.2.0/contributors/partitioning.html @@ -0,0 +1,754 @@ + + + + + + + + + + + + + Partitioning Phase — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Partitioning Phase

+

The phase is optional and enabled by the user. It instructs the compiler to separate nodes into ones that should run in PyTorch and ones that should run in TensorRT. +Criteria for separation include: Lack of a converter, operator is explicitly set to run in PyTorch by the user or the node has a flag which tells partitioning to +run in PyTorch by the module fallback passes.

+

On a high level, Torch-TensorRT partitioning phase does the following:

+
    +
  • Segmentation. Go through the set of operators in order and verify if there is converter for each operator. Then, roughly separate the graph into parts that Torch-TensorRT can support and parts Torch-TensorRT cannot.

  • +
  • Dependency Analysis. For every to be compiled operator there is a “complete dependency graph”, which means that every input can to traced back to an input as Tensor or TensorList. Go through all segments after segmentation then do dependency analysis to ensure that there are only Tensor/TensorList inputs and outputs for TensorRT segments.

  • +
  • Shape Analysis. For each segments, figure out the input and outputs shapes starting from the provided input shape from the user. Shapes can be calculated by running the graphs with JIT.

  • +
  • Conversion. Every TensorRT segments will be converted to TensorRT engine. This part is done in compiler.cpp, but it’s still a phase in our partitioning process.

  • +
  • Stitching. Stitch all TensorRT engines with PyTorch nodes altogether.

  • +
+

Here are the brief description of these functions of each file:

+
+

PartitonInfo.h/.cpp

+
+
+

The automatic fallback APIs that is used for partitioning.

+
+
+

SegmentedBlock.h/.cpp

+
+
+

The main data structures that is used to maintain information for each segments after segmentation.

+
+
+

shape_analysis.h/.cpp

+
+
+

Code implementation to get the shapes for each segments by running them in JIT.

+
+
+

partitioning.h/.cpp

+
+
+

APIs and main code implementation for partitioning phase.

+
+
+
+

Automatic Fallback

+

To enable automatic fallback feature, you can set following attributes in Python:

+
import torch
+import torch_tensorrt as torchtrt
+
+...
+model = MyModel()
+ts_model = torch.jit.script(model)
+trt_model = torchtrt.ts.compile(model, **{
+  ...
+  "min_block_size" : 3,
+  "torch_executed_ops": ["aten::add"],
+  "torch_executed_modules": [],
+})
+
+
+
    +
  • enabled: By default automatic fallback will be off. It is enabled by setting it to True.

  • +
  • min_block_size: The minimum number of consecutive operations that must satisfy to be converted to TensorRT. For example, if it’s set to 3, then there must be 3 consecutive supported operators then this segments will be converted.

  • +
  • forced_fallback_ops: A list of strings that will be the names of operations that the user explicitly want to be in PyTorch nodes.

  • +
+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+
+...
+auto in = torch::randn({1, 3, 224, 224}, {torch::kCUDA});
+
+auto mod = torch::jit::load("trt_ts_module.ts");
+auto input_sizes =  std::vector<torchtrt::InputRange>{{in.sizes()}};
+torchtrt::ts::CompileSpec cfg(input_sizes);
+cfg.min_block_size = 2;
+cfg.torch_executed_ops.push_back("aten::relu");
+auto trt_mod = torchtrt::ts::compile(mod, cfg);
+auto out = trt_mod.forward({in});
+
+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/contributors/phases.html b/docs/v1.2.0/contributors/phases.html new file mode 100644 index 0000000000..2306511c19 --- /dev/null +++ b/docs/v1.2.0/contributors/phases.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + Compiler Phases — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Compiler Phases

+
+
+
+

Lowering

+

Lowering Phase

+

The lowering is made up of a set of passes (some from PyTorch and some specific to Torch-TensorRT) +run over the graph IR to map the large PyTorch opset to a reduced opset that is easier to convert to +TensorRT.

+
+
+

Partitioning

+

Partitioning Phase

+

The phase is optional and enabled by the user. It instructs the compiler to separate nodes into ones that should run in PyTorch and ones that should run in TensorRT. +Criteria for separation include: Lack of a converter, operator is explicitly set to run in PyTorch by the user or the node has a flag which tells partitioning to +run in PyTorch by the module fallback passes.

+
+
+

Conversion

+

Conversion Phase

+

In the conversion phase we traverse the lowered graph and construct an equivalent TensorRT graph. +The conversion phase is made up of three main components, a context to manage compile time data, +a evaluator library which will execute operations that can be resolved at compile time and a converter +library which maps an op from JIT to TensorRT.

+
+
+

Compilation and Runtime

+

Deploying Torch-TensorRT Programs

+

The final compilation phase constructs a TorchScript program to run the converted TensorRT engine. It +takes a serialized engine and instantiates it within a engine manager, then the compiler will +build out a JIT graph that references this engine and wraps it in a module to return to the user. +When the user executes the module, the JIT program run in the JIT runtime extended by Torch-TensorRT with the data providied from the user.

+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/contributors/runtime.html b/docs/v1.2.0/contributors/runtime.html new file mode 100644 index 0000000000..a9a058de51 --- /dev/null +++ b/docs/v1.2.0/contributors/runtime.html @@ -0,0 +1,746 @@ + + + + + + + + + + + + + Runtime Phase — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Runtime Phase

+

The Runtime phase is responsible for constructing self standing TorchScript graphs with embedded TensorRT engines and serving as the runtime +when these engines are called. The main interface accepts a serialized TensorRT engine. The execution phase +will deserialize and wrap this engine in a class which maintains a execution context for each engine +and some metadata about its inputs and outputs and is compatable with the TorchScript interpreter so that +it can be moved around and used like other TorchScript IValues. The engine is run by providing it and inputs +to the tensorrt::execute_engine operator which will take the engine and its inputs and return the results of engine exeuction.

+
+

Background

+

PyTorch JIT’s runtime is based around a stack machine, all operators pop off arguments from the stack, pass them to +some implementation of the operator then push results back onto the stack. The actual elements of the stack +are torch::jit::IValues, the same type we evaluate in the conversion phase (the realization of the abstract +torch::jit::Value type).

+
+
+

TensorRT Engine Executor Op

+

When the Torch-TensorRT is loaded, it registers an operator in the PyTorch JIT operator library called +trt::execute_engine(Tensor[] inputs, __torch__.torch.classes.tensorrt.Engine engine) -> Tensor[] which takes an +instantiated engine and list of inputs. Compiled graphs store this engine in an attribute so that it is portable and serializable. +When the op is called, an instnantiated engine and input tensors are popped off the runtime stack. These inputs are passed into a generic engine execution function which +will run the tensors through the TensorRT engine and return new tensors as results. These tensors are pushed on to the +stack so that the next op whatever it is can use it.

+
+
+

Constructing the Resulting Graph

+

Once the engine is deserialized and instantiated, the compiler will construct a graph that will execute the engine when the module is called. +Here is an example:

+
graph(%self_1 : __torch__.torchvision.models.resnet.___torch_mangle_4847.ResNet_trt,
+  %input_0 : Tensor):
+    %1 : __torch__.torch.classes.tensorrt.Engine = prim::GetAttr[name="__torch___torchvision_models_resnet____torch_mangle_4847_ResNet_trt_engine"](%self_1)
+    %3 : Tensor[] = prim::ListConstruct(%input_0)
+    %4 : Tensor[] = trt::execute_engine(%3, %1)
+    %5 : Tensor = prim::ListUnpack(%4)
+return (%5)
+
+
+

You can see the engine attribute in the graph and the trt::execute_engine op taking a list of input tensors and an engine in +and produces a list of output tensors which is returned. When forward is called on the module this graph is executed, thereby +running the TensorRT engine.

+

In the case of multiple outputs, the compiled graph may repack output tensors into a Tuple to return back to the user.

+
graph(%self_1 : __torch__.PyTorch.Detection.SSD.src.model.SSD300_trt,
+  %input_0 : Tensor):
+    %1 : __torch__.torch.classes.tensorrt.Engine = prim::GetAttr[name="__torch___PyTorch_Detection_SSD_src_model_SSD300_trt_engine"](%self_1)
+    %3 : Tensor[] = prim::ListConstruct(%input_0)
+    %4 : Tensor[] = trt::execute_engine(%3, %1)
+    %5 : Tensor, %6 : Tensor = prim::ListUnpack(%4)
+    %7 : (Tensor, Tensor) = prim::TupleConstruct(%5, %6)
+return (%7)
+
+
+
+
+

Serialization and Deserialization

+

Serialization and deserialization of TensorRT engines embedded in TorchScript graphs are handled by the holder class for the engine and TorchBind. +When a TorchScript module is saved, the pickler will run serilization on the cuda engine and store the serialized engine in the zip file created. +When deserializing, the depickler will call a constructor for the engine holder class with the serialized engine so that it can be set up again for +execution.

+
+
+
+

ABI Versioning and Serialization Format

+

Torch-TensorRT programs are standard TorchScript with TensorRT engines as objects embedded in the graph. Therefore there is a serialization format +for the TensorRT engines. The format for Torch-TensorRT serialized programs are versioned with an “ABI” version which tells the runtime about runtime compatibility.

+

> Current ABI version is 3

+

The format is a vector of serialized strings. They encode the following information

+
    +
  • ABI Version for the program

  • +
  • Name of the TRT engine

  • +
  • Device information: Includes the target device the engine was built on, SM capability and other device information. This information is used at deserialization time to select the correct device to run the engine

  • +
  • Serialized TensorRT engine

  • +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/contributors/system_overview.html b/docs/v1.2.0/contributors/system_overview.html new file mode 100644 index 0000000000..0b9731e0bc --- /dev/null +++ b/docs/v1.2.0/contributors/system_overview.html @@ -0,0 +1,730 @@ + + + + + + + + + + + + + System Overview — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

System Overview

+

Torch-TensorRT is primarily a C++ Library with a Python API planned. We use Bazel as our build system and target Linux x86_64 and +Linux aarch64 (only natively) right now. The compiler we use is GCC 7.5.0 and the library is untested with compilers before that +version so there may be compilation errors if you try to use an older compiler.

+

The repository is structured into:

+
    +
  • core: Main compiler source code

  • +
  • cpp: C++ API

  • +
  • tests: tests of the C++ API, the core and converters

  • +
  • py: Python API

  • +
  • notebooks: Example applications built with Torch-TensorRT

  • +
  • docs: Documentation

  • +
  • docsrc: Documentation Source

  • +
  • third_party: BUILD files for dependency libraries

  • +
  • toolchains: Toolchains for different platforms

  • +
+

The C++ API is unstable and subject to change until the library matures, though most work is done under the hood in the core.

+

The core has a couple major parts: The top level compiler interface which coordinates ingesting a module, lowering, +converting and generating a new module and returning it back to the user. There are the three main phases of the +compiler, the lowering phase, the conversion phase, and the execution phase.

+
+

Compiler Phases

+
+
+
+

Lowering

+

Lowering Phase

+

The lowering is made up of a set of passes (some from PyTorch and some specific to Torch-TensorRT) +run over the graph IR to map the large PyTorch opset to a reduced opset that is easier to convert to +TensorRT.

+
+
+

Partitioning

+

Partitioning Phase

+

The phase is optional and enabled by the user. It instructs the compiler to separate nodes into ones that should run in PyTorch and ones that should run in TensorRT. +Criteria for separation include: Lack of a converter, operator is explicitly set to run in PyTorch by the user or the node has a flag which tells partitioning to +run in PyTorch by the module fallback passes.

+
+
+

Conversion

+

Conversion Phase

+

In the conversion phase we traverse the lowered graph and construct an equivalent TensorRT graph. +The conversion phase is made up of three main components, a context to manage compile time data, +a evaluator library which will execute operations that can be resolved at compile time and a converter +library which maps an op from JIT to TensorRT.

+
+
+

Compilation and Runtime

+

Deploying Torch-TensorRT Programs

+

The final compilation phase constructs a TorchScript program to run the converted TensorRT engine. It +takes a serialized engine and instantiates it within a engine manager, then the compiler will +build out a JIT graph that references this engine and wraps it in a module to return to the user. +When the user executes the module, the JIT program run in the JIT runtime extended by Torch-TensorRT with the data providied from the user.

+
+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/contributors/useful_links.html b/docs/v1.2.0/contributors/useful_links.html new file mode 100644 index 0000000000..f0e1695023 --- /dev/null +++ b/docs/v1.2.0/contributors/useful_links.html @@ -0,0 +1,711 @@ + + + + + + + + + + + + + Useful Links for Torch-TensorRT Development — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Useful Links for Torch-TensorRT Development
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ + + + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/contributors/writing_converters.html b/docs/v1.2.0/contributors/writing_converters.html new file mode 100644 index 0000000000..ad3c8905b0 --- /dev/null +++ b/docs/v1.2.0/contributors/writing_converters.html @@ -0,0 +1,801 @@ + + + + + + + + + + + + + Writing Converters — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Writing Converters
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Writing Converters

+
+

Background

+

In the JIT IR, operations are represented as nodes in a graph. A node has inputs and outputs, represented by torch::jit::Values +which are typed abstract representation of data flowing into and out of a node. TensorRT represents its graph though the +use of nvinfer1::ILayers and nvinfer1::ITensors which are its analogues to nodes and values. The goal of +converters create new ILayers and subgraphs that do operation specified by the node and associate produced ITensors +and Values together.

+
+
+

Converters

+

Converters should be functions which will use a list of inputs (either nvinfer1::ITensors or torch::jit::IValues) to +construct an equivalent layer to the LibTorch op.

+

Converters can be registered using the RegisterNodeConversionPatterns helper class where you instantiate a +RegisterNodeConversionPatterns object and call the pattern function on it (like below) which takes a string +which describes the function schema of the op that will cause the converter to be run and a lambda or function +which will do the actual conversion:

+
+

Note the pattern function can be chained

+
+
auto acthardtanh TORCHTRT_UNUSED = RegisterNodeConversionPatterns()
+    .pattern({
+        "aten::hardtanh(Tensor self, Scalar min_val=-1, Scalar max_val=1) -> (Tensor)",
+        [](ConversionCtx* ctx, const torch::jit::Node* n, args& args) -> bool {
+            auto in = args[0].ITensor();
+            auto min = args[1].unwrapToDouble();
+            auto max = args[2].unwrapToDouble();
+
+            auto new_layer = ctx->net->addActivation(*in, nvinfer1::ActivationType::kCLIP);
+            TORCHTRT_CHECK(new_layer, "Unable to create layer for aten::hardtanh");
+
+            new_layer->setAlpha(min);
+            new_layer->setBeta(max);
+
+            new_layer->setName(util::node_info(n).c_str());
+            auto out_tensor = ctx->AssociateValueAndTensor(n->outputs()[0], new_layer->getOutput(0));
+
+            LOG_DEBUG("Output shape: " << out_tensor->getDimensions());
+            return true;
+        }
+    });
+
+
+
+
+

Converter Contract

+
+

What is guaranteed to converters

+
    +
  1. In the args there will be an entry for each node input value, either a ITensor or IValue

  2. +
  3. Inputs will be provided in order according to the function schema

  4. +
+
+
+

Responsibilities of a converter

+
    +
  1. Args must be guaranteed to be a type to unwrap the Arg union without checking, typically input tensor arguments can be expected to be ITensors

  2. +
  3. Any weights or static values must guaranteed to be valid until the end of conversion time

    +
      +
    1. A helpful tool is the Weights helper class described below

    2. +
    +
  4. +
  5. Converters are expected to produce an IValue or ITensor for each output of a node. The compiler will check this and produce warnings if there are Values that don’t have associated ITensors or IValues.

  6. +
  7. Outputs must be annotated

    +
      +
    1. There must be an association between a JIT nodes output values and the new TRT layers output tensors in the value_tensor_map in the conversion context

    2. +
    +
  8. +
  9. Name your layers

    +
      +
    1. Its much easier to debug when we can track which layers and nodes correspond with each other. The system we are currently using is to use the “node info” of the node as the name of the layer

    2. +
    +
  10. +
  11. Name your tensors

    +
      +
    1. Use the output value debug name as the name for the new ITensor (again for debugging)

    2. +
    +
  12. +
+
+
+
+

Conversion Context

+

The conversion context maintains the state of conversion, it manages the Network Definition, two maps +one that stores associations between Values and IValues (the evaluated_value_map) and one that stores +associations between Values and ITensors, and any sort of memory that needs to live until the end of +conversion. The main apis that you will interface with in converters is directly accessing the network +definition to add layers ctx->net and data association functions ctx->AssociateValueAndTensor() +and ctx->AssociateValueAndIValue(), which you will use to add layers to the TRT layers and log +pairs of node outputs and static values or TensorRT layer outputs.

+
+
+

Args

+

Arguments provided to the converter are inspectable unions of nvinfer1::ITensors and torch::jit::IValues (i.e. +abstract dataflow in the TensorRT graph and static values). You are guaranteed that you will have some +argument for each input value for the node. They are provided in the order of the function schema. +It can be expected that inputs (meaning the parameters that would be passed into the forward +function of a module in PyTorch) will be ITensors but the Arg class also has mechanisms to inspect arguments safely +before unwrapping if you are unsure. Args also have deep unwrap methods that let you get straight to the +underlying data in an IValue if you know it’s safe. You can also pass in a fallback value if there is a +chance the IValue is None. IValues have been extended to be able to hold a wrapper around ITensors only in the case of TensorLists. +You can get an ITensor from an IValue by a pattern similar to this: ivalue.toCustomClass<TensorContainer>()->tensor(). +You can tell if an IValue contains a Tensor or an ITensor by using ivalue.isTensor() or ivalue.isCustomClass().

+
+
+

Weights

+

Weights are used during build time, so any weights need to be guaranteed to live until the end of the conversion phase. +TensorRT also uses its own weights structure to hold the weights. There is a wrapper around this class available +to converts which abstracts a lot of this.

+

The weights wrapper class can accept either at::Tensors or singular values (right now). You also need to pass the +conversion context when constructing these weights because internally the weights class will allocate memory managed +by the conversion context to store a copy of the tensor data. This data gets freed when the conversion context +destructor gets destroyed so converters don’t really need to think about it.

+

There is metadata generated from the shape of the input data which becomes useful in interfacing with TensorRT, such +as number of input maps, number of output maps and kernel shape.

+
+
+

Other advice

+

You have the benefit of the full aten library when dealing with weights and other static values. This means that you +can do quite a bit of work during conversion time to produce efficient conversion. A good example is batch_norm +converter where the converter does fusion of operations with PyTorch before creating the TensorRT layer.

+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/genindex.html b/docs/v1.2.0/genindex.html new file mode 100644 index 0000000000..2b8b1f4ffe --- /dev/null +++ b/docs/v1.2.0/genindex.html @@ -0,0 +1,1231 @@ + + + + + + + + + + + + Index — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ + +

Index

+ +
+ _ + | A + | C + | D + | E + | F + | G + | I + | L + | M + | P + | R + | S + | T + | W + | X + +
+

_

+ + +
+ +

A

+ + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + +
+ +

G

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + +
+ +

P

+ + +
    +
  • + Python Enhancement Proposals + +
  • +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

W

+ + + +
+ +

X

+ + +
+ + + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/getting_started/getting_started_with_cpp_api.html b/docs/v1.2.0/getting_started/getting_started_with_cpp_api.html new file mode 100644 index 0000000000..cb08ad4a25 --- /dev/null +++ b/docs/v1.2.0/getting_started/getting_started_with_cpp_api.html @@ -0,0 +1,959 @@ + + + + + + + + + + + + + Using Torch-TensorRT in C++ — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Using Torch-TensorRT in C++
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Using Torch-TensorRT in C++

+

If you haven’t already, acquire a tarball of the library by following the instructions in Installation

+
+

Using Torch-TensorRT in C++

+

Torch-TensorRT C++ API accepts TorchScript modules (generated either from torch.jit.script or torch.jit.trace) as an input and returns +a Torchscript module (optimized using TensorRT). This requires users to use Pytorch (in python) to generate torchscript modules beforehand. +Please refer to Creating TorchScript modules in Python section to generate torchscript graphs.

+
+

[Torch-TensorRT Quickstart] Compiling TorchScript Modules with torchtrtc

+

An easy way to get started with Torch-TensorRT and to check if your model can be supported without extra work is to run it through +torchtrtc, which supports almost all features of the compiler from the command line including post training quantization +(given a previously created calibration cache). For example we can compile our lenet model by setting our preferred operating +precision and input size. This new TorchScript file can be loaded into Python (note: you need to import torch_tensorrt before loading +these compiled modules because the compiler extends the PyTorch the deserializer and runtime to execute compiled modules).

+
❯ torchtrtc -p f16 lenet_scripted.ts trt_lenet_scripted.ts "(1,1,32,32)"
+
+❯ python3
+Python 3.6.9 (default, Apr 18 2020, 01:56:04)
+[GCC 8.4.0] on linux
+Type "help", "copyright", "credits" or "license" for more information.
+>>> import torch
+>>> import torch_tensorrt
+>>> ts_model = torch.jit.load(“trt_lenet_scripted.ts”)
+>>> ts_model(torch.randn((1,1,32,32)).to(“cuda”).half())
+
+
+

You can learn more about torchtrtc usage here: torchtrtc

+
+
+

Working with TorchScript in C++

+

If we are developing an application to deploy with C++, we can save either our traced or scripted module using torch.jit.save +which will serialize the TorchScript code, weights and other information into a package. This is also where our dependency on Python ends.

+
torch_script_module.save("lenet.jit.pt")
+
+
+

From here we can now load our TorchScript module in C++

+
#include <torch/script.h> // One-stop header.
+
+#include <iostream>
+#include <memory>
+
+int main(int argc, const char* argv[]) {
+    torch::jit::Module module;
+    try {
+        // Deserialize the ScriptModule from a file using torch::jit::load().
+        module = torch::jit::load("<PATH TO SAVED TS MOD>");
+    }
+    catch (const c10::Error& e) {
+        std::cerr << "error loading the model\n";
+        return -1;
+    }
+
+    std::cout << "ok\n";
+
+
+

You can do full training and inference in C++ with PyTorch / LibTorch if you would like, you can even define your modules in C++ and +have access to the same powerful tensor library that backs PyTorch. (For more information: https://pytorch.org/cppdocs/). +For instance we can do inference with our LeNet module like this:

+
mod.eval();
+torch::Tensor in = torch::randn({1, 1, 32, 32});
+auto out = mod.forward(in);
+
+
+

and to run on the GPU:

+
mod.eval();
+mod.to(torch::kCUDA);
+torch::Tensor in = torch::randn({1, 1, 32, 32}, torch::kCUDA);
+auto out = mod.forward(in);
+
+
+

As you can see it is pretty similar to the Python API. When you call the forward method, you invoke the PyTorch JIT compiler, which will optimize and run your TorchScript code.

+
+
+

Compiling with Torch-TensorRT in C++

+

We are also at the point were we can compile and optimize our module with Torch-TensorRT, but instead of in a JIT fashion we must do it ahead-of-time (AOT) i.e. before we start doing actual inference work +since it takes a bit of time to optimize the module, it would not make sense to do this every time you run the module or even the first time you run it.

+

With our module loaded, we can feed it into the Torch-TensorRT compiler. When we do so we must provide some information on the expected input size and also configure any additional settings.

+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+...
+
+    mod.to(at::kCUDA);
+    mod.eval();
+
+    auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA});
+    auto trt_mod = torch_tensorrt::CompileGraph(mod, std::vector<torch_tensorrt::CompileSpec::InputRange>{{in.sizes()}});
+    auto out = trt_mod.forward({in});
+
+
+

Thats it! Now the graph runs primarily not with the JIT compiler but using TensorRT (though we execute the graph using the JIT runtime).

+

We can also set settings like operating precision to run in FP16.

+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+...
+
+    mod.to(at::kCUDA);
+    mod.eval();
+
+    auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}).to(torch::kHALF);
+    auto input_sizes = std::vector<torch_tensorrt::CompileSpec::InputRange>({in.sizes()});
+    torch_tensorrt::CompileSpec info(input_sizes);
+    info.enable_precisions.insert(torch::kHALF);
+    auto trt_mod = torch_tensorrt::CompileGraph(mod, info);
+    auto out = trt_mod.forward({in});
+
+
+

And now we are running the module in FP16 precision. You can then save the module to load later.

+
trt_mod.save("<PATH TO SAVED TRT/TS MOD>")
+
+
+

Torch-TensorRT compiled TorchScript modules are loaded in the same way as normal TorchScript module. Make sure your deployment application is linked against libtorchtrt.so

+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+
+int main(int argc, const char* argv[]) {
+    torch::jit::Module module;
+    try {
+        // Deserialize the ScriptModule from a file using torch::jit::load().
+        module = torch::jit::load("<PATH TO SAVED TRT/TS MOD>");
+    }
+    catch (const c10::Error& e) {
+        std::cerr << "error loading the model\n";
+        return -1;
+    }
+
+    torch::Tensor in = torch::randn({1, 1, 32, 32}, torch::kCUDA);
+    auto out = mod.forward(in);
+
+    std::cout << "ok\n";
+}
+
+
+

If you want to save the engine produced by Torch-TensorRT to use in a TensorRT application you can use the ConvertGraphToTRTEngine API.

+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+...
+
+    mod.to(at::kCUDA);
+    mod.eval();
+
+    auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}).to(torch::kHALF);
+    auto input_sizes = std::vector<torch_tensorrt::CompileSpec::InputRange>({in.sizes()});
+    torch_tensorrt::CompileSpec info(input_sizes);
+    info.enabled_precisions.insert(torch::kHALF);
+    auto trt_mod = torch_tensorrt::ConvertGraphToTRTEngine(mod, "forward", info);
+    std::ofstream out("/tmp/engine_converted_from_jit.trt");
+    out << engine;
+    out.close();
+
+
+
+
+

Under The Hood

+

When a module is provided to Torch-TensorRT, the compiler starts by mapping a graph like you saw above to a graph like this:

+
graph(%input.2 : Tensor):
+    %2 : Float(84, 10) = prim::Constant[value=<Tensor>]()
+    %3 : Float(120, 84) = prim::Constant[value=<Tensor>]()
+    %4 : Float(576, 120) = prim::Constant[value=<Tensor>]()
+    %5 : int = prim::Constant[value=-1]() # x.py:25:0
+    %6 : int[] = prim::Constant[value=annotate(List[int], [])]()
+    %7 : int[] = prim::Constant[value=[2, 2]]()
+    %8 : int[] = prim::Constant[value=[0, 0]]()
+    %9 : int[] = prim::Constant[value=[1, 1]]()
+    %10 : bool = prim::Constant[value=1]() # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0
+    %11 : int = prim::Constant[value=1]() # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0
+    %12 : bool = prim::Constant[value=0]() # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0
+    %self.classifer.fc3.bias : Float(10) = prim::Constant[value= 0.0464  0.0383  0.0678  0.0932  0.1045 -0.0805 -0.0435 -0.0818  0.0208 -0.0358 [ CUDAFloatType{10} ]]()
+    %self.classifer.fc2.bias : Float(84) = prim::Constant[value=<Tensor>]()
+    %self.classifer.fc1.bias : Float(120) = prim::Constant[value=<Tensor>]()
+    %self.feat.conv2.weight : Float(16, 6, 3, 3) = prim::Constant[value=<Tensor>]()
+    %self.feat.conv2.bias : Float(16) = prim::Constant[value=<Tensor>]()
+    %self.feat.conv1.weight : Float(6, 1, 3, 3) = prim::Constant[value=<Tensor>]()
+    %self.feat.conv1.bias : Float(6) = prim::Constant[value= 0.0530 -0.1691  0.2802  0.1502  0.1056 -0.1549 [ CUDAFloatType{6} ]]()
+    %input0.4 : Tensor = aten::_convolution(%input.2, %self.feat.conv1.weight, %self.feat.conv1.bias, %9, %8, %9, %12, %8, %11, %12, %12, %10) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0
+    %input0.5 : Tensor = aten::relu(%input0.4) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0
+    %input1.2 : Tensor = aten::max_pool2d(%input0.5, %7, %6, %8, %9, %12) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0
+    %input0.6 : Tensor = aten::_convolution(%input1.2, %self.feat.conv2.weight, %self.feat.conv2.bias, %9, %8, %9, %12, %8, %11, %12, %12, %10) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0
+    %input2.1 : Tensor = aten::relu(%input0.6) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0
+    %x.1 : Tensor = aten::max_pool2d(%input2.1, %7, %6, %8, %9, %12) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0
+    %input.1 : Tensor = aten::flatten(%x.1, %11, %5) # x.py:25:0
+    %27 : Tensor = aten::matmul(%input.1, %4)
+    %28 : Tensor = trt::const(%self.classifer.fc1.bias)
+    %29 : Tensor = aten::add_(%28, %27, %11)
+    %input0.2 : Tensor = aten::relu(%29) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0
+    %31 : Tensor = aten::matmul(%input0.2, %3)
+    %32 : Tensor = trt::const(%self.classifer.fc2.bias)
+    %33 : Tensor = aten::add_(%32, %31, %11)
+    %input1.1 : Tensor = aten::relu(%33) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0
+    %35 : Tensor = aten::matmul(%input1.1, %2)
+    %36 : Tensor = trt::const(%self.classifer.fc3.bias)
+    %37 : Tensor = aten::add_(%36, %35, %11)
+    return (%37)
+(CompileGraph)
+
+
+

The graph has now been transformed from a collection of modules, each managing their own parameters into a single graph with the parameters inlined +into the graph and all of the operations laid out. Torch-TensorRT has also executed a number of optimizations and mappings to make the graph easier to translate to TensorRT. +From here the compiler can assemble the TensorRT engine by following the dataflow through the graph.

+

When the graph construction phase is complete, Torch-TensorRT produces a serialized TensorRT engine. From here depending on the API, this engine is returned +to the user or moves into the graph construction phase. Here Torch-TensorRT creates a JIT Module to execute the TensorRT engine which will be instantiated and managed +by the Torch-TensorRT runtime.

+

Here is the graph that you get back after compilation is complete:

+
graph(%self_1 : __torch__.lenet, %input_0 : Tensor):
+    %1 : ...trt.Engine = prim::GetAttr[name="lenet"](%self_1)
+    %3 : Tensor[] = prim::ListConstruct(%input_0)
+    %4 : Tensor[] = trt::execute_engine(%3, %1)
+    %5 : Tensor = prim::ListUnpack(%4)
+    return (%5)
+
+
+

You can see the call where the engine is executed, after extracting the attribute containing the engine and constructing a list of inputs, then returns the tensors back to the user.

+
+
+

Working with Unsupported Operators

+

Torch-TensorRT is a new library and the PyTorch operator library is quite large, so there will be ops that aren’t supported natively by the compiler. You can either use the composition techinques +shown above to make modules are fully Torch-TensorRT supported and ones that are not and stitch the modules together in the deployment application or you can register converters for missing ops.

+
+

You can check support without going through the full compilation pipleine using the torch_tensorrt::CheckMethodOperatorSupport(const torch::jit::Module& module, std::string method_name) api +to see what operators are not supported. torchtrtc automatically checks modules with this method before starting compilation and will print out a list of operators that are not supported.

+
+
+

Registering Custom Converters

+

Operations are mapped to TensorRT through the use of modular converters, a function that takes a node from a the JIT graph and produces an equivalent layer or subgraph in TensorRT. +Torch-TensorRT ships with a library of these converters stored in a registry, that will be executed depending on the node being parsed. For instance a aten::relu(%input0.4) instruction will trigger +the relu converter to be run on it, producing an activation layer in the TensorRT graph. But since this library is not exhaustive you may need to write your own to get Torch-TensorRT +to support your module.

+

Shipped with the Torch-TensorRT distribution are the internal core API headers. You can therefore access the converter registry and add a converter for the op you need.

+

For example, if we try to compile a graph with a build of Torch-TensorRT that doesn’t support the flatten operation (aten::flatten) you may see this error:

+
terminate called after throwing an instance of 'torch_tensorrt::Error'
+what():  [enforce fail at core/conversion/conversion.cpp:109] Expected converter to be true but got false
+Unable to convert node: %input.1 : Tensor = aten::flatten(%x.1, %11, %5) # x.py:25:0 (conversion.AddLayer)
+Schema: aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor)
+Converter for aten::flatten requested, but no such converter was found.
+If you need a converter for this operator, you can try implementing one yourself
+or request a converter: https://www.github.com/NVIDIA/Torch-TensorRT/issues
+
+
+

We can register a converter for this operator in our application. All of the tools required to build a converter can be imported by including torch_tensorrt/core/conversion/converters/converters.h. +We start by creating an instance of the self-registering class torch_tensorrt::core::conversion::converters::RegisterNodeConversionPatterns() which will register converters +in the global converter registry, associating a function schema like aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor) with a lambda that +will take the state of the conversion, the node/operation in question to convert and all of the inputs to the node and produces as a side effect a new layer in the TensorRT network. +Arguments are passed as a vector of inspectable unions of TensorRT ITensors and Torch IValues in the order arguments are listed in the schema.

+

Below is a implementation of a aten::flatten converter that we can use in our application. You have full access to the Torch and TensorRT libraries in the converter implementation. So +for example we can quickly get the output size by just running the operation in PyTorch instead of implementing the full calculation outself like we do below for this flatten converter.

+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+#include "torch_tensorrt/core/conversion/converters/converters.h"
+
+static auto flatten_converter = torch_tensorrt::core::conversion::converters::RegisterNodeConversionPatterns()
+    .pattern({
+        "aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor)",
+        [](torch_tensorrt::core::conversion::ConversionCtx* ctx,
+           const torch::jit::Node* n,
+           torch_tensorrt::core::conversion::converters::args& args) -> bool {
+            auto in = args[0].ITensor();
+            auto start_dim = args[1].unwrapToInt();
+            auto end_dim = args[2].unwrapToInt();
+            auto in_shape = torch_tensorrt::core::util::toVec(in->getDimensions());
+            auto out_shape = torch::flatten(torch::rand(in_shape), start_dim, end_dim).sizes();
+
+            auto shuffle = ctx->net->addShuffle(*in);
+            shuffle->setReshapeDimensions(torch_tensorrt::core::util::toDims(out_shape));
+            shuffle->setName(torch_tensorrt::core::util::node_info(n).c_str());
+
+            auto out_tensor = ctx->AssociateValueAndTensor(n->outputs()[0], shuffle->getOutput(0));
+            return true;
+        }
+    });
+
+int main() {
+    ...
+
+
+

To use this converter in Python, it is recommended to use PyTorch’s C++ / CUDA Extention +template to wrap your library of converters into a .so that you can load with ctypes.CDLL() in your Python application.

+

You can find more information on all the details of writing converters in the contributors documentation (Writing Converters). +If you find yourself with a large library of converter implementations, do consider upstreaming them, PRs are welcome and it would be great for the community to benefit as well.

+
+
+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/getting_started/getting_started_with_python_api.html b/docs/v1.2.0/getting_started/getting_started_with_python_api.html new file mode 100644 index 0000000000..14c058f05e --- /dev/null +++ b/docs/v1.2.0/getting_started/getting_started_with_python_api.html @@ -0,0 +1,713 @@ + + + + + + + + + + + + + Using Torch-TensorRT in Python — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Using Torch-TensorRT in Python
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Using Torch-TensorRT in Python

+

The Torch-TensorRT Python API supports a number of unique usecases compared to the CLI and C++ APIs which solely support TorchScript compilation.

+

Torch-TensorRT Python API can accept a torch.nn.Module, torch.jit.ScriptModule, or torch.fx.GraphModule as an input. +Depending on what is provided one of the two frontends (TorchScript or FX) will be selected to compile the module. Provided the +module type is supported, users may explicitly set which frontend they would like to use using the ir flag for compile. +If given a torch.nn.Module and the ir flag is set to either default or torchscript the module will be run through +torch.jit.script to convert the input module into a TorchScript module.

+

To compile your input torch.nn.Module with Torch-TensorRT, all you need to do is provide the module and inputs +to Torch-TensorRT and you will be returned an optimized TorchScript module to run or add into another PyTorch module. Inputs +is a list of torch_tensorrt.Input classes which define input’s shape, datatype and memory format. You can also specify settings such as +operating precision for the engine or target device. After compilation you can save the module just like any other module +to load in a deployment application. In order to load a TensorRT/TorchScript module, make sure you first import torch_tensorrt.

+
import torch_tensorrt
+
+...
+
+model = MyModel().eval()  # torch module needs to be in eval (not training) mode
+
+inputs = [
+    torch_tensorrt.Input(
+        min_shape=[1, 1, 16, 16],
+        opt_shape=[1, 1, 32, 32],
+        max_shape=[1, 1, 64, 64],
+        dtype=torch.half,
+    )
+]
+enabled_precisions = {torch.float, torch.half}  # Run with fp16
+
+trt_ts_module = torch_tensorrt.compile(
+    model, inputs=inputs, enabled_precisions=enabled_precisions
+)
+
+input_data = input_data.to("cuda").half()
+result = trt_ts_module(input_data)
+torch.jit.save(trt_ts_module, "trt_ts_module.ts")
+
+
+
# Deployment application
+import torch
+import torch_tensorrt
+
+trt_ts_module = torch.jit.load("trt_ts_module.ts")
+input_data = input_data.to("cuda").half()
+result = trt_ts_module(input_data)
+
+
+

Torch-TensorRT Python API also provides torch_tensorrt.ts.compile which accepts a TorchScript module as input and torch_tensorrt.fx.compile which accepts a FX GraphModule as input.

+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/getting_started/getting_started_with_windows.html b/docs/v1.2.0/getting_started/getting_started_with_windows.html new file mode 100644 index 0000000000..a8f847d032 --- /dev/null +++ b/docs/v1.2.0/getting_started/getting_started_with_windows.html @@ -0,0 +1,732 @@ + + + + + + + + + + + + + Building Torch-TensorRT on Windows — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Building Torch-TensorRT on Windows
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Building Torch-TensorRT on Windows

+

Torch-TensorRT has community support for Windows platform using CMake

+

Prerequisite:

+
    +
  • Microsoft Visual Studio

  • +
  • LibTorch

  • +
  • TensorRT

  • +
  • CUDA

  • +
  • cuDNN

  • +
+
+

Build configuration

+
    +
  • Open Microsoft Visual Studio

  • +
  • Open Torch-TensorRT source code folder

  • +
  • Open Manage configurations -> Edit JSON to open CMakeSettings.json file.

  • +
  • Configure the CMake build configurations. Following is an example configuration:

  • +
+
{
+  "configurations": [
+    {
+      "name": "x64-Debug",
+      "generator": "Ninja",
+      "configurationType": "Debug",
+      "inheritEnvironments": [ "msvc_x64_x64" ],
+      "buildRoot": "${projectDir}\\out\\build\\${name}",
+      "installRoot": "${projectDir}\\out\\install\\${name}",
+      "cmakeCommandArgs": "-S . -B out",
+      "buildCommandArgs": "cmake --build out",
+      "ctestCommandArgs": "",
+      "variables": [
+        {
+          "name": "CMAKE_MODULE_PATH",
+          "value": "$PWD\cmake\Modules",
+          "type": "FILEPATH"
+        },
+        {
+          "name": "Torch_DIR",
+          "value": "<Path to libtorch>\share\cmake\Torch",
+          "type": "FILEPATH"
+        },
+        {
+          "name": "TensorRT_ROOT",
+          "value": "<Path to TensorRT directory>",
+          "type": "FILEPATH"
+        },
+        {
+          "name": "CMAKE_BUILD_TYPE",
+          "value": "Release",
+          "type": " STRING"
+        }
+      ]
+    }
+  ]
+}
+
+
+
+
+

Compilation

+
    +
  • Click Build -> Build All or directly press Ctrl + Shift + B

  • +
+

Note: After successful compilation, the build artifacts will be present at buildRoot path configured.

+
+
+

Installation

+
    +
  • Build -> Install Torch-TensorRT

  • +
+

Note: After successful installation, the artifacts will be present at installRoot.

+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/getting_started/installation.html b/docs/v1.2.0/getting_started/installation.html new file mode 100644 index 0000000000..737093818b --- /dev/null +++ b/docs/v1.2.0/getting_started/installation.html @@ -0,0 +1,1036 @@ + + + + + + + + + + + + + Installation — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Installation

+
+

Precompiled Binaries

+
+

Dependencies

+

You need to have either PyTorch or LibTorch installed based on if you are using Python or C++ +and you must have CUDA, cuDNN and TensorRT installed.

+
+
+
+
+

Python Package

+

You can install the python package using

+
pip3 install torch-tensorrt -f https://github.com/pytorch/TensorRT/releases
+
+
+
+
+

C++ Binary Distribution

+

Precompiled tarballs for releases are provided here: https://github.com/pytorch/TensorRT/releases

+
+
+
+

Compiling From Source

+
+

Dependencies for Compilation

+

Torch-TensorRT is built with Bazel, so begin by installing it.

+
+
+
export BAZEL_VERSION=$(cat <PATH_TO_TORCHTRT_ROOT>/.bazelversion)
+mkdir bazel
+cd bazel
+curl -fSsL -O https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-dist.zip
+unzip bazel-$BAZEL_VERSION-dist.zip
+bash ./compile.sh
+cp output/bazel /usr/local/bin/
+
+
+
+

You will also need to have CUDA installed on the system (or if running in a container, the system must have +the CUDA driver installed and the container must have CUDA)

+

The correct LibTorch version will be pulled down for you by bazel.

+
+

NOTE: For best compatability with official PyTorch, use torch==1.10.0+cuda113, TensorRT 8.0 and cuDNN 8.2 for CUDA 11.3 however Torch-TensorRT itself supports +TensorRT and cuDNN for other CUDA versions for usecases such as using NVIDIA compiled distributions of PyTorch that use other versions of CUDA +e.g. aarch64 or custom compiled version of PyTorch.

+
+
+

Choosing the Right ABI

+

Likely the most complicated thing about compiling Torch-TensorRT is selecting the correct ABI. There are two options +which are incompatible with each other, pre-cxx11-abi and the cxx11-abi. The complexity comes from the fact that while +the most popular distribution of PyTorch (wheels downloaded from pytorch.org/pypi directly) use the pre-cxx11-abi, most +other distributions you might encounter (e.g. ones from NVIDIA - NGC containers, and builds for Jetson as well as certain +libtorch builds and likely if you build PyTorch from source) use the cxx11-abi. It is important you compile Torch-TensorRT +using the correct ABI to function properly. Below is a table with general pairings of PyTorch distribution sources and the +recommended commands:

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

PyTorch Source

Recommended C++ Compilation Command

Recommended Python Compilation Command

PyTorch whl file from PyTorch.org

bazel build //:libtorchtrt -c opt –config pre_cxx11_abi

python3 setup.py bdist_wheel

libtorch-shared-with-deps-*.zip from PyTorch.org

bazel build //:libtorchtrt -c opt –config pre_cxx11_abi

python3 setup.py bdist_wheel

libtorch-cxx11-abi-shared-with-deps-*.zip from PyTorch.org

bazel build //:libtorchtrt -c opt

python3 setup.py bdist_wheel –use-cxx11-abi

PyTorch preinstalled in an NGC container

bazel build //:libtorchtrt -c opt

python3 setup.py bdist_wheel –use-cxx11-abi

PyTorch from the NVIDIA Forums for Jetson

bazel build //:libtorchtrt -c opt

python3 setup.py bdist_wheel –jetpack-version 4.6 –use-cxx11-abi

PyTorch built from Source

bazel build //:libtorchtrt -c opt

python3 setup.py bdist_wheel –use-cxx11-abi

+
+

NOTE: For all of the above cases you must correctly declare the source of PyTorch you intend to use in your WORKSPACE file for both Python and C++ builds. See below for more information

+
+

You then have two compilation options:

+
+
+
+

Building using cuDNN & TensorRT tarball distributions

+
+

This is recommended so as to build Torch-TensorRT hermetically and insures any compilation errors are not caused by version issues

+

Make sure when running Torch-TensorRT that these versions of the libraries are prioritized in your $LD_LIBRARY_PATH

+
+
+
You need to download the tarball distributions of TensorRT and cuDNN from the NVIDIA website.
+
+
+

Place these files in a directory (the directories third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu] exist for this purpose)

+

Then compile referencing the directory with the tarballs

+
+

If you get errors regarding the packages, check their sha256 hashes and make sure they match the ones listed in WORKSPACE

+
+
+

Release Build

+
bazel build //:libtorchtrt -c opt --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu]
+
+
+

A tarball with the include files and library can then be found in bazel-bin

+
+
+

Debug Build

+

To build with debug symbols use the following command

+
bazel build //:libtorchtrt -c dbg --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu]
+
+
+

A tarball with the include files and library can then be found in bazel-bin

+
+
+

Pre CXX11 ABI Build

+

To build using the pre-CXX11 ABI use the pre_cxx11_abi config

+
bazel build //:libtorchtrt --config pre_cxx11_abi -c [dbg/opt] --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu]
+
+
+

A tarball with the include files and library can then be found in bazel-bin

+
+
+
+

Building using locally installed cuDNN & TensorRT

+
+

If you encounter bugs and you compiled using this method please disclose that you used local sources in the issue (an ldd dump would be nice too)

+
+

Install TensorRT, CUDA and cuDNN on the system before starting to compile.

+

In WORKSPACE comment out:

+
# Downloaded distributions to use with --distdir
+http_archive(
+    name="cudnn",
+    urls=[
+        "<URL>",
+    ],
+    build_file="@//third_party/cudnn/archive:BUILD",
+    sha256="<TAR SHA256>",
+    strip_prefix="cuda",
+)
+
+http_archive(
+    name="tensorrt",
+    urls=[
+        "<URL>",
+    ],
+    build_file="@//third_party/tensorrt/archive:BUILD",
+    sha256="<TAR SHA256>",
+    strip_prefix="TensorRT-<VERSION>",
+)
+
+
+

and uncomment

+
# Locally installed dependencies
+new_local_repository(
+    name="cudnn", path="/usr/", build_file="@//third_party/cudnn/local:BUILD"
+)
+
+new_local_repository(
+    name="tensorrt", path="/usr/", build_file="@//third_party/tensorrt/local:BUILD"
+)
+
+
+
+

Release Build

+

Compile using:

+
bazel build //:libtorchtrt -c opt
+
+
+

A tarball with the include files and library can then be found in bazel-bin

+
+
+

Debug Build

+

To build with debug symbols use the following command

+
bazel build //:libtorchtrt -c dbg
+
+
+

A tarball with the include files and library can then be found in bazel-bin

+
+
+

Pre CXX11 ABI Build

+

To build using the pre-CXX11 ABI use the pre_cxx11_abi config

+
bazel build //:libtorchtrt --config pre_cxx11_abi -c [dbg/opt]
+
+
+
+
+
+

Building with CMake

+

It is possible to build the API libraries (in cpp/) and the torchtrtc executable using CMake instead of Bazel. +Currently, the python API and the tests cannot be built with CMake. +Begin by installing CMake.

+
+
    +
  • Latest releases of CMake and instructions on how to install are available for different platforms +[on their website](https://cmake.org/download/).

  • +
+
+

A few useful CMake options include:

+
+
    +
  • CMake finders for TensorRT and cuDNN are provided in cmake/Modules. In order for CMake to use them, pass +-DCMAKE_MODULE_PATH=cmake/Modules when configuring the project with CMake.

  • +
  • Libtorch provides its own CMake finder. In case CMake doesn’t find it, pass the path to your install of +libtorch with -DTorch_DIR=<path to libtorch>/share/cmake/Torch

  • +
  • If TensorRT is not found with the provided cmake finder, specify -DTensorRT_ROOT=<path to TensorRT>

  • +
  • Finally, configure and build the project in a build directory of your choice with the following command +from the root of Torch-TensorRT project:

  • +
+
cmake -S. -B<build directory> \
+    [-DCMAKE_MODULE_PATH=cmake/Module] \
+    [-DTorch_DIR=<path to libtorch>/share/cmake/Torch] \
+    [-DTensorRT_ROOT=<path to TensorRT>] \
+    [-DCMAKE_BUILD_TYPE=Debug|Release]
+cmake --build <build directory>
+
+
+
+
+
+

Building the Python package

+

Begin by installing ninja

+

You can build the Python package using setup.py (this will also build the correct version of libtorchtrt.so)

+
python3 setup.py [install/bdist_wheel]
+
+
+
+

Debug Build

+
python3 setup.py develop [--user]
+
+
+

This also compiles a debug build of libtorchtrt.so

+
+
+
+

Building Natively on aarch64 (Jetson)

+
+

Prerequisites

+

Install or compile a build of PyTorch/LibTorch for aarch64

+

NVIDIA hosts builds the latest release branch for Jetson here:

+
+
+
+
+

Enviorment Setup

+

To build natively on aarch64-linux-gnu platform, configure the WORKSPACE with local available dependencies.

+
    +
  1. Replace WORKSPACE with the corresponding WORKSPACE file in //toolchains/jp_workspaces

  2. +
  3. Configure the correct paths to directory roots containing local dependencies in the new_local_repository rules:

    +
    +

    NOTE: If you installed PyTorch using a pip package, the correct path is the path to the root of the python torch package. +In the case that you installed with sudo pip install this will be /usr/local/lib/python3.8/dist-packages/torch. +In the case you installed with pip install --user this will be $HOME/.local/lib/python3.8/site-packages/torch.

    +
    +
  4. +
+

In the case you are using NVIDIA compiled pip packages, set the path for both libtorch sources to the same path. This is because unlike +PyTorch on x86_64, NVIDIA aarch64 PyTorch uses the CXX11-ABI. If you compiled for source using the pre_cxx11_abi and only would like to +use that library, set the paths to the same path but when you compile make sure to add the flag --config=pre_cxx11_abi

+
new_local_repository(
+    name = "libtorch",
+    path = "/usr/local/lib/python3.8/dist-packages/torch",
+    build_file = "third_party/libtorch/BUILD"
+)
+
+new_local_repository(
+    name = "libtorch_pre_cxx11_abi",
+    path = "/usr/local/lib/python3.8/dist-packages/torch",
+    build_file = "third_party/libtorch/BUILD"
+)
+
+
+
+
+

Compile C++ Library and Compiler CLI

+
+

NOTE: Due to shifting dependency locations between Jetpack 4.5 and 4.6 there is a now a flag to inform bazel of the Jetpack version

+
--platforms //toolchains:jetpack_x.x
+
+
+
+

Compile Torch-TensorRT library using bazel command:

+
bazel build //:libtorchtrt --platforms //toolchains:jetpack_5.0
+
+
+
+
+

Compile Python API

+
+

NOTE: Due to shifting dependencies locations between Jetpack 4.5 and newer Jetpack verisons there is now a flag for setup.py which sets the jetpack version (default: 5.0)

+
+

Compile the Python API using the following command from the //py directory:

+
python3 setup.py install --use-cxx11-abi
+
+
+

If you have a build of PyTorch that uses Pre-CXX11 ABI drop the --use-cxx11-abi flag

+

If you are building for Jetpack 4.5 add the --jetpack-version 5.0 flag

+
+
+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/index.html b/docs/v1.2.0/index.html new file mode 100644 index 0000000000..f809c6a630 --- /dev/null +++ b/docs/v1.2.0/index.html @@ -0,0 +1,764 @@ + + + + + + + + + + + + + Torch-TensorRT — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Torch-TensorRT

+
+

Ahead-of-time compilation of TorchScript / PyTorch JIT for NVIDIA GPUs

+

Torch-TensorRT is a compiler for PyTorch/TorchScript, targeting NVIDIA GPUs via NVIDIA’s TensorRT Deep Learning Optimizer and Runtime. +Unlike PyTorch’s Just-In-Time (JIT) compiler, Torch-TensorRT is an Ahead-of-Time (AOT) compiler, meaning that before you deploy your +TorchScript code, you go through an explicit compile step to convert a standard TorchScript program into an module targeting +a TensorRT engine. Torch-TensorRT operates as a PyTorch extention and compiles modules that integrate into the JIT runtime seamlessly. +After compilation using the optimized graph should feel no different than running a TorchScript module. +You also have access to TensorRT’s suite of configurations at compile time, so you are able to specify +operating precision (FP32/FP16/INT8) and other settings for your module.

+

More Information / System Architecture:

+ +
+
+

Getting Started

+ +
+
+
+
+

Tutorials

+ +
+
+
+
+

Python API Documenation

+ +
+
+
+
+

C++ API Documenation

+ +
+
+
+
+

CLI Documentation

+ +
+
+
+
+

Contributor Documentation

+ +
+
+
+
+

Indices

+ +
+
+
+
+ + +
+ +
+
+ + + + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/indices/supported_ops.html b/docs/v1.2.0/indices/supported_ops.html new file mode 100644 index 0000000000..6eabb0245d --- /dev/null +++ b/docs/v1.2.0/indices/supported_ops.html @@ -0,0 +1,957 @@ + + + + + + + + + + + + + Operators Supported — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Operators Supported
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Operators Supported

+
+

Operators Currently Supported Through Converters

+
    +
  • aten::_convolution(Tensor input, Tensor weight, Tensor? bias, int[] stride, int[] padding, int[] dilation, bool transposed, int[] output_padding, int groups, bool benchmark, bool deterministic, bool cudnn_enabled, bool allow_tf32) -> (Tensor)

  • +
  • aten::_convolution.deprecated(Tensor input, Tensor weight, Tensor? bias, int[] stride, int[] padding, int[] dilation, bool transposed, int[] output_padding, int groups, bool benchmark, bool deterministic, bool cudnn_enabled) -> (Tensor)

  • +
  • aten::abs(Tensor self) -> (Tensor)

  • +
  • aten::acos(Tensor self) -> (Tensor)

  • +
  • aten::acosh(Tensor self) -> (Tensor)

  • +
  • aten::adaptive_avg_pool1d(Tensor self, int[1] output_size) -> (Tensor)

  • +
  • aten::adaptive_avg_pool2d(Tensor self, int[2] output_size) -> (Tensor)

  • +
  • aten::adaptive_avg_pool3d(Tensor self, int[3] output_size) -> (Tensor)

  • +
  • aten::adaptive_max_pool1d(Tensor self, int[2] output_size) -> (Tensor, Tensor)

  • +
  • aten::adaptive_max_pool2d(Tensor self, int[2] output_size) -> (Tensor, Tensor)

  • +
  • aten::adaptive_max_pool3d(Tensor self, int[3] output_size) -> (Tensor, Tensor)

  • +
  • aten::add.Scalar(Tensor self, Scalar other, Scalar alpha=1) -> (Tensor)

  • +
  • aten::add.Tensor(Tensor self, Tensor other, Scalar alpha=1) -> (Tensor)

  • +
  • aten::add_.Tensor(Tensor(a!) self, Tensor other, *, Scalar alpha=1) -> (Tensor(a!))

  • +
  • aten::argmax(Tensor self, int dim, bool keepdim=False) -> (Tensor)

  • +
  • aten::argmin(Tensor self, int dim, bool keepdim=False) -> (Tensor)

  • +
  • aten::asin(Tensor self) -> (Tensor)

  • +
  • aten::asinh(Tensor self) -> (Tensor)

  • +
  • aten::atan(Tensor self) -> (Tensor)

  • +
  • aten::atanh(Tensor self) -> (Tensor)

  • +
  • aten::avg_pool1d(Tensor self, int[1] kernel_size, int[1] stride=[], int[1] padding=[0], bool ceil_mode=False, bool count_include_pad=True) -> (Tensor)

  • +
  • aten::avg_pool2d(Tensor self, int[2] kernel_size, int[2] stride=[], int[2] padding=[0, 0], bool ceil_mode=False, bool count_include_pad=True, int? divisor_override=None) -> (Tensor)

  • +
  • aten::avg_pool3d(Tensor self, int[3] kernel_size, int[3] stride=[], int[3] padding=[], bool ceil_mode=False, bool count_include_pad=True, int? divisor_override=None) -> (Tensor)

  • +
  • aten::batch_norm(Tensor input, Tensor? gamma, Tensor? beta, Tensor? mean, Tensor? var, bool training, float momentum, float eps, bool cudnn_enabled) -> (Tensor)

  • +
  • aten::bitwise_not(Tensor self) -> (Tensor)

  • +
  • aten::bmm(Tensor self, Tensor mat2) -> (Tensor)

  • +
  • aten::cat(Tensor[] tensors, int dim=0) -> (Tensor)

  • +
  • aten::ceil(Tensor self) -> (Tensor)

  • +
  • aten::clamp(Tensor self, Scalar? min=None, Scalar? max=None) -> (Tensor)

  • +
  • aten::clamp_max(Tensor self, Scalar max) -> (Tensor)

  • +
  • aten::clamp_min(Tensor self, Scalar min) -> (Tensor)

  • +
  • aten::constant_pad_nd(Tensor self, int[] pad, Scalar value=0) -> (Tensor)

  • +
  • aten::cos(Tensor self) -> (Tensor)

  • +
  • aten::cosh(Tensor self) -> (Tensor)

  • +
  • aten::cumsum(Tensor self, int dim, *, int? dtype=None) -> (Tensor)

  • +
  • aten::div.Scalar(Tensor self, Scalar other) -> (Tensor)

  • +
  • aten::div.Tensor(Tensor self, Tensor other) -> (Tensor)

  • +
  • aten::div.Tensor_mode(Tensor self, Tensor other, *, str? rounding_mode) -> (Tensor)

  • +
  • aten::div_.Scalar(Tensor(a!) self, Scalar other) -> (Tensor(a!))

  • +
  • aten::div_.Tensor(Tensor(a!) self, Tensor other) -> (Tensor(a!))

  • +
  • aten::elu(Tensor self, Scalar alpha=1, Scalar scale=1, Scalar input_scale=1) -> (Tensor)

  • +
  • aten::embedding(Tensor weight, Tensor indices, int padding_idx=-1, bool scale_grad_by_freq=False, bool sparse=False) -> (Tensor)

  • +
  • aten::eq.Scalar(Tensor self, Scalar other) -> (Tensor)

  • +
  • aten::eq.Tensor(Tensor self, Tensor other) -> (Tensor)

  • +
  • aten::erf(Tensor self) -> (Tensor)

  • +
  • aten::exp(Tensor self) -> (Tensor)

  • +
  • aten::expand(Tensor(a) self, int[] size, *, bool implicit=False) -> (Tensor(a))

  • +
  • aten::expand_as(Tensor(a) self, Tensor other) -> (Tensor(a))

  • +
  • aten::fake_quantize_per_channel_affine(Tensor self, Tensor scale, Tensor zero_point, int axis, int quant_min, int quant_max) -> (Tensor)

  • +
  • aten::fake_quantize_per_tensor_affine(Tensor self, float scale, int zero_point, int quant_min, int quant_max) -> (Tensor)

  • +
  • aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor)

  • +
  • aten::floor(Tensor self) -> (Tensor)

  • +
  • aten::floor_divide(Tensor self, Tensor other) -> (Tensor)

  • +
  • aten::floor_divide.Scalar(Tensor self, Scalar other) -> (Tensor)

  • +
  • aten::ge.Scalar(Tensor self, Scalar other) -> (Tensor)

  • +
  • aten::ge.Tensor(Tensor self, Tensor other) -> (Tensor)

  • +
  • aten::gru_cell(Tensor input, Tensor hx, Tensor w_ih, Tensor w_hh, Tensor? b_ih=None, Tensor? b_hh=None) -> (Tensor)

  • +
  • aten::gt.Scalar(Tensor self, Scalar other) -> (Tensor)

  • +
  • aten::gt.Tensor(Tensor self, Tensor other) -> (Tensor)

  • +
  • aten::hardtanh(Tensor self, Scalar min_val=-1, Scalar max_val=1) -> (Tensor)

  • +
  • aten::hardtanh_(Tensor(a!) self, Scalar min_val=-1, Scalar max_val=1) -> (Tensor(a!))

  • +
  • aten::index.Tensor(Tensor self, Tensor?[] indices) -> (Tensor)

  • +
  • aten::instance_norm(Tensor input, Tensor? weight, Tensor? bias, Tensor? running_mean, Tensor? running_var, bool use_input_stats, float momentum, float eps, bool cudnn_enabled) -> (Tensor)

  • +
  • aten::layer_norm(Tensor input, int[] normalized_shape, Tensor? gamma, Tensor? beta, float eps, bool cudnn_enabled) -> (Tensor)

  • +
  • aten::le.Scalar(Tensor self, Scalar other) -> (Tensor)

  • +
  • aten::le.Tensor(Tensor self, Tensor other) -> (Tensor)

  • +
  • aten::leaky_relu(Tensor self, Scalar negative_slope=0.01) -> (Tensor)

  • +
  • aten::leaky_relu_(Tensor(a!) self, Scalar negative_slope=0.01) -> (Tensor(a!))

  • +
  • aten::linear(Tensor input, Tensor weight, Tensor? bias=None) -> (Tensor)

  • +
  • aten::log(Tensor self) -> (Tensor)

  • +
  • aten::lstm_cell(Tensor input, Tensor[] hx, Tensor w_ih, Tensor w_hh, Tensor? b_ih=None, Tensor? b_hh=None) -> (Tensor, Tensor)

  • +
  • aten::lt.Scalar(Tensor self, Scalar other) -> (Tensor)

  • +
  • aten::lt.Tensor(Tensor self, Tensor other) -> (Tensor)

  • +
  • aten::masked_fill.Scalar(Tensor self, Tensor mask, Scalar value) -> (Tensor)

  • +
  • aten::matmul(Tensor self, Tensor other) -> (Tensor)

  • +
  • aten::max(Tensor self) -> (Tensor)

  • +
  • aten::max.dim(Tensor self, int dim, bool keepdim=False) -> (Tensor values, Tensor indices)

  • +
  • aten::max.other(Tensor self, Tensor other) -> (Tensor)

  • +
  • aten::max_pool1d(Tensor self, int[1] kernel_size, int[1] stride=[], int[1] padding=[], int[1] dilation=[], bool ceil_mode=False) -> (Tensor)

  • +
  • aten::max_pool2d(Tensor self, int[2] kernel_size, int[2] stride=[], int[2] padding=[0, 0], int[2] dilation=[1, 1], bool ceil_mode=False) -> (Tensor)

  • +
  • aten::max_pool3d(Tensor self, int[3] kernel_size, int[3] stride=[], int[3] padding=[], int[3] dilation=[], bool ceil_mode=False) -> (Tensor)

  • +
  • aten::mean(Tensor self, *, int? dtype=None) -> (Tensor)

  • +
  • aten::mean.dim(Tensor self, int[] dim, bool keepdim=False, *, int? dtype=None) -> (Tensor)

  • +
  • aten::min(Tensor self) -> (Tensor)

  • +
  • aten::min.dim(Tensor self, int dim, bool keepdim=False) -> (Tensor values, Tensor indices)

  • +
  • aten::min.other(Tensor self, Tensor other) -> (Tensor)

  • +
  • aten::mul.Scalar(Tensor self, Scalar other) -> (Tensor)

  • +
  • aten::mul.Tensor(Tensor self, Tensor other) -> (Tensor)

  • +
  • aten::mul_.Tensor(Tensor(a!) self, Tensor other) -> (Tensor(a!))

  • +
  • aten::narrow(Tensor(a) self, int dim, int start, int length) -> (Tensor(a))

  • +
  • aten::narrow.Tensor(Tensor(a) self, int dim, Tensor start, int length) -> (Tensor(a))

  • +
  • aten::ne.Scalar(Tensor self, Scalar other) -> (Tensor)

  • +
  • aten::ne.Tensor(Tensor self, Tensor other) -> (Tensor)

  • +
  • aten::neg(Tensor self) -> (Tensor)

  • +
  • aten::norm.ScalarOpt_dim(Tensor self, Scalar? p, int[1] dim, bool keepdim=False) -> (Tensor)

  • +
  • aten::permute(Tensor(a) self, int[] dims) -> (Tensor(a))

  • +
  • aten::pixel_shuffle(Tensor self, int upscale_factor) -> (Tensor)

  • +
  • aten::pow.Tensor_Scalar(Tensor self, Scalar exponent) -> (Tensor)

  • +
  • aten::pow.Tensor_Tensor(Tensor self, Tensor exponent) -> (Tensor)

  • +
  • aten::prelu(Tensor self, Tensor weight) -> (Tensor)

  • +
  • aten::prod(Tensor self, *, int? dtype=None) -> (Tensor)

  • +
  • aten::prod.dim_int(Tensor self, int dim, bool keepdim=False, *, int? dtype=None) -> (Tensor)

  • +
  • aten::reciprocal(Tensor self) -> (Tensor)

  • +
  • aten::reflection_pad1d(Tensor self, int[2] padding) -> (Tensor)

  • +
  • aten::reflection_pad2d(Tensor self, int[4] padding) -> (Tensor)

  • +
  • aten::relu(Tensor input) -> (Tensor)

  • +
  • aten::relu_(Tensor(a!) self) -> (Tensor(a!))

  • +
  • aten::repeat(Tensor self, int[] repeats) -> (Tensor)

  • +
  • aten::repeat_interleave.self_int(Tensor self, int repeats, int? dim=None, *, int? output_size=None) -> (Tensor)

  • +
  • aten::replication_pad1d(Tensor self, int[2] padding) -> (Tensor)

  • +
  • aten::replication_pad2d(Tensor self, int[4] padding) -> (Tensor)

  • +
  • aten::replication_pad3d(Tensor self, int[6] padding) -> (Tensor)

  • +
  • aten::reshape(Tensor self, int[] shape) -> (Tensor)

  • +
  • aten::roll(Tensor self, int[1] shifts, int[1] dims=[]) -> (Tensor)

  • +
  • aten::rsub.Scalar(Tensor self, Scalar other, Scalar alpha=1) -> (Tensor)

  • +
  • aten::rsub.Tensor(Tensor self, Tensor other, Scalar alpha=1) -> (Tensor)

  • +
  • aten::scatter.src(Tensor self, int dim, Tensor index, Tensor src) -> (Tensor)

  • +
  • aten::scatter.value(Tensor self, int dim, Tensor index, Scalar value) -> (Tensor)

  • +
  • aten::select.int(Tensor(a) self, int dim, int index) -> (Tensor(a))

  • +
  • aten::sigmoid(Tensor input) -> (Tensor)

  • +
  • aten::sigmoid_(Tensor(a!) self) -> (Tensor(a!))

  • +
  • aten::sin(Tensor self) -> (Tensor)

  • +
  • aten::sinh(Tensor self) -> (Tensor)

  • +
  • aten::slice.Tensor(Tensor(a) self, int dim=0, int? start=None, int? end=None, int step=1) -> (Tensor(a))

  • +
  • aten::softmax.int(Tensor self, int dim, int? dtype=None) -> (Tensor)

  • +
  • aten::split(Tensor self, int[] split_sizes, int dim=0) -> (Tensor[])

  • +
  • aten::split.Tensor(Tensor(a) self, int split_size, int dim=0) -> (Tensor[])

  • +
  • aten::split.sizes(Tensor(a -> *) self, int[] split_size, int dim=0) -> (Tensor[])

  • +
  • aten::split_with_sizes(Tensor(a) self, int[] split_sizes, int dim=0) -> (Tensor[])

  • +
  • aten::sqrt(Tensor self) -> (Tensor)

  • +
  • aten::square(Tensor self) -> (Tensor)

  • +
  • aten::squeeze.dim(Tensor(a) self, int dim) -> (Tensor(a))

  • +
  • aten::stack(Tensor[] tensors, int dim=0) -> (Tensor)

  • +
  • aten::sub.Scalar(Tensor self, Scalar other, Scalar alpha=1) -> (Tensor)

  • +
  • aten::sub.Tensor(Tensor self, Tensor other, Scalar alpha=1) -> (Tensor)

  • +
  • aten::sub_.Tensor(Tensor(a!) self, Tensor other, *, Scalar alpha=1) -> (Tensor(a!))

  • +
  • aten::sum(Tensor self, *, int? dtype=None) -> (Tensor)

  • +
  • aten::sum.dim_IntList(Tensor self, int[1] dim, bool keepdim=False, *, int? dtype=None) -> (Tensor)

  • +
  • aten::t(Tensor self) -> (Tensor)

  • +
  • aten::tan(Tensor self) -> (Tensor)

  • +
  • aten::tanh(Tensor input) -> (Tensor)

  • +
  • aten::tanh_(Tensor(a!) self) -> (Tensor(a!))

  • +
  • aten::to.device(Tensor(a) self, Device device, int dtype, bool non_blocking=False, bool copy=False, int? memory_format=None) -> (Tensor(a))

  • +
  • aten::to.dtype(Tensor self, int dtype, bool non_blocking=False, bool copy=False, int? memory_format=None) -> (Tensor)

  • +
  • aten::to.other(Tensor self, Tensor other, bool non_blocking=False, bool copy=False, int? memory_format=None) -> (Tensor)

  • +
  • aten::to.prim_Device(Tensor(a) self, Device? device, int? dtype=None, bool non_blocking=False, bool copy=False) -> (Tensor(a|b))

  • +
  • aten::topk(Tensor self, int k, int dim=-1, bool largest=True, bool sorted=True) -> (Tensor values, Tensor indices)

  • +
  • aten::transpose.int(Tensor(a) self, int dim0, int dim1) -> (Tensor(a))

  • +
  • aten::unbind.int(Tensor(a -> *) self, int dim=0) -> (Tensor[])

  • +
  • aten::unsqueeze(Tensor(a) self, int dim) -> (Tensor(a))

  • +
  • aten::upsample_bilinear2d(Tensor self, int[2] output_size, bool align_corners, float? scales_h=None, float? scales_w=None) -> (Tensor)

  • +
  • aten::upsample_bilinear2d.vec(Tensor input, int[]? output_size, bool align_corners, float[]? scale_factors) -> (Tensor)

  • +
  • aten::upsample_linear1d(Tensor self, int[1] output_size, bool align_corners, float? scales=None) -> (Tensor)

  • +
  • aten::upsample_linear1d.vec(Tensor input, int[]? output_size, bool align_corners, float[]? scale_factors) -> (Tensor)

  • +
  • aten::upsample_nearest1d(Tensor self, int[1] output_size, float? scales=None) -> (Tensor)

  • +
  • aten::upsample_nearest1d.vec(Tensor input, int[]? output_size, float[]? scale_factors) -> (Tensor)

  • +
  • aten::upsample_nearest2d(Tensor self, int[2] output_size, float? scales_h=None, float? scales_w=None) -> (Tensor)

  • +
  • aten::upsample_nearest2d.vec(Tensor input, int[]? output_size, float[]? scale_factors) -> (Tensor)

  • +
  • aten::upsample_nearest3d(Tensor self, int[3] output_size, float? scales_d=None, float? scales_h=None, float? scales_w=None) -> (Tensor)

  • +
  • aten::upsample_nearest3d.vec(Tensor input, int[]? output_size, float[]? scale_factors) -> (Tensor)

  • +
  • aten::upsample_trilinear3d(Tensor self, int[3] output_size, bool align_corners, float? scales_d=None, float? scales_h=None, float? scales_w=None) -> (Tensor)

  • +
  • aten::upsample_trilinear3d.vec(Tensor input, int[]? output_size, bool align_corners, float[]? scale_factors) -> (Tensor)

  • +
  • aten::view(Tensor(a) self, int[] size) -> (Tensor(a))

  • +
  • trt::const(Tensor self) -> (Tensor)

  • +
+
+
+

Operators Currently Supported Through Evaluators

+
    +
  • aten::Bool.float(float b) -> (bool)

  • +
  • aten::Bool.int(int a) -> (bool)

  • +
  • aten::Float.Scalar(Scalar a) -> float

  • +
  • aten::Float.bool(bool a) -> float

  • +
  • aten::Float.int(int a) -> float

  • +
  • aten::Int.Scalar(Scalar a) -> int

  • +
  • aten::Int.bool(bool a) -> int

  • +
  • aten::Int.float(float a) -> int

  • +
  • aten::Int.int(int a) -> int

  • +
  • aten::__and__(int a, int b) -> (bool)

  • +
  • aten::__and__.bool(bool a, bool b) -> (bool)

  • +
  • aten::__derive_index(int idx, int start, int step) -> int

  • +
  • aten::__getitem__.t(t[](a) list, int idx) -> (t(*))

  • +
  • aten::__is__(t1 self, t2 obj) -> bool

  • +
  • aten::__isnot__(t1 self, t2 obj) -> bool

  • +
  • aten::__not__(bool self) -> bool

  • +
  • aten::__or__(int a, int b) -> (bool)

  • +
  • aten::__range_length(int lo, int hi, int step) -> int

  • +
  • aten::__round_to_zero_floordiv(int a, int b) -> (int)

  • +
  • aten::__xor__(int a, int b) -> (bool)

  • +
  • aten::add.float(float a, float b) -> (float)

  • +
  • aten::add.int(int a, int b) -> (int)

  • +
  • aten::add.str(str a, str b) -> (str)

  • +
  • aten::add_.t(t[](a!) self, t[] b) -> (t[])

  • +
  • aten::append.t(t[](a!) self, t(c -> *) el) -> (t[](a!))

  • +
  • +
    aten::arange(Scalar end, *, int? dtype=None, int? layout=None,

    Device? device=None, bool? pin_memory=None) -> (Tensor)

    +
    +
    +
  • +
  • +
    aten::arange.start(Scalar start, Scalar end, *, ScalarType? dtype=None,

    Layout? layout=None, Device? device=None, bool? pin_memory=None) -> (Tensor)

    +
    +
    +
  • +
  • +
    aten::arange.start_step(Scalar start, Scalar end, Scalar step, *, ScalarType? dtype=None,

    Layout? layout=None, Device? device=None, bool? pin_memory=None) -> (Tensor)

    +
    +
    +
  • +
  • aten::clone(Tensor self, *, int? memory_format=None) -> (Tensor)

  • +
  • aten::copy_(Tensor(a!) self, Tensor src, bool non_blocking=False) -> (Tensor(a!))

  • +
  • aten::dim(Tensor self) -> int

  • +
  • aten::div.float(float a, float b) -> (float)

  • +
  • aten::div.int(int a, int b) -> (float)

  • +
  • aten::eq.bool(bool a, bool b) -> (bool)

  • +
  • aten::eq.float(float a, float b) -> (bool)

  • +
  • aten::eq.float_int(float a, int b) -> (bool)

  • +
  • aten::eq.int(int a, int b) -> (bool)

  • +
  • aten::eq.int_float(int a, float b) -> (bool)

  • +
  • aten::eq.str(str a, str b) -> (bool)

  • +
  • aten::extend.t(t[](a!) self, t[] other) -> ()

  • +
  • aten::floor.float(float a) -> (int)

  • +
  • aten::floor.int(int a) -> (int)

  • +
  • aten::floordiv.float(float a, float b) -> (int)

  • +
  • aten::floordiv.int(int a, int b) -> (int)

  • +
  • aten::format(str self, …) -> (str)

  • +
  • aten::ge.bool(bool a, bool b) -> (bool)

  • +
  • aten::ge.float(float a, float b) -> (bool)

  • +
  • aten::ge.float_int(float a, int b) -> (bool)

  • +
  • aten::ge.int(int a, int b) -> (bool)

  • +
  • aten::ge.int_float(int a, float b) -> (bool)

  • +
  • aten::gt.bool(bool a, bool b) -> (bool)

  • +
  • aten::gt.float(float a, float b) -> (bool)

  • +
  • aten::gt.float_int(float a, int b) -> (bool)

  • +
  • aten::gt.int(int a, int b) -> (bool)

  • +
  • aten::gt.int_float(int a, float b) -> (bool)

  • +
  • aten::is_floating_point(Tensor self) -> (bool)

  • +
  • aten::le.bool(bool a, bool b) -> (bool)

  • +
  • aten::le.float(float a, float b) -> (bool)

  • +
  • aten::le.float_int(float a, int b) -> (bool)

  • +
  • aten::le.int(int a, int b) -> (bool)

  • +
  • aten::le.int_float(int a, float b) -> (bool)

  • +
  • aten::len.t(t[] a) -> (int)

  • +
  • aten::lt.bool(bool a, bool b) -> (bool)

  • +
  • aten::lt.float(float a, float b) -> (bool)

  • +
  • aten::lt.float_int(float a, int b) -> (bool)

  • +
  • aten::lt.int(int a, int b) -> (bool)

  • +
  • aten::lt.int_float(int a, float b) -> (bool)

  • +
  • aten::mul.float(float a, float b) -> (float)

  • +
  • aten::mul.int(int a, int b) -> (int)

  • +
  • aten::ne.bool(bool a, bool b) -> (bool)

  • +
  • aten::ne.float(float a, float b) -> (bool)

  • +
  • aten::ne.float_int(float a, int b) -> (bool)

  • +
  • aten::ne.int(int a, int b) -> (bool)

  • +
  • aten::ne.int_float(int a, float b) -> (bool)

  • +
  • aten::neg.int(int a) -> (int)

  • +
  • aten::numel(Tensor self) -> int

  • +
  • aten::pow.float(float a, float b) -> (float)

  • +
  • aten::pow.float_int(float a, int b) -> (float)

  • +
  • aten::pow.int(int a, int b) -> (float)

  • +
  • aten::pow.int_float(int a, float b) -> (float)

  • +
  • aten::size(Tensor self) -> (int[])

  • +
  • aten::size.int(Tensor self, int dim) -> (int)

  • +
  • aten::slice.t(t[] l, int start, int end=9223372036854775807, int step=1) -> (t[])

  • +
  • aten::sqrt.float(float a) -> (float)

  • +
  • aten::sqrt.int(int a) -> (float)

  • +
  • aten::sub.float(float a, float b) -> (float)

  • +
  • aten::sub.int(int a, int b) -> (int)

  • +
  • aten::tensor(t[] data, *, int? dtype=None, Device? device=None, bool requires_grad=False) -> (Tensor)

  • +
  • prim::TupleIndex(Any tup, int i) -> (Any)

  • +
  • prim::dtype(Tensor a) -> (int)

  • +
  • prim::max.bool(bool a, bool b) -> (bool)

  • +
  • prim::max.float(float a, float b) -> (bool)

  • +
  • prim::max.float_int(float a, int b) -> (bool)

  • +
  • prim::max.int(int a, int b) -> (bool)

  • +
  • prim::max.int_float(int a, float b) -> (bool)

  • +
  • prim::max.self_int(int[] self) -> (int)

  • +
  • prim::min.bool(bool a, bool b) -> (bool)

  • +
  • prim::min.float(float a, float b) -> (bool)

  • +
  • prim::min.float_int(float a, int b) -> (bool)

  • +
  • prim::min.int(int a, int b) -> (bool)

  • +
  • prim::min.int_float(int a, float b) -> (bool)

  • +
  • prim::min.self_int(int[] self) -> (int)

  • +
  • prim::shape(Tensor a) -> (int[])

  • +
+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/objects.inv b/docs/v1.2.0/objects.inv new file mode 100644 index 0000000000..fd777bc36a Binary files /dev/null and b/docs/v1.2.0/objects.inv differ diff --git a/docs/v1.2.0/py-modindex.html b/docs/v1.2.0/py-modindex.html new file mode 100644 index 0000000000..776540b186 --- /dev/null +++ b/docs/v1.2.0/py-modindex.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + Python Module Index — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+ + +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/py_api/fx.html b/docs/v1.2.0/py_api/fx.html new file mode 100644 index 0000000000..96006fafe8 --- /dev/null +++ b/docs/v1.2.0/py_api/fx.html @@ -0,0 +1,742 @@ + + + + + + + + + + + + + torch_tensorrt.fx — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

torch_tensorrt.fx

+
+

Functions

+
+
+torch_tensorrt.fx.compile(module: torch.nn.modules.module.Module, input, max_batch_size: int = 2048, max_workspace_size=33554432, explicit_batch_dimension=False, lower_precision=LowerPrecision.FP16, verbose_log=False, timing_cache_prefix='', save_timing_cache=False, cuda_graph_batch_size=- 1, dynamic_batch=True) torch.nn.modules.module.Module[source]
+

Takes in original module, input and lowering setting, run lowering workflow to turn module +into lowered module, or so called TRTModule.

+
+
Parameters
+
    +
  • module – Original module for lowering.

  • +
  • input – Input for module.

  • +
  • max_batch_size – Maximum batch size (must be >= 1 to be set, 0 means not set)

  • +
  • max_workspace_size – Maximum size of workspace given to TensorRT.

  • +
  • explicit_batch_dimension – Use explicit batch dimension in TensorRT if set True, otherwise use implicit batch dimension.

  • +
  • lower_precision – lower_precision config given to TRTModule.

  • +
  • verbose_log – Enable verbose log for TensorRT if set True.

  • +
  • timing_cache_prefix – Timing cache file name for timing cache used by fx2trt.

  • +
  • save_timing_cache – Update timing cache with current timing cache data if set to True.

  • +
  • cuda_graph_batch_size – Cuda graph batch size, default to be -1.

  • +
  • dynamic_batch – batch dimension (dim=0) is dynamic.

  • +
+
+
Returns
+

A torch.nn.Module lowered by TensorRT.

+
+
+
+ +
+
+

Classes

+
+
+class torch_tensorrt.fx.TRTModule(engine=None, input_names=None, output_names=None, cuda_graph_batch_size=- 1)[source]
+
+ +
+
+class torch_tensorrt.fx.InputTensorSpec(shape: Sequence[int], dtype: torch.dtype, device: torch.device = device(type='cpu'), shape_ranges: List[Tuple[Sequence[int], Sequence[int], Sequence[int]]] = [], has_batch_dim: bool = True)[source]
+

This class contains the information of a input tensor.

+

shape: shape of the tensor.

+

dtype: dtyep of the tensor.

+
+
device: device of the tensor. This is only used to generate inputs to the given model

in order to run shape prop. For TensorRT engine, inputs have to be on cuda device.

+
+
shape_ranges: If dynamic shape is needed (shape has dimensions of -1), then this field

has to be provided (default is empty list). Every shape_range is a tuple of three +tuples ((min_input_shape), (optimized_input_shape), (max_input_shape)). Each shape_range +is used to populate a TensorRT optimization profile. +e.g. If the input shape varies from (1, 224) to (100, 224) and we want to optimize +for (25, 224) because it’s the most common input shape, then we set shape_ranges to +((1, 224), (25, 225), (100, 224)).

+
+
has_batch_dim: Whether the shape includes batch dimension. Batch dimension has to be provided

if the engine want to run with dynamic shape.

+
+
+
+ +
+
+class torch_tensorrt.fx.TRTInterpreter(module: torch.fx.graph_module.GraphModule, input_specs: List[torch_tensorrt.fx.input_tensor_spec.InputTensorSpec], explicit_batch_dimension: bool = False, explicit_precision: bool = False, logger_level=None)[source]
+
+ +
+
+class torch_tensorrt.fx.TRTInterpreterResult(engine, input_names, output_names, serialized_cache)[source]
+
+ +
+
+ + +
+ +
+ + +
+
+ +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/py_api/logging.html b/docs/v1.2.0/py_api/logging.html new file mode 100644 index 0000000000..94dbdf8002 --- /dev/null +++ b/docs/v1.2.0/py_api/logging.html @@ -0,0 +1,870 @@ + + + + + + + + + + + + + torch_tensorrt.logging — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

torch_tensorrt.logging

+
+
+class torch_tensorrt.logging.Level(value)[source]
+

Bases: enum.Enum

+

Enum to set the minimum required logging level to print a message to stdout

+
+
+Debug = <LogLevel.DEBUG: 4>
+
+ +
+
+Error = <LogLevel.ERROR: 1>
+
+ +
+
+Graph = <LogLevel.GRAPH: 5>
+
+ +
+
+Info = <LogLevel.INFO: 3>
+
+ +
+
+InternalError = <LogLevel.INTERNAL_ERROR: 0>
+
+ +
+
+Warning = <LogLevel.WARNING: 2>
+
+ +
+ +
+
+class torch_tensorrt.logging.debug[source]
+

Bases: object

+

Context-manager to display full debug information through the logger

+

Example:

+
+
with torch_tensorrt.logging.debug():

model_trt = torch_tensorrt.compile(model, **spec)

+
+
+
+ +
+
+class torch_tensorrt.logging.errors[source]
+

Bases: object

+

Context-manager to limit displayed log messages to just errors and above

+

Example:

+
+
with torch_tensorrt.logging.errors():

outputs = model_torchtrt(inputs)

+
+
+
+ +
+
+torch_tensorrt.logging.get_is_colored_output_on() bool[source]
+

Get if colored output is enabled for logging

+
+
Returns
+

If colored output is one

+
+
Return type
+

bool

+
+
+
+ +
+
+torch_tensorrt.logging.get_logging_prefix() str[source]
+

Get the prefix set for logging messages

+
+
Returns
+

Prefix used for logger

+
+
Return type
+

str

+
+
+
+ +
+
+torch_tensorrt.logging.get_reportable_log_level() torch_tensorrt.logging.Level[source]
+

Get the level required for a message to be printed in the log

+
+
Returns
+

The enum representing the level required to print

+
+
Return type
+

torch_tensorrt.logging.Level

+
+
+
+ +
+
+class torch_tensorrt.logging.graphs[source]
+

Bases: object

+

Context-manager to display the results of intermediate lowering passes +as well as full debug information through the logger

+

Example:

+
+
with torch_tensorrt.logging.graphs():

model_trt = torch_tensorrt.compile(model, **spec)

+
+
+
+ +
+
+class torch_tensorrt.logging.info[source]
+

Bases: object

+

Context-manager to display all info and greater severity messages

+

Example:

+
+
with torch_tensorrt.logging.info():

model_trt = torch_tensorrt.compile(model, **spec)

+
+
+
+ +
+
+class torch_tensorrt.logging.internal_errors[source]
+

Bases: object

+

Context-manager to limit displayed log messages to just internal errors

+

Example:

+
+
with torch_tensorrt.logging.internal_errors():

outputs = model_torchtrt(inputs)

+
+
+
+ +
+
+torch_tensorrt.logging.log(level: torch_tensorrt.logging.Level, msg: str)[source]
+

Add a new message to the log

+

Adds a new message to the log at a specified level. The message +will only get printed out if Level > reportable_log_level

+
+
Parameters
+
+
+
+
+ +
+
+torch_tensorrt.logging.set_is_colored_output_on(colored_output_on: bool)[source]
+

Enable or disable color in the log output

+
+
Parameters
+

colored_output_on (bool) – If colored output should be enabled or not

+
+
+
+ +
+
+torch_tensorrt.logging.set_logging_prefix(prefix: str)[source]
+

Set the prefix used when logging messages

+
+
Parameters
+

prefix (str) – Prefix to use for logging messages

+
+
+
+ +
+
+torch_tensorrt.logging.set_reportable_log_level(level: torch_tensorrt.logging.Level)[source]
+

Set the level required for a message to be printed to the log

+
+
Parameters
+

level (torch_tensorrt.logging.Level) – The enum representing the level required to print

+
+
+
+ +
+
+class torch_tensorrt.logging.warnings[source]
+

Bases: object

+

Context-manager to limit displayed log messages to just warnings and above

+

Example:

+
+
with torch_tensorrt.logging.warnings():

model_trt = torch_tensorrt.compile(model, **spec)

+
+
+
+ +
+ + +
+ +
+ + +
+
+ +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/py_api/ptq.html b/docs/v1.2.0/py_api/ptq.html new file mode 100644 index 0000000000..fb804d3152 --- /dev/null +++ b/docs/v1.2.0/py_api/ptq.html @@ -0,0 +1,789 @@ + + + + + + + + + + + + + torch_tensorrt.ptq — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

torch_tensorrt.ptq

+
+
+class torch_tensorrt.ptq.CacheCalibrator(*args, **kwargs)[source]
+

Bases: object

+

Constructs a calibrator class in TensorRT which directly uses pre-existing cache file for calibration. +:param cache_file: path to cache file. +:param algo_type: choice of calibration algorithm.

+
+ +
+
+class torch_tensorrt.ptq.CalibrationAlgo(value)[source]
+

Bases: enum.Enum

+

An enumeration.

+
+
+ENTROPY_CALIBRATION = <CalibrationAlgo.ENTROPY_CALIBRATION: 1>
+
+ +
+
+ENTROPY_CALIBRATION_2 = <CalibrationAlgo.ENTROPY_CALIBRATION_2: 2>
+
+ +
+
+LEGACY_CALIBRATION = <CalibrationAlgo.LEGACY_CALIBRATION: 0>
+
+ +
+
+MINMAX_CALIBRATION = <CalibrationAlgo.MINMAX_CALIBRATION: 3>
+
+ +
+ +
+
+class torch_tensorrt.ptq.DataLoaderCalibrator(*args, **kwargs)[source]
+

Bases: object

+

Constructs a calibrator class in TensorRT and uses pytorch dataloader to load/preproces +data which is passed during calibration. +:param dataloader: an instance of pytorch dataloader which iterates through a given dataset. +:param algo_type: choice of calibration algorithm. +:param cache_file: path to cache file. +:param use_cache: flag which enables usage of pre-existing cache. +:param device: device on which calibration data is copied to.

+
+ +
+
+torch_tensorrt.ptq.get_batch(self, names)[source]
+
+ +
+
+torch_tensorrt.ptq.get_batch_size(self)[source]
+
+ +
+
+torch_tensorrt.ptq.get_cache_mode_batch(self)[source]
+
+ +
+
+torch_tensorrt.ptq.read_calibration_cache(self)[source]
+
+ +
+
+torch_tensorrt.ptq.write_calibration_cache(self, cache)[source]
+
+ +
+

Classes

+
+
+class torch_tensorrt.ptq.DataLoaderCalibrator(*args, **kwargs)[source]
+

Constructs a calibrator class in TensorRT and uses pytorch dataloader to load/preproces +data which is passed during calibration. +:param dataloader: an instance of pytorch dataloader which iterates through a given dataset. +:param algo_type: choice of calibration algorithm. +:param cache_file: path to cache file. +:param use_cache: flag which enables usage of pre-existing cache. +:param device: device on which calibration data is copied to.

+
+
+__init__(**kwargs)[source]
+
+ +
+ +
+
+class torch_tensorrt.ptq.CacheCalibrator(*args, **kwargs)[source]
+

Constructs a calibrator class in TensorRT which directly uses pre-existing cache file for calibration. +:param cache_file: path to cache file. +:param algo_type: choice of calibration algorithm.

+
+
+__init__(**kwargs)[source]
+
+ +
+ +
+
+

Enums

+
+
+class torch_tensorrt.ptq.CalibrationAlgo(value)[source]
+

An enumeration.

+
+ +
+
+ + +
+ +
+ + +
+
+ +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/py_api/torch_tensorrt.html b/docs/v1.2.0/py_api/torch_tensorrt.html new file mode 100644 index 0000000000..ef656841f9 --- /dev/null +++ b/docs/v1.2.0/py_api/torch_tensorrt.html @@ -0,0 +1,1029 @@ + + + + + + + + + + + + + torch_tensorrt — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

torch_tensorrt

+
+

Functions

+
+
+torch_tensorrt.set_device(gpu_id)[source]
+
+ +
+
+torch_tensorrt.compile(module: typing.Any, ir='default', inputs=[], enabled_precisions={<dtype.float: 0>}, **kwargs)[source]
+

Compile a PyTorch module for NVIDIA GPUs using TensorRT

+

Takes a existing PyTorch module and a set of settings to configure the compiler +and using the path specified in ir lower and compile the module to TensorRT +returning a PyTorch Module back

+

Converts specifically the forward method of a Module

+
+
Parameters
+

module (Union(torch.nn.Module,torch.jit.ScriptModule) – Source module

+
+
Keyword Arguments
+
    +
  • inputs (List[Union(torch_tensorrt.Input, torch.Tensor)]) –

    Required List of specifications of input shape, dtype and memory layout for inputs to the module. This argument is required. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using +torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum +to select device type.

    +
    input=[
    +    torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1
    +    torch_tensorrt.Input(
    +        min_shape=(1, 224, 224, 3),
    +        opt_shape=(1, 512, 512, 3),
    +        max_shape=(1, 1024, 1024, 3),
    +        dtype=torch.int32
    +        format=torch.channel_last
    +    ), # Dynamic input shape for input #2
    +    torch.randn((1, 3, 224, 244)) # Use an example tensor and let torch_tensorrt infer settings
    +]
    +
    +
    +

  • +
  • enabled_precision (Set(Union(torch.dpython:type, torch_tensorrt.dpython:type))) – The set of datatypes that TensorRT can use when selecting kernels

  • +
  • ir (str) – The requested strategy to compile. (Options: default - Let Torch-TensorRT decide, ts - TorchScript with scripting path)

  • +
  • **kwargs – Additional settings for the specific requested strategy (See submodules for more info)

  • +
+
+
Returns
+

Compiled Module, when run it will execute via TensorRT

+
+
Return type
+

torch.nn.Module

+
+
+
+ +
+
+torch_tensorrt.convert_method_to_trt_engine(module: typing.Any, method_name: str, ir='default', inputs=[], enabled_precisions={<dtype.float: 0>}, **kwargs)[source]
+

Convert a TorchScript module method to a serialized TensorRT engine

+

Converts a specified method of a module to a serialized TensorRT engine given a dictionary of conversion settings

+
+
Parameters
+

module (Union(torch.nn.Module,torch.jit.ScriptModule) – Source module

+
+
Keyword Arguments
+
    +
  • inputs (List[Union(torch_tensorrt.Input, torch.Tensor)]) –

    Required List of specifications of input shape, dtype and memory layout for inputs to the module. This argument is required. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using +torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum +to select device type.

    +
    input=[
    +    torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1
    +    torch_tensorrt.Input(
    +        min_shape=(1, 224, 224, 3),
    +        opt_shape=(1, 512, 512, 3),
    +        max_shape=(1, 1024, 1024, 3),
    +        dtype=torch.int32
    +        format=torch.channel_last
    +    ), # Dynamic input shape for input #2
    +    torch.randn((1, 3, 224, 244)) # Use an example tensor and let torch_tensorrt infer settings
    +]
    +
    +
    +

  • +
  • enabled_precision (Set(Union(torch.dpython:type, torch_tensorrt.dpython:type))) – The set of datatypes that TensorRT can use when selecting kernels

  • +
  • ir (str) – The requested strategy to compile. (Options: default - Let Torch-TensorRT decide, ts - TorchScript with scripting path)

  • +
  • **kwargs – Additional settings for the specific requested strategy (See submodules for more info)

  • +
+
+
Returns
+

Serialized TensorRT engine, can either be saved to a file or deserialized via TensorRT APIs

+
+
Return type
+

bytes

+
+
+
+ +
+
+torch_tensorrt.get_build_info() str[source]
+

Returns a string containing the build information of torch_tensorrt distribution

+
+
Returns
+

String containing the build information for torch_tensorrt distribution

+
+
Return type
+

str

+
+
+
+ +
+
+torch_tensorrt.dump_build_info()[source]
+

Prints build information about the torch_tensorrt distribution to stdout

+
+ +
+
+

Classes

+
+
+class torch_tensorrt.Input(*args, **kwargs)[source]
+

Defines an input to a module in terms of expected shape, data type and tensor format.

+
+
Variables
+
    +
  • shape_mode (torch_tensorrt.Input._ShapeMode) – Is input statically or dynamically shaped

  • +
  • shape (Tuple or Dict) –

    Either a single Tuple or a dict of tuples defining the input shape. +Static shaped inputs will have a single tuple. Dynamic inputs will have a dict of the form +``{

    +
    +

    ”min_shape”: Tuple, +“opt_shape”: Tuple, +“max_shape”: Tuple

    +
    +

    }``

    +

  • +
  • dtype (torch_tensorrt.dpython:type) – The expected data type of the input tensor (default: torch_tensorrt.dtype.float32)

  • +
  • format (torch_tensorrt.TensorFormat) – The expected format of the input tensor (default: torch_tensorrt.TensorFormat.NCHW)

  • +
+
+
+
+
+__init__(*args, **kwargs)[source]
+

__init__ Method for torch_tensorrt.Input

+

Input accepts one of a few construction patterns

+
+
Parameters
+

shape (Tuple or List, optional) – Static shape of input tensor

+
+
Keyword Arguments
+
    +
  • shape (Tuple or List, optional) – Static shape of input tensor

  • +
  • min_shape (Tuple or List, optional) – Min size of input tensor’s shape range +Note: All three of min_shape, opt_shape, max_shape must be provided, there must be no positional arguments, shape must not be defined and implictly this sets Input’s shape_mode to DYNAMIC

  • +
  • opt_shape (Tuple or List, optional) – Opt size of input tensor’s shape range +Note: All three of min_shape, opt_shape, max_shape must be provided, there must be no positional arguments, shape must not be defined and implictly this sets Input’s shape_mode to DYNAMIC

  • +
  • max_shape (Tuple or List, optional) – Max size of input tensor’s shape range +Note: All three of min_shape, opt_shape, max_shape must be provided, there must be no positional arguments, shape must not be defined and implictly this sets Input’s shape_mode to DYNAMIC

  • +
  • dtype (torch.dpython:type or torch_tensorrt.dpython:type) – Expected data type for input tensor (default: torch_tensorrt.dtype.float32)

  • +
  • format (torch.memory_format or torch_tensorrt.TensorFormat) – The expected format of the input tensor (default: torch_tensorrt.TensorFormat.NCHW)

  • +
+
+
+

Examples

+
    +
  • Input([1,3,32,32], dtype=torch.float32, format=torch.channel_last)

  • +
  • Input(shape=(1,3,32,32), dtype=torch_tensorrt.dtype.int32, format=torch_tensorrt.TensorFormat.NCHW)

  • +
  • Input(min_shape=(1,3,32,32), opt_shape=[2,3,32,32], max_shape=(3,3,32,32)) #Implicitly dtype=torch_tensorrt.dtype.float32, format=torch_tensorrt.TensorFormat.NCHW

  • +
+
+ +
+
+dtype = <dtype.unknown: 5>
+

torch_tensorrt.dtype.float32)

+
+
Type
+

The expected data type of the input tensor (default

+
+
+
+ +
+
+format = <TensorFormat.contiguous: 0>
+

torch_tensorrt.TensorFormat.NCHW)

+
+
Type
+

The expected format of the input tensor (default

+
+
+
+ +
+
+shape = None
+

Either a single Tuple or a dict of tuples defining the input shape. Static shaped inputs will have a single tuple. Dynamic inputs will have a dict of the form { "min_shape": Tuple, "opt_shape": Tuple, "max_shape": Tuple }

+
+
Type
+

(Tuple or Dict)

+
+
+
+ +
+
+shape_mode = None
+

Is input statically or dynamically shaped

+
+
Type
+

(torch_tensorrt.Input._ShapeMode)

+
+
+
+ +
+ +
+
+class torch_tensorrt.Device(*args, **kwargs)[source]
+

Defines a device that can be used to specify target devices for engines

+
+
Variables
+
    +
  • device_type (torch_tensorrt.DeviceType) – Target device type (GPU or DLA). Set implicitly based on if dla_core is specified.

  • +
  • gpu_id (python:int) – Device ID for target GPU

  • +
  • dla_core (python:int) – Core ID for target DLA core

  • +
  • allow_gpu_fallback (bool) – Whether falling back to GPU if DLA cannot support an op should be allowed

  • +
+
+
+
+
+__init__(*args, **kwargs)[source]
+

__init__ Method for torch_tensorrt.Device

+

Device accepts one of a few construction patterns

+
+
Parameters
+

spec (str) – String with device spec e.g. “dla:0” for dla, core_id 0

+
+
Keyword Arguments
+
    +
  • gpu_id (python:int) – ID of target GPU (will get overrided if dla_core is specified to the GPU managing DLA). If specified, no positional arguments should be provided

  • +
  • dla_core (python:int) – ID of target DLA core. If specified, no positional arguments should be provided.

  • +
  • allow_gpu_fallback (bool) – Allow TensorRT to schedule operations on GPU if they are not supported on DLA (ignored if device type is not DLA)

  • +
+
+
+

Examples

+
    +
  • Device(“gpu:1”)

  • +
  • Device(“cuda:1”)

  • +
  • Device(“dla:0”, allow_gpu_fallback=True)

  • +
  • Device(gpu_id=0, dla_core=0, allow_gpu_fallback=True)

  • +
  • Device(dla_core=0, allow_gpu_fallback=True)

  • +
  • Device(gpu_id=1)

  • +
+
+ +
+
+allow_gpu_fallback = False
+

(bool) Whether falling back to GPU if DLA cannot support an op should be allowed

+
+ +
+
+device_type = None
+

Target device type (GPU or DLA). Set implicitly based on if dla_core is specified.

+
+
Type
+

(torch_tensorrt.DeviceType)

+
+
+
+ +
+
+dla_core = -1
+

(int) Core ID for target DLA core

+
+ +
+
+gpu_id = -1
+

(int) Device ID for target GPU

+
+ +
+ +
+
+

Enums

+
+
+class torch_tensorrt.dtype
+

Enum to specifiy operating precision for engine execution

+

Members:

+
+

float : 32 bit floating point number

+

float32 : 32 bit floating point number

+

half : 16 bit floating point number

+

float16 : 16 bit floating point number

+

int8 : 8 bit integer number

+

int32 : 32 bit integer number

+

bool : Boolean value

+

unknown : Unknown data type

+
+
+ +
+
+class torch_tensorrt.DeviceType
+

Enum to specify device kinds to build TensorRT engines for

+

Members:

+
+

GPU : Specify using GPU to execute TensorRT Engine

+

DLA : Specify using DLA to execute TensorRT Engine (Jetson Only)

+
+
+ +
+
+class torch_tensorrt.EngineCapability
+

Enum to specify engine capability settings (selections of kernels to meet safety requirements)

+

Members:

+
+

safe_gpu : Use safety GPU kernels only

+

safe_dla : Use safety DLA kernels only

+

default : Use default behavior

+
+
+ +
+
+class torch_tensorrt.TensorFormat
+

Enum to specifiy the memory layout of tensors

+

Members:

+
+

contiguous : Contiguous memory layout (NCHW / Linear)

+

channels_last : Channels last memory layout (NHWC)

+
+
+ +
+
+

Submodules

+ +
+
+ + +
+ +
+ + +
+
+ +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/py_api/ts.html b/docs/v1.2.0/py_api/ts.html new file mode 100644 index 0000000000..e3ba80139e --- /dev/null +++ b/docs/v1.2.0/py_api/ts.html @@ -0,0 +1,931 @@ + + + + + + + + + + + + + torch_tensorrt.ts — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

torch_tensorrt.ts

+
+

Functions

+
+
+torch_tensorrt.ts.compile(module: torch.jit._script.ScriptModule, inputs=[], input_signature=None, device=<torch_tensorrt._Device.Device object>, disable_tf32=False, sparse_weights=False, enabled_precisions={}, refit=False, debug=False, capability=<EngineCapability.default: 0>, num_avg_timing_iters=1, workspace_size=0, dla_sram_size=1048576, dla_local_dram_size=1073741824, dla_global_dram_size=536870912, calibrator=None, truncate_long_and_double=False, require_full_compilation=False, min_block_size=3, torch_executed_ops=[], torch_executed_modules=[]) torch.jit._script.ScriptModule[source]
+

Compile a TorchScript module for NVIDIA GPUs using TensorRT

+

Takes a existing TorchScript module and a set of settings to configure the compiler +and will convert methods to JIT Graphs which call equivalent TensorRT engines

+

Converts specifically the forward method of a TorchScript Module

+
+
Parameters
+

module (torch.jit.ScriptModule) – Source module, a result of tracing or scripting a PyTorch +torch.nn.Module

+
+
Keyword Arguments
+
    +
  • inputs (List[Union(torch_tensorrt.Input, torch.Tensor)]) –

    Required List of specifications of input shape, dtype and memory layout for inputs to the module. This argument is required. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using +torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum +to select device type.

    +
    input=[
    +    torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1
    +    torch_tensorrt.Input(
    +        min_shape=(1, 224, 224, 3),
    +        opt_shape=(1, 512, 512, 3),
    +        max_shape=(1, 1024, 1024, 3),
    +        dtype=torch.int32
    +        format=torch.channel_last
    +    ), # Dynamic input shape for input #2
    +    torch.randn((1, 3, 224, 244)) # Use an example tensor and let torch_tensorrt infer settings
    +]
    +
    +
    +

  • +
  • Union (input_signature) –

    A formatted collection of input specifications for the module. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using +torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum to select device type. This API should be considered beta-level stable and may change in the future

    +
    input_signature=([
    +    torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1
    +    torch_tensorrt.Input(
    +        min_shape=(1, 224, 224, 3),
    +        opt_shape=(1, 512, 512, 3),
    +        max_shape=(1, 1024, 1024, 3),
    +        dtype=torch.int32
    +        format=torch.channel_last
    +    ), # Dynamic input shape for input #2
    +], torch.randn((1, 3, 224, 244))) # Use an example tensor and let torch_tensorrt infer settings for input #3
    +
    +
    +

  • +
  • device (Union(torch_tensorrt.Device, torch.device, dict)) –

    Target device for TensorRT engines to run on

    +
    device=torch_tensorrt.Device("dla:1", allow_gpu_fallback=True)
    +
    +
    +

  • +
  • disable_tf32 (bool) – Force FP32 layers to use traditional as FP32 format vs the default behavior of rounding the inputs to 10-bit mantissas before multiplying, but accumulates the sum using 23-bit mantissas

  • +
  • sparse_weights (bool) – Enable sparsity for convolution and fully connected layers.

  • +
  • enabled_precision (Set(Union(torch.dpython:type, torch_tensorrt.dpython:type))) – The set of datatypes that TensorRT can use when selecting kernels

  • +
  • refit (bool) – Enable refitting

  • +
  • debug (bool) – Enable debuggable engine

  • +
  • capability (torch_tensorrt.EngineCapability) – Restrict kernel selection to safe gpu kernels or safe dla kernels

  • +
  • num_avg_timing_iters (python:int) – Number of averaging timing iterations used to select kernels

  • +
  • workspace_size (python:int) – Maximum size of workspace given to TensorRT

  • +
  • dla_sram_size (python:int) – Fast software managed RAM used by DLA to communicate within a layer.

  • +
  • dla_local_dram_size (python:int) – Host RAM used by DLA to share intermediate tensor data across operations

  • +
  • dla_global_dram_size (python:int) – Host RAM used by DLA to store weights and metadata for execution

  • +
  • truncate_long_and_double (bool) – Truncate weights provided in int64 or double (float64) to int32 and float32

  • +
  • calibrator (Union(torch_tensorrt._C.IInt8Calibrator, tensorrt.IInt8Calibrator)) – Calibrator object which will provide data to the PTQ system for INT8 Calibration

  • +
  • require_full_compilation (bool) – Require modules to be compiled end to end or return an error as opposed to returning a hybrid graph where operations that cannot be run in TensorRT are run in PyTorch

  • +
  • min_block_size (python:int) – The minimum number of contiguous TensorRT convertable operations in order to run a set of operations in TensorRT

  • +
  • torch_executed_ops (List[str]) – List of aten operators that must be run in PyTorch. An error will be thrown if this list is not empty but require_full_compilation is True

  • +
  • torch_executed_modules (List[str]) – List of modules that must be run in PyTorch. An error will be thrown if this list is not empty but require_full_compilation is True

  • +
+
+
Returns
+

Compiled TorchScript Module, when run it will execute via TensorRT

+
+
Return type
+

torch.jit.ScriptModule

+
+
+
+ +
+
+torch_tensorrt.ts.convert_method_to_trt_engine(module: torch.jit._script.ScriptModule, method_name: str, inputs=[], device=<torch_tensorrt._Device.Device object>, disable_tf32=False, sparse_weights=False, enabled_precisions={}, refit=False, debug=False, capability=<EngineCapability.default: 0>, num_avg_timing_iters=1, workspace_size=0, dla_sram_size=1048576, dla_local_dram_size=1073741824, dla_global_dram_size=536870912, truncate_long_and_double=False, calibrator=None) str[source]
+

Convert a TorchScript module method to a serialized TensorRT engine

+

Converts a specified method of a module to a serialized TensorRT engine given a dictionary of conversion settings

+
+
Parameters
+
    +
  • module (torch.jit.ScriptModule) – Source module, a result of tracing or scripting a PyTorch +torch.nn.Module

  • +
  • method_name (str) – Name of method to convert

  • +
+
+
Keyword Arguments
+
    +
  • inputs (List[Union(torch_tensorrt.Input, torch.Tensor)]) –

    Required List of specifications of input shape, dtype and memory layout for inputs to the module. This argument is required. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using +torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum +to select device type.

    +
    input=[
    +    torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1
    +    torch_tensorrt.Input(
    +        min_shape=(1, 224, 224, 3),
    +        opt_shape=(1, 512, 512, 3),
    +        max_shape=(1, 1024, 1024, 3),
    +        dtype=torch.int32
    +        format=torch.channel_last
    +    ), # Dynamic input shape for input #2
    +    torch.randn((1, 3, 224, 244)) # Use an example tensor and let torch_tensorrt infer settings
    +]
    +
    +
    +

  • +
  • Union (input_signature) –

    A formatted collection of input specifications for the module. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using +torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum to select device type. This API should be considered beta-level stable and may change in the future

    +
    input_signature=([
    +    torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1
    +    torch_tensorrt.Input(
    +        min_shape=(1, 224, 224, 3),
    +        opt_shape=(1, 512, 512, 3),
    +        max_shape=(1, 1024, 1024, 3),
    +        dtype=torch.int32
    +        format=torch.channel_last
    +    ), # Dynamic input shape for input #2
    +], torch.randn((1, 3, 224, 244))) # Use an example tensor and let torch_tensorrt infer settings for input #3
    +
    +
    +

  • +
  • device (Union(torch_tensorrt.Device, torch.device, dict)) –

    Target device for TensorRT engines to run on

    +
    device=torch_tensorrt.Device("dla:1", allow_gpu_fallback=True)
    +
    +
    +

  • +
  • disable_tf32 (bool) – Force FP32 layers to use traditional as FP32 format vs the default behavior of rounding the inputs to 10-bit mantissas before multiplying, but accumulates the sum using 23-bit mantissas

  • +
  • sparse_weights (bool) – Enable sparsity for convolution and fully connected layers.

  • +
  • enabled_precision (Set(Union(torch.dpython:type, torch_tensorrt.dpython:type))) – The set of datatypes that TensorRT can use when selecting kernels

  • +
  • refit (bool) – Enable refitting

  • +
  • debug (bool) – Enable debuggable engine

  • +
  • capability (torch_tensorrt.EngineCapability) – Restrict kernel selection to safe gpu kernels or safe dla kernels

  • +
  • num_avg_timing_iters (python:int) – Number of averaging timing iterations used to select kernels

  • +
  • workspace_size (python:int) – Maximum size of workspace given to TensorRT

  • +
  • dla_sram_size (python:int) – Fast software managed RAM used by DLA to communicate within a layer.

  • +
  • dla_local_dram_size (python:int) – Host RAM used by DLA to share intermediate tensor data across operations

  • +
  • dla_global_dram_size (python:int) – Host RAM used by DLA to store weights and metadata for execution

  • +
  • truncate_long_and_double (bool) – Truncate weights provided in int64 or double (float64) to int32 and float32

  • +
  • calibrator (Union(torch_tensorrt._C.IInt8Calibrator, tensorrt.IInt8Calibrator)) – Calibrator object which will provide data to the PTQ system for INT8 Calibration

  • +
+
+
Returns
+

Serialized TensorRT engine, can either be saved to a file or deserialized via TensorRT APIs

+
+
Return type
+

bytes

+
+
+
+ +
+
+torch_tensorrt.ts.check_method_op_support(module: torch.jit._script.ScriptModule, method_name: str) bool[source]
+

Checks to see if a method is fully supported by torch_tensorrt

+

Checks if a method of a TorchScript module can be compiled by torch_tensorrt, if not, a list of operators +that are not supported are printed out and the function returns false, else true.

+
+
Parameters
+
    +
  • module (torch.jit.ScriptModule) – Source module, a result of tracing or scripting a PyTorch +torch.nn.Module

  • +
  • method_name (str) – Name of method to check

  • +
+
+
Returns
+

True if supported Method

+
+
Return type
+

bool

+
+
+
+ +
+
+torch_tensorrt.ts.embed_engine_in_new_module(serialized_engine: bytes, device=<torch_tensorrt._Device.Device object>) torch.jit._script.ScriptModule[source]
+

Takes a pre-built serialized TensorRT engine and embeds it within a TorchScript module

+

Takes a pre-built serialied TensorRT engine (as bytes) and embeds it within a TorchScript module. +Registers the forward method to execute the TensorRT engine with the function signature:

+
+

forward(Tensor[]) -> Tensor[]

+
+
+
TensorRT bindings must have names with the following format:
    +
  • [symbol].[index in input / output array]

  • +
+

ex. +- [x.0, x.1, x.2] -> [y.0]

+
+
+

Module can be save with engine embedded with torch.jit.save and moved / loaded according to torch_tensorrt portability rules

+
+
Parameters
+

serialized_engine (bytes) – Serialized TensorRT engine from either torch_tensorrt or TensorRT APIs

+
+
Keyword Arguments
+

device (Union(torch_tensorrt.Device, torch.device, dict)) – Target device to run engine on. Must be compatible with engine provided. Default: Current active device

+
+
Returns
+

New TorchScript module with engine embedded

+
+
Return type
+

torch.jit.ScriptModule

+
+
+
+ +
+
+torch_tensorrt.ts.TensorRTCompileSpec(inputs=[], input_signature=None, device=<torch_tensorrt._Device.Device object>, disable_tf32=False, sparse_weights=False, enabled_precisions={}, refit=False, debug=False, capability=<EngineCapability.default: 0>, num_avg_timing_iters=1, workspace_size=0, dla_sram_size=1048576, dla_local_dram_size=1073741824, dla_global_dram_size=536870912, truncate_long_and_double=False, calibrator=None) <torch.ScriptClass object at 0x7f6a8d162db0>[source]
+

Utility to create a formated spec dictionary for using the PyTorch TensorRT backend

+
+
Keyword Arguments
+
    +
  • inputs (List[Union(torch_tensorrt.Input, torch.Tensor)]) –

    Required List of specifications of input shape, dtype and memory layout for inputs to the module. This argument is required. Input Sizes can be specified as torch sizes, tuples or lists. dtypes can be specified using +torch datatypes or torch_tensorrt datatypes and you can use either torch devices or the torch_tensorrt device type enum +to select device type.

    +
    input=[
    +    torch_tensorrt.Input((1, 3, 224, 224)), # Static NCHW input shape for input #1
    +    torch_tensorrt.Input(
    +        min_shape=(1, 224, 224, 3),
    +        opt_shape=(1, 512, 512, 3),
    +        max_shape=(1, 1024, 1024, 3),
    +        dtype=torch.int32
    +        format=torch.channel_last
    +    ), # Dynamic input shape for input #2
    +    torch.randn((1, 3, 224, 244)) # Use an example tensor and let torch_tensorrt infer settings
    +]
    +
    +
    +

  • +
  • device (Union(torch_tensorrt.Device, torch.device, dict)) –

    Target device for TensorRT engines to run on

    +
    device=torch_tensorrt.Device("dla:1", allow_gpu_fallback=True)
    +
    +
    +

  • +
  • disable_tf32 (bool) – Force FP32 layers to use traditional as FP32 format vs the default behavior of rounding the inputs to 10-bit mantissas before multiplying, but accumulates the sum using 23-bit mantissas

  • +
  • sparse_weights (bool) – Enable sparsity for convolution and fully connected layers.

  • +
  • enabled_precision (Set(Union(torch.dpython:type, torch_tensorrt.dpython:type))) – The set of datatypes that TensorRT can use when selecting kernels

  • +
  • refit (bool) – Enable refitting

  • +
  • debug (bool) – Enable debuggable engine

  • +
  • capability (torch_tensorrt.EngineCapability) – Restrict kernel selection to safe gpu kernels or safe dla kernels

  • +
  • num_avg_timing_iters (python:int) – Number of averaging timing iterations used to select kernels

  • +
  • workspace_size (python:int) – Maximum size of workspace given to TensorRT

  • +
  • truncate_long_and_double (bool) – Truncate weights provided in int64 or double (float64) to int32 and float32

  • +
  • calibrator – Calibrator object which will provide data to the PTQ system for INT8 Calibration

  • +
+
+
+
+ +
+
+ + +
+ +
+ + +
+
+ +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/search.html b/docs/v1.2.0/search.html new file mode 100644 index 0000000000..75d0307278 --- /dev/null +++ b/docs/v1.2.0/search.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + Search — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/searchindex.js b/docs/v1.2.0/searchindex.js new file mode 100644 index 0000000000..6bfb340762 --- /dev/null +++ b/docs/v1.2.0/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({docnames:["_cpp_api/class_view_hierarchy","_cpp_api/classtorch__tensorrt_1_1DataType","_cpp_api/classtorch__tensorrt_1_1Device_1_1DeviceType","_cpp_api/classtorch__tensorrt_1_1TensorFormat","_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator","_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8Calibrator","_cpp_api/define_macros_8h_1a18d295a837ac71add5578860b55e5502","_cpp_api/define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268","_cpp_api/define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e","_cpp_api/define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827","_cpp_api/define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b","_cpp_api/define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da","_cpp_api/define_macros_8h_1ad19939408f7be171a74a89928b36eb59","_cpp_api/define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883","_cpp_api/dir_cpp","_cpp_api/dir_cpp_include","_cpp_api/dir_cpp_include_torch_tensorrt","_cpp_api/enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558","_cpp_api/enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb","_cpp_api/file_cpp_include_torch_tensorrt_logging.h","_cpp_api/file_cpp_include_torch_tensorrt_macros.h","_cpp_api/file_cpp_include_torch_tensorrt_ptq.h","_cpp_api/file_cpp_include_torch_tensorrt_torch_tensorrt.h","_cpp_api/file_view_hierarchy","_cpp_api/function_logging_8h_1a0593f776f469c20469e2f729fc7861a3","_cpp_api/function_logging_8h_1a0c012cb374addd90eb1f42eaec570650","_cpp_api/function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a","_cpp_api/function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2","_cpp_api/function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8","_cpp_api/function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5","_cpp_api/function_logging_8h_1af8f3443813315af7901903d25dd495cc","_cpp_api/function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c","_cpp_api/function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178","_cpp_api/function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039","_cpp_api/function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa","_cpp_api/function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797","_cpp_api/function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9","_cpp_api/function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef","_cpp_api/function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528","_cpp_api/function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384","_cpp_api/function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1","_cpp_api/function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2","_cpp_api/namespace_torch_tensorrt","_cpp_api/namespace_torch_tensorrt__logging","_cpp_api/namespace_torch_tensorrt__ptq","_cpp_api/namespace_torch_tensorrt__torchscript","_cpp_api/program_listing_file_cpp_include_torch_tensorrt_logging.h","_cpp_api/program_listing_file_cpp_include_torch_tensorrt_macros.h","_cpp_api/program_listing_file_cpp_include_torch_tensorrt_ptq.h","_cpp_api/program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h","_cpp_api/structtorch__tensorrt_1_1Device","_cpp_api/structtorch__tensorrt_1_1GraphInputs","_cpp_api/structtorch__tensorrt_1_1Input","_cpp_api/structtorch__tensorrt_1_1torchscript_1_1CompileSpec","_cpp_api/torch_tensort_cpp","_cpp_api/unabridged_api","_cpp_api/unabridged_orphan","_notebooks/CitriNet-example","_notebooks/EfficientNet-example","_notebooks/Hugging-Face-BERT","_notebooks/Resnet50-example","_notebooks/dynamic-shapes","_notebooks/lenet-getting-started","_notebooks/ssd-object-detection-demo","_notebooks/vgg-qat","cli/torchtrtc","contributors/conversion","contributors/lowering","contributors/partitioning","contributors/phases","contributors/runtime","contributors/system_overview","contributors/useful_links","contributors/writing_converters","getting_started/getting_started_with_cpp_api","getting_started/getting_started_with_python_api","getting_started/getting_started_with_windows","getting_started/installation","index","indices/supported_ops","py_api/fx","py_api/logging","py_api/ptq","py_api/torch_tensorrt","py_api/ts","src/pytorch-sphinx-theme/docs/changelog","src/pytorch-sphinx-theme/docs/configuring","src/pytorch-sphinx-theme/docs/demo/api","src/pytorch-sphinx-theme/docs/demo/demo","src/pytorch-sphinx-theme/docs/demo/lists_tables","src/pytorch-sphinx-theme/docs/demo/long","src/pytorch-sphinx-theme/docs/demo/structure","src/pytorch-sphinx-theme/docs/index","src/pytorch-sphinx-theme/docs/installing","tutorials/creating_torchscript_module_in_python","tutorials/getting_started_with_fx_path","tutorials/notebooks","tutorials/ptq","tutorials/runtime","tutorials/serving_torch_tensorrt_with_triton","tutorials/use_from_pytorch","tutorials/using_dla"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":5,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.intersphinx":1,"sphinx.ext.todo":2,"sphinx.ext.viewcode":1,nbsphinx:4,sphinx:56},filenames:["_cpp_api/class_view_hierarchy.rst","_cpp_api/classtorch__tensorrt_1_1DataType.rst","_cpp_api/classtorch__tensorrt_1_1Device_1_1DeviceType.rst","_cpp_api/classtorch__tensorrt_1_1TensorFormat.rst","_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator.rst","_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8Calibrator.rst","_cpp_api/define_macros_8h_1a18d295a837ac71add5578860b55e5502.rst","_cpp_api/define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268.rst","_cpp_api/define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e.rst","_cpp_api/define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827.rst","_cpp_api/define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b.rst","_cpp_api/define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da.rst","_cpp_api/define_macros_8h_1ad19939408f7be171a74a89928b36eb59.rst","_cpp_api/define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883.rst","_cpp_api/dir_cpp.rst","_cpp_api/dir_cpp_include.rst","_cpp_api/dir_cpp_include_torch_tensorrt.rst","_cpp_api/enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558.rst","_cpp_api/enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb.rst","_cpp_api/file_cpp_include_torch_tensorrt_logging.h.rst","_cpp_api/file_cpp_include_torch_tensorrt_macros.h.rst","_cpp_api/file_cpp_include_torch_tensorrt_ptq.h.rst","_cpp_api/file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst","_cpp_api/file_view_hierarchy.rst","_cpp_api/function_logging_8h_1a0593f776f469c20469e2f729fc7861a3.rst","_cpp_api/function_logging_8h_1a0c012cb374addd90eb1f42eaec570650.rst","_cpp_api/function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a.rst","_cpp_api/function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2.rst","_cpp_api/function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8.rst","_cpp_api/function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5.rst","_cpp_api/function_logging_8h_1af8f3443813315af7901903d25dd495cc.rst","_cpp_api/function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c.rst","_cpp_api/function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178.rst","_cpp_api/function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039.rst","_cpp_api/function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa.rst","_cpp_api/function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797.rst","_cpp_api/function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9.rst","_cpp_api/function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef.rst","_cpp_api/function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528.rst","_cpp_api/function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384.rst","_cpp_api/function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1.rst","_cpp_api/function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2.rst","_cpp_api/namespace_torch_tensorrt.rst","_cpp_api/namespace_torch_tensorrt__logging.rst","_cpp_api/namespace_torch_tensorrt__ptq.rst","_cpp_api/namespace_torch_tensorrt__torchscript.rst","_cpp_api/program_listing_file_cpp_include_torch_tensorrt_logging.h.rst","_cpp_api/program_listing_file_cpp_include_torch_tensorrt_macros.h.rst","_cpp_api/program_listing_file_cpp_include_torch_tensorrt_ptq.h.rst","_cpp_api/program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h.rst","_cpp_api/structtorch__tensorrt_1_1Device.rst","_cpp_api/structtorch__tensorrt_1_1GraphInputs.rst","_cpp_api/structtorch__tensorrt_1_1Input.rst","_cpp_api/structtorch__tensorrt_1_1torchscript_1_1CompileSpec.rst","_cpp_api/torch_tensort_cpp.rst","_cpp_api/unabridged_api.rst","_cpp_api/unabridged_orphan.rst","_notebooks/CitriNet-example.ipynb","_notebooks/EfficientNet-example.ipynb","_notebooks/Hugging-Face-BERT.ipynb","_notebooks/Resnet50-example.ipynb","_notebooks/dynamic-shapes.ipynb","_notebooks/lenet-getting-started.ipynb","_notebooks/ssd-object-detection-demo.ipynb","_notebooks/vgg-qat.ipynb","cli/torchtrtc.rst","contributors/conversion.rst","contributors/lowering.rst","contributors/partitioning.rst","contributors/phases.rst","contributors/runtime.rst","contributors/system_overview.rst","contributors/useful_links.rst","contributors/writing_converters.rst","getting_started/getting_started_with_cpp_api.rst","getting_started/getting_started_with_python_api.rst","getting_started/getting_started_with_windows.rst","getting_started/installation.rst","index.rst","indices/supported_ops.rst","py_api/fx.rst","py_api/logging.rst","py_api/ptq.rst","py_api/torch_tensorrt.rst","py_api/ts.rst","src/pytorch-sphinx-theme/docs/changelog.rst","src/pytorch-sphinx-theme/docs/configuring.rst","src/pytorch-sphinx-theme/docs/demo/api.rst","src/pytorch-sphinx-theme/docs/demo/demo.rst","src/pytorch-sphinx-theme/docs/demo/lists_tables.rst","src/pytorch-sphinx-theme/docs/demo/long.rst","src/pytorch-sphinx-theme/docs/demo/structure.rst","src/pytorch-sphinx-theme/docs/index.rst","src/pytorch-sphinx-theme/docs/installing.rst","tutorials/creating_torchscript_module_in_python.rst","tutorials/getting_started_with_fx_path.rst","tutorials/notebooks.rst","tutorials/ptq.rst","tutorials/runtime.rst","tutorials/serving_torch_tensorrt_with_triton.rst","tutorials/use_from_pytorch.rst","tutorials/using_dla.rst"],objects:{"":[[6,0,1,"c.STR","STR"],[10,0,1,"c.TORCHTRT_API","TORCHTRT_API"],[12,0,1,"c.TORCHTRT_HIDDEN","TORCHTRT_HIDDEN"],[8,0,1,"c.TORCH_TENSORRT_MAJOR_VERSION","TORCH_TENSORRT_MAJOR_VERSION"],[9,0,1,"c.TORCH_TENSORRT_MINOR_VERSION","TORCH_TENSORRT_MINOR_VERSION"],[7,0,1,"c.TORCH_TENSORRT_PATCH_VERSION","TORCH_TENSORRT_PATCH_VERSION"],[13,0,1,"c.TORCH_TENSORRT_VERSION","TORCH_TENSORRT_VERSION"],[11,0,1,"c.XSTR","XSTR"],[1,1,1,"_CPPv4N14torch_tensorrt8DataTypeE","torch_tensorrt::DataType"],[1,2,1,"_CPPv4N14torch_tensorrt8DataType8DataTypeE5Value","torch_tensorrt::DataType::DataType"],[1,2,1,"_CPPv4N14torch_tensorrt8DataType8DataTypeEN3c1010ScalarTypeE","torch_tensorrt::DataType::DataType"],[1,2,1,"_CPPv4N14torch_tensorrt8DataType8DataTypeEv","torch_tensorrt::DataType::DataType"],[1,3,1,"_CPPv4N14torch_tensorrt8DataType8DataTypeE5Value","torch_tensorrt::DataType::DataType::t"],[1,3,1,"_CPPv4N14torch_tensorrt8DataType8DataTypeEN3c1010ScalarTypeE","torch_tensorrt::DataType::DataType::t"],[1,4,1,"_CPPv4N14torch_tensorrt8DataType5ValueE","torch_tensorrt::DataType::Value"],[1,5,1,"_CPPv4N14torch_tensorrt8DataType5Value5kBoolE","torch_tensorrt::DataType::Value::kBool"],[1,5,1,"_CPPv4N14torch_tensorrt8DataType5Value5kCharE","torch_tensorrt::DataType::Value::kChar"],[1,5,1,"_CPPv4N14torch_tensorrt8DataType5Value6kFloatE","torch_tensorrt::DataType::Value::kFloat"],[1,5,1,"_CPPv4N14torch_tensorrt8DataType5Value5kHalfE","torch_tensorrt::DataType::Value::kHalf"],[1,5,1,"_CPPv4N14torch_tensorrt8DataType5Value4kIntE","torch_tensorrt::DataType::Value::kInt"],[1,5,1,"_CPPv4N14torch_tensorrt8DataType5Value8kUnknownE","torch_tensorrt::DataType::Value::kUnknown"],[1,2,1,"_CPPv4NK14torch_tensorrt8DataTypecv5ValueEv","torch_tensorrt::DataType::operator Value"],[1,2,1,"_CPPv4N14torch_tensorrt8DataTypecvbEv","torch_tensorrt::DataType::operator bool"],[1,2,1,"_CPPv4NK14torch_tensorrt8DataTypeneE8DataType","torch_tensorrt::DataType::operator!="],[1,2,1,"_CPPv4NK14torch_tensorrt8DataTypeneEN8DataType5ValueE","torch_tensorrt::DataType::operator!="],[1,3,1,"_CPPv4NK14torch_tensorrt8DataTypeneE8DataType","torch_tensorrt::DataType::operator!=::other"],[1,3,1,"_CPPv4NK14torch_tensorrt8DataTypeneEN8DataType5ValueE","torch_tensorrt::DataType::operator!=::other"],[1,2,1,"_CPPv4NK14torch_tensorrt8DataTypeeqE8DataType","torch_tensorrt::DataType::operator=="],[1,2,1,"_CPPv4NK14torch_tensorrt8DataTypeeqEN8DataType5ValueE","torch_tensorrt::DataType::operator=="],[1,3,1,"_CPPv4NK14torch_tensorrt8DataTypeeqE8DataType","torch_tensorrt::DataType::operator==::other"],[1,3,1,"_CPPv4NK14torch_tensorrt8DataTypeeqEN8DataType5ValueE","torch_tensorrt::DataType::operator==::other"],[50,1,1,"_CPPv4N14torch_tensorrt6DeviceE","torch_tensorrt::Device"],[50,2,1,"_CPPv4N14torch_tensorrt6Device6DeviceEv","torch_tensorrt::Device::Device"],[2,1,1,"_CPPv4N14torch_tensorrt6Device10DeviceTypeE","torch_tensorrt::Device::DeviceType"],[50,1,1,"_CPPv4N14torch_tensorrt6Device10DeviceTypeE","torch_tensorrt::Device::DeviceType"],[2,2,1,"_CPPv4N14torch_tensorrt6Device10DeviceType10DeviceTypeE5Value","torch_tensorrt::Device::DeviceType::DeviceType"],[2,2,1,"_CPPv4N14torch_tensorrt6Device10DeviceType10DeviceTypeEN3c1010DeviceTypeE","torch_tensorrt::Device::DeviceType::DeviceType"],[2,2,1,"_CPPv4N14torch_tensorrt6Device10DeviceType10DeviceTypeEv","torch_tensorrt::Device::DeviceType::DeviceType"],[50,2,1,"_CPPv4N14torch_tensorrt6Device10DeviceType10DeviceTypeE5Value","torch_tensorrt::Device::DeviceType::DeviceType"],[50,2,1,"_CPPv4N14torch_tensorrt6Device10DeviceType10DeviceTypeEN3c1010DeviceTypeE","torch_tensorrt::Device::DeviceType::DeviceType"],[50,2,1,"_CPPv4N14torch_tensorrt6Device10DeviceType10DeviceTypeEv","torch_tensorrt::Device::DeviceType::DeviceType"],[2,3,1,"_CPPv4N14torch_tensorrt6Device10DeviceType10DeviceTypeE5Value","torch_tensorrt::Device::DeviceType::DeviceType::t"],[2,3,1,"_CPPv4N14torch_tensorrt6Device10DeviceType10DeviceTypeEN3c1010DeviceTypeE","torch_tensorrt::Device::DeviceType::DeviceType::t"],[50,3,1,"_CPPv4N14torch_tensorrt6Device10DeviceType10DeviceTypeE5Value","torch_tensorrt::Device::DeviceType::DeviceType::t"],[50,3,1,"_CPPv4N14torch_tensorrt6Device10DeviceType10DeviceTypeEN3c1010DeviceTypeE","torch_tensorrt::Device::DeviceType::DeviceType::t"],[2,4,1,"_CPPv4N14torch_tensorrt6Device10DeviceType5ValueE","torch_tensorrt::Device::DeviceType::Value"],[50,4,1,"_CPPv4N14torch_tensorrt6Device10DeviceType5ValueE","torch_tensorrt::Device::DeviceType::Value"],[2,5,1,"_CPPv4N14torch_tensorrt6Device10DeviceType5Value4kDLAE","torch_tensorrt::Device::DeviceType::Value::kDLA"],[50,5,1,"_CPPv4N14torch_tensorrt6Device10DeviceType5Value4kDLAE","torch_tensorrt::Device::DeviceType::Value::kDLA"],[2,5,1,"_CPPv4N14torch_tensorrt6Device10DeviceType5Value4kGPUE","torch_tensorrt::Device::DeviceType::Value::kGPU"],[50,5,1,"_CPPv4N14torch_tensorrt6Device10DeviceType5Value4kGPUE","torch_tensorrt::Device::DeviceType::Value::kGPU"],[2,2,1,"_CPPv4NK14torch_tensorrt6Device10DeviceTypecv5ValueEv","torch_tensorrt::Device::DeviceType::operator Value"],[50,2,1,"_CPPv4NK14torch_tensorrt6Device10DeviceTypecv5ValueEv","torch_tensorrt::Device::DeviceType::operator Value"],[2,2,1,"_CPPv4N14torch_tensorrt6Device10DeviceTypecvbEv","torch_tensorrt::Device::DeviceType::operator bool"],[50,2,1,"_CPPv4N14torch_tensorrt6Device10DeviceTypecvbEv","torch_tensorrt::Device::DeviceType::operator bool"],[2,2,1,"_CPPv4NK14torch_tensorrt6Device10DeviceTypeneE10DeviceType","torch_tensorrt::Device::DeviceType::operator!="],[50,2,1,"_CPPv4NK14torch_tensorrt6Device10DeviceTypeneE10DeviceType","torch_tensorrt::Device::DeviceType::operator!="],[2,3,1,"_CPPv4NK14torch_tensorrt6Device10DeviceTypeneE10DeviceType","torch_tensorrt::Device::DeviceType::operator!=::other"],[50,3,1,"_CPPv4NK14torch_tensorrt6Device10DeviceTypeneE10DeviceType","torch_tensorrt::Device::DeviceType::operator!=::other"],[2,2,1,"_CPPv4NK14torch_tensorrt6Device10DeviceTypeeqE10DeviceType","torch_tensorrt::Device::DeviceType::operator=="],[50,2,1,"_CPPv4NK14torch_tensorrt6Device10DeviceTypeeqE10DeviceType","torch_tensorrt::Device::DeviceType::operator=="],[2,3,1,"_CPPv4NK14torch_tensorrt6Device10DeviceTypeeqE10DeviceType","torch_tensorrt::Device::DeviceType::operator==::other"],[50,3,1,"_CPPv4NK14torch_tensorrt6Device10DeviceTypeeqE10DeviceType","torch_tensorrt::Device::DeviceType::operator==::other"],[50,6,1,"_CPPv4N14torch_tensorrt6Device18allow_gpu_fallbackE","torch_tensorrt::Device::allow_gpu_fallback"],[50,6,1,"_CPPv4N14torch_tensorrt6Device11device_typeE","torch_tensorrt::Device::device_type"],[50,6,1,"_CPPv4N14torch_tensorrt6Device8dla_coreE","torch_tensorrt::Device::dla_core"],[50,6,1,"_CPPv4N14torch_tensorrt6Device6gpu_idE","torch_tensorrt::Device::gpu_id"],[18,4,1,"_CPPv4N14torch_tensorrt16EngineCapabilityE","torch_tensorrt::EngineCapability"],[18,5,1,"_CPPv4N14torch_tensorrt16EngineCapability15kDLA_STANDALONEE","torch_tensorrt::EngineCapability::kDLA_STANDALONE"],[18,5,1,"_CPPv4N14torch_tensorrt16EngineCapability7kSAFETYE","torch_tensorrt::EngineCapability::kSAFETY"],[18,5,1,"_CPPv4N14torch_tensorrt16EngineCapability9kSTANDARDE","torch_tensorrt::EngineCapability::kSTANDARD"],[51,1,1,"_CPPv4N14torch_tensorrt11GraphInputsE","torch_tensorrt::GraphInputs"],[51,6,1,"_CPPv4N14torch_tensorrt11GraphInputs15input_signatureE","torch_tensorrt::GraphInputs::input_signature"],[51,6,1,"_CPPv4N14torch_tensorrt11GraphInputs6inputsE","torch_tensorrt::GraphInputs::inputs"],[52,1,1,"_CPPv4N14torch_tensorrt5InputE","torch_tensorrt::Input"],[52,2,1,"_CPPv4N14torch_tensorrt5Input5InputEN2at6TensorE","torch_tensorrt::Input::Input"],[52,2,1,"_CPPv4N14torch_tensorrt5Input5InputEN3c108ArrayRefI7int64_tEE12TensorFormat","torch_tensorrt::Input::Input"],[52,2,1,"_CPPv4N14torch_tensorrt5Input5InputEN3c108ArrayRefI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input"],[52,2,1,"_CPPv4N14torch_tensorrt5Input5InputEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEE12TensorFormat","torch_tensorrt::Input::Input"],[52,2,1,"_CPPv4N14torch_tensorrt5Input5InputEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input"],[52,2,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEE12TensorFormat","torch_tensorrt::Input::Input"],[52,2,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input"],[52,2,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEENSt6vectorI7int64_tEENSt6vectorI7int64_tEE12TensorFormat","torch_tensorrt::Input::Input"],[52,2,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEENSt6vectorI7int64_tEENSt6vectorI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input"],[52,2,1,"_CPPv4N14torch_tensorrt5Input5InputEv","torch_tensorrt::Input::Input"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputEN3c108ArrayRefI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input::dtype"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input::dtype"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input::dtype"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEENSt6vectorI7int64_tEENSt6vectorI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input::dtype"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputEN3c108ArrayRefI7int64_tEE12TensorFormat","torch_tensorrt::Input::Input::format"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputEN3c108ArrayRefI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input::format"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEE12TensorFormat","torch_tensorrt::Input::Input::format"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input::format"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEE12TensorFormat","torch_tensorrt::Input::Input::format"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input::format"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEENSt6vectorI7int64_tEENSt6vectorI7int64_tEE12TensorFormat","torch_tensorrt::Input::Input::format"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEENSt6vectorI7int64_tEENSt6vectorI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input::format"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEE12TensorFormat","torch_tensorrt::Input::Input::max_shape"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input::max_shape"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEENSt6vectorI7int64_tEENSt6vectorI7int64_tEE12TensorFormat","torch_tensorrt::Input::Input::max_shape"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEENSt6vectorI7int64_tEENSt6vectorI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input::max_shape"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEE12TensorFormat","torch_tensorrt::Input::Input::min_shape"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input::min_shape"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEENSt6vectorI7int64_tEENSt6vectorI7int64_tEE12TensorFormat","torch_tensorrt::Input::Input::min_shape"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEENSt6vectorI7int64_tEENSt6vectorI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input::min_shape"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEE12TensorFormat","torch_tensorrt::Input::Input::opt_shape"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEEN3c108ArrayRefI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input::opt_shape"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEENSt6vectorI7int64_tEENSt6vectorI7int64_tEE12TensorFormat","torch_tensorrt::Input::Input::opt_shape"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEENSt6vectorI7int64_tEENSt6vectorI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input::opt_shape"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputEN3c108ArrayRefI7int64_tEE12TensorFormat","torch_tensorrt::Input::Input::shape"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputEN3c108ArrayRefI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input::shape"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEE12TensorFormat","torch_tensorrt::Input::Input::shape"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputENSt6vectorI7int64_tEE8DataType12TensorFormat","torch_tensorrt::Input::Input::shape"],[52,3,1,"_CPPv4N14torch_tensorrt5Input5InputEN2at6TensorE","torch_tensorrt::Input::Input::tensor"],[52,6,1,"_CPPv4N14torch_tensorrt5Input5dtypeE","torch_tensorrt::Input::dtype"],[52,6,1,"_CPPv4N14torch_tensorrt5Input6formatE","torch_tensorrt::Input::format"],[52,6,1,"_CPPv4N14torch_tensorrt5Input9max_shapeE","torch_tensorrt::Input::max_shape"],[52,6,1,"_CPPv4N14torch_tensorrt5Input9min_shapeE","torch_tensorrt::Input::min_shape"],[52,6,1,"_CPPv4N14torch_tensorrt5Input9opt_shapeE","torch_tensorrt::Input::opt_shape"],[52,6,1,"_CPPv4N14torch_tensorrt5Input5shapeE","torch_tensorrt::Input::shape"],[3,1,1,"_CPPv4N14torch_tensorrt12TensorFormatE","torch_tensorrt::TensorFormat"],[3,2,1,"_CPPv4N14torch_tensorrt12TensorFormat12TensorFormatE5Value","torch_tensorrt::TensorFormat::TensorFormat"],[3,2,1,"_CPPv4N14torch_tensorrt12TensorFormat12TensorFormatEN2at12MemoryFormatE","torch_tensorrt::TensorFormat::TensorFormat"],[3,2,1,"_CPPv4N14torch_tensorrt12TensorFormat12TensorFormatEv","torch_tensorrt::TensorFormat::TensorFormat"],[3,3,1,"_CPPv4N14torch_tensorrt12TensorFormat12TensorFormatE5Value","torch_tensorrt::TensorFormat::TensorFormat::t"],[3,3,1,"_CPPv4N14torch_tensorrt12TensorFormat12TensorFormatEN2at12MemoryFormatE","torch_tensorrt::TensorFormat::TensorFormat::t"],[3,4,1,"_CPPv4N14torch_tensorrt12TensorFormat5ValueE","torch_tensorrt::TensorFormat::Value"],[3,5,1,"_CPPv4N14torch_tensorrt12TensorFormat5Value13kChannelsLastE","torch_tensorrt::TensorFormat::Value::kChannelsLast"],[3,5,1,"_CPPv4N14torch_tensorrt12TensorFormat5Value11kContiguousE","torch_tensorrt::TensorFormat::Value::kContiguous"],[3,5,1,"_CPPv4N14torch_tensorrt12TensorFormat5Value8kUnknownE","torch_tensorrt::TensorFormat::Value::kUnknown"],[3,2,1,"_CPPv4NK14torch_tensorrt12TensorFormatcv5ValueEv","torch_tensorrt::TensorFormat::operator Value"],[3,2,1,"_CPPv4N14torch_tensorrt12TensorFormatcvbEv","torch_tensorrt::TensorFormat::operator bool"],[3,2,1,"_CPPv4NK14torch_tensorrt12TensorFormatneE12TensorFormat","torch_tensorrt::TensorFormat::operator!="],[3,2,1,"_CPPv4NK14torch_tensorrt12TensorFormatneEN12TensorFormat5ValueE","torch_tensorrt::TensorFormat::operator!="],[3,3,1,"_CPPv4NK14torch_tensorrt12TensorFormatneE12TensorFormat","torch_tensorrt::TensorFormat::operator!=::other"],[3,3,1,"_CPPv4NK14torch_tensorrt12TensorFormatneEN12TensorFormat5ValueE","torch_tensorrt::TensorFormat::operator!=::other"],[3,2,1,"_CPPv4NK14torch_tensorrt12TensorFormateqE12TensorFormat","torch_tensorrt::TensorFormat::operator=="],[3,2,1,"_CPPv4NK14torch_tensorrt12TensorFormateqEN12TensorFormat5ValueE","torch_tensorrt::TensorFormat::operator=="],[3,3,1,"_CPPv4NK14torch_tensorrt12TensorFormateqE12TensorFormat","torch_tensorrt::TensorFormat::operator==::other"],[3,3,1,"_CPPv4NK14torch_tensorrt12TensorFormateqEN12TensorFormat5ValueE","torch_tensorrt::TensorFormat::operator==::other"],[40,2,1,"_CPPv4N14torch_tensorrt15dump_build_infoEv","torch_tensorrt::dump_build_info"],[38,2,1,"_CPPv4N14torch_tensorrt14get_build_infoEv","torch_tensorrt::get_build_info"],[17,4,1,"_CPPv4N14torch_tensorrt7logging5LevelE","torch_tensorrt::logging::Level"],[17,5,1,"_CPPv4N14torch_tensorrt7logging5Level6kDEBUGE","torch_tensorrt::logging::Level::kDEBUG"],[17,5,1,"_CPPv4N14torch_tensorrt7logging5Level6kERRORE","torch_tensorrt::logging::Level::kERROR"],[17,5,1,"_CPPv4N14torch_tensorrt7logging5Level6kGRAPHE","torch_tensorrt::logging::Level::kGRAPH"],[17,5,1,"_CPPv4N14torch_tensorrt7logging5Level5kINFOE","torch_tensorrt::logging::Level::kINFO"],[17,5,1,"_CPPv4N14torch_tensorrt7logging5Level15kINTERNAL_ERRORE","torch_tensorrt::logging::Level::kINTERNAL_ERROR"],[17,5,1,"_CPPv4N14torch_tensorrt7logging5Level8kWARNINGE","torch_tensorrt::logging::Level::kWARNING"],[26,2,1,"_CPPv4N14torch_tensorrt7logging24get_is_colored_output_onEv","torch_tensorrt::logging::get_is_colored_output_on"],[24,2,1,"_CPPv4N14torch_tensorrt7logging18get_logging_prefixEv","torch_tensorrt::logging::get_logging_prefix"],[25,2,1,"_CPPv4N14torch_tensorrt7logging24get_reportable_log_levelEv","torch_tensorrt::logging::get_reportable_log_level"],[28,2,1,"_CPPv4N14torch_tensorrt7logging3logE5LevelNSt6stringE","torch_tensorrt::logging::log"],[28,3,1,"_CPPv4N14torch_tensorrt7logging3logE5LevelNSt6stringE","torch_tensorrt::logging::log::lvl"],[28,3,1,"_CPPv4N14torch_tensorrt7logging3logE5LevelNSt6stringE","torch_tensorrt::logging::log::msg"],[29,2,1,"_CPPv4N14torch_tensorrt7logging24set_is_colored_output_onEb","torch_tensorrt::logging::set_is_colored_output_on"],[29,3,1,"_CPPv4N14torch_tensorrt7logging24set_is_colored_output_onEb","torch_tensorrt::logging::set_is_colored_output_on::colored_output_on"],[30,2,1,"_CPPv4N14torch_tensorrt7logging18set_logging_prefixENSt6stringE","torch_tensorrt::logging::set_logging_prefix"],[30,3,1,"_CPPv4N14torch_tensorrt7logging18set_logging_prefixENSt6stringE","torch_tensorrt::logging::set_logging_prefix::prefix"],[27,2,1,"_CPPv4N14torch_tensorrt7logging24set_reportable_log_levelE5Level","torch_tensorrt::logging::set_reportable_log_level"],[27,3,1,"_CPPv4N14torch_tensorrt7logging24set_reportable_log_levelE5Level","torch_tensorrt::logging::set_reportable_log_level::lvl"],[4,1,1,"_CPPv4I0EN14torch_tensorrt3ptq19Int8CacheCalibratorE","torch_tensorrt::ptq::Int8CacheCalibrator"],[4,7,1,"_CPPv4I0EN14torch_tensorrt3ptq19Int8CacheCalibratorE","torch_tensorrt::ptq::Int8CacheCalibrator::Algorithm"],[4,2,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator19Int8CacheCalibratorERKNSt6stringE","torch_tensorrt::ptq::Int8CacheCalibrator::Int8CacheCalibrator"],[4,3,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator19Int8CacheCalibratorERKNSt6stringE","torch_tensorrt::ptq::Int8CacheCalibrator::Int8CacheCalibrator::cache_file_path"],[4,2,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator8getBatchEA_PvA_PKci","torch_tensorrt::ptq::Int8CacheCalibrator::getBatch"],[4,3,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator8getBatchEA_PvA_PKci","torch_tensorrt::ptq::Int8CacheCalibrator::getBatch::bindings"],[4,3,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator8getBatchEA_PvA_PKci","torch_tensorrt::ptq::Int8CacheCalibrator::getBatch::names"],[4,3,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator8getBatchEA_PvA_PKci","torch_tensorrt::ptq::Int8CacheCalibrator::getBatch::nbBindings"],[4,2,1,"_CPPv4NK14torch_tensorrt3ptq19Int8CacheCalibrator12getBatchSizeEv","torch_tensorrt::ptq::Int8CacheCalibrator::getBatchSize"],[4,2,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibratorcvPN8nvinfer115IInt8CalibratorEEv","torch_tensorrt::ptq::Int8CacheCalibrator::operator nvinfer1::IInt8Calibrator*"],[4,2,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator20readCalibrationCacheER6size_t","torch_tensorrt::ptq::Int8CacheCalibrator::readCalibrationCache"],[4,3,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator20readCalibrationCacheER6size_t","torch_tensorrt::ptq::Int8CacheCalibrator::readCalibrationCache::length"],[4,2,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator21writeCalibrationCacheEPKv6size_t","torch_tensorrt::ptq::Int8CacheCalibrator::writeCalibrationCache"],[4,3,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator21writeCalibrationCacheEPKv6size_t","torch_tensorrt::ptq::Int8CacheCalibrator::writeCalibrationCache::cache"],[4,3,1,"_CPPv4N14torch_tensorrt3ptq19Int8CacheCalibrator21writeCalibrationCacheEPKv6size_t","torch_tensorrt::ptq::Int8CacheCalibrator::writeCalibrationCache::length"],[5,1,1,"_CPPv4I00EN14torch_tensorrt3ptq14Int8CalibratorE","torch_tensorrt::ptq::Int8Calibrator"],[5,7,1,"_CPPv4I00EN14torch_tensorrt3ptq14Int8CalibratorE","torch_tensorrt::ptq::Int8Calibrator::Algorithm"],[5,7,1,"_CPPv4I00EN14torch_tensorrt3ptq14Int8CalibratorE","torch_tensorrt::ptq::Int8Calibrator::DataLoaderUniquePtr"],[5,2,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator14Int8CalibratorE19DataLoaderUniquePtrRKNSt6stringEb","torch_tensorrt::ptq::Int8Calibrator::Int8Calibrator"],[5,3,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator14Int8CalibratorE19DataLoaderUniquePtrRKNSt6stringEb","torch_tensorrt::ptq::Int8Calibrator::Int8Calibrator::cache_file_path"],[5,3,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator14Int8CalibratorE19DataLoaderUniquePtrRKNSt6stringEb","torch_tensorrt::ptq::Int8Calibrator::Int8Calibrator::dataloader"],[5,3,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator14Int8CalibratorE19DataLoaderUniquePtrRKNSt6stringEb","torch_tensorrt::ptq::Int8Calibrator::Int8Calibrator::use_cache"],[5,2,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator8getBatchEA_PvA_PKci","torch_tensorrt::ptq::Int8Calibrator::getBatch"],[5,3,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator8getBatchEA_PvA_PKci","torch_tensorrt::ptq::Int8Calibrator::getBatch::bindings"],[5,3,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator8getBatchEA_PvA_PKci","torch_tensorrt::ptq::Int8Calibrator::getBatch::names"],[5,3,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator8getBatchEA_PvA_PKci","torch_tensorrt::ptq::Int8Calibrator::getBatch::nbBindings"],[5,2,1,"_CPPv4NK14torch_tensorrt3ptq14Int8Calibrator12getBatchSizeEv","torch_tensorrt::ptq::Int8Calibrator::getBatchSize"],[5,2,1,"_CPPv4N14torch_tensorrt3ptq14Int8CalibratorcvPN8nvinfer115IInt8CalibratorEEv","torch_tensorrt::ptq::Int8Calibrator::operator nvinfer1::IInt8Calibrator*"],[5,2,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator20readCalibrationCacheER6size_t","torch_tensorrt::ptq::Int8Calibrator::readCalibrationCache"],[5,3,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator20readCalibrationCacheER6size_t","torch_tensorrt::ptq::Int8Calibrator::readCalibrationCache::length"],[5,2,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator21writeCalibrationCacheEPKv6size_t","torch_tensorrt::ptq::Int8Calibrator::writeCalibrationCache"],[5,3,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator21writeCalibrationCacheEPKv6size_t","torch_tensorrt::ptq::Int8Calibrator::writeCalibrationCache::cache"],[5,3,1,"_CPPv4N14torch_tensorrt3ptq14Int8Calibrator21writeCalibrationCacheEPKv6size_t","torch_tensorrt::ptq::Int8Calibrator::writeCalibrationCache::length"],[31,2,1,"_CPPv4I0EN14torch_tensorrt3ptq26make_int8_cache_calibratorE19Int8CacheCalibratorI9AlgorithmERKNSt6stringE","torch_tensorrt::ptq::make_int8_cache_calibrator"],[34,2,1,"_CPPv4I0EN14torch_tensorrt3ptq26make_int8_cache_calibratorE19Int8CacheCalibratorI9AlgorithmERKNSt6stringE","torch_tensorrt::ptq::make_int8_cache_calibrator"],[31,7,1,"_CPPv4I0EN14torch_tensorrt3ptq26make_int8_cache_calibratorE19Int8CacheCalibratorI9AlgorithmERKNSt6stringE","torch_tensorrt::ptq::make_int8_cache_calibrator::Algorithm"],[34,7,1,"_CPPv4I0EN14torch_tensorrt3ptq26make_int8_cache_calibratorE19Int8CacheCalibratorI9AlgorithmERKNSt6stringE","torch_tensorrt::ptq::make_int8_cache_calibrator::Algorithm"],[31,3,1,"_CPPv4I0EN14torch_tensorrt3ptq26make_int8_cache_calibratorE19Int8CacheCalibratorI9AlgorithmERKNSt6stringE","torch_tensorrt::ptq::make_int8_cache_calibrator::cache_file_path"],[34,3,1,"_CPPv4I0EN14torch_tensorrt3ptq26make_int8_cache_calibratorE19Int8CacheCalibratorI9AlgorithmERKNSt6stringE","torch_tensorrt::ptq::make_int8_cache_calibrator::cache_file_path"],[32,2,1,"_CPPv4I00EN14torch_tensorrt3ptq20make_int8_calibratorE14Int8CalibratorI9Algorithm10DataLoaderE10DataLoaderRKNSt6stringEb","torch_tensorrt::ptq::make_int8_calibrator"],[33,2,1,"_CPPv4I00EN14torch_tensorrt3ptq20make_int8_calibratorE14Int8CalibratorI9Algorithm10DataLoaderE10DataLoaderRKNSt6stringEb","torch_tensorrt::ptq::make_int8_calibrator"],[32,7,1,"_CPPv4I00EN14torch_tensorrt3ptq20make_int8_calibratorE14Int8CalibratorI9Algorithm10DataLoaderE10DataLoaderRKNSt6stringEb","torch_tensorrt::ptq::make_int8_calibrator::Algorithm"],[33,7,1,"_CPPv4I00EN14torch_tensorrt3ptq20make_int8_calibratorE14Int8CalibratorI9Algorithm10DataLoaderE10DataLoaderRKNSt6stringEb","torch_tensorrt::ptq::make_int8_calibrator::Algorithm"],[32,7,1,"_CPPv4I00EN14torch_tensorrt3ptq20make_int8_calibratorE14Int8CalibratorI9Algorithm10DataLoaderE10DataLoaderRKNSt6stringEb","torch_tensorrt::ptq::make_int8_calibrator::DataLoader"],[33,7,1,"_CPPv4I00EN14torch_tensorrt3ptq20make_int8_calibratorE14Int8CalibratorI9Algorithm10DataLoaderE10DataLoaderRKNSt6stringEb","torch_tensorrt::ptq::make_int8_calibrator::DataLoader"],[32,3,1,"_CPPv4I00EN14torch_tensorrt3ptq20make_int8_calibratorE14Int8CalibratorI9Algorithm10DataLoaderE10DataLoaderRKNSt6stringEb","torch_tensorrt::ptq::make_int8_calibrator::cache_file_path"],[33,3,1,"_CPPv4I00EN14torch_tensorrt3ptq20make_int8_calibratorE14Int8CalibratorI9Algorithm10DataLoaderE10DataLoaderRKNSt6stringEb","torch_tensorrt::ptq::make_int8_calibrator::cache_file_path"],[32,3,1,"_CPPv4I00EN14torch_tensorrt3ptq20make_int8_calibratorE14Int8CalibratorI9Algorithm10DataLoaderE10DataLoaderRKNSt6stringEb","torch_tensorrt::ptq::make_int8_calibrator::dataloader"],[33,3,1,"_CPPv4I00EN14torch_tensorrt3ptq20make_int8_calibratorE14Int8CalibratorI9Algorithm10DataLoaderE10DataLoaderRKNSt6stringEb","torch_tensorrt::ptq::make_int8_calibrator::dataloader"],[32,3,1,"_CPPv4I00EN14torch_tensorrt3ptq20make_int8_calibratorE14Int8CalibratorI9Algorithm10DataLoaderE10DataLoaderRKNSt6stringEb","torch_tensorrt::ptq::make_int8_calibrator::use_cache"],[33,3,1,"_CPPv4I00EN14torch_tensorrt3ptq20make_int8_calibratorE14Int8CalibratorI9Algorithm10DataLoaderE10DataLoaderRKNSt6stringEb","torch_tensorrt::ptq::make_int8_calibrator::use_cache"],[39,2,1,"_CPPv4N14torch_tensorrt10set_deviceEKi","torch_tensorrt::set_device"],[39,3,1,"_CPPv4N14torch_tensorrt10set_deviceEKi","torch_tensorrt::set_device::gpu_id"],[53,1,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpecE","torch_tensorrt::torchscript::CompileSpec"],[53,2,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec11CompileSpecEN5torch3jit6IValueE","torch_tensorrt::torchscript::CompileSpec::CompileSpec"],[53,2,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec11CompileSpecENSt6vectorI5InputEE","torch_tensorrt::torchscript::CompileSpec::CompileSpec"],[53,2,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec11CompileSpecENSt6vectorIN3c108ArrayRefI7int64_tEEEE","torch_tensorrt::torchscript::CompileSpec::CompileSpec"],[53,2,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec11CompileSpecENSt6vectorINSt6vectorI7int64_tEEEE","torch_tensorrt::torchscript::CompileSpec::CompileSpec"],[53,3,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec11CompileSpecENSt6vectorIN3c108ArrayRefI7int64_tEEEE","torch_tensorrt::torchscript::CompileSpec::CompileSpec::fixed_sizes"],[53,3,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec11CompileSpecENSt6vectorINSt6vectorI7int64_tEEEE","torch_tensorrt::torchscript::CompileSpec::CompileSpec::fixed_sizes"],[53,3,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec11CompileSpecEN5torch3jit6IValueE","torch_tensorrt::torchscript::CompileSpec::CompileSpec::input_signature"],[53,3,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec11CompileSpecENSt6vectorI5InputEE","torch_tensorrt::torchscript::CompileSpec::CompileSpec::inputs"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec10capabilityE","torch_tensorrt::torchscript::CompileSpec::capability"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec5debugE","torch_tensorrt::torchscript::CompileSpec::debug"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec6deviceE","torch_tensorrt::torchscript::CompileSpec::device"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec12disable_tf32E","torch_tensorrt::torchscript::CompileSpec::disable_tf32"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec20dla_global_dram_sizeE","torch_tensorrt::torchscript::CompileSpec::dla_global_dram_size"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec19dla_local_dram_sizeE","torch_tensorrt::torchscript::CompileSpec::dla_local_dram_size"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec13dla_sram_sizeE","torch_tensorrt::torchscript::CompileSpec::dla_sram_size"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec18enabled_precisionsE","torch_tensorrt::torchscript::CompileSpec::enabled_precisions"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec12graph_inputsE","torch_tensorrt::torchscript::CompileSpec::graph_inputs"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec14min_block_sizeE","torch_tensorrt::torchscript::CompileSpec::min_block_size"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec20num_avg_timing_itersE","torch_tensorrt::torchscript::CompileSpec::num_avg_timing_iters"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec14ptq_calibratorE","torch_tensorrt::torchscript::CompileSpec::ptq_calibrator"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec5refitE","torch_tensorrt::torchscript::CompileSpec::refit"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec24require_full_compilationE","torch_tensorrt::torchscript::CompileSpec::require_full_compilation"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec14sparse_weightsE","torch_tensorrt::torchscript::CompileSpec::sparse_weights"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec22torch_executed_modulesE","torch_tensorrt::torchscript::CompileSpec::torch_executed_modules"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec18torch_executed_opsE","torch_tensorrt::torchscript::CompileSpec::torch_executed_ops"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec24truncate_long_and_doubleE","torch_tensorrt::torchscript::CompileSpec::truncate_long_and_double"],[53,6,1,"_CPPv4N14torch_tensorrt11torchscript11CompileSpec14workspace_sizeE","torch_tensorrt::torchscript::CompileSpec::workspace_size"],[35,2,1,"_CPPv4N14torch_tensorrt11torchscript29check_method_operator_supportERKN5torch3jit6ModuleENSt6stringE","torch_tensorrt::torchscript::check_method_operator_support"],[35,3,1,"_CPPv4N14torch_tensorrt11torchscript29check_method_operator_supportERKN5torch3jit6ModuleENSt6stringE","torch_tensorrt::torchscript::check_method_operator_support::method_name"],[35,3,1,"_CPPv4N14torch_tensorrt11torchscript29check_method_operator_supportERKN5torch3jit6ModuleENSt6stringE","torch_tensorrt::torchscript::check_method_operator_support::module"],[36,2,1,"_CPPv4N14torch_tensorrt11torchscript7compileERKN5torch3jit6ModuleE11CompileSpec","torch_tensorrt::torchscript::compile"],[36,3,1,"_CPPv4N14torch_tensorrt11torchscript7compileERKN5torch3jit6ModuleE11CompileSpec","torch_tensorrt::torchscript::compile::info"],[36,3,1,"_CPPv4N14torch_tensorrt11torchscript7compileERKN5torch3jit6ModuleE11CompileSpec","torch_tensorrt::torchscript::compile::module"],[41,2,1,"_CPPv4N14torch_tensorrt11torchscript28convert_method_to_trt_engineERKN5torch3jit6ModuleENSt6stringE11CompileSpec","torch_tensorrt::torchscript::convert_method_to_trt_engine"],[41,3,1,"_CPPv4N14torch_tensorrt11torchscript28convert_method_to_trt_engineERKN5torch3jit6ModuleENSt6stringE11CompileSpec","torch_tensorrt::torchscript::convert_method_to_trt_engine::info"],[41,3,1,"_CPPv4N14torch_tensorrt11torchscript28convert_method_to_trt_engineERKN5torch3jit6ModuleENSt6stringE11CompileSpec","torch_tensorrt::torchscript::convert_method_to_trt_engine::method_name"],[41,3,1,"_CPPv4N14torch_tensorrt11torchscript28convert_method_to_trt_engineERKN5torch3jit6ModuleENSt6stringE11CompileSpec","torch_tensorrt::torchscript::convert_method_to_trt_engine::module"],[37,2,1,"_CPPv4N14torch_tensorrt11torchscript26embed_engine_in_new_moduleERKNSt6stringE6Device","torch_tensorrt::torchscript::embed_engine_in_new_module"],[37,3,1,"_CPPv4N14torch_tensorrt11torchscript26embed_engine_in_new_moduleERKNSt6stringE6Device","torch_tensorrt::torchscript::embed_engine_in_new_module::device"],[37,3,1,"_CPPv4N14torch_tensorrt11torchscript26embed_engine_in_new_moduleERKNSt6stringE6Device","torch_tensorrt::torchscript::embed_engine_in_new_module::engine"],[83,8,0,"-","torch_tensorrt"]],"torch_tensorrt.Device":[[83,10,1,"","__init__"],[83,11,1,"","allow_gpu_fallback"],[83,11,1,"","device_type"],[83,11,1,"","dla_core"],[83,11,1,"","gpu_id"]],"torch_tensorrt.Input":[[83,10,1,"","__init__"],[83,11,1,"","dtype"],[83,11,1,"","format"],[83,11,1,"","shape"],[83,11,1,"","shape_mode"]],"torch_tensorrt.fx":[[80,9,1,"","InputTensorSpec"],[80,9,1,"","TRTInterpreter"],[80,9,1,"","TRTInterpreterResult"],[80,9,1,"","TRTModule"],[80,12,1,"","compile"]],"torch_tensorrt.logging":[[81,9,1,"","Level"],[81,9,1,"","debug"],[81,9,1,"","errors"],[81,12,1,"","get_is_colored_output_on"],[81,12,1,"","get_logging_prefix"],[81,12,1,"","get_reportable_log_level"],[81,9,1,"","graphs"],[81,9,1,"","info"],[81,9,1,"","internal_errors"],[81,12,1,"","log"],[81,12,1,"","set_is_colored_output_on"],[81,12,1,"","set_logging_prefix"],[81,12,1,"","set_reportable_log_level"],[81,9,1,"","warnings"]],"torch_tensorrt.logging.Level":[[81,11,1,"","Debug"],[81,11,1,"","Error"],[81,11,1,"","Graph"],[81,11,1,"","Info"],[81,11,1,"","InternalError"],[81,11,1,"","Warning"]],"torch_tensorrt.ptq":[[82,9,1,"id1","CacheCalibrator"],[82,9,1,"id2","CalibrationAlgo"],[82,9,1,"id0","DataLoaderCalibrator"],[82,12,1,"","get_batch"],[82,12,1,"","get_batch_size"],[82,12,1,"","get_cache_mode_batch"],[82,12,1,"","read_calibration_cache"],[82,12,1,"","write_calibration_cache"]],"torch_tensorrt.ptq.CacheCalibrator":[[82,10,1,"","__init__"]],"torch_tensorrt.ptq.CalibrationAlgo":[[82,11,1,"","ENTROPY_CALIBRATION"],[82,11,1,"","ENTROPY_CALIBRATION_2"],[82,11,1,"","LEGACY_CALIBRATION"],[82,11,1,"","MINMAX_CALIBRATION"]],"torch_tensorrt.ptq.DataLoaderCalibrator":[[82,10,1,"","__init__"]],"torch_tensorrt.ts":[[84,12,1,"","TensorRTCompileSpec"],[84,12,1,"","check_method_op_support"],[84,12,1,"","compile"],[84,12,1,"","convert_method_to_trt_engine"],[84,12,1,"","embed_engine_in_new_module"]],torch_tensorrt:[[83,9,1,"","Device"],[83,9,1,"","DeviceType"],[83,9,1,"","EngineCapability"],[83,9,1,"","Input"],[83,9,1,"","TensorFormat"],[83,12,1,"","compile"],[83,12,1,"","convert_method_to_trt_engine"],[83,9,1,"","dtype"],[83,12,1,"","dump_build_info"],[80,8,0,"-","fx"],[83,12,1,"","get_build_info"],[81,8,0,"-","logging"],[82,8,0,"-","ptq"],[83,12,1,"","set_device"],[84,8,0,"-","ts"]]},objnames:{"0":["c","macro","C macro"],"1":["cpp","class","C++ class"],"10":["py","method","Python method"],"11":["py","attribute","Python attribute"],"12":["py","function","Python function"],"2":["cpp","function","C++ function"],"3":["cpp","functionParam","C++ function parameter"],"4":["cpp","enum","C++ enum"],"5":["cpp","enumerator","C++ enumerator"],"6":["cpp","member","C++ member"],"7":["cpp","templateParam","C++ template parameter"],"8":["py","module","Python module"],"9":["py","class","Python class"]},objtypes:{"0":"c:macro","1":"cpp:class","10":"py:method","11":"py:attribute","12":"py:function","2":"cpp:function","3":"cpp:functionParam","4":"cpp:enum","5":"cpp:enumerator","6":"cpp:member","7":"cpp:templateParam","8":"py:module","9":"py:class"},terms:{"0":[37,47,48,49,53,57,58,59,60,61,62,63,64,65,71,73,74,77,79,80,81,82,83,84,85,87,88,95,97,99,100,101],"00":[57,58,60,61,62,63,64],"0000":89,"00000000":[57,58,60,61,62],"000000037777":63,"000000252219":63,"000000397133":63,"000007":59,"000014":57,"000015":59,"000059":59,"000106":57,"000116":57,"000368":57,"000545":57,"000820":57,"000973":57,"001256":57,"001260":57,"001270":57,"001351":57,"0018":64,"002":60,"002251":59,"002259":59,"0023":64,"002305":59,"0026":64,"003287":59,"003289":59,"003317":59,"003462":57,"003774":57,"004":58,"004128":57,"004205":59,"004206":59,"004256":59,"004825":57,"005":[60,61],"006":[58,61],"006661":57,"006677":59,"006693":59,"006733":57,"006846":57,"006943":59,"0070":64,"008":64,"008071":57,"008453":57,"0087":64,"009802":57,"009803":57,"009836":57,"00f1b6db":[58,60,61],"01":[58,60,61,62,63,64,74,79,89],"0106":64,"010961":57,"011388":57,"013":64,"0151":64,"016114":57,"0163":64,"0169":64,"018642":57,"018643":57,"018670":57,"02":[58,60,61,64],"0208":74,"020804":57,"021143":57,"0220":64,"024492":57,"025":64,"025000":64,"0263":64,"028":64,"0296":64,"03":[57,89],"03291":64,"033488":57,"033572":57,"03466":64,"035722":57,"0358":74,"0383":74,"04":[57,58,63,64,74,99],"0435":74,"04609":64,"0464":74,"04743":64,"04807":64,"0491":64,"0493":64,"04it":64,"05":[57,58,59,60,61,63,64],"050000":64,"0505":64,"05080":64,"0530":74,"05311":64,"05374":64,"057":64,"058047":57,"058053":57,"058375":57,"05945":64,"06":[57,58,63],"0622":64,"063":64,"06340":64,"06567":64,"0676ba61":[60,63],"0678":74,"069":64,"07":[58,60,61],"071":64,"071428":57,"072057":57,"07266":64,"076796":57,"08":[58,60,61],"0805":74,"0818":74,"08331":64,"08555":64,"086":64,"09":[58,60,61,62],"0932":74,"096":64,"0a0":[57,58],"0a3":57,"0f":63,"0mib":[58,60,61,62],"0rc1":57,"0s":60,"0x":59,"0x7f6a8d162db0":84,"0x7f6e45a087f0":[],"0x7fd2aacaebb0":[],"1":[4,5,37,47,48,49,52,53,57,58,59,60,61,62,63,64,65,67,68,70,73,74,75,77,79,80,81,82,83,84,85,86,88,89,92,94,95,96,97,100,101],"10":[53,57,58,59,60,61,62,63,64,74,77,84,92,94,96,97,99],"100":[58,60,61,62,63,64,80,95],"1000":[58,60,61,62,63,64,99],"10000":[58,60,61],"100000":64,"10018":64,"10070":64,"101":59,"101168":64,"1012":67,"1013":67,"10130":64,"102":57,"102248":64,"1024":[57,58,60,61,62,63,64,65,83,84,96],"10240mib":62,"10362":58,"104":[58,60,61],"1045":74,"1048576":[49,53,84],"105":64,"1056":74,"1063":74,"1065":57,"1069":57,"107":[58,60,61],"107194":64,"10732":64,"1073741824":[49,53,84],"107625":64,"109":74,"10990":64,"10b0":57,"11":[57,58,59,60,61,62,63,64,67,74,77,88,92,99],"110":[63,64],"11299":64,"112mib":57,"11499":64,"115":62,"115269":64,"115740":64,"11594":64,"117":[58,60,61],"117969":64,"118358":64,"11879":64,"11888":64,"119":94,"1190":57,"119708":57,"11k":[58,60,61],"11w":58,"12":[57,58,59,60,61,62,63,64,67,74,88,92,94,99],"120":[62,64,74,94],"120097":57,"1201":57,"121":[60,62],"1216":59,"121618":57,"122":62,"12288mib":57,"123":[63,89],"12345":57,"126":64,"126382":64,"126834":64,"127":[58,64],"128":[57,58,59,60,61,62,63,64],"128674":64,"129":94,"129518":64,"12k":60,"13":[57,59,60,61,62,63,64,88,92],"130":57,"133":58,"13388":64,"135453":64,"135936":64,"136":99,"137":[57,94],"137858":64,"138":94,"138366":64,"139704147265344":64,"13x":58,"14":[57,58,59,60,61,62,63,64,92,99],"1409":97,"141":64,"143":57,"145":64,"145539":64,"146":57,"146053":64,"147871":64,"148353":64,"1488":57,"149":57,"14x":59,"15":[57,59,60,61,62,63,64,88,92],"1500":64,"1502":74,"1516":57,"1531":64,"1535566590":[58,60,61],"1538":57,"154252":64,"154685":64,"1549":[61,74],"1552":61,"1556":97,"1560":61,"1563":64,"156558":64,"1566":61,"1568":61,"157159":64,"1572":61,"1574":61,"1575":61,"1598":61,"15w":60,"15x":59,"16":[57,59,60,61,62,63,64,74,75,83,92,94],"16000":57,"163197":64,"163676":64,"164":[58,60,61],"165":63,"165549":64,"165991":64,"166":63,"167":63,"1691":74,"17":[57,58,59,60,61,62,63,64,92],"173":64,"173305":64,"173926":64,"176034":64,"176697":64,"1771":59,"1776":59,"1777":[57,64],"179":63,"1792":57,"18":[57,58,59,60,61,62,63,64,74,92],"182843":64,"183426":64,"185377":64,"185962":64,"188":64,"19":[57,59,60,63,64,89,92],"1906":64,"191966":64,"192424":64,"194325":64,"194817":64,"1971":64,"198":57,"1994":[64,97],"1d":67,"1e":[60,61,64,65],"1f":[57,59],"1rc0":57,"1ubuntu0":57,"1x1":63,"2":[37,47,57,58,59,60,61,62,63,64,68,73,74,77,79,81,82,83,84,86,88,89,92,94,95,97],"20":[57,58,59,60,61,63,64,92],"200":[58,60,61,62,64],"2000000000":[57,59],"2002":64,"2009":97,"200w":61,"201":[58,60,61],"2010":[64,97],"2012":89,"2014":97,"2017":[57,59,63],"2018":[58,59,60,61],"2019":[57,58,59,60,62,63],"201988":64,"202":[58,60,61],"2020":[61,63,74,78],"2021":[57,59],"2022":[57,58,59,60,61,62,63],"2023":[64,97],"202665":64,"204763":64,"2048":[60,61,80,95],"205461":64,"20w":62,"21":[57,58,59,60,61,62,63,64],"211393":64,"211987":64,"213899":64,"214450":64,"215434":57,"215446":57,"215806":57,"216":58,"217":[60,61],"218":57,"22":[57,58,59,60,61,62,63,64,99],"220892":64,"221533":64,"222":60,"223":[60,61],"223519":64,"224":[58,60,61,68,80,83,84,96,99],"224037":64,"225":[58,60,61,80,99],"227":[58,60,61],"227739155292511":58,"229":[58,60,61,99],"23":[53,57,58,60,61,64,67,84,89],"2305":64,"23344755172729492":58,"233809":64,"234":64,"234375":99,"234434":64,"235":57,"237":64,"238":[61,64],"238212":64,"239042":64,"24":[57,60,62,63,64,67],"241022":64,"24112":[58,60,61],"241654":64,"242":57,"243":[60,62],"244":[83,84],"245":63,"2453mib":57,"24576mib":[58,60],"246":58,"2462mib":57,"246kb":58,"247820":64,"248":67,"248445":64,"249":67,"24k":[58,60,61],"25":[57,60,61,64,74,80,95],"250366":64,"250959":64,"250w":57,"254":64,"256":[58,60,61,64,99],"257248":64,"257854":64,"258":88,"259968":64,"26":[57,59,60,61,63],"2606":[58,60,61],"260660":64,"265":57,"268160":64,"26w":57,"27":[57,58,59,62,64,74],"272":57,"28":[57,58,61,74],"280":64,"2802":74,"282":57,"2822":88,"285":64,"287":88,"288":[57,64],"28c":58,"29":[57,58,61,64,74],"291":64,"29c":60,"2c3":89,"2c365_subsampl":[58,60,61],"2c916ef":57,"2f":[58,60,61,62,63,64],"2s":60,"2x":60,"3":[49,53,57,58,59,60,61,62,63,64,65,67,68,70,74,77,79,81,82,83,84,88,89,92,94,95,96,97,100,101],"30":[58,60,61,63,64],"300":[62,63,64,65,100],"300x300":63,"302":64,"309":64,"3090":[58,60],"31":[57,60,61,62,63,74],"311":64,"314":64,"315":57,"32":[57,58,59,61,62,63,64,65,74,75,83,94,97,101],"320":97,"3207":64,"320w":62,"321":58,"329273":64,"32bit":65,"32x32":60,"33":[58,60,61,62,63,74],"330212":64,"332529":64,"333365":64,"33554432":[80,95],"3393":58,"339547":64,"34":[58,60,61,62,63,64],"340248":64,"342257":64,"342890":64,"345":64,"346":74,"349":57,"35":[58,60,63,74],"350619":64,"350w":[58,60],"351372":64,"352":[58,60,61],"353470":64,"35363":[58,60,61],"353k":[58,60,61],"354121":64,"3550":64,"35k":[58,60,61],"35x":58,"36":[57,58,61,74],"360090":64,"360806":64,"361413":[58,60,61],"362803":64,"3631":64,"363274":64,"366":60,"366kb":60,"3677":67,"37":[57,58,60,61,64,74],"370369":64,"371057":64,"373071":64,"373766":64,"376":58,"3763":64,"379890":64,"38":[57,60,61,63,94],"380538":64,"382532":64,"383128":64,"385":64,"3877":64,"389077":64,"389760":64,"39":[57,58,59,60,61,62,63,64,94],"3909":57,"391815":64,"392399":64,"394":64,"39485082030296326":60,"395":64,"3987298309803009":58,"399809":64,"39c":57,"39mib":57,"3d":95,"3ef7909e2":[],"3f":64,"3x3":64,"4":[57,58,59,60,61,62,63,64,70,74,77,79,81,86,88,89,92,95],"40":[58,60,61,62,63,64],"400":[62,64],"400472":64,"402399":64,"402939":64,"406":[58,60,61,99],"408818":64,"409424":64,"4096":64,"40mb":60,"41":[57,60,61,62],"411513":64,"4116":61,"412097":64,"4122":61,"4123":61,"4142":61,"4156":61,"4161":57,"4166":61,"4170":61,"4172":61,"4176":61,"4178":61,"418537":64,"419128":64,"42":[57,61,62,63,64],"421343":64,"421946":64,"429":57,"429382":64,"429688":99,"42c":62,"42w":57,"43":[57,62,63,64],"430156":64,"432259":64,"433079":64,"4352":64,"439":64,"439297":64,"44":[57,63,64],"440027":64,"442":[58,60,61,64],"442149":64,"442826":64,"442k":[58,60,61],"443":[58,60,61],"4465":[64,97],"449377":64,"449968":64,"45":[57,58,63],"452122":64,"452718":[58,60,61],"452754":64,"456":[58,60,61,99],"45675724744796753":61,"4584":58,"459":64,"46":[57,58,63,64],"462532":64,"463295":64,"466963":64,"467725":64,"468750":99,"469692":64,"47":57,"470":[61,64],"4700":[58,60,61],"470336":64,"4726":64,"474":58,"476204":64,"4767":61,"476738":64,"47681mib":61,"478809":64,"479375":64,"48":[57,60,61],"481":60,"4822":[64,97],"484":64,"485":[58,60,61,99],"485666":64,"486219":64,"488416":64,"488986":64,"489":61,"49":[57,59,63],"4914":[64,97],"4935":61,"49785590171813965":60,"49788108468055725":61,"4980":61,"499":64,"4fef":[58,60,61],"4mib":57,"4s":58,"4x":57,"5":[57,58,59,60,61,62,63,64,65,70,71,74,77,81,83,88,89,92,94,95,99],"50":[57,58,59,61,62,63,64,96],"500":[62,64],"5002":61,"5005":61,"5014":61,"5016":61,"5018":61,"5020":61,"5024":61,"5026":61,"5027":61,"5033":61,"504":64,"5052":61,"5067":61,"5088":61,"5091":61,"5094":61,"5096":61,"510":[57,58,60,62],"5100":61,"511":64,"5110":61,"5115":61,"5117":64,"5118":61,"512":[57,60,61,64,65,83,84,96],"512364":64,"513354":64,"514046":64,"514638":64,"515270":64,"5153":61,"515859":64,"516441":64,"517009":64,"5172":64,"517600":64,"518167":64,"518752":64,"519333":64,"5197":61,"519911":64,"51c":61,"52":[58,60,61,64],"5202":61,"520473":64,"5207":61,"521038":64,"5215":61,"521596":64,"522170":64,"522742":64,"5231":61,"523360":64,"523438":99,"523957":64,"5242":61,"524581":64,"525059":64,"525366":64,"525675":64,"525962":64,"526257":64,"526566":64,"526885":64,"527188":64,"527489":64,"527792":64,"528097":64,"528387":64,"528834":64,"529163":64,"53":[57,60,63,89],"5320":64,"532748":64,"533468":64,"5335":64,"534033":64,"534684":64,"535320":64,"535983":64,"536":64,"536569":64,"536870912":[49,53,84],"537248":64,"537833":64,"538480":64,"539":74,"539074":64,"539724":64,"53k":[58,60,61],"540307":64,"540952":64,"541534":64,"542075":64,"542596":64,"543248":64,"543719":64,"544424":64,"544952":64,"545530":64,"546114":64,"546713":64,"547292":64,"547902":64,"548453":64,"549015":64,"549665":64,"55":61,"550436":64,"551":57,"551925":64,"553105":64,"55c":57,"55k":[58,60,61],"56":[57,58,61,62,74],"560":64,"5620":64,"564":64,"5676":64,"568":64,"57":[61,64],"5746":64,"576":[62,74],"58":[60,61,64],"59":[57,60,61,62,63],"594":57,"597":59,"599":59,"5d":64,"5f":64,"6":[57,58,59,60,61,62,64,67,70,74,77,79,92,94],"60":[58,60,61,63],"600":[62,64],"6047":57,"608":61,"608kb":61,"61":[63,64],"613":64,"62":[57,58,64],"622":[64,67],"62w":61,"62x":59,"63":[57,59,61],"630":[58,60,61],"635":64,"636":64,"637":64,"638":64,"639":64,"64":[59,60,61,64,75,95],"640":64,"641":64,"642":64,"643":64,"644":64,"6442285180091858":61,"6445754766464233":60,"646":64,"649":64,"64bit":65,"65":[57,58,60,61,64],"6539":64,"655":64,"66":58,"664062":99,"668":57,"669":57,"67":[61,64],"6733":64,"677":64,"67mib":57,"68":[60,64],"6812":[58,60,61],"687":64,"688":64,"689":64,"69":[60,61],"690":64,"6f":[57,59],"6s":61,"7":[57,58,59,60,61,62,64,70,71,74,92],"70":[58,60,61,63],"700":[62,64],"701":64,"709":57,"7099":64,"71":[58,61,64],"716":64,"72":[58,60],"7203":64,"72048":77,"721":64,"724":64,"728":57,"729":57,"73":[57,58,60,61],"7302":89,"732":64,"735":64,"7376":64,"738":64,"74":[63,64],"742":64,"7454":64,"75":[58,60,61,64],"7537":64,"76":64,"781":64,"79":[60,64],"796":64,"797":64,"7ubuntu0":57,"8":[4,57,58,59,60,61,62,63,64,65,67,74,77,83,88,89,92,99],"80":[57,58,60,61,63,64],"800":[62,64],"8000":99,"8001":99,"8002":99,"801":64,"81":[63,64],"818":64,"82":64,"8204":64,"821":64,"83":[58,61,64],"834":64,"8351":64,"837":64,"84":[61,62,64,74,94],"847":64,"84e944ff11f8":[58,60,61],"84x":60,"85":[58,61,64],"86":[58,61],"860":64,"86k":[58,61],"87":64,"8732":63,"877":64,"8791":64,"88":[58,61,63],"89":[58,61],"898":64,"89k":[58,61],"8bit":64,"9":[57,58,59,60,61,62,63,64,74,92,99],"90":[58,60,61,63,99],"900":[62,64],"906":64,"90994":[58,61],"916":[57,64],"91a9cc5850784b2065e8a0aa3d526fd9":57,"92":[58,60,61,99],"9223372036854775807":79,"923":[58,60,61],"927":64,"92k":60,"9367":64,"94":[58,60,61],"941":64,"94328":60,"944":64,"948":64,"94k":[58,60,61],"95":58,"951":59,"952":64,"953":[57,64],"955":57,"959":64,"96":[57,64],"9624":64,"9695423245429993":58,"97":[58,64],"98":64,"9899807572364807":60,"9899841547012329":61,"99":[57,58,59,60,61,63,64],"997":64,"999":64,"9999":64,"99th_p":[57,59],"9ab0":[58,60,61],"9x":57,"abstract":[70,73,89],"boolean":[64,83,95],"break":[64,88,95],"byte":[57,83,84,96],"case":[1,2,3,50,53,59,62,63,66,70,73,77,95,97,98],"catch":[67,74],"char":[4,5,48,65,74],"class":[31,32,33,34,48,49,50,56,58,59,60,61,62,63,64,70,73,74,75,81,88,89,94,95,96,97],"const":[1,2,3,4,5,31,32,33,34,35,36,37,39,41,48,49,50,67,73,74,79,97],"default":[1,2,3,4,5,17,31,32,33,34,47,49,50,52,53,57,58,60,61,62,63,65,68,74,75,77,80,83,84,86,87,88,95,97,100],"do":[57,58,60,62,63,66,67,68,73,74,75,87,89,94,95,97,101],"enum":[1,2,3,46,49,50,56,58,81,84,97],"export":[57,64,77],"final":[57,66,69,71,77,96],"float":[53,57,58,60,62,63,65,74,75,79,83,94,97,100],"function":[1,2,3,4,5,50,52,53,56,57,58,59,60,62,63,64,67,68,70,73,74,77,94,95,96,97,99,100,101],"import":[57,58,59,60,61,62,63,64,65,67,68,74,75,77,86,88,94,95,98,99,100],"int":[1,4,5,39,48,49,53,58,61,64,65,74,79,80,83,84,86],"long":[53,59,65,66,88,89],"new":[1,2,3,4,5,36,37,50,52,53,58,60,62,63,64,70,71,73,74,81,84,88,95,99],"null":57,"public":[1,2,3,4,5,48,49,50,51,52,53,89,97],"return":[1,2,3,4,5,25,26,31,32,33,34,35,36,37,38,41,46,47,48,49,50,57,58,59,60,61,62,64,67,69,70,71,73,74,75,80,81,83,84,94,95,97,99],"short":[67,88,89],"static":[52,53,66,73,74,83,84,86],"super":[48,62,94],"throw":[65,67,74],"true":[1,2,3,5,50,53,57,58,59,60,61,62,63,64,67,68,73,74,79,80,83,84,86,89,95,97,99,100,101],"try":[57,58,59,60,62,71,74,88,89,100],"var":79,"void":[4,5,27,28,29,30,39,40,46,48,49],"while":[64,77,96,97,99],A:[5,31,32,33,34,36,37,51,52,57,58,59,60,61,62,64,67,68,73,77,80,84,89,95,97,99],AS:[57,58,59,60,61,62,63],And:74,As:[61,74,95],At:87,But:[74,88],By:[31,32,33,34,56,62,63,68,86,94],For:[58,60,62,63,64,66,68,74,77,80,86,88,89,94,95,96,97,98,99,100],IS:[57,58,59,60,61,62,63],If:[29,57,58,59,60,62,63,64,66,67,74,75,77,80,81,83,86,88,95,97,98,99,101],In:[1,2,3,50,57,58,59,60,61,62,63,64,66,69,70,71,73,75,77,78,88,89,91,95,96,97,98,99],Is:[26,83],It:[57,58,59,60,61,62,63,65,67,68,69,71,73,77,86,88,95,96],Its:[73,88],NOT:59,No:[58,60,61,62],Not:4,OF:[57,58,59,60,61,62,63],OR:[57,58,59,60,61,62,63],On:[57,58,60,61,62,68],One:[59,74,88,89,95,96],Or:88,THE:88,TO:74,That:88,Thats:74,The:[2,50,52,53,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,73,75,77,81,83,84,86,89,94,95,96,97,99,100],Then:[68,77,97,100],There:[5,59,63,64,66,71,73,77,89,94,95,96,97,98,99],These:[58,59,60,66,70,86,88,97,99],To:[2,50,61,62,63,64,65,68,74,75,77,86,94,99,100],Will:35,With:[58,59,60,61,74,86,88,97,99],_:[57,58,59,60,61,62,63,64,88,95],___torch_mangle_10:94,___torch_mangle_4847:70,___torch_mangle_5:94,___torch_mangle_9:94,__and__:79,__attribute__:47,__derive_index:79,__future__:57,__getitem__:79,__gnuc__:47,__init__:[62,82,83,88,94],__is__:79,__isnot__:79,__not__:79,__or__:79,__range_length:79,__round_to_zero_floordiv:79,__torch__:[70,74,94],__torch___pytorch_detection_ssd_src_model_ssd300_trt_engin:70,__torch___torchvision_models_resnet____torch_mangle_4847_resnet_trt_engin:70,__version__:64,__visibility__:47,__xor__:79,_affin:64,_all_:67,_b:57,_c:[84,100],_calibr:64,_convolut:[64,74,79],_devic:84,_input_quant:64,_jit_intern:57,_jit_to_backend:100,_pair:64,_quant:64,_script:84,_shapemod:83,_theme:93,_trace:57,_validate_not_a_forked_repo:[60,61,63,99],_weight_quant:64,a100:[57,58,59,60,62,63],a1b:89,aarch64:71,ab:79,abi:98,abil:61,abl:[58,59,60,61,62,63,66,67,73,78,95,97,100],about:[58,60,61,63,64,65,66,70,73,74,77,83,86,99],abov:[27,63,64,74,77,81,87,88,95],absl:57,absolut:[64,65],absolute_import:57,ac:91,acc:64,acc_mod:95,acc_norm:95,acc_op:95,acc_op_convert:95,acc_ops_sigmoid:95,acc_trac:95,acceler:[58,59,60,62,63,101],accept:[52,59,64,65,70,73,74,75,83],access:[61,63,67,73,74,78,86,95,100],accord:[73,84],accordingli:[64,86,95],account:99,accumsan:91,accumul:[53,84],accuraci:[63,64,96,97],achiev:[58,60,62,63,64,96],aco:79,acosh:79,acoust:[57,96],acquir:74,across:[53,65,67,84,86],acthardtanh:73,action:[88,95],activ:[64,74,84,88,95,96,97,101],activationtyp:[73,95],actual:[62,64,67,70,73,74,81,94,95],ad:[27,65,66,95],adaptive_avg_pool1d:79,adaptive_avg_pool2d:79,adaptive_avg_pool3d:79,adaptive_max_pool1d:79,adaptive_max_pool2d:79,adaptive_max_pool3d:79,adaptiveavgpool2d:[60,61],add:[28,66,67,68,73,74,75,77,79,81,86,88,93],add_:[67,74,79],add_activ:95,add_patch:63,addactiv:73,addit:[63,64,67,74,83,95,96],addlay:74,address:89,addshuffl:74,adipisc:[89,91],adjac:88,adjust:[64,88],adjust_lr:64,adopt:[59,96],advanc:[89,97],advis:88,aenean:91,affin:[60,61],afford:95,aforement:99,after:[61,63,64,65,66,67,68,74,75,76,78,94,95,98,99],again:[48,59,63,70,73,88],against:[65,74],agre:[57,58,59,60,61,62,63],agx:49,ahead:[61,74],aim:[59,67],aiohttp:57,aiosign:57,alabast:57,algo_typ:[82,97],algorithm:[4,5,31,32,33,34,48,59,82,95,97],algorithm_selector:95,alias:47,align:88,align_corn:79,aliquam:91,aliquet:[89,91],all:[17,46,47,48,49,53,57,58,59,60,61,62,63,64,65,67,68,70,74,75,76,77,81,83,88,89,94,95,96,97,98,99],alloc:73,allow:[52,53,58,60,62,63,65,66,67,83,86,95],allow_gpu_fallback:[49,50,83,84,97,100,101],allow_tf32:79,almost:74,alpha:[63,79,89,95],alreadi:[57,58,59,60,61,62,63,64,65,66,67,74,97],also:[31,34,58,59,60,61,62,63,66,73,74,75,77,78,86,88,89,96,97],alter:61,altern:[52,96],although:88,altogeth:[68,86],alwai:[4,5,29,65,88],amax:64,amax_sequeez:64,amazonaw:[58,60,61],amet:[89,91],amount:[59,64],amp:[58,60,61],amp_backend:57,an:[3,4,5,52,53,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,73,74,75,76,77,78,82,83,84,86,88,89,94,95,96,97,98,99],analogu:73,analysi:[63,68],analyt:86,analytics_id:86,ancient:88,ani:[52,57,58,59,60,61,62,63,65,66,73,74,75,77,79,83,86,88,95,97],ann:88,anneal:64,annot:[63,73,74],anonym:88,anoth:[59,75,88,89,94],ant:91,antlr4:57,anyon:89,anyth:[88,89,98],aot:[61,74,78],apach:[57,58,59,60,61,62,63],apex:63,api:[57,61,63,64,68,71,73,74,75,83,84,87,95,96,97,98,99,100],appdir:57,appear:88,append:[57,58,59,60,61,62,63,64,79],applehelp:57,appli:[64,97],applic:[2,31,34,50,57,58,59,60,61,62,63,65,67,71,74,75,98,100,101],approach:[58,60,62,63],apr:[57,74],apt:57,ar:[46,50,53,57,58,59,60,61,62,63,64,65,66,67,68,70,71,73,74,77,78,83,84,86,88,89,90,94,95,96,97,98,99,100],arab:89,arang:79,architectur:[59,63,64,77,78,96],archiv:[57,60,63,77],arcu:[89,91],area:90,aren:74,arg:[57,66,74,82,83,92,95,96],arg_replacement_tupl:95,argc:74,argmax:[58,59,60,61,79],argmin:79,argon2:[57,60,61,62,63],argpars:57,argument:[52,57,58,59,64,65,67,70,73,74,83,84,88,89,95],argv:74,around:[64,67,70,73,88,91,94],arrai:[4,5,37,57,59,66,84],arrayref:[49,52,53],arti:[58,60,61],artifact:76,arxiv:97,as_numpi:99,asin:79,asinh:79,aspect:65,asr:57,asr_model:57,assembl:[66,74],assign:[4,5,87],associ:[59,66,73,74],associatevalueandivalu:73,associatevalueandtensor:[73,74],assum:[57,64,100],ast:57,asttoken:[57,61,63],async:57,asyncio:[57,60,61,62,63],atan:79,atanh:79,aten:[53,63,64,67,68,72,73,74,79,84],atol:65,attach:63,attent:59,attention_mask:59,attention_masks_tensor:59,attr:[57,60,61,62,63],attrdict:[57,99],attribut:[67,68,70,74,88,95],auctor:91,audio:[57,96],audioread:57,augment:59,augu:91,auth:57,author:89,auto:[48,68,73,74,88,89,97,101],autodoc:[88,89],automat:[58,60,62,63,74,88],av:[60,61,62],avail:[58,60,61,62,63,65,73,77,86,95,101],averag:[53,58,60,61,62,63,64,65,84],avg:[58,63,64,65],avg_pool1d:79,avg_pool2d:79,avg_pool3d:79,avgpool:[60,61,63,64],avoid:[58,59,60,61],awai:88,await:[58,60,61],awaken:88,ax:[58,60,61,63],axi:[58,60,61,64,79],b0:[60,96],b:[60,61,63,76,77,79,89,99],b_hh:79,b_ih:79,babel:57,back:[67,68,70,71,74,83,88,94],back_insert:48,backbon:[59,63],backcal:[57,60,61,62,63],backend:[57,58,59,60,61,62,63,64,84,87,100],background:[88,94],backlink:88,backport:57,backward:[64,95],bar:[86,88],base:[40,54,55,58,59,60,62,63,64,70,77,81,82,83,88,94,96,97],basebal:59,baselin:[61,64],bash:77,basi:[57,58,59,60,61,62,63,88],basic:[64,65,89,95,99],batch:[4,5,48,57,58,59,60,61,62,63,64,80,95,97,99,101],batch_norm:[73,79],batch_siz:[48,57,59,63,64,97],batched_attention_mask:59,batched_data_:48,batched_indexed_token:59,batched_segment_id:59,batchnorm2d:[60,61],batchnorm:[63,67],batchsiz:57,batchtyp:48,bathroom:88,bazel:[71,77],bazel_vers:77,bazelbuild:77,bazelisk:77,bazelvers:77,bbox:63,bdist_wheel:77,beat:89,beautifulsoup4:[57,61],becaus:[59,73,74,77,80,94,95],becom:[59,73],bee:88,been:[66,73,74,89],befor:[53,61,63,64,67,71,73,74,77,78,84,95,99],beforehand:74,begin:[48,59,77,88,95],beginn:94,begun:88,behav:[63,90],behavior:[53,63,83,84,95],behaviour:[57,58,59,60,61,62,63],behind:88,being:[58,60,62,63,74,95],belong:88,below:[59,63,73,74,77,88,95,99],benchmark:[58,59,60,62,79],benefit:[73,74],bertformaskedlm:59,bertforpretrain:59,bertforsequenceclassif:59,berttoken:59,besid:88,best:[58,60,61,62,63,77,88,95],best_result:63,best_results_per_input:63,best_results_per_input_trt:63,beta:[79,84,95],better:[58,60,62,63,94,96],between:[63,67,73,77,88,89,97],bfe5ad2:58,bia:[59,60,61,62,64,67,74,79],bibendum:91,bibliograph:89,bibtex:57,bidirect:59,bigger:88,bin:77,binari:[48,97],binary_data:99,bind:[4,5,37,48,57,60,61,62,63,84,88],bird:[58,60,61,64,99],bit:[53,59,73,74,83,84,95],bitbucket:86,bitbucket_url:86,bitwise_not:79,black:[57,63],blandit:91,blank:88,bleach:[57,60,61,62,63],blob:[72,86,97],block0:67,block1:67,block:[65,66,67,92],blue:88,bmm:79,bn1:[60,61],bn2:[60,61],bn3:[60,61],bodi:[88,89],bold:88,bool:[1,2,3,4,5,26,29,32,33,35,46,48,49,50,53,67,73,74,79,80,81,83,84,86,97],border:88,bot:63,both:[58,60,62,63,77,86,88,94,97],boto3:57,botocor:57,bottleneck:[60,61],bottom:86,bound:[63,64],box:[63,88],braceexpand:57,bracket:88,branch:[59,77],bread:88,breed:[58,60,61],brief:68,briefli:94,broadli:59,broken:[57,58,59,60,61,62,63],brontosaurus:88,browser:88,bsd:[46,47,48,49],bu:[57,58,60,61,62],buffer:[4,5,95],bug:77,bui:89,build:[31,32,33,34,38,53,57,58,65,66,69,71,73,74,83,87,92,95,97],build_fil:77,build_model:95,buildcommandarg:76,builder:95,builderconfig:49,buildroot:76,built:[37,65,70,71,77,84],builtin:95,bust:[58,60,61],button:[86,88],bytearrai:95,c10:[1,2,49,50,52,53,74,97],c96b:61,c:[46,47,48,49,57,58,60,61,62,63,64,65,71,75,79,89,95,98,99,101],c_api:72,c_str:[73,74],ca6b:[58,60],cach:[4,5,31,32,33,34,48,57,60,61,63,64,65,74,80,82,95,97],cache_:48,cache_fil:[48,82,97],cache_file_path:[4,5,31,32,33,34,48],cache_file_path_:48,cache_size_:48,cachecalibr:[82,97],cachetool:57,cackl:89,cadenc:61,calcuat:64,calcul:[52,66,68,74],calendar:57,calib:64,calib_output:64,calibr:[4,5,31,32,33,34,48,53,64,65,74,82,84,97],calibrate_model:64,calibration_cache_fil:[31,32,33,34,97],calibration_dataload:[32,33,97],calibration_dataset:97,calibrationalgo:[82,97],call:[31,32,33,34,36,53,57,58,59,60,62,63,64,67,70,73,74,80,84,88,94,95,96,100],call_funct:95,callmethod:94,can:[1,2,5,31,32,33,34,41,50,51,52,53,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,73,74,75,77,83,84,86,88,94,95,96,97,98,99,100],canada:89,cannot:[52,62,63,64,67,68,77,83,84,87,94,95],canon:86,canonical_url:86,cap:[57,58,60,61,62],capabl:[18,49,53,65,70,83,84,100],capit:[59,88],caption:[88,91],captur:64,car:64,card:[58,59,60],cast:[4,5,67],cat:[64,77,79],caught:67,caus:[58,60,62,63,64,73,77,86],cd:[77,99],cdll:74,ceil:79,ceil_mod:[60,61,79],cell:[59,63,89],center:[58,59,60],centercrop:[58,60,61,99],cerr:74,certain:[57,77,95],certifi:[57,59],cffi:[57,60,61,62,63],cfg:68,chain:73,challeng:[64,99],chanc:73,chang:[31,34,58,59,60,61,62,63,67,71,84,86,95,97,99],changelog:92,channel:[3,58,60,61,64,83,87],channel_last:[61,83,84,96],channels_last:83,charact:88,charset:[57,59],check:[1,2,35,50,61,63,65,67,73,74,77,84,95,98,99],check_method_op_support:84,check_method_operator_support:[22,45,49,54,55],checkmethodoperatorsupport:74,checkpoint:[57,59,60,63,64],child:89,children:95,chimpansee_amber_r_1920x1080:[58,60,61],chimpanze:[58,60,61],choic:[59,77,82],choos:[58,60,94,95],ci:[57,58,60,61,62],cifar10:[64,97],cifar:[64,97],circular:64,ckpt:64,ckpt_path:64,cl:59,clamp:[64,79],clamp_max:79,clamp_min:79,class_count:99,class_pr:64,class_prob:64,classes_to_label:63,classif:[62,63,64,74,94,96],classifi:[62,64,89,96],classification_index:99,clean:88,clear:48,cli:[65,75],clib:57,click:[57,59,63,76],clickabl:88,client:[57,60,61,62,63],clone:79,close:[64,74],closer:67,closet:88,cloud:57,cloudfront:[58,60,61],cmake:76,cmake_build_typ:76,cmake_module_path:76,cmakecommandarg:76,cmakeset:76,cnn:96,co:[79,89,96],coco:63,cocodataset:63,code:[58,59,60,61,62,63,68,71,74,76,78,87,89,94,95,97],coeffici:96,collapse_navig:86,collat:89,collect:[57,58,60,62,63,64,74,84],collect_stat:64,colon:88,color:[26,29,81,88],colorama:57,colored_output_on:[29,46,81],column:89,com:[57,58,59,60,61,62,63,72,74,77,97,98,99],combin:95,come:[58,60,61,62,63,77,87,95,99],command:[65,74,77,88,89,94,99],comment:[77,88],commodo:91,common:[57,60,63,66,67,80,88,95],common_subexpression_elimin:67,commonli:89,commun:[53,65,74,76,84],compani:59,compar:[59,63,64,75,95],comparis:[1,3],comparison:[2,50],compat:[1,2,50,58,60,62,63,67,70,77,84,95],compil:[22,35,41,45,49,53,54,55,57,58,59,60,61,62,63,64,65,67,68,70,73,75,80,81,83,84,86,94,95,97,98,99,100,101],compile_set:57,compile_spec:[64,97,101],compilegraph:[74,97],compilesepc:37,compilespec:[4,5,22,36,41,45,49,54,55,68,74,97,101],compilespecstruct:[0,54],complet:[57,58,59,60,62,63,68,74,94],complex:[51,53,77,94],compli:63,complianc:[57,58,59,60,61,62,63,65],compliat:97,complic:77,compon:[59,62,69,71,94,98],compos:[58,60,61,62,63,64,94,95,97,99],composit:[64,74],compound:96,comprehens:63,compris:59,comput:[53,57,58,59,60,61,62,63,64,88,95,96,97],compute_amax:64,conceiv:88,concern:59,conclus:[57,58,59,60],concorr:99,conda:[57,58,59,60,61,62,63,64],condimentum:91,condit:[57,58,59,60,61,62,63,88],conduc:61,conduct:59,conf:[86,93],confid:[58,60,61,63],confidence_scor:99,config:[57,58,77,80,95,99],configur:[36,41,52,57,61,74,77,78,83,84,92,97,99],configurationtyp:76,confirm:57,conflict:[57,58,59,60,61,62,63],congu:91,connect:[58,60,61,67,84,88,99,101],consectetur:[89,91],consecut:68,consid:[61,74,84],consider:99,consist:[59,67,88,95],consol:65,consolid:94,constant:[61,64,66,67,74],constant_pad_nd:79,constexpr:[1,2,3,49,50],construct:[1,2,3,4,5,50,52,53,66,67,69,71,73,74,82,83,88,89,95,97],constructor:[1,3,50,52,53,70,94],consult:87,consum:[5,66,94],contact:89,contain:[32,33,35,57,58,59,60,61,62,63,65,66,67,73,74,77,80,83,88,89,94,95,97,98,99],content:[61,92,97,99],context:[58,62,64,66,69,70,71,81],contextnet:[57,96],contigu:[3,52,53,65,83,84],continu:[58,59,60,62,63,88,95,98],contributor:74,control:[62,63,94,95],conv1:[60,61,62,74,94],conv2:[60,61,62,74,94],conv2d:[60,61,62,64,94],conv3:[60,61],conv4_x:63,conv5_x:63,conv:[53,64,65,74],conv_asr:57,conval:91,convect:52,conveni:[63,96,97],convent:[58,59,60,62,63],converison:95,convers:[58,62,63,64,67,68,70,74,83,84,95],conversionctx:[73,74],convert:[4,5,35,36,41,57,58,60,61,62,63,64,65,67,68,69,71,75,78,83,84,96,98,100],convert_method_to_trt_engin:[22,45,49,54,55,83,84,100],convertgraphtotrtengin:74,convien:53,convienc:[4,5,53],convnet:63,convolut:[57,58,61,63,64,84,97,101],convtert:95,coordin:71,copi:[48,57,58,59,60,61,62,63,73,79,82,89,95,99],copy_:79,copyright:[46,47,48,49,57,58,59,60,61,62,63,74,89],core:[49,57,58,60,61,62,63,65,67,68,71,74,83,101],core_id:83,corpor:[46,47,48,49,57,58,59,60,61,62,63],corpu:96,correct:[64,70,77,86],correctli:77,correspond:[63,64,73,77,95],cosh:79,could:95,count_include_pad:79,counterpart:64,coupl:[58,60,62,63,66,71,95,98],cout:74,cover:96,cp38:63,cp:77,cpp:[15,16,46,47,48,49,56,67,71,74,77,97],cpp_frontend:97,cppdirectori:[23,54],cppdoc:74,cpu:[57,80],cra:91,creat:[31,32,33,34,37,57,58,59,60,61,62,63,64,65,66,70,73,74,78,84,88,95,99],create_model:58,create_transform:58,credit:74,crit:64,criteria:[68,69,71],cross:[64,88],crossentropyloss:64,cs:97,csrc:[67,72],cstddef:97,ctc_bpe_model:57,ctestcommandarg:76,ctrl:76,ctx:[73,74],ctype:74,cuda113:77,cuda:[53,57,58,59,60,61,62,63,64,70,74,75,76,77,80,83,95,97,99,100],cuda_graph_batch_s:[80,95],cuda_runtim:[22,49],cudafloattyp:74,cudasetdevic:39,cudnn:[57,58,59,60,61,62,63,64,76],cudnn_en:79,cumsum:79,curabitur:91,curl:[77,88],current:[25,58,60,70,73,77,80,84,86,95],cursu:91,custom:[58,60,65,77,95],custom_class:[22,49],custom_mapp:95,customclasshold:[49,52],cut:88,cxx11:98,cycler:57,cython:57,d17fnq9dkz9hgj:[58,60,61],d:[57,58,59,60,61,62,63,64,65,88,89,101],dapibu:91,data:[1,3,4,5,31,32,33,34,48,50,52,53,57,58,59,60,62,63,64,65,66,68,69,71,73,79,80,82,83,84,88,92,95,96,97],data_dir:97,data_item_1:87,data_load:64,data_typ:99,databas:57,dataclass:95,dataflow:[73,74],dataload:[5,31,32,33,34,48,53,64,82,97],dataloader_:48,dataloadercalibr:[82,97],dataloaderopt:97,dataloaderuniqueptr:[5,48],dataset:[31,34,63,64,82,96,97],datatyp:[2,22,42,49,50,52,53,54,55,58,75,83,84,99],datatypeclass:[0,54],date:89,dateutil:[57,60,61,62,63],david:89,dbg:77,dcmake_build_typ:77,dcmake_module_path:77,ddof:[57,59],dead_code_elimin:67,deal:73,debian_frontend:57,debug:[17,29,49,53,64,65,73,76,81,84,100],debugg:[65,84],debugpi:[57,60,61,62,63],decid:[62,83],declar:[64,77],decod:[58,59,60,61],decode_result:63,deconvolut:101,decor:[57,60,61,62,63,95],dedic:[67,89],deep:[58,59,60,61,62,63,64,73,78,86,97,101],deeplearn:[72,95],deeplearningexampl:63,deer:64,def:[57,58,59,60,61,62,63,64,88,94,95,99],default_tim:[57,59],defer:61,defin:[1,2,3,4,5,17,18,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,47,50,51,52,53,56,57,59,61,62,64,65,74,75,83,86,94,95,96,97],definit:[56,73,88],defusedxml:[57,60,61,62,63],deiti:88,delet:[1,2,3,49,50,67],delimit:67,demo:[58,59,60,63,88,97],demonstr:[57,58,59,60,61,62,63,88,89,90,96,97,99],demonstrat:[58,60],demostr:96,denorm:63,denot:[59,88],dep:77,depend:[31,34,38,57,61,63,64,66,68,71,74,75,95,98,99],depickl:70,deploi:[58,60,61,62,63,69,71,74,78,97,99],deploy:[58,60,62,63,64,65,74,75,96,97,98,99,101],deprec:[57,79,95],depth:[86,96],dequantizelay:64,descclassnam:88,descnam:88,describ:[53,60,62,63,73,94,99,100],descript:[61,68,89],deseri:[74,83,84],design:[58,59,60,62,63,95,96,101],desir:[64,89,97],destini:89,destroi:[73,89],destructor:73,detail:[58,60,61,64,74,94,95,98,99],detect:[52,60,64,70],detections_batch:63,determin:[58,67,95],determinist:79,develop:[57,58,59,60,62,63,74,77,78,88,89,95],devhelp:57,deviat:65,devic:[0,22,37,39,42,49,53,54,55,58,60,62,63,64,65,70,75,79,80,82,83,84,96,97,100,101],device_typ:[49,50,83,97,100,101],deviceclass:[0,54],devicetyp:[22,42,49,50,54,55,83,97,100,101],devicetypestruct:[0,54],diam:91,dict:[63,83,84],dictionari:[59,83,84,100],dictum:91,dictumst:91,did:88,didn:88,differ:[31,34,59,61,62,63,64,67,71,77,78,86,94,95],differenti:[58,60,62,63],digit:57,dignissim:91,dilat:[60,61,62,63,64,79],dim0:79,dim1:79,dim:[58,60,61,64,79,80,95,99],dim_int:79,dim_intlist:79,dimens:[52,61,67,80,95,96],dir:64,direct:[92,98],directli:[73,76,77,78,82,97],directori:[19,20,21,22,23,46,47,48,49,54,64,76,77,97],disabl:[58,60,61,62,63,64,65,81,86,87],disable_calib:64,disable_qu:64,disable_tf32:[49,53,84,97],disclos:77,disconnect:88,discret:88,discuss:[61,99],disp:[57,58,60,61,62],displai:[65,81,86],display_github:86,display_gitlab:86,display_vers:86,disregard:58,dist:77,distanc:57,distdir:77,distribut:[57,58,59,60,61,62,63,74,83,97,98],div:79,div_:79,divis:57,divisor_overrid:79,django:87,dl:88,dl_open:98,dla:[2,49,50,53,65,78,83,84],dla_cor:[49,50,65,83,97,100,101],dla_global_dram_s:[49,53,65,84],dla_local_dram_s:[49,53,65,84],dla_sram_s:[49,53,65,84],dla_standalon:65,dlacor:65,dll:65,doc:[64,71,72,77,86,87,88,93],docker:[57,58,59,60,62,63,99],docopt:57,docsrc:71,docstr:[88,89],document:[46,47,48,49,54,55,58,60,61,71,74,86,88,89,93,94,97,98,99,100],docutil:[57,88,89],doe:[47,48,59,63,67,68,73,88,95,97],doesn:[64,74,77,88,94],dog:64,dolor:[89,91],domain:[89,97],don:[62,73,86,88,89,95,97,99],done:[57,61,63,66,68,71,99],donec:[89,91],dont:46,dothismethod:88,dotpai:87,dotpayprovid:87,doubl:[53,65,84,88],down:[58,60,62,63,77,86,95],download:[57,58,60,62,63,64,77,92,97,99],downsampl:[60,61],downstream:96,doxygen_should_skip_thi:[48,49],dpython:[83,84],dr:61,dram:65,dream:89,driver:[57,58,60,61,62,77],drop:[63,77,86],dt:88,dtensorrt_root:77,dtorch_dir:77,dtyep:80,dtype:[49,52,53,57,58,59,60,61,62,63,64,65,75,79,80,83,84,95,96],dual:88,due:[4,5,58,60,62,63,64,77,87,88],dui:[89,91],dummi:59,dump:[40,65,77],dump_build_info:[22,42,49,54,55,83],durat:88,dure:[53,64,65,73,82,96,97,98],dynam:[52,53,63,64,80,83,84,95],dynamic_batch:[80,95],e1109:64,e:[31,32,33,34,58,59,60,63,65,67,73,74,77,80,83,94,95,97],each:[4,5,53,59,63,64,66,67,68,70,73,74,77,80,86,88,95],eager:[58,60,62,63],ear:88,earli:95,earliest:64,eas:47,easi:[65,66,67,74,97],easier:[59,64,69,71,73,74,95,97],easiest:77,easili:[4,5],ecc:[57,58,60,61,62],echo:88,ecosystem:[58,60,62,63],edg:88,edgecolor:63,edit:[76,86],editdist:57,edu:97,effect:[57,64,67,74,86,95,96,97],effici:73,efficientnet:[60,63,96],efficientnet_b0:58,efficientnet_b0_model:58,efficientnet_preprocess:58,efficitur:91,effort:61,eg:99,egesta:91,eget:91,either:[51,52,57,58,59,60,61,62,63,65,73,74,75,77,83,84,86,88,94],el:79,eleifend:89,element:[59,70,88,89,92,95],element_typ:48,elementum:91,elit:[89,91],elk:88,els:[47,48,52,57,64,84,88,89],elu:79,emb:[37,65,84,89],embed:[65,70,79,84,88,101],embed_engine_in_new_modul:[22,45,49,54,55,84],emit:66,emphasi:88,emploi:59,empti:[53,62,80,84,89,94],emum:[17,18],en:[57,86],enabl:[4,5,26,53,58,60,61,62,63,64,65,68,69,71,80,81,82,84,86,95],enable_calib:64,enable_precis:74,enable_qu:64,enabled_precis:[49,53,57,58,59,60,61,62,63,64,74,75,83,84,97,99,100,101],enalbed_precis:101,enc:59,enc_input:59,encdecctcmodelbp:57,encod:[57,59,70,96],encoded_input:59,encorag:[58,59,60,61],encount:77,encourag:99,end:[48,65,73,74,79,84,88,97],end_dim:[74,79],end_tim:[57,58,59,60,61,62,63,64],endif:[47,48,49],energi:88,enforc:74,engin:[1,2,18,36,37,41,49,50,52,53,57,59,61,65,66,68,69,71,74,75,78,80,83,84,86,97,98,100,101],engine_converted_from_jit:74,enginecap:[0,22,42,49,53,54,55,83,84,100],english:[59,96],enhanc:[63,88],enim:91,enjoi:59,enough:64,ensur:[31,34,64,67,68],enter:[59,66],entir:[64,88],entiti:88,entri:[53,73],entropi:[31,32,33,34,64,97],entropy_calibr:82,entropy_calibration_2:[82,97],entrypoint:[57,60,61,62,63],enumer:[1,2,3,17,18,50,59,64,82],environ:[57,58,59,60,61,62,63,95,99],ep:[60,61,79],epoch:64,eq:[79,88],equat:88,equival:[36,62,63,69,71,73,74,84,94,97],equivil:41,erat:91,erf:79,eric:88,ero:91,error:[17,53,57,58,59,60,62,63,65,66,67,71,74,77,81,84,88,95],eskimo_dog:58,essenc:88,essenti:[61,95],est:91,et:91,eta:[58,60,62,63],etc:[86,88,95,101],etiam:91,eu:91,euismod:91,eval:[57,58,60,61,62,63,64,74,75,99],evalu:[63,69,70,71],evaluated_value_map:[66,73],even:74,event:52,everi:[68,74,80],everyth:17,ex:[1,2,3,37,50,84,89,91],exact:99,exactli:[59,63],examin:[59,95],exampl:[52,58,60,61,62,63,64,68,70,71,73,74,76,78,81,83,84,86,87,89,92,94,95,97,98,99],exceedingli:88,except:[57,58,59,60,61,62,63,95],exception_elimin:67,excerpt:89,excit:[57,96],execpt:67,execut:[37,53,57,58,60,61,62,63,65,67,69,70,71,74,77,83,84,94,95,97,99],execute_engin:[70,74],exert:88,exeuct:70,exhaust:74,exist:[5,35,36,41,57,77,82,83,84,95,96,97],exit:99,exp:79,expand:[67,79],expand_a:79,expanded_pad:64,expect:[52,58,59,60,61,62,63,67,73,74,83,96],experi:[58,59,60,62,63],experiment:[64,95],explain:95,explan:[61,95],explic:[48,64],explicit:[1,2,3,4,5,49,50,61,67,78,80,88,95,97],explicit_batch_dimens:[80,95],explicit_precis:80,explicitli:[59,64,68,69,71,75,97,100],explict:48,explictli:1,expon:79,export_util:57,expos:97,express:[57,58,59,60,61,62,63,88],ext:[88,89],extend:[57,69,71,73,74,79,96],extens:[57,59,63],extent:[61,74,78],extern:[86,88],extra:74,extract:[74,96],extractor:62,extrem:88,ey:88,f16:[65,74,101],f1:[58,60,61],f32:65,f:[57,62,64,77,88,94,95],facecolor:63,facilisi:91,fact:77,facto:88,factori:[5,31,32,33,34,97],fail:[74,101],fake:64,fake_quantize_per_:64,fake_quantize_per_channel_affin:[64,79],fake_quantize_per_tensor_affin:[64,79],fall:83,fallback:[65,69,71,73,101],fals:[1,2,3,4,5,48,49,50,53,57,60,61,63,64,74,79,80,83,84,86,87,88,89,95,97,100],fame:91,famili:[58,60,62,63,64],familiar:99,familyhandyman:[58,60,61],fan:[57,58,60,61,62],far:[88,95],fashion:[74,96],fast:[53,65,84],faster:[64,96],fastjsonschema:61,fasttext:57,faucibu:91,fbed:[58,60,61],fc1:[62,74,94],fc2:[62,74,94],fc3:[62,74,94],fc:[53,60,61,63,64,65,67],feat:[62,74,94],featur:[57,58,59,60,61,62,63,64,65,68,74,95,96,97,100],feb:[58,60,62],fed:[4,5,52],feed:[31,32,33,34,64,74],feedforward:96,feel:[61,78],feli:91,feugiat:[89,91],few:[58,60,62,63,77,83,95],ffmpeg:57,field:[4,5,80,97],fifth:89,fig:[58,60,61,63],figur:[68,89,91],file:[1,2,3,4,5,6,7,8,9,10,11,12,13,17,18,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,50,51,52,53,57,58,59,60,61,62,63,64,65,68,70,71,74,76,77,80,82,83,84,86,87,89,93,95,97,99],file_path:65,filelock:[57,59],filepath:76,filer_publ:[58,60,61],filer_public_thumbnail:[58,60,61],fill:[57,58,59,60,62],filter:[57,63,64],find:[5,59,63,74,77,95],finder:77,fine:[57,64],finetun:64,finibu:91,finish:[63,95],first:[52,57,59,62,63,64,66,67,74,75,88,89,95,97,99],firstli:99,fit:88,five:63,fix:[53,60,63,88,95,101],fixed_s:[49,53],flag:[64,65,68,69,71,75,77,82,98],flaten:53,flatten:[49,51,62,74,79,94],flatten_convert:74,flesh:99,flexibl:[58,60,62,63],float16:[57,58,60,62,63,65,83],float32:[52,53,57,58,59,60,61,64,65,83,84,95],float64:84,float_int:79,floor:79,floor_divid:79,floordiv:79,flow:[62,63,64,73,88,94,95,96],flox:88,fluent:59,flush:88,fly:94,fmax:57,fmin:57,focal:57,fold:89,folder:[76,95],follow:[37,57,58,59,60,61,62,63,64,65,68,70,74,76,77,84,86,88,89,93,94,95,96,97,98,99],fonttool:57,foo:[88,89,95],foo_kwarg:95,foo_nod:95,footprint:[58,60,62,63],forc:[65,84,86,95],force_fp32_output:95,forced_fallback_op:68,form:[57,59,66,83,88,99],format:[37,49,52,53,57,58,59,60,61,62,63,64,65,75,79,83,84,88,89,96,99],forth:89,forum:77,forward:[31,32,33,34,36,37,62,64,68,70,73,74,83,84,94,97,100],found:[46,47,48,49,57,58,60,61,62,63,74,77,88,97,98],four:[88,89],fp16:[1,52,53,59,61,62,63,64,65,74,75,78,80,95,101],fp32:[1,52,53,59,61,62,63,64,65,78,84,95,96,97,99],frac:88,framework:[58,60,62,63],franc:59,freed:73,freeli:61,freeze_modul:67,fri:58,friend:49,fringilla:91,frog:64,from:[1,2,3,4,5,31,32,33,34,48,50,52,53,57,58,59,60,62,63,64,65,66,67,68,69,70,71,73,74,78,80,84,86,87,88,89,94,95,96,97,99],from_pretrain:[57,59],from_tensor:95,frontend:[75,78],frozen:64,frozendict:57,frozenlist:57,fssl:77,fsspec:57,fstream:[21,48],full:[49,53,64,65,73,74,81,97,98,99,101],fulli:[35,65,67,74,84,97,101],further:95,fusc:91,fuse:[58,60,62,63],fuse_addmm_branch:67,fuse_flatten_linear:67,fuse_linear:67,fusion:[73,95],futur:[57,58,59,60,62,64,84,95],futurewarn:57,fx2trt:80,fx2trt_exampl:95,fx:[75,78,83],g2p:57,g:[31,32,33,34,57,59,65,67,77,80,83,88,95,97],g_:88,gain:63,game:59,gamma:79,gatewai:87,gaurd:47,gcc:[71,74],gdown:57,ge:79,gear:97,geforc:[58,60,62],gener:[4,5,31,34,57,58,59,60,61,62,63,64,65,67,70,71,73,74,76,77,80,86,88,89,92,94,95,97],genutil:[57,60,61,62,63],geometr:59,get:[1,2,3,4,5,25,38,48,50,63,64,67,68,73,74,77,81,83,95,96,97,99],get_batch:82,get_batch_impl:48,get_batch_s:82,get_build_info:[22,42,49,54,55,83],get_cache_mode_batch:82,get_coco_object_dictionari:63,get_is_colored_output_on:[19,43,46,54,55,81],get_logging_prefix:[19,43,46,54,55,81],get_model_size_mb:57,get_output:95,get_reportable_log_level:[19,43,46,54,55,81],getattr:[57,67,70,74,94],getbatch:[4,5,48],getbatchs:[4,5,48],getdimens:[73,74],getoutput:[73,74],gi:[57,58,60,61,62],git:92,gitdb:57,github:[57,58,59,60,62,63,72,74,77,86,97,98,99],github_url:86,gitlab:86,gitlab_url:86,gitpython:57,give:[62,86,88,95],given:[52,53,59,63,65,67,74,75,80,82,83,84,94,95,100],global:[28,64,65,74],gnu:77,go:[48,58,60,61,62,63,64,67,68,74,78,94,95,96,99],goal:73,goe:[64,88,95],good:[48,73,88,95],goodger:89,googl:[57,59,86],got:[74,88],govern:[57,58,59,60,61,62,63],gpu:[2,36,39,41,49,50,57,58,59,60,61,62,63,64,65,74,83,84,95,97,99,100,101],gpu_id:[39,49,50,65,83,97,100,101],granular:62,graph:[17,35,36,41,49,57,58,60,61,62,63,64,65,66,68,69,71,73,74,78,80,81,84,94,95,96],graph_input:[49,53],graph_modul:80,graphic:61,graphinput:[22,42,49,53,54],graphinputsstruct:54,graphmodul:[75,80],graphnam:[57,59],gravida:91,great:[58,60,62,63,74,88],greater:81,green_mamba:[60,61],group:[64,79,88,89],grpc:99,grpcio:57,gru_cel:79,gt:[57,58,59,60,61,62,63,79],gtc:78,guangzhou:89,guard:67,guard_elimin:67,guess:59,gui:88,guid:[78,87],gulf:[58,60,61,99],gz:[88,89,97],h5py:57,h:[1,2,3,4,5,6,7,8,9,10,11,12,13,16,17,18,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,50,51,52,53,54,56,58,60,63,65,67,74,97],ha:[53,57,58,59,60,61,62,63,64,66,67,68,69,71,73,74,76,80,88,89,94,95,96,97],habit:91,habitass:91,hac:91,hack:48,hakaimagazin:[58,60,61,99],half:[59,61,62,63,64,65,74,75,83,88,97,99,100,101],hand:99,handl:[63,67,70,95],happen:[62,64,94,95],hardtanh:[73,79],hardtanh_:79,hardwar:[58,60,62,63,101],has_batch_dim:80,hasattr:57,hash:77,have:[31,34,37,48,57,58,59,60,61,62,63,65,66,67,73,74,77,78,80,83,84,88,94,95,96,97,99],haven:74,head:63,header:[58,60,61,74,86,88,89,99],heart:89,heaven:88,heck:88,heh:89,hehe:89,height:88,help:[29,57,58,59,60,62,64,65,66,73,74,95,96,98],helper:[57,62,63,64,73],henc:59,hendrerit:91,here:[48,57,58,59,60,61,62,63,66,68,70,74,77,86,88,89,94,95,97,98,99],hermet:77,hexagram:88,hfile:[23,54],hi:[79,88,89],hidden:[47,59,86],hierarchi:64,high:[58,60,63,67,68,86],higher:[59,67,86,88,94],highfreq:57,highli:[61,96,99],highlight:88,hinton:97,hist_percentil:64,histogram:64,historgram:64,hit:57,hold:[50,51,52,66,73,97],holder:[70,90],holi:88,home:77,hood:71,hope:89,hors:64,host:[53,60,61,62,63,64,65,77,84,99],how:[4,5,58,59,60,61,63,64,77,88,90,92,94,96,98,99,100],howev:[31,34,58,60,62,63,77,86,87,99],html:[64,72,77,88,94,97],html_theme:93,html_theme_opt:86,html_theme_path:93,htmlhelp:57,http:[57,58,59,60,61,62,63,64,72,74,77,86,88,94,96,97,98,99],http_archiv:77,httpclient:99,hub:[57,59,60,63,99],huge:59,huggingfac:[57,59,96],human:88,humankind:89,huski:[58,60,61],hx:79,hybrid:84,hydra:57,hyperlink:88,hyphen:88,i8:65,i:[57,58,59,60,61,62,63,64,65,67,73,74,79,88,89,94,97],iaculi:91,icon:[86,88],id:[39,49,57,58,60,61,62,63,65,83,86,87,91,101],idea:[67,88],ident:[59,65],idna:[57,59],idx:[63,79],ifndef:[48,49],ifstream:48,ignor:83,iii:89,iint8calibr:[4,5,31,32,33,34,48,49,53,84,97],iint8entropycalibrator2:[4,5,31,32,33,34,48,97],iint8minmaxcalibr:[31,32,33,34,97],ilay:73,illustr:[64,95,96],imag:[58,60,61,63,64,97,99],image_classif:63,image_idx:63,imageio:63,imagenet:[58,60,61,64,96],imagenet_cla:[58,60,61],imagenet_class_index:[58,60,61],imagenett:96,images:57,images_:97,img0:[58,60,61],img1:[58,60,61,99],img2:[58,60,61],img3:[58,60,61],img:[58,60,61,99],img_path:[58,60,61,99],impact:[58,59,60,62,63],imperdiet:91,implement:[4,5,58,59,60,61,62,63,67,68,70,74,87,95,97,98],impli:[57,58,59,60,61,62,63],implic:67,implicit:[79,80,88,95],implicitli:83,implictli:83,importlib:[57,60,61,62,63],improv:[64,89],imshow:[58,60,61,63],in_featur:[60,61,62],in_shap:74,in_tensor:94,incas:48,includ:[14,16,17,38,40,46,47,48,49,56,58,60,62,63,65,68,69,70,71,74,77,80,86,88,94,95,97],includedirectori:[23,54],includehidden:86,incompat:77,incorpor:89,incorrect:64,ind:[58,60,61],inde:[58,60,62,63],indent:88,independ:63,index:[37,57,58,59,60,61,62,63,64,72,78,79,84,86,92,97],indic:[57,59,79,86,88],indigo_bunt:58,indirect:88,inetworkdefinit:66,infer:[57,58,59,60,62,64,67,74,83,84,95,96,97],inference_output:99,inferenceservercli:99,inferinput:99,inferrequestedoutput:99,inflect:57,info:[17,36,41,49,65,73,74,81,83],inform:[27,37,38,40,52,57,61,63,64,65,66,68,70,74,77,78,80,81,83,88,94,95,97,100],infrastructur:[97,99],ingest:71,inherit:[54,55,95,97],inheritenviron:76,iniconfig:57,init_weight:64,initi:[57,59,64,88],injuri:88,inlin:[1,2,3,4,5,31,32,33,34,48,50,52,57,60,61,62,63,67,74,89,92],inner:[53,89,96],innings:59,inplac:[60,61],input0:74,input1:74,input2:74,input:[4,5,22,31,34,37,42,48,49,51,53,54,55,57,58,59,60,61,62,63,64,65,66,67,68,70,73,74,75,79,80,81,83,84,89,94,95,96,97,99,100,101],input_0:[70,74],input__0:99,input_batch:[58,60,61],input_data:[58,60,61,62,63,64,75,94],input_file_path:[65,101],input_id:59,input_is_dynam:49,input_nam:[80,95],input_s:[68,74],input_scal:79,input_shap:[57,58,60,61,62,63,64,97,101],input_signatur:[49,51,53,84],input_spec:[65,80,95],input_tensor1:59,input_tensor2:59,input_tensor3:59,input_tensor:[57,58,60,61],input_tensor_spec:[80,95],input_v:95,inputclass:[0,54],inputrang:[68,74],inputtensorspec:[80,95],inreleas:57,insert:[64,74,97],inserting_befor:95,insid:[88,99],inspect:[58,60,62,63,73,74,94],instal:[57,58,59,60,61,62,63,64,74,78,92,98,99],installroot:76,instanc:[59,62,67,74,82,94,96],instance_norm:79,instanti:[57,69,70,71,73,74],instatin:[1,2,3,50],instead:[53,57,58,59,60,61,62,63,64,65,66,67,74,77,98],instnanti:70,instruct:[68,69,71,74,77,95,99],insur:77,int32:[59,61,83,84,96],int64:84,int64_t:[49,50,52,53,97,101],int8:[1,48,52,53,61,65,78,83,84,97,101],int8_t:49,int8cachecalibr:[21,31,34,44,48,54,55],int8cachecalibratortempl:[0,54],int8calibr:[4,21,32,33,44,48,54,55],int8calibratornamespac:[0,54],int_float:79,integ:[64,83,91],integr:[58,59,60,61,62,63,78],intend:[57,77],intent:[67,88],interact:88,intercompat:63,interdum:91,interest:[67,88],interfac:[1,2,3,50,70,71,73,97],interfer:88,intermedi:[17,53,58,60,62,63,65,81,84,94],intern:[2,17,50,58,60,62,63,64,73,74,81,88],internal_error:81,internalerror:81,interpol:[58,88],interpolationmod:58,interpret:[58,60,62,63,70,88,95],intro_to_torchscript_tutori:94,introduc:[58,60,62,63,64,95,96],introduct:59,invalid:64,invok:[74,94,95],involv:[57,58,59,60,62],io:[48,57,58,59,60,61,62,63,99],iostream:[21,22,48,49,74],ipad:57,ipso:88,ipsum:[89,91],ipykernel:[57,60,61,62,63],ipython:[57,60,61,62,63],ipywidget:[57,60,61,62,63,64],ir:[58,60,62,63,69,71,73,75,83,94],is_avail:[58,60,61],is_floating_point:79,is_tar:57,is_train:97,iscustomclass:73,isinst:[64,95],isn:[86,88],isort:57,issu:[4,5,57,58,59,60,62,74,77],istensor:73,istream_iter:48,it_:48,ital:88,item:[57,58,59,60,61,64,87,89],itensor:[66,73,74,95],iter:[21,48,53,57,58,59,60,61,62,63,64,65,66,82,84],its:[31,34,58,60,62,63,66,70,73,77,88],itself:[1,2,3,50,65,67,77,99,100],iv:89,ivalu:[49,51,53,66,70,73,74],ja:57,jan:89,jarowinkl:57,jedi:[57,60,61,62,63],jetpack:77,jetpack_5:77,jetpack_x:77,jetson:[58,60,62,63,83,96],jieba:57,jinja2:[57,60,61,62,63],jit:[35,36,37,41,49,51,53,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,83,84,94,99,100],jit_model:64,jmespath:57,joblib:[57,59],join:64,jp_workspac:77,jpeg:[58,60,61],jpg:[58,60,61,63,99],jpg__1920x1080_q85_subject_loc:[58,60,61],jsmath:57,json:[58,60,61,76],json_fil:[58,60,61],jsonschema:[57,60,61,62,63],jump:99,jupyt:[57,60,61,62,63],jupyterlab:[57,60,61,62,63],jupyterlab_widget:[60,62,63],just:[48,49,58,59,60,61,63,67,74,75,78,81,88,90,94,95,96,98,100],justo:[89,91],k:[59,79,97],kaldi:57,kaldiio:57,kb:[58,60,61,62,63],kbool:[1,49],kchannelslast:[3,49],kchar:[1,49],kclip:73,kcontigu:[3,49,52],kcpu:[2,50],kcuda:[2,50,68,74],kdebug:[17,46,48],kdla:[2,49,50,101],kdla_standalon:[18,49],keepdim:79,kei:[59,64,88,94,99],kept:[64,89],kernel:[52,53,58,60,62,63,65,73,83,84,95],kernel_s:[60,61,62,79],kerror:[17,46],keyboard:88,keyword:[57,83,84],kf16:[97,101],kfloat:[1,49,53],kgpu:[2,49,50],kgraph:[17,46,67],khalf:[1,49,74],ki8:97,kind:[57,58,59,60,61,62,63,66,83,95],kinfo:[17,46,48],kint:[1,49],kinternal_error:[17,46],kiwisolv:57,know:[46,73,86,88],knowledg:88,kriz:97,krizhevski:97,ksafeti:[18,49],kstandard:[18,49,53],ktest:97,ktrain:97,kunknown:[1,3,49],kwarg:[64,82,83,95,96],kwarn:[17,46],l:79,label:[58,60,61,63,64,88,96,97,99],lacinia:91,lack:[68,69,71,95],lacu:91,laid:74,lambda:[60,61,63,73,74,88,99],lang:87,languag:[57,58,60,61,62,63,87,88,89,94,99],laoreet:91,larg:[58,59,60,62,63,64,69,71,74,86,88,96,97],larger:[86,96],largest:79,last:[3,57,63,67,83,95],lastli:99,latenc:[57,59],later:[31,34,59,74],latest:[58,59,60,77,86],latexcodec:57,launch:99,law:[57,58,59,60,61,62,63],layer1:[60,61],layer2:[60,61],layer3:[60,61],layer4:[60,61],layer:[50,53,58,60,62,63,64,65,66,67,73,74,84,95,96,97,99,101],layer_norm:79,layout:[3,52,79,83,84],ld_library_path:77,ld_preload:98,ldd:77,le:79,lead:88,leader:88,leaky_relu:79,leaky_relu_:79,learn:[61,64,74,78,97,99,101],leas:89,least:[58,59,60,88,89],leav:[62,64,67],lectu:[89,91],left:[63,86,88],legacy_calibr:82,legend:88,len:[57,59,63,64,79],lenet:[74,94],lenet_script:[74,94],lenetclassifi:[62,94],lenetfeatextractor:[62,94],length:[4,5,48,58,59,60,61,79,89,95],leo:91,let:[50,57,58,60,61,62,63,65,67,73,83,84,86,88,95,96,99],letter:[57,89,96],level:[19,25,27,28,43,46,48,54,55,58,59,60,62,63,64,67,68,71,81,84,92,94,95,99],levelnamespac:[0,54],leverag:[58,60,61,62,63,95,97],lib:[57,58,59,60,61,62,63,64,67,74,77],libero:[89,91],librari:[38,46,47,48,49,58,60,61,62,63,64,65,69,70,71,73,74],librosa:57,libsndfile1:57,libtorch:[5,40,58,60,62,63,73,74,76,77,97],libtorch_pre_cxx11_abi:77,libtorchtrt:[65,74,77],libtorchtrt_plugin:98,libtorchtrt_runtim:98,licens:[46,47,48,49,57,58,59,60,61,62,63,74],light:88,lightn:57,lightningdeprecationwarn:57,lightningmodul:57,ligula:91,like:[58,60,62,63,65,66,67,70,73,74,75,77,87,88,94,95,97,98,99],limit:[57,58,59,60,61,62,63,67,81,87,97],line:[65,74,89],linear:[3,60,61,62,64,79,83,94],linewidth:63,link:[65,66,74,78,86,87,92,98],linux:[71,74,77],list:[19,20,21,22,35,53,56,57,59,63,64,66,68,70,73,74,75,77,79,80,83,84,92,95,99],listconstruct:[66,70,74],listunpack:[70,74],liter:89,literal:89,literal_block:88,live:[73,88],ll:[59,95],llvmlite:57,lo:79,load:[57,58,60,61,63,64,65,68,70,74,75,82,84,95,96,97,98,99,100],load_calib_amax:64,load_librari:98,load_state_dict:64,loader:[57,58,60,62,63],loading_data_recip:97,loborti:[89,91],local:[63,64,65,67,74,86],localhost:99,locat:[63,77,97],lock:87,log:[16,17,20,21,23,42,48,54,55,56,59,64,67,73,78,79,80,83,95],log_debug:73,logger:81,logger_level:80,loggingenum:[0,54],logic:95,login:99,logist:95,loglevel:81,logo_onli:86,lone:89,longer:[58,60,62,63,86,98],look:[57,58,59,60,61,62,63,64,66,67,94,97,99,100],loop:95,loop_unrol:67,lorem:[89,91],lorikeet:[60,61],lose:86,loss:[64,96,97],lot:73,low:95,lower:[17,61,80,81,83,89,95,96],lower_exampl:95,lower_graph:67,lower_precis:[80,95],lower_tupl:67,loweralltupl:67,lowerprecis:[80,95],lowersimpletupl:67,lowfreq:57,lr:64,lstm_cell:79,lt:[57,59,60,61,62,63,64,79],ltorchtrt:98,luctu:91,lvl:[27,28,46],m:[57,58,60,61,62,89],machin:[58,60,62,63,70,97,99],macro:[6,7,8,9,10,11,12,13,16,19,21,22,23,46,48,49,54,56],mad:88,made:[63,67,69,71,88],maecena:91,magna:91,mai:[57,58,59,60,61,62,63,66,70,71,74,75,84,88,89,94,95,97,99],main:[63,67,68,69,70,71,73,74,86,88,90,95],mainli:95,maintain:[59,68,70,73],major:[58,60,62,63,71,95],make:[58,59,60,61,62,63,66,74,75,77,88,90,95,96,97,99,101],make_data_load:[5,97],make_int8_cache_calibr:[21,44,48,54,55,97],make_int8_calibr:[21,31,34,44,48,54,55,97],malesuada:91,man:[88,89],manag:[53,57,58,59,60,61,62,63,65,66,69,71,73,74,76,81,83,84],mangag:67,mani:[86,88,89,95],manifest_filepath:57,mantissa:[53,84],manual:[87,88,95],manual_se:57,manylinux2014_x86_64:63,manylinux_2_17_x86_64:63,map:[2,50,66,67,69,71,73,74,95,96,97,99,100],mapper:95,mark:[58,67,86],markdown:57,marknodesforfallback:67,markup:[89,92],markup_process:88,markupsaf:[57,60,61,62,63],marshmallow:57,mask:[57,79],masked_fil:79,masked_sent:59,massa:91,master:[72,77,88,97,98],mat2:79,match:[67,77],math:92,mathemat:59,matmul:[67,74,79],matplotlib:[57,58,60,61,62,63],matric:59,matrix:72,matter:95,matti:89,matur:71,mauri:[89,91],max:[52,60,61,62,63,64,65,73,79,83,86],max_batch_s:[80,95,99],max_bound:64,max_c:65,max_dur:57,max_h:65,max_input_shap:80,max_length:59,max_n:65,max_pool1d:79,max_pool2d:[62,74,79,94],max_pool3d:79,max_shap:[49,52,61,62,75,83,84,95,96],max_val:[73,79],max_valu:64,max_w:65,max_workspace_s:[80,95],maxcalibr:64,maxim:61,maximu:91,maximum:[52,53,58,59,60,61,64,65,80,84,95,99],maxpool2d:[60,61],maxpool:[60,61],mayb:88,mb:[58,60,61,62,63,65],md:72,me:[88,89],mean:[57,58,59,60,61,62,63,64,68,73,78,79,80,95,99],mecab:57,mechan:[57,59,73,95,96],media:[58,60,61],median:[57,59],medium:88,meet:83,mel:57,member:[50,51,52,53,83],memeori:3,memori:[21,22,48,49,57,58,60,61,62,63,67,73,74,75,83,84],memory_format:[79,83],memoryformat:[3,49],men:88,mental:88,menu:[65,86,88],menuselect:88,messag:[17,27,28,65,81],meta:[92,95],metadata:[53,57,65,70,73,84,86],meth:88,method:[35,36,37,41,52,57,58,60,61,62,63,64,65,67,73,74,77,83,84,88,94,96,100],method_nam:[35,41,49,65,74,83,84],metric:57,metu:91,mi:91,microsoft:76,middl:88,mig:[57,58,60,61,62],might:[59,64,67,77,86],min:[52,65,73,79,83],min_block_s:[49,53,68,84],min_bound:64,min_c:65,min_h:65,min_input_shap:80,min_n:65,min_shap:[49,52,61,62,75,83,84,95,96],min_val:[73,79],min_valu:64,min_w:65,mind:88,mine:88,mini:[58,60,61],minim:97,minimum:[52,53,61,65,68,81,84],minmax:[31,32,33,34,97],minmax_calibr:82,misbuild:86,miss:[74,88],mistun:[57,60,61,62,63],mix:63,mixin:57,mkdir:[58,60,61,77],mlm_model_t:59,mm:[57,99],mmb:88,mobilenet_v2:100,mobilenetv2:96,mod:[57,65,68,74,92,95,97],mode:[64,75,95,97],mode_:97,model:[57,65,68,70,74,75,78,80,81,94,97,100],model_math:63,model_nam:[57,64,99],model_repositori:99,model_s:57,model_state_dict:64,model_torchtrt:81,model_trt:81,modelpt:57,modern:63,modifi:[89,95],modified_state_dict:64,modul:[35,36,37,41,49,53,57,58,59,60,61,62,63,64,65,68,69,70,71,73,75,76,77,78,80,83,84,87,88,89,95,96,97,100,101],modular:74,module_fallback:67,module_nam:65,molesti:91,momentum:[60,61,64,79],mon:61,month:57,monthli:[57,61],morbi:91,more:[58,60,61,62,63,64,66,74,77,78,83,86,89,94,95,97,98,99,100],most:[59,71,77,80,95,98,99],most_likely_token_id:59,most_likely_token_ids_trt:59,mother:88,motion:88,mous:88,move:[32,33,48,58,60,61,62,63,67,70,74,84,97],mpmath:57,ms:[58,60,61,62,63,64],mse:64,msg:[28,46,57,59,81],msvc_x64_x64:76,mu:88,much:[73,86,88,97],mul:[64,79],mul_:79,multi:65,multidict:57,multipl:[70,88,89,97,99],multipli:[53,84],must:[37,52,53,59,63,65,67,68,73,74,77,80,83,84,88,89,95,98],mutil:89,my:88,my_pytorch_model:95,myclass:88,mymodel:[68,75],mypi:63,myself:89,n01537544:58,n01739381:58,n01749939:[60,61],n01820546:[60,61],n02109961:58,n02110185:[60,61],n02481823:[58,60,61],n:[57,58,59,60,62,65,73,74,97],n_fft:57,n_mel:57,nabla:88,nam:[89,91],name:[4,5,35,37,41,48,57,58,60,61,62,63,64,68,70,73,74,76,77,80,82,84,88,89,94,95,99,100],named_modul:64,namedtupl:95,namespac:[0,46,47,48,49,56,67,78,97],narrow:[64,79],nativ:[64,71,72,74],native_funct:72,natur:[59,88],nav:[86,92],navig:86,navigation_depth:86,nbbind:[4,5,48],nbclient:[57,60,61,62,63],nbconvert:[57,60,61,62,63],nbformat:[57,60,61,62,63],nchw:[3,83,84],ncol:[58,60,61],ne:[67,79],nec:91,necessari:[46,98],need:[1,2,3,27,31,34,47,50,58,60,61,63,66,67,73,74,75,77,80,88,95,96,97,98,99],neg:79,negative_slop:79,nemo:57,nemo_1:57,nemo_asr:57,nemo_log:57,nemo_toolkit:57,nequ:[89,91],nest:[49,53,54,55,57,60,61,62,63,88,89],net:[58,60,61,73,74,88,89],netu:91,network:[31,32,33,34,58,60,62,63,64,73,74,95,96,97,99,101],networkx:63,neural:[58,60,63,101],new_lay:73,new_level:59,new_local_repositori:77,new_lr:64,new_siz:97,newer:[58,60,62,63,77],newest:57,newli:57,next:[4,5,63,64,66,70,86,88,89,97,99],nfilt:57,ngc:[57,58,59,60,61,62,63,77,99],nhwc:[3,65,83],nibh:[89,91],nice:77,nickel:88,night:89,nightli:95,nine:59,ninja:[76,77],nisi:91,nisl:91,nl:[58,60,61],nlp:[31,32,33,34,59,97],nltk:57,nn:[57,58,60,61,62,64,67,72,74,75,80,83,84,94,95],no_grad:[57,58,59,60,61,62,63,64],node:[64,67,68,69,71,73,74,95,96],node_info:[73,74],noexcept:[4,5,48,97],non:[89,91],non_block:[64,79],none:[58,60,62,63,64,73,79,80,83,84,86,88,95],nonetheless:88,nonexist:88,noninteract:57,norm:79,normal:[1,2,3,50,57,58,59,60,61,62,63,64,74,88,94,95,97,99,101],normalized_shap:79,noskipw:48,notatemoduleforfallback:67,note:[2,50,52,59,73,74,76,77,83,86,88,95,101],notebook:[57,58,59,60,61,62,63,64,71,78],notic:[62,63],now:[57,58,59,60,62,63,67,71,73,74,77,88,95,100],np:[57,58,59,60,61,62,63,64,99],nrow:[58,60,61],nrun:[58,60,61,62,63,64],nu:88,nulla:91,nullptr:[48,49,53],num:[57,59,65],num_avg_timing_it:[49,53,84,100],num_batch:64,num_bit:64,num_calib_batch:64,num_class:64,num_epoch:64,num_it:65,num_loop:[57,59],num_op:65,num_work:[64,97],numba:57,number:[4,5,53,57,58,59,60,64,65,67,68,73,74,75,83,84,86,95,96],numel:79,numer:[57,65,89,95],numpi:[57,58,59,60,61,62,63,64,99],nunc:91,nvcr:[57,99],nvidia:[36,41,46,47,48,49,57,58,59,60,61,62,63,64,65,72,74,77,83,84,95,99,101],nvidia_convnets_processing_util:63,nvidia_deeplearningexamples_torchhub:63,nvidia_efficientnet:63,nvidia_efficientnet_b0:63,nvidia_efficientnet_b4:63,nvidia_efficientnet_widese_b0:63,nvidia_efficientnet_widese_b4:63,nvidia_resnet50:63,nvidia_resnext101_32x4d:63,nvidia_resnext:63,nvidia_se_resnext101_32x4d:63,nvidia_ssd:63,nvidia_ssd_processing_util:63,nvidia_ssdpyt_amp_200703:63,nvidia_tacotron2:63,nvidia_tts_util:63,nvidia_waveglow:63,nvinfer1:[4,5,31,32,33,34,48,49,53,73,97],nvinfer:[21,48],nwarmup:[58,60,61,62,63,64],o:[58,60,61,77,88,99],oauthlib:57,obj:79,object:[1,2,3,4,5,50,52,53,65,70,73,81,82,84,97,100],observ:[57,58,59,60,64],obsolet:63,obtain:[57,58,59,60,61,62,63,64,96],obvious:94,octet:[58,60,61],odio:[89,91],off:[57,58,60,61,62,63,68,70],offici:77,ofstream:[48,74],often:88,oh:89,ok:[58,60,61,74,88],okai:53,older:71,omegaconf:57,onc:[46,47,48,49,66,67,70,95,97,98,99],one:[51,59,63,64,67,73,74,75,81,83,88,94,95,99],ones:[46,58,60,62,63,68,69,71,74,77,88],onli:[2,4,5,17,31,34,48,50,52,62,63,65,67,68,71,73,77,80,81,83,88,95,97,98,101],onnx:[57,67],onto:[65,70],onward:[58,60,61],op:[58,59,60,61,63,64,65,66,67,69,71,73,74,83,98],op_and_target:95,op_nam:65,op_precis:[58,60,61,63],open:[58,60,61,62,63,76,96,99],opencc:57,oper:[1,2,3,4,5,35,48,49,50,53,58,60,61,62,63,64,65,66,67,68,69,70,71,73,75,78,83,84,95,97,101],oppos:84,opset:[69,71],opt:[52,57,58,59,60,61,62,63,64,77,83],opt_c:65,opt_h:65,opt_n:65,opt_shap:[49,52,61,62,75,83,84,96],opt_state_dict:64,opt_w:65,optim:[52,57,58,59,60,61,62,63,64,65,67,74,75,78,80,94,95,96],optimin:52,optimiz:[58,60,62,63,94],optimize_target_shap:95,optimized_execut:57,optimized_input_shap:80,optimz:99,option:[48,52,65,68,69,71,77,83,88,92,95,97,98,101],orchestra:88,orci:91,order:[53,63,68,73,74,75,77,80,84,95],org:[57,58,59,60,61,62,63,64,72,74,77,86,88,94,97],organ:89,origin:[57,59,63,64,80,95],original_nam:62,ornar:[89,91],os:[49,64],ostream:49,other:[1,2,3,49,50,58,60,61,62,63,64,65,66,67,70,74,75,77,78,79,87,88,95,98],otherwis:[58,59,60,77,80,95,98],our:[58,59,60,61,62,63,68,71,74,94,99],out:[35,48,57,58,59,60,61,62,64,66,67,68,69,71,73,74,76,77,81,84,88,99],out_dir:64,out_featur:[60,61,62],out_shap:74,out_tensor:[73,74],output0:67,output:[26,29,37,53,58,59,60,61,62,63,64,65,66,67,68,70,73,74,77,81,84,86,88,89,95,96,99],output__0:99,output_file_path:[65,101],output_nam:[80,95],output_pad:79,output_s:[60,61,79],output_trt:59,outself:74,outsid:88,over:[58,60,61,62,69,71,88,95,99],overal:96,overkil:62,overrid:[4,5,31,32,33,34,48,83,95,97],overview:[59,72,78],own:[57,58,59,60,62,73,74,77,88,99],p0:61,p2:57,p8:[57,58,60,62],p:[58,60,61,65,74,79,99,101],packag:[57,58,59,60,61,62,63,64,65,67,74],pad:[57,59,60,61,64,79],padding_idx:79,padding_mod:64,page:[61,78,90,92,99],pair:[57,67,73,77,88,96,97],panda:57,pandocfilt:[57,60,61,62,63],pane:88,pangu:57,paper:[58,60,63],paragraph:[89,92],parallel:59,param:[82,87],param_group:64,paramet:[1,2,3,4,5,27,28,29,31,32,33,34,35,36,37,39,41,50,52,53,64,66,67,73,74,80,81,83,84,92,94,95],parameter:57,parent:[15,16,19,20,21,22],pari:59,pars:[64,74,88],parser:88,parso:[57,60,61,62,63],part:[57,65,68,71,86,87,88,95],parti:61,partial:[58,60,62,63,65,88],particular:62,particularli:59,partit:67,partitioninfo:68,pass:[57,59,64,66,68,69,70,71,73,74,77,81,82,94,95,97],past:88,patch:63,path:[5,14,15,16,31,32,33,34,62,63,64,65,74,76,77,82,83,94,95,97,99],path_to_torchtrt_root:77,pathspec:[57,63],pathtool:57,pathwai:94,pattern:[73,74,83],payment:87,pbtxt:99,peephole_optimz:67,pellentesqu:91,peopl:88,pep:88,per:[61,63,64],percentil:[57,59,64],perf:[57,58,60,61,62],perfom:64,perforamnc:95,perform:[31,32,33,34,58,59,60,61,62,63,96,97,99],permiss:[57,58,59,60,61,62,63],permit:88,permut:[79,95],persist:[57,58,60,61,62,88],pesq:57,pexpect:[57,60,61,62,63],pharetra:91,phase:[17,64,73,74],phasellu:91,phi:88,philosoph:88,phrase:88,pi:88,pick:[62,94],pick_best:63,pickler:70,pickleshar:[57,60,61,62,63],pid:[57,58,60,61,62],piec:[57,96],pil:[58,60,61,99],pillow:[57,58,63],pin:87,pin_memori:79,pip3:77,pip:[57,58,59,60,61,62,63,64,77,99],pipelin:[65,101],piplein:74,pipreq:57,pixel_shuffl:79,pl:87,place:[52,67,77,88,89,90,95,97],placerat:91,plan:[65,71],plane:64,platea:91,platform:[49,58,60,62,63,65,71,76,77,99,101],platformdir:63,pleas:[57,58,64,74,77,88,95,99],plot:63,plot_result:63,plt:[58,60,61,63],pluggi:57,plugin:[57,95],po:59,point:[74,83,86,87,88,99],pointer:[4,5,97],polish:87,pooch:57,pool:[60,61,62,63,64,101],pop:70,popul:80,popular:[59,77,87,96],portabl:[58,60,62,63,70,84],portalock:57,portion:88,porttitor:[89,91],pos_mask:59,posit:[57,59,65,83,86,95],possibl:[58,59,60,62,63,77,88,96,99],post1:57,post:[31,32,33,34,53,65,74,78],posuer:[89,91],potenti:[53,91],pow:79,power:[58,60,62,63,74,88,95,96],pr:74,practic:[58,60,62,63],praesent:91,pragma:[46,47,48,49,97],pre:[37,57,58,59,60,64,67,82,84,97,98],pre_cxx11_abi:77,preced:88,precis:[53,59,61,62,63,65,74,75,78,83,95,97,101],precisions_str:57,pred:[58,60,61,64],pred_label:63,pred_loc:63,predict:[58,59,60,61,63],prefer:74,prefix:[29,30,46,81,88],preinstal:77,prelu:79,prepar:[57,58,59,60,62,63,95,99],prepare_input:63,prepare_tensor:63,preprint:97,preproc:82,preprocess:[57,58,60,61,64,97,99],prerequisit:76,present:76,preserv:[64,88,94,97],prespect:94,press:[76,88],pretium:91,pretrain:[57,58,59,60,61,63,96,99,100],pretti:74,prev_next_buttons_loc:86,prevent:[53,65],previou:[59,86],previous:[31,34,37,74],prim:[66,67,70,74,79,94],prim_devic:79,primal:88,primari:59,primarili:[71,74],print:[17,35,48,57,58,59,60,61,62,63,64,74,81,83,84,88,99,100],print_funct:57,printout:59,printstat:[57,59],priorit:77,privat:[4,5,48,49,97],prob:[58,60,61],probabl:[58,59,60,61,63],probablil:[58,60,61],problem:[59,88],problemat:88,proce:[58,60,61,99],proceed:99,process:[57,58,59,60,61,62,63,64,65,68,87,88,94,96,97,99,100],prod:79,produc:[52,66,70,73,74,88,96],product:[53,58,60,62,63],profil:[52,62,80],profiling_verbos:95,program:[19,20,21,22,31,34,56,61,62,63,65,69,70,71,78,94],programm:88,progress:89,proin:91,project:[77,87,92],projectdir:76,prometheu:[57,60,61,62,63],promis:[57,95],prompt:[57,60,61,62,63],prop:80,properli:77,properti:[57,59,86],propog:67,prose:88,protobuf:57,provid:[4,5,53,57,58,59,60,61,65,68,70,73,74,75,77,80,83,84,88,95,97,98,99,100],providi:[69,71],provok:88,psutil:[57,61],pt:[59,63,64,65,74,95,99],pth:[60,63,64],ptq:[4,5,16,19,20,23,42,54,55,56,65,78,83,84],ptq_calibr:[4,5,49,53,97],ptqtemplat:[0,54],ptyprocess:[57,60,61,62,63],publish:99,pull:[77,99],purchas:87,pure:[35,57,61,63],purpos:[63,77,95,96,99],puru:91,push:70,push_back:[48,68],put:[88,96],pwd:[76,99],pwr:[57,58,60,61,62],py2:[60,62,63],py3:[57,58,59,60,62,63,99],py:[57,58,63,64,67,71,74,77,86,88,93,94,95,97],pyannot:57,pyasn1:57,pybind11:57,pybtex:57,pycpars:[57,60,61,62,63],pycr:57,pydeprec:57,pydub:57,pygment:[57,60,61,62,63],pyindex:99,pypa:[57,58,59,60,61,62,63],pypars:[57,59,60,61,62,63],pypi:[57,58,59,60,61,62,63,64,77],pypinyin:57,pyplot:[58,60,61,63],pyrsist:[57,60,61,62,63],pysock:57,pystoi:57,pytest:57,python3:[57,58,59,60,61,62,63,64,67,74,77],python:[57,58,59,60,61,62,63,64,65,68,71,74,83,84,88,89,95,96,98,99,100,101],python_api:72,pythonhost:[60,61,62,63,64],pytorch:[52,53,57,58,59,60,61,63,64,65,67,68,69,70,71,73,74,75,77,82,83,84,94,97,98,99],pytorch_libtorch:99,pytorch_lightn:57,pytorch_quant:[63,64],pytorch_sphinx_them:[86,93],pytorch_vision_v0:61,pytz:57,pywavelet:63,pyyaml:[57,59],pyzmq:[57,60,61,62,63],qat:[64,96],qat_model:64,qthelp:57,qualiti:[58,60,63],quant:64,quant_dim:64,quant_input:64,quant_max:79,quant_min:79,quant_modul:64,quant_nn:64,quant_weight:64,quantconv2d:64,quantdescriptor:64,quantiz:[31,32,33,34,63,65,74,78],quantizatiom:53,quantizelay:64,quantlinear:64,quantoz:64,quantpool:64,quartznet:[57,96],question:74,qui:[89,91],quick:64,quickli:[58,60,65,74,97],quisqu:91,quit:[73,74,96],quot:89,r:[63,88],rais:[67,95],raiseexcept:67,ram:[53,65,84],rand:[74,95],randn:[57,58,60,61,62,63,64,68,74,83,84,100],random:57,randomcrop:64,randomhorizontalflip:64,rang:[52,53,57,58,59,60,61,62,63,64,65,83,95,96],rank:86,rapidfuzz:57,rate:64,rather:67,raw:[63,86],re:[57,88,95],read:[4,5,31,32,33,34,48,57,61,86,88,97],read_calibration_cach:82,readcalibrationcach:[4,5,48],reader:88,readi:[57,61],readm:[57,58,59,60,62,63],realiz:70,realli:73,reason:[1,63,94,95],reattribut:89,recalibr:[31,34],receiv:95,recip:97,recipi:63,reciproc:79,recognit:[57,60,64,96,97],recomend:[31,32,33,34],recommend:[31,32,33,34,57,58,59,60,61,62,63,64,74,77,88,95,99],recompil:63,record:[62,64,66,94],rect:63,rectangl:63,recurs:66,recursivescriptmodul:62,redistribut:89,reduc:[58,60,62,63,64,67,69,71,95,96,97],redund:95,ref:88,refer:[52,64,69,71,74,87,92,95,97,99],referenc:[63,77],refit:[49,53,84,100],reflect:49,reflection_pad1d:79,reflection_pad2d:79,regard:[77,88],regardless:89,regex:[57,59],region:95,regist:[37,70,73,84,95],register_acc_op:95,register_acc_op_map:95,register_custom_acc_mapper_fn:95,registernodeconversionpattern:[73,74],registr:95,registri:[66,74],regular:64,reinterpret_cast:48,rel:65,relat:[50,88],relationship:[54,55],releas:[57,59,76,88],reload_model_output:95,reload_trt_mod:95,relu:[60,61,62,68,74,79,94],relu_:79,remain:[58,59,60,62,63,67,97],rememb:95,remov:[57,58,60,62,63,64,86],remove_contigu:67,remove_dropout:67,remove_to:67,render:86,rent:89,repack:70,repeat:[65,79],repeat_interleav:79,replac:[59,63,67,77],replication_pad1d:79,replication_pad2d:79,replication_pad3d:79,report:[25,48],reportable_log_level:81,repositori:[58,60,63,71,86,93,99],repres:[52,53,64,73,81,88,95],represent:[58,59,60,62,63,67,73,94,95,96],request:[57,58,59,60,61,74,83,99],requir:[31,34,53,57,58,59,60,61,62,63,64,65,66,67,74,81,83,84,86,95,97,98,99],require_full_compil:[49,53,58,60,62,63,84],requires_grad:79,resampi:57,research:[58,60,62,63,95],reserv:[46,47,48,49,57,58,59,60,61,62,63],reset:48,reshap:[79,99],residu:60,resiz:[58,60,61,99],resnet50:[60,61,63,99],resnet50_model:[60,61],resnet:[61,63,70,96,99],resnet_trt:70,resolut:96,resolv:[58,60,61,66,67,69,71],resolve_data_config:58,resourc:[57,60,61,62,63,66,97],respons:[31,34,58,60,61,64,70,88],respositori:59,rest:[88,89,95],restor:57,restrict:[53,84],restructuredtext:[88,89],result:[57,58,59,60,61,62,64,66,67,75,81,84,86,94,99],results_per_input:63,ret:67,rethink:58,return_tensor:59,reus:[67,95,97],revert:86,revis:[88,89],revisit:88,rfc:88,rgb:[58,60],rho_:88,rhoncu:91,right:[46,47,48,49,57,58,59,60,61,62,63,67,71,73,88],risu:91,rm:99,rn50_preprocess:[60,61,99],role:88,roll:79,roman:89,room:88,root:[46,47,48,49,57,58,59,60,61,62,63,64,77,86,97],roughli:68,round:[53,64,84],round_:64,rounding_mod:79,row:89,rsa:57,rst:[86,88],rsub:79,rtol:65,ruamel:57,rule:[77,84,95],ruler:88,run:[2,41,50,53,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,73,74,75,77,78,80,83,84,88,94,95,96,97,98,99,100,101],runetim:61,runner:57,running_loss:64,running_mean:79,running_var:79,runtim:[57,58,60,61,62,63,74,78],runtimeerror:95,rutrum:[89,91],s3:[58,60,61],s3transfer:57,s:[52,53,63,64,68,70,73,74,75,76,77,78,80,83,86,88,89,94,95,96,97,99],sacrebleu:57,sacremos:[57,59],safe:[73,84],safe_dla:83,safe_gpu:83,safeti:[53,65,83],sage:88,sagitti:[89,91],sai:[89,96],said:88,same:[58,60,61,63,70,74,77,86,88,94,95,99,100],sampl:[57,58,60,88,95,97,99],sample_input:95,sample_r:57,sapien:91,satisfi:[57,58,59,60,61,62,63,68,95],save:[31,34,48,57,58,60,61,62,63,64,65,70,74,75,83,84,95,96,98,99],save_checkpoint:64,save_restore_connector:57,save_timing_cach:[80,95],saw:74,scalar:[73,79],scalaropt_dim:79,scalartyp:[1,49,79],scale:[58,64,79,96,97],scale_factor:79,scale_grad_by_freq:79,scales_d:79,scales_h:79,scales_w:79,scatter:79,scelerisqu:91,schedul:[64,83,99],schema:[73,74],scheme:95,scientist:88,scikit:[57,63],scikit_imag:63,scipi:[57,63],scope:67,score:[58,60,61,63],scratch:[31,34],scratch_spac:99,screen:86,script:[35,59,63,64,67,68,74,75,83,84,94,100],script_model:[62,94,100],scriptclass:84,scripted_model:101,scriptmodul:[74,75,83,84],scroll:[86,90],sdk:[57,58,60,62,63,72],se:[57,96],seamlessli:[61,78],search:[59,78,86],second:[58,59,61,67,88,95],secondli:99,section:[61,64,74,86,88,89,90,92,95,97,99],secur:57,sed:[89,91],see:[35,57,58,59,60,61,62,63,67,70,74,77,83,84,88,94,95],seen:[88,89],segment:[57,68,96],segments_tensor:59,select:[18,31,32,33,34,41,53,58,60,62,63,65,70,75,77,79,83,84,87,90,95,97],self:[57,59,62,64,67,70,73,74,79,82,94,96,101],self_1:[70,74],self_int:79,sell:89,seller:87,seller_id:87,sem:91,semant:88,semper:91,send2trash:[57,60,61,62,63],send:99,senectu:91,sens:[74,88],sent:[58,60,61],sentenc:[59,88,96],sentencepiec:57,sentencepiecetoken:57,sentinel:[1,3],sentri:57,separ:[58,60,62,63,68,69,71],seq_relationship:59,sequenc:[57,59,80,88,95,96],sequenti:[60,61],serial:[37,41,65,69,71,74,83,84],seriali:84,serializ:[70,94],serialized_cach:[80,95],serialized_engin:84,serializinghtml:57,seril:70,serv:[65,70,78,95],server:57,servic:88,session:88,session_nam:88,set:[4,5,17,22,27,29,31,34,36,39,41,49,50,52,53,58,60,62,63,64,65,66,67,68,69,70,71,74,75,77,78,80,81,83,84,86,90,93,94,95,96,97,101],set_data_from_numpi:99,set_devic:[22,42,49,54,55,83],set_is_colored_output_on:[19,43,46,54,55,81],set_logging_prefix:[19,43,46,54,55,81],set_reportable_log_level:[19,43,46,54,55,59,64,81],set_typecheck_en:57,setalpha:73,setbeta:73,setnam:[73,74],setproctitl:57,setreshapedimens:74,setup:[47,57,64,97,99],setup_multiple_test_data:57,setup_multiple_validation_data:57,setup_test_data:57,setup_training_data:57,setup_validation_data:57,setuptool:[57,60,61,62,63],sever:[17,28,59,81],sgd:64,sh:77,sha256:77,shape:[49,51,52,53,57,58,59,60,62,63,64,65,68,73,75,79,80,83,84,95,99,101],shape_mod:83,shape_rang:[80,95],share:[53,65,76,77,84],shell_command:88,shellingham:57,shift:[76,77,79,88],ship:[64,74,98],shorthand:88,shortuuid:57,should:[1,4,5,31,34,49,53,58,61,64,65,66,67,68,69,71,73,78,81,83,84,86,88,91,95,97,99],show:[63,86,88,96],showcas:[58,60,61],shown:[59,74,86,88],shuffl:[57,64,74,97],shutterstock_780480850:[58,60,61],siberian:[58,60,61],siberian_huski:[60,61],side:[67,74,86],sidebar:[86,92],sigmoid:[79,95],sigmoid_:79,sign:99,signatur:84,signifi:[52,67],signific:[63,64,88],significantli:[67,86],similar:[63,73,74,95,98,100],simonyan:97,simpil:97,simpl:[57,58,59,60,62,63,64,88,89,94,95,96,99],simplejson:57,simplest:[59,99],simpli:[61,62,67,96],simplic:[58,60,63],simplifi:66,simul:[64,96],sin:[79,88],sinc:[59,62,67,74,88,94,95,97],sing:88,singl:[52,59,62,65,67,74,83,88,94,95,97],singular:73,sinh:79,sink:88,sit:[89,91],site:[57,58,59,60,61,62,63,64,67,74,77,88],six:[57,59,60,61,62,63,88],sixth:89,size:[4,5,48,52,53,57,58,59,60,61,62,63,64,65,67,68,74,79,80,83,84,86,95,96,97],size_t:[4,5,48,97],skip:65,slash:86,slice:79,slightli:95,slither:[58,60,61],sm:70,sm_output:[58,60,61],small:[64,67,99],smaller:[57,96],smallest:59,smi:[57,58,60,61,62],smmap:57,snake:[58,60,61],snowballstemm:57,so:[1,48,58,60,61,62,64,65,66,67,70,71,73,74,77,78,80,87,88,89,95,97],sodal:91,softmax:[58,60,61,63,64,67,79,95],softwar:[53,57,58,59,60,61,62,63,65,84,88],sole:[75,97],sollicitudin:91,solv:99,some:[58,59,60,66,67,69,70,71,73,74,87,88,95,97],some_funct:88,someth:[47,67,88,99],someurl:88,sort:[73,79,100],sortedcontain:57,soundfil:57,soupsiev:[57,61],sourc:[46,47,48,49,58,60,63,71,76,80,81,82,83,84,95],sourceforg:[88,89],sox:57,space:[88,89,97],spaces_and_linebreak:88,span:89,spars:[65,79],sparse_weight:[49,53,84,95],sparsiti:[53,65,84,95],speak:59,speaker:59,spec:[49,52,53,58,60,62,63,65,81,83,84,100],specif:[36,53,57,58,59,60,61,62,63,67,69,71,83,84,88,96],specifi:[4,5,58,59,60,61,62,63,64,65,73,75,77,78,81,83,84,86,88,95,99,100],specifii:83,speech:[57,96],speed:[57,58,59,60,61,63],speed_m:[57,59],speed_mean:[57,59],speedup:[57,58,59,60,96],sphinx:[57,86,87,88,89,93],sphinx_rtd_them:[88,89],sphinxcontrib:57,spin:99,spirit:88,split:[59,79,95],split_siz:79,split_with_s:79,sqrt:79,squar:79,squeez:[57,79,96],sr:57,sram:65,src:[70,72,79],ss:48,ssd300:63,ssd300_trt:70,ssd:70,ssd_300_trace:63,ssd_pyt_ckpt_amp:63,ssd_trace:65,ssd_trt:65,sstream:[21,48],stabl:[64,72,84,86],stack:[57,61,63,64,70,79,97],stage:[66,95],stand:[70,88],standalon:88,standard:[58,59,60,61,62,63,65,70,78,88,96,98,100],stapl:89,start:[59,61,63,64,66,68,74,77,79,89,95,96,100],start_dim:[74,79],start_step:79,start_tim:[57,58,59,60,61,62,63,64],startswith:64,stat:64,state:[57,58,59,60,64,66,73,74],state_dict:64,statement:[67,88],static_cast:48,statist:[59,64],statu:[48,89],std:[4,5,24,28,30,31,32,33,34,35,37,38,41,46,48,49,51,52,53,57,58,59,60,61,68,74,97,99,101],std_dev:[57,59],stderr:64,stdout:[40,81,83],steamlin:97,step:[57,58,59,60,61,62,63,64,78,79,95,96,97],stft:57,stick:86,sticki:[86,92],sticky_navig:[86,90],still:[48,63,68,95,97],stitch:[62,68,74],stop:74,storag:97,store:[3,5,53,65,66,70,73,74,84,94,95],str:[20,47,48,54,55,58,60,61,79,81,83,84,95],straight:73,strang:88,strategi:[59,83],stream:[58,60,61],street:89,strict:98,strict_type_constraint:95,stride:[60,61,62,63,64,79],string:[4,5,19,21,22,24,28,30,31,32,33,34,35,37,38,41,46,48,49,53,68,70,73,74,76,83,86,97],stringstream:48,strip_prefix:77,strong:[58,60,62,63,88],strongli:88,struct:[2,22,42,45,49,97],structur:[31,34,50,53,58,60,62,63,68,71,73,86,88,92,94,99],structuredtext:88,stt_en_citrinet_256:57,stt_en_citrinet_256_bs128_torch:57,stt_en_citrinet_256_bs1_torch:57,stt_en_citrinet_256_bs32_torch:57,stt_en_citrinet_256_bs8_torch:57,stub:89,studio:76,stuff:88,style:[46,47,48,49,86,88,89],style_external_link:86,sub:[79,88,94],sub_:79,subdirectori:56,subexpress:67,subgraph:[53,65,66,67,73,74],subject:71,submenu:92,submodul:[62,94],subplot:[58,60,61,63],subscript:88,subsect:88,subset:[64,96,97],substitut:88,subtitl:88,subtre:93,subword:[57,96],success:76,successfulli:[57,58,60,62,63],sudo:77,suffic:67,suggest:99,suit:[61,78],suitabl:95,sum:[53,64,79,84,95],summari:59,summarywrit:64,superscript:88,supervis:96,suppli:88,support:[1,2,3,29,35,50,52,53,58,60,61,62,63,64,65,68,72,74,75,76,77,78,83,84,86,87,94,95,99,101],sure:[74,75,77,99,101],suscipit:[89,91],suspendiss:91,swap:57,sy:64,symbol:[37,77,84,88,95,98],symlink:93,sympi:57,synchron:[57,58,59,60,61,62,63,64],system:[57,58,59,60,61,62,63,66,73,77,78,84],t1:79,t2:79,t:[1,2,3,49,50,61,62,64,67,73,74,77,79,86,88,89,94,95,97,99],t_:88,tabl:[77,92],tabul:57,tag:[88,99],take:[35,36,37,41,57,58,60,62,63,66,69,70,71,73,74,80,83,84,86,88,95,96,97,100],taken:[58,60,63,88],talk:78,tan:79,tanh:79,tanh_:79,tar:[77,88,97],tarbal:[74,97],target:[2,37,49,50,52,53,58,60,61,62,63,65,70,71,75,78,83,84,95,97,100,101],targets_:97,tarred_audio_filepath:57,task:[31,32,33,34,57,59,95,96,97],techinqu:74,techniqu:[64,97],tell:[67,68,69,70,71,73,88],tellu:91,tem:65,temp:[57,58,60,61,62],templat:[21,44,48,49,54,55,74,86],temporari:95,tempu:91,tensor:[3,37,48,49,52,53,57,58,59,60,61,62,63,64,65,66,67,68,70,73,74,79,80,83,84,94,95,96,97],tensor_mod:79,tensor_qu:64,tensor_quant:64,tensor_scalar:79,tensor_tensor:79,tensorboard:[57,64],tensorcontain:73,tensorformat:[22,42,49,52,54,55,83],tensorformatenum:[0,54],tensorlist:[68,73],tensorquant:64,tensorrt:[1,2,4,5,31,32,33,34,35,36,37,40,41,48,49,50,52,53,59,65,66,67,68,69,71,73,80,82,83,84,94,97],tensorrt_convert:95,tensorrt_root:76,tensorrtcompilespec:[84,100],tensorrtfil:23,tensort:95,teo:65,term:[83,88,89,96,97],termin:[29,65,74],terminado:[57,60,61,62,63],test:[57,58,59,60,61,62,63,64,65,71,77,88,89,95,96,97,99],test_acc:64,test_acc_trac:95,test_loss:64,test_pr:64,test_prob:64,test_ptq_dataloader_calibr:97,test_ptq_trt_calibr:97,test_py_modul:[88,92],testing_dataload:[64,97],testing_dataset:[64,97],testpath:[57,60,62,63],text:[57,59,63,81,89,91,96],tf32:[53,65],than:[57,59,61,67,78,87,88,96,98],thats:[66,97],the_model_repositori:99,thei:[50,59,63,64,65,66,67,70,73,75,77,83,86,88,95],them:[57,58,59,60,62,63,67,68,70,74,77,86,95,96],theori:[66,88],therebi:[70,96],therefor:[31,34,57,58,60,62,63,70,74,88,95,96],theres:98,therfor:98,theta:88,thi:[1,2,3,31,32,33,34,46,47,48,49,50,51,52,53,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,73,74,77,80,83,84,86,87,88,90,91,94,95,96,97,98,99,100],thicker:88,thin:88,thing1:88,thing2:88,thing3:88,thing:[62,77,88,95],think:[73,88],third:[61,89,95],third_parti:[71,77],this_arg_is_opt:95,those:[59,66,88],though:[63,65,71,73,74,94],thought:88,threadpoolctl:57,three:[52,61,69,71,80,83,88,89,95,96,99],threshold:65,through:[52,57,58,59,60,61,62,63,66,67,68,70,74,75,78,81,82,88,95,96],throughout:[58,60],throughput:58,throught:95,thrown:[53,84],thu:[57,62,88],tifffil:63,time:[53,57,58,59,60,61,62,63,64,65,66,67,69,70,71,73,74,80,84,86,88,95,97],time_99th:[57,59],time_m:[57,59],time_mean:[57,59],time_std:[57,59],timegraph:[57,59],timeit:[57,59],timeout:57,timing_cach:95,timing_cache_prefix:[80,95],timm:[58,60],tincidunt:91,tini:97,tinycss2:61,titan:[57,58,60,62,63],titl:[58,60,61],titles_onli:86,tl:61,tmp:74,toctre:86,tocustomclass:73,todim:74,todo:[86,95],togeth:[62,66,73,74],toilet:[58,60,61],token:[57,59,96],token_type_id:59,tokens_tensor:59,toler:65,toml:57,tomli:63,too:[77,86,88,89],took:59,tool:[58,59,60,62,63,73,74,95,96],toolchain:[71,77],toolkit:[57,60,61,62,63,64],top:[63,71,86,90],topk:79,topolog:59,torch:[1,2,3,5,21,22,31,32,33,34,35,36,37,40,41,48,49,50,51,52,53,59,65,66,67,68,69,70,71,73,77,80,83,84,94,97,101],torch_dir:76,torch_executed_modul:[49,53,68,84],torch_executed_op:[49,53,68,84],torch_scirpt_modul:94,torch_script_modul:74,torch_tensorrt:[0,1,2,3,4,5,15,17,18,23,46,47,48,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,68,74,75,78,95,96,97,98,99,100,101],torch_tensorrt_export:47,torch_tensorrt_major_vers:[20,47,54,55],torch_tensorrt_minor_vers:[20,47,54,55],torch_tensorrt_patch_vers:[20,47,54,55],torch_tensorrt_vers:[20,47,54,55],torch_tensorrtfil:54,torch_tensorrtnamespac:[0,54],torchbind:70,torchhub:[63,99],torchmetr:57,torchscript:[20,22,42,47,49,53,54,55,57,58,59,60,61,63,64,65,69,70,71,75,83,84,96,100,101],torchscriptstruct:[0,54],torchtrt:[47,57,68],torchtrt_api:[1,3,20,24,25,26,27,28,29,30,35,36,37,38,39,40,41,46,47,48,49,52,53,54,55],torchtrt_check:73,torchtrt_hidden:[20,47,54,55],torchtrt_runtime_exampl:98,torchtrt_unus:73,torchtrtc:[77,78,101],torchvis:[57,58,60,61,64,70,97,99,100],tornado:[57,60,61,62,63],toronto:97,tortor:91,total:64,totensor:[58,60,61,64,97,99],tovec:74,toward:97,tqdm:[57,59,64],trace:[57,59,63,64,68,74,84,94,95],traced_mlm_model:59,traced_model:[62,63,94],tracerwarn:64,track:[73,97],track_running_stat:[60,61],trade:63,tradit:[52,84,97],traget:36,trail:86,train:[31,32,33,34,53,57,58,59,60,63,65,74,75,78,79],trainabl:67,trained_vgg16_qat:64,trainer:57,training_dataload:64,training_dataset:64,traitlet:[57,60,61,62,63],transcrib:[57,96],transfer:87,transform:[57,58,60,61,62,63,64,74,97,99],transformed_img:99,transforms_factori:58,translat:[63,74],transmit:88,transpos:[79,95],trash:88,travers:[69,71],treat:[64,65],tree:[46,47,48,49,57,86,97,98],trigger:[62,74,95],trim:97,trim_sil:57,tristiqu:91,triton:78,triton_to_np_dtyp:99,tritoncli:99,tritonserv:99,trt:[1,2,4,5,50,52,57,66,67,70,73,74,79,95],trt_interpreter_result:95,trt_lenet_script:74,trt_mod:[64,68,74,97,101],trt_model:[59,63,68,99,100],trt_model_fp16:[58,59,60],trt_model_fp32:[58,60],trt_model_with_d:61,trt_model_without_d:61,trt_script_modul:62,trt_ts_modul:[57,62,68,75],trtinterpret:[80,95],trtinterpreterresult:[80,95],trtmodul:[80,95],trtorch:57,truck:64,truncat:[53,65,84],truncate_long_and_doubl:[49,53,57,59,84],trust:[60,61,62,63,64],ts:[47,57,62,65,68,74,75,78,83,94,100],ts_model:[68,74],tt:88,tue:[60,89],tune:[57,58,60,62,63,64],tup:79,tupl:[70,80,83,84,95],tupleconstruct:[67,70],tupleindex:79,tupleunpack:67,turn:[57,80,95],turpi:91,tutori:[58,60,61,94,97],two:[57,62,63,65,67,73,75,77,88,89,93,94,95,97,99],type:[1,2,3,32,33,53,54,55,57,58,59,60,61,62,63,64,65,66,70,73,74,75,76,80,81,83,84,88,95,96,97],type_fp32:99,typecheck:57,typenam:[4,5,31,32,33,34,48],typer:57,typic:[66,73,99],typing_extens:58,ubuntu:57,ugli:88,ui:87,uint64_t:[49,53],ultric:91,un:[58,60,97],unabl:[73,74],unbind:79,unbroken:88,uncas:[59,96],unchang:59,uncom:77,uncorr:[57,58,60,61,62],undefin:63,under:[46,47,48,49,57,58,59,60,61,62,63,71,88,95],underli:[1,2,3,50,73],understand:[58,60],unidecod:57,uniformli:96,union:[73,74,83,84],uniqu:[5,75],unique_ptr:[5,32,33],unit:[59,62,95],univers:88,unknown:83,unless:[57,58,59,60,61,62,63,95],unlik:[61,77,78,100],unlimit:86,unmask:59,unmasked_sent:59,unmasked_sentences_trt:59,unmasked_token:59,unmasked_tokens_trt:59,unpack_addmm:67,unpack_log_softmax:67,unqiue_ptr:5,unreferenc:88,unrestrict:88,unsign:64,unsqueez:[58,60,61,79],unstabl:71,unsupport:[35,53],unsur:73,untest:71,until:[61,66,71,73,77],unwrap:73,unwraptodoubl:73,unwraptoint:74,unzip:77,up:[57,58,59,60,62,63,64,66,67,69,70,71,88,94,95,96],updat:[57,61,64,80,95],upgrad:57,upload:[58,60,61,99],upon:86,upper:[64,89],upsample_bilinear2d:79,upsample_linear1d:79,upsample_nearest1d:79,upsample_nearest2d:79,upsample_nearest3d:79,upsample_trilinear3d:79,upscale_factor:79,upstream:74,uri:[63,88],url:[77,86,99],urllib3:[57,59],urna:91,us:[1,2,3,4,5,31,32,33,34,36,39,41,47,48,49,50,52,53,57,58,59,60,62,63,65,66,68,70,71,73,76,78,80,81,82,83,84,86,87,88,89,94,95,97,98,99,101],usag:[57,58,60,61,62,74,82,88,95],use_amp:57,use_cach:[4,5,32,33,48,82,97],use_cache_:48,use_cmake_generated_export_head:47,use_fb_fake_qu:64,use_input_stat:79,use_start_end_token:57,use_subset:97,usecas:[75,77],user:[46,52,57,58,59,60,61,62,63,68,69,70,71,74,75,77,78,88,89,97,99],userguid:64,userwarn:[57,58,63],using_int:[74,79],usr:77,usual:[63,64,86,95],ut:91,utf:[88,89],util:[58,60,62,64,73,74,84,96,97,99],v0:[60,61,85,99],v1:57,v2:[31,32,33,34,63],v:[57,58,59,60,62,63,65,89,99],val2017:63,val:[63,64],valid:[2,50,57,62,63,64,73],valu:[1,2,3,17,18,49,50,52,59,62,64,66,70,73,74,76,79,81,82,83,86,96],value_tensor_map:[66,73],vanilla:95,vare:61,vari:[58,59,60,80],variabl:[52,76,83,95],variant:[57,98],varient:67,varieti:99,variou:[57,95,101],variu:91,vcs_pageview_mod:86,vec:79,vector:[21,22,48,49,51,52,53,68,70,74,97,101],vehicula:91,vel:91,velit:91,venenati:91,venv:[57,58,59,60,61,62,63],verbios:65,verbos:[65,80,89,95],verbose_log:[80,95],veri:[64,89,90,95,97,99,100],verifi:[59,64,68],verison:77,version:[38,40,57,58,59,60,61,62,63,64,71,77,86,89,95,96,99],vertic:[86,88],vestibulum:[89,91],vgg16:[64,97],vgg16_base_ckpt:64,vgg16_qat_ckpt:64,vgg:[63,64,97],vi:88,via:[57,61,63,78,83,84,86,92,95,96,97,98],view:[79,86],vine_snak:58,virtual:[57,58,59,60,61,62,63,97],vision:[58,59,60,61,95,99],visit:[58,60,61,63],visitor:86,visual:[61,76],vita:[89,91],vivamu:91,viverra:91,vm:89,volatil:[57,58,60,61,62],volta:[58,60,62,63],volutpat:91,vs:[1,2,3,50,67,84,100],vulput:91,w1109:64,w:[57,58,60,63,65],w_hh:79,w_ih:79,wa:[57,58,59,60,62,63,67,70,74,88,95],wai:[58,60,64,65,74,77,94,95,96,97],walk:[57,58,59,60,62,63],walkthrough:96,wandb:57,want:[46,58,60,62,63,68,74,80,94,95,97,99,100],warm:[57,58,59,60,61,62,63,64],warn:[17,48,57,58,59,60,61,62,63,64,65,73,81],warranti:[57,58,59,60,61,62,63],wash:88,wcwidth:[57,60,61,62,63],we:[46,48,57,58,59,60,61,62,63,64,66,67,69,70,71,73,74,80,86,88,94,95,96,97,99],weak:88,web:88,webdataset:57,webencod:[57,60,61,62,63],websit:77,weight:[52,53,59,64,65,66,74,79,84,88,95,96],weight_decai:64,welcom:[74,95],welecom:[58,60],well:[58,59,60,62,63,74,77,81,88,97],were:[59,63,74],werkzeug:57,wget:[57,58,60,61,99],what:[5,63,67,74,75,88,94,95],whatev:[70,95],wheel:[57,77],when:[29,48,49,50,58,59,60,62,63,64,65,66,67,69,70,71,73,74,77,81,83,84,86,88,90,94,95,96,97],where:[57,58,60,62,66,67,73,74,84,89,95,97],wherev:95,whether:[5,65,80,83,87,95,97],which:[2,3,31,34,36,41,50,53,57,58,59,60,61,62,63,64,66,67,68,69,70,71,73,74,75,77,82,84,86,88,89,94,95,96,97,98,99,100],white:[63,88],whitespac:88,whl:[58,60,62,63,77],who:88,whole:[58,60,62,63,95],whose:[67,95],why:88,wide:[61,92],widespread:59,widget:[57,60,61,62,63],widgetsnbextens:[57,60,61,62,63],width:[58,60,61,88,96],window:88,window_nam:88,wish:89,wit:57,within:[53,57,58,59,60,61,62,63,65,69,71,84,86,88],without:[57,58,59,60,62,63,64,73,74,86,88,97],wl:98,won:61,wooden:88,word:[57,59,88,96],wordninja:57,work:[48,62,67,71,73,88,89,95,97],worker:97,workflow:[64,80,95,96,100],workspac:[53,65,77,80,84,95],workspace_s:[49,53,57,58,59,60,61,63,65,84],world:[58,60,62,63,88],would:[65,73,74,75,77,95,98,99,100],wp:[58,60,61,99],wrap:[64,69,70,71,74,88,91,95,100],wrapper:[73,95],wrapt:57,write:[4,5,31,32,33,34,48,57,58,59,60,61,62,63,66,74,78,88,95,97,99],write_calibration_cach:82,writecalibrationcach:[4,5,48],writer:64,written:[58,60],wrote:88,www:[57,58,59,60,61,62,63,74,77,86,88,97,99],x64:76,x86:98,x86_64:[71,77],x9:67,x:[6,11,37,47,58,60,62,63,64,67,74,77,84,89,94],x_0:88,x_1:88,x_2:88,x_3:88,x_4:88,x_:88,xavier:[49,58,60,62,63,101],xstr:[20,47,54,55],xx:99,xxx:95,y:[37,57,63,84,89],yahoo:89,yaml:[57,72],yarg:57,yarl:57,year:57,yet:[95,96],yield:59,you:[1,2,3,31,32,33,34,50,52,53,57,58,59,60,61,62,63,64,65,66,67,68,70,71,73,74,75,77,78,83,84,86,88,89,90,94,95,96,97,98,99,100],your:[57,58,59,60,61,62,63,64,73,74,75,77,78,86,88,89,93,94,98,100],yourself:[58,59,60,74],youtokentom:57,yy:[57,99],z:89,zero_grad:64,zero_point:79,zeroth:61,zip:[60,63,70,77],zipp:[57,60,61,62,63],zisserman:97},titles:["Class Hierarchy","Class DataType","Class Device::DeviceType","Class TensorFormat","Template Class Int8CacheCalibrator","Template Class Int8Calibrator","Define STR","Define TORCH_TENSORRT_PATCH_VERSION","Define TORCH_TENSORRT_MAJOR_VERSION","Define TORCH_TENSORRT_MINOR_VERSION","Define TORCHTRT_API","Define XSTR","Define TORCHTRT_HIDDEN","Define TORCH_TENSORRT_VERSION","Directory cpp","Directory include","Directory torch_tensorrt","Enum Level","Enum EngineCapability","File logging.h","File macros.h","File ptq.h","File torch_tensorrt.h","File Hierarchy","Function torch_tensorrt::logging::get_logging_prefix","Function torch_tensorrt::logging::get_reportable_log_level","Function torch_tensorrt::logging::get_is_colored_output_on","Function torch_tensorrt::logging::set_reportable_log_level","Function torch_tensorrt::logging::log","Function torch_tensorrt::logging::set_is_colored_output_on","Function torch_tensorrt::logging::set_logging_prefix","Template Function torch_tensorrt::ptq::make_int8_cache_calibrator","Template Function torch_tensorrt::ptq::make_int8_calibrator","Template Function torch_tensorrt::ptq::make_int8_calibrator","Template Function torch_tensorrt::ptq::make_int8_cache_calibrator","Function torch_tensorrt::torchscript::check_method_operator_support","Function torch_tensorrt::torchscript::compile","Function torch_tensorrt::torchscript::embed_engine_in_new_module","Function torch_tensorrt::get_build_info","Function torch_tensorrt::set_device","Function torch_tensorrt::dump_build_info","Function torch_tensorrt::torchscript::convert_method_to_trt_engine","Namespace torch_tensorrt","Namespace torch_tensorrt::logging","Namespace torch_tensorrt::ptq","Namespace torch_tensorrt::torchscript","Program Listing for File logging.h","Program Listing for File macros.h","Program Listing for File ptq.h","Program Listing for File torch_tensorrt.h","Struct Device","Struct GraphInputs","Struct Input","Struct CompileSpec","Torch-TensorRT C++ API","Full API","Full API","Torch-TensorRT Getting Started - CitriNet","Torch-TensorRT Getting Started - EfficientNet-B0","Masked Language Modeling (MLM) with Hugging Face BERT Transformer","Torch-TensorRT Getting Started - ResNet 50","Torch-TensorRT - Using Dynamic Shapes","Torch-TensorRT Getting Started - LeNet","Object Detection with Torch-TensorRT (SSD)","Deploying Quantization Aware Trained models in INT8 using Torch-TensorRT","torchtrtc","Conversion Phase","Lowering Phase","Partitioning Phase","Compiler Phases","Runtime Phase","System Overview","Useful Links for Torch-TensorRT Development","Writing Converters","Using Torch-TensorRT in C++","Using Torch-TensorRT in Python","Building Torch-TensorRT on Windows","Installation","Torch-TensorRT","Operators Supported","torch_tensorrt.fx","torch_tensorrt.logging","torch_tensorrt.ptq","torch_tensorrt","torch_tensorrt.ts","Changelog","Configuration","5. :mod:`test_py_module`","3. Paragraph Level Markup","4. Lists & Tables","1. Long Sticky Nav","1. Structural Elements","<no title>","Installation","Creating a TorchScript Module","Torch-TensorRT (FX Frontend) User Guide","Example notebooks","Post Training Quantization (PTQ)","Deploying Torch-TensorRT Programs","Serving a Torch-TensorRT model with Triton","Using Torch-TensorRT Directly From PyTorch","DLA"],titleterms:{"1":[90,99],"10":90,"11":90,"12":90,"13":90,"14":90,"15":90,"16":90,"17":90,"18":90,"19":90,"2":[90,91,99],"20":90,"3":[90,99],"4":90,"5":90,"50":60,"6":[63,90],"7":[63,90],"8":90,"9":90,"class":[0,1,2,3,4,5,21,22,42,44,45,54,55,80,82,83],"enum":[17,18,19,22,42,43,54,55,82,83],"function":[19,21,22,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,54,55,61,72,80,83,84],"long":[90,92],A:88,And:88,But:89,By:[19,20],Or:67,The:[74,88],To:67,aarch64:77,abi:[70,77],acc:95,acceler:96,add:95,addmm:67,admonit:88,advic:73,ahead:78,an:92,api:[54,55,56,72,77,78],applic:97,arg:[73,87],automat:68,avail:72,awar:[64,96],b0:58,background:[70,73],base:[4,5,52,86],benchmark:[57,61,63,64],bert:[59,96],binari:77,block:88,branch:67,build:[61,76,77,86,99],bullet:89,c:[54,72,74,77,78,96,97],can:89,caption:[89,92],center:88,ch:88,changelog:85,check_method_operator_support:35,choos:77,citat:[88,97],citrinet:[57,96],cli:[77,78],client:99,cmake:77,code:[67,88],compil:[36,69,71,74,76,77,78,96],compilespec:53,compound:88,conclus:[62,63],configur:[76,86],construct:70,content:[19,20,21,22,42,43,44,45,57,58,59,60,62,63,86,87,88,89,90,91],context:[73,86],contigu:67,contract:73,contributor:78,convers:[66,69,71,73],convert:[66,73,74,79,95],convert_method_to_trt_engin:41,cpp:[14,19,20,21,22,68],creat:[94,97],creativ:88,cudnn:77,current:79,custom:74,cxx11:77,data:[61,87],datatyp:1,dead:67,debug:77,deep:96,deeper:89,defin:[6,7,8,9,10,11,12,13,20,54,55],definit:[19,20,21,22,89],demo:92,depend:77,deploi:[64,96,98],descript:[58,60,63],deseri:70,detail:63,detect:[63,96],detector:63,develop:72,devic:[2,50],devicetyp:2,dimens:72,direct:88,directli:100,directori:[14,15,16,56],disk:94,distribut:77,dla:101,doctest:88,documen:78,document:[1,2,3,4,5,6,7,8,9,10,11,12,13,17,18,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,50,51,52,53,72,78,91,92],down:89,download:[61,88,93],dropout:67,dump_build_info:40,dynam:[61,96],easier:72,efficentnet:96,efficientnet:58,element:91,elimin:67,eliminatecommonsubexpress:67,embed_engine_in_new_modul:37,emphas:88,engin:[70,95],enginecap:18,enumer:89,envior:77,evalu:[66,79],exampl:[88,90,96],execept:67,executor:70,expect:72,face:[59,96],fallback:[67,68],field:89,figur:88,file:[16,19,20,21,22,23,46,47,48,49,54,56],flatten:67,footnot:88,format:70,fp16:[57,58,60],fp32:[57,58,60],freez:67,from:[61,77,100],frontend:[95,96],full:[54,55,56],fuse:67,fx2trt:95,fx:[80,95,96],gaurd:67,gener:87,get:[57,58,60,61,62,78],get_build_info:38,get_is_colored_output_on:26,get_logging_prefix:24,get_reportable_log_level:25,giant:89,git:93,glossari:88,gpu:78,graph:[67,70],graphinput:51,grid:89,guarante:73,guid:95,h:[19,20,21,22,46,47,48,49,68],half:[57,58,60],have:89,hierarchi:[0,23,54],hlist:89,hole:89,hood:74,how:[86,95,97],html:86,hub:61,hug:[59,96],ien:88,imag:[88,89],includ:[15,19,20,21,22],incred:92,index:87,indic:78,infer:[63,99],inherit:[4,5,52],inlin:88,input:52,instal:[76,77,93],int8:[64,96],int8cachecalibr:4,int8calibr:5,ir:72,jetson:77,jit:78,languag:[59,96],layer:72,learn:[57,58,59,60,62,63,96],lenet:[62,96],level:[17,86,88,89],librari:[77,98],libtorchtrt:98,like:89,line:88,linear:67,link:[72,88],list:[46,47,48,49,89],liter:88,local:77,log:[19,24,25,26,27,28,29,30,43,46,81],logsoftmax:67,loop:67,lower:[67,69,71],macro:[20,47],make_int8_cache_calibr:[31,34],make_int8_calibr:[32,33],markup:88,mask:[59,96],math:88,measur:63,menu:[90,92],meta:88,miss:95,mlm:[59,96],mod:87,model:[58,59,60,61,62,63,64,95,96,99],modul:[67,74,94],multibox:63,namespac:[19,20,21,22,42,43,44,45,54,55],nativ:77,native_op:72,nav:90,nest:[2,50],next:[57,58,59,60,61,62],node:66,notebook:96,number:[88,89],nvidia:78,object:[57,58,59,60,62,63,96],one:89,op:[70,95],oper:[74,79],optim:99,optimz:67,option:[86,87,89],other:73,overview:[57,58,60,62,63,64,71],own:97,packag:[77,98],page:86,paragraph:[88,91],paramet:87,partit:[68,69,71],partitoninfo:68,pass:67,pattern:67,peephol:67,perform:64,phase:[66,67,68,69,70,71],plugin:98,post:97,pre:77,precis:[57,58,60],precompil:77,prerequisit:77,program:[46,47,48,49,98],project:86,ptq:[21,31,32,33,34,44,48,82,97],python:[72,75,77,78,94,97],pytorch:[62,72,78,95,96,100],quantiz:[64,96,97],queri:99,quickstart:74,quot:88,rabbit:89,read:72,redund:67,refer:[63,88],regist:74,relationship:[2,4,5,50,52],releas:77,remov:67,replac:88,resnet50:96,resnet:60,respons:73,result:[63,70],right:77,rubric:88,runtim:[69,70,71,98],s:[57,58,59,60,61,62],sampl:[61,63],save:94,script:62,second:89,section:91,segmentedblock:68,serial:70,serv:[96,99],server:99,set:[61,99],set_devic:39,set_is_colored_output_on:29,set_logging_prefix:30,set_reportable_log_level:27,setup:77,shape:[61,96],shape_analysi:68,shot:63,sidebar:88,simpl:61,singl:[57,58,60,63],so:98,sometim:72,sourc:77,speedup:63,ssd:[63,96],start:[57,58,60,62,78],step:99,sticki:90,str:6,struct:[50,51,52,53,54,55],structur:91,subdirectori:[14,15],submenu:90,submodul:83,subsect:91,subsubmenu:90,subsubsect:91,support:79,system:71,tabl:[86,87,88,89,90,91],tarbal:77,target:88,templat:[4,5,31,32,33,34],tensorformat:3,tensorrt:[54,57,58,60,61,62,63,64,70,72,74,75,76,77,78,95,96,98,99,100],test_py_modul:87,text:88,theme:[86,92],thi:[89,92],through:79,time:78,titl:88,toc:86,topic:88,torch:[54,57,58,60,61,62,63,64,72,74,75,76,78,95,96,98,99,100],torch_tensorrt:[16,19,20,21,22,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,49,80,81,82,83,84],torch_tensorrt_major_vers:8,torch_tensorrt_minor_vers:9,torch_tensorrt_patch_vers:7,torch_tensorrt_vers:13,torchscript:[35,36,37,41,45,62,74,78,94],torchtrt_api:10,torchtrt_hidden:12,torchtrtc:[65,74],trace:62,tracer:95,train:[64,96,97],transform:[59,96],triton:99,trt:61,ts:84,tupl:67,tutori:78,type:[4,5,50,52],under:74,unpack:67,unrol:67,unsupport:74,up:[61,99],us:[61,64,67,72,74,75,77,96,100],user:95,util:[57,61,63],version:70,via:93,visual:63,wai:88,weight:73,what:[57,58,59,60,61,62,73],wide:86,window:76,without:61,work:[61,74,94],write:73,xstr:11,your:[97,99]}}) \ No newline at end of file diff --git a/docs/v1.2.0/sitemap.xml b/docs/v1.2.0/sitemap.xml new file mode 100644 index 0000000000..91f3153893 --- /dev/null +++ b/docs/v1.2.0/sitemap.xml @@ -0,0 +1 @@ +https://nvidia.github.io/Torch-TensorRT/_cpp_api/class_view_hierarchy.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/classtorch__tensorrt_1_1DataType.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/classtorch__tensorrt_1_1Device_1_1DeviceType.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/classtorch__tensorrt_1_1TensorFormat.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8CacheCalibrator.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/classtorch__tensorrt_1_1ptq_1_1Int8Calibrator.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/define_macros_8h_1a18d295a837ac71add5578860b55e5502.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/define_macros_8h_1a282fd3c0b1c3a215148ae372070e1268.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/define_macros_8h_1a31398a6d4d27e28817afb0f0139e909e.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/define_macros_8h_1a35703561b26b1a9d2738ad7d58b27827.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/define_macros_8h_1abd1465eb38256d3f22cc1426b23d516b.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/define_macros_8h_1abe87b341f562fd1cf40b7672e4d759da.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/define_macros_8h_1ad19939408f7be171a74a89928b36eb59.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/define_macros_8h_1adad592a7b1b7eed529cdf6acd584c883.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/dir_cpp.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/dir_cpp_include.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/dir_cpp_include_torch_tensorrt.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/enum_logging_8h_1a130f65408ad8cbaee060f05e8db69558.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/enum_torch__tensorrt_8h_1a3fbe5d72e4fc624dbd038853079620eb.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/file_cpp_include_torch_tensorrt_logging.h.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/file_cpp_include_torch_tensorrt_macros.h.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/file_cpp_include_torch_tensorrt_ptq.h.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/file_cpp_include_torch_tensorrt_torch_tensorrt.h.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/file_view_hierarchy.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_logging_8h_1a0593f776f469c20469e2f729fc7861a3.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_logging_8h_1a0c012cb374addd90eb1f42eaec570650.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_logging_8h_1a56e110feaaba2c3fd44bd201fd21a76a.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_logging_8h_1a7cb50492421ea9de4e3db895819df6f2.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_logging_8h_1ac46ac0901cb97e3ae6e93b45f24e90b8.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_logging_8h_1ad2efd47b6c3689e58ccc595680579ae5.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_logging_8h_1af8f3443813315af7901903d25dd495cc.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_ptq_8h_1a226e3c83379d1012cde8578c1c86b16c.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_ptq_8h_1a6186e305f47c1d94b6130ef6c7f7e178.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_ptq_8h_1a83ff2be7e0b80bc7434de415861dc039.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_ptq_8h_1a9835f6e605dce1abf442a55b64d6dffa.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_torch__tensorrt_8h_1a5b405fd3bf3c8fc2e2a54cbbab979797.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_torch__tensorrt_8h_1a6e19490a08fb1553c9dd347a5ae79db9.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_torch__tensorrt_8h_1a710df824a7718b440e4bc17bf9693cef.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_torch__tensorrt_8h_1ac4ab8313ae72c2c899ea31548b528528.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_torch__tensorrt_8h_1ad1acd06eaeaffbbcf6e7ebf426891384.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_torch__tensorrt_8h_1ad6a4ee8ca6c8f6e5519eb1128ec7f4a1.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/function_torch__tensorrt_8h_1ae8d56472106eeef37fbe51ff7f40c9b2.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/namespace_torch_tensorrt.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/namespace_torch_tensorrt__logging.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/namespace_torch_tensorrt__ptq.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/namespace_torch_tensorrt__torchscript.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_logging.h.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_macros.h.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_ptq.h.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/program_listing_file_cpp_include_torch_tensorrt_torch_tensorrt.h.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/structtorch__tensorrt_1_1Device.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/structtorch__tensorrt_1_1GraphInputs.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/structtorch__tensorrt_1_1Input.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/structtorch__tensorrt_1_1torchscript_1_1CompileSpec.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/torch_tensort_cpp.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/unabridged_api.htmlhttps://nvidia.github.io/Torch-TensorRT/_cpp_api/unabridged_orphan.htmlhttps://nvidia.github.io/Torch-TensorRT/_notebooks/CitriNet-example.htmlhttps://nvidia.github.io/Torch-TensorRT/_notebooks/EfficientNet-example.htmlhttps://nvidia.github.io/Torch-TensorRT/_notebooks/Hugging-Face-BERT.htmlhttps://nvidia.github.io/Torch-TensorRT/_notebooks/Resnet50-example.htmlhttps://nvidia.github.io/Torch-TensorRT/_notebooks/dynamic-shapes.htmlhttps://nvidia.github.io/Torch-TensorRT/_notebooks/lenet-getting-started.htmlhttps://nvidia.github.io/Torch-TensorRT/_notebooks/ssd-object-detection-demo.htmlhttps://nvidia.github.io/Torch-TensorRT/_notebooks/vgg-qat.htmlhttps://nvidia.github.io/Torch-TensorRT/contributors/conversion.htmlhttps://nvidia.github.io/Torch-TensorRT/contributors/lowering.htmlhttps://nvidia.github.io/Torch-TensorRT/contributors/partitioning.htmlhttps://nvidia.github.io/Torch-TensorRT/contributors/phases.htmlhttps://nvidia.github.io/Torch-TensorRT/contributors/runtime.htmlhttps://nvidia.github.io/Torch-TensorRT/contributors/system_overview.htmlhttps://nvidia.github.io/Torch-TensorRT/contributors/useful_links.htmlhttps://nvidia.github.io/Torch-TensorRT/contributors/writing_converters.htmlhttps://nvidia.github.io/Torch-TensorRT/index.htmlhttps://nvidia.github.io/Torch-TensorRT/indices/supported_ops.htmlhttps://nvidia.github.io/Torch-TensorRT/py_api/logging.htmlhttps://nvidia.github.io/Torch-TensorRT/py_api/ptq.htmlhttps://nvidia.github.io/Torch-TensorRT/py_api/torch_tensorrt.htmlhttps://nvidia.github.io/Torch-TensorRT/py_api/ts.htmlhttps://nvidia.github.io/Torch-TensorRT/src/pytorch-sphinx-theme/docs/changelog.htmlhttps://nvidia.github.io/Torch-TensorRT/src/pytorch-sphinx-theme/docs/configuring.htmlhttps://nvidia.github.io/Torch-TensorRT/src/pytorch-sphinx-theme/docs/demo/api.htmlhttps://nvidia.github.io/Torch-TensorRT/src/pytorch-sphinx-theme/docs/demo/demo.htmlhttps://nvidia.github.io/Torch-TensorRT/src/pytorch-sphinx-theme/docs/demo/lists_tables.htmlhttps://nvidia.github.io/Torch-TensorRT/src/pytorch-sphinx-theme/docs/demo/long.htmlhttps://nvidia.github.io/Torch-TensorRT/src/pytorch-sphinx-theme/docs/demo/structure.htmlhttps://nvidia.github.io/Torch-TensorRT/src/pytorch-sphinx-theme/docs/index.htmlhttps://nvidia.github.io/Torch-TensorRT/src/pytorch-sphinx-theme/docs/installing.htmlhttps://nvidia.github.io/Torch-TensorRT/tutorials/creating_torchscript_module_in_python.htmlhttps://nvidia.github.io/Torch-TensorRT/tutorials/getting_started_with_cpp_api.htmlhttps://nvidia.github.io/Torch-TensorRT/tutorials/getting_started_with_python_api.htmlhttps://nvidia.github.io/Torch-TensorRT/tutorials/installation.htmlhttps://nvidia.github.io/Torch-TensorRT/tutorials/ptq.htmlhttps://nvidia.github.io/Torch-TensorRT/tutorials/runtime.htmlhttps://nvidia.github.io/Torch-TensorRT/tutorials/torchtrtc.htmlhttps://nvidia.github.io/Torch-TensorRT/tutorials/use_from_pytorch.htmlhttps://nvidia.github.io/Torch-TensorRT/tutorials/using_dla.htmlhttps://nvidia.github.io/Torch-TensorRT/genindex.htmlhttps://nvidia.github.io/Torch-TensorRT/search.html \ No newline at end of file diff --git a/docs/v1.2.0/src/pytorch-sphinx-theme/docs/changelog.html b/docs/v1.2.0/src/pytorch-sphinx-theme/docs/changelog.html new file mode 100644 index 0000000000..80132e4166 --- /dev/null +++ b/docs/v1.2.0/src/pytorch-sphinx-theme/docs/changelog.html @@ -0,0 +1,657 @@ + + + + + + + + + + + + + Changelog — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Changelog

+

v0.0.1

+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+ + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/src/pytorch-sphinx-theme/docs/configuring.html b/docs/v1.2.0/src/pytorch-sphinx-theme/docs/configuring.html new file mode 100644 index 0000000000..4a60a6bd74 --- /dev/null +++ b/docs/v1.2.0/src/pytorch-sphinx-theme/docs/configuring.html @@ -0,0 +1,760 @@ + + + + + + + + + + + + + Configuration — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Configuration

+

You can configure different parts of the theme.

+
+

Project-wide Configuration

+
+

HTML Theme Options

+

The theme’s project-wide options are defined in the pytorch_sphinx_theme/theme.conf +file of this repository, and can be defined in your project’s conf.py via +html_theme_options. For example:

+
html_theme_options = {
+    'canonical_url': '',
+    'analytics_id': '',
+    'logo_only': False,
+    'display_version': True,
+    'prev_next_buttons_location': 'bottom',
+    'style_external_links': False,
+    'vcs_pageview_mode': '',
+    # Toc options
+    'collapse_navigation': True,
+    'sticky_navigation': True,
+    'navigation_depth': 4,
+    'includehidden': True,
+    'titles_only': False
+}
+
+
+

The following options are available:

+
+

Base options

+
    +
  • canonical_url String. This will specify a canonical url +to let search engines know they should give higher ranking to latest version of the docs. +The url points to the root of the documentation and requires a trailing slash.

  • +
  • analytics_id String. Change the Google Analytics ID that is included on pages.

  • +
  • display_version Bool. With this disabled, the version number isn’t shown at the top of the sidebar.

  • +
  • prev_next_buttons_location String. can take the value bottom, top, both , or None +and will display the “Next” and “Previous” buttons accordingly.

  • +
  • style_external_links Bool. Add an icon next to external links. Defaults to False.

  • +
  • vcs_pageview_mode String. Changes how to view files when using display_github, display_gitlab, etc. +When using Github or Gitlab this can be: blob (default), edit, or raw, +on Bitbucket, this can be either: view (default) or edit.

  • +
+
+
+

TOC Options

+

These effect how we display the Table of Contents in the side bar. You can read more about them here: http://www.sphinx-doc.org/en/stable/templating.html#toctree

+
    +
  • collapse_navigation Bool. With this enabled, you will lose the [+] drop downs next to each section in the sidebar.

  • +
  • sticky_navigation Bool. This causes the sidebar to scroll with the main page content as you scroll the page.

  • +
  • navigation_depth Int. Indicate the max depth of the tree; by default, 4 levels are included; +set it to -1 to allow unlimited depth.

  • +
  • includehidden Bool. Specifies if the sidebar includes toctrees marked with the :hidden: option

  • +
  • titles_only Bool. If True, removes headers within a page from the sidebar.

  • +
+
+

Note

+

Setting collapse_navigation to False and using a high navigation_depth +can cause projects with many files and a deep file structure to generate HTML files +that are significantly larger in file size and much longer compilation times.

+
+
+
+
+

HTML Context Options

+

TODO.

+
+
+
+

Page-level Configuration

+

Pages support metadata that changes how the theme renders. +You can currently add the following:

+
    +
  • :github_url: This will force the “Edit on GitHub” to the configured URL

  • +
  • :bitbucket_url: This will force the “Edit on Bitbucket” to the configured URL

  • +
  • :gitlab_url: This will force the “Edit on GitLab” to the configured URL

  • +
+
+
+

How the Table of Contents builds

+

Currently the left menu will build based upon any toctree(s) defined in your index.rst file. +It outputs 2 levels of depth, which should give your visitors a high level of access to your +docs. If no toctrees are set the theme reverts to sphinx’s usual local toctree.

+

It’s important to note that if you don’t follow the same styling for your rST headers across +your documents, the toctree will misbuild, and the resulting menu might not show the correct +depth when it renders.

+

Also note that by default the table of contents is set with includehidden=True. This allows you +to set a hidden toc in your index file with the :hidden: property that will allow you +to build a toc without it rendering in your index.

+

By default, the navigation will “stick” to the screen as you scroll. However if your toc +is vertically too large, it will revert to static positioning. To disable the sticky nav +altogether change the setting in conf.py.

+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/src/pytorch-sphinx-theme/docs/demo/api.html b/docs/v1.2.0/src/pytorch-sphinx-theme/docs/demo/api.html new file mode 100644 index 0000000000..a863828101 --- /dev/null +++ b/docs/v1.2.0/src/pytorch-sphinx-theme/docs/demo/api.html @@ -0,0 +1,711 @@ + + + + + + + + + + + + + 5. :mod:`test_py_module` — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • 5. :mod:`test_py_module`
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

5. :mod:`test_py_module`

+ +
+

5.1. Generated Index

+

Part of the sphinx build process in generate and index file: Index.

+
+
+

5.2. Optional parameter args

+

At this point optional parameters cannot be generated from code. +However, some projects will manually do it, like so:

+

This example comes from django-payments module docs.

+
+
+payments.dotpay.DotpayProvider(seller_id, pin[, channel=0[, lock=False], lang='pl'])
+

This backend implements payments using a popular Polish gateway, Dotpay.pl.

+

Due to API limitations there is no support for transferring purchased items.

+
+
Param seller_id
+

Seller ID assigned by Dotpay

+
+
Param pin
+

PIN assigned by Dotpay

+
+
Param channel
+

Default payment channel (consult reference guide)

+
+
Param lang
+

UI language

+
+
Param lock
+

Whether to disable channels other than the default selected above

+
+
+
+ +
+
+

5.3. Data

+

Some data link :data:`Data_item_1`.

+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/src/pytorch-sphinx-theme/docs/demo/demo.html b/docs/v1.2.0/src/pytorch-sphinx-theme/docs/demo/demo.html new file mode 100644 index 0000000000..a2dee9c985 --- /dev/null +++ b/docs/v1.2.0/src/pytorch-sphinx-theme/docs/demo/demo.html @@ -0,0 +1,1267 @@ + + + + + + + + + + + + + + + 3. Paragraph Level Markup — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • 3. Paragraph Level Markup
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

3. Paragraph Level Markup

+ +
+

3.1. Inline Markup

+

Paragraphs contain text and may contain inline markup: emphasis, strong emphasis, inline literals, +standalone hyperlinks (http://www.python.org), external hyperlinks (Python 5), internal cross-references (example), +external hyperlinks with embedded URIs (Python web site), footnote references +(manually numbered 1, anonymous auto-numbered 3, labeled auto-numbered 2, or symbolic *), +citation references (12), substitution references (EXAMPLE), and inline hyperlink targets +(see Targets below for a reference back to here). Character-level inline markup is also possible +(although exceedingly ugly!) in reStructuredText. Problems are indicated by |problematic| +text (generated by processing errors; this one is intentional).

+

Also with sphinx.ext.autodoc, which I use in the demo, I can link to test_py_module.test.Foo. +It will link you right my code documentation for it.

+

The default role for interpreted text is Title Reference. Here are some explicit interpreted text roles: +a PEP reference (PEP 287); an RFC reference (RFC 2822); a subscript; a superscript; +and explicit roles for standard inline markup.

+

GUI labels are a useful way to indicate that Some action is to be taken by the user. +The GUI label should not run over line-height so as not to interfere with text from adjacent lines.

+

Key-bindings indicate that the read is to press a button on the keyboard or mouse, +for example MMB and Shift-MMB. Another useful markup to indicate a user action +is to use menuselection this can be used to show short and long menus in software. +For example, and menuselection can be seen here that breaks is too long to fit on this line. +My ‣ Software ‣ Some menu ‣ Some sub menu 1 ‣ sub menu 2.

+

Let’s test wrapping and whitespace significance in inline literals: +This is an example of --inline-literal --text, --including some-- +strangely--hyphenated-words.  Adjust-the-width-of-your-browser-window +to see how the text is wrapped.  -- ---- --------  Now note    the +spacing    between the    words of    this sentence    (words +should    be grouped    in pairs).

+

If the --pep-references option was supplied, there should be a live link to PEP 258 here.

+
+
+

3.2. Math

+

This is a test. Here is an equation: +\(X_{0:5} = (X_0, X_1, X_2, X_3, X_4)\). +Here is another:

+
+(1)\[\nabla^2 f = +\frac{1}{r^2} \frac{\partial}{\partial r} +\left( r^2 \frac{\partial f}{\partial r} \right) + +\frac{1}{r^2 \sin \theta} \frac{\partial f}{\partial \theta} +\left( \sin \theta \, \frac{\partial f}{\partial \theta} \right) + +\frac{1}{r^2 \sin^2\theta} \frac{\partial^2 f}{\partial \phi^2}\]
+

You can add a link to equations like the one above (1) by using :eq:.

+
+
+

3.3. Meta

+
+
+

3.4. Blocks

+
+

3.4.1. Literal Blocks

+

Literal blocks are indicated with a double-colon (“::”) at the end of +the preceding paragraph (over there -->). They can be indented:

+
if literal_block:
+    text = 'is left as-is'
+    spaces_and_linebreaks = 'are preserved'
+    markup_processing = None
+
+
+

Or they can be quoted without indentation:

+
>> Great idea!
+>
+> Why didn't I think of that?
+
+
+
+
+

3.4.2. Line Blocks

+
+
This is a line block. It ends with a blank line.
+
+
Each new line begins with a vertical bar (“|”).
+
Line breaks and initial indents are preserved.
+
+
Continuation lines are wrapped portions of long lines; +they begin with a space in place of the vertical bar.
+
+
The left edge of a continuation line need not be aligned with +the left edge of the text above it.
+
+
+
+
This is a second line block.
+

+
Blank lines are permitted internally, but they must begin with a “|”.
+
+

Take it away, Eric the Orchestra Leader!

+
+
+
A one, two, a one two three four
+

+
Half a bee, philosophically,
+
+
must, ipso facto, half not be.
+
+
But half the bee has got to be,
+
+
vis a vis its entity. D’you see?
+

+
+
But can a bee be said to be
+
+
or not to be an entire bee,
+
+
when half the bee is not a bee,
+
+
due to some ancient injury?
+

+
+
+
+
Singing…
+
+
+
+
+

3.4.3. Block Quotes

+

Block quotes consist of indented body elements:

+
+

My theory by A. Elk. Brackets Miss, brackets. This theory goes +as follows and begins now. All brontosauruses are thin at one +end, much much thicker in the middle and then thin again at the +far end. That is my theory, it is mine, and belongs to me and I +own it, and what it is too.

+

—Anne Elk (Miss)

+
+
+
+

3.4.4. Doctest Blocks

+
>>> print 'Python-specific usage examples; begun with ">>>"'
+Python-specific usage examples; begun with ">>>"
+>>> print '(cut and pasted from interactive Python sessions)'
+(cut and pasted from interactive Python sessions)
+
+
+
+
+

3.4.5. Code Blocks

+
# parsed-literal test
+curl -O http://someurl/release-master (1.2.0).tar-gz
+
+
Code Blocks can have captions.
+
{
+"windows": [
+    {
+    "panes": [
+        {
+        "shell_command": [
+            "echo 'did you know'",
+            "echo 'you can inline'"
+        ]
+        },
+        {
+        "shell_command": "echo 'single commands'"
+        },
+        "echo 'for panes'"
+    ],
+    "window_name": "long form"
+    }
+],
+"session_name": "shorthands"
+}
+
+
+
+
+

3.4.5.1. Emphasized lines with line numbers

+
1def some_function():
+2    interesting = False
+3    print 'This line is highlighted.'
+4    print 'This one is not...'
+5    print '...but this one is.'
+
+
+
+
+
+ +
+

3.6. References

+
+

3.6.1. Footnotes

+
+
1(1,2)
+

A footnote contains body elements, consistently indented by at +least 3 spaces.

+

This is the footnote’s second paragraph.

+
+
2(1,2)
+

Footnotes may be numbered, either manually (as in 1) or +automatically using a “#”-prefixed label. This footnote has a +label so it can be referred to from multiple places, both as a +footnote reference (2) and as a hyperlink reference +(label).

+
+
3
+

This footnote is numbered automatically and anonymously using a +label of “#” only.

+
+
*
+

Footnotes may also use symbols, specified with a “*” label. +Here’s a reference to the next footnote: .

+
+
+

This footnote shows the next symbol in the sequence.

+
+
4
+

Here’s an unreferenced footnote, with a reference to a +nonexistent footnote: [5]_.

+
+
+
+
+

3.6.2. Citations

+
+
11
+

This is the citation I made, let’s make this extremely long so that we can tell that it doesn’t follow the normal responsive table stuff.

+
+
12(1,2)
+

This citation has some code blocks in it, maybe some bold and +italics too. Heck, lets put a link to a meta citation 13 too.

+
+
13
+

This citation will have two backlinks.

+
+
+

Here’s a reference to the above, 12, and a [nonexistent] citation.

+

Here is another type of citation: citation

+
+
+

3.6.3. Glossary

+

This is a glossary with definition terms for thing like Writing:

+
+
Documentation

Provides users with the knowledge they need to use something.

+
+
Reading

The process of taking information into ones mind through the use of eyes.

+
+
Writing

The process of putting thoughts into a medium for other people to read.

+
+
+
+
+

3.6.4. Targets

+

This paragraph is pointed to by the explicit “example” target. +A reference can be found under Inline Markup, above. Inline +hyperlink targets are also possible.

+

Section headers are implicit targets, referred to by name. See +Targets, which is a subsection of `Body Elements`_.

+

Explicit external targets are interpolated into references such as “Python 5”.

+

Targets may be indirect and anonymous. Thus this phrase may also +refer to the Targets section.

+

Here’s a `hyperlink reference without a target`_, which generates an error.

+
+
+
+

3.7. Directives

+
+

3.7.1. Contents

+

These are just a sample of the many reStructuredText Directives. For others, please see: +http://docutils.sourceforge.net/docs/ref/rst/directives.html.

+
+
+

3.7.2. Centered text

+

You can create a statement with centered text with .. centered::

+

+This is centered text!

+
+

3.7.3. Images & Figures

+
+

3.7.3.1. Images

+

An image directive (also clickable – a hyperlink reference):

+../../../../_images/yi_jing_01_chien.jpg +
+
+

3.7.3.2. Figures

+
+reStructuredText, the markup syntax +
+

A figure is an image with a caption and/or a legend:

+
+ ++++ + + + + + + + + + + + +

re

Revised, revisited, based on ‘re’ module.

Structured

Structure-enhanced text, structuredtext.

Text

Well it is, isn’t it?

+

This paragraph is also part of the legend.

+
+
+
+

A figure directive with center alignment

+
+../../../../_images/yi_jing_01_chien.jpg +
+

This caption should be centered.

+
+
+
+
+
+

3.7.4. Admonitions

+
+

Attention

+

Directives at large.

+
+
+

Caution

+

Don’t take any wooden nickels.

+
+
+

Danger

+

Mad scientist at work!

+
+
+

Error

+

Does not compute.

+
+
+

Hint

+

It’s bigger than a bread box.

+
+
+

Important

+
    +
  • Wash behind your ears.

  • +
  • Clean up your room.

    +
      +
    • Including the closet.

    • +
    • The bathroom too.

      +
        +
      • Take the trash out of the bathroom.

      • +
      • Clean the sink.

      • +
      +
    • +
    +
  • +
  • Call your mother.

  • +
  • Back up your data.

  • +
+
+
+

Note

+

This is a note. +Equations within a note: +\(G_{\mu\nu} = 8 \pi G (T_{\mu\nu} + \rho_\Lambda g_{\mu\nu})\).

+
+
+

Tip

+

15% if the service is good.

+ +++ + + + + + + + + + + + + +

Example

Thing1

Thing2

Thing3

+
+
+

Warning

+

Strong prose may provoke extreme mental exertion. +Reader discretion is strongly advised.

+
+
+

And, by the way…

+

You can make up your own admonition too.

+
+
+
+

3.7.5. Topics, Sidebars, and Rubrics

+ +
+

Topic Title

+

This is a topic.

+
+

This is a rubric

+
+
+

3.7.6. Target Footnotes

+
+
5(1,2,3)
+

http://www.python.org/

+
+
+
+
+

3.7.7. Replacement Text

+

I recommend you try Python, the best language around 5.

+
+
+

3.7.8. Compound Paragraph

+
+

This paragraph contains a literal block:

+
Connecting... OK
+Transmitting data... OK
+Disconnecting... OK
+
+
+

and thus consists of a simple paragraph, a literal block, and +another simple paragraph. Nonetheless it is semantically one +paragraph.

+
+

This construct is called a compound paragraph and can be produced +with the “compound” directive.

+
+
+ +
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/src/pytorch-sphinx-theme/docs/demo/lists_tables.html b/docs/v1.2.0/src/pytorch-sphinx-theme/docs/demo/lists_tables.html new file mode 100644 index 0000000000..97715c40c9 --- /dev/null +++ b/docs/v1.2.0/src/pytorch-sphinx-theme/docs/demo/lists_tables.html @@ -0,0 +1,1242 @@ + + + + + + + + + + + + + 4. Lists & Tables — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • 4. Lists & Tables
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

4. Lists & Tables

+ +
+

4.1. Lists

+
+

4.1.1. Enumerated Lists

+
    +
  1. Arabic numerals.

    +
      +
    1. lower alpha)

      +
        +
      1. (lower roman)

        +
          +
        1. upper alpha.

          +
            +
          1. upper roman)

          2. +
          +
        2. +
        +
      2. +
      +
    2. +
    +
  2. +
  3. Lists that don’t start at 1:

    +
      +
    1. Three

    2. +
    3. Four

    4. +
    +
      +
    1. C

    2. +
    3. D

    4. +
    +
      +
    1. iii

    2. +
    3. iv

    4. +
    +
  4. +
  5. List items may also be auto-enumerated.

  6. +
+
+
+

4.1.2. Definition Lists

+
+
Term

Definition

+
+
Termclassifier

Definition paragraph 1.

+

Definition paragraph 2.

+
+
Term

Definition

+
+
+
+
+

4.1.3. Option Lists

+

For listing command-line options:

+
+
-a
+

command-line option “a”

+
+
-b file
+

options can have arguments +and long descriptions

+
+
--long
+

options can be long also

+
+
--input=file
+

long options can also have +arguments

+
+
--very-long-option
+

The description can also start on the next line.

+

The description may contain multiple body elements, +regardless of where it starts.

+
+
-x, -y, -z
+

Multiple options are an “option group”.

+
+
-v, --verbose
+

Commonly-seen: short & long options.

+
+
-1 file, --one=file, --two file
+

Multiple options with arguments.

+
+
/V
+

DOS/VMS-style options too

+
+
+

There must be at least two spaces between the option and the description.

+
+
+

4.1.4. Field list

+
+
Author
+

David Goodger

+
+
Address
+

123 Example Street +Example, EX Canada +A1B 2C3

+
+
Contact
+

docutils-develop@lists.sourceforge.net

+
+
Authors
+

Me; Myself; I

+
+
organization
+

humankind

+
+
date
+

$Date: 2012-01-03 19:23:53 +0000 (Tue, 03 Jan 2012) $

+
+
status
+

This is a “work in progress”

+
+
revision
+

$Revision: 7302 $

+
+
version
+

1

+
+
copyright
+

This document has been placed in the public domain. You +may do with it as you wish. You may copy, modify, +redistribute, reattribute, sell, buy, rent, lease, +destroy, or improve it, quote it at length, excerpt, +incorporate, collate, fold, staple, or mutilate it, or do +anything else to it that your or anyone else’s heart +desires.

+
+
field name
+

This is a generic bibliographic field.

+
+
field name 2
+

Generic bibliographic fields may contain multiple body elements.

+

Like this.

+
+
Dedication
+

For Docutils users & co-developers.

+
+
abstract
+

This document is a demonstration of the reStructuredText markup +language, containing examples of all basic reStructuredText +constructs and many advanced constructs.

+
+
+
+
+

4.1.5. Bullet Lists

+
    +
  • A bullet list

    +
      +
    • Nested bullet list.

    • +
    • Nested item 2.

    • +
    +
  • +
  • Item 2.

    +

    Paragraph 2 of item 2.

    +
      +
    • Nested bullet list.

    • +
    • Nested item 2.

      +
        +
      • Third level.

      • +
      • Item 2.

      • +
      +
    • +
    • Nested item 3.

    • +
    +
  • +
  • inline literall

  • +
  • inline literall

  • +
  • inline literall

  • +
+
+

4.1.5.1. Second list level

+
    +
  • here is a list in a second-level section.

  • +
  • yahoo

  • +
  • yahoo

    +
      +
    • yahoo

    • +
    • here is an inner bullet oh

      +
        +
      • one more with an inline literally. yahoo

        +

        heh heh. child. try to beat this embed:

        +
         1# -*- coding: utf-8 -*-
        + 2"""Test Module for sphinx_rtd_theme."""
        + 3
        + 4
        + 5class Foo:
        + 6
        + 7    """Docstring for class Foo.
        + 8
        + 9    This text tests for the formatting of docstrings generated from output
        +10    ``sphinx.ext.autodoc``. Which contain reST, but sphinx nests it in the
        +
        +
        +
      • +
      +
    • +
    • and another. yahoo

    • +
    • yahoo

    • +
    • hi

    • +
    +
  • +
  • and hehe

  • +
+
+
4.1.5.1.1. But deeper down the rabbit hole
+
    +
  • I kept saying that, “deeper down the rabbit hole”. yahoo

    +
      +
    • I cackle at night yahoo.

    • +
    +
  • +
  • I’m so lonely here in GZ guangzhou

  • +
  • A man of python destiny, hopes and dreams. yahoo

    + +
  • +
+
+
+
+
+

4.1.6. Hlists

+
    +
  • First item

  • +
  • Second item

  • +
  • Third item

  • +
+
    +
  • Forth item

  • +
  • Fifth item

  • +
  • Sixths item

  • +
+
+

Hlist with images

+
    +
  • +../../../../_images/yi_jing_01_chien.jpg +
    +

    This is a short caption for a figure.

    +
    +
    +
  • +
+
    +
  • +../../../../_images/yi_jing_01_chien.jpg +
    +

    This is a long caption for a figure. Lorem ipsum dolor sit amet, consectetur adipiscing elit. +Donec porttitor dolor in odio posuere, vitae ornare libero mattis. In lobortis justo vestibulum nibh aliquet, non.

    +
    +
    +
  • +
+
+
+
+

4.1.7. Numbered List

+
    +
  1. One,

  2. +
  3. Two.

  4. +
  5. Three with long text. Lorem ipsum dolor sit amet, consectetur adipiscing elit. +Sed feugiat sagittis neque quis eleifend. Duis rutrum lectus sit amet mattis suscipit.

  6. +
+
    +
    1. +
    2. Using bullets and letters. (A)

    3. +
    +
  • +
    1. +
    2. Using bullets and letters. (B)

    3. +
    +
  • +
    1. +
    2. Using bullets and letters. (C)

    3. +
    +
  • +
+
+
+
+

4.2. Tables

+
+

4.2.1. Grid Tables

+

Here’s a grid table followed by a simple table:

+ ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Header row, column 1 +(header rows optional)

Header 2

Header 3

Header 4

body row 1, column 1

column 2

column 3

column 4

body row 2

Cells may span columns.

body row 3

Cells may +span rows.

    +
  • Table cells

  • +
  • contain

  • +
  • body elements.

  • +
+

body row 4

body row 5

Cells may also be +empty: -->

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Inputs

Output

A

B

A or B

False

False

False

True

False

True

False

True

True

True

True

True

+
+

4.2.1.1. Giant Tables

+ ++++++++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Header 1

Header 2

Header 3

Header 1

Header 2

Header 3

Header 1

Header 2

Header 3

Header 1

Header 2

Header 3

body row 1

column 2

column 3

body row 1

column 2

column 3

body row 1

column 2

column 3

body row 1

column 2

column 3

body row 1

column 2

column 3

body row 1

column 2

column 3

body row 1

column 2

column 3

body row 1

column 2

column 3

body row 1

column 2

column 3

body row 1

column 2

column 3

body row 1

column 2

column 3

body row 1

column 2

column 3

body row 1

column 2

column 3

body row 1

column 2

column 3

body row 1

column 2

column 3

body row 1

column 2

column 3

+
+
+
+

4.2.2. List Tables

+ + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + +
List tables can have captions like this one.

List table

Header 1

Header 2

Header 3 long. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet mauris arcu.

Stub Row 1

Row 1

Column 2

Column 3 long. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet mauris arcu.

Stub Row 2

Row 2

Column 2

Column 3 long. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet mauris arcu.

Stub Row 3

Row 3

Column 2

Column 3 long. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet mauris arcu.

+ + ++++ + + + + + +
This is a list table with images in it.
+../../../../_images/yi_jing_01_chien.jpg +
+

This is a short caption for a figure.

+
+
+
+../../../../_images/yi_jing_01_chien.jpg +
+

This is a long caption for a figure. Lorem ipsum dolor sit amet, consectetur adipiscing elit. +Donec porttitor dolor in odio posuere, vitae ornare libero mattis. In lobortis justo vestibulum nibh aliquet, non.

+
+
+
+
+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/src/pytorch-sphinx-theme/docs/demo/long.html b/docs/v1.2.0/src/pytorch-sphinx-theme/docs/demo/long.html new file mode 100644 index 0000000000..588c89495d --- /dev/null +++ b/docs/v1.2.0/src/pytorch-sphinx-theme/docs/demo/long.html @@ -0,0 +1,921 @@ + + + + + + + + + + + + + 1. Long Sticky Nav — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • 1. Long Sticky Nav
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

1. Long Sticky Nav

+ +

This section demonstrates how the ‘sticky_navigation’ setting behaves when the menu is very long. +When this section is selected, it will make the menu and the main area scroll when you are at the top of the page.

+
+

1.1. Example Menu 1

+

Just a place holder…

+
+
+

1.2. Example Menu 2

+

Just a place holder…

+
+
+

1.3. Example Menu 3

+

Just a place holder…

+
+
+

1.4. Example Menu 4

+

Just a place holder…

+
+
+

1.5. Example Menu 5

+

Just a place holder…

+
+
+

1.6. Example Menu 6

+

Just a place holder…

+
+
+

1.7. Example Menu 7

+

Just a place holder…

+
+
+

1.8. Example Menu 8

+

Just a place holder…

+
+
+

1.9. Example Menu 9

+

Just a place holder…

+
+
+

1.10. Example Menu 10

+

Just a place holder…

+
+
+

1.11. Example Menu 11

+

Just a place holder…

+
+
+

1.12. Example Menu 12

+

Just a place holder…

+
+
+

1.13. Example Menu 13

+

Just a place holder…

+
+
+

1.14. Example Menu 14

+

Just a place holder…

+
+
+

1.15. Example Menu 15

+

Just a place holder…

+
+
+

1.16. Example Menu 16

+

Just a place holder…

+
+
+

1.17. Example Menu 17

+

Just a place holder…

+
+
+

1.18. Example Menu 18

+

Just a place holder…

+
+
+

1.19. Example Menu 19

+

Just a place holder…

+
+
+

1.20. Example Menu 20

+

Just a place holder…

+
+
+

1.21. Example Submenu 1

+

Just a place holder…

+ + + + + +
+
+

1.22. Example Submenu 2

+

Just a place holder…

+
+

1.22.1. Submenu 1

+

Just a place holder…

+
+

1.22.1.1. Subsubmenu 1

+

Just a place holder…

+
+
+
+

1.22.2. Submenu 2

+

Just a place holder…

+
+

1.22.2.1. Subsubmenu 1

+

Just a place holder…

+
+
+
+

1.22.3. Submenu 3

+

Just a place holder…

+
+
+

1.22.4. Submenu 4

+

Just a place holder…

+
+
+

1.22.5. Submenu 5

+

Just a place holder…

+
+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/src/pytorch-sphinx-theme/docs/demo/structure.html b/docs/v1.2.0/src/pytorch-sphinx-theme/docs/demo/structure.html new file mode 100644 index 0000000000..ed6d9db6c7 --- /dev/null +++ b/docs/v1.2.0/src/pytorch-sphinx-theme/docs/demo/structure.html @@ -0,0 +1,790 @@ + + + + + + + + + + + + + 1. Structural Elements — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • 1. Structural Elements
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

1. Structural Elements

+ +

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec lorem neque, interdum in ipsum nec, +finibus dictum velit. Ut eu efficitur arcu, id aliquam erat. In sit amet diam gravida, imperdiet tellus eu, +gravida nisl. Praesent aliquet odio eget libero elementum, quis rhoncus tellus tincidunt. +Suspendisse quis volutpat ipsum. Sed lobortis scelerisque tristique. Aenean condimentum risus tellus, +quis accumsan ipsum laoreet ut. Integer porttitor maximus suscipit. Mauris in posuere sapien. +Aliquam accumsan feugiat ligula, nec fringilla libero commodo sed. Proin et erat pharetra.

+
+

Etiam turpis ante, luctus sed velit tristique, finibus volutpat dui. Nam sagittis vel ante nec malesuada. +Praesent dignissim mi nec ornare elementum. Nunc eu augue vel sem dignissim cursus sed et nulla. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Pellentesque dictum dui sem, non placerat tortor rhoncus in. Sed placerat nulla at rhoncus iaculis.

+
+

1.1. Document Section

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum nulla vel neque venenatis, +nec placerat lorem placerat. Cras purus eros, gravida vitae tincidunt id, vehicula nec nulla. +Fusce aliquet auctor cursus. Phasellus ex neque, vestibulum non est vitae, viverra fringilla tortor. +Donec vestibulum convallis justo, a faucibus lorem vulputate vel. Aliquam cursus odio eu felis sodales aliquet. +Aliquam erat volutpat. Maecenas eget dictum mauris. Suspendisse arcu eros, condimentum eget risus sed, +luctus efficitur arcu. Cras ut dictum mi. Nulla congue interdum lorem, semper semper enim commodo nec.

+
+

1.1.1. Document Subsection

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam efficitur in eros et blandit. Nunc maximus, +nisl at auctor vestibulum, justo ex sollicitudin ligula, id faucibus urna orci tristique nisl. +Duis auctor rutrum orci, in ornare lacus condimentum quis. Quisque arcu velit, facilisis quis interdum ac, +hendrerit auctor mauris. Curabitur urna nibh, porttitor at ante sit amet, vestibulum interdum dolor. +Duis dictum elit orci, tincidunt imperdiet sem pellentesque et. In vehicula pellentesque varius. +Phasellus a turpis sollicitudin, bibendum massa et, imperdiet neque. Integer quis sapien in magna rutrum bibendum. +Integer cursus ex sed magna vehicula finibus. Proin tempus orci quis dolor tempus, nec condimentum odio vestibulum. +Etiam efficitur sollicitudin libero, tincidunt volutpat ligula interdum sed.

+
+

1.1.1.1. Document Subsubsection

+

Donec non rutrum lorem. Aenean sagittis metus at pharetra fringilla. Nunc sapien dolor, cursus sed nisi at, +pretium tristique lectus. Sed pellentesque leo lectus, et convallis ipsum euismod a. +Integer at leo vitae felis pretium aliquam fringilla quis odio. Sed pharetra enim accumsan feugiat pretium. +Maecenas at pharetra tortor. Morbi semper eget mi vel finibus. Cras rutrum nulla eros, id feugiat arcu pellentesque ut. +Sed finibus tortor ac nisi ultrices viverra. Duis feugiat malesuada sapien, at commodo ante porttitor ac. +Curabitur posuere mauris mi, vel ornare orci scelerisque sit amet. Suspendisse nec fringilla dui.

+
+
1.1.1.1.1. Document Paragraph
+

Pellentesque nec est in odio ultrices elementum. Vestibulum et hendrerit sapien, quis vulputate turpis. +Suspendisse potenti. Curabitur tristique sit amet lectus non viverra. Phasellus rutrum dapibus turpis sed imperdiet. +Mauris maximus viverra ante. Donec eu egestas mauris. Morbi vulputate tincidunt euismod. Integer vel porttitor neque. +Donec at lacus suscipit, lacinia lectus vel, sagittis lectus.

+
+
+
+
+
+
+

2. Structural Elements 2

+

Etiam turpis ante, luctus sed velit tristique, finibus volutpat dui. Nam sagittis vel ante nec malesuada. +Praesent dignissim mi nec ornare elementum. Nunc eu augue vel sem dignissim cursus sed et nulla. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Pellentesque dictum dui sem, non placerat tortor rhoncus in. Sed placerat nulla at rhoncus iaculis.

+
+

2.1. Document Section

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum nulla vel neque venenatis, +nec placerat lorem placerat. Cras purus eros, gravida vitae tincidunt id, vehicula nec nulla. +Fusce aliquet auctor cursus. Phasellus ex neque, vestibulum non est vitae, viverra fringilla tortor. +Donec vestibulum convallis justo, a faucibus lorem vulputate vel. Aliquam cursus odio eu felis sodales aliquet. +Aliquam erat volutpat. Maecenas eget dictum mauris. Suspendisse arcu eros, condimentum eget risus sed, +luctus efficitur arcu. Cras ut dictum mi. Nulla congue interdum lorem, semper semper enim commodo nec.

+
+

2.1.1. Document Subsection

+
+../../../../_images/yi_jing_01_chien.jpg +
+

This is a caption for a figure. Text should wrap around the caption.

+
+
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam efficitur in eros et blandit. Nunc maximus, +nisl at auctor vestibulum, justo ex sollicitudin ligula, id faucibus urna orci tristique nisl. +Duis auctor rutrum orci, in ornare lacus condimentum quis. Quisque arcu velit, facilisis quis interdum ac, +hendrerit auctor mauris. Curabitur urna nibh, porttitor at ante sit amet, vestibulum interdum dolor. +Duis dictum elit orci, tincidunt imperdiet sem pellentesque et. In vehicula pellentesque varius. +Phasellus a turpis sollicitudin, bibendum massa et, imperdiet neque. Integer quis sapien in magna rutrum bibendum. +Integer cursus ex sed magna vehicula finibus. Proin tempus orci quis dolor tempus, nec condimentum odio vestibulum. +Etiam efficitur sollicitudin libero, tincidunt volutpat ligula interdum sed. Praesent congue sagittis nisl et suscipit. +Vivamus sagittis risus et egestas commodo.Cras venenatis arcu in pharetra interdum. +Donec quis metus porttitor tellus cursus lobortis. Quisque et orci magna. Fusce rhoncus mi mi, +at vehicula massa rhoncus quis. Mauris augue leo, pretium eget molestie vitae, efficitur nec nulla. +In hac habitasse platea dictumst. Sed sit amet imperdiet purus.

+
+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/src/pytorch-sphinx-theme/docs/index.html b/docs/v1.2.0/src/pytorch-sphinx-theme/docs/index.html new file mode 100644 index 0000000000..d171e04fef --- /dev/null +++ b/docs/v1.2.0/src/pytorch-sphinx-theme/docs/index.html @@ -0,0 +1,747 @@ + + + + + + + + + + + + + <no title> — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ + + + + + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+
+
    +
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/src/pytorch-sphinx-theme/docs/installing.html b/docs/v1.2.0/src/pytorch-sphinx-theme/docs/installing.html new file mode 100644 index 0000000000..d6799d6732 --- /dev/null +++ b/docs/v1.2.0/src/pytorch-sphinx-theme/docs/installing.html @@ -0,0 +1,669 @@ + + + + + + + + + + + + + Installation — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Installation

+
+

Via Git or Download

+

Symlink or subtree the pytorch_sphinx_theme repository into your documentation at +docs/_themes/pytorch_sphinx_theme then add the following two settings to your Sphinx +conf.py file:

+
html_theme = "pytorch_sphinx_theme"
+html_theme_path = ["_themes", ]
+
+
+
+
+ + +
+ +
+
+ + + + +
+ + + +
+

+ © Copyright 2021, NVIDIA Corporation. + +

+
+ +
+ Built with Sphinx using a theme provided by Read the Docs. +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/tutorials/creating_torchscript_module_in_python.html b/docs/v1.2.0/tutorials/creating_torchscript_module_in_python.html new file mode 100644 index 0000000000..dc300c1aed --- /dev/null +++ b/docs/v1.2.0/tutorials/creating_torchscript_module_in_python.html @@ -0,0 +1,784 @@ + + + + + + + + + + + + + Creating a TorchScript Module — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Creating a TorchScript Module
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Creating a TorchScript Module

+

TorchScript is a way to create serializable and optimizable models from PyTorch code. +PyTorch has detailed documentation on how to do this https://pytorch.org/tutorials/beginner/Intro_to_TorchScript_tutorial.html but briefly here is the +here is key background information and the process:

+

PyTorch programs are based around Module s which can be used to compose higher level modules. Modules contain a constructor to set up the modules, parameters and sub-modules +and a forward function which describes how to use the parameters and submodules when the module is invoked.

+

For example, we can define a LeNet module like this:

+
 1import torch.nn as nn
+ 2import torch.nn.functional as F
+ 3
+ 4
+ 5class LeNetFeatExtractor(nn.Module):
+ 6    def __init__(self):
+ 7        super(LeNetFeatExtractor, self).__init__()
+ 8        self.conv1 = nn.Conv2d(1, 6, 3)
+ 9        self.conv2 = nn.Conv2d(6, 16, 3)
+10
+11    def forward(self, x):
+12        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
+13        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
+14        return x
+15
+16
+17class LeNetClassifier(nn.Module):
+18    def __init__(self):
+19        super(LeNetClassifier, self).__init__()
+20        self.fc1 = nn.Linear(16 * 6 * 6, 120)
+21        self.fc2 = nn.Linear(120, 84)
+22        self.fc3 = nn.Linear(84, 10)
+23
+24    def forward(self, x):
+25        x = torch.flatten(x, 1)
+26        x = F.relu(self.fc1(x))
+27        x = F.relu(self.fc2(x))
+28        x = self.fc3(x)
+29        return x
+30
+31
+32class LeNet(nn.Module):
+33    def __init__(self):
+34        super(LeNet, self).__init__()
+35        self.feat = LeNetFeatExtractor()
+36        self.classifer = LeNetClassifier()
+37
+38    def forward(self, x):
+39        x = self.feat(x)
+40        x = self.classifer(x)
+41        return x
+
+
+

.

+
+

Obviously you may want to consolidate such a simple model into a single module but we can see the composability of PyTorch here

+
+

From here are two pathways for going from PyTorch Python code to TorchScript code: Tracing and Scripting.

+

Tracing follows the path of execution when the module is called and records what happens. +To trace an instance of our LeNet module, we can call torch.jit.trace with an example input.

+
import torch
+
+model = LeNet()
+input_data = torch.empty([1, 1, 32, 32])
+traced_model = torch.jit.trace(model, input_data)
+
+
+

Scripting actually inspects your code with a compiler and generates an equivalent TorchScript program. The difference is that since tracing +is following the execution of your module, it cannot pick up control flow for instance. By working from the Python code, the compiler can +include these components. We can run the script compiler on our LeNet module by calling torch.jit.script

+
import torch
+
+model = LeNet()
+script_model = torch.jit.script(model)
+
+
+

There are reasons to use one path or another, the PyTorch documentation has information on how to choose. From a Torch-TensorRT prespective, there is +better support (i.e your module is more likely to compile) for traced modules because it doesn’t include all the complexities of a complete +programming language, though both paths supported.

+

After scripting or tracing your module, you are given back a TorchScript Module. This contains the code and parameters used to run the module stored +in a intermediate representation that Torch-TensorRT can consume.

+

Here is what the LeNet traced module IR looks like:

+
graph(%self.1 : __torch__.___torch_mangle_10.LeNet,
+    %input.1 : Float(1, 1, 32, 32)):
+    %129 : __torch__.___torch_mangle_9.LeNetClassifier = prim::GetAttr[name="classifer"](%self.1)
+    %119 : __torch__.___torch_mangle_5.LeNetFeatExtractor = prim::GetAttr[name="feat"](%self.1)
+    %137 : Tensor = prim::CallMethod[name="forward"](%119, %input.1)
+    %138 : Tensor = prim::CallMethod[name="forward"](%129, %137)
+    return (%138)
+
+
+

and the LeNet scripted module IR:

+
graph(%self : __torch__.LeNet,
+    %x.1 : Tensor):
+    %2 : __torch__.LeNetFeatExtractor = prim::GetAttr[name="feat"](%self)
+    %x.3 : Tensor = prim::CallMethod[name="forward"](%2, %x.1) # x.py:38:12
+    %5 : __torch__.LeNetClassifier = prim::GetAttr[name="classifer"](%self)
+    %x.5 : Tensor = prim::CallMethod[name="forward"](%5, %x.3) # x.py:39:12
+    return (%x.5)
+
+
+

You can see that the IR preserves the module structure we have in our python code.

+
+
+

Working with TorchScript in Python

+

TorchScript Modules are run the same way you run normal PyTorch modules. You can run the forward pass using the +forward method or just calling the module torch_scirpt_module(in_tensor) The JIT compiler will compile +and optimize the module on the fly and then returns the results.

+
+
+

Saving TorchScript Module to Disk

+

For either traced or scripted modules, you can save the module to disk with the following command

+
import torch
+
+model = LeNet()
+script_model = torch.jit.script(model)
+script_model.save("lenet_scripted.ts")
+
+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/tutorials/getting_started_with_cpp_api.html b/docs/v1.2.0/tutorials/getting_started_with_cpp_api.html new file mode 100644 index 0000000000..f8a8d7ef68 --- /dev/null +++ b/docs/v1.2.0/tutorials/getting_started_with_cpp_api.html @@ -0,0 +1,1280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Getting Started with C++ — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Getting Started with C++ + + ¶ + +

+

+ If you haven’t already, acquire a tarball of the library by following the instructions in + + + Installation + + +

+

+ Using Torch-TensorRT in C++ + + ¶ + +

+

+ Torch-TensorRT C++ API accepts TorchScript modules (generated either from + + + torch.jit.script + + + or + + + torch.jit.trace + + + ) as an input and returns +a Torchscript module (optimized using TensorRT). This requires users to use Pytorch (in python) to generate torchscript modules beforehand. +Please refer to + + Creating TorchScript modules in Python + + section to generate torchscript graphs. +

+ + +

+ [Torch-TensorRT Quickstart] Compiling TorchScript Modules with + + + torchtrtc + + + + ¶ + +

+

+ An easy way to get started with Torch-TensorRT and to check if your model can be supported without extra work is to run it through + + + torchtrtc + + + , which supports almost all features of the compiler from the command line including post training quantization +(given a previously created calibration cache). For example we can compile our lenet model by setting our preferred operating +precision and input size. This new TorchScript file can be loaded into Python (note: you need to + + + import + + + torch_tensorrt + + + before loading +these compiled modules because the compiler extends the PyTorch the deserializer and runtime to execute compiled modules). +

+
+
+
❯ torchtrtc -p f16 lenet_scripted.ts trt_lenet_scripted.ts "(1,1,32,32)"
+
+❯ python3
+Python 3.6.9 (default, Apr 18 2020, 01:56:04)
+[GCC 8.4.0] on linux
+Type "help", "copyright", "credits" or "license" for more information.
+>>> import torch
+>>> import torch_tensorrt
+>>> ts_model = torch.jit.load(“trt_lenet_scripted.ts”)
+>>> ts_model(torch.randn((1,1,32,32)).to(“cuda”).half())
+
+
+
+

+ You can learn more about + + + torchtrtc + + + usage here: + + + torchtrtc + + +

+ + +

+ Working with TorchScript in C++ + + ¶ + +

+

+ If we are developing an application to deploy with C++, we can save either our traced or scripted module using + + + torch.jit.save + + + which will serialize the TorchScript code, weights and other information into a package. This is also where our dependency on Python ends. +

+
+
+
torch_script_module.save("lenet.jit.pt")
+
+
+
+

+ From here we can now load our TorchScript module in C++ +

+
+
+
#include <torch/script.h> // One-stop header.
+
+#include <iostream>
+#include <memory>
+
+int main(int argc, const char* argv[]) {
+    torch::jit::Module module;
+    try {
+        // Deserialize the ScriptModule from a file using torch::jit::load().
+        module = torch::jit::load("<PATH TO SAVED TS MOD>");
+    }
+    catch (const c10::Error& e) {
+        std::cerr << "error loading the model\n";
+        return -1;
+    }
+
+    std::cout << "ok\n";
+
+
+
+

+ You can do full training and inference in C++ with PyTorch / LibTorch if you would like, you can even define your modules in C++ and +have access to the same powerful tensor library that backs PyTorch. (For more information: + + https://pytorch.org/cppdocs/ + + ). +For instance we can do inference with our LeNet module like this: +

+
+
+
mod.eval();
+torch::Tensor in = torch::randn({1, 1, 32, 32});
+auto out = mod.forward(in);
+
+
+
+

+ and to run on the GPU: +

+
+
+
mod.eval();
+mod.to(torch::kCUDA);
+torch::Tensor in = torch::randn({1, 1, 32, 32}, torch::kCUDA);
+auto out = mod.forward(in);
+
+
+
+

+ As you can see it is pretty similar to the Python API. When you call the + + + forward + + + method, you invoke the PyTorch JIT compiler, which will optimize and run your TorchScript code. +

+ + +

+ Compiling with Torch-TensorRT in C++ + + ¶ + +

+

+ We are also at the point were we can compile and optimize our module with Torch-TensorRT, but instead of in a JIT fashion we must do it ahead-of-time (AOT) i.e. before we start doing actual inference work +since it takes a bit of time to optimize the module, it would not make sense to do this every time you run the module or even the first time you run it. +

+

+ With our module loaded, we can feed it into the Torch-TensorRT compiler. When we do so we must provide some information on the expected input size and also configure any additional settings. +

+
+
+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+...
+
+    mod.to(at::kCUDA);
+    mod.eval();
+
+    auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA});
+    auto trt_mod = torch_tensorrt::CompileGraph(mod, std::vector<torch_tensorrt::CompileSpec::InputRange>{{in.sizes()}});
+    auto out = trt_mod.forward({in});
+
+
+
+

+ Thats it! Now the graph runs primarily not with the JIT compiler but using TensorRT (though we execute the graph using the JIT runtime). +

+

+ We can also set settings like operating precision to run in FP16. +

+
+
+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+...
+
+    mod.to(at::kCUDA);
+    mod.eval();
+
+    auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}).to(torch::kHALF);
+    auto input_sizes = std::vector<torch_tensorrt::CompileSpec::InputRange>({in.sizes()});
+    torch_tensorrt::CompileSpec info(input_sizes);
+    info.enable_precisions.insert(torch::kHALF);
+    auto trt_mod = torch_tensorrt::CompileGraph(mod, info);
+    auto out = trt_mod.forward({in});
+
+
+
+

+ And now we are running the module in FP16 precision. You can then save the module to load later. +

+
+
+
trt_mod.save("<PATH TO SAVED TRT/TS MOD>")
+
+
+
+

+ Torch-TensorRT compiled TorchScript modules are loaded in the same way as normal TorchScript module. Make sure your deployment application is linked against + + + libtorchtrt.so + + +

+
+
+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+
+int main(int argc, const char* argv[]) {
+    torch::jit::Module module;
+    try {
+        // Deserialize the ScriptModule from a file using torch::jit::load().
+        module = torch::jit::load("<PATH TO SAVED TRT/TS MOD>");
+    }
+    catch (const c10::Error& e) {
+        std::cerr << "error loading the model\n";
+        return -1;
+    }
+
+    torch::Tensor in = torch::randn({1, 1, 32, 32}, torch::kCUDA);
+    auto out = mod.forward(in);
+
+    std::cout << "ok\n";
+}
+
+
+
+

+ If you want to save the engine produced by Torch-TensorRT to use in a TensorRT application you can use the + + + ConvertGraphToTRTEngine + + + API. +

+
+
+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+...
+
+    mod.to(at::kCUDA);
+    mod.eval();
+
+    auto in = torch::randn({1, 1, 32, 32}, {torch::kCUDA}).to(torch::kHALF);
+    auto input_sizes = std::vector<torch_tensorrt::CompileSpec::InputRange>({in.sizes()});
+    torch_tensorrt::CompileSpec info(input_sizes);
+    info.enabled_precisions.insert(torch::kHALF);
+    auto trt_mod = torch_tensorrt::ConvertGraphToTRTEngine(mod, "forward", info);
+    std::ofstream out("/tmp/engine_converted_from_jit.trt");
+    out << engine;
+    out.close();
+
+
+
+ + +

+ Under The Hood + + ¶ + +

+

+ When a module is provided to Torch-TensorRT, the compiler starts by mapping a graph like you saw above to a graph like this: +

+
+
+
graph(%input.2 : Tensor):
+    %2 : Float(84, 10) = prim::Constant[value=<Tensor>]()
+    %3 : Float(120, 84) = prim::Constant[value=<Tensor>]()
+    %4 : Float(576, 120) = prim::Constant[value=<Tensor>]()
+    %5 : int = prim::Constant[value=-1]() # x.py:25:0
+    %6 : int[] = prim::Constant[value=annotate(List[int], [])]()
+    %7 : int[] = prim::Constant[value=[2, 2]]()
+    %8 : int[] = prim::Constant[value=[0, 0]]()
+    %9 : int[] = prim::Constant[value=[1, 1]]()
+    %10 : bool = prim::Constant[value=1]() # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0
+    %11 : int = prim::Constant[value=1]() # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0
+    %12 : bool = prim::Constant[value=0]() # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0
+    %self.classifer.fc3.bias : Float(10) = prim::Constant[value= 0.0464  0.0383  0.0678  0.0932  0.1045 -0.0805 -0.0435 -0.0818  0.0208 -0.0358 [ CUDAFloatType{10} ]]()
+    %self.classifer.fc2.bias : Float(84) = prim::Constant[value=<Tensor>]()
+    %self.classifer.fc1.bias : Float(120) = prim::Constant[value=<Tensor>]()
+    %self.feat.conv2.weight : Float(16, 6, 3, 3) = prim::Constant[value=<Tensor>]()
+    %self.feat.conv2.bias : Float(16) = prim::Constant[value=<Tensor>]()
+    %self.feat.conv1.weight : Float(6, 1, 3, 3) = prim::Constant[value=<Tensor>]()
+    %self.feat.conv1.bias : Float(6) = prim::Constant[value= 0.0530 -0.1691  0.2802  0.1502  0.1056 -0.1549 [ CUDAFloatType{6} ]]()
+    %input0.4 : Tensor = aten::_convolution(%input.2, %self.feat.conv1.weight, %self.feat.conv1.bias, %9, %8, %9, %12, %8, %11, %12, %12, %10) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0
+    %input0.5 : Tensor = aten::relu(%input0.4) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0
+    %input1.2 : Tensor = aten::max_pool2d(%input0.5, %7, %6, %8, %9, %12) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0
+    %input0.6 : Tensor = aten::_convolution(%input1.2, %self.feat.conv2.weight, %self.feat.conv2.bias, %9, %8, %9, %12, %8, %11, %12, %12, %10) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py:346:0
+    %input2.1 : Tensor = aten::relu(%input0.6) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0
+    %x.1 : Tensor = aten::max_pool2d(%input2.1, %7, %6, %8, %9, %12) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:539:0
+    %input.1 : Tensor = aten::flatten(%x.1, %11, %5) # x.py:25:0
+    %27 : Tensor = aten::matmul(%input.1, %4)
+    %28 : Tensor = trt::const(%self.classifer.fc1.bias)
+    %29 : Tensor = aten::add_(%28, %27, %11)
+    %input0.2 : Tensor = aten::relu(%29) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0
+    %31 : Tensor = aten::matmul(%input0.2, %3)
+    %32 : Tensor = trt::const(%self.classifer.fc2.bias)
+    %33 : Tensor = aten::add_(%32, %31, %11)
+    %input1.1 : Tensor = aten::relu(%33) # ~/.local/lib/python3.6/site-packages/torch/nn/functional.py:1063:0
+    %35 : Tensor = aten::matmul(%input1.1, %2)
+    %36 : Tensor = trt::const(%self.classifer.fc3.bias)
+    %37 : Tensor = aten::add_(%36, %35, %11)
+    return (%37)
+(CompileGraph)
+
+
+
+

+ The graph has now been transformed from a collection of modules, each managing their own parameters into a single graph with the parameters inlined +into the graph and all of the operations laid out. Torch-TensorRT has also executed a number of optimizations and mappings to make the graph easier to translate to TensorRT. +From here the compiler can assemble the TensorRT engine by following the dataflow through the graph. +

+

+ When the graph construction phase is complete, Torch-TensorRT produces a serialized TensorRT engine. From here depending on the API, this engine is returned +to the user or moves into the graph construction phase. Here Torch-TensorRT creates a JIT Module to execute the TensorRT engine which will be instantiated and managed +by the Torch-TensorRT runtime. +

+

+ Here is the graph that you get back after compilation is complete: +

+
+
+
graph(%self_1 : __torch__.lenet, %input_0 : Tensor):
+    %1 : ...trt.Engine = prim::GetAttr[name="lenet"](%self_1)
+    %3 : Tensor[] = prim::ListConstruct(%input_0)
+    %4 : Tensor[] = trt::execute_engine(%3, %1)
+    %5 : Tensor = prim::ListUnpack(%4)
+    return (%5)
+
+
+
+

+ You can see the call where the engine is executed, after extracting the attribute containing the engine and constructing a list of inputs, then returns the tensors back to the user. +

+ + +

+ Working with Unsupported Operators + + ¶ + +

+

+ Torch-TensorRT is a new library and the PyTorch operator library is quite large, so there will be ops that aren’t supported natively by the compiler. You can either use the composition techinques +shown above to make modules are fully Torch-TensorRT supported and ones that are not and stitch the modules together in the deployment application or you can register converters for missing ops. +

+
+
+

+ You can check support without going through the full compilation pipleine using the + + + torch_tensorrt::CheckMethodOperatorSupport(const + + + torch::jit::Module& + + + module, + + + std::string + + + method_name) + + + api +to see what operators are not supported. + + + torchtrtc + + + automatically checks modules with this method before starting compilation and will print out a list of operators that are not supported. +

+
+
+ + +

+ Registering Custom Converters + + ¶ + +

+

+ Operations are mapped to TensorRT through the use of modular converters, a function that takes a node from a the JIT graph and produces an equivalent layer or subgraph in TensorRT. +Torch-TensorRT ships with a library of these converters stored in a registry, that will be executed depending on the node being parsed. For instance a + + + aten::relu(%input0.4) + + + instruction will trigger +the relu converter to be run on it, producing an activation layer in the TensorRT graph. But since this library is not exhaustive you may need to write your own to get Torch-TensorRT +to support your module. +

+

+ Shipped with the Torch-TensorRT distribution are the internal core API headers. You can therefore access the converter registry and add a converter for the op you need. +

+

+ For example, if we try to compile a graph with a build of Torch-TensorRT that doesn’t support the flatten operation ( + + + aten::flatten + + + ) you may see this error: +

+
+
+
terminate called after throwing an instance of 'torch_tensorrt::Error'
+what():  [enforce fail at core/conversion/conversion.cpp:109] Expected converter to be true but got false
+Unable to convert node: %input.1 : Tensor = aten::flatten(%x.1, %11, %5) # x.py:25:0 (conversion.AddLayer)
+Schema: aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor)
+Converter for aten::flatten requested, but no such converter was found.
+If you need a converter for this operator, you can try implementing one yourself
+or request a converter: https://www.github.com/NVIDIA/Torch-TensorRT/issues
+
+
+
+

+ We can register a converter for this operator in our application. All of the tools required to build a converter can be imported by including + + + torch_tensorrt/core/conversion/converters/converters.h + + + . +We start by creating an instance of the self-registering class + + + torch_tensorrt::core::conversion::converters::RegisterNodeConversionPatterns() + + + which will register converters +in the global converter registry, associating a function schema like + + + aten::flatten.using_ints(Tensor + + + self, + + + int + + + start_dim=0, + + + int + + + end_dim=-1) + + + -> + + + (Tensor) + + + with a lambda that +will take the state of the conversion, the node/operation in question to convert and all of the inputs to the node and produces as a side effect a new layer in the TensorRT network. +Arguments are passed as a vector of inspectable unions of TensorRT + + + ITensors + + + and Torch + + + IValues + + + in the order arguments are listed in the schema. +

+

+ Below is a implementation of a + + + aten::flatten + + + converter that we can use in our application. You have full access to the Torch and TensorRT libraries in the converter implementation. So +for example we can quickly get the output size by just running the operation in PyTorch instead of implementing the full calculation outself like we do below for this flatten converter. +

+
+
+
#include "torch/script.h"
+#include "torch_tensorrt/torch_tensorrt.h"
+#include "torch_tensorrt/core/conversion/converters/converters.h"
+
+static auto flatten_converter = torch_tensorrt::core::conversion::converters::RegisterNodeConversionPatterns()
+    .pattern({
+        "aten::flatten.using_ints(Tensor self, int start_dim=0, int end_dim=-1) -> (Tensor)",
+        [](torch_tensorrt::core::conversion::ConversionCtx* ctx,
+           const torch::jit::Node* n,
+           torch_tensorrt::core::conversion::converters::args& args) -> bool {
+            auto in = args[0].ITensor();
+            auto start_dim = args[1].unwrapToInt();
+            auto end_dim = args[2].unwrapToInt();
+            auto in_shape = torch_tensorrt::core::util::toVec(in->getDimensions());
+            auto out_shape = torch::flatten(torch::rand(in_shape), start_dim, end_dim).sizes();
+
+            auto shuffle = ctx->net->addShuffle(*in);
+            shuffle->setReshapeDimensions(torch_tensorrt::core::util::toDims(out_shape));
+            shuffle->setName(torch_tensorrt::core::util::node_info(n).c_str());
+
+            auto out_tensor = ctx->AssociateValueAndTensor(n->outputs()[0], shuffle->getOutput(0));
+            return true;
+        }
+    });
+
+int main() {
+    ...
+
+
+
+

+ To use this converter in Python, it is recommended to use PyTorch’s + + C++ / CUDA Extention + + template to wrap your library of converters into a + + + .so + + + that you can load with + + + ctypes.CDLL() + + + in your Python application. +

+

+ You can find more information on all the details of writing converters in the contributors documentation ( + + + Writing Converters + + + ). +If you find yourself with a large library of converter implementations, do consider upstreaming them, PRs are welcome and it would be great for the community to benefit as well. +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.2.0/tutorials/getting_started_with_fx_path.html b/docs/v1.2.0/tutorials/getting_started_with_fx_path.html new file mode 100644 index 0000000000..21c4c88def --- /dev/null +++ b/docs/v1.2.0/tutorials/getting_started_with_fx_path.html @@ -0,0 +1,981 @@ + + + + + + + + + + + + + Torch-TensorRT (FX Frontend) User Guide — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Torch-TensorRT (FX Frontend) User Guide
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Torch-TensorRT (FX Frontend) User Guide

+

Torch-TensorRT (FX Frontend) is a tool that can convert a PyTorch model through torch.fx to an +TensorRT engine optimized targeting running on Nvidia GPUs. TensorRT is the inference engine +developed by NVIDIA which composed of various kinds of optimization including kernel fusion, +graph optimization, low precision, etc.. This tool is developed in Python environment which allows this +workflow to be very accessible to researchers and engineers. There are a few stages that a +user want to use this tool and we will introduce them here.

+

> Torch-TensorRT (FX Frontend) is in Beta and currently it is recommended to work with PyTorch nightly.

+
# Test an example by
+$ python py/torch_tensorrt/fx/example/lower_example.py
+
+
+
+

Converting a PyTorch Model to TensorRT Engine

+

In general, users are welcome to use the compile() to finish the conversion from a model to tensorRT engine. It is a +wrapper API that consists of the major steps needed to finish this converison. Please refer to an example usage in lower_example.py file under examples/fx.

+
def compile(
+    module: nn.Module,
+    input,
+    max_batch_size=2048,
+    max_workspace_size=33554432,
+    explicit_batch_dimension=False,
+    lower_precision=LowerPrecision.FP16,
+    verbose_log=False,
+    timing_cache_prefix="",
+    save_timing_cache=False,
+    cuda_graph_batch_size=-1,
+    dynamic_batch=True,
+) -> nn.Module:
+
+    """
+    Takes in original module, input and lowering setting, run lowering workflow to turn module
+    into lowered module, or so called TRTModule.
+
+    Args:
+        module: Original module for lowering.
+        input: Input for module.
+        max_batch_size: Maximum batch size (must be >= 1 to be set, 0 means not set)
+        max_workspace_size: Maximum size of workspace given to TensorRT.
+        explicit_batch_dimension: Use explicit batch dimension in TensorRT if set True, otherwise use implicit batch dimension.
+        lower_precision: lower_precision config given to TRTModule.
+        verbose_log: Enable verbose log for TensorRT if set True.
+        timing_cache_prefix: Timing cache file name for timing cache used by fx2trt.
+        save_timing_cache: Update timing cache with current timing cache data if set to True.
+        cuda_graph_batch_size: Cuda graph batch size, default to be -1.
+        dynamic_batch: batch dimension (dim=0) is dynamic.
+    Returns:
+        A torch.nn.Module lowered by TensorRT.
+    """
+
+
+

In this section, we will go through an example to illustrate the major steps that fx path uses. +Users can refer to fx2trt_example.py file in examples/fx.

+
    +
  • Step 1: Trace the model with acc_tracer

  • +
+

Acc_tracer is a tracer inheritated from FX tracer. It comes with args normalizer to convert all args to kwargs and pass to TRT converters.

+
import torch_tensorrt.fx.tracer.acc_tracer.acc_tracer as acc_tracer
+
+# Build the model which needs to be a PyTorch nn.Module.
+my_pytorch_model = build_model()
+
+# Prepare inputs to the model. Inputs have to be a List of Tensors
+inputs = [Tensor, Tensor, ...]
+
+# Trace the model with acc_tracer.
+acc_mod = acc_tracer.trace(my_pytorch_model, inputs)
+
+
+

Common Errors:

+

symbolically traced variables cannot be used as inputs to control flow +This means the model contains dynamic control flow. Please refer to section “Dynamic Control Flow” in FX guide.

+
    +
  • Step 2: Build TensorRT engine

  • +
+

There are two different modes for how TensorRT handles batch dimension, explicit batch dimension and implicit batch dimension. This mode was used by early versions of TensorRT, and is now deprecated but continues to be supported for backwards compatibility. In explicit batch mode, all dimensions are explicit and can be dynamic, that is their length can change at execution time. Many new features, such as dynamic shapes and loops, are available only in this mode. User can still choose to use implicit batch mode when they set explicit_batch_dimension=False in compile(). We do not recommend to use it since it will lack of support in future TensorRT versions.

+

Explicit batch is the default mode and it must be set for dynamic shape. For most of vision task, user can choose to enable dynamic_batch in compile() if they want to get the similar effects as implicit mode where only batch dimension changes. It has some requirements: +1. Shapes of inputs, outputs and activations are fixed except batch dimension. +2. Inputs, outputs and activations have batch dimension as the major dimension. +3. All the operators in the model do not modify batch dimension (permute, transpose, split, etc.) or compute over batch dimension (sum, softmax, etc.).

+

For examples of the last path, if we have a 3D tensor t shaped as (batch, sequence, dimension), operations such as torch.transpose(0, 2). If any of these three are not satisfied, we’ll need to specify InputTensorSpec as inputs with dynamic range.

+

c

+
+

import deeplearning.trt.fx2trt.converter.converters +from torch.fx.experimental.fx2trt.fx2trt import InputTensorSpec, TRTInterpreter

+

# InputTensorSpec is a dataclass we use to store input information. +# There’re two ways we can build input_specs. +# Option 1, build it manually. +input_specs = [

+
+

InputTensorSpec(shape=(1, 2, 3), dtype=torch.float32), +InputTensorSpec(shape=(1, 4, 5), dtype=torch.float32),

+
+

] +# Option 2, build it using sample_inputs where user provide a sample +inputs = [ +torch.rand((1,2,3), dtype=torch.float32), +torch.rand((1,4,5), dtype=torch.float32), +] +input_specs = InputTensorSpec.from_tensors(inputs)

+

# IMPORTANT: If dynamic shape is needed, we need to build it slightly differently. +input_specs = [

+
+
+
InputTensorSpec(

shape=(-1, 2, 3), +dtype=torch.float32, +# Currently we only support one set of dynamic range. User may set other dimensions but it is not promised to work for any models +# (min_shape, optimize_target_shape, max_shape) +# For more information refer to fx/input_tensor_spec.py +shape_ranges = [

+
+

((1, 2, 3), (4, 2, 3), (100, 2, 3)),

+
+

],

+
+
+

), +InputTensorSpec(shape=(1, 4, 5), dtype=torch.float32),

+
+

]

+

# Build a TRT interpreter. Set explicit_batch_dimension accordingly. +interpreter = TRTInterpreter(

+
+

acc_mod, input_specs, explicit_batch_dimension=True/False

+
+

)

+

# The output of TRTInterpreter run() is wrapped as TRTInterpreterResult. +# The TRTInterpreterResult contains required parameter to build TRTModule, +# and other informational output from TRTInterpreter run. +class TRTInterpreterResult(NamedTuple):

+
+

engine: Any +input_names: Sequence[str] +output_names: Sequence[str] +serialized_cache: bytearray

+
+

#max_batch_size: set accordingly for maximum batch size you will use. +#max_workspace_size: set to the maximum size we can afford for temporary buffer +#lower_precision: the precision model layers are running on (TensorRT will choose the best perforamnce precision). +#sparse_weights: allow the builder to examine weights and use optimized functions when weights have suitable sparsity +#force_fp32_output: force output to be fp32 +#strict_type_constraints: Usually we should set it to False unless we want to control the precision of certain layer for numeric #reasons. +#algorithm_selector: set up algorithm selection for certain layer +#timing_cache: enable timing cache for TensorRT +#profiling_verbosity: TensorRT logging level +trt_interpreter_result = interpreter.run(

+
+

max_batch_size=64, +max_workspace_size=1 << 25, +sparse_weights=False, +force_fp32_output=False, +strict_type_constraints=False, +algorithm_selector=None, +timing_cache=None, +profiling_verbosity=None,

+
+

)

+
+

Common Errors:

+

RuntimeError: Conversion of function xxx not currently supported! +- This means we don’t have the support for this xxx operator. Please refer to section “How to add a missing op” below for further instructions.

+
    +
  • Step 3: Run the model

  • +
+

One way is using TRTModule, which is basically a PyTorch nn.Module.

+
from torch_tensorrt.fx import TRTModule
+mod = TRTModule(
+    trt_interpreter_result.engine,
+    trt_interpreter_result.input_names,
+    trt_interpreter_result.output_names)
+# Just like all other PyTorch modules
+outputs = mod(*inputs)
+torch.save(mod, "trt.pt")
+reload_trt_mod = torch.load("trt.pt")
+reload_model_output = reload_trt_mod(*inputs)
+
+
+

So far, we give a detailed explanation of major steps in convterting a PyTorch model into TensorRT engine. Users are welcome to refer to the source code for some parameters explanations. In the converting scheme, there are two important actions in it. One is acc tracer which helps us to convert a PyTorch model to acc graph. The other is FX path converter which helps to convert the acc graph’s operation to corresponding TensorRT operation and build up the TensoRT engine for it.

+
+
+

Acc Tracer

+

Acc tracer is a custom FX symbolic tracer. It does a couple more things compare to the vanilla FX symbolic tracer. We mainly depend on it to convert PyTorch ops or builtin ops to acc ops. There are two main purposes for fx2trt to use acc ops:

+
    +
  1. there’re many ops that do similar things in PyTorch ops and builtin ops such like torch.add, builtin.add and torch.Tensor.add. Using acc tracer, we normalize these three ops to a single acc_ops.add. This helps reduce the number of converters we need to write.

  2. +
  3. acc ops only have kwargs which makes writing converter easier as we don’t need to add additional logic to find arguments in args and kwargs.

  4. +
+
+
+

FX2TRT

+

After symbolic tracing, we have the graph representation of a PyTorch model. fx2trt leverages the power of fx.Interpreter. fx.Interpreter goes through the whole graph node by node and calls the function that node represents. fx2trt overrides the original behavior of calling the function with invoking corresponding converts for each node. Each converter function adds corresponding TensorRT layer(s).

+

Below is an example of a converter function. The decorator is used to register this converter function with the corresponding node. In this example, we register this converter to a fx node whose target is acc_ops.sigmoid.

+
@tensorrt_converter(acc_ops.sigmoid)
+def acc_ops_sigmoid(network, target, args, kwargs, name):
+    """
+    network: TensorRT network. We'll be adding layers to it.
+
+    The rest arguments are attributes of fx node.
+    """
+    input_val = kwargs['input']
+
+    if not isinstance(input_val, trt.tensorrt.ITensor):
+        raise RuntimeError(f'Sigmoid received input {input_val} that is not part '
+                        'of the TensorRT region!')
+
+    layer = network.add_activation(input=input_val, type=trt.ActivationType.SIGMOID)
+    layer.name = name
+    return layer.get_output(0)
+
+
+
+

How to Add a Missing Op

+

You can actually add it wherever you want just need to remember import the file so that all acc ops and mapper will be registered before tracing with acc_tracer.

+
    +
  • Step 1. Add a new acc op

  • +
+

TODO: Need to explain more on the logistic of acc op like when we want to break down an op and when we want to reuse other ops.

+

In acc tracer, we convert nodes in the graph to acc ops if there’s a mapping registered for the node to an acc op.

+

In order to make the conversion to acc ops to happen, there’re two things required. One is that there should be an acc op function defined and the other is there should be a mapping registered.

+

Defining an acc op is simple, we first just need a function and register the function as an acc op via this decorator acc_normalizer.py. e.g. the following code adds an acc op named foo() which adds two given inputs.

+
# NOTE: all acc ops should only take kwargs as inputs, therefore we need the "*"
+# at the beginning.
+@register_acc_op
+def foo(*, input, other, alpha):
+    return input + alpha * other
+
+
+

There’re two ways to register a mapping. One is register_acc_op_mapping(). Let’s register a mapping from torch.add to foo() we just created above. We need to add decorator register_acc_op_mapping to it.

+
this_arg_is_optional = True
+
+@register_acc_op_mapping(
+    op_and_target=("call_function", torch.add),
+    arg_replacement_tuples=[
+        ("input", "input"),
+        ("other", "other"),
+        ("alpha", "alpha", this_arg_is_optional),
+    ],
+)
+@register_acc_op
+def foo(*, input, other, alpha=1.0):
+    return input + alpha * other
+
+
+

op_and_target determines which node will trigger this mapping. op and target are the attributes of FX node. In acc_normalization when we see a node with the same op and target as set in the op_and_target, we will trigger the mapping. Since we want to map from torch.add, then op would be call_function and target would be torch.add. arg_replacement_tuples determines how we construct kwargs for new acc op node using args and kwargs from original node. Each tuple in arg_replacement_tuples represents one argument mapping rule. It contains two or three elements. The third element is a boolean variable that determines whether this kwarg is optional in original node. We only need to specify the third element if it’s True. The first element is the argument name in original node which will be used as the acc op node’s argument whose name is the second element in the tuple. The sequence of the tuples does matter because the position of the tuple determines where the argument is in original node’s args. We use this information to map args from original node to kwargs in acc op node. +We don’t have to specify arg_replacement_tuples if none of the followings are true.

+
    +
  1. kwargs of original nodes and acc op nodes have different name.

  2. +
  3. there’re optional arguments.

  4. +
+

The other way to register a mapping is through register_custom_acc_mapper_fn(). This one is designed to reduce the redundant op registration as it allows you to use a function to map to one or more existing acc ops throught some combinations. In the function, you can do basically whatever you want. Let’s use an example to explain how it works.

+
@register_acc_op
+def foo(*, input, other, alpha=1.0):
+    return input + alpha * other
+
+@register_custom_acc_mapper_fn(
+    op_and_target=("call_function", torch.add),
+    arg_replacement_tuples=[
+        ("input", "input"),
+        ("other", "other"),
+        ("alpha", "alpha", this_arg_is_optional),
+    ],
+)
+def custom_mapper(node: torch.fx.Node, _: nn.Module) -> torch.fx.Node:
+    """
+    `node` is original node, which is a call_function node with target
+    being torch.add.
+    """
+    alpha = 1
+    if "alpha" in node.kwargs:
+        alpha = node.kwargs["alpha"]
+    foo_kwargs = {"input": node["input"], "other": node["other"], "alpha": alpha}
+    with node.graph.inserting_before(node):
+        foo_node = node.graph.call_function(foo, kwargs=foo_kwargs)
+        foo_node.meta = node.meta.copy()
+        return foo_node
+
+
+

In the custom mapper function, we construct an acc op node and return it. The node we returns here would take over all the children nodes of original nodes acc_normalizer.py.

+

The last step would be adding unit test for the new acc op or mapper function we added. The place to add the unit test is here test_acc_tracer.py.

+
    +
  • Step 2. Add a new converter

  • +
+

All the developed converters for acc ops are all in acc_op_converter.py. It could give you a good example of how the converter is added.

+

Essentially, the converter is the mapping mechanism that maps the acc ops to a TensorRT layer. If we are able to find all the TensorRT layers we need we can get start to add a converter for the node using TensorRT APIs.

+
@tensorrt_converter(acc_ops.sigmoid)
+def acc_ops_sigmoid(network, target, args, kwargs, name):
+    """
+    network: TensorRT network. We'll be adding layers to it.
+
+    The rest arguments are attributes of fx node.
+    """
+    input_val = kwargs['input']
+
+    if not isinstance(input_val, trt.tensorrt.ITensor):
+        raise RuntimeError(f'Sigmoid received input {input_val} that is not part '
+                        'of the TensorRT region!')
+
+    layer = network.add_activation(input=input_val, type=trt.ActivationType.SIGMOID)
+    layer.name = name
+    return layer.get_output(0)
+
+
+

We need to use tensorrt_converter decorator to register the converter. The argument for the decorator is the target of the fx node that we need to convert. In the converter, we can find the inputs to the fx node in kwargs. As in the example, the original node is acc_ops.sigmoid which only has one argument “input” in acc_ops.py. We get the input and check if it’s a TensorRT tensor. After that, we add a sigmoid layer to TensorRT network and return the output of the layer. The output we returned will be passed to the children nodes of acc_ops.sigmoid by fx.Interpreter.

+

What if we can not find corresponding layers in TensorRT that do the same thing as the node.

+

In this case, we would need to do a bit more work. TensorRT provides plugins which serves as custom layers. We have not implement this feature yet. We will update once it is enabled.

+

Last step would be adding the unit test for the new converter we added. User could add corresponding unit test in this folder.

+
+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/tutorials/getting_started_with_python_api.html b/docs/v1.2.0/tutorials/getting_started_with_python_api.html new file mode 100644 index 0000000000..e063850389 --- /dev/null +++ b/docs/v1.2.0/tutorials/getting_started_with_python_api.html @@ -0,0 +1,654 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Using Torch-TensorRT in Python — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ Using Torch-TensorRT in Python + + ¶ + +

+

+ Torch-TensorRT Python API accepts a + + + `torch.nn.Module + + + as an input. Under the hood, it uses + + + torch.jit.script + + + to convert the input module into a +TorchScript module. To compile your input + + + `torch.nn.Module + + + with Torch-TensorRT, all you need to do is provide the module and inputs +to Torch-TensorRT and you will be returned an optimized TorchScript module to run or add into another PyTorch module. Inputs +is a list of + + + torch_tensorrt.Input + + + classes which define input’s shape, datatype and memory format. You can also specify settings such as +operating precision for the engine or target device. After compilation you can save the module just like any other module +to load in a deployment application. In order to load a TensorRT/TorchScript module, make sure you first import + + + torch_tensorrt + + + . +

+
+
+
import torch_tensorrt
+
+...
+
+model = MyModel().eval() # torch module needs to be in eval (not training) mode
+
+inputs = [torch_tensorrt.Input(
+            min_shape=[1, 1, 16, 16],
+            opt_shape=[1, 1, 32, 32],
+            max_shape=[1, 1, 64, 64],
+            dtype=torch.half,
+        )]
+enabled_precisions = {torch.float, torch.half} # Run with fp16
+
+trt_ts_module = torch_tensorrt.compile(model, inputs=inputs, enabled_precisions=enabled_precisions)
+
+input_data = input_data.to('cuda').half()
+result = trt_ts_module(input_data)
+torch.jit.save(trt_ts_module, "trt_ts_module.ts")
+
+
+
+
+
+
# Deployment application
+import torch
+import torch_tensorrt
+
+trt_ts_module = torch.jit.load("trt_ts_module.ts")
+input_data = input_data.to('cuda').half()
+result = trt_ts_module(input_data)
+
+
+
+

+ Torch-TensorRT python API also provides + + + torch_tensorrt.ts.compile + + + which accepts a TorchScript module as input. +The torchscript module can be obtained via scripting or tracing (refer to + + creating_torchscript_module_in_python + + ). + + + torch_tensorrt.ts.compile + + + accepts a Torchscript module +and a list of + + + torch_tensorrt.Input + + + classes. +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.2.0/tutorials/installation.html b/docs/v1.2.0/tutorials/installation.html new file mode 100644 index 0000000000..2a810c0419 --- /dev/null +++ b/docs/v1.2.0/tutorials/installation.html @@ -0,0 +1,1813 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Installation — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + +

+ Installation + + ¶ + +

+

+ Precompiled Binaries + + ¶ + +

+

+ Dependencies + + ¶ + +

+

+ You need to have either PyTorch or LibTorch installed based on if you are using Python or C++ +and you must have CUDA, cuDNN and TensorRT installed. +

+
+ +
+

+ Python Package + + ¶ + +

+

+ You can install the python package using +

+
+
+
pip3 install torch-tensorrt -f https://github.com/NVIDIA/Torch-TensorRT/releases
+
+
+
+ + +

+ C++ Binary Distribution + + ¶ + +

+

+ Precompiled tarballs for releases are provided here: + + https://github.com/NVIDIA/Torch-TensorRT/releases + +

+ + +

+ Compiling From Source + + ¶ + +

+ + +

+ Dependencies for Compilation + + ¶ + +

+

+ Torch-TensorRT is built with Bazel, so begin by installing it. +

+
+
+ +
+
+
export BAZEL_VERSION=$(cat <PATH_TO_TORCHTRT_ROOT>/.bazelversion)
+mkdir bazel
+cd bazel
+curl -fSsL -O https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-dist.zip
+unzip bazel-$BAZEL_VERSION-dist.zip
+bash ./compile.sh
+cp output/bazel /usr/local/bin/
+
+
+
+
+
+

+ You will also need to have CUDA installed on the system (or if running in a container, the system must have +the CUDA driver installed and the container must have CUDA) +

+

+ The correct LibTorch version will be pulled down for you by bazel. +

+
+
+

+ NOTE: For best compatability with official PyTorch, use torch==1.10.0+cuda113, TensorRT 8.0 and cuDNN 8.2 for CUDA 11.3 however Torch-TensorRT itself supports +TensorRT and cuDNN for other CUDA versions for usecases such as using NVIDIA compiled distributions of PyTorch that use other versions of CUDA +e.g. aarch64 or custom compiled version of PyTorch. +

+
+
+ + +

+ Choosing the Right ABI + + ¶ + +

+

+ Likely the most complicated thing about compiling Torch-TensorRT is selecting the correct ABI. There are two options +which are incompatible with each other, pre-cxx11-abi and the cxx11-abi. The complexity comes from the fact that while +the most popular distribution of PyTorch (wheels downloaded from pytorch.org/pypi directly) use the pre-cxx11-abi, most +other distributions you might encounter (e.g. ones from NVIDIA - NGC containers, and builds for Jetson as well as certain +libtorch builds and likely if you build PyTorch from source) use the cxx11-abi. It is important you compile Torch-TensorRT +using the correct ABI to function properly. Below is a table with general pairings of PyTorch distribution sources and the +recommended commands: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ PyTorch Source +

+
+

+ Recommended C++ Compilation Command +

+
+

+ Recommended Python Compilation Command +

+
+

+ PyTorch whl file from PyTorch.org +

+
+

+ bazel build //:libtorchtrt -c opt –config pre_cxx11_abi +

+
+

+ python3 setup.py bdist_wheel +

+
+

+ libtorch-shared-with-deps- + + + * + + + .zip from PyTorch.org +

+
+

+ bazel build //:libtorchtrt -c opt –config pre_cxx11_abi +

+
+

+ python3 setup.py bdist_wheel +

+
+

+ libtorch-cxx11-abi-shared-with-deps- + + + * + + + .zip from PyTorch.org +

+
+

+ bazel build //:libtorchtrt -c opt +

+
+

+ python3 setup.py bdist_wheel –use-cxx11-abi +

+
+

+ PyTorch preinstalled in an NGC container +

+
+

+ bazel build //:libtorchtrt -c opt +

+
+

+ python3 setup.py bdist_wheel –use-cxx11-abi +

+
+

+ PyTorch from the NVIDIA Forums for Jetson +

+
+

+ bazel build //:libtorchtrt -c opt +

+
+

+ python3 setup.py bdist_wheel –jetpack-version 4.6 –use-cxx11-abi +

+
+

+ PyTorch built from Source +

+
+

+ bazel build //:libtorchtrt -c opt +

+
+

+ python3 setup.py bdist_wheel –use-cxx11-abi +

+
+
+
+

+ NOTE: For all of the above cases you must correctly declare the source of PyTorch you intend to use in your WORKSPACE file for both Python and C++ builds. See below for more information +

+
+
+

+ You then have two compilation options: +

+ + +

+ + Building using cuDNN & TensorRT tarball distributions + + + ¶ + +

+
+
+

+ This is recommended so as to build Torch-TensorRT hermetically and insures any compilation errors are not caused by version issues +

+

+ Make sure when running Torch-TensorRT that these versions of the libraries are prioritized in your + + + $LD_LIBRARY_PATH + + +

+
+
+
+
+ You need to download the tarball distributions of TensorRT and cuDNN from the NVIDIA website. +
+
+ +
+
+

+ Place these files in a directory (the directories + + + third_party/distdir/[x86_64-linux-gnu + + + | + + + aarch64-linux-gnu] + + + exist for this purpose) +

+

+ Then compile referencing the directory with the tarballs +

+
+
+

+ If you get errors regarding the packages, check their sha256 hashes and make sure they match the ones listed in + + + WORKSPACE + + +

+
+
+

+ Release Build + + ¶ + +

+
+
+
bazel build //:libtorchtrt -c opt --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu]
+
+
+
+

+ A tarball with the include files and library can then be found in + + + bazel-bin + + +

+ + +

+ Debug Build + + ¶ + +

+

+ To build with debug symbols use the following command +

+
+
+
bazel build //:libtorchtrt -c dbg --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu]
+
+
+
+

+ A tarball with the include files and library can then be found in + + + bazel-bin + + +

+

+ Pre CXX11 ABI Build + + ¶ + +

+

+ To build using the pre-CXX11 ABI use the + + + pre_cxx11_abi + + + config +

+
+
+
bazel build //:libtorchtrt --config pre_cxx11_abi -c [dbg/opt] --distdir third_party/distdir/[x86_64-linux-gnu | aarch64-linux-gnu]
+
+
+
+

+ A tarball with the include files and library can then be found in + + + bazel-bin + + +

+ + +

+ + Building using locally installed cuDNN & TensorRT + + + ¶ + +

+
+
+

+ If you encounter bugs and you compiled using this method please disclose that you used local sources in the issue (an ldd dump would be nice too) +

+
+
+

+ Install TensorRT, CUDA and cuDNN on the system before starting to compile. +

+

+ In WORKSPACE comment out: +

+
+
+
# Downloaded distributions to use with --distdir
+http_archive(
+    name = "cudnn",
+    urls = ["<URL>",],
+
+    build_file = "@//third_party/cudnn/archive:BUILD",
+    sha256 = "<TAR SHA256>",
+    strip_prefix = "cuda"
+)
+
+http_archive(
+    name = "tensorrt",
+    urls = ["<URL>",],
+
+    build_file = "@//third_party/tensorrt/archive:BUILD",
+    sha256 = "<TAR SHA256>",
+    strip_prefix = "TensorRT-<VERSION>"
+)
+
+
+
+

+ and uncomment +

+
+
+
# Locally installed dependencies
+new_local_repository(
+    name = "cudnn",
+    path = "/usr/",
+    build_file = "@//third_party/cudnn/local:BUILD"
+)
+
+new_local_repository(
+name = "tensorrt",
+path = "/usr/",
+build_file = "@//third_party/tensorrt/local:BUILD"
+)
+
+
+
+

+ Release Build + + ¶ + +

+

+ Compile using: +

+
+
+
bazel build //:libtorchtrt -c opt
+
+
+
+

+ A tarball with the include files and library can then be found in + + + bazel-bin + + +

+ + +

+ Debug Build + + ¶ + +

+

+ To build with debug symbols use the following command +

+
+
+
bazel build //:libtorchtrt -c dbg
+
+
+
+

+ A tarball with the include files and library can then be found in + + + bazel-bin + + +

+

+ Pre CXX11 ABI Build + + ¶ + +

+

+ To build using the pre-CXX11 ABI use the + + + pre_cxx11_abi + + + config +

+
+
+
bazel build //:libtorchtrt --config pre_cxx11_abi -c [dbg/opt]
+
+
+
+

+ + Building the Python package + + + ¶ + +

+

+ Begin by installing + + + ninja + + +

+

+ You can build the Python package using + + + setup.py + + + (this will also build the correct version of + + + libtorchtrt.so + + + ) +

+
+
+
python3 setup.py [install/bdist_wheel]
+
+
+
+

+ Debug Build + + ¶ + +

+
+
+
python3 setup.py develop [--user]
+
+
+
+

+ This also compiles a debug build of + + + libtorchtrt.so + + +

+

+ + Building Natively on aarch64 (Jetson) + + + ¶ + +

+

+ Prerequisites + + ¶ + +

+

+ Install or compile a build of PyTorch/LibTorch for aarch64 +

+

+ NVIDIA hosts builds the latest release branch for Jetson here: +

+
+ +
+

+ Enviorment Setup + + ¶ + +

+

+ To build natively on aarch64-linux-gnu platform, configure the + + + WORKSPACE + + + with local available dependencies. +

+
    +
  1. +

    + Disable the rules with + + + http_archive + + + for x86_64 by commenting the following rules: +

    +
  2. +
+
+
+
#http_archive(
+#    name = "libtorch",
+#    build_file = "@//third_party/libtorch:BUILD",
+#    strip_prefix = "libtorch",
+#    urls = ["https://download.pytorch.org/libtorch/cu102/libtorch-cxx11-abi-shared-with-deps-1.5.1.zip"],
+#    sha256 = "cf0691493d05062fe3239cf76773bae4c5124f4b039050dbdd291c652af3ab2a"
+#)
+
+#http_archive(
+#    name = "libtorch_pre_cxx11_abi",
+#    build_file = "@//third_party/libtorch:BUILD",
+#    strip_prefix = "libtorch",
+#    sha256 = "818977576572eadaf62c80434a25afe44dbaa32ebda3a0919e389dcbe74f8656",
+#    urls = ["https://download.pytorch.org/libtorch/cu102/libtorch-shared-with-deps-1.5.1.zip"],
+#)
+
+# Download these tarballs manually from the NVIDIA website
+# Either place them in the distdir directory in third_party and use the --distdir flag
+# or modify the urls to "file:///<PATH TO TARBALL>/<TARBALL NAME>.tar.gz
+
+#http_archive(
+#    name = "cudnn",
+#    urls = ["https://developer.nvidia.com/compute/machine-learning/cudnn/secure/8.0.1.13/10.2_20200626/cudnn-10.2-linux-x64-v8.0.1.13.tgz"],
+#    build_file = "@//third_party/cudnn/archive:BUILD",
+#    sha256 = "0c106ec84f199a0fbcf1199010166986da732f9b0907768c9ac5ea5b120772db",
+#    strip_prefix = "cuda"
+#)
+
+#http_archive(
+#    name = "tensorrt",
+#    urls = ["https://developer.nvidia.com/compute/machine-learning/tensorrt/secure/7.1/tars/TensorRT-7.1.3.4.Ubuntu-18.04.x86_64-gnu.cuda-10.2.cudnn8.0.tar.gz"],
+#    build_file = "@//third_party/tensorrt/archive:BUILD",
+#    sha256 = "9205bed204e2ae7aafd2e01cce0f21309e281e18d5bfd7172ef8541771539d41",
+#    strip_prefix = "TensorRT-7.1.3.4"
+#)
+
+NOTE: You may also need to configure the CUDA version to 10.2 by setting the path for the cuda new_local_repository
+
+
+
+
    +
  1. +

    + Configure the correct paths to directory roots containing local dependencies in the + + + new_local_repository + + + rules: +

    +
    +
    +

    + NOTE: If you installed PyTorch using a pip package, the correct path is the path to the root of the python torch package. +In the case that you installed with + + + sudo + + + pip + + + install + + + this will be + + + /usr/local/lib/python3.6/dist-packages/torch + + + . +In the case you installed with + + + pip + + + install + + + --user + + + this will be + + + $HOME/.local/lib/python3.6/site-packages/torch + + + . +

    +
    +
    +
  2. +
+

+ In the case you are using NVIDIA compiled pip packages, set the path for both libtorch sources to the same path. This is because unlike +PyTorch on x86_64, NVIDIA aarch64 PyTorch uses the CXX11-ABI. If you compiled for source using the pre_cxx11_abi and only would like to +use that library, set the paths to the same path but when you compile make sure to add the flag + + + --config=pre_cxx11_abi + + +

+
+
+
new_local_repository(
+    name = "libtorch",
+    path = "/usr/local/lib/python3.6/dist-packages/torch",
+    build_file = "third_party/libtorch/BUILD"
+)
+
+new_local_repository(
+    name = "libtorch_pre_cxx11_abi",
+    path = "/usr/local/lib/python3.6/dist-packages/torch",
+    build_file = "third_party/libtorch/BUILD"
+)
+
+new_local_repository(
+    name = "cudnn",
+    path = "/usr/",
+    build_file = "@//third_party/cudnn/local:BUILD"
+)
+
+new_local_repository(
+    name = "tensorrt",
+    path = "/usr/",
+    build_file = "@//third_party/tensorrt/local:BUILD"
+)
+
+
+
+

+ Compile C++ Library and Compiler CLI + + ¶ + +

+
+
+

+ NOTE: Due to shifting dependency locations between Jetpack 4.5 and 4.6 there is a now a flag to inform bazel of the Jetpack version +

+
+
+
--platforms //toolchains:jetpack_4.x
+
+
+
+
+
+

+ Compile Torch-TensorRT library using bazel command: +

+
+
+
bazel build //:libtorchtrt --platforms //toolchains:jetpack_4.6
+
+
+
+

+ Compile Python API + + ¶ + +

+
+
+

+ NOTE: Due to shifting dependencies locations between Jetpack 4.5 and Jetpack 4.6 there is now a flag for + + + setup.py + + + which sets the jetpack version (default: 4.6) +

+
+
+

+ Compile the Python API using the following command from the + + + //py + + + directory: +

+
+
+
python3 setup.py install --use-cxx11-abi
+
+
+
+

+ If you have a build of PyTorch that uses Pre-CXX11 ABI drop the + + + --use-cxx11-abi + + + flag +

+

+ If you are building for Jetpack 4.5 add the + + + --jetpack-version + + + 4.5 + + + flag +

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.2.0/tutorials/notebooks.html b/docs/v1.2.0/tutorials/notebooks.html new file mode 100644 index 0000000000..b284caf974 --- /dev/null +++ b/docs/v1.2.0/tutorials/notebooks.html @@ -0,0 +1,819 @@ + + + + + + + + + + + + + Example notebooks — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Example notebooks
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Example notebooks

+

There exists a number of notebooks which cover specific using specific features and models +with Torch-TensorRT

+
+

Notebooks

+
+

Compiling CitriNet with Torch-TensorRT

+

Citrinet is an acoustic model used for the speech to text recognition task. It is a version +of QuartzNet that extends ContextNet, utilizing subword encoding (via Word Piece tokenization) +and Squeeze-and-Excitation(SE) mechanism and are therefore smaller than QuartzNet models. CitriNet +models take in audio segments and transcribe them to letter, byte pair, or word piece sequences.

+

This notebook demonstrates the steps for optimizing a pretrained CitriNet model with Torch-TensorRT, +and running it to test the speedup obtained.

+ +
+
+

Compiling EfficentNet with Torch-TensorRT

+

EfficentNet is a feedforward CNN designed to achieve better performance and accuracy than alternative architectures +by using a “scaling method that uniformly scales all dimensions of depth/width/resolution using a simple yet highly effective compound coefficient”.

+

This notebook demonstrates the steps for optimizing a pretrained EfficentNet model with Torch-TensorRT, +and running it to test the speedup obtained.

+ +
+
+

Masked Language Modeling (MLM) with Hugging Face BERT Transformer accelerated by Torch-TensorRT

+

“BERT is a transformer model pretrained on a large corpus of English data in a self-supervised fashion. +This way, the model learns an inner representation of the English language that can then be used to extract +features useful for downstream tasks: if you have a dataset of labeled sentences for instance, you can train +a standard classifier using the features produced by the BERT model as inputs.” (https://huggingface.co/bert-base-uncased)

+

This notebook demonstrates the steps for optimizing a pretrained EfficentNet model with Torch-TensorRT, +and running it to test the speedup obtained.

+ +
+
+

Serving a model in C++ using Torch-TensorRT

+

This example shows how you can load a pretrained ResNet-50 model, convert it to a Torch-TensorRT +optimized model (via the Torch-TensorRT Python API), save the model as a torchscript module, and +then finally load and serve the model with the PyTorch C++ API.

+ +
+
+

Compiling ResNet50 with Torch-TensorRT

+

This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a +pretrained ResNet-50 network, and running it to test the speedup obtained.

+ +
+
+

Using Dynamic Shapes with Torch-TensorRT

+

Making use of Dynamic Shaped Tensors in Torch TensorRT is quite simple. Let’s say you are +using the torch_tensorrt.compile(...) function to compile a torchscript module. One +of the args in this function in this function is input: which defines an input to a +module in terms of expected shape, data type and tensor format: torch_tensorrt.Input.

+

For the purposes of this walkthrough we just need three kwargs: min_shape, opt_shape` and max_shape.

+
torch_tensorrt.Input(
+        min_shape=(1, 224, 224, 3),
+        opt_shape=(1, 512, 512, 3),
+        max_shape=(1, 1024, 1024, 3),
+        dtype=torch.int32
+        format=torch.channel_last
+    )
+...
+
+
+

In this example, we are going to use a simple ResNet model to demonstrate the use of the API.

+ +
+
+

Using the FX Frontend with Torch-TensorRT

+

The purpose of this example is to demostrate the overall flow of lowering a PyTorch model to TensorRT +conveniently with using FX.

+ +
+
+

Compiling a PyTorch model using FX Frontend with Torch-TensorRT

+

The purpose of this example is to demonstrate the overall flow of lowering a PyTorch +model to TensorRT via FX with existing FX based tooling

+ +
+
+

Compiling LeNet with Torch-TensorRT

+

This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a simple LeNet network.

+ +
+
+

Accelerate Deep Learning Models using Quantization in Torch-TensorRT

+

Model Quantization is a popular way of optimization which reduces the size of models thereby +accelerating inference, also opening up the possibilities of deployments on devices with lower +computation power such as Jetson. Simply put, quantization is a process of mapping input values

+
+

from a larger set to output values in a smaller set. In this notebook, we illustrate the workflow +that you can adopt while quantizing a deep learning model in Torch-TensorRT. The notebook takes +you through an example of Mobilenetv2 for a classification task on a subset of Imagenet Dataset +called Imagenette which has 10 classes.

+
+ +
+
+

Object Detection with Torch-TensorRT (SSD)

+

This notebook demonstrates the steps for compiling a TorchScript module with Torch-TensorRT on a pretrained SSD network, and running it to test the speedup obtained.

+ +
+
+

Deploying Quantization Aware Trained models in INT8 using Torch-TensorRT

+

Quantization Aware training (QAT) simulates quantization during training by +quantizing weights and activation layers. This will help to reduce the loss in +accuracy when we convert the network trained in FP32 to INT8 for faster inference. +QAT introduces additional nodes in the graph which will be used to learn the dynamic +ranges of weights and activation layers. In this notebook, we illustrate the following +steps from training to inference of a QAT model in Torch-TensorRT.

+ +
+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/tutorials/ptq.html b/docs/v1.2.0/tutorials/ptq.html new file mode 100644 index 0000000000..0d52cc53c9 --- /dev/null +++ b/docs/v1.2.0/tutorials/ptq.html @@ -0,0 +1,845 @@ + + + + + + + + + + + + + Post Training Quantization (PTQ) — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Post Training Quantization (PTQ)
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Post Training Quantization (PTQ)

+

Post Training Quantization (PTQ) is a technique to reduce the required computational resources for inference +while still preserving the accuracy of your model by mapping the traditional FP32 activation space to a reduced +INT8 space. TensorRT uses a calibration step which executes your model with sample data from the target domain +and track the activations in FP32 to calibrate a mapping to INT8 that minimizes the information loss between +FP32 inference and INT8 inference.

+

Users writing TensorRT applications are required to setup a calibrator class which will provide sample data to +the TensorRT calibrator. With Torch-TensorRT we look to leverage existing infrastructure in PyTorch to make implementing +calibrators easier.

+

LibTorch provides a DataLoader and Dataset API which steamlines preprocessing and batching input data. +These APIs are exposed via both C++ and Python interface which makes it easier for the end user. +For C++ interface, we use torch::Dataset and torch::data::make_data_loader objects to construct and perform pre-processing on datasets. +The equivalent functionality in python interface uses torch.utils.data.Dataset and torch.utils.data.DataLoader. +This section of the PyTorch documentation has more information https://pytorch.org/tutorials/advanced/cpp_frontend.html#loading-data and https://pytorch.org/tutorials/recipes/recipes/loading_data_recipe.html. +Torch-TensorRT uses Dataloaders as the base of a generic calibrator implementation. So you will be able to reuse or quickly +implement a torch::Dataset for your target domain, place it in a DataLoader and create a INT8 Calibrator +which you can provide to Torch-TensorRT to run INT8 Calibration during compliation of your module.

+
+

How to create your own PTQ application in C++

+

Here is an example interface of a torch::Dataset class for CIFAR10:

+
 1//cpp/ptq/datasets/cifar10.h
+ 2#pragma once
+ 3
+ 4#include "torch/data/datasets/base.h"
+ 5#include "torch/data/example.h"
+ 6#include "torch/types.h"
+ 7
+ 8#include <cstddef>
+ 9#include <string>
+10
+11namespace datasets {
+12// The CIFAR10 Dataset
+13class CIFAR10 : public torch::data::datasets::Dataset<CIFAR10> {
+14public:
+15    // The mode in which the dataset is loaded
+16    enum class Mode { kTrain, kTest };
+17
+18    // Loads CIFAR10 from un-tarred file
+19    // Dataset can be found https://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz
+20    // Root path should be the directory that contains the content of tarball
+21    explicit CIFAR10(const std::string& root, Mode mode = Mode::kTrain);
+22
+23    // Returns the pair at index in the dataset
+24    torch::data::Example<> get(size_t index) override;
+25
+26    // The size of the dataset
+27    c10::optional<size_t> size() const override;
+28
+29    // The mode the dataset is in
+30    bool is_train() const noexcept;
+31
+32    // Returns all images stacked into a single tensor
+33    const torch::Tensor& images() const;
+34
+35    // Returns all targets stacked into a single tensor
+36    const torch::Tensor& targets() const;
+37
+38    // Trims the dataset to the first n pairs
+39    CIFAR10&& use_subset(int64_t new_size);
+40
+41
+42private:
+43    Mode mode_;
+44    torch::Tensor images_, targets_;
+45};
+46} // namespace datasets
+
+
+

This class’s implementation reads from the binary distribution of the CIFAR10 dataset and builds two tensors which hold the images and labels.

+

We use a subset of the dataset to use for calibration, since we don’t need the the full dataset for effective calibration and calibration does +some take time, then define the preprocessing to apply to the images in the dataset and create a DataLoader from the dataset which will batch the data:

+
auto calibration_dataset = datasets::CIFAR10(data_dir, datasets::CIFAR10::Mode::kTest)
+                                    .use_subset(320)
+                                    .map(torch::data::transforms::Normalize<>({0.4914, 0.4822, 0.4465},
+                                                                            {0.2023, 0.1994, 0.2010}))
+                                    .map(torch::data::transforms::Stack<>());
+auto calibration_dataloader = torch::data::make_data_loader(std::move(calibration_dataset),
+                                                            torch::data::DataLoaderOptions().batch_size(32)
+                                                                                            .workers(2));
+
+
+

Next we create a calibrator from the calibration_dataloader using the calibrator factory (found in torch_tensorrt/ptq.h):

+
#include "torch_tensorrt/ptq.h"
+...
+
+auto calibrator = torch_tensorrt::ptq::make_int8_calibrator(std::move(calibration_dataloader), calibration_cache_file, true);
+
+
+

Here we also define a location to write a calibration cache file to which we can use to reuse the calibration data without needing the dataset and whether or not +we should use the cache file if it exists. There also exists a torch_tensorrt::ptq::make_int8_cache_calibrator factory which creates a calibrator that uses the cache +only for cases where you may do engine building on a machine that has limited storage (i.e. no space for a full dataset) or to have a simpiler deployment application.

+

The calibrator factories create a calibrator that inherits from a nvinfer1::IInt8Calibrator virtual class (nvinfer1::IInt8EntropyCalibrator2 by default) which +defines the calibration algorithm used when calibrating. You can explicitly make the selection of calibration algorithm like this:

+
// MinMax Calibrator is geared more towards NLP tasks
+auto calibrator = torch_tensorrt::ptq::make_int8_calibrator<nvinfer1::IInt8MinMaxCalibrator>(std::move(calibration_dataloader), calibration_cache_file, true);
+
+
+

Then all thats required to setup the module for INT8 calibration is to set the following compile settings in the torch_tensorrt::CompileSpec struct and compiling the module:

+
std::vector<std::vector<int64_t>> input_shape = {{32, 3, 32, 32}};
+/// Configure settings for compilation
+auto compile_spec = torch_tensorrt::CompileSpec({input_shape});
+/// Set operating precision to INT8
+compile_spec.enabled_precisions.insert(torch::kF16);
+compile_spec.enabled_precisions.insert(torch::kI8);
+/// Use the TensorRT Entropy Calibrator
+compile_spec.ptq_calibrator = calibrator;
+
+auto trt_mod = torch_tensorrt::CompileGraph(mod, compile_spec);
+
+
+

If you have an existing Calibrator implementation for TensorRT you may directly set the ptq_calibrator field with a pointer to your calibrator and it will work as well. +From here not much changes in terms of how to execution works. You are still able to fully use LibTorch as the sole interface for inference. Data should remain +in FP32 precision when it’s passed into trt_mod.forward. There exists an example application in the Torch-TensorRT demo that takes you from training a VGG16 network on +CIFAR10 to deploying in INT8 with Torch-TensorRT here: https://github.com/pytorch/TensorRT/tree/master/cpp/ptq

+
+
+

How to create your own PTQ application in Python

+

Torch-TensorRT Python API provides an easy and convenient way to use pytorch dataloaders with TensorRT calibrators. DataLoaderCalibrator class can be used to create +a TensorRT calibrator by providing desired configuration. The following code demonstrates an example on how to use it

+
testing_dataset = torchvision.datasets.CIFAR10(
+    root="./data",
+    train=False,
+    download=True,
+    transform=transforms.Compose(
+        [
+            transforms.ToTensor(),
+            transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
+        ]
+    ),
+)
+
+testing_dataloader = torch.utils.data.DataLoader(
+    testing_dataset, batch_size=1, shuffle=False, num_workers=1
+)
+calibrator = torch_tensorrt.ptq.DataLoaderCalibrator(
+    testing_dataloader,
+    cache_file="./calibration.cache",
+    use_cache=False,
+    algo_type=torch_tensorrt.ptq.CalibrationAlgo.ENTROPY_CALIBRATION_2,
+    device=torch.device("cuda:0"),
+)
+
+trt_mod = torch_tensorrt.compile(model, inputs=[torch_tensorrt.Input((1, 3, 32, 32))],
+                                    enabled_precisions={torch.float, torch.half, torch.int8},
+                                    calibrator=calibrator,
+                                    device={
+                                         "device_type": torch_tensorrt.DeviceType.GPU,
+                                         "gpu_id": 0,
+                                         "dla_core": 0,
+                                         "allow_gpu_fallback": False,
+                                         "disable_tf32": False
+                                     })
+
+
+

In the cases where there is a pre-existing calibration cache file that users want to use, CacheCalibrator can be used without any dataloaders. The following example demonstrates how +to use CacheCalibrator to use in INT8 mode.

+
calibrator = torch_tensorrt.ptq.CacheCalibrator("./calibration.cache")
+
+trt_mod = torch_tensorrt.compile(model, inputs=[torch_tensorrt.Input([1, 3, 32, 32])],
+                                      enabled_precisions={torch.float, torch.half, torch.int8},
+                                      calibrator=calibrator)
+
+
+

If you already have an existing calibrator class (implemented directly using TensorRT API), you can directly set the calibrator field to your class which can be very convenient. +For a demo on how PTQ can be performed on a VGG network using Torch-TensorRT API, you can refer to https://github.com/pytorch/TensorRT/blob/master/tests/py/test_ptq_dataloader_calibrator.py +and https://github.com/pytorch/TensorRT/blob/master/tests/py/test_ptq_trt_calibrator.py

+
+

Citations

+

Krizhevsky, A., & Hinton, G. (2009). Learning multiple layers of features from tiny images.

+

Simonyan, K., & Zisserman, A. (2014). Very deep convolutional networks for large-scale image recognition. arXiv preprint arXiv:1409.1556.

+
+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/tutorials/runtime.html b/docs/v1.2.0/tutorials/runtime.html new file mode 100644 index 0000000000..f2f522096f --- /dev/null +++ b/docs/v1.2.0/tutorials/runtime.html @@ -0,0 +1,703 @@ + + + + + + + + + + + + + Deploying Torch-TensorRT Programs — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Deploying Torch-TensorRT Programs
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Deploying Torch-TensorRT Programs

+

After compiling and saving Torch-TensorRT programs there is no longer a strict dependency on the full +Torch-TensorRT library. All that is required to run a compiled program is the runtime. There are therfore a couple +options to deploy your programs other than shipping the full Torch-TensorRT compiler with your applications.

+
+

Torch-TensorRT package / libtorchtrt.so

+

Once a program is compiled, you run it using the standard PyTorch APIs. All that is required is that the package +must be imported in python or linked in C++.

+
+
+

Runtime Library

+

Distributed with the C++ distribution is libtorchtrt_runtime.so. This library only contains the components +necessary to run Torch-TensorRT programs. Instead of linking libtorchtrt.so or importing torch_tensorrt you can +link libtorchtrt_runtime.so in your deployment programs or use DL_OPEN or LD_PRELOAD. For python +you can load the runtime with torch.ops.load_library("libtorchtrt_runtime.so"). You can then continue to use +programs just as you would otherwise via PyTorch API.

+
+

Note

+

If you are using the standard distribution of PyTorch in Python on x86, likely you will need the pre-cxx11-abi variant of libtorchtrt_runtime.so, check Installation documentation for more details.

+
+
+

Note

+

If you are linking libtorchtrt_runtime.so, likely using the following flags will help -Wl,--no-as-needed -ltorchtrt -Wl,--as-needed as theres no direct symbol dependency to anything in the Torch-TensorRT runtime for most Torch-TensorRT runtime applications

+
+

An example of how to use libtorchtrt_runtime.so can be found here: https://github.com/pytorch/TensorRT/tree/master/examples/torchtrt_runtime_example

+
+
+

Plugin Library

+

In the case you use Torch-TensorRT as a converter to a TensorRT engine and your engine uses plugins provided by Torch-TensorRT, Torch-TensorRT +ships the library libtorchtrt_plugins.so which contains the implementation of the TensorRT plugins used by Torch-TensorRT during +compilation. This library can be DL_OPEN or LD_PRELOAD similar to other TensorRT plugin libraries.

+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/tutorials/serving_torch_tensorrt_with_triton.html b/docs/v1.2.0/tutorials/serving_torch_tensorrt_with_triton.html new file mode 100644 index 0000000000..8d94202892 --- /dev/null +++ b/docs/v1.2.0/tutorials/serving_torch_tensorrt_with_triton.html @@ -0,0 +1,850 @@ + + + + + + + + + + + + + Serving a Torch-TensorRT model with Triton — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Serving a Torch-TensorRT model with Triton
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Serving a Torch-TensorRT model with Triton

+

Optimization and deployment go hand in hand in a discussion about Machine +Learning infrastructure. Once network level optimzation are done +to get the maximum performance, the next step would be to deploy it.

+

However, serving this optimized model comes with it’s own set of considerations +and challenges like: building an infrastructure to support concorrent model +executions, supporting clients over HTTP or gRPC and more.

+

The Triton Inference Server +solves the aforementioned and more. Let’s discuss step-by-step, the process of +optimizing a model with Torch-TensorRT, deploying it on Triton Inference +Server, and building a client to query the model.

+
+

Step 1: Optimize your model with Torch-TensorRT

+

Most Torch-TensorRT users will be familiar with this step. For the purpose of +this demonstration, we will be using a ResNet50 model from Torchhub.

+

Let’s first pull the NGC PyTorch Docker container. You may need to create +an account and get the API key from here. +Sign up and login with your key (follow the instructions +here after signing up).

+
# <xx.xx> is the yy:mm for the publishing tag for NVIDIA's Pytorch
+# container; eg. 22.04
+
+docker run -it --gpus all -v ${PWD}:/scratch_space nvcr.io/nvidia/pytorch:<xx.xx>-py3
+cd /scratch_space
+
+
+

Once inside the container, we can proceed to download a ResNet model from +Torchhub and optimize it with Torch-TensorRT.

+
import torch
+import torch_tensorrt
+torch.hub._validate_not_a_forked_repo=lambda a,b,c: True
+
+# load model
+model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True).eval().to("cuda")
+
+# Compile with Torch TensorRT;
+trt_model = torch_tensorrt.compile(model,
+    inputs= [torch_tensorrt.Input((1, 3, 224, 224))],
+    enabled_precisions= { torch.half} # Run with FP32
+)
+
+# Save the model
+torch.jit.save(trt_model, "model.pt")
+
+
+

After copying the model, exit the container. The next step in the process +is to set up a Triton Inference Server.

+
+
+

Step 2: Set Up Triton Inference Server

+

If you are new to the Triton Inference Server and want to learn more, we +highly recommend to checking our Github +Repository.

+

To use Triton, we need to make a model repository. A model repository, as the +name suggested, is a repository of the models the Inference server hosts. While +Triton can serve models from multiple repositories, in this example, we will +discuss the simplest possible form of the model repository.

+

The structure of this repository should look something like this:

+
model_repository
+|
++-- resnet50
+    |
+    +-- config.pbtxt
+    +-- 1
+        |
+        +-- model.pt
+
+
+

There are two files that Triton requires to serve the model: the model itself +and a model configuration file which is typically provided in config.pbtxt. +For the model we prepared in step 1, the following configuration can be used:

+
name: "resnet50"
+platform: "pytorch_libtorch"
+max_batch_size : 0
+input [
+  {
+    name: "input__0"
+    data_type: TYPE_FP32
+    dims: [ 3, 224, 224 ]
+    reshape { shape: [ 1, 3, 224, 224 ] }
+  }
+]
+output [
+  {
+    name: "output__0"
+    data_type: TYPE_FP32
+    dims: [ 1, 1000 ,1, 1]
+    reshape { shape: [ 1, 1000 ] }
+  }
+]
+
+
+

The config.pbtxt file is used to describe the exact model configuration +with details like the names and shapes of the input and output layer(s), +datatypes, scheduling and batching details and more. If you are new to Triton, +we highly encourage you to check out this section of our +documentation +for more details.

+

With the model repository setup, we can proceed to launch the Triton server +with the docker command below. Refer this page for the pull tag for the container.

+
# Make sure that the TensorRT version in the Triton container
+# and TensorRT version in the environment used to optimize the model
+# are the same.
+
+docker run --gpus all --rm -p 8000:8000 -p 8001:8001 -p 8002:8002 -v /full/path/to/the_model_repository/model_repository:/models nvcr.io/nvidia/tritonserver:<xx.yy>-py3 tritonserver --model-repository=/models
+
+
+

This should spin up a Triton Inference server. Next step, building a simple +http client to query the server.

+
+
+

Step 3: Building a Triton Client to Query the Server

+

Before proceeding, make sure to have a sample image on hand. If you don’t +have one, download an example image to test inference. In this section, we +will be going over a very basic client. For a variety of more fleshed out +examples, refer to the Triton Client Repository

+
wget  -O img1.jpg "https://www.hakaimagazine.com/wp-content/uploads/header-gulf-birds.jpg"
+
+
+

We then need to install dependencies for building a python client. These will +change from client to client. For a full list of all languages supported by Triton, +please refer to Triton’s client repository.

+
pip install torchvision
+pip install attrdict
+pip install nvidia-pyindex
+pip install tritonclient[all]
+
+
+

Let’s jump into the client. Firstly, we write a small preprocessing function to +resize and normalize the query image.

+
import numpy as np
+from torchvision import transforms
+from PIL import Image
+import tritonclient.http as httpclient
+from tritonclient.utils import triton_to_np_dtype
+
+# preprocessing function
+def rn50_preprocess(img_path="img1.jpg"):
+    img = Image.open(img_path)
+    preprocess = transforms.Compose([
+        transforms.Resize(256),
+        transforms.CenterCrop(224),
+        transforms.ToTensor(),
+        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
+    ])
+    return preprocess(img).numpy()
+
+transformed_img = rn50_preprocess()
+
+
+

Building a client requires three basic points. Firstly, we setup a connection +with the Triton Inference Server.

+
# Setting up client
+client = httpclient.InferenceServerClient(url="localhost:8000")
+
+
+

Secondly, we specify the names of the input and output layer(s) of our model.

+
inputs = httpclient.InferInput("input__0", transformed_img.shape, datatype="FP32")
+inputs.set_data_from_numpy(transformed_img, binary_data=True)
+
+outputs = httpclient.InferRequestedOutput("output__0", binary_data=True, class_count=1000)
+
+
+

Lastly, we send an inference request to the Triton Inference Server.

+
# Querying the server
+results = client.infer(model_name="resnet50", inputs=[inputs], outputs=[outputs])
+inference_output = results.as_numpy('output__0')
+print(inference_output[:5])
+
+
+

The output of the same should look like below:

+
[b'12.468750:90' b'11.523438:92' b'9.664062:14' b'8.429688:136'
+ b'8.234375:11']
+
+
+

The output format here is <confidence_score>:<classification_index>. +To learn how to map these to the label names and more, refer to Triton Inference Server’s +documentation.

+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/tutorials/torchtrtc.html b/docs/v1.2.0/tutorials/torchtrtc.html new file mode 100644 index 0000000000..10fa7cc302 --- /dev/null +++ b/docs/v1.2.0/tutorials/torchtrtc.html @@ -0,0 +1,700 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + torchtrtc — Torch-TensorRT v1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + +
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + +

+ torchtrtc + + ¶ + +

+

+ + + torchtrtc + + + is a CLI application for using the Torch-TensorRT compiler. It serves as an easy way to compile a +TorchScript Module with Torch-TensorRT from the command-line to quickly check support or as part of +a deployment pipeline. All basic features of the compiler are supported including post training +quantization (though you must already have a calibration cache file to use the PTQ feature). The compiler can +output two formats, either a TorchScript program with the TensorRT engine embedded or +the TensorRT engine itself as a PLAN file. +

+

+ All that is required to run the program after compilation is for C++ linking against + + + libtorchtrt.so + + + or in Python importing the torch_tensorrt package. All other aspects of using compiled modules are identical +to standard TorchScript. Load with + + + torch.jit.load() + + + and run like you would run any other module. +

+
+
+
torchtrtc [input_file_path] [output_file_path]
+  [input_specs...] {OPTIONS}
+
+  torchtrtc is a compiler for TorchScript, it will compile and optimize
+  TorchScript programs to run on NVIDIA GPUs using TensorRT
+
+OPTIONS:
+
+    -h, --help                        Display this help menu
+    Verbiosity of the compiler
+      -v, --verbose                     Dumps debugging information about the
+                                        compilation process onto the console
+      -w, --warnings                    Disables warnings generated during
+                                        compilation onto the console (warnings
+                                        are on by default)
+      --i, --info                       Dumps info messages generated during
+                                        compilation onto the console
+    --build-debuggable-engine         Creates a debuggable engine
+    --allow-gpu-fallback              (Only used when targeting DLA
+                                      (device-type)) Lets engine run layers on
+                                      GPU if they are not supported on DLA
+    --require-full-compilation        Require that the model should be fully
+                                      compiled to TensorRT or throw an error
+    --check-method-support=[method_name]
+                                      Check the support for end to end
+                                      compilation of a specified method in the
+                                      TorchScript module
+    --disable-tf32                    Prevent Float32 layers from using the
+                                      TF32 data format
+    --sparse-weights                  Enable sparsity for weights of conv and
+                                      FC layers
+    -p[precision...],
+    --enable-precision=[precision...] (Repeatable) Enabling an operating
+                                      precision for kernels to use when
+                                      building the engine (Int8 requires a
+                                      calibration-cache argument) [ float |
+                                      float32 | f32 | fp32 | half | float16 |
+                                      f16 | fp16 | int8 | i8 | char ]
+                                      (default: float)
+    -d[type], --device-type=[type]    The type of device the engine should be
+                                      built for [ gpu | dla ] (default: gpu)
+    --gpu-id=[gpu_id]                 GPU id if running on multi-GPU platform
+                                      (defaults to 0)
+    --dla-core=[dla_core]             DLACore id if running on available DLA
+                                      (defaults to 0)
+    --engine-capability=[capability]  The type of device the engine should be
+                                      built for [ standard | safety |
+                                      dla_standalone ]
+    --calibration-cache-file=[file_path]
+                                      Path to calibration cache file to use
+                                      for post training quantization
+    --teo=[op_name...],
+    --torch-executed-op=[op_name...]  (Repeatable) Operator in the graph that
+                                      should always be run in PyTorch for
+                                      execution (partial compilation must be
+                                      enabled)
+    --tem=[module_name...],
+    --torch-executed-mod=[module_name...]
+                                      (Repeatable) Module that should always
+                                      be run in Pytorch for execution (partial
+                                      compilation must be enabled)
+    --mbs=[num_ops],
+    --min-block-size=[num_ops]        Minimum number of contiguous TensorRT
+                                      supported ops to compile a subgraph to
+                                      TensorRT
+    --embed-engine                    Whether to treat input file as a
+                                      serialized TensorRT engine and embed it
+                                      into a TorchScript module (device spec
+                                      must be provided)
+    --num-min-timing-iter=[num_iters] Number of minimization timing iterations
+                                      used to select kernels
+    --num-avg-timing-iters=[num_iters]
+                                      Number of averaging timing iterations
+                                      used to select kernels
+    --workspace-size=[workspace_size] Maximum size of workspace given to
+                                      TensorRT
+    -t[threshold],
+    --threshold=[threshold]           Maximum acceptable numerical deviation
+                                      from standard torchscript output
+                                      (default 2e-5)
+    --no-threshold-check              Skip checking threshold compliance
+    --truncate-long-double,
+    --truncate, --truncate-64bit      Truncate weights that are provided in
+                                      64bit to 32bit (Long, Double to Int,
+                                      Float)
+    --save-engine                     Instead of compiling a full a
+                                      TorchScript program, save the created
+                                      engine to the path specified as the
+                                      output path
+    input_file_path                   Path to input TorchScript file
+    output_file_path                  Path for compiled TorchScript (or
+                                      TensorRT engine) file
+    input_specs...                    Specs for inputs to engine, can either
+                                      be a single size or a range defined by
+                                      Min, Optimal, Max sizes, e.g.
+                                      "(N,..,C,H,W)"
+                                      "[(MIN_N,..,MIN_C,MIN_H,MIN_W);(OPT_N,..,OPT_C,OPT_H,OPT_W);(MAX_N,..,MAX_C,MAX_H,MAX_W)]".
+                                      Data Type and format can be specified by
+                                      adding an "@" followed by dtype and "%"
+                                      followed by format to the end of the
+                                      shape spec. e.g. "(3, 3, 32,
+                                      32)@f16%NHWC"
+    "--" can be used to terminate flag options and force all following
+    arguments to be treated as positional options
+
+
+
+

+ e.g. +

+
+
+
torchtrtc tests/modules/ssd_traced.jit.pt ssd_trt.ts "[(1,3,300,300); (1,3,512,512); (1, 3, 1024, 1024)]@f16%contiguous" -p f16
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/docs/v1.2.0/tutorials/use_from_pytorch.html b/docs/v1.2.0/tutorials/use_from_pytorch.html new file mode 100644 index 0000000000..0e39215811 --- /dev/null +++ b/docs/v1.2.0/tutorials/use_from_pytorch.html @@ -0,0 +1,715 @@ + + + + + + + + + + + + + Using Torch-TensorRT Directly From PyTorch — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
    + +
  • + + + Docs + + > +
  • + + +
  • Using Torch-TensorRT Directly From PyTorch
  • + + +
  • + + + + + +
  • + +
+ + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

Using Torch-TensorRT Directly From PyTorch

+

You will now be able to directly access TensorRT from PyTorch APIs. The process to use this feature +is very similar to the compilation workflow described in Using Torch-TensorRT in Python

+

Start by loading torch_tensorrt into your application.

+
import torch
+import torch_tensorrt
+
+
+

Then given a TorchScript module, you can compile it with TensorRT using the torch._C._jit_to_backend("tensorrt", ...) API.

+
import torchvision.models as models
+
+model = models.mobilenet_v2(pretrained=True)
+script_model = torch.jit.script(model)
+
+
+

Unlike the compile API in Torch-TensorRT which assumes you are trying to compile the forward function of a module +or the convert_method_to_trt_engine which converts a specified function to a TensorRT engine, the backend API +will take a dictionary which maps names of functions to compile to Compilation Spec objects which wrap the same +sort of dictionary you would provide to compile. For more information on the compile spec dictionary take a look +at the documentation for the Torch-TensorRT TensorRTCompileSpec API.

+
spec = {
+    "forward": torch_tensorrt.ts.TensorRTCompileSpec(
+        {
+            "inputs": [torch_tensorrt.Input([1, 3, 300, 300])],
+            "enabled_precisions": {torch.float, torch.half},
+            "refit": False,
+            "debug": False,
+            "device": {
+                "device_type": torch_tensorrt.DeviceType.GPU,
+                "gpu_id": 0,
+                "dla_core": 0,
+                "allow_gpu_fallback": True,
+            },
+            "capability": torch_tensorrt.EngineCapability.default,
+            "num_avg_timing_iters": 1,
+        }
+    )
+}
+
+
+

Now to compile with Torch-TensorRT, provide the target module objects and the spec dictionary to torch._C._jit_to_backend("tensorrt", ...)

+
trt_model = torch._C._jit_to_backend("tensorrt", script_model, spec)
+
+
+

To run explicitly call the function of the method you want to run (vs. how you can just call on the module itself in standard PyTorch)

+
input = torch.randn((1, 3, 300, 300)).to("cuda").to(torch.half)
+print(trt_model.forward(input))
+
+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docs/v1.2.0/tutorials/using_dla.html b/docs/v1.2.0/tutorials/using_dla.html new file mode 100644 index 0000000000..4b0f6c35af --- /dev/null +++ b/docs/v1.2.0/tutorials/using_dla.html @@ -0,0 +1,701 @@ + + + + + + + + + + + + + DLA — Torch-TensorRT master documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ Shortcuts +
+
+ +
+
+ + + +
+ +
+
+ +
+

DLA

+

DLA NVIDIA Deep Learning Accelerator is a fixed-function accelerator engine targeted for deep learning operations. DLA is designed to do full hardware acceleration of convolutional neural networks. DLA supports various layers such as convolution, deconvolution, fully-connected, activation, pooling, batch normalization, etc. torch_tensorrt supports compilation of TorchScript Module and deployment pipeline on the DLA hardware available on NVIDIA embedded platforms.

+

NOTE: DLA supports fp16 and int8 precision only.

+

Using DLA with torchtrtc

+
torchtrtc [input_file_path] [output_file_path] [input_shapes...] -p f16 -d dla {OPTIONS}
+
+
+

Using DLA in a C++ application

+
std::vector<std::vector<int64_t>> input_shape = {{32, 3, 32, 32}};
+auto compile_spec = torch_tensorrt::CompileSpec({input_shape});
+
+# Set a precision. DLA supports fp16 or int8 only
+compile_spec.enabled_precisions = {torch::kF16};
+compile_spec.device.device_type = torch_tensorrt::CompileSpec::DeviceType::kDLA;
+
+# Make sure the gpu id is set to Xavier id for DLA
+compile_spec.device.gpu_id = 0;
+
+# Set the DLA core id
+compile_spec.device.dla_core = 1;
+
+# If a layer fails to run on DLA it will fallback to GPU
+compile_spec.device.allow_gpu_fallback = true;
+
+
+

Using DLA in a python application

+
compile_spec = {
+    "inputs": [torch_tensorrt.Input(self.input.shape)],
+    "device": torch_tensorrt.Device("dla:0", allow_gpu_fallback=True),
+    "enalbed_precisions": {torch.half},
+}
+
+trt_mod = torch_tensorrt.compile(self.scripted_model, compile_spec)
+
+
+
+ + +
+ +
+ + +
+
+ +
+
+
+ + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Docs

+

Access comprehensive developer documentation for PyTorch

+ View Docs +
+ +
+

Tutorials

+

Get in-depth tutorials for beginners and advanced developers

+ View Tutorials +
+ +
+

Resources

+

Find development resources and get your questions answered

+ View Resources +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/docsrc/conf.py b/docsrc/conf.py index a8f6ef59a2..bccdb2b45c 100644 --- a/docsrc/conf.py +++ b/docsrc/conf.py @@ -22,7 +22,7 @@ # -- Project information ----------------------------------------------------- project = "Torch-TensorRT" -copyright = "2021, NVIDIA Corporation" +copyright = "2022, NVIDIA Corporation" author = "NVIDIA Corporation" version = "master (" + torch_tensorrt.__version__ + ")" @@ -134,7 +134,9 @@ "globaltoc_includehidden": True, "master_doc": True, "version_info": { - "master": "https://nvidia.github.io/Torch-TensorRT/", + "master": "https://pytorch.org/TensorRT/", + "v1.2.0": "https://pytorch.org/TensorRT/v1.2.0", + "v1.1.1": "https://nvidia.github.io/Torch-TensorRT/v1.1.1", "v1.1.0": "https://nvidia.github.io/Torch-TensorRT/v1.1.0/", "v1.0.0": "https://nvidia.github.io/Torch-TensorRT/v1.0.0/", "v0.4.1": "https://nvidia.github.io/Torch-TensorRT/v0.4.1/", diff --git a/docsrc/indices/supported_ops.rst b/docsrc/indices/supported_ops.rst index 2ce7b34ae7..0367c02710 100644 --- a/docsrc/indices/supported_ops.rst +++ b/docsrc/indices/supported_ops.rst @@ -23,6 +23,8 @@ Operators Currently Supported Through Converters - aten::add.Scalar(Tensor self, Scalar other, Scalar alpha=1) -> (Tensor) - aten::add.Tensor(Tensor self, Tensor other, Scalar alpha=1) -> (Tensor) - aten::add_.Tensor(Tensor(a!) self, Tensor other, *, Scalar alpha=1) -> (Tensor(a!)) +- aten::argmax(Tensor self, int dim, bool keepdim=False) -> (Tensor) +- aten::argmin(Tensor self, int dim, bool keepdim=False) -> (Tensor) - aten::asin(Tensor self) -> (Tensor) - aten::asinh(Tensor self) -> (Tensor) - aten::atan(Tensor self) -> (Tensor) @@ -31,6 +33,7 @@ Operators Currently Supported Through Converters - aten::avg_pool2d(Tensor self, int[2] kernel_size, int[2] stride=[], int[2] padding=[0, 0], bool ceil_mode=False, bool count_include_pad=True, int? divisor_override=None) -> (Tensor) - aten::avg_pool3d(Tensor self, int[3] kernel_size, int[3] stride=[], int[3] padding=[], bool ceil_mode=False, bool count_include_pad=True, int? divisor_override=None) -> (Tensor) - aten::batch_norm(Tensor input, Tensor? gamma, Tensor? beta, Tensor? mean, Tensor? var, bool training, float momentum, float eps, bool cudnn_enabled) -> (Tensor) +- aten::bitwise_not(Tensor self) -> (Tensor) - aten::bmm(Tensor self, Tensor mat2) -> (Tensor) - aten::cat(Tensor[] tensors, int dim=0) -> (Tensor) - aten::ceil(Tensor self) -> (Tensor) @@ -90,6 +93,7 @@ Operators Currently Supported Through Converters - aten::mean(Tensor self, *, int? dtype=None) -> (Tensor) - aten::mean.dim(Tensor self, int[] dim, bool keepdim=False, *, int? dtype=None) -> (Tensor) - aten::min(Tensor self) -> (Tensor) +- aten::min.dim(Tensor self, int dim, bool keepdim=False) -> (Tensor values, Tensor indices) - aten::min.other(Tensor self, Tensor other) -> (Tensor) - aten::mul.Scalar(Tensor self, Scalar other) -> (Tensor) - aten::mul.Tensor(Tensor self, Tensor other) -> (Tensor) @@ -113,6 +117,7 @@ Operators Currently Supported Through Converters - aten::relu(Tensor input) -> (Tensor) - aten::relu_(Tensor(a!) self) -> (Tensor(a!)) - aten::repeat(Tensor self, int[] repeats) -> (Tensor) +- aten::repeat_interleave.self_int(Tensor self, int repeats, int? dim=None, *, int? output_size=None) -> (Tensor) - aten::replication_pad1d(Tensor self, int[2] padding) -> (Tensor) - aten::replication_pad2d(Tensor self, int[4] padding) -> (Tensor) - aten::replication_pad3d(Tensor self, int[6] padding) -> (Tensor) @@ -120,6 +125,8 @@ Operators Currently Supported Through Converters - aten::roll(Tensor self, int[1] shifts, int[1] dims=[]) -> (Tensor) - aten::rsub.Scalar(Tensor self, Scalar other, Scalar alpha=1) -> (Tensor) - aten::rsub.Tensor(Tensor self, Tensor other, Scalar alpha=1) -> (Tensor) +- aten::scatter.src(Tensor self, int dim, Tensor index, Tensor src) -> (Tensor) +- aten::scatter.value(Tensor self, int dim, Tensor index, Scalar value) -> (Tensor) - aten::select.int(Tensor(a) self, int dim, int index) -> (Tensor(a)) - aten::sigmoid(Tensor input) -> (Tensor) - aten::sigmoid_(Tensor(a!) self) -> (Tensor(a!)) @@ -129,8 +136,10 @@ Operators Currently Supported Through Converters - aten::softmax.int(Tensor self, int dim, int? dtype=None) -> (Tensor) - aten::split(Tensor self, int[] split_sizes, int dim=0) -> (Tensor[]) - aten::split.Tensor(Tensor(a) self, int split_size, int dim=0) -> (Tensor[]) +- aten::split.sizes(Tensor(a -> *) self, int[] split_size, int dim=0) -> (Tensor[]) - aten::split_with_sizes(Tensor(a) self, int[] split_sizes, int dim=0) -> (Tensor[]) - aten::sqrt(Tensor self) -> (Tensor) +- aten::square(Tensor self) -> (Tensor) - aten::squeeze.dim(Tensor(a) self, int dim) -> (Tensor(a)) - aten::stack(Tensor[] tensors, int dim=0) -> (Tensor) - aten::sub.Scalar(Tensor self, Scalar other, Scalar alpha=1) -> (Tensor) @@ -179,6 +188,7 @@ Operators Currently Supported Through Evaluators - aten::Int.int(int a) -> int - aten::__and__(int a, int b) -> (bool) - aten::__and__.bool(bool a, bool b) -> (bool) +- aten::__derive_index(int idx, int start, int step) -> int - aten::__getitem__.t(t[](a) list, int idx) -> (t(*)) - aten::__is__(t1 self, t2 obj) -> bool - aten::__isnot__(t1 self, t2 obj) -> bool @@ -258,6 +268,7 @@ Operators Currently Supported Through Evaluators - aten::sub.float(float a, float b) -> (float) - aten::sub.int(int a, int b) -> (int) - aten::tensor(t[] data, *, int? dtype=None, Device? device=None, bool requires_grad=False) -> (Tensor) +- prim::TupleIndex(Any tup, int i) -> (Any) - prim::dtype(Tensor a) -> (int) - prim::max.bool(bool a, bool b) -> (bool) - prim::max.float(float a, float b) -> (bool) diff --git a/py/requirements.txt b/py/requirements.txt index 27aca2544f..5add5891ed 100644 --- a/py/requirements.txt +++ b/py/requirements.txt @@ -1,6 +1,6 @@ numpy pybind11==2.6.2 ---extra-index-url https://download.pytorch.org/whl/cu116 -torch==1.12.1 +--extra-index-url https://download.pytorch.org/whl/nightly/cu116 +torch==1.13.0.dev20220825+cu116 --extra-index-url https://pypi.ngc.nvidia.com nvidia-tensorrt==8.4.3.1 diff --git a/py/setup.py b/py/setup.py index 88626a9e04..46a89ba78b 100644 --- a/py/setup.py +++ b/py/setup.py @@ -28,8 +28,8 @@ CI_RELEASE = False -__version__ = "1.2.0a0" -__cuda_version__ = "11.3" +__version__ = "1.3.0a0" +__cuda_version__ = "11.6" __cudnn_version__ = "8.4" __tensorrt_version__ = "8.4"