Hub Python Library documentation

Kelola Space Anda

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Kelola Space Anda

Dalam panduan ini, kita akan melihat cara mengelola runtime Space Anda (secrets, hardware, dan volume) menggunakan huggingface_hub.

Cari Spaces

Anda dapat mencari Spaces di Hub menggunakan pencarian semantik dengan search_spaces(). Ini menggunakan pencarian berbasis embedding untuk kueri multi-kata dan pencarian teks penuh untuk kueri satu kata.

>>> 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, ...)

Anda dapat memfilter hasil berdasarkan SDK atau tag:

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

Atau melalui CLI:

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

Contoh sederhana: konfigurasikan rahasia dan perangkat keras.

Berikut adalah contoh end-to-end untuk membuat dan menyiapkan Space di Hub.

Buat Space di Hub

>>> 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 gratis untuk semua orang. Gradio dan Docker Spaces berjalan di compute: pada perangkat keras gratis cpu-basic, mereka memerlukan langganan (PRO untuk pengguna, Team atau Enterprise untuk organisasi), sedangkan perangkat keras berbayar hanya memerlukan billing (metode pembayaran dan kredit prabayar). Tanpa langganan, membuat, menduplikasi, atau memindahkan Gradio atau Docker Space di cpu-basic akan gagal dengan error pembayaran (HTTP 402). Lihat harga untuk detail lebih lanjut.

Buat Space dari template

Alih-alih memulai dari Space kosong, Anda dapat menginisiasi Space baru dari salah satu template resmi yang tersedia di Hub (misalnya JupyterLab, chatbot Gradio, aplikasi Streamlit, dll.). Daftarkan template yang tersedia dengan list_space_templates(), lalu teruskan repo_id template (atau name singkatnya) sebagai space_template ke create_repo(). Perhatikan bahwa space_sdk tetap diperlukan: template menginisiasi file, sementara SDK mengatur metadata kartu.

>>> 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")

Beberapa template disarankan untuk dibuat privat (misalnya JupyterLab). Jika Anda tidak secara eksplisit mengatur visibilitas, Spaces semacam itu akan dibuat sebagai privat secara otomatis.

Dari CLI, hal yang sama tersedia melalui hf spaces templates dan 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

Duplikasi Space

Hal ini dapat berguna jika Anda ingin membangun dari Space yang sudah ada alih-alih memulai dari nol. Hal ini juga berguna jika Anda ingin mengontrol konfigurasi/aturan dari Space publik. Lihat duplicate_repo() untuk detail lebih lanjut.

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

Unggah kode Anda menggunakan solusi yang Anda pilih

Berikut adalah contoh untuk mengunggah folder lokal src/ dari mesin Anda ke Space Anda:

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

Pada langkah ini, aplikasi Anda seharusnya sudah berjalan di Hub! Namun, Anda mungkin ingin mengonfigurasinya lebih lanjut dengan secrets dan hardware yang ditingkatkan.

Konfigurasi rahasia dan variabel

Space Anda mungkin memerlukan beberapa kunci rahasia, token, atau variabel agar dapat berfungsi. Lihat dokumentasi untuk detail lebih lanjut. Sebagai contoh, token HF untuk mengunggah dataset gambar ke Hub setelah dihasilkan dari Space Anda.

>>> 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")

Anda dapat mendaftar secret dan variabel yang ada. Nilai secret bersifat write-only, sehingga hanya kunci, deskripsi, dan timestamp pembaruan yang dikembalikan:

>>> 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=...)}

Secrets dan variabel juga dapat dihapus:

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

Dari dalam Space Anda, secrets tersedia sebagai variabel lingkungan (atau Streamlit Secrets Management jika menggunakan Streamlit). Tidak perlu mengambilnya melalui API!

Setiap perubahan pada konfigurasi Space Anda (secrets atau hardware) akan memicu restart aplikasi Anda.

Bonus: atur rahasia dan variabel saat membuat atau menduplikasi Space!

Secrets dan variabel dapat diatur saat membuat atau menduplikasi 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"}, ...],
... )

Konfigurasi perangkat keras

Secara default, Space Anda berjalan pada perangkat keras cpu-basic gratis (yang memerlukan langganan untuk Space Gradio dan Docker, lihat di atas). Anda dapat meningkatkan perangkat keras untuk menjalankannya pada GPU. Metode pembayaran dan kredit prabayar (atau hibah komunitas) diperlukan untuk meningkatkan Space Anda. Lihat dokumentasi untuk detail lebih lanjut.

# 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")

Pembaruan perangkat keras tidak dilakukan secara langsung karena Space Anda harus dimuat ulang di server kami. Kapan pun, Anda dapat memeriksa perangkat keras apa yang sedang menjalankan Space Anda untuk melihat apakah permintaan Anda telah dipenuhi.

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

Anda sekarang memiliki Space yang sudah dikonfigurasi sepenuhnya. Pastikan untuk menurunkan level Space Anda kembali ke cpu-basic setelah selesai menggunakannya.

Bonus: minta perangkat keras saat membuat atau menduplikasi Space!

Perangkat keras yang ditingkatkan akan secara otomatis ditugaskan ke Space Anda setelah dibangun.

>>> 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
... )

Lacak kuota ZeroGPU Anda

Spaces ZeroGPU berjalan di GPU bersama yang dialokasikan sesuai permintaan. Setiap kali Anda menggunakan Space ZeroGPU (dari UI atau melalui API-nya), sebagian waktu GPU akan dipotong dari kuota pribadi Anda, yang direset secara berkala. Jika Anda sedang membangun aplikasi, agen, atau server MCP di atas Space ZeroGPU, Anda dapat melacak penggunaan Anda dengan get_zero_gpu_quota(). Nilai dinyatakan dalam detik-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 bernilai None jika Anda belum menggunakan ZeroGPU sejak reset terakhir. Jika Anda menggunakan token fine-grained, token tersebut harus memiliki izin “Billing > Read billing usage and payment method status”. Informasi yang sama dapat diperoleh dari CLI dengan hf spaces zero-gpu quota.

Setelah kuota habis, pengguna PRO, Team, dan Enterprise dapat terus menggunakan ZeroGPU Spaces dengan mengonsumsi kredit prabayar. Anda dapat membeli kredit dari pengaturan penagihan Anda. Lihat Memperpanjang kuota dengan kredit untuk detail lebih lanjut.

Jeda dan mulai ulang Space Anda

Secara default, jika Space Anda berjalan di perangkat keras yang ditingkatkan, Space tersebut tidak akan pernah dihentikan. Namun, untuk menghindari penagihan, Anda mungkin ingin menjeda Space saat tidak digunakan. Hal ini dapat dilakukan menggunakan pause_space(). Space yang dijeda akan tidak aktif hingga pemilik Space mengaktifkannya kembali, baik melalui UI maupun melalui API menggunakan restart_space(). Untuk detail lebih lanjut tentang mode jeda, silakan merujuk ke bagian ini

# 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)

Kemungkinan lain adalah mengatur batas waktu (timeout) untuk Space Anda. Jika Space Anda tidak aktif melebihi durasi timeout tersebut, Space akan masuk ke mode tidur. Setiap pengunjung yang membuka Space Anda akan mengaktifkannya kembali. Anda dapat mengatur timeout menggunakan set_space_sleep_time(). Untuk detail lebih lanjut tentang mode tidur, silakan lihat bagian ini.

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

Catatan: jika Anda menggunakan perangkat keras ‘cpu-basic’, Anda tidak dapat mengatur waktu tidur kustom. Space Anda akan otomatis dijeda setelah 48 jam tidak aktif.

Bonus: atur waktu tidur saat meminta perangkat keras

Perangkat keras yang ditingkatkan akan secara otomatis ditugaskan ke Space Anda setelah dibangun.

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

Bonus: atur waktu tidur saat membuat atau menduplikasi 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",
... )

Debug Space yang gagal dengan membaca log-nya

Ketika sebuah Space gagal dibangun atau crash saat runtime, log yang biasanya Anda lihat di browser juga tersedia secara programatik melalui fetch_space_logs(). Hal ini sangat berguna dari skrip atau alur kerja agentic di mana membuka browser bukan pilihan yang tersedia.

# 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="")

Fungsionalitas yang sama tersedia dari 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

SSH ke Space (Mode Dev)

Dev Mode memungkinkan Anda SSH ke container Space yang sedang berjalan untuk debugging dan pengembangan secara langsung. Gunakan hf spaces ssh untuk membuka sesi langsung dari terminal. Jika Dev Mode belum diaktifkan pada Space tersebut, CLI akan meminta Anda untuk mengaktifkannya (atau berikan --auto untuk melewati permintaan tersebut).

Kunci publik SSH Anda harus didaftarkan di pengaturan Anda.

# 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

Anda juga dapat mengaktifkan Dev Mode tanpa SSH menggunakan hf spaces dev-mode, yang menampilkan instruksi koneksi untuk SSH, VS Code, Cursor, dan Windsurf:

hf spaces dev-mode username/my-space

Mengaktifkan Dev Mode memerlukan langganan PRO atau Team & Enterprise. Menonakkannya selalu diizinkan, misalnya jika langganan Anda kedaluwarsa saat Dev Mode masih aktif:

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

Pasang volume di Space Anda

Anda dapat mem-mount sumber daya Hub (model, dataset, atau storage bucket) sebagai volume di container Space Anda. Hal ini memberikan akses filesystem langsung ke sumber daya tersebut tanpa perlu mengunduhnya di kode Anda. Volume dapat diatur langsung saat membuat atau menduplikasi 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"),
...     ],
... )

Anda dapat memeriksa volume mana yang saat ini terpasang melalui runtime 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), ...]

Jika Anda perlu memperbarui volume pada Space yang sudah ada, gunakan set_space_volumes(). Perhatikan bahwa ini akan menggantikan semua volume yang sebelumnya dipasang.

>>> 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"),
...     ],
... )

Untuk menghapus semua volume dari Space Anda:

>>> api.delete_space_volumes(repo_id=repo_id)

Model, dataset, dan Spaces selalu dimount sebagai read-only. Hanya storage bucket yang mendukung mount read-write.

Pengaturan volume menggantikan volume yang sebelumnya dipasang. Untuk menambahkan volume ke daftar yang sudah ada, pertama baca volume saat ini dari runtime dan sertakan dalam daftar baru.

Semua operasi volume juga tersedia dari 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

Lebih lanjut: naikkan level Space Anda secara sementara!

Spaces memungkinkan banyak kasus penggunaan yang berbeda. Terkadang, Anda mungkin ingin menjalankan Space secara sementara pada perangkat keras tertentu, melakukan sesuatu, lalu mematikannya. Pada bagian ini, kita akan menjelajahi cara memanfaatkan Spaces untuk melakukan penyesuaian halus (finetuning) model sesuai permintaan. Ini hanyalah salah satu cara untuk menyelesaikan masalah khusus ini. Hal ini harus dipandang sebagai saran dan disesuaikan dengan kasus penggunaan Anda.

Mari kita asumsikan kita memiliki Space untuk finetune sebuah model. Ini adalah aplikasi Gradio yang menerima model id dan dataset id sebagai input. Alur kerjanya adalah sebagai berikut:

  1. (Minta pengguna untuk memilih model dan dataset)
  2. Muat model dari Hub.
  3. Muat dataset dari Hub.
  4. Lakukan finetune model pada dataset.
  5. Unggah model baru ke Hub.

Step 3. membutuhkan perangkat keras khusus, tetapi Anda tidak ingin Space Anda berjalan terus-menerus di GPU berbayar. Solusinya adalah meminta perangkat keras secara dinamis untuk pelatihan dan mematikannya setelah selesai. Karena permintaan perangkat keras akan memulai ulang Space Anda, aplikasi Anda harus “mengingat” tugas saat ini yang sedang dilakukan. Ada beberapa cara untuk melakukan ini. Dalam panduan ini, kita akan melihat satu solusi menggunakan Dataset sebagai “penjadwal tugas”.

Kerangka aplikasi

Berikut tampilan aplikasi Anda. Saat startup, periksa apakah ada tugas yang dijadwalkan; jika ada, jalankan tugas tersebut di perangkat keras yang tepat. Setelah selesai, kembalikan perangkat keras ke CPU cpu-basic yang bebas dan minta pengguna untuk memberikan tugas baru.

Alur kerja seperti ini tidak mendukung akses bersamaan seperti demo pada umumnya. Secara khusus, antarmuka akan dinonaktifkan saat pelatihan berlangsung. Disarankan untuk mengatur repositori Anda sebagai privat untuk memastikan Anda adalah satu-satunya pengguna.

# 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)

Penjadwal tugas

Penjadwalan tugas dapat dilakukan dengan berbagai cara. Berikut adalah contoh cara melakukannya menggunakan CSV sederhana yang disimpan sebagai Dataset.

# 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