you are good! thank you I was doing that the wrong way around.
I ended up with this (for varying amounts of outputs)
optimizerList = []
for n in range(output_num):  
  optimizer = getOptimizer(model.parameters(), run)
  optimizerList.append(optimizer)

for data, target in train_loader:
  data = data.to(device)
  target = target.to(device)

  output = model(data)

  lossList = []
  for n in range(output_num):  
    loss = loss_fn(output, target)
    lossList.append(loss)
  for n in range(output_num):  
    lossList[n].backward(retain_graph = True)
  for n in range(output_num):  
    optimizerList[n].step()


This seems to work.
I am still unsure about how compute-intensive this method is though. My gut is telling me that retaining multiple backward-pass graphs before the optimizer step could be a problem.