From 0169be63995f7830532cee14fca7151db7cbdd1b Mon Sep 17 00:00:00 2001 From: Wauplin Date: Fri, 5 Dec 2025 16:23:17 +0100 Subject: [PATCH 1/2] Use hfh's is_offline_mode helper --- examples/pytorch/summarization/run_summarization.py | 3 ++- .../pytorch/summarization/run_summarization_no_trainer.py | 4 ++-- setup.py | 2 +- src/transformers/dependency_versions_table.py | 2 +- src/transformers/dynamic_module_utils.py | 3 +-- src/transformers/feature_extraction_utils.py | 3 +-- src/transformers/file_utils.py | 1 - src/transformers/image_processing_base.py | 3 +-- src/transformers/modelcard.py | 3 +-- src/transformers/modeling_utils.py | 3 +-- src/transformers/pipelines/__init__.py | 3 +-- src/transformers/processing_utils.py | 3 +-- src/transformers/tokenization_utils_base.py | 3 +-- src/transformers/tokenization_utils_tokenizers.py | 3 ++- src/transformers/utils/__init__.py | 1 - src/transformers/utils/hub.py | 8 +------- src/transformers/video_processing_utils.py | 3 +-- tests/utils/test_modeling_utils.py | 6 +++--- tests/utils/test_offline.py | 2 +- 19 files changed, 22 insertions(+), 37 deletions(-) diff --git a/examples/pytorch/summarization/run_summarization.py b/examples/pytorch/summarization/run_summarization.py index ba6d34cd12cb..cac0b3ee3d8d 100755 --- a/examples/pytorch/summarization/run_summarization.py +++ b/examples/pytorch/summarization/run_summarization.py @@ -45,6 +45,7 @@ import numpy as np from datasets import load_dataset from filelock import FileLock +from huggingface_hub import is_offline_mode import transformers from transformers import ( @@ -61,7 +62,7 @@ Seq2SeqTrainingArguments, set_seed, ) -from transformers.utils import check_min_version, is_offline_mode +from transformers.utils import check_min_version from transformers.utils.versions import require_version diff --git a/examples/pytorch/summarization/run_summarization_no_trainer.py b/examples/pytorch/summarization/run_summarization_no_trainer.py index fdd1a098e2df..bb402e933c5f 100644 --- a/examples/pytorch/summarization/run_summarization_no_trainer.py +++ b/examples/pytorch/summarization/run_summarization_no_trainer.py @@ -51,7 +51,7 @@ from accelerate.utils import set_seed from datasets import load_dataset from filelock import FileLock -from huggingface_hub import HfApi +from huggingface_hub import HfApi, is_offline_mode from torch.utils.data import DataLoader from tqdm.auto import tqdm @@ -66,7 +66,7 @@ SchedulerType, get_scheduler, ) -from transformers.utils import check_min_version, is_offline_mode +from transformers.utils import check_min_version from transformers.utils.versions import require_version diff --git a/setup.py b/setup.py index d4b7e1843d24..6702c47aec8a 100644 --- a/setup.py +++ b/setup.py @@ -112,7 +112,7 @@ "GitPython<3.1.19", "hf-doc-builder>=0.3.0", "hf_xet", - "huggingface-hub>=1.0.0,<2.0", + "huggingface-hub>=1.2.1,<2.0", "importlib_metadata", "ipadic>=1.0.0,<2.0", "jinja2>=3.1.0", diff --git a/src/transformers/dependency_versions_table.py b/src/transformers/dependency_versions_table.py index dede5baae31d..00033733d75f 100644 --- a/src/transformers/dependency_versions_table.py +++ b/src/transformers/dependency_versions_table.py @@ -22,7 +22,7 @@ "GitPython": "GitPython<3.1.19", "hf-doc-builder": "hf-doc-builder>=0.3.0", "hf_xet": "hf_xet", - "huggingface-hub": "huggingface-hub>=1.0.0,<2.0", + "huggingface-hub": "huggingface-hub>=1.2.1,<2.0", "importlib_metadata": "importlib_metadata", "ipadic": "ipadic>=1.0.0,<2.0", "jinja2": "jinja2>=3.1.0", diff --git a/src/transformers/dynamic_module_utils.py b/src/transformers/dynamic_module_utils.py index b70879120f73..d797831a26d1 100644 --- a/src/transformers/dynamic_module_utils.py +++ b/src/transformers/dynamic_module_utils.py @@ -30,7 +30,7 @@ from types import ModuleType from typing import Any, Optional, Union -from huggingface_hub import try_to_load_from_cache +from huggingface_hub import is_offline_mode, try_to_load_from_cache from packaging import version from .utils import ( @@ -38,7 +38,6 @@ TRANSFORMERS_DYNAMIC_MODULE_NAME, cached_file, extract_commit_hash, - is_offline_mode, logging, ) from .utils.import_utils import VersionComparison, split_package_version diff --git a/src/transformers/feature_extraction_utils.py b/src/transformers/feature_extraction_utils.py index 0bdf7921cb71..ed7a0978b4e1 100644 --- a/src/transformers/feature_extraction_utils.py +++ b/src/transformers/feature_extraction_utils.py @@ -22,7 +22,7 @@ from typing import TYPE_CHECKING, Any, Optional, TypeVar, Union import numpy as np -from huggingface_hub import create_repo +from huggingface_hub import create_repo, is_offline_mode from .dynamic_module_utils import custom_object_save from .utils import ( @@ -32,7 +32,6 @@ TensorType, copy_func, is_numpy_array, - is_offline_mode, is_torch_available, is_torch_device, is_torch_dtype, diff --git a/src/transformers/file_utils.py b/src/transformers/file_utils.py index 423cb699b804..0b1dae926255 100644 --- a/src/transformers/file_utils.py +++ b/src/transformers/file_utils.py @@ -68,7 +68,6 @@ is_in_notebook, is_ipex_available, is_librosa_available, - is_offline_mode, is_onnx_available, is_pandas_available, is_phonemizer_available, diff --git a/src/transformers/image_processing_base.py b/src/transformers/image_processing_base.py index 2a75c96e72b4..cd59b56e2296 100644 --- a/src/transformers/image_processing_base.py +++ b/src/transformers/image_processing_base.py @@ -18,7 +18,7 @@ from typing import Any, Optional, TypeVar, Union import numpy as np -from huggingface_hub import create_repo +from huggingface_hub import create_repo, is_offline_mode from .dynamic_module_utils import custom_object_save from .feature_extraction_utils import BatchFeature as BaseBatchFeature @@ -28,7 +28,6 @@ PROCESSOR_NAME, PushToHubMixin, copy_func, - is_offline_mode, logging, safe_load_json_file, ) diff --git a/src/transformers/modelcard.py b/src/transformers/modelcard.py index 2a53bb9ba4ff..4cdafea12154 100644 --- a/src/transformers/modelcard.py +++ b/src/transformers/modelcard.py @@ -23,7 +23,7 @@ import httpx import yaml -from huggingface_hub import model_info +from huggingface_hub import is_offline_mode, model_info from huggingface_hub.errors import OfflineModeIsEnabled from huggingface_hub.utils import HFValidationError @@ -50,7 +50,6 @@ MODEL_CARD_NAME, cached_file, is_datasets_available, - is_offline_mode, is_tokenizers_available, is_torch_available, logging, diff --git a/src/transformers/modeling_utils.py b/src/transformers/modeling_utils.py index e46f66ffb0f6..6c73d54f7a44 100644 --- a/src/transformers/modeling_utils.py +++ b/src/transformers/modeling_utils.py @@ -36,7 +36,7 @@ from zipfile import is_zipfile import torch -from huggingface_hub import create_repo, split_torch_state_dict_into_shards +from huggingface_hub import create_repo, is_offline_mode, split_torch_state_dict_into_shards from packaging import version from safetensors import safe_open from safetensors.torch import save_file as safe_save_file @@ -110,7 +110,6 @@ is_flash_attn_2_available, is_flash_attn_3_available, is_kernels_available, - is_offline_mode, is_torch_flex_attn_available, is_torch_greater_or_equal, is_torch_mlu_available, diff --git a/src/transformers/pipelines/__init__.py b/src/transformers/pipelines/__init__.py index 79071edad095..d8ed32213309 100755 --- a/src/transformers/pipelines/__init__.py +++ b/src/transformers/pipelines/__init__.py @@ -18,7 +18,7 @@ from pathlib import Path from typing import TYPE_CHECKING, Any, Optional, Union -from huggingface_hub import model_info +from huggingface_hub import is_offline_mode, model_info from ..configuration_utils import PreTrainedConfig from ..dynamic_module_utils import get_class_from_dynamic_module @@ -38,7 +38,6 @@ extract_commit_hash, find_adapter_config_file, is_kenlm_available, - is_offline_mode, is_peft_available, is_pyctcdecode_available, is_torch_available, diff --git a/src/transformers/processing_utils.py b/src/transformers/processing_utils.py index f54ddeb1b2a6..da846e12da7f 100644 --- a/src/transformers/processing_utils.py +++ b/src/transformers/processing_utils.py @@ -28,7 +28,7 @@ import numpy as np import typing_extensions -from huggingface_hub import create_repo +from huggingface_hub import create_repo, is_offline_mode from huggingface_hub.dataclasses import validate_typed_dict from huggingface_hub.errors import EntryNotFoundError @@ -54,7 +54,6 @@ cached_file, copy_func, direct_transformers_import, - is_offline_mode, is_torch_available, list_repo_templates, logging, diff --git a/src/transformers/tokenization_utils_base.py b/src/transformers/tokenization_utils_base.py index a0f072de7678..9670573cac67 100644 --- a/src/transformers/tokenization_utils_base.py +++ b/src/transformers/tokenization_utils_base.py @@ -33,7 +33,7 @@ from typing import TYPE_CHECKING, Any, NamedTuple, Optional, Union import numpy as np -from huggingface_hub import create_repo, list_repo_files +from huggingface_hub import create_repo, is_offline_mode, list_repo_files from packaging import version from . import __version__ @@ -51,7 +51,6 @@ extract_commit_hash, is_mlx_available, is_numpy_array, - is_offline_mode, is_protobuf_available, is_tokenizers_available, is_torch_available, diff --git a/src/transformers/tokenization_utils_tokenizers.py b/src/transformers/tokenization_utils_tokenizers.py index 988acbf91aae..183a2cf797a3 100644 --- a/src/transformers/tokenization_utils_tokenizers.py +++ b/src/transformers/tokenization_utils_tokenizers.py @@ -24,6 +24,7 @@ from typing import Any, Optional, Union import tokenizers.pre_tokenizers as pre_tokenizers_fast +from huggingface_hub import is_offline_mode from tokenizers import AddedToken, processors from tokenizers import Encoding as EncodingFast from tokenizers import Tokenizer as TokenizerFast @@ -42,7 +43,7 @@ TextInput, TruncationStrategy, ) -from .utils import PaddingStrategy, add_end_docstrings, is_offline_mode, logging +from .utils import PaddingStrategy, add_end_docstrings, logging logger = logging.get_logger(__name__) diff --git a/src/transformers/utils/__init__.py b/src/transformers/utils/__init__.py index 3e3f4e1d8076..229a3c5df350 100644 --- a/src/transformers/utils/__init__.py +++ b/src/transformers/utils/__init__.py @@ -91,7 +91,6 @@ extract_commit_hash, has_file, http_user_agent, - is_offline_mode, list_repo_templates, try_to_load_from_cache, ) diff --git a/src/transformers/utils/hub.py b/src/transformers/utils/hub.py index 406ef76b8a32..fa6319578353 100644 --- a/src/transformers/utils/hub.py +++ b/src/transformers/utils/hub.py @@ -37,6 +37,7 @@ create_repo, hf_hub_download, hf_hub_url, + is_offline_mode, list_repo_tree, snapshot_download, try_to_load_from_cache, @@ -83,13 +84,6 @@ class DownloadKwargs(TypedDict, total=False): commit_hash: str | None -def is_offline_mode(): - # Import inside the function so test patches on `huggingface_hub.constants` are picked up. - from huggingface_hub import constants as hf_hub_constants - - return hf_hub_constants.HF_HUB_OFFLINE - - # Determine default cache directory. # The best way to set the cache path is with the environment variable HF_HOME. For more details, check out this # documentation page: https://huggingface.co/docs/huggingface_hub/package_reference/environment_variables. diff --git a/src/transformers/video_processing_utils.py b/src/transformers/video_processing_utils.py index 6c98439356e2..d73bbce889f1 100644 --- a/src/transformers/video_processing_utils.py +++ b/src/transformers/video_processing_utils.py @@ -22,7 +22,7 @@ from typing import Any, Optional, Union import numpy as np -from huggingface_hub import create_repo +from huggingface_hub import create_repo, is_offline_mode from huggingface_hub.dataclasses import validate_typed_dict from .dynamic_module_utils import custom_object_save @@ -44,7 +44,6 @@ TensorType, add_start_docstrings, copy_func, - is_offline_mode, is_torch_available, is_torchcodec_available, is_torchvision_v2_available, diff --git a/tests/utils/test_modeling_utils.py b/tests/utils/test_modeling_utils.py index fb6a8380cd32..67ea9085a9e7 100644 --- a/tests/utils/test_modeling_utils.py +++ b/tests/utils/test_modeling_utils.py @@ -315,16 +315,16 @@ class TestOffline(unittest.TestCase): def test_offline(self): with tempfile.TemporaryDirectory() as tmpdir: # First offline load should fail - with patch("transformers.utils.hub.is_offline_mode", return_value=True): + with patch("huggingface_hub.is_offline_mode", return_value=True): with pytest.raises(OSError): AutoModelForImageClassification.from_pretrained(TINY_IMAGE_CLASSIF, cache_dir=tmpdir) # Enable online mode for download - with patch("transformers.utils.hub.is_offline_mode", return_value=False): + with patch("huggingface_hub.is_offline_mode", return_value=False): snapshot_download(TINY_IMAGE_CLASSIF, cache_dir=tmpdir) # Load again in offline mode - should work now - with patch("transformers.utils.hub.is_offline_mode", return_value=True): + with patch("huggingface_hub.is_offline_mode", return_value=True): AutoModelForImageClassification.from_pretrained(TINY_IMAGE_CLASSIF, cache_dir=tmpdir) def test_local_files_only(self): diff --git a/tests/utils/test_offline.py b/tests/utils/test_offline.py index 771dd44d0b5c..20f1690bb719 100644 --- a/tests/utils/test_offline.py +++ b/tests/utils/test_offline.py @@ -182,7 +182,7 @@ def test_is_offline_mode(self): """ Test `is_offline_mode` helper (should respect both HF_HUB_OFFLINE and legacy TRANSFORMERS_OFFLINE env vars) """ - load = "from transformers.utils import is_offline_mode" + load = "from huggingface_hub import is_offline_mode" run = "print(is_offline_mode())" stdout, _ = self._execute_with_env(load, run) From f78a54c53bda73da87691b7ee4d78e8925d387ba Mon Sep 17 00:00:00 2001 From: Wauplin Date: Fri, 5 Dec 2025 16:41:29 +0100 Subject: [PATCH 2/2] fix tests --- tests/utils/test_modeling_utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/utils/test_modeling_utils.py b/tests/utils/test_modeling_utils.py index 67ea9085a9e7..0cf8ae251b4c 100644 --- a/tests/utils/test_modeling_utils.py +++ b/tests/utils/test_modeling_utils.py @@ -315,16 +315,16 @@ class TestOffline(unittest.TestCase): def test_offline(self): with tempfile.TemporaryDirectory() as tmpdir: # First offline load should fail - with patch("huggingface_hub.is_offline_mode", return_value=True): + with patch("huggingface_hub.constants.HF_HUB_OFFLINE", True): with pytest.raises(OSError): AutoModelForImageClassification.from_pretrained(TINY_IMAGE_CLASSIF, cache_dir=tmpdir) # Enable online mode for download - with patch("huggingface_hub.is_offline_mode", return_value=False): + with patch("huggingface_hub.constants.HF_HUB_OFFLINE", False): snapshot_download(TINY_IMAGE_CLASSIF, cache_dir=tmpdir) # Load again in offline mode - should work now - with patch("huggingface_hub.is_offline_mode", return_value=True): + with patch("huggingface_hub.constants.HF_HUB_OFFLINE", True): AutoModelForImageClassification.from_pretrained(TINY_IMAGE_CLASSIF, cache_dir=tmpdir) def test_local_files_only(self):