code: def attention_qkv_mp(self, mp_replace, reversed_dim=False):
      # Only need to alter
      if self.module.attention.attn_qkvw is None:
          params = [
              (self.module.attention.attn_qw, self.qw),
              (self.module.attention.attn_qb, self.qb),
              (self.module.attention.attn_kw, self.kw),
              (self.module.attention.attn_kb, self.kb),
              (self.module.attention.attn_vw, self.vw),
              (self.module.attention.attn_vb, self.vb),
          ]
          for dst, src in params:
              dst = (
                  mp_replace.copy(
                      dst[: self.qw.shape[0] // mp_replace.mp_size],
                      src,
                      int8=reversed_dim,
                      allocate_tensor=reversed_dim,
                  )
                  if src is not None
                  else None
              )
      else:
          super().attention_qkv_mp(mp_replace)
  
file_path: DeepSpeed/deepspeed/module_inject/containers/features/split_qkv.py
imports: from abc import abstractmethod
  import torch
  from .hybrid_engine import HybridEngineContainer
label_desc: Use image node_id 3 for calling the HybridSplitQKVContainer obj's underlying member method code with example usage: obj.attention_qkv_mp(mp_replace, reversed_dim) without return types