Thanks for pointing that out, I missed it altogether!
Edited to add:
If you change the line
ctx.save_for_backward(y)

to
ctx.save_for_backward(x)

then there is still a significant difference in the two memory usages reported (with and without in-place, respectively). This suggests that while using the in-place ReLU does make a difference, this difference is swamped by the other memory being used (and not freed) by your forward method.