PortPilot

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.

Try:· Deterministic score · no sign-up

See a sample report · See the benchmark

What PortPilot produces
karpathy/nanoGPT
Ready to run on ROCm
Pure PyTorch — already ROCm-ready.

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.

Sample report
state-spaces/mamba
bundled · works offline
Manual blockers present
203A · Works as-is63B · Mechanical change2C · Manual blocker· 268 findings total
Cmamba_ssm/ops/cute/mamba3/mamba3_step_fn.py:12advisory · Fireworks AI
cuda-python low-level driver API

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.

Suggested change · advisory, not auto-applied
# 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 above
Bmamba_ssm/modules/mha.py:11advisory · Fireworks AI
FlashAttention dependency

FlashAttention has an official ROCm/CK implementation. Swapping the wheel (or using PyTorch SDPA) is mechanical.

Suggested change · advisory, not auto-applied
# 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 above

This 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.

Works as-is
Bucket A

Runs on ROCm PyTorch unchanged

torch.cuda.*.cuda()device="cuda"
Mechanical change
Bucket B

Needs a HIPify-style swap or repin

cupybitsandbytesflash_attntritoncustom .cu kernelsnvidia-* / +cuXXX wheels
Manual blocker
Bucket C

No clean ROCm path — needs rework

tensorrtinline PTXcuda-python driver API

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.

ast + regex
scanner/ast_rules.py · regex_rules.py
classifies
Buckets A / B / C
deterministic rule table
scores
Readiness score
scoring.py — never LLM-generated
Fireworks AI (LLM)
llm.py — advisory only
drafts
Explanations + suggested diffs
labeled advisory, never auto-applied
score = 100 · (1.0·A + 0.5·B + 0.0·C) / (A + B + C)The LLM never touches your score.

The pipeline

The frontend only presents; the backend does all the work.

frontend
Next.js · Vercel
presentation only
POST /scan → job_id
backend
FastAPI · Railway
does all the work — scanner + LLM pipeline
poll /status, GET /report
back to the frontend: live progress, then the report.

The lock-in myth, disproven.

Paste karpathy/nanoGPT and PortPilot returns 100/100 · already ROCm-ready. Pure PyTorch code runs on AMD unchanged.