Hi,
You identified the two possible options quite well:

Do projected gradient methods. You can rescale the weights within a with torch.no_grad(): block not to bother the autograd.
Change your whole optimization problem where the constraint is enforced by the structure of the function. You can add an epsilon to the norm to make sure it won’t go to 0.

There is no strong reason though for one to be better than the other. You’ll have to check empirically !