Giới thiệu
Tôi đã có RTX 4080 với 16GB VRAM. Đủ tốt cho game, không đủ cho các model tôi muốn chạy local. Bước tiếp theo trong thế giới GPU là hoặc chi cả đống tiền cho card nhiều VRAM hơn, hoặc tìm cách khác.
Tôi tìm cách khác.
Tôi mua một datacenter GPU thậm chí không có connector PCIe bình thường, cắm nó vào PC gaming bằng adapter, và giờ tôi có 32GB VRAM trên hai GPU chạy model 27 tỷ parameter ở 32 tokens/s. Tổng cost: £200.
Chiếc GPU
Đây là Tesla V100 SXM2 16GB. Được thiết kế cho server DGX của NVIDIA và rack hyperscaler. Form factor SXM2 nghĩa là không có PCIe slot. Không có display output. Không có power connector bình thường. Nó nằm trên một board độc quyền bên trong server rack và giao tiếp qua NVLink.
Bạn không thể cắm vào motherboard. Không phải không trợ giúp.
Nhưng đây là điểm: GPU Volta với 16GB HBM2 memory, 5120 CUDA core, mua chỉ £150 trên eBay. Compute vẫn real. VRAM vẫn real. Memory bandwidth mới là điều thực sự đáng ngạc nhiên.
HBM2 là một class memory khác. V100 có memory bus 4096-bit cho 900 GB/s bandwidth. So sánh:
- V100 (2017): 900 GB/s HBM2
- RTX 4080 (2022): 736 GB/s GDDR6X
- Apple M3 Max: 400 GB/s
- Apple M4 Max: 546 GB/s
- Apple M5 Max (laptop £3000+): 614 GB/s
- RX 7900 XTX: 960 GB/s GDDR6 (£700+, ROCm vẫn rough)
- RTX 5090 (£2000+): 1,792 GB/s
Một GPU từ 2017 có bandwidth cao hơn 22% so với một card ra 2022. V100 cho bạn 94% bandwidth của 7900 XTX với chưa đến 1/4 giá, và nó just-works với llama.cpp.
Vấn đề duy nhất là connector.
Adapter
Hóa ra ai đó làm adapter SXM2-to-PCIe. Không phải NVIDIA. Không được officially support. Một PCB trần với SXM2 socket một bên và PCIe edge connector bên kia. Giá khoảng £50 — có lẽ một nửa chỉ là tiền đồng.
Vậy với khoảng £200 tổng, tôi có một GPU 16GB VRAM cắm được vào motherboard cạnh RTX 4080 — tổng 32GB VRAM. Một RTX 5090 32GB giá hơn £2000. Tôi không nói trải nghiệm là giống nhau. Tôi nói VRAM là giống nhau.
Con fan từ địa ngục
Trước khi làm gì hữu ích với V100, phải xử lý con fan.
V100 SXM2 được thiết kế sống trong server 2U với industrial cooling. Fan trên adapter không khẽ nhẹ. Không yên. Không phải thứ bạn muốn trong phòng mình ngủ.
Đo bằng Apple Watch: 82 decibel. Đâu đó giữa máy nghiền rác và máy cắt cỏ — vượt qua ‘loud PC’ và sang vùng ‘có nên đeo earplug trong nhà mình không’.
Và tệ nhất: không control được. Tôi thử nvidia-smi, thử scan trên Linux, thử cả Afterburner trên Windows. Không gì cả. Fan trên adapter này không được thiết kế để control. Nó được thiết kế chạy 100% mãi mãi trong server rack — nơi không ai phải nghe.
Giải pháp: PWM qua motherboard
Thử cắm pin 9V vào pin VCC và ground — fan quay và yên hơn nhiều so với 12V bình thường. Confirm pinout.
Sau đó cắm dây jumper từ tach + PWM pin sang fan header motherboard. Motherboard đọc được RPM, fan responds với PWM. Giữ ở 10% — không bao giờ vượt 50°C kể cả full load, và không nghe thấy gì.
Giải pháp cuối: cable 2.54mm male sang PH2.0 female. Đầu PH2.0 cắm vào tach + PWM của fan, đầu 2.54mm cắm vào fan header motherboard.
Từ 82dB ear damage xuống mức sống cùng được.
Software setup (NixOS)
Phần này smooth bất ngờ nhờ NixOS. V100 là Volta chip. NVIDIA drop Volta support từ driver branch 560. Driver cuối cùng support cả RTX 4080 (Ada) và V100 (Volta) là branch 550.x — map sang nvidiaPackages.legacy_535 trên NixOS.
Driver đó chỉ support CUDA tới 12.2. Nixpkgs hiện ship CUDA 12.6 minimum. Phải pull CUDA 12.2 từ nixpkgs 24.05.
Driver cũng yêu cầu kernel 6.6. Kernel mới hơn không support với legacy driver.
Một thứ lạ: dù đây là headless inference server, services.xserver.enable = true vẫn bắt buộc. Không có nó, NVIDIA kernel module không load.
Config quan trọng
boot.kernelPackages = pkgs.linuxPackages_6_6;
hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.legacy_535;
services.xserver.enable = true;
services.xserver.videoDrivers = [ "nvidia" ];
Và cho CUDA 12.2 từ nixpkgs cũ:
nixpkgs.overlays = [
(final: prev: {
cudaPackages_12_2 = nixpkgs-cuda.legacyPackages.${prev.system}.cudaPackages_12_2;
})
];
Điểm quan trọng: nó hoạt động. Cả hai GPU đều show up, CUDA functional, NixOS xử lý tất cả elegantly.
Chạy model
Tôi chạy Qwen3.6-27B-MTP quantized Q5_K_M, khoảng 19GB. Với hai GPU, full model fit trong VRAM cộng room cho context.
| Setting | Value |
|---|---|
| Model | Qwen3.6-27B-MTP Q5_K_M (19GB) |
| Context size | 128k tokens |
| GPU layers | 99 (all offloaded) |
| Tensor split | -ts 1.0,1.0 (chia đều) |
Performance
| Metric | Value |
|---|---|
| Inference speed | ~32 tok/s |
| Prompt processing | ~133-160 tok/s |
32 tok/s đủ nhanh cho interactive use. Nhanh hơn hầu hết cloud API endpoint khi factor in network latency. Và đây là tensor splitting qua hai kiến trúc GPU khác nhau kết nối qua PCIe.
Model này thật sự tốt
Muốn nói rõ: đây không phải ‘tốt cho local model’. Không phải ‘chấp nhận được nếu hạ kỳ vọng’. Qwen3.6-27B ngang Claude Sonnet 4.6 trên Agentic Index của Artificial Analysis. Vượt Sonnet 4.6 trên MMMU-Pro và Terminal-Bench 2.0. Một model 27 tỷ parameter chạy trên hardware second-hand cạnh tranh thật sự với latest cloud model từ Anthropic.
Đúng, Sonnet 4.6 edge it ra trên GPQA và SWE-Bench Verified. Nên thế — nó là massive proprietary model. Và đúng, nếu muốn tuyệt đối tốt nhất, Opus 4.8 tồn tại. Nó cũng cost cho 20 phút heavy use hơn cả setup GPU + adapter này. Nhưng khoảng cách nhỏ một cách shocking. Ta đã đến điểm mà model bạn chạy trong phòng ngủ cùng conversation với những cái charge per token.
Multi-Token Prediction (MTP)
MTP trong tên model nghĩa là Multi-Token Prediction. LLM inference bình thường predict một token tại một thời điểm. MTP có model predict nhiều future token cùng lúc, sau đó verify cái nào đúng. Token được accept gần như free. Wrong prediction fall back sang normal path.
Kết quả: gen nhanh hơn ~1.5-2x không lỗ accuracy. Trên setup này, inference từ ~32 tok/s lên tiềm năng 50-60 tok/s khi MTP hit stride, đặc biệt trên output dự đoán được như code.
Catch: MTP support trong llama.cpp còn mới. Version trong nixpkgs không support Qwen3.6 MTP architecture, phải build llama.cpp từ source ở commit cụ thể.
Tích hợp với OpenCode
Setup này dùng với OpenCode — AI coding assistant chạy được với local model. LLM server chạy trên desktop, nhưng tôi dùng từ máy khác trong nhà qua mạng hoặc từ ngoài qua Tailscale. Point OpenCode về llama.cpp server đơn giản chỉ là set API URL. Model chạy local, response nhanh, và không có gì leave network.
Vision capability
Qwen3.6-27B support image input qua một file multimodal projector (mmproj) riêng biệt — khoảng 928MB extra. Vision encoder (tương tự ChatGPT/Claude dùng) chuyển image pixel thành sequence vector trong embedding space của LLM. Model xử lý vector đó như sequence token bình thường.
Thực tế: gửi model image URL kèm text prompt, nó có thể describe, analyze, reason về image. Toàn bộ vision capability thêm ~1GB vào model size.
Flag llama.cpp:
--mmproj /mnt/nas/llamacpp/mmproj-F16.gguf --mmproj-offload
Có thể đi xa hơn
V100 cũng có variant 32GB. Cost hơn gấp đôi cái £150 này, nhưng vẫn chỉ vài trăm bảng cho 32GB HBM2 memory trên một card. Hai card đó cho 64GB VRAM ở khoảng 20% giá RTX 5090.
Cũng có thể cluster. Format SXM2 support NVLink natively — nếu build proper multi-GPU setup, các card này nói chuyện được với nhau ở bandwidth rất cao. Kể cả qua PCIe adapter, tensor split performance vẫn tốt.
Dev nên quan tâm vì
Nếu bạn đang nghẽn VRAM cho local LLM inference, V100 SXM2 + adapter là route rẻ nhất để có 32GB. Tradeoff: phải dùng legacy driver (CUDA 12.2 max), kernel 6.6, xử lý fan, và llama.cpp custom build cho MTP. Nhưng kết quả là một rig chạy model tier Sonnet 4.6 hoàn toàn local, không leak data, response time competitive với cloud, và amortized cost gần như zero sau ngày đầu.