diff --git a/unsloth/__init__.py b/unsloth/__init__.py index aff9e3d186..89b3666a68 100644 --- a/unsloth/__init__.py +++ b/unsloth/__init__.py @@ -151,6 +151,7 @@ patch_vllm_for_notebooks, patch_torchcodec_audio_decoder, disable_torchcodec_if_broken, + disable_broken_wandb, ) fix_xformers_performance_issue() @@ -172,6 +173,7 @@ patch_vllm_for_notebooks() patch_torchcodec_audio_decoder() disable_torchcodec_if_broken() +disable_broken_wandb() del fix_xformers_performance_issue del fix_vllm_aimv2_issue @@ -191,6 +193,7 @@ del patch_vllm_for_notebooks del patch_torchcodec_audio_decoder del disable_torchcodec_if_broken +del disable_broken_wandb # Torch 2.4 has including_emulation if DEVICE_TYPE == "cuda": diff --git a/unsloth/import_fixes.py b/unsloth/import_fixes.py index ebd81f9568..06322a9396 100644 --- a/unsloth/import_fixes.py +++ b/unsloth/import_fixes.py @@ -1290,6 +1290,38 @@ def disable_torchcodec_if_broken(): pass +def disable_broken_wandb(): + """Disable wandb if it's installed but cannot actually import. + + wandb can fail to import when there's a protobuf version mismatch + (e.g., wandb < 0.19.11 with protobuf >= 6.0). This causes a cascading + import failure through trl -> transformers -> wandb that crashes + unsloth's import chain. + + This function tests if wandb can actually import and if not, patches + transformers' is_wandb_available() to return False. + """ + if importlib.util.find_spec("wandb") is None: + return # wandb not installed, nothing to do + + try: + import wandb + except Exception: + # wandb is installed but broken - patch transformers to skip it + logger.info( + "Unsloth: wandb is installed but broken (likely a protobuf version mismatch). " + "Disabling wandb to prevent import errors. To fix, run: pip install --upgrade wandb" + ) + try: + import transformers.integrations.integration_utils as tf_integration + + tf_integration.is_wandb_available = lambda: False + except (ImportError, AttributeError): + pass + # Also set env var as fallback for any other code path + os.environ["WANDB_DISABLED"] = "true" + + CAUSAL_CONV1D_BROKEN = False _CAUSAL_CONV1D_PREFIX = "causal_conv1d" _CAUSAL_CONV1D_BLOCKER_SENTINEL = "_unsloth_causal_conv1d_blocker"