{
  "schema": "s2s-bench-v1",
  "kind": "data-kit-index",
  "exhibit": "ollama-and-vllm-on-one-rtx-3090",
  "exhibit_title": "Ollama and vLLM on one RTX 3090",
  "exhibit_url": "https://research.strata2signal.com/ollama-and-vllm-on-one-rtx-3090/",
  "published_utc": "2026-10-07",
  "licence": "CC BY 4.0",
  "attribution": "strata→signal research, research.strata2signal.com",
  "contact": "hello@strata2signal.com",
  "run_id": "ollama-vs-vllm-2026-09-28",
  "run_window_utc": {
    "arm_S_opened_utc": "2026-09-28T11:29:59Z",
    "arm_S_closed_utc": "2026-09-28T11:33:35Z",
    "arms_D_and_TT_opened_utc": "2026-09-28T17:20:32Z",
    "arms_D_and_TT_closed_utc": "2026-09-28T17:30:20Z",
    "arm_D_rerun_and_TT_replication_opened_utc": "2026-09-30T20:00:02Z",
    "arm_D_rerun_and_TT_replication_closed_utc": "2026-09-30T20:07:18Z",
    "arm_P_opened_utc": "2026-09-30T20:43:52Z",
    "arm_P_closed_utc": "2026-09-30T21:19:31Z",
    "arm_Q_opened_utc": "2026-09-30T21:27:35Z",
    "arm_Q_closed_utc": "2026-09-30T21:31:13Z",
    "arm_A_opened_utc": "2026-09-30T21:31:19Z",
    "arm_A_closed_utc": "2026-09-30T21:35:27Z",
    "arm_C_opened_utc": "2026-10-01T13:35:02Z",
    "arm_C_closed_utc": "2026-10-01T14:29:21Z"
  },
  "card_class": "one EVGA GeForce RTX 3090 XC3 Ultra (24 GB) at 300 W",
  "sanitisation": "Machine readers start at `index.json`, which lists every file in this kit but three, each with its byte count and its sha256; the three it leaves out are itself, `provenance.json` and this directory's index page. `provenance.json` is the other half: it names every rule applied to every file, with the count of times each one fired, and says whether any rule touched each file. `KIT-NOTE.md` says what is not here and why.",
  "files_note": "`index.json` lists every file in this kit but itself, `provenance.json` and this directory's index page, each with its sha256; `provenance.json` names every rule and how many times it fired on each file.",
  "file_count": 42,
  "files": [
    {
      "file": "KIT-NOTE.md",
      "bytes": 3528,
      "sha256": "a84d3ace08847887d92f671152ce01060532d05f3701d65b07b7963ec42e95f7",
      "role": "What is not here, and why."
    },
    {
      "file": "README.md",
      "bytes": 15907,
      "sha256": "2c24649d27d364a9386c0255c2cdd6ccd48755f7a9f09964f2edd32ea1f40f9c",
      "role": "What this directory holds."
    },
    {
      "file": "kit/client/client.py",
      "bytes": 27243,
      "sha256": "f32cd913be28937b5be71eceb52ca93aa6ee2b58e40877ef1d6e4248af0a0d7b",
      "role": "Client modules from the harness that drove the servers: the timing sweep, the engine protocol and the drivers listed, the parity check, the framing that renders each prompt once, the gates that read every run after it ends and void a level that breaks one of our rules, and the seeded tag each request opens with, the same on every server, so that no prompt cache can answer one request from another's. They are a reading set, not a program you can run: they import modules this kit does not carry (`pen.py`, `prereg.py`, `seat.py`, `seatlib.py`, `servelines.py`)."
    },
    {
      "file": "kit/client/engine.py",
      "bytes": 21424,
      "sha256": "fd74542531f99930d2c08c786520a9e30f5acc5f73cb0be769f7025b636140e3",
      "role": "Client modules from the harness that drove the servers: the timing sweep, the engine protocol and the drivers listed, the parity check, the framing that renders each prompt once, the gates that read every run after it ends and void a level that breaks one of our rules, and the seeded tag each request opens with, the same on every server, so that no prompt cache can answer one request from another's. They are a reading set, not a program you can run: they import modules this kit does not carry (`pen.py`, `prereg.py`, `seat.py`, `seatlib.py`, `servelines.py`)."
    },
    {
      "file": "kit/client/engine_llamaserver.py",
      "bytes": 11894,
      "sha256": "1052be672531225997e4efef15a5bd5c83916b710ad073d39c6a6eddfd5e74b0",
      "role": "Client modules from the harness that drove the servers: the timing sweep, the engine protocol and the drivers listed, the parity check, the framing that renders each prompt once, the gates that read every run after it ends and void a level that breaks one of our rules, and the seeded tag each request opens with, the same on every server, so that no prompt cache can answer one request from another's. They are a reading set, not a program you can run: they import modules this kit does not carry (`pen.py`, `prereg.py`, `seat.py`, `seatlib.py`, `servelines.py`)."
    },
    {
      "file": "kit/client/engine_ollama.py",
      "bytes": 23252,
      "sha256": "e23908fff7356eb2fa0800b6d7d210f68f2cfa1e19d997b93fc2a10eb6ccceb1",
      "role": "Client modules from the harness that drove the servers: the timing sweep, the engine protocol and the drivers listed, the parity check, the framing that renders each prompt once, the gates that read every run after it ends and void a level that breaks one of our rules, and the seeded tag each request opens with, the same on every server, so that no prompt cache can answer one request from another's. They are a reading set, not a program you can run: they import modules this kit does not carry (`pen.py`, `prereg.py`, `seat.py`, `seatlib.py`, `servelines.py`)."
    },
    {
      "file": "kit/client/framing.py",
      "bytes": 6050,
      "sha256": "45425fee7c07ba125db8042742ca9e4a3aa22a3619b6d25e8f6eca7f29216059",
      "role": "Client modules from the harness that drove the servers: the timing sweep, the engine protocol and the drivers listed, the parity check, the framing that renders each prompt once, the gates that read every run after it ends and void a level that breaks one of our rules, and the seeded tag each request opens with, the same on every server, so that no prompt cache can answer one request from another's. They are a reading set, not a program you can run: they import modules this kit does not carry (`pen.py`, `prereg.py`, `seat.py`, `seatlib.py`, `servelines.py`)."
    },
    {
      "file": "kit/client/gates.py",
      "bytes": 13658,
      "sha256": "4565956a74c76470047a5b49091ad5bfdc4d3be492bd48154b1ddb2f5e3a9d05",
      "role": "Client modules from the harness that drove the servers: the timing sweep, the engine protocol and the drivers listed, the parity check, the framing that renders each prompt once, the gates that read every run after it ends and void a level that breaks one of our rules, and the seeded tag each request opens with, the same on every server, so that no prompt cache can answer one request from another's. They are a reading set, not a program you can run: they import modules this kit does not carry (`pen.py`, `prereg.py`, `seat.py`, `seatlib.py`, `servelines.py`)."
    },
    {
      "file": "kit/client/nonces.py",
      "bytes": 5878,
      "sha256": "8e0e57b6cc8c995f9683692435f5303e08cf29b326edecc421c8fc3bb0964dc2",
      "role": "Client modules from the harness that drove the servers: the timing sweep, the engine protocol and the drivers listed, the parity check, the framing that renders each prompt once, the gates that read every run after it ends and void a level that breaks one of our rules, and the seeded tag each request opens with, the same on every server, so that no prompt cache can answer one request from another's. They are a reading set, not a program you can run: they import modules this kit does not carry (`pen.py`, `prereg.py`, `seat.py`, `seatlib.py`, `servelines.py`)."
    },
    {
      "file": "kit/client/parity.py",
      "bytes": 7969,
      "sha256": "83600c11153b293d86a16d592804ffcf13965fe4c7c68000f2aa548d9d89b1bd",
      "role": "Client modules from the harness that drove the servers: the timing sweep, the engine protocol and the drivers listed, the parity check, the framing that renders each prompt once, the gates that read every run after it ends and void a level that breaks one of our rules, and the seeded tag each request opens with, the same on every server, so that no prompt cache can answer one request from another's. They are a reading set, not a program you can run: they import modules this kit does not carry (`pen.py`, `prereg.py`, `seat.py`, `seatlib.py`, `servelines.py`)."
    },
    {
      "file": "kit/prompts/MANIFEST.json",
      "bytes": 3044,
      "sha256": "d6459064af474606306cfc027566bdcd64d011e4f9cc2fda903eb7297b7c1bd3",
      "role": "The frozen prompts the bench sent, byte for byte, arm P's questions and the frame each prompt was rendered with, and the manifest that names each prompt and its sha256."
    },
    {
      "file": "kit/prompts/frame/gemma4-canonical.json",
      "bytes": 1133,
      "sha256": "eb7d0f01fe4ab7a2112eabdcc0a79be7238ef8d1c62b11d00b2392f4a8f821a5",
      "role": "The frozen prompts the bench sent, byte for byte, arm P's questions and the frame each prompt was rendered with, and the manifest that names each prompt and its sha256."
    },
    {
      "file": "kit/prompts/long-prefill.txt",
      "bytes": 10364,
      "sha256": "36606657df453a20ee2aa9f64d0e395fd8f392ee08935f1e92d0feefe8a949e1",
      "role": "The frozen prompts the bench sent, byte for byte, arm P's questions and the frame each prompt was rendered with, and the manifest that names each prompt and its sha256."
    },
    {
      "file": "kit/prompts/long-write.txt",
      "bytes": 10618,
      "sha256": "e7fb0b295f6de90744d01abceec0e2273f80a4c4a1ddb32df493203952d9f3db",
      "role": "The frozen prompts the bench sent, byte for byte, arm P's questions and the frame each prompt was rendered with, and the manifest that names each prompt and its sha256."
    },
    {
      "file": "kit/prompts/prefix-questions.json",
      "bytes": 1675,
      "sha256": "301683c98bd7b52be34c1149838bf5493a8d37a0a22a3d95d9a9382bc166928e",
      "role": "The frozen prompts the bench sent, byte for byte, arm P's questions and the frame each prompt was rendered with, and the manifest that names each prompt and its sha256."
    },
    {
      "file": "kit/prompts/series-p512.txt",
      "bytes": 2101,
      "sha256": "90eedd0c53f9554ae3837674504fcb7090013d9a432a653352183c0f25a7ce5c",
      "role": "The frozen prompts the bench sent, byte for byte, arm P's questions and the frame each prompt was rendered with, and the manifest that names each prompt and its sha256."
    },
    {
      "file": "kit/prompts/short-chat.txt",
      "bytes": 300,
      "sha256": "b4f02741465c99256b4f20eb675efab4e450c9994868d667c58a25d126ce9cd6",
      "role": "The frozen prompts the bench sent, byte for byte, arm P's questions and the frame each prompt was rendered with, and the manifest that names each prompt and its sha256."
    },
    {
      "file": "kit/records/C-RESULTS.md",
      "bytes": 20140,
      "sha256": "b94d6cef455debe79e722d6a15b070ae18f46d1e7a53eb009ebb6d103fa1f083",
      "role": "The results files of the arms they name, as the bench wrote them after each run, apart from the digests withheld in them."
    },
    {
      "file": "kit/records/D-2026-09-30-RESULTS.md",
      "bytes": 23889,
      "sha256": "900ea9dced15a2158f92d68034ba4ec228a6b3a57a4533593b8b8578eae84439",
      "role": "The results files of the arms they name, as the bench wrote them after each run, apart from the digests withheld in them."
    },
    {
      "file": "kit/records/P-RESULTS.md",
      "bytes": 11951,
      "sha256": "886d8ff18fc6abfac877a43a04d7aaa7d164a720c7c28b7b73c41e15d6aef8ee",
      "role": "The results files of the arms they name, as the bench wrote them after each run, apart from the digests withheld in them."
    },
    {
      "file": "kit/rows/A/A.routes-cut.json",
      "bytes": 1920,
      "sha256": "98eb1569c3625955a71a12b6ca010e2159726d2b3d89da46f6f78dec999f593f",
      "role": "Arm A's census, cut to the twelve route rows the page prints, in the page's order and labelled as a cut. The rest of arm A's census is withheld whole, by ruling."
    },
    {
      "file": "kit/rows/C/C.power.csv",
      "bytes": 923638,
      "sha256": "daab6b0a88455d66c95ceabed609382bb438e309d441bf93743605de8276f279",
      "role": "For arms D (both runs), C, P and Q: each run's board readings at 2 Hz and its token-ID parity check, the check that stops a run whose prompts the two servers turned into different token IDs; for arms D, C and P, the `RECEIPT` line each run printed."
    },
    {
      "file": "kit/rows/C/RECEIPT",
      "bytes": 367,
      "sha256": "fc88be6318fd20bdddff63a13e217227883ed8a3fb00cb069944f05a58c5bee3",
      "role": "For arms D (both runs), C, P and Q: each run's board readings at 2 Hz and its token-ID parity check, the check that stops a run whose prompts the two servers turned into different token IDs; for arms D, C and P, the `RECEIPT` line each run printed."
    },
    {
      "file": "kit/rows/C/parity.json",
      "bytes": 36432,
      "sha256": "7742ee04c1ce7745ee83319b41cdd90209fdae08c56d2c77fce3e3772588e8ac",
      "role": "For arms D (both runs), C, P and Q: each run's board readings at 2 Hz and its token-ID parity check, the check that stops a run whose prompts the two servers turned into different token IDs; for arms D, C and P, the `RECEIPT` line each run printed."
    },
    {
      "file": "kit/rows/D-2026-09-28/D.power.csv",
      "bytes": 81426,
      "sha256": "e9bf2d78408448269e6b91b7339bb9f1a9af76971a55c9e5005aa83b0136324b",
      "role": "For arms D (both runs), C, P and Q: each run's board readings at 2 Hz and its token-ID parity check, the check that stops a run whose prompts the two servers turned into different token IDs; for arms D, C and P, the `RECEIPT` line each run printed."
    },
    {
      "file": "kit/rows/D-2026-09-28/RECEIPT",
      "bytes": 355,
      "sha256": "12fb654457e5dda243570994f3f7b4773cdfdd8e354e9c4da70149f011f5e7e5",
      "role": "For arms D (both runs), C, P and Q: each run's board readings at 2 Hz and its token-ID parity check, the check that stops a run whose prompts the two servers turned into different token IDs; for arms D, C and P, the `RECEIPT` line each run printed."
    },
    {
      "file": "kit/rows/D-2026-09-28/parity.json",
      "bytes": 112770,
      "sha256": "83c43ef5592a559556a9aaae33778b7fc5c4b86a5b6badb229fb5836e6b7297e",
      "role": "For arms D (both runs), C, P and Q: each run's board readings at 2 Hz and its token-ID parity check, the check that stops a run whose prompts the two servers turned into different token IDs; for arms D, C and P, the `RECEIPT` line each run printed."
    },
    {
      "file": "kit/rows/D-2026-09-30/D.power.csv",
      "bytes": 80758,
      "sha256": "dbcd47d2e5c934ac922fedb59a625dd7d14185f092aa22c5eaf40d1df5d7ad55",
      "role": "For arms D (both runs), C, P and Q: each run's board readings at 2 Hz and its token-ID parity check, the check that stops a run whose prompts the two servers turned into different token IDs; for arms D, C and P, the `RECEIPT` line each run printed."
    },
    {
      "file": "kit/rows/D-2026-09-30/RECEIPT",
      "bytes": 313,
      "sha256": "3cdfb4a59db31dbdc78b88c7feb30f231f48cd7c89e97aa73a6ba6aeeb84ca62",
      "role": "For arms D (both runs), C, P and Q: each run's board readings at 2 Hz and its token-ID parity check, the check that stops a run whose prompts the two servers turned into different token IDs; for arms D, C and P, the `RECEIPT` line each run printed."
    },
    {
      "file": "kit/rows/D-2026-09-30/parity.json",
      "bytes": 58376,
      "sha256": "3b0b9b436aaff34c3e76ee1f05040d26c799058b4a8bc81dbfeb3c24df6dcd9a",
      "role": "For arms D (both runs), C, P and Q: each run's board readings at 2 Hz and its token-ID parity check, the check that stops a run whose prompts the two servers turned into different token IDs; for arms D, C and P, the `RECEIPT` line each run printed."
    },
    {
      "file": "kit/rows/P/P.power.csv",
      "bytes": 559621,
      "sha256": "b5d48abab439294cf2eeba5587ec592d2d623be0b8ac412389da6b4ca6edc0c8",
      "role": "For arms D (both runs), C, P and Q: each run's board readings at 2 Hz and its token-ID parity check, the check that stops a run whose prompts the two servers turned into different token IDs; for arms D, C and P, the `RECEIPT` line each run printed."
    },
    {
      "file": "kit/rows/P/RECEIPT",
      "bytes": 259,
      "sha256": "98afb6dc7eeeb533217447a87454ada665878e931a4fa4aaaeb1b3f6476b5eb3",
      "role": "For arms D (both runs), C, P and Q: each run's board readings at 2 Hz and its token-ID parity check, the check that stops a run whose prompts the two servers turned into different token IDs; for arms D, C and P, the `RECEIPT` line each run printed."
    },
    {
      "file": "kit/rows/P/parity.json",
      "bytes": 12221,
      "sha256": "1f43cf52e1b0ce65f13a2914834f2701d14c451f681cedf9ac2c3b8018e92345",
      "role": "For arms D (both runs), C, P and Q: each run's board readings at 2 Hz and its token-ID parity check, the check that stops a run whose prompts the two servers turned into different token IDs; for arms D, C and P, the `RECEIPT` line each run printed."
    },
    {
      "file": "kit/rows/Q/Q.power.csv",
      "bytes": 48417,
      "sha256": "fe1988b299cbd244d28db27ada093c0e84eb58984bb703867779cb3e5ab7e867",
      "role": "For arms D (both runs), C, P and Q: each run's board readings at 2 Hz and its token-ID parity check, the check that stops a run whose prompts the two servers turned into different token IDs; for arms D, C and P, the `RECEIPT` line each run printed."
    },
    {
      "file": "kit/rows/Q/parity.json",
      "bytes": 12136,
      "sha256": "a35ad7aded53e3c7ed0ab1a06ad5fdb040bf126d89bd8e513e9bb4deeecfc9d4",
      "role": "For arms D (both runs), C, P and Q: each run's board readings at 2 Hz and its token-ID parity check, the check that stops a run whose prompts the two servers turned into different token IDs; for arms D, C and P, the `RECEIPT` line each run printed."
    },
    {
      "file": "kit/rows/S/ovv-s-20260928T1130Z-ollama-scored-board.csv",
      "bytes": 9735,
      "sha256": "36813013bdc659b85e873d12df45ba0dfa102dedb59e8febe5ec59c3fb3d6aa6",
      "role": "Arm S's rows for both servers, the harness's own output: every scored request's token counts, first-token wait, decode rate and the server's own timers where it reports them, with the board's power at 2 Hz beside them."
    },
    {
      "file": "kit/rows/S/ovv-s-20260928T1130Z-ollama-scored.jsonl",
      "bytes": 30440,
      "sha256": "8233204a8b5c6dbad2ec567136c21b0894a54d5c174a8ba0447c99423808944f",
      "role": "Arm S's rows for both servers, the harness's own output: every scored request's token counts, first-token wait, decode rate and the server's own timers where it reports them, with the board's power at 2 Hz beside them."
    },
    {
      "file": "kit/rows/S/ovv-s-20260928T1130Z-vllm-scored-board.csv",
      "bytes": 11604,
      "sha256": "a57a3cdeefe360a4789789172e3e2b4a29edbe16f49fae8d7e28604cbc3e5c33",
      "role": "Arm S's rows for both servers, the harness's own output: every scored request's token counts, first-token wait, decode rate and the server's own timers where it reports them, with the board's power at 2 Hz beside them."
    },
    {
      "file": "kit/rows/S/ovv-s-20260928T1130Z-vllm-scored.jsonl",
      "bytes": 28039,
      "sha256": "6534ab68b0f9e787489a1d1c79174363dc534f18b29f0fd9cf5f0f81237c83a4",
      "role": "Arm S's rows for both servers, the harness's own output: every scored request's token counts, first-token wait, decode rate and the server's own timers where it reports them, with the board's power at 2 Hz beside them."
    }
  ]
}
