code: def get_output_info_torch(
      torch_model: torch.nn.Module,
      input_tensors: List[torch.Tensor],
      device: Device,
  ) -> List[Tuple[Tuple[int, ...], DataType]]:
      if device.type is DeviceType.GPU:
          input_tensors = [
              x.to(device.to_torch_format()) for x in input_tensors
          ]
          torch_model.to(device.to_torch_format())
      with torch.no_grad():
          outputs = torch_model(*input_tensors)
          if isinstance(outputs, torch.Tensor):
              return [
                  (
                      tuple(outputs.size()),
                      DataType.from_framework_format(outputs.dtype),
                  )
              ]
          else:
              return [
                  (
                      tuple(output.size()),
                      DataType.from_framework_format(output.dtype),
                  )
                  for output in outputs
              ]
  
file_path: nebuly/optimization/nebullvm/nebullvm/tools/pytorch.py
imports: from pathlib import Path
  from typing import List, Tuple, Optional, Dict, Union, Sequence
  from loguru import logger
  from nebullvm.core.models import Device, DataType, DeviceType, InputInfo
  from nebullvm.optional_modules.torch import torch, DataLoader
  from nebullvm.tools.data import DataManager
  from nebullvm.tools.diffusers import get_default_dynamic_info
label_desc: Use image node_id 3 for calling a global function with example usage: get_output_info_torch(torch_model, input_tensors, device) and returns: list, unknown