{
  "source_file": "0930",
  "source_platform": "Dev.to",
  "author": "xbill",
  "title_listed": "Running a Jev-Style Decision Model on One TPU v6e: What Fits, What It Costs, and What Changes From a GPU",
  "keywords": "",
  "domain": "大模型算法",
  "content_type": "工程实践",
  "is_paid_flag": "否",
  "url": "https://dev.to/gde/running-a-jev-style-decision-model-on-one-tpu-v6e-what-fits-what-it-costs-and-what-changes-from-1j0g",
  "publish_date": "2026-09-24",
  "corpus_stage": "",
  "notes": "",
  "id": "24a18968dc35",
  "collected_at": "2026-10-02T13:51:12",
  "title": "Running a Jev-Style Decision Model on One TPU v6e: What Fits, What It Costs, and What Changes From a GPU - DEV Community",
  "body_markdown": "This article provides a step by step guide to running a Jev-style decision model on one Google Cloud TPU v6e chip with Gemma 4 and vLLM, and compares it with the same read on one NVIDIA L4 GPU. The measurement was pre-registered, and every per-item output is committed.\nOne v6e chip serves Gemma 4 E2B, E4B and 12B at bf16 and a 26B-A4B fp8 build; no 31B checkpoint loads. The same checkpoints give the same answers on the TPU and the L4, and the 26B decides in 27 to 33 ms against 61 ms on the L4. On demand, the TPU costs more per decision than the L4 or Jev; 12B is the size to pick.\nhttps://github.com/xbill9/gemma4-dev/tree/main/jev-tpu\nWhy Measure This?\nA Jev-style decision model answers a typed question with a probability for each allowed option: end the prompt where the answer starts, read the scores of the allowed label tokens, and apply a softmax over those. TypeSafe's Jev does this as a hosted service, and any open model can be read the same way.\nA\ncompanion article\nmeasured this read on one NVIDIA L4 and set it beside Jev's published results. This one asks what changes on a TPU: which Gemma 4 sizes fit one v6e chip, whether the read works the same way, and what the chip buys in speed and cost.\nAt This Point You Should Have…\nA Google Cloud project with v6e quota in a region that offers\nct6e-standard-1t\n, and the\ngcloud\nCLI logged in\nA Hugging Face token stored as the Secret Manager secret\nhf-token\n, readable by the Compute Engine default service account\nA Cloud Storage bucket for results, set as\nBUCKET\nin\ntpu/run.sh\nand\ntpu/startup.sh\nThe repository cloned:\ngit clone https://github.com/xbill9/gemma4-dev\nand\ncd gemma4-dev/jev-tpu\nStep 1 — Pre-Register the Measurement\nThe models, image, serving flags, data, metrics and the order of the quantized attempts are written down and committed before any model call, in\nPREREGISTRATION.md\n; each departure from it is recorded there with a date before the affected results are scored.\ngit show\n-s\n--oneline\ne0cce69 4937fb8\nEnter fullscreen mode\nExit fullscreen mode\ne0cce69 jev-tpu: sibling of jev for one TPU v6e chip — copied read, data, suite and scoring code (proxy byte-identical); pre-registration for E2B/E4B/12B bf16 and exploratory quantized 26B-A4B/31B probes\n4937fb8 jev-tpu: VM boot, serve and run drivers; pre-registration amended before any model call — suite built locally at 0e67403 (13/13 checksums) and re-checked on the VM\nEnter fullscreen mode\nExit fullscreen mode\nStep 2 — Pick Checkpoints That Fit One Chip\nOne v6e chip has 31.24 GiB of memory, of which vLLM uses up to 28.74 GiB:\nMemory statistics | total_hbm_limit_gb=31.24GiB | total_hbm_limit_cap_gb=28.74GiB | total_hbm_used_gb=24.56GiB | total_hbm_avail_gb=4.19GiB\nEnter fullscreen mode\nExit fullscreen mode\nE2B, E4B and 12B fit at bf16. The 26B-A4B and 31B do not, so the pre-registration lists quantized builds to try in order:\nSize\nCheckpoint\nFormat\nSize on disk\nE2B\ngoogle/gemma-4-E2B-it\nbf16\nE4B\ngoogle/gemma-4-E4B-it\nbf16\n12B\ngoogle/gemma-4-12B-it\nbf16\n26B-A4B\nRedHatAI/gemma-4-26B-A4B-it-FP8-dynamic\nfp8\n26.67 GiB\n31B\ngoogle/gemma-4-31B-it-qat-w4a16-ct\nw4a16\n21.67 GiB\n31B\ncyankiwi/gemma-4-31B-it-AWQ-4bit\n4-bit\n19.47 GiB\nThe 31B fp8 builds are 30.98 GiB, over the chip's usable memory, and were not tried.\nStep 3 — Launch One v6e Chip\nThe VM runs the whole measurement from its startup script, fetching the code and the suite from Cloud Storage, and deletes itself when the run ends.\ngcloud compute instances create jev-tpu-v6e1\n--zone\neurope-west4-a\n\\\n--machine-type\nct6e-standard-1t\n\\\n--image-family\nubuntu-accel-2204-amd64-tpu-v5e-v5p-v6e\n--image-project\nubuntu-os-accelerator-images\n\\\n--boot-disk-size\n200GB\n--scopes\ncloud-platform\n--maintenance-policy\nTERMINATE\n\\\n--provisioning-model\nSTANDARD\n--max-run-duration\n6h\n--instance-termination-action\nDELETE\n\\\n--metadata\njev-code\n=\n<code-tarball>,jev-run\n=\n2026-09-24-v6e1\n--metadata-from-file\nstartup-script\n=\ntpu/startup.sh\nEnter fullscreen mode\nExit fullscreen mode\nNAME          ZONE            MACHINE_TYPE      PREEMPTIBLE  INTERNAL_IP    EXTERNAL_IP    STATUS\njev-tpu-v6e1  europe-west4-a  ct6e-standard-1t               10.164.15.207  34.32.155.166  RUNNING\nEnter fullscreen mode\nExit fullscreen mode\n--scopes cloud-platform\nlets the VM read the Hugging Face token from Secret Manager at boot, so the token never enters instance metadata.\nStep 4 — Serve Each Model\ntpu/serve.sh\nstarts one model at a time with the same flags for every arm and waits for\n/v1/models\n. Abridged, with the token and volume options left out:\ndocker run\n-d\n--name\nvllm\n--privileged\n--net\n=\nhost\n--shm-size\n10gb vllm/vllm-tpu:nightly\n\\\nvllm serve google/gemma-4-12B-it\n--tensor-parallel-size\n1\n--max-model-len\n2048\n--max-num-seqs\n16\n\\\n--max-logprobs\n32\n--generation-config\nvllm\n--limit-mm-per-prompt\n'{\"image\":0,\"audio\":0}'\n--enable-prefix-caching\nEnter fullscreen mode\nExit fullscreen mode\n[jev-run 2026-09-24T14:42:48Z] READY google/gemma-4-E2B-it after 346s\n[jev-run 2026-09-24T14:51:34Z] READY google/gemma-4-E4B-it after 421s\n[jev-run 2026-09-24T15:02:01Z] READY google/gemma-4-12B-it after 512s\n[jev-run 2026-09-24T15:14:59Z] READY RedHatAI/gemma-4-26B-A4B-it-FP8-dynamic after 616s\nEnter fullscreen mode\nExit fullscreen mode\nThe image was\nvllm/vllm-tpu@sha256:19a1a0526476f902eb83e1057f3d8938f35b457dd7716a30e9ab4f7bee90d507\n, vLLM\n0.29.1rc1.dev468+g0b7f11a1e\n. On v6e it stores the KV cache in fp8 by default for every model:\nINFO 09-24 14:53:37 [tpu_platform.py:232] Automatically using fp8_e5m2 for FP8 KV cache on TPU v6e.\nEnter fullscreen mode\nExit fullscreen mode\nSo \"bf16\" below describes the weights. The L4 run kept the default 16-bit KV cache.\nStep 5 — Read the Labels Out of the Top 32\nOn a GPU, the read asks vLLM for the log-probabilities of the label tokens by id. vLLM's TPU backend returns only the top-k log-probabilities, and a request for specific token ids fails. Four request shapes are sent before each model's reads, and the answers are kept:\n== probe 3: {\"prompt\":[2,106,1645,108],\"max_tokens\":1,\"temperature\":0,\"logprobs\":32,\"return_tokens_as_token_ids\":true}\n{\"id\":\"cmpl-9ee6dc5f0461280b\",\"object\":\"text_completion\", ...\n== probe 4: {\"prompt\":[2,106,1645,108],\"max_tokens\":1,\"temperature\":0,\"logprobs\":5,\"logprob_token_ids\":[236776,236799,236780],\"return_tokens_as_token_ids\":true}\n{\"error\":{\"message\":\"list index out of range\",\"type\":\"InternalServerError\",\"param\":null,\"code\":500}}\nEnter fullscreen mode\nExit fullscreen mode\nSo the read asks for the top 32 log-probabilities (\nJEV_TOPK=32\n) and takes the label tokens from them. A label inside the 32 gets its exact log-probability; a label outside gets the proxy's fallback value, the lowest returned log-probability minus 5, and every four-task record keeps how many labels came back.\nStep 6 — Run and Score\nEach model gets a five-example smoke read, the four tasks (300 examples each from sst2, AG News, DAIR Emotion and tweet_eval irony), the three choice tasks with their options reversed, a latency pass at one request at a time, and Bespoke Labs' 3,880-record public suite, rebuilt with Nimble's converters and checked against all 13 published checksums on the VM.\n[jev-run 2026-09-24T14:36:51Z] suite: 13 of 13 subsets match\n[jev-run 2026-09-24T15:02:42Z] 12b four tasks: 23s for 1200 decisions at concurrency 8\n[jev-run 2026-09-24T15:04:25Z] 12b suite: 60s for 3880 records\nEnter fullscreen mode\nExit fullscreen mode\npython3 sweep_score.py\n--prefix\n2026-09-24-v6e1\n--arms\ne2b e4b 12b 26b-fp8\npython3 nimble_suite/suite_sweep.py\n--prefix\n2026-09-24-v6e1\n--arms\ne2b e4b 12b 26b-fp8\nEnter fullscreen mode\nExit fullscreen mode\nBoth write their tables into\nresults/\n, and every figure below comes from those files and\narticle_figures.py\n.\nWhat Fits and Loads on One v6e Chip?\nSize\nCheckpoint\nServes\nTime to serve\nE2B\nbf16\nyes\n346 s\nE4B\nbf16\nyes\n421 s\n12B\nbf16\nyes\n512 s\n26B-A4B\nfp8, 26.67 GiB\nyes\n616 s\n31B\nw4a16, 21.67 GiB\nno\nfails at 120 s\n31B\n4-bit, 19.47 GiB\nno\nfails at 120 s\nBoth 31B builds stop with the same error:\nNotImplementedError: compressed-tensors scheme for layer 'model.language_model.layers.0.self_attn.q_proj' is not yet supported in the JAX path.\nEnter fullscreen mode\nExit fullscreen mode\nGemma 4 runs only on the JAX path of vLLM's TPU backend, which loads fp8 but no 4-bit format for a dense model. The one 31B format it loads is 30.98 GiB, over one chip's usable memory.\nDoes the TPU Change the Answers?\nNo. E2B and E4B were also read on the L4, with the same checkpoints and prompts. The predicted label matched on 1,186 and 1,193 of 1,200 examples, and accuracy per task differed by at most 1.0 and 0.4 points. The 26B-A4B fp8 build here and the 4-bit AWQ build on the L4 are different quantizations of the same model and differ by at most 1.3 points per task and 0.7 points on the suite.\nTask\nMajority\nE2B\nE4B\n12B\n26B-A4B fp8\nsst2\n51.0%\n88.7%\n94.0%\n95.0%\n94.7%\nAG News\n25.0%\n30.0%\n83.3%\n86.3%\n86.0%\nDAIR Emotion\n35.0%\n53.3%\n54.3%\n59.3%\n58.3%\ntweet_eval irony\n60.3%\n73.7%\n84.0%\n84.7%\n91.0%\nPer-task calibration, option-order changes and 90th-percentile times are in\nresults/2026-09-24-v6e1-SWEEP.md\n.\nHow Do the Sizes Compare With Jev?\nThe Jev comparison is the\nL4 article's\nsubject, with its caveats in full. On the same 3,880 public records:\nQuestions\nJev 1.13.0, published\n26B-A4B fp8\n12B\nE4B\nE2B\nAll, 3,880\n77.3%\n76.0%\n76.2%\n72.8%\n68.5%\nYes/no, 1,399\n84.6%\n84.2%\n85.1%\n81.5%\n76.2%\nMultiple choice, 1,848\n82.8%\n79.7%\n78.1%\n74.5%\n70.8%\nFive-level rating, 633\n45.2%\n47.4%\n51.0%\n48.5%\n44.9%\nMedian ECE after 50 labels (Jev 0.071 as shipped)\n0.070\n0.070\n0.077\n0.092\nJev leads 12B by 1.1 points overall (95% range −0.8 to +3.0) and 26B-A4B by 1.3 (−0.6 to +3.2), and on multiple choice by 4.7 and 3.2. The L4's 4-bit 26B scored 75.3%, 2.1 points behind with a range from 0.2 to 4.0, so read the 26B as one to two points behind Jev on either platform. Jev's per-record answers are unpublished, so these ranges compare two independent proportions, and records that share a passage widen them. Gemma was read in the PR proxy's prompt format with no tuning; a different prompt could move the multiple-choice gap in either direction.\nDid the Top-32 Read Lose Anything?\nNot on accuracy. At least one label came back on every four-task read, so the predicted label is exact; only the probabilities of labels outside the 32 are approximate.\nOn the four tasks, moving every missing label from the fallback value to the top-32 bound, the most probability it could have had, changes raw ECE by less than 0.001 and ECE after 50 labels by at most 0.005. That check was added after the run. The suite records do not keep how many labels came back, so the suite calibration figures have no such check; by a lower-bound count, at least 10.2% of 12B's suite records and 17.8% of 26B-A4B's used the fallback value.\nThe share of probability on the allowed labels varies too. On irony, 12B's most likely token was a label on 5 of 300 reads, with a median of 3.1% of its probability on the two labels; 26B-A4B's was a label on 161 of 300 AG News reads, with a median of 55.2%. The read rescales the labels to sum to one, so the answer reads as confident either way, and\nlabel_mass\nin every record shows it.\nTPU v6e Against the L4\nOne TPU v6e chip\nOne NVIDIA L4 (\ng6.xlarge\n)\nMemory for the model\n🥇 28.74 GiB\n23034 MiB\nLargest Gemma 4 read here\n12B at bf16, 26B-A4B at fp8\n26B-A4B at 4-bit\nAccuracy, same checkpoint\nsame answers on 1,186 to 1,193 of 1,200\nsame\n26B time per decision, one at a time\n🥇 27 to 33 ms\n61 ms\nPrice per hour, on demand\n$2.97\n🥇 $0.8048\n26B cost per million decisions, on demand\n$10.37\n🥇 at most $5.43\nLabel read\ntop 32 log-probabilities\n🥇 exact label token ids\nKV cache\nfp8 by default\n🥇 16-bit\nIn this table 🥇 marks the better value. The 26B decides 1.8 to 2.2 times faster on the TPU. The chip costs 3.7 times as much per hour on demand, or 1.7 times at the flex-start price of $1.35, a mode that had no capacity during this run. The L4's cost comes from its first run's throughput with the client on a home connection, so it is an upper bound; the TPU's comes from the request times at eight in flight.\n🔎 Tip: Serve the Same Checkpoint on Both Platforms First\nBefore comparing hardware, serve one checkpoint on both with the same prompts and compare predicted labels record by record. It checks the whole read, from chat template to label tokens; here the TPU's top-32 read and the L4's exact read agreed on 1,186 and 1,193 of 1,200 answers.\nSo, Which One?\nFor a Jev-style decision service on a TPU, Gemma 4 12B at bf16 plus one temperature fitted on about 50 labels. It matches the 26B on the suite, 76.2% against 76.0%, though the 26B scores 6.3 points higher on irony; it reaches a median ECE of 0.070 after fitting, decides in 26 to 27 ms, and needs no third-party quantized checkpoint. Check\nlabel_mass\non your own task first: on irony, 12B put a median of 3.1% of its probability on the labels.\nChoose the TPU when time per decision matters or the rest of the stack is already on Google Cloud: it halves the 26B's time per decision against the L4. Choose the L4, or Jev itself, when cost per decision matters: on demand, 12B on one v6e chip costs $8.19 per million decisions, against Jev's $5.54 and at most $5.43 for the 26B on an L4.\nWhat Does It Cost?\nMeasured from the request times at eight in flight, one v6e chip answers about 274 decisions a second with E2B, 206 with E4B, 101 with 12B and 80 with 26B-A4B. At the europe-west4 on-demand price of $2.97 an hour that is $3.01, $4.00, $8.19 and $10.37 per million decisions; at the flex-start price of $1.35, $1.37, $1.82, $3.72 and $4.71. TypeSafe prices Jev at $5.54 per million decisions at the L4 run's median prompt of 132 tokens. The chip is charged by the hour whether busy or idle, and eight requests in flight is below the 16 the server allows, so these figures hold only while the chip is kept at least this busy.\nThe measured run took 48 minutes of on-demand time, $2.39, and all instance time for the measurement came to at most $3.25.\nTeardown\nThe VM deletes itself when\ntpu/run.sh\nfinishes, and\n--max-run-duration 6h\nwith\n--instance-termination-action DELETE\nis the backstop. Confirm it is gone:\ngcloud compute instances describe jev-tpu-v6e1\n--zone\neurope-west4-a\nEnter fullscreen mode\nExit fullscreen mode\nERROR: (gcloud.compute.instances.describe) Could not fetch resource:\n - The resource 'projects/aisprint-491218/zones/europe-west4-a/instances/jev-tpu-v6e1' was not found\nEnter fullscreen mode\nExit fullscreen mode\nSummary\nThe goal of this article was to run a Jev-style decision model on one TPU v6e chip with Gemma 4 and find what changes from a GPU. The key to the solution was the same prompts, labels and scoring as the L4 run, a pre-registered design, and a label read taken from the top 32 log-probabilities. The results were:\n🟢 One v6e chip serves Gemma 4 E2B, E4B and 12B at bf16 and a 26B-A4B fp8 build\n❌ No 31B checkpoint loads: the w4a16 and 4-bit builds fail on the JAX path, and the fp8 build is 30.98 GiB\n🟢 The same checkpoints give the same answers on the TPU and the L4: 1,186 and 1,193 of 1,200\n🟢 The 26B decides in 27 to 33 ms on the TPU against 61 ms on the L4\n⚠️ On demand, 26B costs $10.37 per million decisions on the TPU against at most $5.43 on the L4 and $5.54 for Jev\n⚠️ vLLM on TPU returns only the top-k log-probabilities; reading labels from the top 32 changes no answer, and changes four-task calibration by at most 0.005\n🟢 12B matches the 26B: 76.2% and 76.0% on the 3,880-record suite, against Jev's 77.3%\n🟢 After 50 labels, 12B and 26B-A4B reach a median ECE of 0.070, against Jev's 0.071 as shipped\n🟢 The whole measurement cost at most $3.25 of instance time\nScope: one TPU v6e chip (\nct6e-standard-1t\n, on demand) in europe-west4-a, vLLM\n0.29.1rc1.dev468+g0b7f11a1e\nat the image digest above, E2B, E4B and 12B with bf16 weights and 26B-A4B through RedHatAI's fp8 build, every model with vLLM's default fp8 KV cache on v6e,\n--max-model-len 2048\n, one run per model, 300 examples per task plus the 3,880-record public suite, client on the VM. The top-32 read and on-demand capacity are dated deviations from the pre-registration, and the top-32 bound check, added after the run, covers the four tasks only. L4 figures come from the companion run on a\ng6.xlarge\nand\ng6.4xlarge\nin us-east-1, and the two platforms were timed with different clients. Every source dataset was published before Gemma 4 and may be in its training data. No Jev call was made: the Jev figures are Bespoke Labs' published results on the same records, from one run of Jev 1.13.0 by a company that sells a competing model, counting an invalid Jev response as wrong, with Jev's probabilities rounded to two decimals by its API. Parts of the analysis and writing were done with AI assistance (Claude); every figure comes from the committed output files.\nThe strategy for running a Jev-style decision model on TPU with Gemma 4 was validated with an incremental step by step approach.\nReferences\nCode, pre-registration and per-item results:\nhttps://github.com/xbill9/gemma4-dev/tree/main/jev-tpu\nCompanion L4 measurement:\nhttps://dev.to/gde/plain-gemma-4-26b-vs-jev-on-one-ec2-l4-21-points-behind-overall-level-on-yesno-45-behind-on-15k6\nCompanion review of the independent evidence on Jev:\nhttps://dev.to/gde/jev-after-eight-days-of-independent-tests-level-with-mid-price-llms-behind-the-frontier-1kln\nvLLM TPU documentation:\nhttps://docs.vllm.ai/projects/tpu/en/latest/\ntpu-inference:\nhttps://github.com/vllm-project/tpu-inference\n26B-A4B fp8 checkpoint:\nhttps://huggingface.co/RedHatAI/gemma-4-26B-A4B-it-FP8-dynamic\nGemma 4 12B:\nhttps://huggingface.co/google/gemma-4-12B-it\nBespoke Labs, public-suite results for Jev 1.13.0:\nhttps://github.com/bespokelabsai/nimble/blob/0e67403/docs/PUBLIC_BENCHMARKS.md\nCloud TPU v6e:\nhttps://cloud.google.com/tpu/docs/v6e\nGuo et al., On Calibration of Modern Neural Networks:\nhttps://arxiv.org/abs/1706.04599",
  "metadata": {
    "title": "Running a Jev-Style Decision Model on One TPU v6e: What Fits, What It Costs, and What Changes From a GPU - DEV Community",
    "description": "Gemma 4 E2B, E4B, 12B and a 26B-A4B fp8 build read by their label probabilities with vLLM on one TPU v6e chip, checked against the same read on an NVIDIA L4 and against Jev 1.13.0's published results. What fits one chip, how to read labels when vLLM on TPU returns only the top 32 log-probabilities, speed, cost, and why no 31B loads today. Tagged with gemma, googlecloud, machinelearning, llm.",
    "keywords": "gemma, googlecloud, machinelearning, llm, software, coding, development, engineering, inclusive, community",
    "author": null,
    "og:type": "article",
    "og:url": "https://dev.to/gde/running-a-jev-style-decision-model-on-one-tpu-v6e-what-fits-what-it-costs-and-what-changes-from-1j0g",
    "og:title": "Running a Jev-Style Decision Model on One TPU v6e: What Fits, What It Costs, and What Changes From a GPU",
    "og:description": "Gemma 4 E2B, E4B, 12B and a 26B-A4B fp8 build read by their label probabilities with vLLM on one TPU v6e chip, checked against the same read on an NVIDIA L4 and against Jev 1.13.0's published results. What fits one chip, how to read labels when vLLM on TPU returns only the top 32 log-probabilities, speed, cost, and why no 31B loads today.",
    "og:site_name": "DEV Community",
    "og:image": "https://media2.dev.to/dynamic/image/width=1200,height=627,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fxbill9%2Fgemma4-dev%2Fmain%2Fjev-tpu%2Fdevto-jev-tpu-v6e1-cover.6a93fef0.jpg",
    "twitter:site": "@thepracticaldev",
    "twitter:creator": "@",
    "twitter:title": "Running a Jev-Style Decision Model on One TPU v6e: What Fits, What It Costs, and What Changes From a GPU",
    "twitter:description": "Gemma 4 E2B, E4B, 12B and a 26B-A4B fp8 build read by their label probabilities with vLLM on one TPU v6e chip, checked against the same read on an NVIDIA L4 and against Jev 1.13.0's published results. What fits one chip, how to read labels when vLLM on TPU returns only the top 32 log-probabilities, speed, cost, and why no 31B loads today.",
    "twitter:card": "summary_large_image",
    "twitter:widgets:new-embed-design": "on",
    "twitter:image:src": "https://media2.dev.to/dynamic/image/width=1200,height=627,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fxbill9%2Fgemma4-dev%2Fmain%2Fjev-tpu%2Fdevto-jev-tpu-v6e1-cover.6a93fef0.jpg"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [
    {
      "file": "attachments/24a18968dc35/code/body-000.txt",
      "chars": 38,
      "language": "text"
    },
    {
      "file": "attachments/24a18968dc35/code/body-001.txt",
      "chars": 376,
      "language": "text"
    },
    {
      "file": "attachments/24a18968dc35/code/body-002.txt",
      "chars": 140,
      "language": "text"
    },
    {
      "file": "attachments/24a18968dc35/code/body-003.txt",
      "chars": 496,
      "language": "text"
    },
    {
      "file": "attachments/24a18968dc35/code/body-004.txt",
      "chars": 197,
      "language": "text"
    },
    {
      "file": "attachments/24a18968dc35/code/body-005.txt",
      "chars": 306,
      "language": "text"
    },
    {
      "file": "attachments/24a18968dc35/code/body-006.txt",
      "chars": 298,
      "language": "text"
    },
    {
      "file": "attachments/24a18968dc35/code/body-007.txt",
      "chars": 100,
      "language": "text"
    },
    {
      "file": "attachments/24a18968dc35/code/body-008.txt",
      "chars": 443,
      "language": "text"
    },
    {
      "file": "attachments/24a18968dc35/code/body-009.txt",
      "chars": 211,
      "language": "text"
    },
    {
      "file": "attachments/24a18968dc35/code/body-010.txt",
      "chars": 163,
      "language": "text"
    },
    {
      "file": "attachments/24a18968dc35/code/body-011.txt",
      "chars": 144,
      "language": "text"
    },
    {
      "file": "attachments/24a18968dc35/code/body-012.txt",
      "chars": 69,
      "language": "text"
    },
    {
      "file": "attachments/24a18968dc35/code/body-013.txt",
      "chars": 170,
      "language": "text"
    }
  ],
  "images": [],
  "audio": [],
  "videos": [],
  "links": [
    {
      "href": "https://github.com/xbill9/gemma4-dev/tree/main/jev-tpu",
      "label": "https://github.com/xbill9/gemma4-dev/tree/main/jev-tpu",
      "type": "a"
    },
    {
      "href": "https://dev.to/gde/plain-gemma-4-26b-vs-jev-on-one-ec2-l4-21-points-behind-overall-level-on-yesno-45-behind-on-15k6",
      "label": "companion article",
      "type": "a"
    },
    {
      "href": "https://dev.to/gde/jev-after-eight-days-of-independent-tests-level-with-mid-price-llms-behind-the-frontier-1kln",
      "label": "https://dev.to/gde/jev-after-eight-days-of-independent-tests-level-with-mid-price-llms-behind-the-frontier-1kln",
      "type": "a"
    },
    {
      "href": "https://docs.vllm.ai/projects/tpu/en/latest/",
      "label": "https://docs.vllm.ai/projects/tpu/en/latest/",
      "type": "a"
    },
    {
      "href": "https://github.com/vllm-project/tpu-inference",
      "label": "https://github.com/vllm-project/tpu-inference",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/RedHatAI/gemma-4-26B-A4B-it-FP8-dynamic",
      "label": "https://huggingface.co/RedHatAI/gemma-4-26B-A4B-it-FP8-dynamic",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/google/gemma-4-12B-it",
      "label": "https://huggingface.co/google/gemma-4-12B-it",
      "type": "a"
    },
    {
      "href": "https://github.com/bespokelabsai/nimble/blob/0e67403/docs/PUBLIC_BENCHMARKS.md",
      "label": "https://github.com/bespokelabsai/nimble/blob/0e67403/docs/PUBLIC_BENCHMARKS.md",
      "type": "a"
    },
    {
      "href": "https://cloud.google.com/tpu/docs/v6e",
      "label": "https://cloud.google.com/tpu/docs/v6e",
      "type": "a"
    },
    {
      "href": "https://arxiv.org/abs/1706.04599",
      "label": "https://arxiv.org/abs/1706.04599",
      "type": "a"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-14T10:48:24Z",
  "source_url": "https://dev.to/gde/running-a-jev-style-decision-model-on-one-tpu-v6e-what-fits-what-it-costs-and-what-changes-from-1j0g",
  "papers": [
    {
      "status": "ok",
      "url": "https://arxiv.org/pdf/1706.04599",
      "bytes": 1349691,
      "reused": false,
      "local_path": "papers/repair/4f4f470ce76b55bd8bc5.pdf"
    }
  ],
  "actual_video_files": [],
  "body_chars": 17938,
  "expected_body_images": 0,
  "discovery_status": "ok",
  "delivery_status": "ok",
  "missing_reason": "",
  "raw_html": "attachments/24a18968dc35/pages/source.html",
  "local_html": "attachments/24a18968dc35/pages/article.html",
  "body_base_path": "attachments/24a18968dc35/pages/",
  "body_markdown_path": "attachments/24a18968dc35/pages/article.md"
}