Skip to content

Snapshot download

huggingface_hub.snapshot_download は、Hugging Face Hub からリポジトリ全体または一部をローカルにダウンロードするための非常に便利な関数です。特にモデルとトークナイザーを効率的に取得する場合に役立ちます。

以下に主要な引数と、今回のプロジェクトでモデルとトークナイザーをダウンロードする際に役立つ引数を説明します。

snapshot_download の主要な引数

  1. repo_id (必須)

    • ダウンロードしたいリポジトリのIDです。例えば、"tsmatz/xlm-roberta-ner-japanese" のように指定します。
  2. revision (オプション)

    • ダウンロードする特定のブランチ、タグ、またはコミットハッシュを指定します。デフォルトは "main" です。

    • 例: revision="v1.0.0", revision="a1b2c3d4e5f6"

  3. cache_dir (オプション)

    • Hugging Face キャッシュが保存されるルートディレクトリを指定します。デフォルトは環境変数 HF_HOME (通常 ~/.cache/huggingface/) で指定された場所です。
  4. local_dir (オプション)

    • ダウンロードしたファイルをコピーしたいローカルディレクトリのパスを指定します。指定しない場合、ファイルはキャッシュディレクトリにのみ存在し、シンボリックリンクは作成されません。

    • この引数を指定すると、キャッシュディレクトリから指定された local_dir にファイルがコピーされます。

  5. local_dir_use_symlinks (オプション)

    • local_dir が指定されている場合、キャッシュディレクトリから local_dir へのファイルの扱われ方を定義します。

      • True (デフォルト): キャッシュディレクトリへのシンボリックリンクを作成します。これにより、ディスクスペースを節約できますが、オリジナルファイルはキャッシュに残ります。

      • False: ファイルを local_dir に物理的にコピーします。

      • "auto": デフォルトの動作。可能であればシンボリックリンクを作成し、そうでない場合はコピーします。

  6. allow_patterns (オプション)

    • ダウンロードを許可するファイル名またはパスのパターン(ワイルドカード * を含む)のリストです。

    • この引数を使用すると、リポジトリ内の特定のファイルのみをダウンロードできます。

    • 例: allow_patterns=[".json", ".safetensors"]

  7. ignore_patterns (オプション)

    • ダウンロードから除外するファイル名またはパスのパターン(ワイルドカード * を含む)のリストです。

    • allow_patterns と組み合わせて使用することで、より細かい制御が可能です。

    • 例: ignore_patterns=[".msgpack", ".bin"]

  8. token (オプション)

    • プライベートリポジトリからのダウンロードや、レートリミットを回避するために認証トークンを指定します。

    • Hugging Face Hubにログイン済みであれば、デフォルトで ~/.cache/huggingface/token に保存されたトークンが使用されます。

モデルとトークナイザーをダウンロードする際の考慮事項

tsmatz/xlm-roberta-ner-japanese のようなTransformersモデルの場合、通常以下のファイルが必要です。

  • モデルファイル: model.safetensors (推奨), pytorch_model.bin など

  • トークナイザーファイル: tokenizer.json (Fast Tokenizerの場合), sentencepiece.bpe.model (SentencePieceの場合), tokenizer_config.json, special_tokens_map.json など

  • 設定ファイル: config.json

プロジェクトの models/ner_model.py で snapshot_download を利用する場合、以下のように allow_patterns を使うことで、必要なファイルのみを効率的にダウンロードできます。

使用例 (プロジェクトの ner_model.py での想定)

from huggingface_hub import snapshot_download
import os

def download_ner_model_files(repo_id: str, local_path: str):
    """
    指定されたNERモデルのファイル群をダウンロードします。
    必要なファイルのみを選択的にダウンロードするように設定しています。
    """
    # local_path が存在しない場合は作成
    os.makedirs(local_path, exist_ok=True)

    # TokenizerとModelに必要なファイルをallow_patternsで指定
    # `tsmatz/xlm-roberta-ner-japanese` の場合、SentencePieceベースのトークナイザーと
    # safetensors形式のモデルが使われているため、それに合わせてパターンを設定
    allow_list = [
        "config.json",                 # モデルの設定
        "tokenizer.json",              # Fast Tokenizer 用 (もしあれば)
        "sentencepiece.bpe.model",     # SentencePiece モデルファイル
        "tokenizer_config.json",       # トークナイザー設定
        "special_tokens_map.json",     # 特殊トークンマップ
        "model.safetensors",           # モデルの重み (Safetensors形式)
        # "pytorch_model.bin",         # もしsafetensorsがない場合やPytorch形式が必要な場合
        "added_tokens.json",           # 追加トークンがあれば
    ]

    downloaded_path = snapshot_download(
        repo_id=repo_id,
        revision="main",                  # 特定のrevisionがあれば指定
        local_dir=local_path,
        local_dir_use_symlinks=False,     # ファイルを物理的にコピーする
        allow_patterns=allow_list,
        # ignore_patterns=["*.bin", "*.msgpack"], # 不要なファイルを明示的に無視することも可能
    )
    return downloaded_path

# 例: モデルをダウンロードする
# repo_id = "tsmatz/xlm-roberta-ner-japanese"
# output_dir = "./downloaded_model"
# downloaded_dir = download_ner_model_files(repo_id, output_dir)
# print(f"モデルファイルは {downloaded_dir} にダウンロードされました。")

つまづきポイント

  • allow_patterns と ignore_patterns の競合: 両方を指定した場合、allow_patterns で指定されたものの中から ignore_patterns で除外される、という挙動になります。基本的にはどちらか一方を使う方が意図が明確になります。

  • ファイル名の大文字小文字: Linux 環境ではファイル名は大文字小文字を区別します。Hugging Face Hub上のファイル名を正確に確認してください。

  • local_dir と local_dir_use_symlinks: local_dir を指定しない場合、ファイルはキャッシュディレクトリにのみ存在し、後続の AutoModel.from_pretrained() などではキャッシュパスを直接参照する必要があります。local_dir を指定して local_dir_use_symlinks=False とすると、指定したディレクトリに物理的にファイルがコピーされるため、キャッシュを意識せずに済みます。