2023-12-18 02:20:08 -07:00
|
|
|
import os
|
|
|
|
import tempfile
|
|
|
|
|
2023-02-14 05:02:16 -07:00
|
|
|
import pytest
|
|
|
|
|
2023-12-18 02:20:08 -07:00
|
|
|
import huggingface_hub.constants
|
|
|
|
|
|
|
|
import text_generation_server.utils.hub
|
2023-03-07 10:52:22 -07:00
|
|
|
from text_generation_server.utils.hub import (
|
2023-02-14 05:02:16 -07:00
|
|
|
weight_hub_files,
|
|
|
|
download_weights,
|
|
|
|
weight_files,
|
|
|
|
EntryNotFoundError,
|
|
|
|
LocalEntryNotFoundError,
|
|
|
|
RevisionNotFoundError,
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2023-12-18 02:20:08 -07:00
|
|
|
@pytest.fixture()
|
|
|
|
def offline():
|
|
|
|
current_value = text_generation_server.utils.hub.HF_HUB_OFFLINE
|
|
|
|
text_generation_server.utils.hub.HF_HUB_OFFLINE = True
|
|
|
|
yield "offline"
|
|
|
|
text_generation_server.utils.hub.HF_HUB_OFFLINE = current_value
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture()
|
|
|
|
def fresh_cache():
|
|
|
|
with tempfile.TemporaryDirectory() as d:
|
|
|
|
current_value = huggingface_hub.constants.HUGGINGFACE_HUB_CACHE
|
|
|
|
huggingface_hub.constants.HUGGINGFACE_HUB_CACHE = d
|
|
|
|
text_generation_server.utils.hub.HUGGINGFACE_HUB_CACHE = d
|
2023-12-21 09:25:22 -07:00
|
|
|
os.environ["HUGGINGFACE_HUB_CACHE"] = d
|
2023-12-18 02:20:08 -07:00
|
|
|
yield
|
|
|
|
huggingface_hub.constants.HUGGINGFACE_HUB_CACHE = current_value
|
2023-12-21 09:25:22 -07:00
|
|
|
os.environ["HUGGINGFACE_HUB_CACHE"] = current_value
|
2023-12-18 02:20:08 -07:00
|
|
|
text_generation_server.utils.hub.HUGGINGFACE_HUB_CACHE = current_value
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture()
|
|
|
|
def prefetched():
|
|
|
|
model_id = "bert-base-uncased"
|
|
|
|
huggingface_hub.snapshot_download(
|
|
|
|
repo_id=model_id,
|
|
|
|
revision="main",
|
|
|
|
local_files_only=False,
|
|
|
|
repo_type="model",
|
2023-12-21 09:25:22 -07:00
|
|
|
allow_patterns=["*.safetensors"],
|
2023-12-18 02:20:08 -07:00
|
|
|
)
|
|
|
|
yield model_id
|
|
|
|
|
|
|
|
|
|
|
|
def test_weight_hub_files_offline_error(offline, fresh_cache):
|
|
|
|
# If the model is not prefetched then it will raise an error
|
|
|
|
with pytest.raises(EntryNotFoundError):
|
|
|
|
weight_hub_files("gpt2")
|
|
|
|
|
|
|
|
|
|
|
|
def test_weight_hub_files_offline_ok(prefetched, offline):
|
|
|
|
# If the model is prefetched then we should be able to get the weight files from local cache
|
|
|
|
filenames = weight_hub_files(prefetched)
|
2023-12-21 09:29:23 -07:00
|
|
|
root = None
|
|
|
|
assert len(filenames) == 1
|
|
|
|
for f in filenames:
|
|
|
|
curroot, filename = os.path.split(f)
|
|
|
|
if root is None:
|
|
|
|
root = curroot
|
|
|
|
else:
|
|
|
|
assert root == curroot
|
|
|
|
assert filename == "model.safetensors"
|
2023-12-18 02:20:08 -07:00
|
|
|
|
|
|
|
|
2023-02-14 05:02:16 -07:00
|
|
|
def test_weight_hub_files():
|
|
|
|
filenames = weight_hub_files("bigscience/bloom-560m")
|
|
|
|
assert filenames == ["model.safetensors"]
|
|
|
|
|
|
|
|
|
|
|
|
def test_weight_hub_files_llm():
|
|
|
|
filenames = weight_hub_files("bigscience/bloom")
|
|
|
|
assert filenames == [f"model_{i:05d}-of-00072.safetensors" for i in range(1, 73)]
|
|
|
|
|
|
|
|
|
|
|
|
def test_weight_hub_files_empty():
|
|
|
|
with pytest.raises(EntryNotFoundError):
|
|
|
|
weight_hub_files("bigscience/bloom", extension=".errors")
|
|
|
|
|
|
|
|
|
|
|
|
def test_download_weights():
|
|
|
|
model_id = "bigscience/bloom-560m"
|
|
|
|
filenames = weight_hub_files(model_id)
|
|
|
|
files = download_weights(filenames, model_id)
|
|
|
|
local_files = weight_files("bigscience/bloom-560m")
|
|
|
|
assert files == local_files
|
|
|
|
|
|
|
|
|
2023-12-18 02:20:08 -07:00
|
|
|
def test_weight_files_revision_error():
|
2023-02-14 05:02:16 -07:00
|
|
|
with pytest.raises(RevisionNotFoundError):
|
|
|
|
weight_files("bigscience/bloom-560m", revision="error")
|
2023-12-18 02:20:08 -07:00
|
|
|
|
|
|
|
|
|
|
|
def test_weight_files_not_cached_error(fresh_cache):
|
2023-02-14 05:02:16 -07:00
|
|
|
with pytest.raises(LocalEntryNotFoundError):
|
|
|
|
weight_files("bert-base-uncased")
|