Hugging Face 模型已经下载,离线加载仍报 LocalEntryNotFoundError
离线加载按实际 cache_dir、仓库、revision 和文件名定位。核对子模型及 symlink 目标,区分 Hub 缓存、local_dir 与 pyannote 自有缓存目录。
磁盘里能看到模型目录,切到离线环境后仍报 LocalEntryNotFoundError。这个错误说明当前调用没找到它要的本地条目,不能据此断定整个模型都没下载,也不能证明库忽略了缓存。
应对齐四项:这次调用的缓存目录、仓库 ID、revision 和文件名。下面按 huggingface_hub 0.36.0 的文件缓存结构说明,并单独指出 pyannote.audio 3.1.1 的缓存入口。
检查的是报错文件,不是任意一个 config
从完整异常里读出 repo_id、filename 和 revision。主模型的 config.yaml 存在,不代表配置引用的另一个 segmentation 或 embedding 模型权重也存在。修改了配置中的模型 ID,更需要重新核对依赖。
如果应用显式传了 cache_dir,先按这个目录检查。只看 HF_HUB_CACHE 的值可能找错位置;容器还要确认目录挂载到了实际报错进程可见的位置,且运行账号能读取。
以下示例只查询缓存,不发 HTTP 请求。三个字符串都应替换成失败调用中的值,revision 尽量使用已经下载过的完整 commit hash:
from pathlib import Path
from huggingface_hub import try_to_load_from_cache, _CACHED_NO_EXIST
path = try_to_load_from_cache(
repo_id="organization/model-name",
filename="config.json",
revision="REPLACE_WITH_FULL_COMMIT_HASH",
cache_dir="/srv/models/hub",
)
if isinstance(path, str):
print("cached:", path, "regular file exists:", Path(path).is_file())
elif path is _CACHED_NO_EXIST:
print("file absence was cached for this revision")
else:
print("no matching cached entry")
is_file() 只核对常规文件是否存在(包括符号链接指向的目标),不检查当前账号是否有读取权限;可读性仍要由实际打开或原加载入口确认。这也只核对指定的一个文件。权重分片、索引和 tokenizer 文件需要各自存在;_CACHED_NO_EXIST 也不是“这份模型永远没有此文件”,而是该 revision 的不存在记录。
revision 与搬运目录要保持一致
Hub 缓存通常在仓库目录中包含 refs、snapshots 和 blobs。分支名通过 refs 映射到 commit;snapshots/<commit> 中的文件可能是指向 blobs 的符号链接。只复制 snapshot 目录而漏掉 blob,会留下看起来存在、实际目标丢失的链接。
保留原缓存,重新准备完整的所需缓存结构或独立模型目录。Windows 等不使用 symlink 的缓存方式应按实际文件检查,不强行把它改造成链接结构。
离线调用 main 时,需要本地知道它映射到哪个 commit。已经有正确 commit 的缓存时,可在应用配置中固定同一个 commit,避免误用另一个 revision。不要通过手改 refs/main 掩盖文件来自不同版本的问题。
下载到 local_dir,不等于放进默认 Hub 缓存
使用 snapshot_download(..., local_dir=...) 时,文件布局与默认缓存模式不同。应用若仍按 repo_id 加默认 cache_dir 查找,就可能看不到这些文件。
在可联网且已有必要访问权限的准备环境中,用同一 revision 下载需要的完整文件,保留库版本与依赖清单。目标框架支持本地目录加载时,明确传入那个目录;使用 Hub 缓存模式时,下载端与离线端应使用同一 cache_dir。不要混用路径后再复制一份看似同名的目录。
0.36.0 的离线 snapshot_download 可能返回已经存在的 snapshot 目录,这不能单独证明所有文件完整。还需按目标框架的权重索引、配置和 tokenizer 需求核对文件,并让原加载入口在隔离验证环境中完成离线加载。
pyannote 的缓存可能另有入口
pyannote.audio 3.1.1 使用 PYANNOTE_CACHE,默认路径按该版本的 torch 缓存约定确定;它的加载函数会把自己的 cache_dir 传给 Hub。仅设置 HF_HUB_CACHE,不保证它沿用该目录。
确认项目确实使用这个版本路径后,在导入 pyannote 之前设置预期的 PYANNOTE_CACHE,或使用加载入口支持的显式 cache_dir。顶层 pipeline 和子模型也要沿用预期目录,不能只让第一份配置命中。
最后在新的离线进程中复查原应用,确认实际需要的所有仓库和文件可读。local_files_only=True 与 HF_HUB_OFFLINE=1 可以限制 Hub 的联网行为,但不会补齐缺失文件,也不保证应用的其他组件不会联网。保留原目录和配置,失败时切回;无需先清空全部缓存。


