🤗

🤗Hugging Face から巨大ファイルを安定的にダウンロードする方法

に公開

How to reliably download huge files from Hugging Face.

1. 概要

Hugging Face から巨大ファイルを安定的にダウンロードする方法についてです。

Web ブラウザ経由で 10 GB 以上の動画生成モデルなどの巨大ファイルをダウンロードする際、
途中で失敗して 1 からダウンロードし直しになったり、それを繰り返すような場合に有効な方法です。
Web ブラウザ以外にも curl や wget でも同様です。

2. 巨大ファイルを安定的にダウンロードする方法

Git を使います。
Git でも失敗はしますが、1 からダウンロードを何度も繰り返すことなく、確実性が高く安定的にダウンロードできます。
内部処理的には、Git LFS で管理されているファイルは、ダウンロードが中断したところから再開されます。

※以降は git version 2.43.0.windows.1 で確認した内容です

2.1. リポジトリ丸ごとダウンロードする場合

git clone <Hugging Face の Model card の URL>

リポジトリ丸ごとgit cloneします。

git reset
git restore --source=HEAD :/

もし途中で通信エラーになった場合、Staging されているものがあればgit resetで戻し、git restoreで HEAD コミットの状態にします。

ちなみに、リポジトリごと持って来ているので、もしリモートでファイルの追加や更新があった場合、
git pullで漏れなく差分を持って来れるメリットもあります。

2.2. ファイル単位でダウンロードする場合

git clone --filter=tree:0 --no-tags --no-checkout --depth=1 --single-branch --branch=<branch> <Model card の URL> [ローカルディレクトリ]
cd <ローカルディレクトリ>
git sparse-checkout init --no-cone

特定ファイルの最新バージョン以外のデータは極力取得しないように絞った設定です。

git cloneで [ローカルディレクトリ] を指定しない場合は、リポジトリと同じ名前のディレクトリになる

git sparse-checkout set <ファイルパス>
git checkout

そしてgit sparse-checkout setでダウンロードしたいファイルを指定します。

--no-checkoutの指定によりgit clone時点ではファイルをダウンロードせず、git checkoutの時点で実際にダウンロードされます。

git sparse-checkout add <ファイルやディレクトリのパス>

更に別のファイルも追加した場合は、git sparse-checkout addで追加することもできます。

ファイルだけでなくディレクトリ単位でも指定できます。
ワイルドカードなど.gitignoreと同じ指定の仕方ができます。

既にgit checkoutしているので、addした時点でダウンロードが始まります。

setではなくaddなので気を付けてください。
setをやった場合は他のファイルが消えますが、データ自体はローカルのリポジトリにあるので、再度addすれば大丈夫です。

3. 具体例

このリポジトリを例にします。

3.1. リポジトリ丸ごとダウンロードする例

git clone https://huggingface.co/Kijai/WanVideo_comfy

Hugging Face のページの "Files and versions" ではなく "Model card" の URL です。

3.2. ファイル単位でダウンロードする例

以下は先ずREADME.mdをダウンロードして、その後に追加でモデルファイルをダウンロードする例です。

$ git clone --filter=tree:0 --no-tags --no-checkout --depth=1 --single-branch --branch=main https://huggingface.co/Kijai/WanVideo_comfy tmp
$ cd tmp
$ git sparse-checkout init --no-cone
$ git sparse-checkout set README.md
$ git sparse-checkout list
README.md

$ git checkout
remote: Enumerating objects: 2, done.
remote: Counting objects: 100% (2/2), done.
~略~
$ git sparse-checkout add Skyreels/Wan2_1-SkyReels-V2-DF-1_3B-540P_fp32.safetensors
~略~

モデルファイルのパスは、以下のページのファイル名の横のコピーボタンから取れるものと同じです。

なお、ある程度 Hugging Face を利用するのであれば、Python 環境は必要ですが、
専用のコマンドラインツール huggingface-cli を使う方が良いかもしれません。

4. まとめ

Hugging Face から巨大ファイルを安定的にダウンロードする方法についてでした。

Web ブラウザ経由などでダウンロードが途中で失敗し、何度もダウンロードを繰り返すような場合は、
Git を使ったダウンロードは有効な方法となります。

参考

Discussion