Final UPDATE : I think I’m able to fix the problem.  It boiled down to better understanding the pytorch-lightning semantics.
First, the second_order_closure function is defined by wrapping the training_step and the backward step (see this line : https://github.com/PyTorchLightning/pytorch-lightning/blob/master/pytorch_lightning/trainer/training_loop.py#L597 2)
Second in order to define an initialization step before the forward pass is evaluated, the on_train_batch_start callback needs to be defined (see the callback docs here : https://pytorch-lightning.readthedocs.io/en/latest/callbacks.html)
My callback looked like
    def on_train_batch_start(self, batch, batch_idx, dataloader_idx):
        counts = batch.to(self.device)
        self.model.reset(counts)

Finally, this may seem like blasphemy (based on notes regarding inplace operations 1 that I still don’t understand), but I just manipulated the data in eta directly within my reset function.  This is defined as follows
    def reset(self, x):
        hx = my_awesome_guess(x)
        self.eta.data = hx.data

Not sure how kosher it is, but from my tests, it looks like all of this works.