Hub Python Library documentation

Gerenciar seu Space

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v2.4.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Gerenciar seu Space

Neste guia, veremos como gerenciar o runtime do seu Space (segredos, hardware e volumes) usando huggingface_hub.

Pesquisar por Spaces

Você pode pesquisar Spaces no Hub usando busca semântica com search_spaces(). Isso utiliza busca baseada em embeddings para consultas com múltiplas palavras e busca de texto completo para consultas com uma única palavra.

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

Você pode filtrar os resultados por SDK ou tags:

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

Ou via CLI:

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

Um exemplo simples: configure segredos e hardware.

Aqui está um exemplo de ponta a ponta para criar e configurar um Space no Hub.

Crie um Space no 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")

Os Spaces estáticos são gratuitos para todos. Os Spaces Gradio e Docker rodam em hardware de computação: no hardware gratuito cpu-basic, eles exigem uma assinatura (PRO para usuários, Team ou Enterprise para organizações), enquanto o hardware pago exige apenas a configuração de cobrança (um método de pagamento e créditos pré-pagos). Sem uma assinatura, criar, duplicar ou mover um Space Gradio ou Docker em cpu-basic falha com um erro de pagamento (HTTP 402). Consulte preços para mais detalhes.

Crie um Space a partir de um modelo

Em vez de começar com um Space vazio, você pode iniciar um novo Space a partir de um dos modelos oficiais oferecidos no Hub (por exemplo, JupyterLab, um chatbot Gradio, um app Streamlit, etc.). Liste os modelos disponíveis com list_space_templates() e, em seguida, passe o repo_id de um modelo (ou seu name curto) como space_template para create_repo(). Observe que space_sdk ainda é obrigatório: o modelo fornece os arquivos, enquanto o SDK define os metadados do card.

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

Alguns templates são recomendados para serem privados (por exemplo, JupyterLab). Se você não definir explicitamente a visibilidade, esses Spaces são criados como privados automaticamente.

Na CLI, o mesmo está disponível por meio de hf spaces templates e 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

Duplicar um Space

Isso pode ser útil se você quiser construir a partir de um Space existente, em vez de começar do zero. Também é útil se você quiser ter controle sobre a configuração/ajustes de um Space público. Consulte duplicate_repo() para mais detalhes.

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

Envie seu código usando a solução de sua preferência

Aqui está um exemplo para enviar a pasta local src/ da sua máquina para o seu Space:

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

Nesta etapa, seu aplicativo já deve estar em execução no Hub! No entanto, você pode querer configurá-lo ainda mais com segredos e hardware aprimorado.

Configure segredos e variáveis

Seu Space pode exigir algumas chaves secretas, tokens ou variáveis para funcionar. Veja a documentação para mais detalhes. Por exemplo, um token do HF para enviar um conjunto de dados de imagens para o Hub após ser gerado a partir do seu Space.

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

Você pode listar segredos e variáveis existentes. Os valores dos segredos são somente para gravação, portanto apenas as chaves, descrições e carimbos de data/hora de atualização são retornados:

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

Segredos e variáveis também podem ser excluídos:

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

Dentro do seu Space, os segredos estão disponíveis como variáveis de ambiente (ou Gerenciamento de Segredos do Streamlit, se estiver usando Streamlit). Não é necessário buscá-los via API!

Qualquer alteração na configuração do seu Space (segredos ou hardware) acionará uma reinicialização do seu aplicativo.

Bônus: defina segredos e variáveis ao criar ou duplicar o Space!

Segredos e variáveis podem ser definidos ao criar ou duplicar um espaço:

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

Configure o hardware

Por padrão, seu Space é executado no hardware gratuito cpu-basic (que requer uma assinatura para Spaces Gradio e Docker, veja acima). Você pode fazer o upgrade do hardware para executá-lo em GPUs. Um método de pagamento e créditos pré-pagos (ou uma concessão da comunidade) são necessários para fazer o upgrade do seu Space. Consulte a documentação para mais detalhes.

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

As atualizações de hardware não são feitas imediatamente, pois seu Space precisa ser recarregado em nossos servidores. A qualquer momento, você pode verificar em qual hardware seu Space está sendo executado para ver se sua solicitação foi atendida.

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

Agora você tem um Space totalmente configurado. Certifique-se de rebaixar seu Space para cpu-basic quando terminar de usá-lo.

Bônus: solicite hardware ao criar ou duplicar o Space!

O hardware atualizado será atribuído automaticamente ao seu Space assim que ele for construído.

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

Acompanhe sua cota de ZeroGPU

Spaces ZeroGPU são executados em GPUs compartilhadas alocadas sob demanda. Cada vez que você usa um Space ZeroGPU (pela interface ou por meio de sua API), parte do tempo de GPU é deduzida da sua cota pessoal, que é redefinida periodicamente. Se você está construindo um aplicativo, um agente ou um servidor MCP com base em Spaces ZeroGPU, pode acompanhar seu uso com get_zero_gpu_quota(). Os valores são expressos em segundos de 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 é None se você não usou o ZeroGPU desde o último reset. Se você usar um token de granularidade fina, ele deve ter a permissão “Billing > Read billing usage and payment method status”. As mesmas informações estão disponíveis na CLI com hf spaces zero-gpu quota.

Quando a cota é esgotada, usuários PRO, Team e Enterprise podem continuar usando Spaces ZeroGPU consumindo créditos pré-pagos. Você pode comprar créditos em suas configurações de faturamento. Consulte Estendendo a cota com créditos para mais detalhes.

Pausar e retomar seu Space

Por padrão, se o seu Space estiver em execução em um hardware atualizado, ele nunca será interrompido. No entanto, para evitar cobranças, você pode querer pausá-lo quando não estiver usando. Isso é possível usando pause_space(). Um Space pausado ficará inativo até que o proprietário do Space o reinicie, seja pela interface ou via API usando restart_space(). Para mais detalhes sobre o modo pausado, consulte esta seção

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

Outra possibilidade é definir um tempo limite para o seu Space. Se o seu Space estiver inativo por mais tempo que a duração do tempo limite, ele entrará em modo de suspensão. Qualquer visitante que acessar o seu Space o reativará. Você pode definir um tempo limite usando set_space_sleep_time(). Para mais detalhes sobre o modo de suspensão, consulte esta seção.

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

Observação: se você estiver usando um hardware ‘cpu-basic’, não é possível configurar um tempo de suspensão personalizado. Seu Space será pausado automaticamente após 48h de inatividade.

Bônus: defina um tempo de espera ao solicitar hardware

O hardware atualizado será atribuído automaticamente ao seu Space assim que ele for construído.

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

Bônus: defina um tempo de inatividade ao criar ou duplicar o 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",
... )

Depurar um Space com falhas lendo seus logs

Quando um Space falha na compilação ou sofre uma falha em tempo de execução, os logs que normalmente você visualiza no navegador também estão disponíveis programaticamente por meio de fetch_space_logs(). Isso é particularmente útil em scripts ou fluxos de trabalho agênticos, onde abrir um navegador não é uma opção.

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

A mesma funcionalidade está disponível a partir da 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

Conectar via SSH a um Space (Modo de desenvolvimento)

Dev Mode permite fazer SSH em um contêiner de Space em execução para depuração e desenvolvimento ao vivo. Use hf spaces ssh para abrir uma sessão diretamente do terminal. Se o Dev Mode ainda não estiver habilitado no Space, o CLI solicitará que você o habilite (ou passe --auto para pular o prompt).

Sua chave pública SSH deve estar registrada em suas configurações.

# 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

Você também pode ativar o Dev Mode sem SSH usando hf spaces dev-mode, que exibe as instruções de conexão para SSH, VS Code, Cursor e Windsurf:

hf spaces dev-mode username/my-space

Ativar o Modo de Desenvolvimento requer um plano PRO ou Team & Enterprise. Desativá-lo é sempre permitido, por exemplo, se sua assinatura expirou enquanto o Modo de Desenvolvimento estava ativado:

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

Monte volumes no seu Space

Você pode montar recursos do Hub (modelos, conjuntos de dados ou buckets de armazenamento) como volumes no contêiner do seu Space. Isso dá ao seu Space acesso direto ao sistema de arquivos desses recursos sem a necessidade de baixá-los no seu código. Os volumes podem ser definidos diretamente ao criar ou duplicar um 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"),
...     ],
... )

Você pode verificar quais volumes estão atualmente montados por meio do runtime do 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), ...]

Se você precisar atualizar os volumes em um Space existente, use set_space_volumes(). Observe que isso substitui todos os volumes montados anteriormente.

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

Para remover todos os volumes do seu Space:

>>> api.delete_space_volumes(repo_id=repo_id)

Modelos, conjuntos de dados e Spaces são sempre montados somente para leitura. Somente os buckets de armazenamento suportam montagens de leitura e gravação.

Definir volumes substitui quaisquer volumes montados anteriormente. Para adicionar um volume a uma lista existente, primeiro leia os volumes atuais do runtime e inclua-os na nova lista.

Todas as operações de volume também estão disponíveis na 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

Mais avançado: faça um upgrade temporário do seu Space!

Spaces permitem muitos casos de uso diferentes. Às vezes, você pode querer executar um Space temporariamente em um hardware específico, fazer algo e depois desligá-lo. Nesta seção, exploraremos como aproveitar os Spaces para fazer o ajuste fino de um modelo sob demanda. Esta é apenas uma maneira de resolver esse problema específico. Deve ser tomada como uma sugestão e adaptada ao seu caso de uso.

Vamos supor que temos um Space para fazer o ajuste fino de um modelo. Trata-se de um aplicativo Gradio que recebe como entrada um id de modelo e um id de conjunto de dados. O fluxo de trabalho é o seguinte:

  1. (Peça ao usuário por um modelo e um conjunto de dados)
  2. Carregue o modelo do Hub.
  3. Carregue o dataset do Hub.
  4. Ajuste fino do modelo no conjunto de dados.
  5. Faça o upload do novo modelo para o Hub.

Etapa 3. requer um hardware personalizado, mas você não quer que seu Space esteja rodando o tempo todo em uma GPU paga. Uma solução é solicitar dinamicamente o hardware para o treinamento e desligá-lo em seguida. Como a solicitação de hardware reinicia seu Space, seu aplicativo deve, de alguma forma, “lembrar” da tarefa atual que está executando. Existem várias maneiras de fazer isso. Neste guia, veremos uma solução usando um Dataset como “agendador de tarefas”.

Esqueleto do aplicativo

É assim que o seu aplicativo ficaria. Na inicialização, verifique se uma tarefa está agendada e, em caso afirmativo, execute-a no hardware correto. Ao concluir, defina o hardware de volta para a CPU cpu-basic livre e solicite ao usuário uma nova tarefa.

Esse fluxo de trabalho não suporta acesso concorrente, como nos demos normais. Especificamente, a interface será desativada quando o treinamento ocorrer. É preferível definir seu repositório como privado para garantir que você seja o único usuário.

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

Agendador de tarefas

A agendamento de tarefas pode ser feito de muitas maneiras. Aqui está um exemplo de como isso pode ser feito usando um CSV simples armazenado como um 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