Running Llama-3 Behind Your Own Firewall: a vLLM Production Checklist
GPU memory headroom, continuous batching, API-key rotation, and the monitoring you need before an internal LLM endpoint counts as production.
Developing private, secure language models and high-performance multi-cloud architectures for enterprise environments.

Toggle between the core areas of my work.
Open-source models — OLMo, Llama-3 — deployed as local production systems inside the security boundary, for environments where prompts and weights can never leave the building. Custom fine-tuning pipelines built on Axolotl with LoRA/QLoRA adapters, served at high throughput with vLLM continuous batching.
Architectures spanning AWS, Azure, GCP, and Oracle Cloud Infrastructure (OCI) built on a strict control plane / data plane separation: the vendor's control plane orchestrates, while customer databases stay inside the customer's own private VPC boundary — reached only via private endpoints, never the public internet.
Founder and CEO of Derek Coleman & Associates Group, managing family-business operations end to end — strategy, finance, and delivery — while driving multi-cloud go-to-market co-selling partnerships across the Microsoft, AWS, Oracle, and Google partner ecosystems.
Working patterns from real deployments — routing gateways, fine-tuning templates, zero-trust infrastructure. Copy freely.
# model_router.py — FastAPI gateway routing chat completions across
# private inference pools. Nothing leaves the boundary: every upstream is
# an internal vLLM endpoint or a private-link cloud pool.
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import httpx
UPSTREAMS = {
"fast": "http://vllm-l40s.internal:8000/v1", # Llama-3-8B, low latency
"smart": "http://vllm-h100.internal:8000/v1", # Llama-3-70B, hard questions
"batch": "https://gpu-pool.oci.internal/v1", # OCI pool via private link
}
ROUTE_BY_BUDGET_MS = [(350, "fast"), (2500, "smart")]
app = FastAPI(title="model-router")
class ChatReq(BaseModel):
messages: list[dict]
model: str = "auto"
latency_budget_ms: int = 2500
max_tokens: int = 512
def pick(req: ChatReq) -> str:
if req.model != "auto":
if req.model not in UPSTREAMS:
raise HTTPException(400, f"unknown model tier {req.model!r}")
return UPSTREAMS[req.model]
for budget, tier in ROUTE_BY_BUDGET_MS:
if req.latency_budget_ms <= budget:
return UPSTREAMS[tier]
return UPSTREAMS["batch"]
@app.post("/v1/chat/completions")
async def route(req: ChatReq):
upstream = pick(req)
async with httpx.AsyncClient(timeout=30.0) as client:
r = await client.post(f"{upstream}/chat/completions",
json=req.model_dump(exclude={"latency_budget_ms"}))
r.raise_for_status()
return r.json()
# llama3-qlora.yaml — Axolotl QLoRA fine-tune that fits one 24 GB GPU.
# Train on your own transcripts; weights never leave the building.
base_model: meta-llama/Meta-Llama-3-8B-Instruct
load_in_4bit: true
adapter: qlora
lora_r: 32
lora_alpha: 16
lora_dropout: 0.05
lora_target_modules: [q_proj, k_proj, v_proj, o_proj]
datasets:
- path: data/support-transcripts.jsonl
type: chat_template
sequence_len: 4096
sample_packing: true
micro_batch_size: 2
gradient_accumulation_steps: 8
num_epochs: 3
learning_rate: 2e-4
lr_scheduler: cosine
warmup_ratio: 0.05
bf16: auto
gradient_checkpointing: true
output_dir: ./outputs/llama3-support-lora
# data_plane.tf — zero-trust split: the control plane orchestrates,
# but customer data never leaves the customer\'s private VPC boundary.
module "customer_data_plane" {
source = "./modules/data-plane"
for_each = var.customers
vpc_cidr = each.value.cidr
allow_public_ingress = false # no exceptions
db_subnet_tier = "isolated" # no route to an IGW/NAT
# Control plane reaches in via PrivateLink only — never the reverse.
control_plane_endpoint_service = aws_vpc_endpoint_service.control.id
}
resource "aws_security_group_rule" "db_ingress" {
for_each = var.customers
type = "ingress"
from_port = 5432
to_port = 5432
protocol = "tcp"
security_group_id = module.customer_data_plane[each.key].db_sg_id
# Only the customer\'s own app tier — no 0.0.0.0/0, ever.
source_security_group_id = module.customer_data_plane[each.key].app_sg_id
}
# vllm.service — production inference serving, OpenAI-compatible API.
# High throughput via continuous batching + tensor parallelism.
[Unit]
Description=vLLM inference server (Llama-3-70B-Instruct)
After=network-online.target
[Service]
User=vllm
Restart=always
RestartSec=5
Environment=HF_HUB_OFFLINE=1
ExecStart=/opt/vllm/bin/vllm serve meta-llama/Meta-Llama-3-70B-Instruct \
--host 127.0.0.1 --port 8000 \
--tensor-parallel-size 4 \
--max-model-len 8192 \
--gpu-memory-utilization 0.92 \
--api-key-file /etc/vllm/api-keys
[Install]
WantedBy=multi-user.target
Technology, finance, and fitness — the three feeds I actually write. View all posts →
The parallel-zone method — recreate every record TTL-exact, prove parity with dig diffs, then make the nameserver flip the only moving part. Mail keeps flowing the whole time.
GPU memory headroom, continuous batching, API-key rotation, and the monitoring you need before an internal LLM endpoint counts as production.
Put one gateway between every app and every model — routing, budget caps, PII scrubbing, and audit logs in a single choke point.
Why a marketplace image that passed certification last month can be de-listed today, and the CVE-freshening pipeline that prevents it.
Per-vCPU, per-node, flat-tier: what actually clears procurement in enterprise accounts, with real marketplace data.
Committed-spend agreements expire whether you use them or not. A framework for routing real workloads at the burn-down.
Consulting, partnerships, speaking — or just compare notes on running language models where the data already lives. Email derek@derekcoleman.com or use the form.