code: def maybe_copy_qkv(
      module,
      sd,
      weight_quantizer,
      mp_replace,
      dst_name,
      src_names,
      split_qkv=False,
  ):
      if src_names[0] in sd:
          q = sd[src_names[0]]
          k = sd[src_names[1]]
          v = sd[src_names[2]]
          qkv_data = torch.cat((q, k, v), dim=0)
          dst = getattr(module, dst_name)
          if len(dst.shape) == 1:
              if split_qkv:
                  dst = mp_replace.strided_copy(
                      dst, qkv_data.contiguous(), num_splits=3
                  )
              else:
                  dst = mp_replace.copy(dst, qkv_data)
          else:
              if split_qkv:
                  dst = mp_replace.strided_copy(
                      dst,
                      weight_quantizer.quantize(
                          qkv_data.to(get_accelerator().device_name())
                          if weight_quantizer.q_int8
                          else ((transpose(qkv_data)).contiguous())
                      ),
                      num_splits=3,
                      int8=weight_quantizer.q_int8,
                  )
              else:
                  dst = mp_replace.copy(
                      dst,
                      weight_quantizer.quantize(
                          qkv_data.to(get_accelerator().device_name())
                          if weight_quantizer.q_int8
                          else transpose(qkv_data)
                      ),
                      int8=weight_quantizer.q_int8,
                  )
          setattr(module, dst_name, dst)
  
imports: from abc import ABC, abstractmethod
  from deepspeed.utils.types import ActivationFuncType, NormType
  import torch
  from deepspeed.accelerator import get_accelerator
label_desc: Use image node_id 4 for calling a global function with example usage: maybe_copy_qkv(module, sd, weight_quantizer, mp_replace, dst_name, src_names, split_qkv) without return types