1 điểm bởi GN⁺ 2 giờ trước | 1 bình luận | Chia sẻ qua WhatsApp
  • Chỉ với RTX 4080 16GB là chưa đủ cho môi trường LLM cục bộ mong muốn, nên đã bổ sung một Tesla V100 SXM2 16GB hàng cũ cùng adapter với giá khoảng £200 để đạt tổng cộng 32GB VRAM
  • V100 SXM2 là GPU máy chủ không có khe PCIe, đầu ra hiển thị hay đầu nối nguồn thông thường, nhưng vẫn có thể gắn vào PC chơi game bằng adapter SXM2-to-PCIe
  • Quạt máy chủ mặc định có độ ồn 82dB nên rất khó dùng trong nhà, nhưng đã kết nối vào header quạt trên mainboard bằng cáp jumper PH2.0-2.54mm để điều khiển PWM và vận hành êm hơn
  • Với tensor splitting của llama.cpp, Qwen3.6-27B-MTP Q5_K_M được chia lên RTX 4080 và V100, đạt context 128k và tốc độ suy luận khoảng 32 tok/s
  • Dù không gọn gàng bằng một GPU 32GB đơn lẻ và vẫn còn vấn đề về driver, CUDA và warm reboot, GPU máy chủ hàng cũ vẫn có thể là một lựa chọn mở rộng VRAM giá rẻ cho LLM cục bộ

Môi trường LLM cục bộ 32GB với giá £200

  • Chỉ RTX 4080 16GB VRAM là chưa đủ để chạy các model cục bộ mong muốn, nên đã thêm một GPU trung tâm dữ liệu hàng cũ vào PC chơi game bằng adapter
  • Mua Tesla V100 SXM2 16GB cùng adapter SXM2-to-PCIe với tổng giá khoảng £200, từ đó tạo môi trường 32GB VRAM bằng cách cộng hai GPU lại
  • Chia một model 27B tham số lên hai GPU và chạy ở khoảng 32 tokens/s, toàn bộ model và context đều nằm trong VRAM
  • Dù không mang lại trải nghiệm giống hệt một GPU tiêu dùng 32GB đơn lẻ, cách này vẫn đem lại dung lượng VRAM với chi phí thấp hơn rất nhiều so với RTX 5090 32GB

Tesla V100 SXM2 và adapter

  • Tesla V100 SXM2 16GB là GPU dành cho máy chủ NVIDIA DGX và các rack hyperscaler
    • Không có khe PCIe thông thường, đầu ra hiển thị hay đầu nối nguồn tiêu chuẩn
    • Được gắn lên bo mạch riêng bên trong máy chủ và giao tiếp qua NVLink
    • Muốn cắm trực tiếp vào mainboard thì cần adapter riêng
  • V100 là GPU Volta với 16GB bộ nhớ HBM2 và 5120 nhân CUDA
    • Giá mua trên eBay khoảng £150
    • Dù là GPU từ năm 2017, hiệu năng tính toán và VRAM vẫn còn hữu ích cho LLM cục bộ
  • Băng thông bộ nhớ HBM2 là ưu điểm chính
    • V100 cung cấp băng thông 900GB/s với bus nhớ 4096-bit
    • Cao hơn 22% so với băng thông GDDR6X 736GB/s của RTX 4080
    • Cũng cao hơn Apple M3 Max 400GB/s, M4 Max 546GB/s và M5 Max 614GB/s
  • AMD RX 7900 XTX có 24GB GDDR6 và băng thông 960GB/s, nhỉnh hơn V100 một chút nhưng giá trên £700
    • Hỗ trợ suy luận LLM của ROCm vẫn được đánh giá là thô hơn CUDA
    • V100 cung cấp 94% băng thông của RX 7900 XTX với giá chưa tới một phần tư và chạy được với llama.cpp
  • RTX 5090 đạt 1.792GB/s nên vượt V100 rõ rệt, nhưng giá trên £2.000
    • Trong suy luận LLM, băng thông bộ nhớ là nút thắt quyết định tokens/s nên đây là yếu tố quan trọng
  • Adapter SXM2-to-PCIe không phải sản phẩm chính thức của NVIDIA và cũng không được hỗ trợ chính thức
    • Có dạng PCB trần với socket SXM2 ở một bên và đầu nối PCIe edge connector ở bên kia
    • Giá khoảng £50, nâng tổng chi phí toàn bộ cấu hình lên khoảng £200
    • Nhờ adapter này, V100 16GB có thể được cắm lên mainboard cùng với RTX 4080

Vấn đề quạt tản nhiệt máy chủ và cách xử lý

  • V100 SXM2 được thiết kế để chạy trong môi trường làm mát công nghiệp của máy chủ 2U
    • Quạt trên adapter ồn tới mức khó dùng trong phòng bình thường
    • Độ ồn đo bằng Apple Watch là 82dB, được mô tả ở khoảng giữa máy nghiền rác và máy cắt cỏ
  • Ở trạng thái mặc định thì không thể điều khiển quạt
    • Thử nvidia-smi, dò thiết bị Linux và Windows Afterburner đều thất bại
    • Có vẻ quạt trên adapter được giả định là luôn chạy 100% trong rack máy chủ
  • Dùng pin 9V để xác định sơ đồ chân quạt
    • Cắm dây jumper vào VCC và ground rồi chạm pin 9V thì quạt quay
    • So với chạy mặc định 12V, nó yên tĩnh hơn nhiều, xác nhận khả năng điều khiển quạt
  • Quạt hoạt động tương tự quạt case PC tiêu chuẩn
    • Cắm dây jumper vào đầu nối quạt rồi nối đầu kia vào header quạt dự phòng trên mainboard
    • Mainboard đọc được RPM và cũng điều khiển PWM được
    • Duy trì ở 10% tốc độ mà nhiệt độ full load vẫn không vượt 50°C, gần như không nghe thấy
  • Cáp hoàn chỉnh cuối cùng là 2.54mm male to PH2.0 female jumper cable
    • Đầu nối quạt của adapter là phích cắm JST PH2.0 4 pin
    • Header quạt trên mainboard là chuẩn 0.1 inch, tức bước chân 2.54mm
    • Đầu PH2.0 female nối vào chân tachometer và PWM của quạt, đầu 2.54mm male nối vào header quạt trên mainboard
    • Chỉ với cáp jumper cỡ £2 và việc xác nhận đúng đầu nối là đã giải quyết được vấn đề 82dB

Mở rộng VRAM bằng hai GPU

  • Cấu hình GPU cuối cùng như sau
    • RTX 4080: 16GB VRAM, kiến trúc Ada
    • Tesla V100: 16GB VRAM, kiến trúc Volta
    • Tổng cộng: 32GB VRAM trên hai GPU
  • llama.cpp có thể chia model lên hai GPU bằng tensor splitting
    • Các layer được pipeline qua bus PCIe
    • RTX 4080 xử lý một phần layer, V100 xử lý phần còn lại
    • Không nhanh bằng một GPU 32GB đơn lẻ, nhưng vẫn hoạt động và chỉ tốn khoảng 10% chi phí so với GPU 32GB
  • Mức tiêu thụ điện của V100 được quan sát ở tối đa khoảng 150W
    • Không phải nhỏ đối với GPU dùng cho suy luận LLM cục bộ, nhưng cũng không quá bất thường
  • Bản V100 32GB vẫn là một lựa chọn
    • Giá hơn gấp đôi cấu hình đã mua, nhưng vẫn có thể đạt 32GB HBM2 trên một card với vài trăm bảng
    • Hai chiếc V100 32GB có thể tạo ra 64GB VRAM, được mô tả là chỉ khoảng 20% giá RTX 5090 hiện tại
  • Định dạng SXM2 vốn hỗ trợ NVLink
    • Nếu xây dựng cấu hình multi-GPU đúng nghĩa thì các GPU có thể giao tiếp với nhau ở băng thông cao
    • Ngay cả qua adapter PCIe, hiệu năng tensor split vẫn đủ ổn định

Căn driver và CUDA trên NixOS

  • Cấu hình phần mềm diễn ra tương đối mượt nhờ NixOS
  • V100 dùng chip Volta, và NVIDIA đã ngừng hỗ trợ Volta từ nhánh driver 560
    • Driver cuối cùng hỗ trợ đồng thời RTX 4080 Ada và V100 Volta là nhánh 550.x
    • Trên NixOS, nó tương ứng với nvidiaPackages.legacy_535
  • Driver này chỉ hỗ trợ đến CUDA 12.2
    • Hiện tại nixpkgs cung cấp CUDA 12.6 trở lên
    • Cần lấy CUDA 12.2 từ nixpkgs 24.05
  • Driver yêu cầu Linux kernel 6.6
    • Driver legacy không hỗ trợ các kernel mới hơn
  • Dù là máy chủ suy luận headless, vẫn cần services.xserver.enable = true
    • Nếu không có thiết lập này, module kernel NVIDIA sẽ không được nạp
  • Cấu hình NixOS cốt lõi gồm kernel, driver NVIDIA legacy và chỉ định driver NVIDIA cho X server
boot.kernelPackages = pkgs.linuxPackages_6_6;
hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.legacy_535;
services.xserver.enable = true;
services.xserver.videoDrivers = [ "nvidia" ];
  • CUDA 12.2 được lấy từ nixpkgs cũ qua overlay
nixpkgs.overlays = [
  (final: prev: {
    cudaPackages_12_2 = nixpkgs-cuda.legacyPackages.${prev.system}.cudaPackages_12_2;
  })
];
  • Cả hai GPU đều hiển thị đầy đủ và CUDA cũng hoạt động bình thường
  • Toàn bộ định nghĩa máy nằm trong commit này của dotfiles repo
    • Bao gồm cả định nghĩa dịch vụ llama.cpp và bản build tùy chỉnh được ghim vào đúng phiên bản

Model đã chạy và hiệu năng

  • Model được chạy là bản lượng tử hóa Qwen3.6-27B-MTP Q5_K_M
    • Kích thước model khoảng 19GB
    • Khi dùng hai GPU, toàn bộ model nằm trong VRAM và vẫn còn chỗ cho context
  • Thiết lập chạy chính như sau
    • Model: Qwen3.6-27B-MTP Q5_K_M, 19GB
    • Context size: 128k tokens
    • GPU layers: 99, offload toàn bộ
    • Tensor split: -ts 1.0,1.0, chia đều lên hai GPU
  • Hiệu năng như sau
    • Inference speed: khoảng 32 tok/s
    • Prompt processing: khoảng 133~160 tok/s
  • 32 tokens/s được đánh giá là đủ nhanh cho sử dụng tương tác
    • Mức này đạt được ngay cả với cấu hình tensor split giữa hai GPU kiến trúc khác nhau qua PCIe
    • Tính cả độ trễ mạng, nó được mô tả là nhanh hơn phần lớn API endpoint đám mây

MTP và đầu vào hình ảnh

  • MTP là viết tắt của Multi-Token Prediction
    • Suy luận LLM thông thường dự đoán một token mỗi lần, chấp nhận token đó rồi mới dự đoán token kế tiếp
    • MTP dự đoán trước nhiều token tương lai cùng lúc rồi xác minh các token đúng
    • Những token được chấp nhận gần như miễn phí, còn dự đoán sai thì quay lại đường xử lý thông thường
  • Kết quả của MTP là tốc độ sinh tăng khoảng 1,5~2 lần mà không mất độ chính xác
    • Trong cấu hình này, từ khoảng 32 tok/s có thể đạt 50~60 tok/s khi MTP hoạt động hiệu quả
    • Đặc biệt hiệu quả với đầu ra dễ dự đoán như code
  • Hỗ trợ MTP trong llama.cpp vẫn còn là tính năng mới
    • Phiên bản llama.cpp trong nixpkgs chưa hỗ trợ kiến trúc MTP của Qwen3.6
    • Cần build llama.cpp từ mã nguồn ở một commit cụ thể đã thêm hỗ trợ này
    • Trên NixOS, một custom derivation được ghim vào commit đó để có thể tái lập
    • Việc đổi model hoặc phiên bản llama.cpp được xử lý bằng cách sửa một dòng cấu hình rồi chạy nixos-rebuild switch
  • Qwen3.6-27B hỗ trợ đầu vào hình ảnh thông qua file projector đa phương thức riêng là mmproj
    • File bổ sung này có kích thước khoảng 928MB
    • Vision encoder chuyển đổi pixel ảnh vào không gian embedding token của LLM
    • Model không thật sự “nhìn” ảnh như con người
    • LLM xử lý các vector đã chuyển đổi đó như một chuỗi token khác
  • Cờ chạy llama.cpp như sau
--mmproj /mnt/nas/llamacpp/mmproj-F16.gguf --mmproj-offload
  • --mmproj-offload đưa vision encoder lên GPU cùng với model
    • Nhờ vậy vẫn giữ được suy luận nhanh cả khi có đầu vào hình ảnh

Cách sử dụng cục bộ

  • Cấu hình này được dùng cùng với OpenCode
    • OpenCode là trợ lý lập trình AI có thể chạy với model cục bộ
  • Máy chủ LLM chạy trên desktop, nhưng việc sử dụng diễn ra từ thiết bị khác
    • Truy cập qua mạng từ các máy khác trong nhà
    • Từ bên ngoài thì truy cập qua Tailscale
  • Trong OpenCode, việc dùng máy chủ llama.cpp được cấu hình bằng cách đặt URL API
    • Model chạy hoàn toàn cục bộ
    • Phản hồi nhanh và dữ liệu không rời khỏi mạng

Các vấn đề và giới hạn còn lại

  • V100 đôi khi biến mất sau warm reboot
    • Sau khi khởi động lại mà chỉ reboot hệ điều hành, trong khi mainboard vẫn còn cấp điện, đôi lúc lspcinvidia-smi không còn thấy V100
    • Có vẻ là vấn đề ACPI enumeration của khe PCIe
    • Nếu tắt nguồn hẳn, chờ vài giây rồi bật lại bằng cold reboot thì luôn khôi phục được
  • Nếu không có V100 thì llama.cpp không thể khởi động
    • Vì model không vừa trong một GPU 16GB duy nhất
    • Dịch vụ sẽ lặp crash loop cho đến khi GPU quay lại
    • Tác giả thường ở gần máy khi reboot nên không xem đây là vấn đề lớn trong thực tế
  • Cấu hình tensor split giữa hai GPU kiến trúc khác nhau không gọn gàng bằng một GPU đơn
    • V100 cũng không phải GPU nhanh nhất cho suy luận
    • Nhưng giá trị trên chi phí được đánh giá là rất cao

Lựa chọn và kết luận

  • Với khoảng £200, kết quả đạt được là
    • Một GPU trung tâm dữ liệu 16GB chạy cùng GPU chơi game
    • Tổng 32GB VRAM cho suy luận LLM cục bộ
    • 32 tokens/s trên model 27B tham số
    • Cửa sổ context 128k token
    • Hỗ trợ vision cho đầu vào hình ảnh
    • Model chạy hoàn toàn cục bộ, không dùng đám mây và không có chi phí theo token
  • Chi phí thực tế lớn nhất là tiếng ồn của quạt, nhưng đã được giải quyết bằng cáp jumper và xác nhận đầu nối
  • Nếu muốn chạy model cục bộ nghiêm túc thì thị trường GPU máy chủ cũ có thể là một phương án thay thế
    • Ngay cả khi không có GPU sẵn, chỉ cần một V100 đơn trong hộp máy chủ giá rẻ cũng có thể tạo môi trường LLM cục bộ dùng được với 16GB VRAM
    • V100 SXM2 không phải lựa chọn duy nhất
    • P40 cung cấp 24GB với chi phí tương tự nhưng chậm hơn và không có Tensor Cores
    • Bản V100 32GB đắt hơn nhưng vẫn rẻ hơn GPU tiêu dùng có cùng dung lượng VRAM
  • Tuy nhiên, cần chuẩn bị tinh thần cho vấn đề quạt

1 bình luận

 
Ý kiến trên Lobste.rs
  • Cách tiếp cận này thật sự rất ngầu, và hiện tượng GPU biến mất khỏi PCIe càng khiến tôi tò mò hơn vì có quá nhiều nguyên nhân có thể gây ra
    Tiếng quạt GPU gào to làm tôi nhớ lại thời còn ở đội NVIDIA CUDA. Một đồng nghiệp đang thêm tính năng điều khiển quạt vào NVML và nvidia-smi, rồi từ phía bên kia vách ngăn tôi nghe tiếng quạt lúc tăng lúc giảm, sau đó anh ấy thò đầu ra với nụ cười rạng rỡ
    Anh ấy nói đó là tính năng mình thích nhất từng làm, vì có thể nghe thấy kết quả ngay khoảnh khắc đoạn mã bắt đầu hoạt động

  • Nếu bạn quan tâm đến LLM tự host, thì Dell OEM RTX 3090 thường rẻ hơn các mẫu từ thương hiệu lớn, và đã từng có thể kiếm được với giá khoảng 800 đô Canada
    Giờ tôi phải đọc thêm về cách vLLM hoạt động. Thỉnh thoảng mô hình bắt đầu phun ra một danh sách dài các tên riêng và tính từ liên quan, nên chắc là tôi đã cấu hình sai chỗ nào đó

    • Không biết bạn đang chạy mô hình nào trên RTX 3090
      Tôi cứ nghĩ đa số mô hình dùng được đều cần ít nhất 48~64GB VRAM để chạy cho ra hồn, nên mới tưởng các chip Apple dòng M với kiến trúc bộ nhớ hợp nhất được ưa chuộng trong mảng này
  • Loại sản phẩm đó cũng đã có dạng đóng gói sẵn, nhưng kiểu như chỉ đi kèm bảo hành nhà sản xuất 3 tháng là hết
    https://ebay.com/itm/297819576914/…

    • Cái này thực sự hấp dẫn. Có vẻ nó sẽ không có bản mod quạt như bài viết ở đây nói tới
  • Ở Mỹ, mẫu 32GB hàng cũ được giao dịch ở mức khoảng 600 đô la
    Chắc tôi sẽ mua adapter trực tiếp từ Trung Quốc, nơi sản xuất của nó

  • Tôi tự hỏi phía AMD có sản phẩm tương đương nào không. Hiện tôi đang dùng hai chiếc 48GB W7900, và muốn mở rộng để có thể chạy các mô hình lớn hơn

    • Cũng có ở mức nào đó. Có Instinct MI60 cùng thời với V100, khá cũ rồi nhưng có 32GB VRAM, và vốn đã có phiên bản card PCIe
      Bạn sẽ phải tự lo phần tản nhiệt, nhưng không cần phải vọc vạch adapter
      Mỗi lần thấy một cấu hình chạy mô hình cục bộ là tôi lại đọc thử, và hiện tại ở phân khúc nhu cầu VRAM tầm trung 48~128GB dường như thật sự không có điểm ngọt về hiệu năng trên giá thành. Các lựa chọn đại khái gồm ba kiểu: nhiều GPU datacenter cũ hơn 3 thế hệ (Tesla V100, Instinct MI60), nhiều mẫu thấp nhất của thế hệ hiện tại nhưng có VRAM lớn (Arc Pro B70), hoặc các hộp all-in-one thế hệ hiện tại (DGX Spark, Mac Mini, Strix Halo)
      Với người nâng cấp từ một GPU tiêu dùng 32GB hoặc hai chiếc 16GB thì mỗi lựa chọn đều có những đánh đổi, nhưng cũng có ưu điểm. Còn nếu bạn đã dùng hai card 48GB rồi, thì tôi không chắc có bản nâng cấp phần cứng cũ nào đủ để tạo cảm giác cải thiện rõ rệt hay không