huggingface_hub на удалённом Mac или self-hosted runner, типичный поисковый запрос звучит так: включать ли HF_TRANSFER, как задать зеркальный HF_ENDPOINT, не смешаются ли каталоги кеша и как составить ключ кеша CI без сюрпризов. Ниже — исполняемые переменные окружения и таблица решений; семантика переменных сверяйте с официальной справкой huggingface_hub. Критично: все export — до строки import huggingface_hub. Точки входа на сайте: главная, список блога. Для смежного ускорения загрузок: многоуровневый кеш моделей (OpenClaw), Git и Docker pull, Python CI, uv и PyPI.
Сценарии и чеклист узких мест
Сначала сопоставьте симптом с «ручкой» регулировки: на удалённом узле бессмысленно крутить только параллелизм Xet, если метаданные падают по таймауту или несколько джобов пишут в один кеш.
- Долгий этап ETag / проверка ревизии: при трансграничном RTT значение по умолчанию
HF_HUB_ETAG_TIMEOUT=10часто даёт ложные отказы; сначала поднимайте этот порог, а не полосу пропускания. - Обрыв крупного файла на середине: для чекпоинтов на десятки гигабайт дефолтный
HF_HUB_DOWNLOAD_TIMEOUT=10обычно мал; до диагностики диска повышайте именно его. - Параллельные джобы в один
HF_HUB_CACHE: временные файлы и жёсткие ссылки в кеше Hub плохо переносят одновременную запись; выделяйте подпапку на пайплайн, отдельныйHF_HOMEили серийный префетч-стейдж. - Смена зеркала после частичной загрузки: новый
HF_ENDPOINTтребует нового корня кеша или чистогоHF_HUB_CACHE, иначе растут «необъяснимые» checksum-ошибки. - 403 / gated-репозитории: нужен валидный
HF_TOKENв секретах CI; зеркало должно поддерживать ту же модель авторизации. - NAS или смешанные ОС: задайте
HF_HUB_DISABLE_SYMLINKS=1, чтобы не ловить битые symlink при SMB/APFS; цена — больший расход места на диске.
| Сигнал | Первый шаг | Чего избегать |
|---|---|---|
| Медленные list/metadata | ↑ HF_HUB_ETAG_TIMEOUT; при разрешённом зеркале — HF_ENDPOINT |
Максимальный Xet-параллелизм до исправления метаданных |
| Обрыв большого блоба | ↑ HF_HUB_DOWNLOAD_TIMEOUT; повтор только шага загрузки |
Массовый параллельный рестарт всего пайплайна без бэкоффа |
| Есть канал, но CPU на 100% | HF_XET_HIGH_PERFORMANCE=1 + умеренный HF_XET_NUM_CONCURRENT_RANGE_GETS |
Делить одно ядро раннера между тяжёлым Xet и Xcode-сборкой без лимитов |
Таблица переменных: HF_HUB_ENABLE_HF_TRANSFER, HF_ENDPOINT, каталоги кеша и параллельная загрузка
| Переменная | Назначение | Дефолт / суть | Рекомендация для Mac CI |
|---|---|---|---|
HF_ENDPOINT |
Базовый URL API и артефактов Hub | https://huggingface.co |
Для зеркала — origin вашего зеркала; смена ⇒ новый корень кеша |
HF_HOME |
Корень токенов и кешей | Зависит от ОС / XDG_CACHE_HOME |
Явный путь на SSD, напр. $HOME/.cache/hf-ci-$CI_PIPELINE_ID |
HF_HUB_CACHE |
Снимки моделей/датасетов | $HF_HOME/hub |
Совпадайте с path в шаге restore/save кеша CI |
HF_XET_CACHE |
Чанки Xet | $HF_HOME/xet |
Кешируйте вместе с HF_HUB_CACHE при смене endpoint |
HF_HUB_ENABLE_HF_TRANSFER |
Исторический fast-path «hf_transfer» | Помечен как устаревший в документации | Не опирайтесь в новых пайплайнах; сравнение со старыми логами |
HF_XET_HIGH_PERFORMANCE |
Агрессивный режим Xet | Выше CPU и IO | 1 на выделенном джобе с запасом по CPU |
HF_XET_NUM_CONCURRENT_RANGE_GETS |
Параллельные range-GET на файл | Часто 16 в свежих версиях | Слабый канал или шумная сеть: 6–12 |
HF_HUB_DOWNLOAD_TIMEOUT |
Таймаут чтения при скачивании (с) | ≈10 | Трансгранично: 120–300 |
HF_HUB_ETAG_TIMEOUT |
Ожидание метаданных (с) | ≈10 | 30–120 |
HF_HUB_OFFLINE |
Запрет исходящих HTTP, только кеш | 0/1 | После префетча — для тестовых стейджей |
HF_TOKEN |
Токен доступа | Файл в HF_HOME или env |
Только секреты CI, минимальные права read |
Готовый блок для shell-стейджа (адаптируйте HF_ENDPOINT под своё зеркало и путь диска под APFS/NVMe):
Докачка (resume) и проектирование ключей кеша CI
Докачка: huggingface_hub переиспользует частично загруженные объекты в пределах одного согласованного каталога кеша и той же ревизии. Условие — отсутствие гонок записи из параллельных джобов. Практичный шаблон: отдельный префетч-стейдж, который тянет веса, а downstream-джобы либо читают тот же путь в режиме «только чтение», либо ставят HF_HUB_OFFLINE=1, чтобы не платить за лишние round-trip метаданных.
repo_id(напримерorg/model)- Закреплённый revision (commit SHA), а не плавающее имя ветки
- Хост из
HF_ENDPOINT(обязательно при чередовании зеркала и origin) - Минорная версия
huggingface_hubи Python (при смене поведения API) - Опционально: флаги Xet, если меняете стратегию упаковки/скорости и делите артефакт между ветками
В механизмах вроде GitHub Actions поле path должно указывать на тот же HF_HUB_CACHE (и при необходимости HF_XET_CACHE); restore-keys делайте уже основного ключа, если готовы к редким промахам целостности. На общем пуле удалённых Mac надёжнее отдельный HF_HOME на пайплайн плюс синхронизация «тяжёлого» кеша через администрируемый снимок, а не общая запись с нескольких runner’ов.
Повторы при сбоях, пороги таймаутов и FAQ
Порядок настройки таймаутов: при TimeoutError на скачивании сначала увеличьте HF_HUB_DOWNLOAD_TIMEOUT; если зависание на этапе «узнать актуальную ревизию», добавьте HF_HUB_ETAG_TIMEOUT. Оба дефолта около 10 с плохо коррелируют с трансграничными маршрутами и файлами >10–50 ГБ.
Повторы: оборачивайте только шаг загрузки весов (2–3 попытки) с экспоненциальным бэкоффом и джиттером, например пауза sleep $((16 + RANDOM % 17)) между попытками; при 429 читайте Retry-After. Не перезапускайте весь пайплайн десять раз подряд без паузы — вы упрётесь в лимиты Hub и в очередь раннера.
Прокси и TLS: корпоративные MITM требуют явного доверия к корневому CA в окружении Python/requests; используйте HTTPS_PROXY / NO_PROXY согласно политике egress. Для проверки «всё ли уже в кеше» поднимите краткий смоук с HF_HUB_OFFLINE=1.
HDD и джиттер записи Xet: при медленных дисках рассмотрите HF_XET_RECONSTRUCT_WRITE_SEQUENTIALLY=1 (последовательная запись чанков); для кеша весов предпочтительны NVMe на удалённом Mac.
Внутренние ссылки: главная, блог и материалы про ускорение pull
- Навигация сайта: хлебные крошки и вводный абзац ведут на главную MacPull и каталог блога — удобно для перехода с органического поиска.
- Кеш тяжёлых моделей и квоты: см. многоуровневый кеш моделей на удалённом Mac.
- Сетевой контур репозитория и образов: ускорение Git clone и Docker pull дополняет Hub-pull тем же принципом «сначала стабильный канал и ключи кеша».
- Python-зависимости рядом с ML-стеком: матрица uv/PyPI — для согласованности lockfile и зеркал индекса в том же пайплайне.
Итог: в 2026 году на удалённом Mac трансграничный pull весов с Hub начинается с выравнивания HF_HUB_DOWNLOAD_TIMEOUT и HF_HUB_ETAG_TIMEOUT под реальную сеть, затем с жёсткой границы каталогов HF_HOME / HF_HUB_CACHE / HF_XET_CACHE и ключей кеша с хостом endpoint и SHA ревизии. Скорость отдаётся стеку Xet (HF_XET_HIGH_PERFORMANCE, HF_XET_NUM_CONCURRENT_RANGE_GETS), а HF_HUB_ENABLE_HF_TRANSFER оставьте лишь как историческую отсылку. Нужен стабильный Apple Silicon-раннер с быстрым диском под кеш — без обязательного входа можно открыть главную, тарифы, оформление аренды и центр помощи.
Сначала стабильный pull весов — потом тренировка и инференс
Аренда удалённого Mac Mini M4 снижает расхождение «локально работало / в CI упало»: тот же macOS, APFS и привычные пути кеша. Ознакомьтесь с продуктом на главной, подберите пакет на странице цен, оформите доступ через покупку / аренду; ответы на типовые вопросы — в центре помощи. Дополнительно по кешу моделей: гайд по многоуровневому кешу.