class_docstr: Wraps preprocessing modules into a single nn.Module.
  
  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","preprocessing","modules","into","a","single","nn.Module",".","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 forward(
      self, inputs: Dict[str, TorchscriptPreprocessingInput]
  ) -> Dict[str, torch.Tensor]:
      preproc_inputs = {}
      for module_dict_key, preproc in self.preproc_modules.items():
          feature_name = get_name_from_module_dict_key(module_dict_key)
          preproc_inputs[feature_name] = preproc(inputs[feature_name])
      return preproc_inputs
  
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 2 for calling the _InferencePreprocessor obj's underlying member method code with example usage: obj.forward(inputs) and returns: preproc_inputs