問題の概要:Docker環境でのHugging Faceモデルダウンロード失敗と管理の課題
Dockerコンテナ内でHugging Face Hubからモデルやデータセットをダウンロード・管理しようとすると、初心者から中級者のAI開発者によく見られる以下のような問題が発生します。
よくあるエラーと課題
1. 認証エラー: DockerコンテナがHugging Faceへの認証に失敗し、プライベートモデルやgatedモデル(承認が必要なモデル)がダウンロードできない。
ERROR: 401 Client Error: Unauthorized for url: https://huggingface.co/api/models/username/private-model
Repository Not Found for url: https://huggingface.co/username/private-model
2. キャッシュパスの問題: Dockerコンテナの一時的な性質により、ダウンロードしたモデルがコンテナ削除とともに失われる。
OSError: Unable to load weights from pytorch_model.bin at /root/.cache/huggingface/hub/...
3. ディスク容量不足: 大規模モデルをダウンロードする際に、Dockerコンテナのデフォルトストレージ制限を超えてしまう。
OSError: [Errno 28] No space left on device
4. ネットワーク接続の問題: 企業環境のプロキシ設定やDockerネットワークの制限により、Hugging Face Hubへの接続ができない。
原因の解説:なぜDocker環境で問題が起こるのか
1. 認証情報の隔離
Dockerコンテナはホストマシンから隔離された環境です。ホストマシンでhuggingface-cli loginを実行して設定した認証トークンは、デフォルトではコンテナ内からアクセスできません。認証情報は通常~/.huggingface/tokenに保存されますが、このファイルはコンテナのファイルシステムには存在しません。
2. キャッシュの揮発性
Hugging Face Hubはダウンロードしたモデルを~/.cache/huggingface/hubにキャッシュします。しかし、Dockerコンテナが停止・削除されると、このキャッシュも一緒に消えてしまいます。これにより、同じモデルを繰り返しダウンロードする非効率や、オフライン環境での作業が困難になります。
3. ストレージ制限
Dockerコンテナにはデフォルトでストレージ制限(通常10GB)が設けられています。大規模言語モデル(LLM)や拡散モデルは数GBから数十GBに及ぶため、簡単にこの制限を超えてしまいます。
4. ネットワーク設定の継承
企業環境ではプロキシ設定が必要な場合がありますが、Dockerコンテナはホストのネットワーク設定を自動的に継承しません。また、Dockerのネットワークモード(bridge, hostなど)によっても外部接続の挙動が変わります。
解決方法:ステップバイステップでの実装
ステップ1:認証トークンの安全な受け渡し
DockerコンテナにHugging Faceの認証トークンを安全に渡す方法は複数あります。
方法A:環境変数を使用(推奨)
# Dockerfile
FROM python:3.9-slim
RUN pip install huggingface-hub
# 環境変数としてトークンを渡す(ビルド時ではなく実行時)
ENV HF_HOME=/hf-cache
# コンテナ実行コマンド例
# docker run -e HF_TOKEN=hf_xxxxxxxxxxxxxxxx your-image
方法B:Docker Secretsを使用(より安全)
# docker-compose.yml
version: '3.8'
services:
ai-app:
build: .
secrets:
- hf_token
environment:
- HF_TOKEN_FILE=/run/secrets/hf_token
secrets:
hf_token:
file: ./hf_token.txt
ステップ2:永続的なキャッシュの設定
Dockerボリュームを使用してキャッシュを永続化します。
# Dockerfile
FROM python:3.9-slim
RUN pip install huggingface-hub transformers
# キャッシュ用ディレクトリを作成
RUN mkdir -p /hf-cache
ENV HF_HOME=/hf-cache
ENV TRANSFORMERS_CACHE=/hf-cache
ENV HUGGINGFACE_HUB_CACHE=/hf-cache
# ボリュームのマウントポイントとして明示
VOLUME /hf-cache
実行時のボリュームマウント:
# 単一コンテナの場合
docker run -v $(pwd)/hf-cache:/hf-cache -e HF_TOKEN=your_token your-image
# docker-composeの場合
version: '3.8'
services:
ai-app:
build: .
volumes:
- ./hf-cache:/hf-cache
environment:
- HF_TOKEN=${HF_TOKEN}
ステップ3:モデルの事前ダウンロードと管理
Dockerビルド時に必要なモデルを事前にダウンロードする方法です。
# Dockerfile
FROM python:3.9-slim
RUN pip install huggingface-hub
# 認証トークンをビルド時に渡す(注意:トークンがイメージに残る)
ARG HF_TOKEN
ENV HF_TOKEN=${HF_TOKEN}
# モデルを事前ダウンロード
RUN python -c "
from huggingface_hub import snapshot_download
snapshot_download(
repo_id='google/flan-t5-base',
cache_dir='/models',
token='${HF_TOKEN}' if '${HF_TOKEN}' else None
)"
# またはコマンドラインから
# RUN huggingface-cli download google/flan-t5-base --cache-dir /models
安全な代替案:マルチステージビルド
# ステージ1:モデルダウンロード(トークン使用)
FROM python:3.9-slim as downloader
ARG HF_TOKEN
RUN pip install huggingface-hub
RUN mkdir /models
RUN HF_TOKEN=${HF_TOKEN} huggingface-cli download google/flan-t5-base --cache-dir /models
# ステージ2:メインイメージ(トークンなし)
FROM python:3.9-slim
COPY --from=downloader /models /models
ENV TRANSFORMERS_CACHE=/models
# アプリケーションコードのコピーと依存関係のインストール
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
ステップ4:よくあるエラーのトラブルシューティング
エラー1:認証失敗
# コンテナ内でトークンを確認
docker exec -it container_name bash
echo $HF_TOKEN
# トークンを再設定
docker run -e HF_TOKEN=$(cat ~/.huggingface/token) your-image
エラー2:ディスク容量不足
# Dockerデーモンのストレージ設定変更(daemon.json)
{
"storage-driver": "overlay2",
"storage-opts": [
"size=50G"
]
}
# または実行時にストレージ制限を指定
docker run --storage-opt size=50G -v $(pwd)/hf-cache:/hf-cache your-image
エラー3:プロキシ環境での接続問題
# Dockerfileにプロキシ設定を追加
ENV http_proxy=http://your-proxy:port
ENV https_proxy=http://your-proxy:port
ENV no_proxy=localhost,127.0.0.1
# またはdocker runで設定
docker run -e http_proxy=http://proxy:port -e https_proxy=http://proxy:port your-image
コード例・コマンド例:実践的な使用パターン
完全なDockerfile例
FROM python:3.9-slim
# システム依存関係のインストール
RUN apt-get update && apt-get install -y
git
curl
&& rm -rf /var/lib/apt/lists/*
# キャッシュディレクトリの作成
RUN mkdir -p /hf-cache /models
# 環境変数の設定
ENV HF_HOME=/hf-cache
ENV TRANSFORMERS_CACHE=/hf-cache
ENV HUGGINGFACE_HUB_CACHE=/hf-cache
ENV HF_DATASETS_CACHE=/hf-cache
# Pythonパッケージのインストール
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# アプリケーションコードのコピー
COPY . /app
WORKDIR /app
# ヘルスチェック(オプション)
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3
CMD python -c "from huggingface_hub import whoami; whoami()" || exit 1
CMD ["python", "app.py"]
docker-compose.ymlの完全例
version: '3.8'
services:
ai-service:
build: .
container_name: huggingface-app
volumes:
# 永続キャッシュ
- ./hf-cache:/hf-cache
# 事前ダウンロードしたモデル
- ./pre-downloaded-models:/models
# アプリケーションログ
- ./logs:/app/logs
environment:
- HF_TOKEN=${HF_TOKEN}
- MODEL_PATH=/models/llama-2-7b
- LOG_LEVEL=INFO
# プロキシ環境用
# - http_proxy=${HTTP_PROXY}
# - https_proxy=${HTTPS_PROXY}
networks:
- ai-network
deploy:
resources:
limits:
memory: 8G
reservations:
memory: 4G
networks:
ai-network:
driver: bridge
volumes:
hf-cache:
driver: local
Pythonコードでの使用例
import os
from huggingface_hub import login, snapshot_download
from transformers import AutoModel, AutoTokenizer
# 環境変数からトークンを取得
token = os.getenv('HF_TOKEN')
if token:
login(token=token)
# キャッシュディレクトリの設定
cache_dir = os.getenv('HF_HOME', '/hf-cache')
# モデルのダウンロード(キャッシュを活用)
model_name = "google/flan-t5-base"
model_path = snapshot_download(
repo_id=model_name,
cache_dir=cache_dir,
token=token if token else None
)
# モデルのロード
model = AutoModel.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)
print(f"Model loaded from: {model_path}")
まとめ・補足情報
ベストプラクティスまとめ
1. セキュリティ: 認証トークンは環境変数やDocker Secretsで管理し、Dockerイメージにハードコードしないでください。
2. パフォーマンス: 永続ボリュームを使用してキャッシュを共有し、モデルの重複ダウンロードを避けます。
3. ストレージ管理: 大規模モデルを使用する場合は、Dockerのストレージドライバー設定を見直し、十分な容量を確保します。
4. オフライン対応: 本番環境ではモデルを事前にダウンロードし、インターネット接続に依存しない設計を目指します。
5. バージョン管理: モデルの特定のリビジョン(コミットハッシュ)を指定して、再現性を確保します。
高度な設定
モデルのストリーミング読み込み: 非常に大きなモデルを扱う場合、transformersライブラリのlow_cpu_mem_usage=Trueオプションや、accelerateライブラリを活用することで、メモリ使用量を削減できます。
キャッシュのクリーンアップ: 定期的に未使用のモデルをキャッシュから削除するスクリプトを実装しましょう。
# キャッシュクリーンアップスクリプト例
from huggingface_hub import scan_cache_dir
cache_info = scan_cache_dir()
print(f"Cache size: {cache_info.size_on_disk}")
# 特定の条件で削除
for repo in cache_info.repos:
if repo.size_on_disk > 5_000_000_000: # 5GB以上
print(f"Removing {repo.repo_id} ({repo.size_on_disk} bytes)")
repo.delete()
Docker環境でのHugging Face Hub CLIの効果的な使用は、適切な認証管理、永続ストレージの活用、そして環境に合わせたネットワーク設定が鍵となります。これらのベストプラクティスを実践することで、開発から本番環境まで一貫した、再現性の高いAIモデル管理が可能になります。