class_docstr: Wraps postprocessing modules into a single nn.Module.
  
  The forward call of this module returns a flattened dictionary in order to support Triton input/output.
  
  TODO(geoffrey): Implement torchscript-compatible feature_utils.LudwigFeatureDict to replace
  get_module_dict_key_from_name and get_name_from_module_dict_key usage.
class_docstr_tok: ["Wraps","postprocessing","modules","into","a","single","nn.Module",".","The","forward","call","of","this","module","returns","a","flattened","dictionary","in","order","to","support","Triton","input\/output",".","TODO","(","geoffrey",")",":","Implement","torchscript-compatible","feature_utils.LudwigFeatureDict","to","replace","get_module_dict_key_from_name","and","get_name_from_module_dict_key","usage","."]
code: def __init__(
      self,
      model: "BaseModel",
      training_set_metadata: TrainingSetMetadataDict,
  ):
      super().__init__()
      self.postproc_modules = nn.ModuleDict()
      for feature_name, feature in model.output_features.items():
          # prevents collisions with reserved keywords
          module_dict_key = get_module_dict_key_from_name(feature_name)
          self.postproc_modules[
              module_dict_key
          ] = feature.create_postproc_module(
              training_set_metadata[feature_name]
          )
  
imports: import logging
  import os
  from typing import Any, Dict, Optional, TYPE_CHECKING, Union
  import pandas
  import torch
  from torch import nn
  from ludwig.constants import NAME, POSTPROCESSOR, PREDICTOR, PREPROCESSOR, TYPE
  from ludwig.data.postprocessing import convert_dict_to_df
  from ludwig.data.preprocessing import load_metadata
  from ludwig.features.feature_registries import get_input_type_registry
  from ludwig.features.feature_utils import get_module_dict_key_from_name, get_name_from_module_dict_key
  from ludwig.globals import MODEL_HYPERPARAMETERS_FILE_NAME, TRAIN_SET_METADATA_FILE_NAME
  from ludwig.types import ModelConfigDict, TrainingSetMetadataDict
  from ludwig.utils import output_feature_utils
  from ludwig.utils.data_utils import load_json, save_json
  from ludwig.utils.inference_utils import get_filename_from_stage, to_inference_module_input_from_dataframe
  from ludwig.utils.misc_utils import get_from_registry
  from ludwig.utils.output_feature_utils import get_feature_name_from_concat_name, get_tensor_name_from_concat_name
  from ludwig.utils.torch_utils import DEVICE
  from ludwig.utils.types import TorchDevice, TorchscriptPreprocessingInput
label_desc: Use image node_id 1 to create a new _InferencePostprocessor object from inherited base classes: nn with example: obj = _InferencePostprocessor(model, training_set_metadata)