Hub Python Library documentation

スペースの管理

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

スペースの管理

このガイドでは、huggingface_hub を使用して Space のランタイム(シークレット、ハードウェア、およびボリューム)を管理する方法について説明します。

Spacesを検索

search_spaces() を使用して、Hub 上でセマンティック検索により Spaces を検索できます。この機能は、複数語のクエリに対して埋め込みベースの検索を、単一語のクエリに対して全文検索を使用します。

>>> from huggingface_hub import search_spaces
>>> results = list(search_spaces("generate image"))
>>> results[0]
SpaceSearchResult(id='mrfakename/Z-Image-Turbo', title='Z Image Turbo', sdk='gradio', likes=2867, ...)

SDKまたはタグで結果をフィルタリングできます:

>>> results = search_spaces("chatbot", sdk="gradio", filter="mcp-server")

または、CLI経由で:

>>> hf spaces search "generate image"
>>> hf spaces search "chatbot" --sdk gradio --limit 5

簡単な例: シークレットとハードウェアを設定します。

Hub上でSpaceを作成・設定するためのエンドツーエンドの例を以下に示します。

HubにSpaceを作成する

>>> from huggingface_hub import HfApi
>>> repo_id = "Wauplin/my-cool-training-space"
>>> api = HfApi()

# For example with a Gradio SDK
>>> api.create_repo(repo_id=repo_id, repo_type="space", space_sdk="gradio")

Static Spacesはすべてのユーザーに無料です。GradioおよびDocker Spacesは計算リソース上で実行されます。無料のcpu-basicハードウェアでは、サブスクリプション(ユーザーはPRO、組織はTeamまたはEnterprise)が必要です。一方、有料ハードウェアでは請求設定(支払い方法と事前購入クレジット)のみで利用できます。サブスクリプションなしでcpu-basic上にGradioまたはDocker Spaceを作成、複製、移動すると、支払いエラー(HTTP 402)が発生します。詳細は料金を参照してください。

テンプレートからSpaceを作成する

空のSpaceから始める代わりに、Hubで提供されている公式テンプレート(JupyterLab、Gradioチャットボット、Streamlitアプリなど)から新しいSpaceを初期化できます。利用可能なテンプレートのリストはlist_space_templates()で取得し、テンプレートのrepo_id(または短縮名name)をspace_templateとしてcreate_repo()に渡します。なお、space_sdkも引き続き必要です。テンプレートはファイルを初期化し、SDKがカードのメタデータを設定します。

>>> from huggingface_hub import HfApi
>>> api = HfApi()

# List available templates
>>> for template in api.list_space_templates():
...     print(f"{template.name} ({template.repo_id})")
Streamlit (streamlit/streamlit-template-space)
JupyterLab (SpacesExamples/jupyterlab)
chatbot (gradio-templates/chatbot)
...

# Create a Space from a template, by repo id or by short name
>>> api.create_repo(repo_id=repo_id, repo_type="space", space_template="SpacesExamples/jupyterlab")
>>> api.create_repo(repo_id=repo_id, repo_type="space", space_template="JupyterLab")

一部のテンプレートは非公開にすることを推奨しています(例: JupyterLab)。明示的に可視性を設定しない場合、そのような Spaces は自動的に非公開として作成されます。

CLIから、hf spaces templatesおよびhf repos create --templateを通じて同じものが利用できます:

# List available templates
>>> hf spaces templates
NAME            REPO_ID                                        SDK    PREFERRED_PRIVATE
--------------- ---------------------------------------------- ------ -----------------
Streamlit       streamlit/streamlit-template-space             docker
JupyterLab      SpacesExamples/jupyterlab                      docker ✔
Argilla         argilla/argilla-template-space                 docker
Livebook        livebook-dev/livebook                          docker
...

# Create a Space from a template
>>> hf repos create my-jupyterlab --type space --template jupyterlab

スペースの複製

既存のSpaceをベースに構築したい場合や、ゼロから始めるのではなく既存のものを活用したい場合に、この機能は有用です。 また、パブリックなSpaceの設定や設定値を制御したい場合にも便利です。詳細については、duplicate_repo()を参照してください。

>>> api.duplicate_repo("multimodalart/dreambooth-training", repo_type="space")

お好みの方法でコードをアップロードします

ローカルフォルダsrc/をマシンからSpaceにアップロードする例を以下に示します。

>>> api.upload_folder(repo_id=repo_id, repo_type="space", folder_path="src/")

この段階で、アプリはすでにHub上で実行されているはずです。ただし、シークレットやアップグレードされたハードウェアでさらに設定を調整したい場合があります。

シークレットと変数を設定する

Space の動作には、秘密鍵、トークン、または変数が必要になる場合があります。 詳細は ドキュメント を参照してください。 例えば、Space から生成された画像データセットを Hub にアップロードするための HF トークンなどです。

>>> api.add_space_secret(repo_id=repo_id, key="HF_TOKEN", value="hf_api_***")
>>> api.add_space_variable(repo_id=repo_id, key="MODEL_REPO_ID", value="user/repo")

既存のシークレットと変数を一覧表示できます。シークレットの値は書き込み専用であるため、キー、説明、更新タイムスタンプのみが返されます。

>>> api.get_space_secrets(repo_id=repo_id)
{'HF_TOKEN': SpaceSecret(key='HF_TOKEN', description=None, updated_at=datetime.datetime(...))}
>>> api.get_space_variables(repo_id=repo_id)
{'MODEL_REPO_ID': SpaceVariable(key='MODEL_REPO_ID', value='user/repo', description=None, updated_at=...)}

シークレットと変数も削除できます:

>>> api.delete_space_secret(repo_id=repo_id, key="HF_TOKEN")
>>> api.delete_space_variable(repo_id=repo_id, key="MODEL_REPO_ID")

Space 内から、シークレットは環境変数として利用できます(Streamlit を使用している場合は Streamlit Secrets Management)。API を介して取得する必要はありません!

Space の設定(シークレットまたはハードウェア)に変更があると、アプリが再起動されます。

おまけ: Space を作成または複製する際にシークレットと変数を設定できます!

シークレットと変数は、スペースの作成または複製時に設定できます。

>>> api.create_repo(
...     repo_id=repo_id,
...     repo_type="space",
...     space_sdk="gradio",
...     space_secrets=[{"key": "HF_TOKEN", "value": "hf_api_***"}, ...],
...     space_variables=[{"key": "MODEL_REPO_ID", "value": "user/repo"}, ...],
... )
>>> api.duplicate_repo(
...     from_id=repo_id,
...     repo_type="space",
...     space_secrets=[{"key": "HF_TOKEN", "value": "hf_api_***"}, ...],
...     space_variables=[{"key": "MODEL_REPO_ID", "value": "user/repo"}, ...],
... )

ハードウェアを設定

デフォルトでは、Spaceは無料のcpu-basicハードウェアで実行されます(GradioおよびDockerのSpaceにはサブスクリプションが必要です。上記を参照)。GPUで実行するには、ハードウェアをアップグレードできます。Spaceのアップグレードには、決済方法と事前購入クレジット(またはコミュニティ助成金)が必要です。詳細はドキュメントを参照してください。

# Use `SpaceHardware` enum
>>> from huggingface_hub import SpaceHardware
>>> api.request_space_hardware(repo_id=repo_id, hardware=SpaceHardware.T4_MEDIUM)

# Or simply pass a string value
>>> api.request_space_hardware(repo_id=repo_id, hardware="t4-medium")

ハードウェアの更新は即時に行われるわけではなく、Spaceがサーバー上で再読み込みされる必要があります。 いつでもSpaceがどのハードウェアで実行されているかを確認することで、リクエストが反映されたかどうかをチェックできます。

>>> runtime = api.get_space_runtime(repo_id=repo_id)
>>> runtime.stage
"RUNNING_BUILDING"
>>> runtime.hardware
"cpu-basic"
>>> runtime.requested_hardware
"t4-medium"

これで完全に設定されたSpaceが用意できました。使用が完了したら、Spaceをcpu-basicにダウングレードしてください。

おまけ: Spaceの作成または複製時にハードウェアをリクエストできます!

アップグレードされたハードウェアは、Spaceのビルドが完了すると自動的に割り当てられます。

>>> api.create_repo(
...     repo_id=repo_id,
...     repo_type="space",
...     space_sdk="gradio",
...     space_hardware="cpu-upgrade",
...     space_sleep_time="7200", # 2 hours in secs
... )
>>> api.duplicate_repo(
...     from_id=repo_id,
...     repo_type="space",
...     space_hardware="cpu-upgrade",
...     space_sleep_time="7200", # 2 hours in secs
... )

ZeroGPUのクォータを追跡する

ZeroGPU Spaces は、オンデマンドで割り当てられる共有 GPU で実行されます。ZeroGPU Space を使用するたびに(UI からでも、その API を通しても)、個人クォータから GPU 時間が差し引かれます。このクォータは定期的にリセットされます。ZeroGPU Spaces を基盤としてアプリ、エージェント、または MCP サーバーを構築している場合、get_zero_gpu_quota() を使用して使用量をトラッキングできます。値は GPU 秒で表されます。

>>> quota = api.get_zero_gpu_quota()
>>> quota
ZeroGpuQuota(base=2400, remaining=1810, resets_at=datetime.datetime(2026, 9, 30, 9, 12, 3, tzinfo=datetime.timezone.utc), overquota_used=0)
>>> if quota.remaining < 60:
...     print(f"Less than 1 minute of ZeroGPU left. Quota resets at {quota.resets_at}.")

resets_at は、前回のリセット以降に ZeroGPU を使用していない場合は None です。ファイングレイントークンを使用する場合は、「Billing > Read billing usage and payment method status」権限が必要です。同じ情報は、CLI の hf spaces zero-gpu quota でも確認できます。

クォータを使い切った場合、PRO、Team、Enterpriseユーザーは、事前購入したクレジットを消費することで、ZeroGPU Spacesを継続して利用できます。クレジットは請求設定から購入できます。詳細については、クレジットによるクォータの拡張を参照してください。

Spaceの一時停止と再開

デフォルトでは、アップグレードされたハードウェアで実行されているSpaceは停止されません。ただし、請求を避けるために、使用していないときに一時停止することをお勧めします。これはpause_space()を使用することで可能です。一時停止されたSpaceは、Spaceの所有者がUIまたはrestart_space()を介したAPIで再起動するまで無効な状態が続きます。一時停止モードの詳細については、このセクションを参照してください。

# Pause your Space to avoid getting billed
>>> api.pause_space(repo_id=repo_id)
# (...)
# Restart it when you need it
>>> api.restart_space(repo_id=repo_id)

もう一つの選択肢は、Space にタイムアウトを設定することです。Space がタイムアウト期間を超えて非アクティブな状態が続くと、スリープモードに移行します。その後、Space にアクセスした訪問者がいると、自動的に再起動されます。set_space_sleep_time() を使用してタイムアウトを設定できます。スリープモードの詳細については、このセクションを参照してください。

# Put your Space to sleep after 1h of inactivity
>>> api.set_space_sleep_time(repo_id=repo_id, sleep_time=3600)

注: ‘cpu-basic’ ハードウェアを使用している場合、カスタムスリープ時間を設定することはできません。Space は48時間の非アクティブ状態後に自動的に一時停止されます。

おまけ: ハードウェアをリクエストする際にスリープ時間を設定する

アップグレードされたハードウェアは、Spaceのビルドが完了すると自動的に割り当てられます。

>>> api.request_space_hardware(repo_id=repo_id, hardware=SpaceHardware.T4_MEDIUM, sleep_time=3600)

おまけ: Space を作成または複製する際に、スリープ時間を設定できます!

>>> api.create_repo(
...     repo_id=repo_id,
...     repo_type="space",
...     space_sdk="gradio",
...     space_hardware="t4-medium",
...     space_sleep_time="3600",
... )
>>> api.duplicate_repo(
...     from_id=repo_id,
...     repo_type="space",
...     space_hardware="t4-medium",
...     space_sleep_time="3600",
... )

ログを読み取って、失敗したSpaceをデバッグする

Space のビルドが失敗したり、実行時にクラッシュしたりした場合、通常ブラウザで表示するログは、fetch_space_logs() を介してプログラム的にも取得できます。これは、ブラウザを開くことができないスクリプトやエージェント型ワークフローにおいて特に有用です。

# Drain the currently available run logs and return immediately (like `docker logs`)
>>> for line in api.fetch_space_logs(repo_id=repo_id):
...     print(line, end="")

# Read the container build logs instead (useful when the Space is stuck in BUILD_ERROR)
>>> for line in api.fetch_space_logs(repo_id=repo_id, build=True):
...     print(line, end="")

# Stream run logs in real time until the server closes the stream (Ctrl-C to stop)
>>> for line in api.fetch_space_logs(repo_id=repo_id, follow=True):
...     print(line, end="")

同じ機能がCLIから利用できます:

hf spaces logs username/my-space             # drain run logs
hf spaces logs username/my-space --build     # read build logs
hf spaces logs username/my-space -f          # stream in real time
hf spaces logs username/my-space -n 50       # last 50 lines only

SpaceへのSSH接続(開発モード)

Dev Modeを使用すると、実行中のSpaceコンテナにSSH接続して、ライブでのデバッグや開発を行うことができます。hf spaces sshを使用すると、ターミナルから直接セッションを開くことができます。SpaceでDev Modeがまだ有効になっていない場合、CLIが有効化を促すプロンプトを表示します(--autoを渡すとプロンプトをスキップできます)。

SSH公開鍵は、設定に登録されている必要があります。

# SSH into a Space (enables Dev Mode if needed)
hf spaces ssh username/my-space

# Auto-enable Dev Mode without prompting
hf spaces ssh username/my-space --auto

# Print the SSH command without running it
hf spaces ssh username/my-space --dry-run

# Use a specific SSH key
hf spaces ssh username/my-space -i ~/.ssh/id_ed25519

SSHなしでhf spaces dev-modeを使用することで、Dev Modeを有効にすることもできます。このコマンドは、SSH、VS Code、Cursor、Windsurfの接続手順を表示します。

hf spaces dev-mode username/my-space

Dev Modeを有効にするには、PROまたはTeam & Enterpriseプランが必要です。Dev Modeが有効な状態でサブスクリプションの有効期限が切れた場合など、無効化は常に許可されています:

hf spaces dev-mode username/my-space --stop

Spaceにボリュームのマウント

Hubのリソース(モデル、データセット、またはストレージバケット)を、Spaceのコンテナにボリュームとしてマウントできます。これにより、コード内でダウンロードすることなく、Spaceからこれらのリソースに直接ファイルシステムとしてアクセスできます。Spaceの作成または複製時に、ボリュームを直接設定できます:

>>> from huggingface_hub import Volume
>>> api.create_repo(
...     repo_id=repo_id,
...     repo_type="space",
...     space_sdk="gradio",
...     space_volumes=[
...         Volume(type="model", source="username/my-model", mount_path="/models", read_only=True),
...         Volume(type="bucket", source="username/my-bucket", mount_path="/data"),
...     ],
... )
>>> api.duplicate_repo(
...     from_id=repo_id,
...     repo_type="space",
...     space_volumes=[
...         Volume(type="model", source="username/my-model", mount_path="/models", read_only=True),
...         Volume(type="bucket", source="username/my-bucket", mount_path="/data"),
...     ],
... )

Spaceランタイムを介して、現在マウントされているボリュームを確認できます:

>>> runtime = api.get_space_runtime(repo_id=repo_id)
>>> runtime.volumes
[Volume(type='model', source='username/my-model', mount_path='/models', read_only=True), ...]

既存のSpaceのボリュームを更新する必要がある場合は、set_space_volumes()を使用してください。なお、この関数は以前にマウントされたすべてのボリュームを置き換えます。

>>> api.set_space_volumes(
...     repo_id=repo_id,
...     volumes=[
...         Volume(type="model", source="username/my-model", mount_path="/models", read_only=True),
...         Volume(type="dataset", source="username/my-dataset", mount_path="/data", read_only=True),
...         Volume(type="bucket", source="username/my-bucket", mount_path="/output"),
...     ],
... )

Spaceからすべてのボリュームを削除するには:

>>> api.delete_space_volumes(repo_id=repo_id)

モデル、データセット、Spaces は常に読み取り専用としてマウントされます。読み書き可能なマウントをサポートするのはストレージバケットのみです。

ボリュームの設定は、以前にマウントされたすべてのボリュームを置き換えます。既存のリストにボリュームを追加するには、まずランタイムから現在のボリュームを読み取り、新しいリストにそれらを含める必要があります。

すべてのボリューム操作は、CLIからも利用できます:

# List current volumes
hf spaces volumes ls username/my-space

# Set (replace) volumes
hf spaces volumes set username/my-space \
    -v hf://models/username/my-model:/models \
    -v hf://buckets/username/my-bucket:/data

# Remove all volumes
hf spaces volumes delete username/my-space

さらに高度な方法: Space を一時的にアップグレードします!

Spaces は多様なユースケースに対応できます。特定のハードウェア上で Space を一時的に実行して、必要な処理を実行した後にシャットダウンしたい場合があるでしょう。このセクションでは、オンデマンドでモデルのファインチューニングを行うために Spaces を活用する方法について説明します。これはこの特定の課題を解決する唯一の方法ではなく、あくまで提案として、ご自身のユースケースに合わせて調整してください。

モデルのファインチューニングを行うSpaceがあると仮定します。これはGradioアプリであり、モデルIDとデータセットIDを入力として受け取ります。ワークフローは以下の通りです。

  1. (ユーザーにモデルとデータセットの入力を促す)
  2. Hubからモデルを読み込みます。
  3. Hubからデータセットを読み込みます。
  4. データセットでモデルをファインチューニングします。
  5. 新しいモデルをHubにアップロードします。

Step 3. では、カスタムハードウェアが必要ですが、有料のGPUでSpaceを常時実行したくない場合があります。その解決策として、トレーニングのためにハードウェアを動的にリクエストし、完了後にシャットダウンする方法があります。ハードウェアのリクエストによりSpaceが再起動されるため、アプリは現在実行中のタスクを何らかの方法で「記憶」する必要があります。これには複数の方法がありますが、本ガイドでは、Datasetを「タスクスケジューラ」として利用する1つの解決策を紹介します。

アプリの骨格

アプリの動作は以下のようになります。起動時にタスクがスケジュールされているかを確認し、スケジュールされていれば、適切なハードウェアで実行します。完了後、ハードウェアを空き状態のcpu-basic CPUに戻し、ユーザーに新しいタスクの入力を促します。

このようなワークフローは、通常のデモのように同時アクセスをサポートしていません。 特に、トレーニングが発生している間はインターフェースが無効になります。 リポジトリをプライベートに設定し、ユーザーが自分自身であることを確認することをお勧めします。

# Space will need your token to request hardware: set it as a Secret !
HF_TOKEN = os.environ.get("HF_TOKEN")

# Space own repo_id
TRAINING_SPACE_ID = "Wauplin/dreambooth-training"

from huggingface_hub import HfApi, SpaceHardware
api = HfApi(token=HF_TOKEN)

# On Space startup, check if a task is scheduled. If yes, finetune the model. If not,
# display an interface to request a new task.
task = get_task()
if task is None:
    # Start Gradio app
    def gradio_fn(task):
        # On user request, add task and request hardware
        add_task(task)
        api.request_space_hardware(repo_id=TRAINING_SPACE_ID, hardware=SpaceHardware.T4_MEDIUM)

    gr.Interface(fn=gradio_fn, ...).launch()
else:
    runtime = api.get_space_runtime(repo_id=TRAINING_SPACE_ID)
    # Check if Space is loaded with a GPU.
    if runtime.hardware == SpaceHardware.T4_MEDIUM:
        # If yes, finetune base model on dataset !
        train_and_upload(task)

        # Then, mark the task as "DONE"
        mark_as_done(task)

        # DO NOT FORGET: set back CPU hardware
        api.request_space_hardware(repo_id=TRAINING_SPACE_ID, hardware=SpaceHardware.CPU_BASIC)
    else:
        api.request_space_hardware(repo_id=TRAINING_SPACE_ID, hardware=SpaceHardware.T4_MEDIUM)

タスクスケジューラ

タスクのスケジューリングには多くの方法があります。ここでは、Datasetとして保存されたシンプルなCSVファイルを使用してタスクをスケジューリングする例を示します。

# Dataset ID in which a `tasks.csv` file contains the tasks to perform.
# Here is a basic example for `tasks.csv` containing inputs (base model and dataset)
# and status (PENDING or DONE).
#     multimodalart/sd-fine-tunable,Wauplin/concept-1,DONE
#     multimodalart/sd-fine-tunable,Wauplin/concept-2,PENDING
TASK_DATASET_ID = "Wauplin/dreambooth-task-scheduler"

def _get_csv_file():
    return hf_hub_download(repo_id=TASK_DATASET_ID, filename="tasks.csv", repo_type="dataset", token=HF_TOKEN)

def get_task():
    with open(_get_csv_file()) as csv_file:
        csv_reader = csv.reader(csv_file, delimiter=',')
        for row in csv_reader:
            if row[2] == "PENDING":
                return row[0], row[1] # model_id, dataset_id

def add_task(task):
    model_id, dataset_id = task
    with open(_get_csv_file()) as csv_file:
        with open(csv_file, "r") as f:
            tasks = f.read()

    api.upload_file(
        repo_id=repo_id,
        repo_type=repo_type,
        path_in_repo="tasks.csv",
        # Quick and dirty way to add a task
        path_or_fileobj=(tasks + f"\n{model_id},{dataset_id},PENDING").encode()
    )

def mark_as_done(task):
    model_id, dataset_id = task
    with open(_get_csv_file()) as csv_file:
        with open(csv_file, "r") as f:
            tasks = f.read()

    api.upload_file(
        repo_id=repo_id,
        repo_type=repo_type,
        path_in_repo="tasks.csv",
        # Quick and dirty way to set the task as DONE
        path_or_fileobj=tasks.replace(
            f"{model_id},{dataset_id},PENDING",
            f"{model_id},{dataset_id},DONE"
        ).encode()
    )
Update on GitHub