nn.Module doesn’t have a step method, so you should call optimizer.step().
The model itself doesn’t know anything about the optimization of its parameters.
In case of calling zero_grad it depends on your use case.
If you pass all parameters to the optimizer, both calls will be identical and clear all gradients.
In case you pass only certain parameters to the optimizer, optimizer.zero_grad() will only clear those, while model.zero_grad() will clear all parameters.