code: def update_mp_params(self, child):
      if getattr(child, "replaced", False) == True:
          return
      for param in [
          "n_heads",
          "inner_dim",
          "num_heads",
          "num_kv",
          "num_attention_heads",
          "num_attn_heads",
          "all_head_size",
          "embed_dim",
          "hidden_size",
          "num_key_value_heads",
          "num_kv_heads",
          "kv_n_heads",
          "d_model",
      ]:
          if hasattr(child, param):
              param_val = getattr(child, param)
              setattr(
                  child, param, get_shard_size(param_val, self.mp_size)
              )
      setattr(child, "replaced", True)
  
imports: import re
  from torch import nn
  from .replace_policy import replace_policies
  from typing import Optional
  import torch
  from deepspeed import comm
  from .layers import LinearAllreduce, LinearLayer, LmHeadLinearAllreduce
  from deepspeed.accelerator import get_accelerator
  from .fusedqkv_utils import require_tp_fused_qkvw, prepare_tp_fused_qkvw
  from deepspeed.module_inject.tp_shard import get_shard_size, get_shard_size_list
label_desc: Use image node_id 12 for calling the AutoTP obj's underlying member method code with example usage: obj.update_mp_params(child) without return types