code: def cuda_serialize_numba_ndarray(x):
      # Making sure `x` is behaving
      if not (x.flags["C_CONTIGUOUS"] or x.flags["F_CONTIGUOUS"]):
          shape = x.shape
          t = numba.cuda.device_array(shape, dtype=x.dtype)
          t.copy_to_device(x)
          x = t
  
      header = x.__cuda_array_interface__.copy()
      header["strides"] = tuple(x.strides)
      frames = [
          numba.cuda.cudadrv.devicearray.DeviceNDArray(
              shape=(x.nbytes,),
              strides=(1,),
              dtype=np.dtype("u1"),
              gpu_data=x.gpu_data,
          )
      ]
  
      return header, frames
  
file_path: distributed/distributed/protocol/numba.py
imports: from __future__ import annotations
  import weakref
  import numba.cuda
  import numpy
  from distributed.protocol.cuda import cuda_deserialize, cuda_serialize
  from distributed.protocol.serialize import dask_deserialize, dask_serialize
label_desc: Use image node_id 1 for calling a global function with example usage: cuda_serialize_numba_ndarray(x) and returns: header,  frames