code: def tile(cls, op):
      tensor = op.outputs[0]
      chunk_size = (
          tensor.extra_params.raw_chunk_size or options.chunk_size
      )
      nsplits = decide_chunk_sizes(
          tensor.shape[:-1], chunk_size, tensor.dtype.itemsize
      ) + ((tensor.shape[-1],),)
  
      mean_chunk = (
          op.mean.chunks[0] if hasattr(op.mean, "chunks") else op.mean
      )
      cov_chunk = (
          op.cov.chunks[0] if hasattr(op.cov, "chunks") else op.cov
      )
  
      idxes = list(itertools.product(*[range(len(s)) for s in nsplits]))
      seeds = gen_random_seeds(
          len(idxes), np.random.RandomState(op.seed)
      )
  
      out_chunks = []
      for seed, out_idx, shape in zip(
          seeds, idxes, itertools.product(*nsplits)
      ):
          chunk_op = op.copy().reset_key()
          chunk_op._state = None
          chunk_op.seed = seed
          chunk_op.size = shape[:-1]
          out_chunk = chunk_op.new_chunk(
              [mean_chunk, cov_chunk], shape=shape, index=out_idx
          )
          out_chunks.append(out_chunk)
  
      new_op = op.copy()
      return new_op.new_tensors(
          op.inputs, tensor.shape, chunks=out_chunks, nsplits=nsplits
      )
  
file_path: mars/mars/tensor/random/multivariate_normal.py
imports: import itertools
  import numpy
  from ...None import opcodes
  from ...serialization.serializables import NDArrayField, StringField, Float64Field
  from ...config import options
  from ..utils import decide_chunk_sizes, gen_random_seeds
  from ..array_utils import array_module, device
  from .core import TensorRandomOperandMixin, TensorDistribution, TENSOR_CHUNK_TYPE
label_desc: Use image node_id 2 for calling the TensorMultivariateNormal obj's underlying member method code with example usage: obj.tile(cls, op) and returns: new_op