colossalai
46 строк · 1.7 Кб
1import torch
2
3from colossalai.nn.optimizer import CPUAdam, HybridAdam
4from colossalai.testing import clear_cache_before_run, parameterize
5from tests.kit.model_zoo import model_zoo
6
7
8def move_some_params_to_cuda(model, torch_model):
9model.embed.weight.data = model.embed.weight.cuda()
10torch_model.embed.weight.data = model.embed.weight.cuda()
11model.ln1.weight.data = model.ln1.weight.cuda()
12torch_model.ln1.weight.data = model.ln1.weight.cuda()
13
14
15def check_params_equal(model, torch_model):
16for p, torch_p in zip(model.parameters(), torch_model.parameters()):
17assert torch.allclose(p, torch_p, atol=1e-3), f"diff: {torch.abs(p - torch_p)}"
18
19
20@clear_cache_before_run()
21@parameterize("nvme_offload_fraction", [0.0, 0.5, 1.0])
22@parameterize("nvme_offload_dir", ["./offload", None])
23@parameterize("adam_cls", [CPUAdam, HybridAdam])
24def test_nvme_adam(nvme_offload_fraction, nvme_offload_dir, adam_cls):
25model_builder, data_gen_fn, *_ = next(iter(model_zoo.get_sub_registry("custom_simple_net").values()))
26model = model_builder()
27torch_model = model_builder()
28move_some_params_to_cuda(model, torch_model)
29optimizer = adam_cls(
30model.parameters(), lr=0.1, nvme_offload_fraction=nvme_offload_fraction, nvme_offload_dir=nvme_offload_dir
31)
32torch_optimizer = torch.optim.Adam(torch_model.parameters(), lr=0.1)
33with torch.no_grad():
34for p, torch_p in zip(model.parameters(), torch_model.parameters()):
35torch_p.copy_(p)
36p.grad = torch.rand_like(p)
37torch_p.grad = p.grad
38
39for _ in range(3):
40optimizer.step()
41torch_optimizer.step()
42check_params_equal(model, torch_model)
43
44
45if __name__ == "__main__":
46test_nvme_adam(0.5, "./offload", CPUAdam)
47