It's software lock-in, not hardware, that keeps teams off AMD.
Paste a public GitHub repo. PortPilot tells you exactly how far you are from ROCm — with a deterministic readiness score, not a guess.
Real, bundled result — the lock-in myth, disproven. See it live below.
What you get
A shareable report: score, bucket tally, and per-finding advisory guidance. This one renders from the real bundled demo data — it works even if the backend is asleep.
cuda-python (from cuda import cudart/cuda) wraps the CUDA driver directly. There is no drop-in ROCm binding; the driver calls must be rewritten against HIP.
# mamba_ssm/ops/cute/mamba3/mamba3_step_fn.py:12- import cuda.bindings.driver as cuda+ import cuda.bindings.driver as cuda # advisory: see ROCm note aboveFlashAttention has an official ROCm/CK implementation. Swapping the wheel (or using PyTorch SDPA) is mechanical.
# mamba_ssm/modules/mha.py:11- from flash_attn import flash_attn_with_kvcache+ from flash_attn import flash_attn_with_kvcache # advisory: see ROCm note aboveThis is the shareable report. Score and buckets are deterministic; the explanation and diff are advisory.
The three buckets
Every CUDA dependency PortPilot finds lands in exactly one of these.
Runs on ROCm PyTorch unchanged
Needs a HIPify-style swap or repin
No clean ROCm path — needs rework
Deterministic by design
Buckets and the readiness score come from Python ast analysis and regex rules — the LLM never classifies. Fireworks AI only explains findings and drafts advisory diffs.
The pipeline
The frontend only presents; the backend does all the work.
The lock-in myth, disproven.
Paste karpathy/nanoGPT and PortPilot returns 100/100 · already ROCm-ready. Pure PyTorch code runs on AMD unchanged.