When you do this:
self.output_all = op

op is a list of Variables - i.e. wrappers around tensors that also keep the history and that history is what you’re never going to use, and it’ll only end up consuming memory. If you do that
self.output_all = [o.data for o in op]

you’ll only save the tensors i.e. the final values.
Also, as I said. Use volatile=True if you’re going to run in inference mode. This will save a looot of memory.