code: def testOS(self):
      cache_ids = [1, 3, 6]
      ids = torch.tensor(
          [[100, 1], [101, 3], [102, 6]], dtype=torch.long
      )
      tensor = torch.rand((10, 4))
      optim1 = torch.rand((10, 4))
      optim2 = torch.rand((10, 4))
      origin_tensor = tensor.clone()
      origin_optim1 = optim1.clone()
      origin_optim2 = optim2.clone()
      ps = PS("table", [tensor, optim1, optim2], "memory://", 1024)
      ps.evict(ids)
      tensor[:, :] = 0
      optim1[:, :] = 0
      optim2[:, :] = 0
      ps.fetch(ids, 0).wait()
      self.assertTrue(
          torch.allclose(tensor[cache_ids], origin_tensor[cache_ids])
      )
      self.assertTrue(
          torch.allclose(optim1[cache_ids], origin_optim1[cache_ids])
      )
      self.assertTrue(
          torch.allclose(optim2[cache_ids], origin_optim2[cache_ids])
      )
  
file_path: torchrec/contrib/dynamic_embedding/tests/test_ps.py
imports: import unittest
  import torch
  from torchrec_dynamic_embedding.ps import PS
  from utils import register_memory_io
label_desc: Use image node_id 2 for calling the TestPS obj's underlying member method code with example usage: obj.testOS() without return types