code: def tril(m, k=0, gpu=None):
      """
      Lower triangle of a tensor.
  
      Return a copy of a tensor with elements above the `k`-th diagonal zeroed.
  
      Parameters
      ----------
      m : array_like, shape (M, N)
          Input tensor.
      k : int, optional
          Diagonal above which to zero elements.  `k = 0` (the default) is the
          main diagonal, `k < 0` is below it and `k > 0` is above.
      gpu : bool, optional
          Allocate the tensor on GPU if True, None as default
  
      Returns
      -------
      tril : Tensor, shape (M, N)
          Lower triangle of `m`, of same shape and data-type as `m`.
  
      See Also
      --------
      triu : same thing, only for the upper triangle
  
      Examples
      --------
      >>> import mars.tensor as mt
  
      >>> mt.tril([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], -1).execute()
      array([[ 0,  0,  0],
             [ 4,  0,  0],
             [ 7,  8,  0],
             [10, 11, 12]])
  
      """
      m = astensor(m)
      gpu = m.op.gpu if gpu is None else gpu
      op = TensorTril(k, dtype=m.dtype, sparse=m.issparse(), gpu=gpu)
      return op(m)
  
imports: import itertools
  import numpy
  from ...lib import sparse
  from ...None import opcodes
  from ...serialization.serializables import KeyField, Int32Field
  from ...utils import has_unknown_shape
  from ..array_utils import create_array
  from ..core import TensorOrder
  from .core import TensorHasInput
  from .zeros import TensorZeros
  from .array import tensor
label_desc: Use image node_id 2 for calling a global function with example usage: tril(m, k, gpu) and returns: op