{
  "source_file": "0930",
  "source_platform": "Dev.to",
  "author": "xbill",
  "title_listed": "Gemma 4 on Amazon SageMaker: QAT Weights Decode 2.05x Faster Than bf16 on One L4",
  "keywords": "",
  "domain": "大模型算法",
  "content_type": "工程实践",
  "is_paid_flag": "否",
  "url": "https://dev.to/aws-builders/gemma-4-on-amazon-sagemaker-qat-weights-decode-205x-faster-than-bf16-on-one-l4-318m",
  "publish_date": "2026-09-25",
  "corpus_stage": "",
  "notes": "",
  "id": "e7334355fda0",
  "collected_at": "2026-10-02T13:51:10",
  "title": "Gemma 4 on Amazon SageMaker: QAT Weights Decode 2.05x Faster Than bf16 on One L4 - DEV Community",
  "body_markdown": "This article gives a short background on Amazon SageMaker real-time endpoints, then measures Gemma 4 E2B's quantization-aware trained (QAT) checkpoint against the full-size bf16 release on the same NVIDIA L4 endpoint. A suite of Python MCP tools is built to simplify management of the vLLM hosted deployment.\nhttps://github.com/xbill9/sagemaker-gemma\nModels\ngoogle/gemma-4-E2B-it\n(bf16) and\ngoogle/gemma-4-E2B-it-qat-w4a16-ct\n(QAT, 4-bit weights)\nHardware\nSageMaker\nml.g6.xlarge\n, 1x NVIDIA L4, 24 GB\nRegion\nus-east-2\nSoftware\nAWS vLLM SageMaker container, vLLM 0.30.0\nResult\nQAT decodes at\n105.1 tok/s\nagainst\n51.3\n, and serves\n1077.25 tok/s\nat 16 parallel requests against\n619.1\n, with the same score on 40 checked questions\nSageMaker Hosting in Five Minutes\nSageMaker real-time inference is three objects, created in order:\nObject\nWhat it holds\nModel\nA container image, its environment variables, and an IAM role\nEndpoint config\nWhich model runs on which instance types, and how many instances\nEndpoint\nThe running HTTPS service, billed per instance-hour while it exists\nRequests go through\naws sagemaker-runtime invoke-endpoint\n, signed with your AWS credentials. SageMaker health-checks the container, routes traffic to it and writes its log to CloudWatch under\n/aws/sagemaker/Endpoints/<name>\n.\nThe container here is the vLLM build AWS publishes for SageMaker. It reads vLLM settings from\nSM_VLLM_\nenvironment variables, downloads the model from Hugging Face at start-up, and accepts OpenAI-style chat bodies. Switching checkpoints is one variable:\nSM_VLLM_MODEL\n.\nSageMaker JumpStart also lists Gemma 4 as ready-made packages:\naws sagemaker list-hub-contents\n--hub-name\nSageMakerPublicHub\n--hub-content-type\nModel\n\\\n--query\n\"HubContentSummaries[].HubContentName\"\n--output\ntext |\ntr\n'\\t'\n'\\n'\n|\ngrep\ngemma-4\nEnter fullscreen mode\nExit fullscreen mode\nhuggingface-llm-gemma-4-31b-it-nvfp4\nhuggingface-vlm-gemma-4-12b-it\nhuggingface-vlm-gemma-4-26b-a4b-it\nhuggingface-vlm-gemma-4-31b-it\nhuggingface-vlm-gemma-4-31b-it-fp8-block\nhuggingface-vlm-gemma-4-e2b-instruct\nhuggingface-vlm-gemma-4-e4b-it\nEnter fullscreen mode\nExit fullscreen mode\nNone of the seven is a Google QAT checkpoint, so this comparison uses the vLLM container with a Hugging Face model ID.\nThree account limits shape every deployment:\nQuota\nis per instance type, per region, counted in instances. This account holds 1 for each single-L4 type in\nus-east-1\n,\nus-east-2\nand\nus-west-2\n.\nCapacity\nis separate.\nus-east-1\nand\nus-west-2\neach left an L4 request in\nCreating\nfor about 30 minutes and then returned\nInsufficientInstanceCapacity\n.\nus-east-2\nplaced one within minutes every time it was asked.\nA fallback list\n(\nInstancePools\nin the endpoint config) holds quota for every type in it, so two endpoints cannot share one region's single-L4 quota.\nWith one L4 per region to work with, the two checkpoints ran one after the other on the same instance type in the same region.\nWhere Do I Start?\nThe deployment itself, from quota check to teardown with the aws CLI and the MCP server, is the first article in this pair:\nhttps://dev.to/aws-builders/gemma-4-on-an-amazon-sagemaker-endpoint-aws-cli-nvidia-l4-and-an-mcp-server-2c9d\nThis article starts from a working endpoint and changes one thing: the checkpoint.\nAt This Point You Should Have…\nThe repository above, with\naws login\ndone and\nmcp\n2.x installed\nA SageMaker quota of at least 1 for\nml.g6.xlarge\nin a region with L4 capacity\nThe full-size endpoint from the first article deployed as\ngemma-4-e2b\nWhat QAT Changes\nGoogle trains the QAT checkpoint with 4-bit weights in the loop, then exports it in the\ncompressed-tensors\nformat vLLM reads natively. The\n-w4a16-ct\nsuffix means 4-bit weights, 16-bit activations. Google publishes the same model in four QAT forms; only this one loads in vLLM:\nCheckpoint\nvLLM\n-qat-w4a16-ct\n🟢 loads, 4-bit weights\n-qat-q4_0-unquantized\n⚠️ stored at 16-bit, no memory saving\n-qat-q4_0-gguf\n❌ GGUF, for llama.cpp and Ollama\n-qat-mobile-*\n❌ on-device formats\nDeploying it is the first article's Steps 4 to 6 with two variables changed:\nexport\nNAME\n=\ngemma-4-e2b-qat\nexport\nMODEL_ID\n=\ngoogle/gemma-4-E2B-it-qat-w4a16-ct\nEnter fullscreen mode\nExit fullscreen mode\nvLLM names the format when it starts:\nquantization=compressed-tensors\nEnter fullscreen mode\nExit fullscreen mode\nWhat the Engine Allocates\nThe container log records the weights, the load time and the KV cache vLLM builds from what is left of the L4's memory:\nModel loading took 9.75 GiB memory and 82.751806 seconds\nGPU KV cache size: 723,484 tokens, Maximum concurrency for 8,192 tokens per request: 88.32x\nEnter fullscreen mode\nExit fullscreen mode\nModel loading took 8.01 GiB memory and 66.190265 seconds\nGPU KV cache size: 867,999 tokens, Maximum concurrency for 8,192 tokens per request: 105.96x\nEnter fullscreen mode\nExit fullscreen mode\nbf16\nQAT\nQAT / bf16\nWeights (GiB)\n9.75\n8.01\n0.82\nKV cache (tokens)\n723,484\n867,999\n1.2\nWeight load (s)\n82.75\n66.19\nCreate to\nInService\n(min)\n9.9\n10.1\nThe 4-bit weights save 18% of GPU memory. The checkpoint's own header shows why: only the transformer body is 4-bit.\nPart of the QAT file\nGB\nShare\nStored as\nPer-layer embedding\n4.698\n56.5%\nBF16\nVocabulary embedding\n1.611\n19.4%\nBF16\nTransformer body\n1.056\n12.7%\npacked 4-bit\nAudio tower\n0.614\n7.4%\nBF16\nVision tower\n0.337\n4.1%\nBF16\nThe memory the smaller weights free goes to the KV cache.\nHow the Measurement Works\ncompare.py\nruns the same three measurements against each endpoint, at temperature 0, through the same\naws sagemaker-runtime invoke-endpoint\ncall:\nDecode.\nFixed-length replies of 16 and 512 tokens (\nignore_eos\n), five of each. The decode rate is (512 − 16) / (median time at 512 − median time at 16), which cancels the aws CLI start-up and the network round trip.\nParallel requests.\n1, 4 and 16 requests at once, 256 tokens each, two batches per level. Throughput is total output tokens divided by the batch's wall time.\nAnswers.\n40 fixed questions with exact answers: 15 two-digit multiplications, 15 three-number sums, 10 capitals. Scored by regular expression.\npython3 compare.py measure docs/runs/2026-09-25-qat-vs-bf16 gemma-4-e2b-qat@us-east-2\nEnter fullscreen mode\nExit fullscreen mode\nwrote docs/runs/2026-09-25-qat-vs-bf16/measure-gemma-4-e2b-qat.json\n{\n  \"decode_tokens_per_second\": 105.1,\n  \"per_call_fixed_cost_seconds\": 0.562,\n  \"load_tokens_per_second\": {\n    \"1\": 85.35,\n    \"4\": 328.7,\n    \"16\": 1077.25\n  },\n  \"quality\": \"37/40\"\n}\nEnter fullscreen mode\nExit fullscreen mode\ncombine\ncomputes every ratio from the two result files:\npython3 compare.py combine compare.json measure-gemma-4-e2b.json measure-gemma-4-e2b-qat.json\nEnter fullscreen mode\nExit fullscreen mode\ngemma-4-e2b     gemma-4-e2b-qat  ratio\nweights_gib                           9.75                8.01  0.82\nkv_cache_tokens                     723484              867999  1.2\nload_seconds                     82.751806           66.190265  \ndecode_tokens_per_second              51.3               105.1  2.05\nload_c1_tokens_per_second             45.6               85.35  1.87\nload_c4_tokens_per_second            171.6               328.7  1.92\nload_c16_tokens_per_second           619.1             1077.25  1.74\nquality_correct                         37                  37  \nidentical answers: 35/40\nEnter fullscreen mode\nExit fullscreen mode\nDecode Speed\nbf16\nQAT\nDecode (tokens/s)\n51.3\n🥇 105.1\n512-token reply, fastest (s)\n10.491\n🥇 5.392\n512-token reply, slowest (s)\n10.661\n🥇 5.526\nPer-call client cost (s)\n0.633\n0.562\nQAT decodes 2.05x faster.\nThe slowest QAT reply finished in about half the time of the fastest bf16 one, so the gap is far larger than the spread between repeats.\nEach decode step reads every transformer layer's weights from GPU memory, so decode speed follows how many bytes those layers take. Those are the layers the QAT export stores at 4 bits. The embeddings are looked up one row per token, so their 16-bit size costs memory and little time.\nParallel Requests\nRequests at once\nbf16 tok/s\nQAT tok/s\nQAT / bf16\n1\n45.6\n🥇 85.35\n1.87\n4\n171.6\n🥇 328.7\n1.92\n16\n619.1\n🥇 1077.25\n1.74\nQAT leads at every level. The ratio narrows at 16, where a batch shares each weight read across more requests and the per-token saving counts for less. The single-request figures sit below the decode rate because each call also pays the aws CLI start-up.\nDoes It Still Answer Correctly?\nQuestions\nbf16\nQAT\nMultiplication (15)\n15\n15\na + b − c (15)\n12\n12\nCapitals (10)\n10\n10\nTotal (40)\n37\n37\n35 of the 40 answers are identical character for character. The other five are all sums, and each model misses three of them:\nQuestion\nExpected\nbf16\nQAT\n876 + 608 − 558\n926\n❌ 1026\n✅ 926\n257 + 388 − 290\n355\n✅ 355\n❌ 655\n782 + 571 − 534\n819\n❌ 829\n✅ 819\n470 + 238 − 983\n−275\n✅ −275\n❌ −285\n150 + 937 − 139\n948\n❌ 918\n❌ 1010\nThe two models make the same number of mistakes on different questions. Forty questions are enough to show a large loss and too few to measure a small one.\nRe-Measured in A-B-A Order\nEach endpoint runs on its own physical instance, and the two ran 15 minutes apart. To check that the gap belongs to the checkpoint, the bf16 endpoint was deployed a second time after QAT and measured again:\nRun\nStart (UTC)\nDecode tok/s\n16 at once tok/s\nCorrect\nbf16\n18:36\n51.3\n619.1\n37\nQAT\n18:50\n105.1\n1077.25\n37\nbf16 again\n19:10\n51.5\n625.15\n37\nThe two bf16 runs agree within 1.21% on every speed figure and give identical answers to all 40 questions. The second bf16 instance loaded its weights in 82.09 s against 82.75 s the first time.\nCompare to Other Deployments\nThe same bf16 model on the same GPU has been measured on two other platforms in this series, with\nvllm bench serve\nat 128 output tokens:\nPlatform\n1 request tok/s\nCloud Run, NVIDIA L4\n49.63\nEC2\ng6.2xlarge\n, NVIDIA L4\n46.09\nSageMaker\nml.g6.xlarge\n, NVIDIA L4\n45.6\nThe three sit within 9% of each other. SageMaker's figure includes the aws CLI start-up in every call; its decode rate with that removed is 51.3.\nOn a Tesla T4, QAT decoded 1.79x faster than bf16 for the same model. On the L4 the ratio is 2.05x.\nThe methods differ: the other runs used\nvllm bench serve\nwith random prompts, other vLLM versions and their own hosts. Read the rows as a shape.\nAnd Price/Performance?\nml.g6.xlarge\nin\nus-east-2\nis $1.1267 an hour on demand:\naws pricing get-products\n--region\nus-east-1\n--service-code\nAmazonSageMaker\n\\\n--filters\nType\n=\nTERM_MATCH,Field\n=\ninstanceName,Value\n=\nml.g6.xlarge\nType\n=\nTERM_MATCH,Field\n=\nregionCode,Value\n=\nus-east-2\nEnter fullscreen mode\nExit fullscreen mode\nml.g6.xlarge USE2-Host:ml.g6.xlarge 1.1267000000 Hrs | $1.1267 per Hosting ml.g6.xlarge hour in US East (Ohio)\nEnter fullscreen mode\nExit fullscreen mode\nThe same hourly price buys twice the tokens. Per million output tokens (arithmetic):\nRequests at once\nbf16 $/M\nQAT $/M\n1\n6.86\n🥇 3.67\n4\n1.82\n🥇 0.95\n16\n0.51\n🥇 0.29\nThe endpoint bills while it exists, busy or idle, so these figures hold only while it is kept busy.\nSo, Which One?\nbf16\nQAT\nDecode speed\n51.3 tok/s\n🥇 105.1 tok/s\n16 requests at once\n619.1 tok/s\n🥇 1077.25 tok/s\nGPU memory for weights\n9.75 GiB\n🥇 8.01 GiB\nChecked answers\n37 / 40\n37 / 40\nCost per million tokens at 16\n$0.51\n🥇 $0.29\nOn an L4 SageMaker endpoint, the QAT checkpoint is the default choice for Gemma 4 E2B: the same instance, one changed environment variable, about twice the tokens per dollar, and no measured change in answers. Keep bf16 as the reference when a task's accuracy needs a larger evaluation than 40 questions.\nWhat Stops the Meter\ndelete_endpoint\nremoves the endpoint, its config and its model:\n🗑️ `gemma-4-e2b-qat` in `us-east-2`\n- endpoint: deleted\n- endpoint-config: deleted\n- model: deleted\nEnter fullscreen mode\nExit fullscreen mode\nA\nCreating\nendpoint refuses deletion, so a deploy runs until it reaches\nInService\nor\nFailed\nbefore it can be removed.\nSummary\nThe goal of this article was to measure what Gemma 4 E2B's QAT checkpoint changes on a SageMaker L4 endpoint. The key to the solution was changing only\nSM_VLLM_MODEL\nbetween two deployments on the same instance type, and measuring decode speed with the per-call client cost removed. The measured results were:\n🟢 QAT decodes at\n105.1 tok/s\nagainst bf16's\n51.3\n, 2.05x\n🟢 At 16 requests at once QAT serves\n1077.25 tok/s\nagainst\n619.1\n, 1.74x\n🟢 Both score\n37 of 40\non checked questions, with 35 identical answers\n🟢 A second bf16 deployment after QAT reproduced the first within 1.21%\n⚠️ The 4-bit export saves 18% of weight memory, because the embeddings stay at 16-bit\n⚠️ Getting an L4 took three regions:\nus-east-1\nand\nus-west-2\nreturned\nInsufficientInstanceCapacity\nafter about 30 minutes each\nScope: one account, SageMaker\nml.g6.xlarge\nwith one NVIDIA L4 in\nus-east-2\n, vLLM 0.30.0 from the AWS container, three deployments on 2026-09-25 each on its own instance, measured in bf16, QAT, bf16 order. Prompts were short; long-prompt behaviour was not measured. Decode used five replies per length, parallel throughput two batches per level, and quality 40 questions at temperature 0. Every request went through the aws CLI from one client machine.\nThe strategy for using MCP for SageMaker deployment and benchmarking was validated with an incremental step by step approach.\nReferences\nRepository:\nhttps://github.com/xbill9/sagemaker-gemma\nPart one, deploying Gemma 4 to SageMaker:\nhttps://dev.to/aws-builders/gemma-4-on-an-amazon-sagemaker-endpoint-aws-cli-nvidia-l4-and-an-mcp-server-2c9d\nGemma 4 E2B QAT w4a16:\nhttps://huggingface.co/google/gemma-4-E2B-it-qat-w4a16-ct\nGemma 4 E2B:\nhttps://huggingface.co/google/gemma-4-E2B-it\nGemma 4 on a Tesla T4, QAT vs bf16:\nhttps://dev.to/gde/gemma-4-on-a-tesla-t4-qat-weights-decode-179x-faster-than-bf16-2fi4\n2B Gemma 4 on Cloud Run with an NVIDIA L4:\nhttps://dev.to/gde/2b-gemma-4-deployment-with-cloud-run-nvidia-l4-mcp-sdk-2x-and-claude-code-4ml3\nSageMaker real-time inference:\nhttps://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints.html\nAWS Deep Learning Containers:\nhttps://github.com/aws/deep-learning-containers\ncompressed-tensors:\nhttps://github.com/neuralmagic/compressed-tensors",
  "metadata": {
    "title": "Gemma 4 on Amazon SageMaker: QAT Weights Decode 2.05x Faster Than bf16 on One L4 - DEV Community",
    "description": "A short background on SageMaker real-time endpoints, then a measured comparison of Gemma 4 E2B's QAT w4a16 checkpoint against the full-size bf16 release on the same NVIDIA L4 endpoint: decode speed, parallel throughput, answers and cost. Tagged with aws, sagemaker, gemma, vllm.",
    "keywords": "aws, sagemaker, gemma, vllm, software, coding, development, engineering, inclusive, community",
    "author": null,
    "og:type": "article",
    "og:url": "https://dev.to/aws-builders/gemma-4-on-amazon-sagemaker-qat-weights-decode-205x-faster-than-bf16-on-one-l4-318m",
    "og:title": "Gemma 4 on Amazon SageMaker: QAT Weights Decode 2.05x Faster Than bf16 on One L4",
    "og:description": "A short background on SageMaker real-time endpoints, then a measured comparison of Gemma 4 E2B's QAT w4a16 checkpoint against the full-size bf16 release on the same NVIDIA L4 endpoint: decode speed, parallel throughput, answers and cost.",
    "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%2Fsagemaker-gemma%2Fmain%2Fdocs%2Farticles%2Fsagemaker-gemma-qat%2Fdevto-cover.88bbac1a.jpg",
    "twitter:site": "@thepracticaldev",
    "twitter:creator": "@",
    "twitter:title": "Gemma 4 on Amazon SageMaker: QAT Weights Decode 2.05x Faster Than bf16 on One L4",
    "twitter:description": "A short background on SageMaker real-time endpoints, then a measured comparison of Gemma 4 E2B's QAT w4a16 checkpoint against the full-size bf16 release on the same NVIDIA L4 endpoint: decode speed, parallel throughput, answers and cost.",
    "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%2Fsagemaker-gemma%2Fmain%2Fdocs%2Farticles%2Fsagemaker-gemma-qat%2Fdevto-cover.88bbac1a.jpg"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [
    {
      "file": "attachments/e7334355fda0/code/body-000.txt",
      "chars": 182,
      "language": "text"
    },
    {
      "file": "attachments/e7334355fda0/code/body-001.txt",
      "chars": 243,
      "language": "text"
    },
    {
      "file": "attachments/e7334355fda0/code/body-002.txt",
      "chars": 79,
      "language": "text"
    },
    {
      "file": "attachments/e7334355fda0/code/body-003.txt",
      "chars": 32,
      "language": "text"
    },
    {
      "file": "attachments/e7334355fda0/code/body-004.txt",
      "chars": 149,
      "language": "text"
    },
    {
      "file": "attachments/e7334355fda0/code/body-005.txt",
      "chars": 150,
      "language": "text"
    },
    {
      "file": "attachments/e7334355fda0/code/body-006.txt",
      "chars": 86,
      "language": "text"
    },
    {
      "file": "attachments/e7334355fda0/code/body-007.txt",
      "chars": 255,
      "language": "text"
    },
    {
      "file": "attachments/e7334355fda0/code/body-008.txt",
      "chars": 94,
      "language": "text"
    },
    {
      "file": "attachments/e7334355fda0/code/body-009.txt",
      "chars": 638,
      "language": "text"
    },
    {
      "file": "attachments/e7334355fda0/code/body-010.txt",
      "chars": 192,
      "language": "text"
    },
    {
      "file": "attachments/e7334355fda0/code/body-011.txt",
      "chars": 111,
      "language": "text"
    },
    {
      "file": "attachments/e7334355fda0/code/body-012.txt",
      "chars": 100,
      "language": "text"
    }
  ],
  "images": [],
  "audio": [],
  "videos": [],
  "links": [
    {
      "href": "https://github.com/xbill9/sagemaker-gemma",
      "label": "https://github.com/xbill9/sagemaker-gemma",
      "type": "a"
    },
    {
      "href": "https://dev.to/aws-builders/gemma-4-on-an-amazon-sagemaker-endpoint-aws-cli-nvidia-l4-and-an-mcp-server-2c9d",
      "label": "https://dev.to/aws-builders/gemma-4-on-an-amazon-sagemaker-endpoint-aws-cli-nvidia-l4-and-an-mcp-server-2c9d",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/google/gemma-4-E2B-it-qat-w4a16-ct",
      "label": "https://huggingface.co/google/gemma-4-E2B-it-qat-w4a16-ct",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/google/gemma-4-E2B-it",
      "label": "https://huggingface.co/google/gemma-4-E2B-it",
      "type": "a"
    },
    {
      "href": "https://dev.to/gde/gemma-4-on-a-tesla-t4-qat-weights-decode-179x-faster-than-bf16-2fi4",
      "label": "https://dev.to/gde/gemma-4-on-a-tesla-t4-qat-weights-decode-179x-faster-than-bf16-2fi4",
      "type": "a"
    },
    {
      "href": "https://dev.to/gde/2b-gemma-4-deployment-with-cloud-run-nvidia-l4-mcp-sdk-2x-and-claude-code-4ml3",
      "label": "https://dev.to/gde/2b-gemma-4-deployment-with-cloud-run-nvidia-l4-mcp-sdk-2x-and-claude-code-4ml3",
      "type": "a"
    },
    {
      "href": "https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints.html",
      "label": "https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints.html",
      "type": "a"
    },
    {
      "href": "https://github.com/aws/deep-learning-containers",
      "label": "https://github.com/aws/deep-learning-containers",
      "type": "a"
    },
    {
      "href": "https://github.com/neuralmagic/compressed-tensors",
      "label": "https://github.com/neuralmagic/compressed-tensors",
      "type": "a"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-14T10:48:23Z",
  "source_url": "https://dev.to/aws-builders/gemma-4-on-amazon-sagemaker-qat-weights-decode-205x-faster-than-bf16-on-one-l4-318m",
  "papers": [],
  "actual_video_files": [],
  "body_chars": 14095,
  "expected_body_images": 0,
  "discovery_status": "ok",
  "delivery_status": "ok",
  "missing_reason": "",
  "raw_html": "attachments/e7334355fda0/pages/source.html",
  "local_html": "attachments/e7334355fda0/pages/article.html",
  "body_base_path": "attachments/e7334355fda0/pages/",
  "body_markdown_path": "attachments/e7334355fda0/pages/article.md"
}