7.1.4. Example: Training With A Model
Sample program demonstrating a training model with initialization using a constant value (“1.0”)
Execution Method
$ cd /opt/pfn/pfcomp/codegen/examples/
$ ./exec_with_env.sh python3 train.py
Expected Output
Training results synchronized between device and host via
mlsdk.Context.synchronize()
Original model.linear.bias=Parameter containing:
tensor([1.], requires_grad=True)
Optimized model.linear.bias=Parameter containing:
tensor([-1.8237], requires_grad=True)
Sample Program
1import torch
2from mlsdk import (
3 Context,
4 MNCoreSGD,
5 MNDevice,
6 set_buffer_name_in_optimizer,
7 set_tensor_name_in_module,
8 storage,
9)
10
11
12def run_train():
13 class Model(torch.nn.Module):
14 def __init__(self):
15 super().__init__()
16 self.linear = torch.nn.Linear(10, 1)
17
18 def forward(self, *, x):
19 return {"y": self.linear(x)}
20
21 device = MNDevice("mncore2:auto")
22 context = Context(device)
23 Context.switch_context(context)
24
25 sample = {"x": torch.ones(1, 10)}
26 model = Model()
27 model.linear.weight.data.fill_(1.0)
28 model.linear.bias.data.fill_(1.0)
29 model.train()
30
31 set_tensor_name_in_module(model, "model")
32 for p in model.parameters():
33 context.register_param(p)
34 for b in model.buffers():
35 context.register_buffer(b)
36
37 optimizer = MNCoreSGD(model.parameters(), 0.1, 0.9, 0.0)
38 set_buffer_name_in_optimizer(optimizer, "optim0")
39 context.register_optimizer_buffers(optimizer)
40
41 def f(inp):
42 optimizer.zero_grad()
43 loss = torch.relu(model(**inp)["y"]).sum()
44 loss.backward() # type: ignore[no-untyped-call]
45 optimizer.step()
46 return {"loss": loss}
47
48 compiled_f = context.compile(
49 f,
50 sample,
51 storage.path("/tmp/train"),
52 )
53
54 print(f"Original {model.linear.bias=}")
55 for _ in range(10):
56 compiled_f(sample)
57 context.synchronize()
58 print(f"Optimized {model.linear.bias=}")
59
60
61if __name__ == "__main__":
62 run_train()