Lightning-AI / torchmetrics

Torchmetrics - Machine learning metrics for distributed, scalable PyTorch applications.

Home Page:https://lightning.ai/docs/torchmetrics/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Delay imports of optional dependencies such as torchaudio, torchvision

awaelchli opened this issue · comments

🚀 Feature

Make imports of optional dependencies lazy/delayed.

Motivation

A common scenario is that you are in an environment where torch + torchaudio/torchvision is installed. For whatever reason, you then want to update torch to the latest version, but you are oblivious to the fact that you also had torchaudio. If you pip install -U torch, you'll get the new version, but now torchaudio is incompatible with that torch.

Attempting to import torchmetrics will fail, even if you don't intend to use audio metrics.

Traceback (most recent call last):
  File "/teamspace/studios/this_studio/finetune.py", line 11, in <module>
    import lightning as L
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/lightning/__init__.py", line 21, in <module>
    from lightning.pytorch.callbacks import Callback  # noqa: E402
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/lightning/pytorch/__init__.py", line 27, in <module>
    from lightning.pytorch.callbacks import Callback  # noqa: E402
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/lightning/pytorch/callbacks/__init__.py", line 14, in <module>
    from lightning.pytorch.callbacks.batch_size_finder import BatchSizeFinder
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/lightning/pytorch/callbacks/batch_size_finder.py", line 26, in <module>
    from lightning.pytorch.callbacks.callback import Callback
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/lightning/pytorch/callbacks/callback.py", line 22, in <module>
    from lightning.pytorch.utilities.types import STEP_OUTPUT
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/lightning/pytorch/utilities/types.py", line 41, in <module>
    from torchmetrics import Metric
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/torchmetrics/__init__.py", line 14, in <module>
    from torchmetrics import functional  # noqa: E402
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/torchmetrics/functional/__init__.py", line 14, in <module>
    from torchmetrics.functional.audio._deprecated import _permutation_invariant_training as permutation_invariant_training
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/torchmetrics/functional/audio/__init__.py", line 14, in <module>
    from torchmetrics.functional.audio.pit import permutation_invariant_training, pit_permutate
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/torchmetrics/functional/audio/pit.py", line 22, in <module>
    from torchmetrics.utilities import rank_zero_warn
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/torchmetrics/utilities/__init__.py", line 14, in <module>
    from torchmetrics.utilities.checks import check_forward_full_state_property
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/torchmetrics/utilities/checks.py", line 25, in <module>
    from torchmetrics.metric import Metric
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/torchmetrics/metric.py", line 30, in <module>
    from torchmetrics.utilities.data import (
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/torchmetrics/utilities/data.py", line 22, in <module>
    from torchmetrics.utilities.imports import _TORCH_GREATER_EQUAL_1_12, _XLA_AVAILABLE
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/torchmetrics/utilities/imports.py", line 50, in <module>
    _TORCHAUDIO_GREATER_EQUAL_0_10: Optional[bool] = compare_version("torchaudio", operator.ge, "0.10.0")
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/lightning_utilities/core/imports.py", line 77, in compare_version
    pkg = importlib.import_module(package)
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/torchaudio/__init__.py", line 1, in <module>
    from . import (  # noqa: F401
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/torchaudio/_extension/__init__.py", line 45, in <module>
    _load_lib("libtorchaudio")
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/torchaudio/_extension/utils.py", line 64, in _load_lib
    torch.ops.load_library(path)
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/torch/_ops.py", line 933, in load_library
    ctypes.CDLL(path)
  File "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/ctypes/__init__.py", line 374, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: /system/conda/miniconda3/envs/cloudspace/lib/python3.10/site-packages/torchaudio/lib/libtorchaudio.so: undefined symbol: _ZN2at4_ops10zeros_like4callERKNS_6TensorEN3c108optionalINS5_10ScalarTypeEEENS6_INS5_6LayoutEEENS6_INS5_6DeviceEEENS6_IbEENS6_INS5_12MemoryFormatEEE

The solution is to either upgrade or uninstall torchaudio, but that is not so obvious to users.

Pitch

Delay torchvision and torchaudio imports, and only import them when actually needed.

Alternatives

N/a

Additional context

This is also relevant for Lightning users, where torchmetrics is tightly integrated and import lightning will also import torchmetrics, which could fail even if you don't explicitly intend to use self.log() or metrics in general.

Shoot. I thought I had the latest torchmetrics but I didn't. This is fixed on the latest. Sorry for the noise.