Serverless Gemma 12B with NVIDIA A100 on Azure Container…
    Neura MarketNeura Market/Stable Diffusion
    ChatGPTChatGPTClaudeClaudeGeminiGeminiCursorCursorGrokGrokPerplexityPerplexityStable DiffusionStable Diffusion
    DeepSeekDeepSeekCoPilotCoPilotMidjourneyMidjourney
    View All Directories
    OverviewPromptsBlogVideosGuidesCoursesCommunityModelsLoRAsComfyUI WorkflowsTrending
    Stable DiffusionBlogServerless Gemma 12B with NVIDIA A100 on Azure Container Apps
    Back to Blog
    Serverless Gemma 12B with NVIDIA A100 on Azure Container Apps
    qat

    Serverless Gemma 12B with NVIDIA A100 on Azure Container Apps

    xbill June 23, 2026
    0 views

    This article provides a step by step debugging guide for deploying Gemma 4 to Azure Container Apps. A...


    title: Serverless Gemma 12B with NVIDIA A100 on Azure Container Apps published: true series: Azure date: 2026-06-22 17:13:03 UTC tags: qat,gemma4,mcps,azurecontainerapps canonical_url: https://xbill999.medium.com/serverless-gemma-12b-with-nvidia-a100-on-azure-container-apps-3b6dace385e2

    This article provides a step by step debugging guide for deploying Gemma 4 to Azure Container Apps. A suite of Python MCP tools is built to simplify management of the vLLM hosted Gemma 4 deployment with Antigravity CLI.

    What is this project trying to Do?

    This project is a DevOps/SRE assistant that uses a Gemma 4 model hosted on Azure Container APps. It provides tools to provision the Docker container and deploy the model, as well as for observability and performance testing.

    This project is similar to a previous project that targeted GPU hosted Gemma4 instances on GCP:

    Gemma-SRE: Self-Hosted vLLM Infrastructure Agent

    Antigravity CLI

    Antigravity CLI is the follow-on successor to Gemini CLI- the terminal driven, agent assisted coding tool.

    Full details on installing Antigravity CLI are here:

    Getting Started with Antigravity CLI

    Testing the Antigravity CLI Environment

    Once you have all the tools in place- you can test the startup of Antigravity CLI.

    You will need to authenticate with a Google Cloud Project or your Google Account:

    agy
    

    This will start the interface:

    Full Installation Instructions

    The detailed installation instructions for Antigravity CLI are here:

    Getting Started with Antigravity CLI

    Azure CLI

    The Azure Command-Line Interface (CLI) is a cross-platform tool used to connect to Azure and execute administrative commands on Azure resources. It allows you to manage services like virtual machines, databases, and networking through a terminal using interactive prompts or scripts. [1, 2, 3]

    More details are available here:

    What is the Azure Developer CLI?

    Azure Container Apps

    Azure Container Apps is a fully managed, serverless Kubernetes-based application platform designed for building and deploying modern, containerized apps without managing complex infrastructure. It enables scaling from zero to high demand, supports microservices, and handles event-driven processing with built-in HTTPS and observability.

    Full details are available here:

    https://azure.microsoft.com/en-us/products/container-apps

    Nvidia A100 on ACA

    ACA offers two sizes of GPU. The T4 is a cost effective solution but has limited GPU memory. The A100 provides more resources for performance sensitive deployments but comes with a higher cost and a much larger computer VM to manage the deployment. Details are here:

    Comparing GPU types in Azure Container Apps

    Where do I start?

    The strategy for starting MCP development for model management is a incremental step by step approach.

    First, the basic development environment is setup with the required system variables, and a working Antigravity CLI configuration.

    Then, a minimal Python MCP Server is built with stdio transport. This server is validated with Antigravity CLI in the local environment.

    This setup validates the connection from Antigravity CLI to the local server via MCP. The MCP client (Antigravity CLI) and the Python MCP server both run in the same local environment.

    Setup the Basic Environment

    At this point you should have a working Python environment and a working Antigravity CLI installation. The next step is to clone the GitHub samples repository with support scripts:

    cd ~
    git clone https://github.com/xbill9/gemma4-tips-azure
    

    Then run init.sh from the cloned directory.

    The script will attempt to determine your shell environment and set the correct variables:

    gpu-12B-qat-aca-a100-devops-agent
    source init.sh
    

    If your session times out or you need to re-authenticate- you can run the set_env.sh script to reset your environment variables:

    gpu-12B-qat-aca-a100-devops-agent
    source set_env.sh
    

    Variables like PROJECT_ID need to be setup for use in the various build scripts- so the set_env script can be used to reset the environment if you time-out.

    Model Management Tool with MCP Stdio Transport

    One of the key features that the standard MCP libraries provide is abstracting various transport methods.

    The high level MCP tool implementation is the same no matter what low level transport channel/method that the MCP Client uses to connect to a MCP Server.

    The simplest transport that the SDK supports is the stdio (stdio/stdout) transport — which connects a locally running process. Both the MCP client and MCP Server must be running in the same environment.

    The connection over stdio will look similar to this:

    # Initialize FastMCP server
    mcp = FastMCP("Self-Hosted vLLM DevOps Agent")
    

    Running the Python Code

    First- switch the directory with the Python version of the MCP sample code:

    ~/gemma4-tips-azure/gpu-12B-qat-aca-a100-devops-agent
    

    Run the release version on the local system:

    xbill@penguin:~/gemma4-tips-azure/gpu-12B-qat-aca-a100-devops-agent$ make install
    pip install -r requirements.txt
    Requirement already satisfied: mcp in /home/xbill/.pyenv/versions/3.13.13/lib/python3.13/site-packages (from -r requirements.txt (line 1)) (1.27.2)
    Requirement already satisfied: fastmcp in /home/xbill/.pyenv/versions/3.13.13/lib/python3.13/site-packages (from -r requirements.txt (line 2)) (2.11.3)
    

    The project can also be linted:

    mxbill@penguin:~/gemma4-tips-azuregpu-12B-qat-aca-a100-devops-agent$ make lint
    ruff check .
    All checks passed!
    ruff format --check .
    7 files already formatted
    mypy .
    Success: no issues found in 7 source files
    
    

    MCP stdio Transport

    One of the key features that the MCP protocol provides is abstracting various transport methods.

    The high level tool MCP implementation is the same no matter what low level transport channel/method that the MCP Client uses to connect to a MCP Server.

    The simplest transport that the SDK supports is the stdio (stdio/stdout) transport — which connects a locally running process. Both the MCP client and MCP Server must be running in the same environment.

    In this project Antigravity CLI is used as the MCP client to interact with the Python MCP server code.

    Antigravity CLI mcp_config.json

    A sample MCP server file is provided in the .agents directory:

    
        {
          "mcpServers": {
            "gpu-devops-agent": {
              "command": "python3",
              "args": [
                "/home/xbill/gemma4-tips-azure/gpu-12B-qat-aca-a100-devops-agent/server.py"
              ],
              "env": {
                "AZURE_LOCATION": "eastus",
                "MODEL_NAME": "google/gemma-4-12B-it-qat-w4a16-ct"
              }
            }
          }
        }
    

    Validation with Antigravity CLI

    The final connection test uses Antigravity CLI as a MCP client with the Python code providing the MCP server:

    MCP Servers
    
    Plugins (~/.gemini/antigravity-cli/plugins)
    > ✓ google-dev-knowledge Tools: search_documents, answer_query, get_documents
       ✓ gpu-devops-agent Tools: save_hf_token, get_vllm_endpoint, list_vertex_models, list_bucket_models,
                           analyze_cloud_logging, +25 more
    

    Getting Started with Gemma 4 on GPU

    The Official vLLM repo also has Gemma4 specific information:

    Releases · vllm-project/vllm

    The Gemma 12B model was just released:

    Introducing Gemma 4 12B: a unified, encoder-free multimodal model

    What about the QAT Models?

    A deep dive into deploying the 12B QAT model is here:

    12B Gemma 4 QAT Deployment with NVIDIA L4, Cloud Run, MCP, and Antigravity CLI

    Lets Deploy this!

    The model was deployed to Consumption-GPU-NC24-A100 backed with a NVIDIA GPU:

    > status_azure_vm
    
        ### Azure Container App Status for service 'gemma4-vllm-gpu':
    
        - **Container App Name** : `gemma4-vllm-gpu`
          - **Provisioning State** : `Succeeded`
          - **Running Status** : `Running`
          - **FQDN** : `https://gemma4-vllm-gpu.happyfield-ebede3ad.eastus.azurecontainerapps.io`
    

    Now check the Docker Container:

    > check_vllm
    
    ● gpu-devops-agent/check_vllm(Call check_vllm) (ctrl+o to expand)
    
      The model endpoint is fully up and running healthily! Here is the status returned from check_vllm :
    
      ### 🖥️ Azure Container App: gemma4-vllm-gpu 
    
      • Provisioning State: Succeeded 
      • Running Status: Running 
      • FQDN: https://gemma4-vllm-gpu.happyfield-ebede3ad.eastus.azurecontainerapps.io 
      • vLLM API Health Check ( /health ): Healthy ✅ 
    
    

    Cross Check The Deployed Model

    Once the model starts locally- the MCP tool allows for model verification:

    > verify_model_health
    
    132.7k in | 94 out | 30 thinking
    ● gpu-devops-agent/verify_model_health(Call verify_model_health) (ctrl+o to expand)
    
      The deep health check passed successfully:
    
      • Target Model: google/gemma-4-12B-it-qat-w4a16-ct 
      • Health Check Status: PASSED ✅ 
      • Response: "Yes, I am working! How can I help you today?..."
      • Response Latency: 1.56 seconds
    

    and model details:

    > > check model details
    
    3.2k in | 93 out | 29 thinking
    ● gpu-devops-agent/get_model_details(Call get_model_details) (ctrl+o to expand)
    
      Here are the detailed model and engine specifications retrieved from the running service:
    
      ### 🧩 Model Details (gemma4-vllm-gpu https://gemma4-vllm-gpu.happyfield-ebede3ad.eastus.azurecontainerapps.io)
    
      Model Information ( /v1/models ):
    
        [
          {
            "id": "google/gemma-4-12B-it-qat-w4a16-ct",
            "object": "model",
            "owned_by": "vllm"
          }
        ]
    
      Health Status ( /health ):
    
      • Status: Healthy ✅ 
    

    and status:

    > get_status
    
    4.2k in | 145 out | 66 thinking
    ● gpu-devops-agent/get_system_status(Call get_system_status) (ctrl+o to expand)
    
      The system status details are as follows:
    
      ### 🌀 GPU vLLM System Status
    
      • vLLM Health: 🟢 Online (https://gemma4-vllm-gpu.happyfield-ebede3ad.eastus.azurecontainerapps.io)
      • Hosting Status: 🟢 ACA Succeeded ( gemma4-vllm-gpu )
    
      👉 Next Step: Use the query_gemma4 tool to interact directly with the deployed model.
    

    and metrics:

      The prometheus metrics were successfully fetched from the active vLLM service. Here is a summary of the key performance
      and telemetry metrics:
    
      #### 📊 Telemetry & Resource Utilization
    
      • Virtual Memory Size: ~14.42 GB ( process_virtual_memory_bytes )
      • Resident Memory Size: ~2.45 GB ( process_resident_memory_bytes )
      • Total CPU Time Spent: 53.11s ( process_cpu_seconds_total )
      • Open File Descriptors: 49 ( process_open_fds )
    
      #### 🌀 vLLM Serving & Queue Telemetry
    
      • Running Requests: 0 ( vllm:num_requests_running )
      • Waiting Requests: 0 ( vllm:num_requests_waiting )
      • KV-Cache Usage: 0.0% ( vllm:kv_cache_usage_perc )
      • Prefix Cache Queries (Tokens): 20.0 ( vllm:prefix_cache_queries_total )
      • Engine Sleep State: Awake ( vllm:engine_sleep_state{sleep_state="awake"} = 1.0 )
    

    Check the Azure Instance

    Once Deployed — the model is visible on the Azure Console:

    Review the Model

    Check the model details:

    > what are the model details
    
    130.9k in | 60 out | 0 thinking
    ● gpu-devops-agent/get_model_details(Call get_model_details) (ctrl+o to expand)
    
      The details of the active running model are:
    
      ### 🧩 Deployed Model Info
    
      • Model ID: google/gemma-4-12B-it-qat-w4a16-ct 
      • Object Type: model 
      • Owned/Served By: vllm 
      • Endpoint URL: https://gemma4-vllm-gpu.happyfield-ebede3ad.eastus.azurecontainerapps.io/v1/models
      • Model Health Status: Healthy ✅
    
    ──────────────────────────────────────────────────
    
    > what are the A100 hardware details? Memory, VM, etc
    
      The active Azure Container Apps (ACA) GPU workload profile Consumption-GPU-NC24-A100 maps to the following Azure
      hardware specifications (equivalent to the Standard_NC24ads_A100_v4 VM size):
    
      ### 🛡️ Hardware & VM Specifications
    
      • GPU: 1x NVIDIA A100 PCIe (with 80 GB HBM2e High-Bandwidth VRAM)
      • vCPUs: 24 virtual CPUs
      • System Memory (RAM): 220 GiB 
      • Local Temp Storage: 360 GiB (NVMe SSD)
      • Maximum Network Bandwidth: Up to 20 Gbps 
    
      #### 💡 Deployment Advantages
    
      Deploying the google/gemma-4-12B-it-qat-w4a16-ct (Quantization-Aware Training w4a16 model) on this instance allows
      100% request success rate up to 512 concurrent users because the model weights only occupy a fraction of the 80 GB
      VRAM, leaving the vast majority of memory free for serving high-concurrency KV-caches.
    
    
    > query_gemma4_with_stats what is Gemma?
    
    142.0k in | 114 out | 33 thinking
    ● gpu-devops-agent/query_gemma4_with_stats(Call query_gemma4_with_stats) (ctrl+o to expand)
    
      Here is the response and performance telemetry from the deployed Gemma 4 model:
    
      ### 📊 Performance Stats
    
      • Model: google/gemma-4-12B-it-qat-w4a16-ct 
      • Time to First Token (TTFT): 0.110s 
      • Total Generation Time: 3.280s 
      • Inference Speed: 98.73 tokens/s 
      • Total Tokens (approx.): 313 
    
      ### 💬 Model Response
    
      Gemma is a family of lightweight, state-of-the-art open models developed by Google DeepMind.
    
      Here are the key characteristics of the Gemma family:
    
      • Open Weights: Gemma is designed as an "open weights" model, meaning that while the underlying technology is
      proprietary, the model weights are shared with the developer community for broad use, research, and customization.
      • Built from Gemini Technology: Gemma models are built using the same research, infrastructure, and technology used to
      create Google's Gemini models (like Gemini 1.5 Pro and Gemini Ultra).
      • Scale and Efficiency: They are designed to be "lightweight," meaning they are smaller than the massive Gemini models.
      This makes them efficient enough to run on personal hardware (like laptops or workstations) and local cloud
      infrastructure, while still maintaining high performance for their size.
      • Modalities: Different versions of Gemma support different modalities. While many are text-focused, newer versions
      (like Gemma 2 and parts of the Gemma 4 family) are capable of processing text and images, and some versions (like the
      2B and 4B models) can also process audio input.
      • Responsible AI: They are released with a focus on safety and responsibility, incorporating Google’s AI Principles and
      including safety filters and fine-tuning to minimize harmful outputs.
    
      In short, Gemma is Google's contribution to the open model ecosystem, providing developers and researchers with
      powerful, efficient tools for building AI applications.
    
    

    Benchmark the Local Model

    The local model was benchmarked. Summarize the results:

    
    > summarize benchmark_report.md
    
      Here is a summary of the 2D grid benchmark sweep findings for the Gemma 4 12B QAT model ( google/gemma-4-12B-it-qat-
      w4a16-ct ) served on an NVIDIA A100 GPU in Azure Container Apps:
    
      ### 🚀 Key Takeaways
    
      1. Outstanding Load Stability: The INT4 QAT model maintains a 99.6% to 100% success rate across all context windows
      (from 4 tokens to 16,384 tokens) and concurrencies up to 1024 concurrent users. This is a major improvement over the
      standard bfloat16 model, which frequently struggles at higher concurrency due to KV cache memory pressures.
      2. Throughput Ceiling: Maximum throughput peaks at ~69.2 requests/second (achieved at 256 concurrent users with a tiny
      4-token context window). As the context size grows, the throughput decreases due to processing time, stabilizing at
      ~26.8 requests/second for the 16K context window at high concurrencies.
      3. Linear Latency Scaling: Latency scales predictably. Under low loads (1–8 users), responses return in 0.11s – 0.5s.
      At peak load (1024 users), latency reaches ~9.53s for small contexts and ~19.80s for the maximum 16K context window.
    
      ### 🕒 Performance Profiles
    
      • Small Context (4 – 256 tokens): Optimal concurrency is around 128–256 users (throughput reaches ~69 req/s, average
      latency is ~1.06s – 2.01s).
      • Medium Context (512 – 2048 tokens): Throughput peaks at ~47–50 req/s for concurrent users ≥128. Latency scales from
      ~0.2s (at low concurrency) to ~11s (at 1024 concurrent users).
      • Large Context (4096 – 16384 tokens): Prefill and generation latency dominates at low concurrency (2.24s for a single
      user at 16K context) and peaks at ~19.80s under 1024 concurrent users. Throughput maxes out at ~26.8 req/s.
    
      ### Summary of Graph Trends
    
      • Latency vs. Concurrent Users (Top Plot):
          • Shows flat, sub-second latency for all context windows up to 64 concurrent users.
          • Shows a linear scale-up in latency starting from 128 concurrent users due to queue serialization.
          • Shows the clear separation of the 16K context line (purple), which peaks at ~19.8s latency under 1024 concurrent
          users.
      • Throughput vs. Concurrent Users (Bottom Plot):
          • Highlights how throughput ramps up quickly as concurrency increases, peaking around 128–256 concurrent users.
          • Shows throughput leveling off as the GPU reaches saturation.
          • Demonstrates that the throughput ceiling drops from ~69 req/s for small prompts (blue line) to ~26.8 req/s for
          16K prompts (purple line).
    

    This is visualized:

    GPU Memory Allocation of QAT 12B Models

    The GPU provides 80 GB of GPU Memory:

    > what is the memory breakdown on the GPU?
      Based on the startup logs of the vLLM engine running on the NVIDIA A100 (80GB) GPU, here is the detailed breakdown of
      the GPU memory (VRAM):
    
      ### 📊 GPU Memory (VRAM) Breakdown
    
       Component | VRAM Allocation | % of Total VRAM | Purpose
      --------------------|-----------------|-----------------|--------------------------------------------------------------
       Model Weights | 8.29 GiB | 10.4% | Model parameters (INT4 QAT compressed weights)
       KV Cache | 66.26 GiB | 82.8% | Dynamic KV cache block allocation (1,050,170 total tokens
                          | | | capacity)
       CUDA Graphs | 0.06 GiB | 0.1% | Compiled execution graphs for rapid inference operations
       Reserved Overhead | 1.39 GiB | 1.7% | Working memory for intermediate tensors and pytorch
                          | | | activations
       Unallocated / Free | 4.00 GiB | 5.0% | Unused VRAM headroom (since --gpu-memory-utilization is
                          | | | capped at 0.95 )
       Total | 80.00 GiB | 100.0% | NVIDIA A100 80GB VRAM Capacity
    
      ### 💡 Key SRE Insights
    
      • The QAT Advantage: Loading the model in native 16-bit precision would require ~24 GiB of VRAM just for weights. Using
      the INT4 Quantization-Aware Training (QAT) format compresses this to only 8.29 GiB, leaving 66.26 GiB entirely free for
      the KV cache.
      • Large KV Cache Capacity: The un-allocated space allows the KV cache to hold up to 1,050,170 tokens. This massive
      capacity is what allows the server to handle 1024 concurrent users at 16K context window with a 100% success rate
      without OOM crashes.
    
    

    What are the performance characteristics of the Model?

    > what are the performance characteristics of the deployment?
    
      Based on the benchmark sweep and the vLLM serving configuration on the NVIDIA A100 GPU (80GB), here are the core
      performance characteristics of the deployment:
    
      ### 1. Throughput & Scaling Characteristics
    
      • Peak Throughput Ceiling: Saturation occurs around 69.2 requests/second for small prompt sizes (≤32 tokens) at ≥256
      concurrent users.
      • Large Context Throughput: Under high context load (e.g., 16,384 tokens), throughput caps at ~26.8 requests/second
      starting from 256 concurrent users and remains perfectly flat up to 1024 concurrent users.
      • Concurrency Efficiency: Due to the compressed weights freeing up 82.8% of the VRAM for KV cache, the deployment
      processes concurrent loads with 100% request success rates up to 256 concurrent users, and 99.6% success rates at the
      extreme limit of 1024 users with 16K context windows.
    
      ### 2. Latency Profiles
    
      • Ultra-Low Concurrency (1–8 users): Response times are sub-second across all context sizes except the largest window:
          • Small Context (4 – 512 tokens): ~0.11s to 0.25s
          • Medium Context (1024 – 4096 tokens): ~0.20s to 0.51s
          • Large Context (8192 – 16384 tokens): ~0.99s to 2.24s
      • Peak Concurrency (1024 users): Latency scales linearly due to queue delays:
          • Small/Medium Context (≤4K tokens): ~9.53s to 12.06s
          • Maximum Context (16K tokens): ~19.80s
    
      ### 3. Optimization Architecture Impact
    
      • Chunked Prefill ( --enable-chunked-prefill + --max-num-batched-tokens 4096 ): Prevents massive prefill requests
      from causing execution hiccups or out-of-memory (OOM) spikes. Long prompts are chunked and scheduled incrementally,
      keeping the execution flow stable.
      • Auto-Fallback KV Cache ( --kv-cache-dtype auto ): Serves the KV cache natively in bfloat16 to leverage A100 Tensor
      Cores. Because SM80 (A100) doesn't natively support Triton's FP8 KV cache, this config guarantees optimal arithmetic
      accuracy and parser stability for tool calling without sacrificing throughput.
      • Asynchronous Scheduling ( --async-scheduling ): Decouples request handling from engine execution step iterations,
      allowing high concurrency (up to 1024 users) to queue efficiently without dropping TCP connections or triggering
      gateway timeouts.
    
    

    One last cross check — what are the trade-offs of the deployment?

    > what are the trade-offs on the deployment?
    
      The current deployment configuration for the Gemma 4 12B QAT model on Azure Container Apps NC24-A100 presents several
      engineering trade-offs:
    
      ### 1. Model Quantization: QAT (INT4) vs. Full Precision (bfloat16)
    
      • The Gain: Quantization-Aware Training compresses model weights down to 8.29 GiB (from ~24 GiB). This frees up 66.26
      GiB of VRAM for the KV cache, allowing the model to easily support 1,024 concurrent users without OOM crashes.
      • The Trade-off: There is a minor loss in perplexity compared to the full bfloat16 baseline. While QAT is
      significantly more accurate than standard Post-Training Quantization (PTQ), very complex reasoning or formatting/tool-
      calling edge cases might occasionally see slight degradation compared to the unquantized 12B model.
    
      ### 2. KV Cache Precision: Native bfloat16 vs. FP8 
    
      • The Gain: Keeping --kv-cache-dtype auto (which defaults to bfloat16 ) provides high numerical range stability. It
      completely avoids the tool-calling/reasoning parser failures or garbled outputs that can happen when forcing FP8 on
      unsupported hardware.
      • The Trade-off: It increases the VRAM footprint per token compared to FP8. Since A100 GPUs (compute capability 8.0) do
      not support Triton's native FP8 KV cache, we must spend 2 bytes per token instead of 1. If we were using newer L4 or
      H100 hardware, we could utilize FP8 to double the token capacity of the KV cache.
    
      ### 3. Chunked Prefill: Enabled vs. Disabled
    
      • The Gain: Setting --enable-chunked-prefill with --max-num-batched-tokens 4096 ensures system stability. By
      chunking large inputs, it prevents memory fragmentation and sudden OOMs when multiple users submit massive prompts
      simultaneously.
      • The Trade-off: It introduces a slight scheduling overhead for very large single-user prompts. A single prompt of 16K
      tokens must be processed in 4 successive prefill chunks, which slightly increases the Time-to-First-Token (TTFT) for
      that individual request compared to a non-chunked run.
    
      ### 4. GPU Scaling: Single NC24-A100 vs. Multi-GPU Tensor Parallelism
    
      • The Gain: Running on a single A100 GPU ( --tensor-parallel-size 1 ) minimizes inter-GPU communication overhead and
      keeps infrastructure costs lower.
      • The Trade-off: We hit a physical hardware ceiling at ~1,000 concurrent users. Scaling further requires upgrading to a
      multi-GPU workload profile (e.g., standard NC48-A100 with 2 GPUs) and enabling --tensor-parallel-size 2 (introducing
      NVLink communication latency) or scaling horizontally across multiple Container App replicas behind a load balancer.
    
    

    What about the other ACA option — the T4?

    > how does the performance compare to ACA T4?
    
      Comparing the current deployment on Azure Container Apps (NC24-A100) to a standard deployment on Azure Container Apps
      (Tesla T4) reveals significant differences in capacity, numerical stability, and throughput:
    
      ### 📊 Performance Comparison: A100 vs. T4
    
       Metric / Dimension | ACA NVIDIA A100 (80GB) | ACA Tesla T4 (16GB)
      ---------------------------|----------------------------------------|--------------------------------------------------
       VRAM Capacity | 80 GB | 16 GB
       KV Cache Allocation | 66.26 GiB | ~5.5 GiB (after loading weights & system overhead
       Max Concurrency Limit | 1,024 concurrent users (99.6% success) | ~8 concurrent users (OOMs beyond this)
       Max Context Window | 32,768 tokens | ~2,048 tokens (due to VRAM limits)
       Peak Throughput | ~69.2 req/s | ~4 - 6 req/s (approx. 10x slower)
       Native bfloat16 Support | Yes (Ampere hardware acceleration) | No (emulated, leading to performance drops)
      ──────
      ### 🔑 Critical Architectural Trade-offs
    
      #### 1. Numerical & Parser Stability ( bfloat16 vs. FP16 )
    
      • A100: Native support for bfloat16 keeps calculations stable. The model generates structured outputs and tool calls
      with perfect parse rates.
      • T4: Lacks hardware bfloat16 support. Falling back to standard float16 (FP16) causes numerical overflow/underflow,
      leading to garbled text generation or frequent tool-calling parser failures.
    
      #### 2. Concurrency Capacity (KV Cache Scale)
    
      • A100: Leaves 66.26 GiB for the KV cache, holding over 1,050,000 tokens concurrently.
      • T4: With only ~5.5 GiB left for the KV cache, a single user requesting a 4K context window will consume almost the
      entire allocation, causing immediate Out-of-Memory (OOM) failures for subsequent concurrent users.
    
      #### 3. Execution Kernels
    
      • A100: Utilizes high-performance FlashInfer and advanced Triton kernels for self-attention scaling.
      • T4: Must fall back to slower vLLM execution kernels and has a much smaller shared memory capacity. It requires custom
      Triton patches just to launch without encountering shared memory allocation errors.
    
    

    So where is the best place to run Gemma? AWS or GCP? Azure?

    Survey says…

    > compare aws vs gcp vs azure performance
    
     Here is a comparison of the performance characteristics of the self-hosted Gemma 4 12B QAT model across Azure, AWS, and
      GCP deployments based on the benchmark sweeps:
    
      ### 📊 Multi-Cloud Performance Comparison
    
       Metric / Feature | Azure Container Apps (… | AWS EC2 g6.2xlarge … | GCP Cloud Run (L4)
      -------------------------------------------|-------------------------|------------------------|------------------------
       GPU Model | NVIDIA A100 (80GB) | NVIDIA L4 (24GB) | NVIDIA L4 (24GB)
       VRAM Size | 80 GiB | 24 GiB | 24 GiB
       Peak Throughput (Small Context) | 69.2 req/s (256 users) | 93.3 req/s (256 | 40.3 req/s (1024
                                                 | | users)* | users)
       Throughput (16K Context) | 26.8 req/s | 19.9 req/s | 6.1 req/s
       Average Latency (1K Context, 1024 Users) | 11.29s | 19.90s | 23.22s
       Average Latency (16K Context, 1024 Users) | 19.80s | 26.98s | 33.78s
       16K Context Stability (at 1024 Users) | 99.6% Success Rate | 100% Success Rate | Degraded (Slight loss)
       16K Context Stability (at 2048 Users) | Not tested (capped at | 61.8% Success Rate | 22.0% Success Rate
                                                 | 1024) | | (Severe OOM)
    
      │ [!NOTE]
      │ * The AWS EC2 instance utilized FP8 KV cache quantization ( --kv-cache-dtype fp8 ) which is natively supported on the
      │ L4 GPU (SM89 architecture). The A100 GPU (SM80 architecture) utilized native bfloat16 KV cache ( --kv-cache-dtype
      auto
      │ ), yielding higher quality and parser stability but capping peak arithmetic throughput for tiny contexts.
      ──────
      ### 🔑 Core Cloud Platform Insights
    
      #### 1. Compute & Architecture Scaling
    
      • Azure (A100 80GB): Provides the best latency scaling and the highest throughput for large context sizes (26.8 req/s
      vs. 6.1 req/s on GCP) because of the higher raw memory bandwidth and larger VRAM buffer on the A100.
      • AWS (L4 24GB via EC2): Outperforms GCP's L4 implementation significantly. By bypassing container abstraction overhead
      (direct host OS virtualization), it achieves a peak throughput of 93.3 req/s (with FP8 cache enabled) and maintains a
      100% success rate up to 1024 users.
      • GCP (L4 24GB via Cloud Run): Suffers from serverless/container platform scheduling bottlenecks. Under high
      concurrency (≥1024 users), the container ingress and CPU throttling introduce queuing overhead, leading to high latency
      spikes (33.78s for 16K context) and scaling degradation (falling to a 22% success rate at 2048 users).
    
      #### 2. Cost-to-Performance Summary
    
      • For High-Throughput Production / Large Contexts: Azure ACA (A100) is the optimal deployment. The huge VRAM size
      allows processing over a million concurrent tokens.
      • For Low-to-Medium Concurrency Development: AWS EC2 (L4) offers the best cost-to-performance balance by leveraging
      native FP8 KV cache quantization at a much lower hourly hardware cost.
      • For Dynamic Auto-Scaling (Low Load): GCP Cloud Run (L4) provides serverless ease of deployment, but is not suited for
      high-concurrency or long-context workloads.
    
    

    What about costs?!?

    The serving costs were summarized:

      Here is a cost and efficiency comparison between deploying on the serverless NC24-A100 profile versus the serverless
      NC4-T4 profile on Azure Container Apps:
    
      ### 💰 Cost Comparison: A100 vs. T4
    
       Component | ACA A100 Profile ( NC24-A100 ) | ACA T4 Profile ( NC4-T4 )
      ---------------------------------------|---------------------------------------|---------------------------------------
       GPU Specifications | 1x NVIDIA A100 (80GB VRAM) | 1x NVIDIA Tesla T4 (16GB VRAM)
       vCPU Allocation | 24 Cores | 4 Cores
       RAM Allocation | 220 GiB | 28 GiB
       GPU Rate (per second) | ~$0.000651 / sec | ~$0.000090 / sec
       GPU Hourly Cost | $2.34 | $0.32
       vCPU Hourly Cost | $2.96 | $0.49
       RAM Hourly Cost | $3.56 | $0.45
       Total Hourly Cost | $8.86 / hour | $1.26 / hour
       Total Monthly Cost (100% Active) | $6,467.80 / month | $919.80 / month
      ──────
      ### 📈 Cost Efficiency & Unit Economics (Under Load)
    
      While the T4 profile is ~7x cheaper on a pure hourly basis, it is far less cost-efficient when handling production
      traffic or long context windows:
    
      #### 1. Concurrency Capacity Economics
    
      • T4 Profile (Max ~8 concurrent users):
          • Cost per concurrent user: $1.26 / 8 = $0.1575 / user-hour
      • A100 Profile (Max ~1024 concurrent users):
          • Cost per concurrent user: $8.86 / 1024 = $0.0086 / user-hour
          • Result: The A100 is ~18x more cost-efficient per active user under high load due to its massive VRAM budget (66.
          26 GiB for KV cache) and native Ampere execution performance.
    
      #### 2. Large Context & Failure Overhead
    
      • T4 Profile: Incapable of serving inputs ≥4K tokens under concurrency. Attempting to do so triggers OOM failures,
      leading to wasted execution billing cycles on failed requests.
      • A100 Profile: Reliably handles up to 32K context lengths at a 100% success rate under multi-user concurrency,
      providing predictable billing and zero failure-overhead costs.
      ──────
      ### 💡 Recommendation Summary
    
      • **Use T4 (1.26/hr\le 2$K tokens) and code is executed single-user.
      • **Use A100 (8.86/hr\ge 4$K tokens).
    
    

    What about other cloud costs?

    > compare price/performance across AWS,GCP,and Azure
    
      Here is a comparative analysis of the price-to-performance ratio across AWS, GCP, and Azure deployments when serving
      the Gemma 4 12B QAT model under maximum concurrent load:
    
      ### 📊 Multi-Cloud Price/Performance Metrics
    
       Metric | Azure Container Apps (A1… | AWS EC2 g6.2xlarge (L4) | GCP Cloud Run (L4)
      ------------------------------|---------------------------|---------------------------|--------------------------------
       Billing Model | Serverless Consumption | Dedicated Virtual Machine | Serverless Consumption (Scale-
                                    | (Scale-to-0) | | to-0)
       Hourly Run Cost | $8.86 / hour | $0.97 / hour | $1.26 / hour
       Throughput (16K Context) | 26.8 requests/sec | 19.9 requests/sec | 6.1 requests/sec
       Stability (16K @ 1024 Users) | 99.6% Success | 100% Success | Degraded (Slight loss)
       Price / Throughput Ratio | $0.33 per (req/s)-hour | $0.049 per (req/s)-hour | $0.206 per (req/s)-hour
       Cost per 1,000 requests | $0.092 | $0.013 | $0.057
      ──────
      ### 🔑 Price/Performance Winners by Scenario
    
      #### 1. The Cost Efficiency Winner: AWS EC2 ( g6.2xlarge )
    
      • Why: At $0.97/hour, AWS EC2 dedicated hosting is extremely cheap compared to serverless container app environments.
      Because we can enable the FP8 KV cache natively on the L4 GPU, we maintain a 100% success rate and high throughput (19.
      9 req/s).
      • Cost Efficiency: It costs only $0.013 per 1,000 requests, making it ~7x cheaper than Azure and ~4x cheaper than GCP
      per request processed.
      • Catch: It is not serverless; you pay the flat $0.97/hour even when there is zero traffic (scale-to-zero is not
      supported out of the box without custom VM scaling logic).
    
      #### 2. The Raw Performance Winner: Azure Container Apps (A100)
    
      • Why: Azure Container Apps utilizing a datacenter-grade A100 GPU offers the highest raw throughput (26.8 req/s at 16K
      context window) and the lowest average latency under peak load (19.80s vs. GCP's 33.78s).
      • Cost Efficiency: At $0.092 per 1,000 requests, it has higher unit costs, but it supports Scale-to-Zero, meaning you
      pay $0.00 when idle.
      • Catch: The entry-level price is high when active ($8.86/hr) due to the mandatory allocation of 24 vCPUs and 220 GiB
      RAM that Azure pairs with the A100 GPU profile.
    
      #### 3. The Serverless L4 Option: GCP Cloud Run (L4)
    
      • Why: GCP Cloud Run Gen2 offers serverless GPU profiles starting at $1.26/hour while active, supporting scale-to-zero.
      • Cost Efficiency: Due to container ingress and scheduling limits under concurrency, throughput drops to 6.1 req/s for
      large contexts, pushing the unit cost to $0.057 per 1,000 requests. It is a good middle ground for low-concurrency
      workloads but lacks the efficiency of AWS or the power of Azure A100 under load.
    
    

    Summary

    The strategy for using MCP for Gemma 4 GPU deployment with Antigravity CLI and Azure was validated with an incremental step by step approach.

    A minimal stdio transport MCP Server was started from Python source code and validated with Antigravity CLI running as a MCP client in the same local environment. This Python server provided all of the management tools to deploy and troubleshoot Azure Model deployments.

    Tags

    qatgemma4mcpsazurecontainerapps

    Comments

    More Blog

    View all
    Context bankruptcy: The case for strategic forgetting for AI Agentsai

    Context bankruptcy: The case for strategic forgetting for AI Agents

    Most of us have seen a coding agent fail to complete a task we know it can do. We just don't...

    J
    James O'Reilly
    Parallel Compliance Engine: Drive-to-Sheets Multi-Agent Orchestrationgooglecloud

    Parallel Compliance Engine: Drive-to-Sheets Multi-Agent Orchestration

    When building Generative AI applications, developers often encounter a massive bottleneck: sequential...

    A
    Aryan Irani
    Is It Ethical to Post and Ask About Circuits on Dev.to?discuss

    Is It Ethical to Post and Ask About Circuits on Dev.to?

    I’ve been thinking about sharing some electronic circuit posts on Dev.to — small circuits, DIY...

    C
    codebunny20
    The One-Click Exporter: AI Studio Antigravity, Probed to Its Limitsagents

    The One-Click Exporter: AI Studio Antigravity, Probed to Its Limits

    What nobody tells you about exporting your multi-agent prototype to a local workspace. Every...

    L
    leslysandra
    Guarding the till while autonomous data agents do the diggingagenticarchitect

    Guarding the till while autonomous data agents do the digging

    Autonomous agents are genuinely good at answering messy business questions. Give one an LLM and a set...

    S
    Sireesha Pulipati
    Return on Attention: Why AI Code Reviews Are Wearing Us Outai

    Return on Attention: Why AI Code Reviews Are Wearing Us Out

    PR volume went up, ticket quality didn't, and the gap got filled with LLMs on both sides of the review: bots reviewing, bots replying, bots occasionally arguing with bots about priorities that only existed in a teammate's head. Our CEO named the actual problem, and it's bigger than code review.

    C
    christine

    Stay up to date

    Get the latest Stable Diffusion prompts, rules, and resources delivered to your inbox weekly.

    Neura Market LogoNeura Market

    Discover the best AI prompts, plugins, and resources for Stable Diffusion and more.

    Content Types

    • Rules
    • Prompts
    • MCPs
    • Agents
    • Guides

    Platforms

    • ChatGPT Directory
    • Claude Directory
    • Gemini Directory
    • Cursor Directory
    • Grok Directory
    • Perplexity Directory
    • DeepSeek Directory
    • CoPilot Directory
    • Stable Diffusion Directory
    • Midjourney Directory
    • All Directories

    Resources

    • Blog
    • Documentation
    • Help Center
    • Marketplace

    Legal

    • Privacy Policy
    • Terms of Service

    © 2026 Neura Market. All rights reserved.

    |

    Not affiliated with any AI platform vendors.

    Ready-made automations for this

    Workflows from the Neura Market marketplace related to this Stable Diffusion resource

    • Interactive n8n Lesson 1: Data Flow, Execution & Debuggingn8n · $12.99 · Related topic
    • Debug: Lightweight Node.js & Browser Debugging Utilityn8n · $6.99 · Related topic
    • Telegram Echo Bot for Debugging Messagesn8n · $4.99 · Related topic
    • Automate Multi-Step Onboarding with Google Sheets, Forms, and Gmail Notificationsn8n · Free · Related topic
    Browse all workflows