Data centers
For operators who sell spare GPU time to HIPS from their own servers and take the GPUs back for their own clients, from a script or a management system. It covers HIPS Provider 0.1.22 and later, on Linux, on the machine itself or in Docker.
The one-line installer picks the package for your distribution. HIPS_DATA_CENTER=1 declares the machine a server before it is linked to your account (see The data-center flag, below).
Shell
curl -fsSL https://hips.com/install.sh | sudo HIPS_DATA_CENTER=1 shOn a server with no screen, link it with sudo hips-provider connect, which shows a code, a QR code and a link to approve in the HIPS Console.
For many servers, create an enrollment code in the HIPS Console under Connect many machines. The install line takes it: curl -fsSL https://hips.com/install.sh | sudo HIPS_DATA_CENTER=1 HIPS_ENROLLMENT_CODE=<code> sh. Keep the code in a file only root can read, so it is not typed where the shell's history keeps it, and run this as root:
Shell
curl -fsSL https://hips.com/install.sh | HIPS_DATA_CENTER=1 HIPS_ENROLLMENT_CODE="$(cat /root/hips-enrollment-code)" shA server already installed is linked from the same file (mode 0600 or 0400, not a link):
Shell
sudo hips-provider connect --enrollment-code-file /root/hips-enrollment-code- Each server joins your account with nobody approving it, and its GPUs go through the normal checks before they take work.
- Revoking a code stops new servers joining. Servers it already connected stay connected.
- You can start the installer on thousands of servers at once. If HIPS asks them to slow down, each server waits and sends its code again, so give your deployment tool's task a timeout of at least ten minutes. If the tool stops the installer early, the server goes on trying and links by itself.
Build an image with the installer, and run hips-provider service run as the container's command:
FROM ubuntu:24.04RUN apt-get update \ && apt-get install -y --no-install-recommends ca-certificates curl \ && curl -fsSL https://hips.com/install.sh | HIPS_NO_LINK=1 HIPS_DATA_CENTER=1 sh \ && rm -rf /var/lib/apt/lists/*CMD ["hips-provider", "service", "run"]- The state volume keeps the device's identity, its link to your account, its settings and the model cache, so a new container is the same device with the same models. To keep the models on a larger disk, mount that disk at
/var/lib/hips-provider/models. - The configuration volume keeps
/etc/hips-provider/config.toml. --gpus allpasses the GPUs to the container and needs the NVIDIA Container Toolkit on the host.--restart unless-stoppedbrings the container back by itself.--inithands a stop on to HIPS Provider and reaps ended processes.
Note
Always set the container's stop timeout and HIPS_STOP_TIMEOUT to the same number of seconds. A Docker installation can stop a container sooner than its documented default of 10 seconds, and a running job needs time to drain. 125 seconds or more lets a job use the whole default drain window.
Note
Never use docker pause to take the GPUs back. It freezes HIPS Provider in the middle of a job, keeps the GPU memory in use, and HIPS sees a job that stopped answering. HIPS's own pause, below, lets the job finish.
To link the container with an enrollment code, give it the code and HIPS Provider reads it when the container starts, while the container is not yet linked. We recommend a file, since docker inspect shows an environment variable: owned by root and readable by root alone (mode 0600 or 0400), not a link, mounted at /run/secrets/hips-enrollment-code, or at another path named by HIPS_ENROLLMENT_CODE_FILE. Or give the code as the environment variable HIPS_ENROLLMENT_CODE.
docker run -d --name hips-provider \ -v /root/hips-enrollment-code:/run/secrets/hips-enrollment-code:ro \ ...A refused code is said in the container's log, and the container keeps running unlinked. On Kubernetes, secret volumes use links, so use the variable from a secretKeyRef, or a subPath mount with mode 0400.
Every command below runs inside the container with docker exec hips-provider hips-provider ....
A server with the data-center flag is available whenever it is on and healthy. HIPS Provider reads no sign of a person using it, applies no idle or sleep rules, and keeps no daily cap. What stops its work is a pause, a maintenance window you set, its thermal limit, or a driver fault.
Declare the flag before the server is linked: with the installer's HIPS_DATA_CENTER=1, or with sudo hips-provider config set data_center true. A Linux container with no systemd and no desktop declares it by itself. Once the server is linked, only HIPS changes the flag. hips-provider status shows it.
| Command | What it does |
|---|---|
hips-provider pause | No new work from HIPS on this server, until resumed |
hips-provider pause --for 2h | The same, for two hours; also 30m, 1h30m, 2d |
hips-provider pause --until 18:00 | The same, until a local time, or tomorrow |
hips-provider pause --gpu 1 | One GPU alone, by the index hips-provider gpus lists or its UUID; the others work on |
hips-provider pause --reason "client job 4711" | The pause with a reason in a few words, at most 200 characters, shown in the status and the HIPS Console |
hips-provider pause --wait | Returns once the running jobs have drained and the GPU's memory is free |
hips-provider pause --wait --timeout 10m | The same, waiting at most ten minutes |
hips-provider resume | Ends the pause; --gpu 1 ends one GPU's |
- Command
hips-provider pause- What it does
- No new work from HIPS on this server, until resumed
- Command
hips-provider pause --for 2h- What it does
- The same, for two hours; also
30m,1h30m,2d
- Command
hips-provider pause --until 18:00- What it does
- The same, until a local time, or
tomorrow
- Command
hips-provider pause --gpu 1- What it does
- One GPU alone, by the index
hips-provider gpuslists or its UUID; the others work on
- Command
hips-provider pause --reason "client job 4711"- What it does
- The pause with a reason in a few words, at most 200 characters, shown in the status and the HIPS Console
- Command
hips-provider pause --wait- What it does
- Returns once the running jobs have drained and the GPU's memory is free
- Command
hips-provider pause --wait --timeout 10m- What it does
- The same, waiting at most ten minutes
- Command
hips-provider resume- What it does
- Ends the pause;
--gpu 1ends one GPU's
The options combine: hips-provider pause --gpu 1 --wait --timeout 10m --reason "client job 4711".
- A server's pause lasts until it is resumed, across reboots and restarts of its container. A pause with
--foror--untilstill ends at its time. - HIPS sends no new work. A job already running may finish within the drain window, 120 seconds unless
drain_window_ssays otherwise; one that has not finished by then is stopped and reported to HIPS. - Pausing while paused changes the end, and the reason where a new one is given. Resuming while not paused says "Not paused.". Both exit 0, so a script can run them again safely.
| Code | Meaning |
|---|---|
| 0 | Paused (with --wait, also drained), resumed, or not paused |
| 1 | Another failure, such as a GPU the server does not have; the message says which |
| 2 | The command line is wrong, such as --timeout without --wait |
| 69 | The HIPS Provider service is not running here |
| 75 | --timeout passed before the work drained. The pause stays in force: wait again, or resume |
| 77 | This account may not use the service: run it as root or with sudo |
- Code
- 0
- Meaning
- Paused (with
--wait, also drained), resumed, or not paused
- Code
- 1
- Meaning
- Another failure, such as a GPU the server does not have; the message says which
- Code
- 2
- Meaning
- The command line is wrong, such as
--timeoutwithout--wait
- Code
- 69
- Meaning
- The HIPS Provider service is not running here
- Code
- 75
- Meaning
--timeoutpassed before the work drained. The pause stays in force: wait again, or resume
- Code
- 77
- Meaning
- This account may not use the service: run it as root or with sudo
- 01
Pause with
--wait:hips-provider pause --wait --timeout 10m --reason "...", with--gpu Nfor one GPU. When it exits 0, no HIPS work runs and the GPU's memory is free. - 02
Hand the GPU over and start your client's work.
- 03
Resume once your client is done:
hips-provider resume, with--gpu Nfor one GPU.
Pause with --wait before a change and resume after. In Docker, put docker exec hips-provider in front of the program. A task that should not fail the play on a slow drain can accept 75 as well: the pause is then in force, with work still finishing.
Ansible
- name: Take the GPUs back from HIPS ansible.builtin.command: argv: [hips-provider, pause, --wait, --timeout, 10m, --reason, "{{ hips_pause_reason }}"] register: hips_pause changed_when: true failed_when: hips_pause.rc != 0 # Your change goes here. - name: Give the GPUs back to HIPS ansible.builtin.command: argv: [hips-provider, resume] register: hips_pause_end changed_when: "'Not paused.' not in hips_pause_end.stdout"A prolog pauses with --wait, and an epilog resumes. A prolog that exits with anything but 0 sets the node to DRAIN, so give --timeout room for the drain window. On nodes that run several Slurm jobs at once, pause the job's own GPUs with --gpu, after checking that the indices hips-provider gpus lists match your gres.conf.
#!/bin/sh# Prolog: take this node's GPUs from HIPS for the Slurm job.exec hips-provider pause --wait --timeout 5m --reason "Slurm job ${SLURM_JOB_ID}"When HIPS Provider runs on a node beside your cluster, the node moves between the two with a pause and a cordon: the pause before the uncordon when the cluster takes the node, and the resume after the cordon when HIPS takes it back. Where HIPS Provider runs as a pod on the node, run the same commands with kubectl exec into that pod, and set its terminationGracePeriodSeconds to the value of HIPS_STOP_TIMEOUT.
ssh "$NODE" sudo hips-provider pause --wait --timeout 10m --reason "cluster workloads"kubectl uncordon "$NODE"hips-provider status --json prints one JSON object for each server's state, its GPUs, any pause with its reason, and the work running.
| Field | What it holds |
|---|---|
state | ready, working, paused, in_use, offline, needs_you or updating |
line | The status in words |
status.pause | The machine's pause, or null: reason, lasting, drained, until_unix_ms, since_unix_ms, source |
status.gpus[] | Each GPU: index, key, paused, pause_reason, pause_lasting, drained, attempts |
status.data_center | The data-center flag |
- Field
state- What it holds
ready,working,paused,in_use,offline,needs_youorupdating
- Field
line- What it holds
- The status in words
- Field
status.pause- What it holds
- The machine's pause, or
null:reason,lasting,drained,until_unix_ms,since_unix_ms,source
- Field
status.gpus[]- What it holds
- Each GPU:
index,key,paused,pause_reason,pause_lasting,drained,attempts
- Field
status.data_center- What it holds
- The data-center flag
For example, whether a server is paused and drained:
Shell
hips-provider status --json | jq '{state, pause: .status.pause}'Related sheets
- Sheet
- 13 of 19
- Detail
- G
- Updated
- 2026-11-11