didn’t I detached it calling backward on errD_fake ?

That doesn’t change the fact that you re-use the same “fake” in the second loop.
Let me update my comment above slightly:

You generate fake based on netG in the first loop
You use fake in first iteration of second loop
You update netG at the end of the first iteration of second loop
You use again fake (without recomputing it based on updated netG) in the second iteration of the second loop
You try to backward, this fails because the fake you used here is based on the old weights of netG.