Hub documentation

Docker Spaces

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Docker Spaces

Spacesは、StreamlitやGradioの範囲外のアプリ向けのカスタムDockerコンテナをサポートしています。Docker Spacesにより、ユーザーは従来の標準SDKでは実現できなかった制約を超えて開発を進めることができます。FastAPIやGoのエンドポイント、Phoenixアプリ、ML Opsツールなど、Docker Spacesはさまざまな構成で活用できます。

Docker Spaces のセットアップ

新しい Space を作成する際に SDK としてDockerを選択すると、README.mdファイルの YAML ブロック内のsdkプロパティがdockerに設定され、Space が初期化されます。既存の Space リポジトリがある場合は、Spaces のREADME.mdファイルの先頭にあるYAMLブロック内にsdk: dockerを設定してください。また、app_port: 7860を設定することで、デフォルトで公開されるポート7860を変更できます。その後、通常どおりDockerfileを作成してください。

---
title: Basic Docker SDK Space
emoji: 🐳
colorFrom: purple
colorTo: gray
sdk: docker
app_port: 7860
---

内部では、任意の数のポートを開くことができます。例えば、Space内にElasticsearchをインストールし、デフォルトのポート9200で内部的に呼び出すことができます。

複数のポートで提供されているアプリを外部に公開したい場合、Nginx などのリバースプロキシを使用して、より広いインターネットからのリクエスト(単一のポート)を異なる内部ポートにルーティングするワークアラウンドがあります。

シークレットと変数の管理

Space の環境変数は、Space の設定から管理できます。詳細はこちらをご覧ください。

変数

ビルド時

変数は、Docker Space をビルドする際に build-arg として渡されます。Dockerfile でこれを使用する方法に関する完全なガイドについては、Docker の専用ドキュメントを参照してください。

	# Declare your environment variables with the ARG directive
	ARG MODEL_REPO_NAME

	FROM python:latest
	# [...]
	# You can use them like environment variables
	RUN predict.py $MODEL_REPO_NAME

ランタイム

変数は、実行時にコンテナの環境に注入されます。

シークレット

ビルド時

Docker Spacesでは、セキュリティ上の理由により、シークレットの管理方法が異なります。Settingsタブでシークレットを作成した後、Dockerfileに以下の行を追加することで、シークレットを公開できます。

例えば、SECRET_EXAMPLE が Settings タブで作成したシークレットの名前である場合、ファイルをマウントしてビルド時に読み込むことで、$(cat /run/secrets/SECRET_EXAMPLE) を使用して読み取ることができます。

以下に例を示します:

# Expose the secret SECRET_EXAMPLE at buildtime and use its value as git remote URL
RUN --mount=type=secret,id=SECRET_EXAMPLE,mode=0444,required=true \
 git init && \
 git remote add origin $(cat /run/secrets/SECRET_EXAMPLE)
# Expose the secret SECRET_EXAMPLE at buildtime and use its value as a Bearer token for a curl request
RUN --mount=type=secret,id=SECRET_EXAMPLE,mode=0444,required=true \
	curl test -H 'Authorization: Bearer $(cat /run/secrets/SECRET_EXAMPLE)'

ランタイム

パブリックな Variables と同様に、実行時にシークレットを環境変数としてアクセスできます。例えば、Python では os.environ.get("SECRET_EXAMPLE") を使用します。シークレットを使用する Docker Space の 例 をご覧ください。

権限

コンテナはユーザー ID 1000 で実行されます。権限の問題を避けるために、COPY やダウンロードを行う前に、ユーザーを作成し、その WORKDIR を設定してください。

# Set up a new user named "user" with user ID 1000
RUN useradd -m -u 1000 user

# Switch to the "user" user
USER user

# Set home to the user's home directory
ENV HOME=/home/user \
	PATH=/home/user/.local/bin:$PATH

# Set the working directory to the user's home directory
WORKDIR $HOME/app

# Try and run pip command after setting the user with `USER user` to avoid permission issues with Python
RUN pip install --no-cache-dir --upgrade pip

# Copy the current directory contents into the container at $HOME/app setting the owner to the user
COPY --chown=user . $HOME/app

# Download a checkpoint
RUN mkdir content
ADD --chown=user https://<SOME_ASSET_URL> content/<SOME_ASSET_NAME>
Always specify the `--chown=user` with `ADD` and `COPY` to ensure the new files are owned by your user.

まだ権限の問題が発生している場合は、Dockerfile で chmod または chown を使用して、適切な権限を付与する必要がある場合があります。例えば、/data ディレクトリを使用したい場合は、次のようにできます。

RUN mkdir -p /data
RUN chmod 777 /data

不要なchownは常に避けるべきです。

ファイルのメタデータを更新すると、新しいレイヤーに新しいコピーが保存されます。そのため、再帰的なchownを実行すると、影響を受けるすべてのファイルが重複するため、非常に大きなイメージになる可能性があります。

chownを実行して権限を修正するのではなく:

COPY checkpoint .
RUN chown -R user checkpoint

常に以下を実行してください:

COPY --chown=user checkpoint .

(ADDコマンドも同様です)

データの永続化

Docker Spaceが再起動するたびに、ディスクに書き込まれたデータは失われます。再起動をまたいでデータを永続化するには、SpaceにStorage Bucketをアタッチできます。

現在、/data ボリュームは実行時のみ利用可能であり、Dockerfile のビルドステップでは /data を使用できません。

特定のケースでは、git LFS リポジトリに状態とデータを保存できる私たちの Datasets Hub も利用できます。永続化の例はこちらにあります。これはhuggingface_hubライブラリを使用して、ファイルをデータセットリポジトリにプログラムでアップロードする方法を示しています。この Space の例とこのガイドを参考にすることで、データの種類に最適なソリューションを決定できます。

最後に、Space のコードから外部ストレージソリューション(外部ホストの DB、S3 など)を使用したい場合があります。

GPU対応のDockerコンテナ

GPU対応のDockerコンテナは、GPU対応のSpaces Hardwareのいずれかを使用することで実行できます。

Docker Hub の nvidia/cuda をベースイメージとして使用することをお勧めします。このイメージには、CUDA と cuDNN がプリインストールされています。

During Docker buildtime, you don't have access to a GPU hardware. Therefore, you should not try to run any GPU-related command during the build step of your Dockerfile. For example, you can't run `nvidia-smi` or `torch.cuda.is_available()` building an image. Read more [here](https://github.com/NVIDIA/nvidia-docker/wiki/nvidia-docker#description).

続きを読む

Update on GitHub