I Tested Every Major GPU Cloud So You Don't Have To
Last quarter my team spent three weeks benchmarking GPU clouds for our LLM inference pipeline. We had a simple requirement: run Llama 3 70B in production, keep latency under 2 seconds, and don't spend a fortune doing it.
What followed was a crash course in how differently each provider approaches the same problem.
Here's everything we learned, with actual code.
Who This Is For
If you're an ML engineer, backend developer, or startup CTO trying to figure out where to run your AI workloads in 2026, this is the guide I wish existed when we started. We cover:
- Real provisioning workflows, not just marketing claims
- Code snippets that actually run
- Cost estimates based on real usage
- Honest takes on where each provider wins and loses
TL;DR: Quick Provider Summary
| Provider | Dev Experience | GPU Availability | B200? | Best Use Case |
|---|---|---|---|---|
| AWS | Moderate friction | Good with reservation | Preview | Enterprise MLOps |
| Azure | Moderate friction | Good with reservation | Preview | Azure OpenAI integration |
| GCP | Moderate friction | Good (TPU excellent) | Announced | JAX/TF training |
| CoreWeave | Good for large clusters | Strong (reserved) | Yes | Lab-scale training |
| Lambda Labs | Good | Moderate (books out) | No | Research workloads |
| RunPod | Good | Variable | No | Budget experiments |
| packet.ai | Very good | Strong | Yes | AI-native GPU compute |
What "AI Workload" Actually Means in Practice
Before we get into providers, let's be specific. "AI workload" means different things to different teams:
Pre-training / full training: Hundreds to thousands of GPU-hours, multi-node clusters, InfiniBand networking, checkpoint storage. If you're doing this, you already know your requirements.
Fine-tuning: Single-node or small multi-GPU, 1-100 GPU-hours, high VRAM GPUs (A100 80GB, H100). Iteration speed matters more than raw cluster size.
Inference serving: Low latency, high throughput, VRAM-efficient, OpenAI API compatibility, autoscaling.
Evaluation and benchmarking: Short burst compute, flexibility over raw performance.
Most developers are in the fine-tuning or inference bucket. That's where the real provider differences show up.
The Real Developer Workflow: Deploying vLLM for LLM Inference
Here's a concrete example. Deploying Llama 3 70B with vLLM for inference is the same across every provider once you have SSH. The difference is how fast you get there and what it costs.
Step 1: SSH into your instance
ssh ubuntu@your-instance-ip
Step 2: Install vLLM
pip install vllm
Step 3: Run inference in Python
from vllm import LLM, SamplingParams
llm = LLM(
model="meta-llama/Meta-Llama-3-70B-Instruct",
tensor_parallel_size=2,
dtype="bfloat16",
max_model_len=8192,
)
sampling_params = SamplingParams(
temperature=0.7,
max_tokens=512,
)
outputs = llm.generate(
["What is the difference between A100 and B200?"],
sampling_params
)
print(outputs[0].outputs[0].text)
Step 4: Serve as OpenAI-compatible API
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Meta-Llama-3-70B-Instruct \
--tensor-parallel-size 2 \
--host 0.0.0.0 \
--port 8000
Step 5: Hit the endpoint with OpenAI SDK
from openai import OpenAI
client = OpenAI(
base_url="http://your-instance-ip:8000/v1",
api_key="not-needed-for-local",
)
response = client.chat.completions.create(
model="meta-llama/Meta-Llama-3-70B-Instruct",
messages=[
{"role": "user", "content": "Explain GPU memory bandwidth in simple terms"}
],
)
print(response.choices[0].message.content)
This workflow runs identically on every provider that gives SSH access to an NVIDIA GPU. The differences come down to provisioning speed, GPU options, and hourly cost.
Provider Breakdown: The Developer Perspective
AWS
Amazon Web Services gives you GPU instances through EC2. The key instance types for AI:
-
p4d.24xlarge-- 8x A100 40GB, NVLink, roughly $32/hr on-demand -
p4de.24xlarge-- 8x A100 80GB, NVLink, roughly $40/hr on-demand -
p5.48xlarge-- 8x H100 80GB, NVLink + EFA, roughly $98/hr on-demand
aws ec2 run-instances \
--image-id ami-0abcdef1234567890 \
--instance-type p4d.24xlarge \
--key-name your-key-pair \
--security-group-ids sg-your-group \
--subnet-id subnet-your-subnet
SageMaker wraps this with managed training, experiment tracking, model registry, and deployment pipelines. Genuinely useful if you need that. The friction: on-demand availability for large GPU instances is unreliable without a reservation. NVIDIA B200 is currently preview-only.
Dev experience verdict: If you're already AWS-native, it works. For raw GPU access without managed services, the friction is higher than it needs to be.
Google Cloud Platform
Google Cloud GPU instances run on A2 (A100) and A3 (H100) machine families. TPU access is unique to GCP.
gcloud compute instances create gpu-instance \
--zone=us-central1-a \
--machine-type=a2-highgpu-1g \
--accelerator=count=1,type=nvidia-tesla-a100 \
--image-family=tf-latest-gpu \
--image-project=deeplearning-platform-release \
--boot-disk-size=100GB \
--metadata="install-nvidia-driver=True"
TPU access requires a completely separate workflow and JAX/TF framework commitment. If your stack is CUDA-based, TPUs require a meaningful porting effort.
Dev experience verdict: Strong for Vertex AI and JAX-native workloads. CUDA-based GPU access has the same friction as other hyperscalers.
CoreWeave
CoreWeave is Kubernetes-native. Their workflow uses GPU workloads as Kubernetes pods, which is excellent if your ML team already uses Kubernetes.
apiVersion: v1
kind: Pod
metadata:
name: vllm-inference
spec:
containers:
- name: vllm
image: vllm/vllm-openai:latest
resources:
limits:
nvidia.com/gpu: "2"
memory: "160Gi"
command: ["python", "-m", "vllm.entrypoints.openai.api_server"]
args:
- "--model"
- "meta-llama/Meta-Llama-3-70B-Instruct"
- "--tensor-parallel-size"
- "2"
restartPolicy: Never
Their H100 and H200 capacity is legitimate. InfiniBand networking for multi-node training is available. The catch: casual on-demand access is harder than with providers that offer instant provisioning. NVIDIA B200 is available through reservation.
Dev experience verdict: Excellent for Kubernetes-native teams running large clusters. Less accessible for quick iteration or solo developers.
Lambda Labs
Lambda Labs has a clean API and competitive pricing. Their instance availability can be tight for popular GPU types.
import requests
response = requests.post(
"https://cloud.lambdalabs.com/api/v1/instance-operations/launch",
auth=("your-api-key", ""),
json={
"region_name": "us-east-1",
"instance_type_name": "gpu_1x_a100_sxm4",
"ssh_key_names": ["your-ssh-key"],
"quantity": 1,
}
)
print(response.json())
Strong for research use cases. No inference-as-a-service layer. NVIDIA B200 not yet available.
Dev experience verdict: Good for straightforward GPU access. Availability is the main friction point for popular instance types.
RunPod
RunPod is fast to spin up and cheap for experimentation.
pip install runpod
runpod config
runpod pod create \
--gpu-type "NVIDIA A100 80GB" \
--image runpod/pytorch:latest \
--ports "8000/http" \
--volume-size 50
For serverless inference RunPod is particularly developer-friendly:
import runpod
runpod.api_key = "your-api-key"
endpoint = runpod.Endpoint("your-endpoint-id")
run_request = endpoint.run(
{"input": {"prompt": "Explain transformers in two sentences"}}
)
print(run_request.output())
Dev experience verdict: Best for quick experiments and budget inference. Third-party hardware tier has variable reliability. Not the right choice for production workloads where uptime matters.
packet.ai
packet.ai is the provider that surprised me the most during our benchmarking. The pitch is simple: dedicated NVIDIA GPUs, hourly billing, no reservation commitment, SSH-ready in minutes.
After instance provisioning, access is immediate:
ssh ubuntu@your-packet-instance-ip
Environment setup is clean:
sudo apt update && sudo apt install -y nvidia-cuda-toolkit
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install vllm
nvidia-smi
No driver drama. No 15-minute wait. The GPU is just there.
For inference using Token Factory, packet.ai's OpenAI-compatible inference API:
from openai import OpenAI
# Switching from OpenAI to packet.ai Token Factory
# is literally just changing base_url and api_key
client = OpenAI(
base_url="https://api.packet.ai/v1",
api_key="your-packet-api-key",
)
response = client.chat.completions.create(
model="llama-3-70b-instruct",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "What makes NVIDIA B200 different from H100?"}
],
max_tokens=512,
temperature=0.7,
)
print(response.choices[0].message.content)
That's the whole migration from OpenAI to packet.ai for inference. Base URL change and a key swap.
For fine-tuning on packet.ai's A100 or RTX 6000 Pro:
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from peft import LoraConfig, get_peft_model
import torch
model_name = "meta-llama/Meta-Llama-3-8B"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.bfloat16,
device_map="auto"
)
peft_config = LoraConfig(
task_type="CAUSAL_LM",
r=16,
lora_alpha=32,
lora_dropout=0.1,
target_modules=["q_proj", "v_proj"],
)
model = get_peft_model(model, peft_config)
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs=3,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
warmup_steps=100,
learning_rate=2e-4,
bf16=True,
logging_steps=10,
save_steps=500,
)
On packet.ai's RTX 6000 Pro (48GB VRAM), this handles models up to 13B parameters comfortably. On A100 (80GB), 70B models with quantization are doable.
The NVIDIA B200 availability on packet.ai is worth calling out separately. Most providers have B200 on a waitlist or behind a reservation requirement. packet.ai has it on hourly billing with no commitment. If you want to benchmark Blackwell GPU performance for your specific model today, this is your most practical path.
Dev experience verdict: The fastest path from "I need a GPU" to "I have a running GPU." Token Factory removes the need to manage inference infrastructure entirely if you don't want to. Pricing is published and predictable.
Choosing the Right GPU for Your Task
VRAM Requirements by Task
| Task | Model Size | Min VRAM | Recommended Instance |
|---|---|---|---|
| Inference only | 7B | 16GB | RTX 4090 |
| Inference only | 70B (4-bit) | 48GB | RTX 6000 Pro or L40S |
| Fine-tuning (LoRA) | 7B | 24GB | RTX 6000 Pro |
| Fine-tuning (LoRA) | 70B | 80GB | A100 80GB |
| Full fine-tuning | 7B | 80GB+ | A100 80GB |
| Training | 70B+ | Multi-GPU | A100 or B200 cluster |
Real Cost Estimate: Fine-tuning Llama 3 8B
Training with LoRA for 3 epochs on a 100K sample dataset takes roughly 8-12 GPU-hours on an A100.
- AWS SageMaker ml.p4d.24xlarge: roughly $4-5 for compute, plus SageMaker overhead and egress
- Lambda Labs A100: roughly $8-12 total
- packet.ai RTX 6000 Pro: lower than A100 alternatives, published on pricing page
The RTX 6000 Pro is worth considering for fine-tuning runs that fit in 48GB VRAM. It's less expensive per hour than A100 while covering most LoRA fine-tuning tasks.
When to Self-Host Inference vs Use an API
This is the question we spent the most time on.
Use Token Factory or similar API when:
- You're in early stages and want zero infrastructure overhead
- Request volume is unpredictable
- You need OpenAI API compatibility without running servers
Self-host with vLLM on packet.ai when:
- Request volume is predictable and high enough that per-token pricing adds up
- You need custom model weights (fine-tuned models, private checkpoints)
- Latency requirements need dedicated GPU access
The crossover point varies by model and request volume. For most production applications above 1M tokens per day, self-hosting on packet.ai's L40S or RTX 6000 Pro with vLLM becomes more cost-efficient than API pricing.
FAQ
Q: Can I use Hugging Face models directly on any of these providers?
Yes. Hugging Face Hub access requires only pip install transformers and a HF token. All providers that give SSH access work. For gated models like Llama 3 and Gemma, you need your token to have accepted the model license on the Hugging Face website first.
Q: What is the fastest way to get a GPU running for a quick experiment?
packet.ai and RunPod both provision instances quickly. packet.ai's dedicated instances are SSH-ready immediately after creation. For even faster experimentation without provisioning anything, packet.ai's Token Factory gives you inference via API with no GPU management required.
Q: Is there a free tier for GPU cloud?
Google Colab has free T4 GPU access with session limits. For real workloads, there's no meaningful free tier. Most providers have low minimum billing thresholds. packet.ai bills hourly, so you can run a quick experiment and pay only for the time actually used.
Q: Does NVIDIA B200 matter for inference workloads?
Yes. B200 delivers significantly higher memory bandwidth than H100, which directly impacts inference throughput for large models. For serving 70B+ parameter models at production scale, B200 reduces the GPU count needed for a given throughput target. packet.ai offers B200 on hourly billing without a reservation.
Q: Can I run multi-GPU inference with vLLM on packet.ai?
Yes. vLLM's tensor_parallel_size parameter distributes the model across GPUs. The example in this article shows a 2-GPU setup. The same approach scales to the GPU count of your instance on packet.ai.
Q: How do I reduce inference costs without switching providers?
Quantization is the biggest lever. Running a 70B model in 4-bit (GPTQ or AWQ) cuts VRAM requirements roughly in half, which means you can use a smaller GPU instance. vLLM supports both formats natively. On packet.ai, moving from an A100 to an RTX 6000 Pro for a quantized 70B model can significantly reduce hourly cost with minimal quality impact.
Q: What's the difference between packet.ai dedicated and dynamic instances?
Dedicated instances give you exclusive physical access to the GPU. Your VRAM, your compute, no other tenants. Dynamic instances share underlying hardware at lower cost. For production inference or training where consistent throughput matters, dedicated is the right choice. For experimentation or burst workloads, dynamic saves money. Both are available on hourly billing at packet.ai.
Final Take
If you're starting a new AI project in 2026 and don't have existing cloud commitments, the stack I'd reach for is:
- packet.ai for GPU compute (training and fine-tuning)
- packet.ai Token Factory for managed inference
- vLLM for self-hosted inference when volume justifies it
- AWS or Azure only if you need specific managed services that don't exist elsewhere
The hyperscalers are still the right answer for some teams. But for developers who just need reliable GPUs with predictable pricing and fast provisioning, the specialist providers have pulled far enough ahead that defaulting to AWS purely out of habit no longer makes sense.
packet.ai's pricing page is public. Run the numbers on your workload before committing to anything.
Top comments (0)