30 điểm bởi GN⁺ 2025-08-13 | 6 bình luận | Chia sẻ qua WhatsApp
  • Tận dụng tùy chọn --cpu-moe của llama-cpp để xử lý các lớp chuyên gia MOE trên CPU, đồng thời chỉ offload các lớp attention lên GPU, nhờ đó đạt hiệu năng prefill nhanh với 5~8GB VRAM
  • Trên GPU chỉ giữ KV cache, trọng số và activation của Attention, bảng định tuyến, LayerNorm cùng các tham số không thuộc chuyên gia, nên mức dùng bộ nhớ thấp
  • Ngay cả với GPU tầm RTX 3060Ti và 64GB~96GB RAM hệ thống, vẫn có thể chạy nhẹ nhàng mô hình 120B; hiệu năng tối ưu nhất đạt được trên GPU hỗ trợ BF16 (RTX 3000+)
  • Khi dùng 5GB VRAM, hiệu năng ghi nhận là 8.15ms mỗi token (122.66 token/giây), và khi dùng 8GB VRAM thì cải thiện lên 7.44ms mỗi token (134.44 token/giây)
  • Kiến trúc 120B được thiết kế tối ưu cho phần cứng tiêu dùng, cho phép chạy tốc độ cao ngay cả trong môi trường thiếu tài nguyên GPU

Cấu trúc CPU-MOE và GPU offloading

  • Dùng tùy chọn --cpu-moe để xử lý toàn bộ lớp chuyên gia (MOE) trên CPU
    • Ví dụ: --n-cpu-moe 36 → chạy toàn bộ 36 khối MOE trên CPU
    • Khi cần có thể chuyển một phần MOE sang GPU để tinh chỉnh hiệu năng
  • Chỉ giữ những thành phần sau trên GPU để tiết kiệm VRAM
    • KV cache (sequence)
    • Trọng số và activation của Attention
    • Bảng định tuyến
    • LayerNorm và các tham số không thuộc chuyên gia khác
  • Trọng số MOE không nằm thường trú trên GPU nên không phải gánh lượng tham số MLP lớn

Yêu cầu bộ nhớ và phần cứng

  • GPU: 5~8GB VRAM là đủ (ví dụ: RTX 3060Ti)
  • GPU tối ưu khi hỗ trợ BF16 (RTX 3000 series trở lên)
  • RAM hệ thống: tối thiểu 64GB, lý tưởng là 96GB
    • Tận dụng Linux mmap nên dù toàn bộ mô hình không nằm hết trong bộ nhớ, các lớp chuyên gia “hot” vẫn được giữ trong RAM
Quảng cáo

Số liệu hiệu năng

Môi trường 5GB VRAM

  • Xử lý prompt: 8.15ms/token (122.66 token/giây)
  • Suy luận: 55.44ms/token (18.04 token/giây)

Môi trường 8GB VRAM (--n-cpu-moe 36, phần còn lại trên GPU)

  • Xử lý prompt: 7.44ms/token (134.44 token/giây)
  • Suy luận: 39.03ms/token (25.62 token/giây)

Môi trường 22GB VRAM (một phần MOE trên GPU)

  • Xử lý prompt: 6.13ms/token (163.01 token/giây)
  • Suy luận: 32.45ms/token (30.82 token/giây)

Kết luận

  • Thiết kế của GPT-OSS-120B được tối ưu để chạy mô hình lớn với tốc độ cao ngay cả trên phần cứng tiêu dùng
  • Nhờ cấu trúc CPU-MOE giúp giảm mức dùng VRAM nhưng vẫn giữ được tốc độ, mô hình này đặc biệt phù hợp với môi trường có tài nguyên GPU hạn chế

Câu hỏi trọng tâm & nội dung trả lời

Q1. Trong cấu hình này, mức sử dụng VRAM thực tế là bao nhiêu?

  • Tác giả gốc: Khoảng 5GB VRAM khi chạy toàn bộ MOE trên CPU, chỉ đưa các lớp attention lên GPU
  • Giải thích thêm: Trên GPU chỉ giữ KV cache, trọng số và activation của Attention, bảng định tuyến và LayerNorm
Quảng cáo

Q2. Tối thiểu cần bao nhiêu RAM?

  • Tác giả gốc: Tối thiểu 64GB, khuyến nghị lý tưởng là 96GB
  • Lý do: Linux mmap giữ các lớp chuyên gia “hot” trong bộ nhớ, cho phép truy cập nhanh mà không cần nạp toàn bộ mô hình

Q3. Nếu chuyển một phần lớp MOE sang GPU thì tốc độ có tăng nhiều không?

  • Tác giả gốc: Có thể nhanh hơn một chút nhưng không tạo khác biệt lớn
  • Ví dụ:
    • Toàn bộ MOE trên CPU: prompt 134 token/giây, suy luận 25 token/giây
    • 8 MOE trên GPU: prompt 163 token/giây, suy luận 30 token/giây
    • Mức dùng VRAM tăng lên 22GB

Q4. GPU nào là phù hợp?

  • Tác giả gốc: RTX 3060Ti trở lên là đủ, khuyến nghị GPU hỗ trợ BF16 (RTX 3000+)
  • Lý do: Tất cả các lớp ngoài MOE đều chạy bằng BF16

Q5. Thiết lập lệnh như thế nào?

  • Tác giả gốc: Cung cấp ví dụ theo PR #15157
    ~/build/llama.cpp/build-cuda/bin/llama-server \  
        -m $LLAMA_MODEL_DIR/gpt-oss-120b-mxfp4-00001-of-00003.gguf \  
        --n-cpu-moe 36 \  
        --n-gpu-layers 999 \  
        -c 0 -fa \  
        --jinja --reasoning-format none \  
        --host 0.0.0.0 --port 8502 --api-key "dummy"  
    

6 bình luận

 
kaydash 2025-08-14

Tôi đã thử thực tế rồi, nhưng quá chậm. Xung nhịp GPU hầu như không được dùng, VRAM chuyên dụng của GPU 8GB và RAM vật lý 64GB thì dùng kín, 16 vCore chỉ dùng khoảng một nửa. Chỉ nên hiểu là nó "vẫn chạy được" thôi, chứ không phải kiểu tận dụng hết mọi tài nguyên. Mỗi lần truy vấn mất 6~8 phút.

 
cronex 2025-08-13

Tôi cũng nên thử làm tương tự mới được.

 
crawler 2025-08-13

Tôi cứ tưởng 32GB là đủ...

 
cnaa97 2025-08-13

Trước hết, nó không chạy được trên lm studio M4 max 64gb T_T

 
jinucho 2025-08-13

Vì tận 65GB nên... tiếc thật T_T

 
GN⁺ 2025-08-13
Ý kiến trên Hacker News
  • Tò mò liệu khi chạy mô hình trực tiếp trên phần cứng của mình thì có thể gỡ guardrail hay không
    • Để vượt qua guardrail, có lẽ phải tìm một kiểu abliterated finetune theo hướng lần theo rồi xóa các đường dẫn nơ-ron gây ra phản ứng từ chối
    • Theo một bài viết tôi mới đọc, GPT-OSS chỉ được huấn luyện bằng dữ liệu nhân tạo/được tạo sinh nên ngay từ đầu đã không có nhiều “kiến thức bị cấm”
      Bài liên quan
    • Có thể vượt qua bằng prompt jailbreak, hơi phiền một chút nhưng hoạt động tốt
    • Cá nhân tôi thấy các bản đã gỡ bớt guardrail bị giảm hiệu năng khá mạnh nên không đáng
    • Về cơ bản nó được tích hợp sẵn trong mô hình, nhưng vẫn có cộng đồng chuyên crack và chỉnh sửa nó
  • Trên cấu hình 5950x + 128GB RAM + GPU 3060 12GB, tốc độ sinh token khá nhanh, nhưng chỉ cần context tăng lên một chút là tốc độ xử lý chậm đi rất nhiều
    Vì vậy tôi chủ yếu dùng các mô hình khác như qwen, mistral, gemma
    • Thay vì những mô tả chủ quan như “nhanh” hay “chậm”, tôi muốn biết các con số token cụ thể hơn
    • Ngoài chat đơn giản/chỉnh sửa văn bản, tôi tò mò mọi người định dùng mô hình này để làm gì
  • Với 32GB RAM + 16GB VRAM, có thể nạp toàn bộ mô hình 20B vào VRAM, nhưng nếu tăng cửa sổ context lên quá 8k token thì sẽ thiếu VRAM
    Người khác lại chạy được mô hình 120B với ít VRAM hơn, có lẽ do không được hỗ trợ ROCm và phải dùng Vulkan
    Dù vậy, ép phần cứng tới giới hạn vẫn khá vui
    • Khi kích thước context tăng lên, phải offload nhiều layer hơn sang RAM hệ thống
      llama.cpp cho phép tự đặt số layer tính toán trên GPU, còn ollama thì tự động điều chỉnh
      Sẽ hay hơn nếu có thể điều chỉnh động tỷ lệ RAM/VRAM theo độ dài phiên
  • Buồn cười thật khi gọi 64GB RAM + 8GB VRAM là “chỉ vừa đủ”, với tôi đó là một bộ máy trị giá cả nghìn đô
    • RAM khoảng 300 CAD, GPU khoảng 400 CAD, nếu là desktop thì có thể làm với chi phí khá rẻ
    • Đây chỉ ở mức PC gaming tầm trung-thấp, nâng cấp thêm vài trăm đô là có thể chạy ngay ở nhà
    • Cũng có sản phẩm pre-order không quá đắt, khoảng $1599~$1999
    • Có thể tự ráp bằng linh kiện mới với giá dưới 1000 USD, còn mua đồ cũ thì còn rẻ hơn và có khi GPU cũng mạnh hơn
    • DDR5 64GB vào khoảng $150, còn 3060 12GB khoảng $300, trên eBay có thể kiếm được rẻ hơn nữa
  • Tò mò không biết có ai đã chạy mô hình 20B trên MacBook Air M4 hoặc RTX 3060 chưa
  • Tôi không đủ RAM để dùng các mô hình lớn, nhưng mô hình 20B chạy nhanh trên MacBook và đủ cho nhu cầu của tôi
    Chỉ là function calling trong llama.cpp hiện vẫn đang bị lỗi
    • Lỗi đó đã được sửa trong PR này
    • May là đó là bug chứ không phải giới hạn RAM; ngay cả MacBook Air 16GB RAM cũng chạy được nhiều mô hình khá tốt
      Tôi dự định host một chatbot AI trong phòng bằng mini PC giá $149, và mô hình Qwen3 4B có vẻ khá ổn
      Kế hoạch liên quan
  • Tò mò liệu OpenWebUI hay GUI khác có tối ưu được cấu hình với mức phần cứng này không, dù có vẻ mô hình 20B sẽ phù hợp hơn
  • Tôi là người mới với LLM, nên đang thắc mắc liệu tối ưu hóa này có áp dụng được cho mọi mô hình MoE hay không
    • Cách này là áp regex vào tên layer, nên nếu quy ước đặt tên tương tự thì cũng có thể áp dụng cho mô hình khác
      Ví dụ nó đã chạy với Qwen 3, và bạn có thể tự chỉ định regex để chuyển layer cụ thể sang thiết bị cụ thể
  • Tò mò không biết bản tối ưu cho mlx có chạy được trên Mac 64GB hay không
    • Theo ước tính của LM Studio, nếu lượng tử hóa 3-bit (~50GB) thì chạy ổn