code: def test_embedding_max_norm_backward(self, device, dtype):
      # can't use gradcheck since in place renorm makes analytical gradients different from produced ones
      weight = torch.randn((4, 4), device=device, dtype=dtype) * 2
      weight.requires_grad_()
      inp_list = [0, 1, 2, 2]
      inp = torch.tensor(inp_list, device=device)
      out = nn.functional.embedding(inp, weight, max_norm=1.0).sum()
      out.backward()
  
      expected_grad = (
          torch.tensor(
              [[1.0, 1.0, 2.0, 0.0]], device=device, dtype=dtype
          )
          .transpose(0, 1)
          .expand(4, 4)
      )
      self.assertEqual(weight.grad, expected_grad)
  
imports: import unittest
  import random
  import itertools
  from itertools import product
  import torch
  from torch.testing._internal.common_utils import run_tests, set_default_dtype, skipIfTorchDynamo, instantiate_parametrized_tests, parametrize, _assertGradAndGradgradChecks, IS_JETSON
  from torch.testing._internal.common_cuda import TEST_CUDA
  from torch.testing._internal.common_nn import NNTestCase
  from torch.testing._internal.common_device_type import onlyNativeDeviceTypes, dtypes, instantiate_device_type_tests, dtypesIfCUDA, onlyCUDA, TEST_WITH_ROCM, skipCUDAIf, skipMeta
  import torch.nn.functional
  import torch.nn
  from torch.testing._internal.common_utils import dtype2prec_DONTUSE
label_desc: Use image node_id 4 for calling the TestEmbeddingNNDeviceType obj's underlying member method code with example usage: obj.test_embedding_max_norm_backward(device, dtype) without return types