Hub Python Library documentation

从 Hub 下载文件

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

从 Hub 下载文件

huggingface_hub 库提供了从 Hub 上存储的仓库下载文件的函数。你可以独立使用这些函数,也可以将它们集成到你自己的库中,从而让你的用户更方便地与 Hub 交互。本指南将向你展示如何:

  • 下载并缓存单个文件。
  • 下载并缓存整个仓库。
  • 将文件下载到本地文件夹。

下载单个文件

hf_hub_download() 函数是从 Hub 下载文件的主要函数。 它会下载远程文件,以版本感知的方式将其缓存到磁盘上,并返回其本地文件路径。

返回的文件路径是指向 HF 本地缓存的指针。因此,请勿修改该文件,以免缓存损坏。如果您想了解文件缓存的更多细节,请参阅我们的缓存指南。

从最新版本

使用 repo_id、repo_type 和 filename 参数选择要下载的文件。默认情况下,该文件被视为 model 仓库的一部分。

>>> from huggingface_hub import hf_hub_download
>>> hf_hub_download(repo_id="lysandre/arxiv-nlp", filename="config.json")
'/root/.cache/huggingface/hub/models--lysandre--arxiv-nlp/snapshots/894a9adde21d9a3e3843e6d5aeaaf01875c7fade/config.json'

# Download from a dataset
>>> hf_hub_download(repo_id="google/fleurs", filename="fleurs.py", repo_type="dataset")
'/root/.cache/huggingface/hub/datasets--google--fleurs/snapshots/199e4ae37915137c555b1765c01477c216287d34/fleurs.py'

从特定版本

默认情况下,会下载 main 分支的最新版本。但在某些情况下,您可能需要下载特定版本的文件(例如来自特定分支、PR、标签或提交哈希)。为此,请使用 revision 参数:

# Download from the `v1.0` tag
>>> hf_hub_download(repo_id="lysandre/arxiv-nlp", filename="config.json", revision="v1.0")

# Download from the `test-branch` branch
>>> hf_hub_download(repo_id="lysandre/arxiv-nlp", filename="config.json", revision="test-branch")

# Download from Pull Request #3
>>> hf_hub_download(repo_id="lysandre/arxiv-nlp", filename="config.json", revision="refs/pr/3")

# Download from a specific commit hash
>>> hf_hub_download(repo_id="lysandre/arxiv-nlp", filename="config.json", revision="877b84a8f93f2d619faa2a6e514a32beef88ab0a")

注意:使用提交哈希时,必须使用完整长度的哈希,而不是 7 个字符的提交哈希。

构建下载 URL

如果您想构造用于从仓库下载文件的 URL,可以使用 hf_hub_url(),它会返回一个 URL。 请注意,hf_hub_download() 内部使用了它。

下载整个仓库

snapshot_download() 会下载指定修订版本下的整个仓库。它内部使用 hf_hub_download(),这意味着所有下载的文件也会缓存在本地磁盘上。下载过程是并发执行的,以加快流程。

要下载整个仓库,只需传入 repo_id 和 repo_type:

>>> from huggingface_hub import snapshot_download
>>> snapshot_download(repo_id="lysandre/arxiv-nlp")
'/home/lysandre/.cache/huggingface/hub/models--lysandre--arxiv-nlp/snapshots/894a9adde21d9a3e3843e6d5aeaaf01875c7fade'

# Or from a dataset
>>> snapshot_download(repo_id="google/fleurs", repo_type="dataset")
'/home/lysandre/.cache/huggingface/hub/datasets--google--fleurs/snapshots/199e4ae37915137c555b1765c01477c216287d34'

snapshot_download() 默认下载最新修订版本。如果您需要特定的仓库修订版本,请使用 revision 参数:

>>> from huggingface_hub import snapshot_download
>>> snapshot_download(repo_id="lysandre/arxiv-nlp", revision="refs/pr/1")

筛选要下载的文件

snapshot_download() 提供了一种便捷的方式来下载仓库。但您并不总是需要下载仓库的全部内容。例如,如果您确定只会使用 .safetensors 权重,可能希望避免下载所有 .bin 文件。您可以使用 allow_patterns 和 ignore_patterns 参数来实现这一点。

这些参数接受单个模式或模式列表。模式是标准通配符(globbing 模式),文档见此处。模式匹配基于fnmatch。

例如,您可以使用 allow_patterns 来仅下载 JSON 配置文件:

>>> from huggingface_hub import snapshot_download
>>> snapshot_download(repo_id="lysandre/arxiv-nlp", allow_patterns="*.json")

另一方面,ignore_patterns 可以排除某些文件不被下载。以下示例忽略了 .msgpack 和 .h5 文件扩展名:

>>> from huggingface_hub import snapshot_download
>>> snapshot_download(repo_id="lysandre/arxiv-nlp", ignore_patterns=["*.msgpack", "*.h5"])

最后,您可以将两者结合使用,以精确筛选您的下载内容。以下是一个示例,用于下载除 vocab.json 之外的所有 json 和 markdown 文件。

>>> from huggingface_hub import snapshot_download
>>> snapshot_download(repo_id="gpt2", allow_patterns=["*.md", "*.json"], ignore_patterns="vocab.json")

将文件下载到本地文件夹

默认情况下,我们建议使用缓存系统从 Hub 下载文件。您可以在hf_hub_download()和snapshot_download()中使用cache_dir参数指定自定义缓存位置,或者通过设置HF_HOME环境变量来实现。

不过,如果您需要将文件下载到特定文件夹,可以向下载函数传递 local_dir 参数。这有助于使工作流更接近 git 命令所提供的功能。下载的文件将在指定文件夹内保留其原始文件结构。例如,如果 filename="data/train.csv" 且 local_dir="path/to/folder",则生成的文件路径为 "path/to/folder/data/train.csv"。

在本地目录的根目录下会创建一个 .cache/huggingface/ 文件夹,其中包含已下载文件的元数据。如果文件已是最新,这将避免重复下载。如果元数据已更改,则会下载新版本的文件。这使得 local_dir 能够优化为仅拉取最新的更改。

完成下载后,如果不再需要,您可以安全地删除 .cache/huggingface/ 文件夹。但请注意,在没有该文件夹的情况下重新运行脚本可能会导致更长的恢复时间,因为元数据将会丢失。请放心,您的本地数据将保持完整且不受影响。

在将更改提交到 Hub 时,无需担心 .cache/huggingface/ 文件夹!该文件夹会被 git 和 upload_folder() 自动忽略。

从 CLI 下载

您可以在终端中使用 hf download 命令直接从 Hub 下载文件。 在内部,它使用上述描述的相同的 hf_hub_download() 和 snapshot_download() 辅助函数,并将返回的路径打印到终端。

>>> hf download gpt2 config.json
/home/wauplin/.cache/huggingface/hub/models--gpt2/snapshots/11c5a3d5811f50298f278a704980280950aedb10/config.json

您可以一次下载多个文件,这将显示进度条并返回文件所在的快照路径:

>>> hf download gpt2 config.json model.safetensors
Fetching 2 files: 100%|████████████████████████████████████████████| 2/2 [00:00<00:00, 23831.27it/s]
/home/wauplin/.cache/huggingface/hub/models--gpt2/snapshots/11c5a3d5811f50298f278a704980280950aedb10

您也可以通过单个 hf:// URI 指向仓库(以及可选的修订版本和文件)。该 URI 遵循语法 hf://[<TYPE>/]<ID>[@<REVISION>][/<PATH>](完整语法请参阅 HF URIs 参考),并取代了 --repo-type 和 --revision 选项,这些选项不能与其同时设置:

# Download a single file from a dataset at a given revision
>>> hf download hf://datasets/google/fleurs@refs/pr/1/fleurs.py

# Download a subfolder (note the trailing slash)
>>> hf download hf://datasets/google/fleurs/data/

# Download an entire repo
>>> hf download hf://datasets/google/fleurs

有关 CLI 下载命令的更多详细信息,请参阅 CLI 指南。

试运行模式

在某些情况下,您可能希望在真正下载之前先检查哪些文件将被下载。您可以使用 --dry-run 参数来执行此操作。它会列出仓库中所有待下载的文件,并检查它们是否已经下载。这有助于了解需要下载的文件数量及其大小。

下面是一个示例,用于检查单个文件:

>>> hf download openai-community/gpt2 onnx/decoder_model_merged.onnx --dry-run
[dry-run] Will download 1 files (out of 1) totalling 655.2M
File                           Bytes to download
------------------------------ -----------------
onnx/decoder_model_merged.onnx 655.2M

如果文件已经缓存:

>>> hf download openai-community/gpt2 onnx/decoder_model_merged.onnx --dry-run
[dry-run] Will download 0 files (out of 1) totalling 0.0.
File                           Bytes to download
------------------------------ -----------------
onnx/decoder_model_merged.onnx -

您也可以在完整仓库上执行试运行:

>>> hf download openai-community/gpt2 --dry-run
[dry-run] Fetching 26 files: 100%|█████████████| 26/26 [00:04<00:00,  6.26it/s]
[dry-run] Will download 11 files (out of 26) totalling 5.6G.
File                              Bytes to download
--------------------------------- -----------------
.gitattributes                    -
64-8bits.tflite                   125.2M
64-fp16.tflite                    248.3M
64.tflite                         495.8M
README.md                         -
config.json                       -
flax_model.msgpack                497.8M
generation_config.json            -
merges.txt                        -
model.safetensors                 548.1M
onnx/config.json                  -
onnx/decoder_model.onnx           653.7M
onnx/decoder_model_merged.onnx    655.2M
onnx/decoder_with_past_model.onnx 653.7M
onnx/generation_config.json       -
onnx/merges.txt                   -
onnx/special_tokens_map.json      -
onnx/tokenizer.json               -
onnx/tokenizer_config.json        -
onnx/vocab.json                   -
pytorch_model.bin                 548.1M
rust_model.ot                     702.5M
tf_model.h5                       497.9M
tokenizer.json                    -
tokenizer_config.json             -
vocab.json                        -

以及使用文件过滤:

>>> hf download openai-community/gpt2 --include "*.json"  --dry-run
[dry-run] Fetching 11 files: 100%|█████████████| 11/11 [00:00<00:00, 80518.92it/s]
[dry-run] Will download 0 files (out of 11) totalling 0.0.
File                         Bytes to download
---------------------------- -----------------
config.json                  -
generation_config.json       -
onnx/config.json             -
onnx/generation_config.json  -
onnx/special_tokens_map.json -
onnx/tokenizer.json          -
onnx/tokenizer_config.json   -
onnx/vocab.json              -
tokenizer.json               -
tokenizer_config.json        -
vocab.json                   -

最后,你还可以通过向 hf_hub_download() 和 snapshot_download() 传递 dry_run=True 来以编程方式执行试运行。它将返回一个 DryRunFileInfo(或一个 DryRunFileInfo 列表),其中包含每个文件的提交哈希值、文件名和文件大小,以及该文件是否已缓存、是否会被下载。实际上,如果文件未缓存或传递了 force_download=True,该文件将会被下载。

更快的下载速度

借助 hf_xet 实现更快的下载速度,它是 xet-core 库的 Python 绑定,支持基于块的重复数据删除,从而加速下载和上传。hf_xet 可与 huggingface_hub 无缝集成,但它使用的是 Rust xet-core 库和 Xet 存储,而非 LFS。

hf_xet 使用 Xet 存储系统,该系统将文件拆分为不可变的块,并将这些块的集合(称为 block 或 xorb)存储在远程,在请求时检索它们以重新组装文件。下载时,在确认用户有权访问文件后,hf_xet 会使用此文件的 LFS SHA256 哈希值查询 Xet 内容寻址服务(CAS),以获取重建元数据(xorb 内的范围)来组装这些文件,以及用于直接下载 xorb 的预签名 URL。然后 hf_xet 会高效地下载所需的 xorb 范围,并将文件写入磁盘。

要启用此功能,只需安装最新版本的 huggingface_hub:

pip install -U "huggingface_hub"

从 huggingface_hub 0.32.0 版本开始,此操作还将安装 hf_xet。

所有其他 huggingface_hub API 将继续正常工作,无需任何修改。要了解 Xet 存储和 hf_xet 的优势,请参阅此 部分。

注意:hf_transfer 此前用于 LFS 存储后端,现已弃用;请改用 hf_xet。

Update on GitHub