parameters: (
          parameters: _tensor_or_tensors, max_norm: float, norm_type: float = 2.0,
          error_if_nonfinite: bool = False)
return_statement: return total_norm
docstring: r"""Clips gradient norm of an iterable of parameters.
  
      The norm is computed over all gradients together, as if they were
      concatenated into a single vector. Gradients are modified in-place.
  
      Args:
          parameters (Iterable[Tensor] or Tensor): an iterable of Tensors or a
              single Tensor that will have gradients normalized
          max_norm (float or int): max norm of the gradients
          norm_type (float or int): type of the used p-norm. Can be ``'inf'`` for
              infinity norm.
          error_if_nonfinite (bool): if True, an error is thrown if the total
              norm of the gradients from :attr:`parameters` is ``nan``,
              ``inf``, or ``-inf``. Default: False (will switch to True in the future)
  
      Returns:
          Total norm of the parameters (viewed as a single vector).
docstring_summary: r"""Clips gradient norm of an iterable of parameters.
docstring_tokens: r Clips gradient norm of an iterable of parameters .
function: def clip_grad_norm_(
          parameters: _tensor_or_tensors, max_norm: float, norm_type: float = 2.0,
          error_if_nonfinite: bool = False) -> torch.Tensor:
      r"""Clips gradient norm of an iterable of parameters.
  
      The norm is computed over all gradients together, as if they were
      concatenated into a single vector. Gradients are modified in-place.
  
      Args:
          parameters (Iterable[Tensor] or Tensor): an iterable of Tensors or a
              single Tensor that will have gradients normalized
          max_norm (float or int): max norm of the gradients
          norm_type (float or int): type of the used p-norm. Can be ``'inf'`` for
              infinity norm.
          error_if_nonfinite (bool): if True, an error is thrown if the total
              norm of the gradients from :attr:`parameters` is ``nan``,
              ``inf``, or ``-inf``. Default: False (will switch to True in the future)
  
      Returns:
          Total norm of the parameters (viewed as a single vector).
      """
      if isinstance(parameters, torch.Tensor):
          parameters = [parameters]
      parameters = [p for p in parameters if p.grad is not None]
      max_norm = float(max_norm)
      norm_type = float(norm_type)
      if len(parameters) == 0:
          return torch.tensor(0.)
      device = parameters[0].grad.device
      if norm_type == inf:
          norms = [p.grad.detach().abs().max().to(device) for p in parameters]
          total_norm = norms[0] if len(norms) == 1 else torch.max(torch.stack(norms))
      else:
          total_norm = torch.norm(torch.stack([torch.norm(p.grad.detach(), norm_type).to(device) for p in parameters]), norm_type)
      if error_if_nonfinite and torch.logical_or(total_norm.isnan(), total_norm.isinf()):
          raise RuntimeError(
              f'The total norm of order {norm_type} for gradients from '
              '`parameters` is non-finite, so it cannot be clipped. To disable '
              'this error and scale the gradients by the non-finite norm anyway, '
              'set `error_if_nonfinite=False`')
      clip_coef = max_norm / (total_norm + 1e-6)
      # Note: multiplying by the clamped coef is redundant when the coef is clamped to 1, but doing so
      # avoids a `if clip_coef < 1:` conditional which can require a CPU <=> device synchronization
      # when the gradients do not reside in CPU memory.
      clip_coef_clamped = torch.clamp(clip_coef, max=1.0)
      for p in parameters:
          p.grad.detach().mul_(clip_coef_clamped.to(p.grad.device))
      return total_norm
function_tokens: def clip_grad_norm_ ( parameters : _tensor_or_tensors , max_norm : float , norm_type : float = 2.0 , error_if_nonfinite : bool = False ) -> torch . Tensor : if isinstance ( parameters , torch . Tensor ) : parameters = [ parameters ] parameters = [ p for p in parameters if p . grad is not None ] max_norm = float ( max_norm ) norm_type = float ( norm_type ) if len ( parameters ) == 0 : return torch . tensor ( 0. ) device = parameters [ 0 ] . grad . device if norm_type == inf : norms = [ p . grad . detach ( ) . abs ( ) . max ( ) . to ( device ) for p in parameters ] total_norm = norms [ 0 ] if len ( norms ) == 1 else torch . max ( torch . stack ( norms ) ) else : total_norm = torch . norm ( torch . stack ( [ torch . norm ( p . grad . detach ( ) , norm_type ) . to ( device ) for p in parameters ] ) , norm_type ) if error_if_nonfinite and torch . logical_or ( total_norm . isnan ( ) , total_norm . isinf ( ) ) : raise RuntimeError ( f'The total norm of order {norm_type} for gradients from ' '`parameters` is non-finite, so it cannot be clipped. To disable ' 'this error and scale the gradients by the non-finite norm anyway, ' 'set `error_if_nonfinite=False`' ) clip_coef = max_norm / ( total_norm + 1e-6 ) # Note: multiplying by the clamped coef is redundant when the coef is clamped to 1, but doing so # avoids a `if clip_coef < 1:` conditional which can require a CPU <=> device synchronization # when the gradients do not reside in CPU memory. clip_coef_clamped = torch . clamp ( clip_coef , max = 1.0 ) for p in parameters : p . grad . detach ( ) . mul_ ( clip_coef_clamped . to ( p . grad . device ) ) return total_norm