Přeskočit na obsah
Infrastruktura aktualizováno 10. 8. 2026 3 min čtení

Hlavní větev Transformers přestala vydávat starý soubor z cache za aktuální

Knihovna Transformers mohla na souborovém systému jen pro čtení předat aplikaci starší soubor z cache, i když na Hugging Face Hubu našla novější revizi. Oprava sloučená 9. srpna 2026 chybu EROFS nově neskrývá; zatím jde o změnu v hlavní větvi, ne o oznámení nové verze balíčku.

Diskové úložiště IBM se zásuvkami pro pevné disky
Souborová cache Hugging Face ukládá stažené soubory a odkazy na jednotlivé revize modelu. Foto: j_cadmus, Wikimedia Commons (CC BY 2.0)

Když program načítá model přes knihovnu Transformers, nemusí pokaždé stahovat všechny soubory z Hugging Face Hubu. Společná cache uchovává stažené objekty a vedle nich odkazy na konkrétní revize. Pokud se větev modelu změní, má přibýt nový záznam a starý zůstane k dispozici pro případ, že si o něj aplikace výslovně řekne.

Na systému souborů připojeném jen pro čtení se však tato posloupnost rozbila způsobem, který nebyl na první pohled vidět. Funkce hf_hub_download zjistila, že na Hubu existuje novější revize, ale nový objekt nebo ukazatel na revizi už nedokázala zapsat. Místo jasné chyby pak nadřazená funkce cached_files mohla vrátit dříve uložený soubor.

Novější revize existovala, aplikace dostala starší

Návrh opravy 47852 popisuje konkrétní průběh. Stažení nejprve spojilo jméno větve s novým identifikátorem commitu. Pokus o zápis do adresáře cache potom skončil chybou OSError s číslem 30, tedy EROFS. Ta znamená, že je celý souborový systém jen pro čtení.

Transformers mělo pro chyby při stahování společnou obsluhu. Některé výjimky posílalo dál, jiné vedly k nouzovému použití souboru, který už v cache ležel. EROFS nepatřilo do první skupiny, a proto propadlo až k obnově ze staré cache. Volající program nedostal informaci, že aktualizace selhala.

Problém se v průběžné integraci projektu projevil na souboru chat_template. Bez opravy test podle autorů načetl starou šablonu, s opravou už prošel s novou. To zároveň vymezuje doložený rozsah: návrh mluví o vzácném nastavení, používaném hlavně ve vlastní průběžné integraci projektu. Netvrdí, že se chyba běžně projevovala u všech uživatelů Transformers.

Python rozlišuje zákaz zápisu dvěma výjimkami

Příčinou nebyla samotná cache, ale rozdíl mezi dvěma podobnými zákazy zápisu. Když uživatel nemá k zapisovatelnému adresáři oprávnění, operační systém vrátí EACCES s číslem 13. Python tuto chybu mapuje na zvláštní třídu PermissionError a původní podmínka v Transformers ji zachytila.

Souborový systém připojený celý jen pro čtení vrací EROFS s číslem 30. Dokumentace Pythonu ho vede jako samostatný systémový symbol, ne jako chybu mapovanou na PermissionError. V programu proto zůstane obecným OSError. Kontrola isinstance(e, PermissionError) tak pokryla zákaz podle práv k adresáři, ale ne zákaz daný režimem celého připojeného systému.

Režim jen pro čtení je běžné bezpečnostní opatření

Nejde přitom o nesmyslné nastavení. Bezpečnostní checklist Kubernetes doporučuje u kontejneru nastavit readOnlyRootFilesystem: true. Aplikace pak nemůže zapisovat do kořenového systému kontejneru; zapisovatelná data musí správce umístit do samostatného svazku.

Cache Hugging Face má podle dokumentace huggingface_hub výchozí adresář ~/.cache/huggingface/hub. Umístění lze změnit parametrem cache_dir nebo proměnnými HF_HOMEHF_HUB_CACHE. Samotný kořenový systém jen pro čtení tedy nemusí znamenat cache jen pro čtení; záleží na tom, kam je cache nasměrovaná a jaké svazky kontejner dostal.

Oprava chybu ukáže, cestu sama nepřepne

Commit sloučený 9. srpna přidává přesnou kontrolu isinstance(e, OSError) and e.errno == errno.EROFS. Když sedí, výjimku znovu vyvolá dřív, než se kód dostane k nouzovému použití starého souboru. Aplikace tak může selhání přiznat nebo opakovat stažení do zapisovatelného adresáře.

Změna sama žádnou náhradní cestu nevybírá. V průběžné integraci Transformers ji obstarává zvláštní obal, který po chybě zkusí dočasnou cache. Pro ostatní volající je výsledkem především jiná smlouva: místo souboru, který vypadá aktuálně, dostanou chybu a musí rozhodnout, co s ní.

Oprava je zatím v hlavní větvi repozitáře. Z commitu neplyne číslo balíčku, ve kterém se dostane k uživatelům, a proto ho nelze vydávat za nové stabilní vydání. Provozovatel může do té doby ověřit dvě věci bez odhadu: zda jeho cache opravdu leží na systému jen pro čtení a zda načítá pevně určenou revizi, nebo pokaždé žádá nejnovější stav větve.

Diskuse

Zatím tu nikdo nediskutuje. Můžete být první.

Napsat příspěvek

Diskutovat můžete i bez účtu. S registrací se ale příspěvek zveřejní hned a nemusíte pokaždé vyplňovat jméno. Účet už máte? Přihlaste se.

Nezveřejňujeme ho, slouží jen redakci.

Podporuje zápis Texy: **tučně**, *kurzíva*, odrážky, odkazy.

Dál k tématu

  1. Infrastruktura

    SGLang 0.5.19 odmítne požadavek s víc než 32 zastavovacími řetězci

    Inferenční server SGLang přijme od verze 0.5.19 v jednom požadavku nejvýš 32 zastavovacích řetězců a 32 regulárních výrazů, každý výraz do 256 bajtů. Přes tu mez vrátí…

  2. Infrastruktura

    Experimentální backend v PyTorchi 2.14 umí postavit skupinu procesů po výpadku znovu

    PyTorch vydal 2. září verzi 2.14 a v ní backend nccl2, port komunikační vrstvy z projektu torchcomms. Proti dosavadnímu backendu umí přestavět skupinu procesů: zboří…

  3. Infrastruktura

    NVIDIA přesouvá řadič paměti z akcelerátoru do základního čipu NVHBM

    NVIDIA oznámila NVHBM, která přesouvá řadič paměti z akcelerátoru do základního čipu v HBM. Proti HBM4E slibuje až o 30 % vyšší propustnost a o 15 % nižší spotřebu, u…

  4. Infrastruktura

    Triton 3.8.0 překládá jádra pro Rubin, který je zatím jen v náhledu dokumentace PTX

    Vydání z 28. srpna přidalo do překladače Triton cíl „cuda:107“ pro architekturu, kterou NVIDIA popisuje zatím jen ve vývojářském náhledu dokumentace PTX. Z Tritonu i z…