Guide · Data centre

Connect a data centre's idle GPUs to Linkrra

4 steps · about half an hour for the first machine

If you own or host the hardware, an idle hour is not neutral — it costs you power and wear and returns nothing. Connected here, the same hour earns twice over: the card mines PRL whenever nothing is being asked of it, and serves AI inference when a request arrives. You keep 75% of what the card bills, paid in USDC on Base, and your PRL is paid to your own address. Nothing is exclusive: you can connect one machine, keep the rest where they are, and stop whenever you like.

  1. Ask the pool what your cards can do

    One HTTP call per card model — not per machine. Nothing is installed and nothing is downloaded. Give it the VRAM the driver reports and the card's name; it answers with the model that card would serve and the exact settings it would run. This asks for every card in the box, because a plan is per card and a mixed machine gets a different answer on each:

    nvidia-smi --query-gpu=index,name,memory.total --format=csv,noheader,nounits |
    while IFS=, read -r i name vram; do
      echo "== GPU$i $name"
      curl -s -G "https://pool.linkrra.com/v1/nodes/recommend" \
        --data-urlencode "vram_mib=$(echo $vram)" --data-urlencode "gpu_name=$(echo $name)"
    done

    The part that decides whether a card is worth connecting is reason:

    It saysWhat that means
    serve_and_mineServes inference and mines in the gaps. 32 GB cards (RTX 5090) and up.
    serve_onlyServes, but has no VRAM left for the miner once the model is resident. 24 GB cards (RTX 4090, 3090).
    servable: falseToo small or too old for the serving kernels. The card can still mine — see the NVIDIA rig guide.
    The bar is 24 GB of VRAM and compute capability 7.5 or newer. Below that a card cannot hold the model we serve at all. Run this across your card models first and you turn a fleet rollout into a list instead of a gamble.
  2. Prepare one machine

    Pick a single machine to prove the path before you touch the fleet. It needs an NVIDIA driver, Python 3.10 or newer, and a build toolchain — the serving engine compiles a small GPU shim the first time a model loads, on your machine.

    sudo apt update
    sudo apt install -y build-essential python3-dev python3-venv
    Do not skip the toolchain. Without the Python C headers the installer now stops in a couple of seconds and tells you what is missing. Before 2026-11-03 it stopped after downloading about 17 GB of model weights, which is the one failure we most wanted to spare you.
  3. Install, serve, register — every card in the box

    Two addresses and a key. The PRL address is where mined PRL goes; the USDC address on Base is where inference earnings go, and you can leave it out now and bind it later. The API key is created at the dashboard. Run this once per machine, not once per card:

    curl -fsSL https://pool.linkrra.com/install.sh -o install.sh
    less install.sh                     # we would rather you read it first
    sudo LINKRRA_PRL_ADDRESS=prl1...  \
         LINKRRA_USDC_ADDRESS=0x...   \
         LINKRRA_API_KEY=sk-pool-...  \
         LINKRRA_NODE_HOST=YOUR.PUBLIC.IP \
         bash install.sh

    It finds every card, asks the pool for a plan per card, and installs one model server, one node registration and one pinned miner for each. An 8-GPU server becomes eight nodes on ports 8000–8007, each registered separately, each with its own miner that stops only for its own card's requests. Cards too small to serve are listed and skipped; they can still mine.

    Every precondition — driver, Python, toolchain, disk for every distinct model, the pool's reachability, and whether each card's memory budget actually works — is checked before the download starts. A machine that cannot serve says so in seconds and has fetched nothing.

    Open one TCP port per card — 8000 to 8000+N−1 — to the internet, or to the pool's address only. The pool reaches in to each node and probes it before accepting it, so the URL has to be the one the outside world uses. On hosts that remap ports, pass the external URLs explicitly and in card order: LINKRRA_NODE_URLS="http://host:50018,http://host:50019". Behind NAT with no port open, a node is never given work.

    With sudo it installs systemd units and starts them, so the box comes back by itself after a reboot or an OOM. One card restarting never touches another:

    systemctl status 'linkrra-serve@*'      # is every card up
    journalctl -fu linkrra-register@0       # registration + heartbeat, card 0
    systemctl restart linkrra-serve@3       # one card only
    systemctl stop linkrra-node.target      # the whole box

    Each card's registration prints its node id and status:

    Registered: node_f889091f958ee374 — status: pending_approval
    pending_approval is the normal first answer, and it means the node is not yet earning from inference. Being in the registry and being handed a customer's prompt are different things: the requests we would route to you contain other people's data, so approval is a deliberate decision on our side. We check first — we reach each of your nodes with its own key, confirm it serves the model id it registered under, send a real completion, and read back the context your cards actually hold — and then a person approves. Your registration raises that review by itself; you do not have to chase it. Meanwhile your cards mine PRL and are paid for it. If you want to tell us who you are, or you have not heard within a business day: weare@linkrra.com.
    One model per card, never one model across cards. The plan the pool computes is sized to a single card, so we do not run tensor parallelism on this tier and would rather say so than guess at a configuration we have not measured. If your use case needs a model larger than one card holds, talk to us instead of forcing it.
  4. Confirm it earns, then roll out

    Your statement is one call, any time, and shows only your own figures:

    curl -H "Authorization: Bearer sk-pool-..." https://pool.linkrra.com/v1/earnings

    Once one machine is proven, the installer is fully non-interactive, so a rollout is a loop over the machines whose card models came back servable in step 1. One invocation per machine, whatever number of cards it has:

    LINKRRA_YES=1 LINKRRA_PRL_ADDRESS=prl1... LINKRRA_API_KEY=sk-pool-... \
    LINKRRA_NODE_HOST=THIS.MACHINE.IP bash install.sh
    #   LINKRRA_GPUS=0,1,2   restrict to some cards; the rest stay yours
    #   LINKRRA_PORT=9000    move the port block
    Already mining another coin, or with another pool? Keep doing it. LINKRRA_IDLE_IMAGE and LINKRRA_IDLE_ARGS run any GPU miner on an idle card instead of ours; it is pinned to that card and never touches the serving path. If your pool partners with us, it earns a share of what your cards serve. Serving is an extra income stream on idle capacity, not a migration.

    Talk to us → — not required to get out of pending_approval (registering raises the review on its own), but it is the fastest way to put a name to the address. Send the card models, roughly how many, and the node ids if you have them. Ask before you install and we will tell you what is realistic.

Notes, numbers and what we do not know

What a card earns while it is quiet. Mining only, from our own single-card runs on pearlhash, priced at PRL $1.47 on 2026-11-03 — a public SafeTrade ticker quote, not a filled trade — at 0.01274 PRL/TH/day and a 0.90 realisation factor, i.e. $0.01684 per TH/day:

GPUPRL hashrateMining revenueSource
NVIDIA H100679 TH/s$0.476/hourMeasured
RTX 5090423 TH/s$0.297/hourMeasured
RTX 4090309 TH/s$0.217/hourMeasured
RTX 3090140 TH/s$0.098/hourMeasured

Subtract your own power to get the number that matters to you: a card drawing W watts at P dollars per kWh costs W × P / 1000 per hour. We deliberately do not print an electricity rate here — yours is the only one that counts, and it is the whole difference between an idle hour and a paid one. A PRL price from a ticker is also not a price you have realised; it moves.

What a card earns while it is serving. You keep 75% of what the card bills a customer; the pool fee is the other 25% (15% to the pool and 10% to a partner pool, when you joined through one). Today that model sells at $0.27 per million output tokens, and one RTX 5090 served 9,024 output tokens per second at saturation — measured 2026-10-03 over 5,120 requests with no errors.

What we will not quote you. Revenue per card per day, because it depends on utilisation — how much of the day your card is actually answering requests — and we have never measured that on a partner's hardware. Any figure we gave you would be a model wearing a measurement's clothes. We would rather tell you the two things we do know (what it mines while quiet, and what it bills while busy) and let you hold us to them.

Can one card mine and serve at the same time? On 32 GB and up, yes — that is what serve_and_mine means, and the miner runs in the memory the model does not need. On 24 GB, no: once the model is resident there is not enough VRAM left for the miner, so the card does one or the other.

How a multi-GPU box is treated. Every card is its own node: its own model server on its own port, its own registration, and its own miner pinned to that card by GPU UUID. That is not a detail — it is the only arrangement in which "mining stops when paid work arrives" is true per card. A single miner spanning the box would sit on cards that were busy answering requests, and the governor watching one card's queue would have no idea. On a mixed machine each card gets its own plan from the pool and may serve a different model.

Verified on real hardware. Every step on this page was run on 2026-11-03 on a rented RTX 5090 (32,607 MiB, driver 580.178.04) on stock Ubuntu 24.04, from the public installer, as an outside operator — install, serve, register, and a request answered through the node's public URL. The serving plan the pool returned for that card (32,768-token context) produced an 86,240-token KV cache against a predicted 82,621. Three defects that run exposed are fixed in the installer linked above.

Your keys stay yours. The pool never holds a wallet. It sees a PRL address, a USDC address and an API key, and nothing is written outside the install directory and one optional service unit.