test_cpu_adam.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import argparse
  2. import torch
  3. import time
  4. import numpy as np
  5. import pytest
  6. import copy
  7. import deepspeed
  8. #TODO: not sure how we want to skip tests now that we're building at runtime
  9. #if not deepspeed.ops.__installed_ops__['cpu-adam']:
  10. # pytest.skip("cpu-adam is not installed", allow_module_level=True)
  11. #else:
  12. # from deepspeed.ops.adam import DeepSpeedCPUAdam
  13. def check_equal(first, second, atol=1e-2, verbose=False):
  14. x = first.detach().numpy()
  15. y = second.detach().numpy()
  16. if verbose:
  17. print("x = {}".format(x.flatten()))
  18. print("y = {}".format(y.flatten()))
  19. print('-' * 80)
  20. np.testing.assert_allclose(x, y, err_msg="param-update dismatch!", atol=atol)
  21. @pytest.mark.parametrize('model_size',
  22. [
  23. (64),
  24. (22),
  25. (55),
  26. (127),
  27. (1024),
  28. (1048576),
  29. ]) # yapf: disable
  30. def test_cpu_adam_opt(model_size):
  31. from deepspeed.ops.adam import DeepSpeedCPUAdam
  32. device = 'cpu'
  33. rng_state = torch.get_rng_state()
  34. param = torch.nn.Parameter(torch.randn(model_size, device=device))
  35. torch.set_rng_state(rng_state)
  36. param1 = torch.nn.Parameter(torch.randn(model_size, device=device))
  37. optimizer1 = torch.optim.Adam([param1])
  38. optimizer = DeepSpeedCPUAdam([param])
  39. for i in range(10):
  40. rng_state = torch.get_rng_state()
  41. param.grad = torch.randn(model_size, device=device)
  42. torch.set_rng_state(rng_state)
  43. param1.grad = torch.randn(model_size, device=device)
  44. optimizer.step()
  45. optimizer1.step()
  46. check_equal(param, param1, atol=1e-2, verbose=True)