Tóm tắt
Bài viết ghi lại quá trình tối ưu một server tại nhà gồm bốn AMD Radeon Pro V620 32GB để chạy LLM bằng llama.cpp. Mục tiêu không phải viết kernel mới mà là dùng cấu hình hiện có để lấy thêm throughput từ phần cứng cũ.
Kết quả thực dụng: layer parallel giúp nhét model lớn vào VRAM tổng, nhưng có thể làm token generation chậm vì GPU thay nhau làm việc. Muốn nhanh hơn phải hiểu memory bandwidth, interconnect, CPU spill, speculative decoding và tensor parallel.
Bối cảnh phần cứng
Server có bốn GPU chung bus PCIe 3.0, phần lớn card chỉ chạy 8 lane. Mỗi AMD V620 có khoảng 512 GB/s memory bandwidth. Với layer parallel, model được chia theo layer qua nhiều GPU; mỗi token vẫn đi tuần tự qua các layer, nên băng thông hiệu dụng gần với một card, trừ thêm overhead chuyển dữ liệu.
Với tensor parallel, mỗi layer được chia cho nhiều GPU để cộng băng thông, nhưng phải đồng bộ dữ liệu nhiều lần. Trên card có interconnect tốt như NVLink hoặc Infinity Fabric, tradeoff này có thể ổn. Trên dàn V620 qua PCIe, overhead có thể ăn hết lợi ích.
Phát hiện chính
Gemma4 31B ở 4-bit quant nặng khoảng 18 GiB, đủ nằm trong một card. Đây là case tốt để đo penalty của layer parallel: một card đạt 19-20 tok/s, hai card còn 15-16 tok/s, bốn card còn 12-13 tok/s.
Deepseek V4 Flash là MoE 284B-A13B. Bản quant tác giả dùng khoảng 81 GiB, vừa đủ lấp VRAM của bốn card. Chạy default layer parallel ban đầu chỉ đạt 9-10 tok/s. Sau khi thêm draft model DSpark, chỉnh tensor split, batch, microbatch và đảm bảo mọi thứ nằm trong VRAM, tốc độ UI/OpenCode lên khoảng 19-20 tok/s.
Một lỗi lớn nằm ở PCIe peer-to-peer transfer. Khi sửa BIOS/MMIO và thêm iommu=pt, tensor parallel trên model nhỏ hơn thay đổi rõ: hai card lên khoảng 47 tok/s và bốn card khoảng 37 tok/s trong phép thử Gemma. Với Qwen3.8-27B, hai card tensor parallel đạt khoảng 35 tok/s, nhanh hơn khoảng 30% so với một card.
Ý nghĩa với Dev
Nếu bạn tự host model cho coding agent, đừng chỉ cộng tổng VRAM rồi kỳ vọng latency tốt. CPU spill có thể kéo model xuống dưới 8 tok/s; interconnect hỏng có thể biến tensor parallel thành thảm họa; layer parallel có thể làm nhiều GPU nhàn rỗi.
Checklist thực tế: ép model và draft model nằm hoàn toàn trong VRAM, đo single-card trước, đo layer parallel và tensor parallel riêng, kiểm tra PCIe P2P, khóa context size thay vì tin auto-fit, rồi benchmark bằng workload giống agent thật. Tối ưu inference tại nhà là bài toán hệ thống, không phải chỉ là mua thêm card.