Update: turns out the heavy memory usage is due to the fact that I’m storing forward hooks for each model (in order to run some analysis); obvious, in retrospect. So the question becomes, more specifically, how to properly delete/clear hooks after I no longer need them.
In my case, I’m simply storing them as (arrays of) arrays (more efficient suggestions welcome!), but trying to free the memory by using either hooks[i] = 0 or del hooks[i], followed by gc.collect(), as in the examples above, still fails to do the trick.