code: def build_serving_module(
      self,
      trainer_module: ReAgentLightningModule,
      normalization_data_map: Dict[str, NormalizationData],
  ) -> torch.nn.Module:
      assert isinstance(trainer_module, PPOTrainer)
      policy_serving_module = (
          self.policy_net_builder.value.build_serving_module(
              q_network=trainer_module.scorer,
              state_normalization_data=normalization_data_map[
                  NormalizationKey.STATE
              ],
              action_names=self.action_names,
              state_feature_config=self.state_feature_config,
          )
      )
      return policy_serving_module
  
imports: import logging
  from typing import Dict, Optional
  import torch
  from reagent.core import types
  from reagent.core.dataclasses import dataclass, field
  from reagent.core.parameters import NormalizationData, NormalizationKey, param_hash
  from reagent.gym.policies.policy import Policy
  from reagent.gym.policies.predictor_policies import create_predictor_policy_from_model
  from reagent.gym.policies.samplers.discrete_sampler import SoftmaxActionSampler
  from reagent.model_managers.model_manager import ModelManager
  from reagent.models.model_feature_config_provider import RawModelFeatureConfigProvider
  from reagent.net_builder.discrete_dqn.dueling import Dueling
  from reagent.net_builder.unions import DiscreteDQNNetBuilder__Union, ValueNetBuilder__Union
  from reagent.training import PPOTrainer, PPOTrainerParameters, ReAgentLightningModule
  from reagent.workflow.types import ModelFeatureConfigProvider__Union, RewardOptions
label_desc: Use image node_id 6 for calling the PPO obj's underlying member method code with example usage: obj.build_serving_module(trainer_module, normalization_data_map) and returns: policy_serving_module