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

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

Listing 7.4 /opt/pfn/pfcomp/codegen/MLSDK/examples/train.py
 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()