Gemini inference queue backlog after adding new A100 nodes

Problem: Persistent Gemini Inference Queue Backlog After Adding New A100 Nodes

After expanding a Vertex AI Gemini endpoint with additional A100 GPU nodes, the queue depth metric began to climb steadily. The backlog manifested as:

  • Latency spikes from the typical 120 ms to >2 s.
  • Throughput drop from 5 k QPS to ~2 k QPS.
  • Errors such as "Failed to enqueue request: queue full" and "DeadlineExceeded: request timed out after 30s while waiting for a free inference slot" appearing in the endpoint logs.

Despite the increased compute capacity, the system was unable to drain the pending requests, indicating a mismatch between scaling actions and the Gemini serving stack.

Root Cause Analysis

1. Model version rollout serialization

When a new A100 node joins the cluster, the Gemini Model Server loads the target model version before it can accept traffic. In the fintech incident, each new node performed a sequential load, holding the request queue while the model was being deserialized. The Gemini Model Server API enforces a per‑node max_concurrent_loads of 1, causing a temporary “all workers busy” state.

2. Driver / CUDA version mismatch

Mixed A100/H100 clusters can suffer from driver incompatibility. The e‑commerce outage demonstrated that nodes running CUDA 12.1 while the serving image expected CUDA 12.0 failed to register the GPU, producing the log line:

TensorRT RuntimeError: CUDA driver version is insufficient

Consequently, traffic was routed to the remaining healthy node, saturating its internal queue.

3. Autoscaling cooldown lag

The default scale_up_cooldown_seconds of 600 s (10 min) creates a window where incoming requests accumulate faster than new nodes become ready. The healthcare analytics incident showed a 5 k QPS burst filling the queue while the new A100 instances booted.

4. GPU memory limit misconfiguration

New A100 nodes were provisioned with an aggressive gpu_memory_limit (e.g., 8 GiB) that was insufficient for the 12 GiB model, leading to OOM errors:

GPU OOM while loading model

Nodes entered an unhealthy state, and the endpoint fallback logic pushed all traffic onto the pending queue.

Investigation and Debugging Steps

Collect Queue Metrics

gcloud monitoring time-series list \
  --project=my-project \
  --filter='metric.type="vertex_ai.googleapis.com/endpoint/queue_depth"' \
  --interval='start-time=$(date -d "-15 min" -u +"%Y-%m-%dT%H:%M:%SZ"),end-time=$(date -u +"%Y-%m-%dT%H:%M:%SZ")' \
  --format='table(timestamp, value.double_value)'

Inspect Endpoint Logs

journalctl -u vertex-ai-gemini.service \
  | grep -E "Failed to enqueue|InferenceService unavailable|GPU OOM"

Verify GPU Registration on New Nodes

kubectl get pods -n vertex-ai -l app=gemini -o jsonpath="{.items[*].status.containerStatuses[*].state}" | grep "Running"
kubectl exec -it $(kubectl get pod -n vertex-ai -l app=gemini -o name | head -n1) -- nvidia-smi

Expected nvidia-smi output should list the A100 GPU with the correct driver version (e.g., 525.85.12 for CUDA 12.0).

Check Model Load Status

curl -X GET \
  "https://us-central1-aiplatform.googleapis.com/v1/projects/my-project/locations/us-central1/endpoints/1234567890:explain" \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  | jq '.deployedModels[] | {modelVersionId, loadState}'

Look for "loadState": "LOADING" persisting longer than the expected model_load_time_seconds (default 300 s).

Validate Autoscaling Policy

gcloud beta ai endpoints describe 1234567890 \
  --project=my-project \
  --location=us-central1 \
  --format='yaml(autoscalingPolicy)'

Confirm scale_up_cooldown_seconds and max_replica_count values.

Resolution

1. Enable Parallel Model Loading

Adjust the deployment to allow up to 3 concurrent loads per node, reducing the serialization window.

# Before
{
  "deployedModel": {
    "model": "projects/my-project/locations/us-central1/models/gemini-001",
    "automaticResources": {
      "minReplicaCount": 2,
      "maxReplicaCount": 10
    },
    "modelDeploymentMetadata": {
      "maxConcurrentLoads": 1
    }
  }
}
# After
{
  "deployedModel": {
    "model": "projects/my-project/locations/us-central1/models/gemini-001",
    "automaticResources": {
      "minReplicaCount": 2,
      "maxReplicaCount": 10
    },
    "modelDeploymentMetadata": {
      "maxConcurrentLoads": 3
    }
  }
}

Apply with gcloud ai endpoints deploy-model. The increased parallelism allows each new A100 node to become ready faster, preventing queue saturation.

2. Align CUDA Driver Versions

Re‑image the newly added A100 nodes with the same CUDA version as the existing pool (CUDA 12.0). Update the node pool configuration:

gcloud container node-pools update a100-pool \
  --cluster=gemini-cluster \
  --image-type=COS_CONTAINERD \
  --node-version=1.28.5-gpu \
  --metadata=install-nvidia-driver=true,cuda-version=12.0

After the rollout, nvidia-smi should report a matching driver, and the TensorRT runtime error disappears.

3. Reduce Autoscaling Cooldown

Set scale_up_cooldown_seconds to 60 s to react faster to traffic spikes.

gcloud beta ai endpoints update 1234567890 \
  --project=my-project \
  --location=us-central1 \
  --autoscaling-policy='{
    "scaleUpCooldownSeconds": 60,
    "scaleDownCooldownSeconds": 300,
    "minReplicaCount": 2,
    "maxReplicaCount": 12
  }'

4. Increase GPU Memory Limit

Adjust the per‑node memory limit to accommodate the model size.

# Before
{
  "gpuMemoryLimitGb": 8
}
# After
{
  "gpuMemoryLimitGb": 16
}

Redeploy the model; the OOM logs cease, and the node stays healthy.

Verification

Queue Depth Normalization

gcloud monitoring time-series list \
  --project=my-project \
  --filter='metric.type="vertex_ai.googleapis.com/endpoint/queue_depth" AND resource.label.endpoint_id="1234567890"' \
  --interval='start-time=$(date -d "-5 min" -u +"%Y-%m-%dT%H:%M:%SZ"),end-time=$(date -u +"%Y-%m-%dT%H:%M:%SZ")' \
  --format='table(timestamp, value.double_value)'

Queue depth should stay below the configured max_queue_size (default 5 k) and exhibit short spikes only during sudden traffic bursts.

Latency and Throughput

curl -X POST https://us-central1-aiplatform.googleapis.com/v1/projects/my-project/locations/us-central1/endpoints/1234567890:predict \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  -d '{"instances": [...]}'

Measure end‑to‑end latency; it should return to the baseline < 200 ms. Use Cloud Monitoring dashboards to confirm sustained QPS > 4 k.

Node Health Checks

kubectl get pods -n vertex-ai -l app=gemini -o wide
kubectl describe pod -n vertex-ai $(kubectl get pod -n vertex-ai -l app=gemini -o name | head -n1)

All pods should report Ready=True and no recent GPU OOM or driver mismatch events.

Prevention and Best Practices

  • Version pinning: Keep CUDA driver, TensorRT, and Gemini serving image versions identical across all GPU node pools.
  • Parallel load configuration: Set maxConcurrentLoads based on model size and node CPU capacity (typically 2–4).
  • Autoscaling policy tuning: Align scale_up_cooldown_seconds with the expected burst window; consider a target_queue_depth metric to trigger scaling.
  • GPU memory budgeting: Reserve at least 20 % headroom above the model’s memory footprint; use gpu_memory_limit_gb accordingly.
  • Monitoring alerts: Create alerts on vertex_ai.googleapis.com/endpoint/queue_depth > 80 % of max_queue_size and on vertex_ai.googleapis.com/endpoint/latency > 500 ms.
  • Rolling rollout validation: Deploy new nodes in a canary fashion, verify nvidia-smi output and model load state before scaling the full pool.

Related Topic Hub: LLM Systems Troubleshooting Hub

FAQ

  1. Why does the queue depth increase even though I added more GPUs?
    The new GPUs may be unavailable due to driver mismatches, OOM during model load, or a serialized model loading process that blocks request acceptance until each node is ready.
  2. How can I tell which node is holding up the queue?
    Inspect the loadState of each deployed model via the endpoint API and check pod logs for “Failed to enqueue request” messages. Nodes stuck in LOADING or marked UNHEALTHY are the culprits.
  3. Is increasing max_queue_size a safe fix?
    It only masks the problem; the underlying bottleneck (e.g., driver mismatch or slow model load) will still cause latency spikes and potential timeouts.
  4. Can mixed A100/H100 clusters be used without queue issues?
    Yes, but you must ensure all nodes run compatible CUDA/TensorRT versions and configure the serving image to handle heterogeneous GPUs (set device_type appropriately).
  5. What metric should I use to trigger autoscaling for Gemini?
    Use vertex_ai.googleapis.com/endpoint/queue_depth as the primary scaling signal, optionally combined with cpu/utilization on the GPU nodes to avoid over‑provisioning.