Trong bối cảnh các dịch vụ mô hình ngôn ngữ lớn (LLM) dựa trên đám mây ngày càng phát triển, những vấn đề về thu thập dữ liệu và khả năng truy cập ổn định luôn là mối quan tâm hàng đầu. Cá nhân tôi luôn đam mê thử nghiệm các giải pháp LLM tự host, và công nghệ đã tiến bộ vượt bậc kể từ khi chúng ta có thể chạy các mô hình mạnh mẽ, hoàn toàn miễn phí trên một card đồ họa phổ thông. Tất nhiên, khả năng vận hành sẽ phụ thuộc lớn vào cấu hình máy tính của bạn, nhưng thực tế là có rất nhiều lựa chọn ngoài kia.
Hiện tại, tôi đang chạy mô hình Gemma 27B IT QAT và Qwen 2.5 Coder 32B trên chiếc AMD Radeon RX 7900 XTX của mình, đồng thời thử nghiệm các mô hình nhỏ hơn cho mục đích kiểm tra cục bộ, như Deepseek R1 0528 Qwen 3 8B. Quá trình này đã mang lại nhiều kiến thức bổ ích, và có không ít bài học tôi ước mình đã biết ngay từ đầu, bởi chúng sẽ giúp tôi tiết kiệm rất nhiều thời gian hoặc nâng cấp hệ thống nhanh chóng hơn. Dưới đây là 7 bài học quan trọng nhất mà tôi đúc kết được. Một số dành cho những người mới bắt đầu, nhưng cũng có những điều mà ngay cả những chuyên gia tự host LLM lâu năm cũng có thể chưa biết.
1. Kích Thước Mô Hình Và VRAM Không Phải Là Tất Cả
Băng thông bộ nhớ là yếu tố quan trọng
Bài học đầu tiên mà tôi ước mình biết sớm hơn là kích thước mô hình không chỉ đơn thuần nói lên độ “thông minh” của nó, mặc dù các tham số của mô hình thường tỷ lệ thuận với khả năng của nó. Tuy nhiên, có một khía cạnh khác cần xem xét, đó là số lượng token được tạo ra mỗi giây. Băng thông bộ nhớ (memory bandwidth) đóng một vai trò lớn ở đây, và đó là lý do tại sao RTX 3090 vẫn là một trong những GPU tốt nhất cho suy luận cục bộ, bất chấp sự ra đời của 4090 và 5090. Điều này là nhờ băng thông bộ nhớ cao và chi phí thấp hơn so với các card RTX xx90 mới hơn. Mặc dù các card mới này có hiệu năng tốt hơn RTX 3090 ở nhiều khía cạnh, nhưng không đến mức bạn mong đợi khi so sánh riêng về suy luận. Để tham khảo, RTX 5090 có thể tăng hiệu năng từ hai đến ba lần so với 3090 (mặc dù nó cũng có 32GB VRAM), trong khi nâng cấp từ 3090 lên 4090 chỉ mang lại cải thiện nhỏ đối với các mô hình ngôn ngữ lớn.
Có một phần khác của phương trình cũng cần được xem xét, đó là cửa sổ ngữ cảnh (context window). Các mô hình ngôn ngữ tính toán “vị trí” của chúng bằng cách sử dụng RoPE (Rotary Positional Embeddings) được mã hóa trong các transformer. RoPE hoạt động như một thước đo toán học đặt trên chuỗi. Tăng độ dài của thước này (cửa sổ ngữ cảnh) có nghĩa là nhiều phép nhân hơn trong mỗi lần truyền và một bộ đệm key-value lớn hơn. Ví dụ, tăng gấp đôi độ dài ngữ cảnh (từ 8K token lên 16K) có thể làm giảm hiệu năng đi một nửa. Có các phương pháp mở rộng RoPE (như NTK hoặc yaRN) để kéo dài ngữ cảnh hơn nữa, nhưng việc mở rộng đó có thể làm mờ các chi tiết, làm giảm chất lượng phản hồi khi cuộc trò chuyện kéo dài.
Có những cách tốt hơn để cung cấp thêm thông tin mà không cần lấp đầy cửa sổ ngữ cảnh, nhưng việc cố gắng tăng độ dài ngữ cảnh để mang lại cho LLM khả năng ghi nhớ siêu phàm sẽ phải trả giá. Hiệu năng sẽ nhanh chóng suy giảm theo thời gian, và nếu bạn vượt quá VRAM và bắt đầu chạm đến RAM hệ thống, mọi thứ sẽ chỉ tồi tệ hơn.
2. Lượng Tử Hóa (Quantization) Là Người Bạn Thân Của Bạn
Giảm mức sử dụng bộ nhớ với tác động hiệu năng không đáng kể
Lượng tử hóa (Quantization) là một trong những điều quan trọng nhất cần tìm hiểu khi nói đến LLM tự host, vì nó quyết định rất nhiều thứ. Về cơ bản, nó nén các số dấu phẩy động 16-bit hoặc 32-bit liên tục tạo nên một mạng nơ-ron thành ít bit hơn, lưu trữ các giá trị gần đúng đủ tốt cho suy luận. Trên thực tế, lượng tử hóa số nguyên 8-bit (INT8) khá phổ biến ở thời điểm hiện tại và thường có thể chạy mà không cần huấn luyện lại.
Mô hình DeepSeek LLM đang được chạy trên Mac Studio M3 Ultra, minh họa việc sử dụng lượng tử hóa để tối ưu bộ nhớ.
Nói cách khác, hãy lấy phiên bản 671B tham số của mô hình R1 của DeepSeek, cụ thể là phiên bản Q4_K_M được lượng tử hóa 4-bit. Có rất ít sự suy giảm về chất lượng so với mô hình đầy đủ không được lượng tử hóa, nhưng việc giảm dung lượng bộ nhớ lại là một vấn đề lớn. Dưới đây là cách đọc các ký hiệu:
- Qx: Đây là mức lượng tử hóa, chỉ lượng bộ nhớ được sử dụng để lưu trữ trọng số của mô hình.
- K: Đề cập đến nhóm các sơ đồ k-quant (ban đầu là “k-means”/lượng tử hóa cải tiến) trong llama.cpp, sử dụng các khối được nhóm với dữ liệu tỷ lệ và tối thiểu bổ sung để có độ chính xác tốt hơn.
- M: Đề cập đến các tensor nhận các định dạng phụ có độ chính xác cao hơn, có thể là S (small), M (medium) hoặc L (large).
Vì vậy, Q4_K của mô hình Deepseek R1 ban đầu (không phải 0528) có kích thước khoảng 400GB. Vậy còn Q6_K và Q8_0 thì sao? Chúng có kích thước lần lượt khoảng 550GB và 713GB, nhưng sự khác biệt về hiệu năng kỹ thuật giữa chúng là rất nhỏ. Điều này có nghĩa là một mô hình về lý thuyết cần 713GB RAM để chạy có thể chạy trên một máy với ít hơn 500GB, đây thực sự là một điều đáng kể. Chuyển từ Q8 sang Q4 sẽ thấy mức sử dụng bộ nhớ giảm gần một nửa, như chúng ta có thể thấy ở trên, nhưng nhờ công nghệ nền tảng của việc triển khai các mô hình ngôn ngữ cục bộ, nó vẫn gần như tốt như ban đầu. Về cơ bản, nó sử dụng một tensor dấu phẩy động được nén cùng với siêu dữ liệu, có nghĩa là nó có thể tái tạo lại các giá trị tại thời điểm chạy, mang lại kết quả tương tự như một mô hình lớn hơn nhưng với bộ nhớ thấp hơn nhiều.
Tuy nhiên, có những hạn chế đối với việc lượng tử hóa quá mức, chẳng hạn như lỗi tái tạo cao hơn. Điều này có nghĩa là các từ hiếm hoặc lý luận số tinh tế có thể thất bại khi mọi phép toán đều được làm tròn. Mặc dù vậy, việc tiết kiệm VRAM và băng thông theo cấp số nhân thường lớn hơn so với việc mất độ chính xác đôi khi xảy ra, đặc biệt đối với các trường hợp sử dụng “cơ bản” hơn. Sự đánh đổi hiệu năng rất nhỏ sẽ cho phép bạn chạy một mô hình lớn hơn so với bình thường. Hơn nữa, gần như chắc chắn rằng mô hình nhỏ hơn sẽ có hiệu năng kém hơn ở tất cả các hạng mục so với phiên bản lượng tử hóa của mô hình lớn hơn.
3. Đừng Quên Tính Đến Chi Phí Điện Năng
Cùng với chi phí phần cứng
Trong khi một LLM tự host có vẻ là một cách tiết kiệm chi phí để có được suy luận cục bộ tốt, nhiều người quên đi các hóa đơn tiền điện liên quan và các chi phí khác có thể tích lũy khi triển khai một LLM được host cục bộ. RTX 4090 có TDP 450W, và chi phí điện trung bình ở Mỹ là 0.16 đô la mỗi kWh. Điều đó có nghĩa là bạn có thể phải trả hơn 50 đô la tiền điện mỗi tháng nếu bạn chạy nó hết công suất. Rõ ràng, hầu hết mọi người sẽ không làm vậy, nhưng ngay cả khi sử dụng nó thường xuyên trong ngày cũng có thể tăng lên nhanh chóng, và có thể tốn kém hơn so với việc sử dụng các API của Gemini hoặc OpenAI để truy cập vào các mô hình mạnh mẽ hơn đáng kể.
Cận cảnh bộ nguồn (PSU) bên trong một máy tính chơi game, tượng trưng cho chi phí điện năng và phần cứng cần thiết khi chạy LLM tự host.
Điều này còn trở nên khó kiểm soát hơn nếu bạn đang tìm cách sử dụng nhiều GPU để suy luận, và đó là chưa kể đến việc phân phối điện mà bạn sẽ cần tính đến, hệ thống tản nhiệt tùy chỉnh và bất kỳ phần cứng nào khác bạn cần mua thêm. Tôi đã thấy mọi người nói rằng họ có thể tiết kiệm tiền bằng cách tự host mô hình của mình thay vì trả tiền cho ChatGPT Plus hoặc gói AI của Google One, và điều đó có lẽ đúng trên bề mặt, nhưng hãy cộng thêm chi phí của GPU và các phần cứng khác, và bạn có thể thấy mình chi tiêu nhiều hơn về lâu dài.
4. Không Chỉ Tập Trung Vào Nvidia
Intel và AMD cũng có thể là lựa chọn tuyệt vời
Mặc dù đây là một phát triển tương đối gần đây, Nvidia không còn là người chơi duy nhất trong cuộc chơi LLM tự host nữa. Như tôi đã đề cập, tôi sử dụng AMD Radeon RX 7900 XTX cho các mô hình tự host của mình, và tôi cũng đã thử nghiệm Intel Arc A770 với 16GB VRAM. AMD hiện có hỗ trợ chính thức trong các công cụ như Ollama, và mặc dù cần nhiều công sức hơn một chút, bạn cũng có thể sử dụng GPU Intel thông qua phiên bản IPEX LLM của Ollama.
Card đồ họa Intel Arc A770, thể hiện lựa chọn thay thế cho GPU Nvidia trong việc tự host LLM và mở rộng khả năng tương thích phần cứng.
Mặc dù Nvidia chắc chắn thống trị khi nói đến khả năng tạo token mỗi giây thuần túy, thực tế là các GPU của Nvidia rất được săn đón đến mức bạn có thể không mua được một card Nvidia cao cấp cho hệ thống của mình. Một chiếc A770 sẽ mang lại hiệu năng khá tốt khi nói đến các mô hình ngôn ngữ, và tôi đã rất hài lòng với chiếc 7900 XTX của mình. Ngay cả với mô hình Gemma 27B tôi đang chạy, tôi vẫn thấy tốc độ tạo token hơn 30 token mỗi giây. Hơn nữa, nó có 24GB VRAM, chỉ bị vượt qua bởi RTX 5090 và ngang bằng với RTX 4090 trong khi có chi phí thấp hơn đáng kể.
Nvidia chắc chắn là lựa chọn ưu tiên, nhưng nếu một card Nvidia là không khả thi, hãy xem xét AMD và Intel. Hãy nghiên cứu hiệu năng cho các loại mô hình bạn muốn chạy và xem liệu card của họ có phù hợp với nhu cầu của bạn không. Bạn có thể sẽ bất ngờ đấy.
5. Prompt Engineering Và Sử Dụng Công Cụ Là Cách Tuyệt Vời Để Tận Dụng Mô Hình Nhỏ
Đừng chỉ tăng cường tham số một cách “thô bạo”
Nếu bạn đang chạy một mô hình nhỏ hơn và muốn có hiệu năng tốt hơn, đừng chỉ chuyển đổi mô hình với hy vọng rằng vài tỷ tham số bổ sung sẽ giải quyết mọi vấn đề. Thay vào đó, đây là một vài lời khuyên, và lời khuyên đầu tiên là hãy suy nghĩ lại các câu lệnh (prompts) của bạn. Một câu lệnh ngắn gọn, trực tiếp và toàn diện sẽ mang lại kết quả tốt hơn so với một câu lệnh mơ hồ, mở. Chỉ vì bạn đã quen với Gemini, ChatGPT hay Claude, vốn có thể hoạt động tốt với các câu lệnh mơ hồ, không có nghĩa là bạn có thể tiếp cận một mô hình nhỏ hơn đáng kể đang chạy trên máy tính hoặc máy chủ tại nhà của bạn theo cùng một cách. Nếu bạn trực tiếp và đi đúng trọng tâm, các mô hình của bạn có thể sẽ hoạt động tốt hơn đáng kể, vì vậy hãy suy nghĩ lại các câu lệnh nếu câu trả lời bạn nhận được chưa đủ tốt.
Lời khuyên tiếp theo là tận dụng Tạo Sinh Nâng Cao Với Truy Vấn (Retrieval Augmented Generation – RAG). Điều này cung cấp cho mô hình của bạn một tập dữ liệu để nó có thể dựa vào đó đưa ra câu trả lời, dẫn đến độ chính xác cao hơn trong các phản hồi mà không cần phải tải toàn bộ độ dài ngữ cảnh của mô hình với mọi thông tin có liên quan tiềm năng. Vì nó lấy dữ liệu từ dữ liệu thực tế tồn tại trên thiết bị, nó cũng làm giảm xu hướng “ảo giác” (hallucinations), vốn có thể là một vấn đề đối với các mô hình nhỏ hơn. RAG rõ ràng sẽ không giải quyết mọi vấn đề (cũng như nó sẽ không mang lại cho mô hình 7B tham số tất cả khả năng của mô hình 70B tham số), nhưng nó có thể cải thiện hiệu năng đáng kể nếu mục tiêu chính của bạn khi sử dụng LLM là truy vấn dữ liệu. Chat with RTX của Nvidia là một minh họa tuyệt vời về cách RAG có thể tăng tốc suy luận cục bộ.
Lời khuyên cuối cùng là sử dụng công cụ (tools). Các công cụ trong bối cảnh của một LLM là các tiện ích phần mềm được thiết kế để mô hình vận hành và có thể được gọi khi cần thiết. Ví dụ, JSON Toolkit cung cấp cho một LLM khả năng khám phá một phản hồi JSON một cách lặp đi lặp lại mà không làm lãng phí ngữ cảnh quý giá với dữ liệu vô dụng đối với truy vấn thực tế được đưa ra. Điều tương tự cũng xảy ra với công cụ Pandas Dataframe, vì thay vì tải toàn bộ dataframe vào ngữ cảnh, LLM có thể sử dụng công cụ Pandas Dataframe để chạy mã Python sẽ tìm thấy câu trả lời, bỏ qua nhu cầu xem xét toàn bộ dataframe. Có rất nhiều loại công cụ khác nhau mà bạn có thể sử dụng, và trong nhiều trường hợp, không cần thiết phải “tăng cường trí thông minh” một cách thô bạo bằng cách chỉ sử dụng một mô hình lớn hơn.
6. Mô Hình Mixture Of Experts (MoE) Cho Phép Chạy Mô Hình Lớn Hơn Trong Hạn Chế VRAM
Mặc dù cần một chút công sức ban đầu
Các mô hình ngôn ngữ Mixture-of-Experts (MoE) tương đối mới, nhưng khái niệm trong AI đã có từ hàng thập kỷ và đã được sử dụng trong các bối cảnh học sâu cho nghiên cứu và tính toán. Các mô hình này về cơ bản phân vùng một mạng lưới các “chuyên gia” với một cổng nhẹ quyết định chuyên gia nào xử lý tác vụ nào. Điều này không có nghĩa là dung lượng bộ nhớ của nó ít hơn so với một mô hình khác có cùng lượng tử hóa và số lượng tham số. Tuy nhiên, điều này có nghĩa là bạn có thể điều chỉnh việc tải mô hình để các tensor ít được truy cập hơn được offload sang RAM hệ thống, chừa chỗ trong VRAM của GPU cho các tensor mà chúng ta muốn truy cập thường xuyên.
Kết quả phản hồi của mô hình Mistral AI trên Raspberry Pi 5, minh họa khả năng chạy mô hình Mixture of Experts (MoE) trên phần cứng hạn chế.
Đây là một chủ đề nâng cao hơn đáng kể, và không thực sự là một mẹo mà những người mới nên cố gắng làm theo ngay lập tức. Tuy nhiên, điều quan trọng là phải biết rằng nếu bạn thấy mình bị hạn chế bởi VRAM, có những giải pháp có thể giảm bớt tác động đến hiệu năng khi nói đến các mô hình MoE. Có rất nhiều mô hình MoE khác nhau ngoài kia, và một khi bạn đã quen thuộc với công cụ lựa chọn của mình, bạn có thể bắt đầu khám phá tùy chọn này nhiều hơn để chạy các mô hình lớn hơn trên máy của mình theo cách tận dụng tối đa VRAM và offload các phần ít được truy cập nhất của mô hình sang RAM hệ thống.
7. Bắt Đầu Đơn Giản
LM Studio là một điểm khởi đầu tuyệt vời
Thay vì đầu tư toàn lực vào việc thiết lập các công cụ như Ollama và Open Web UI, vốn có thể gây nản lòng cho những người tự host LLM lần đầu, hãy sử dụng một giao diện đồ họa như LM Studio để bắt đầu. Nó siêu đơn giản; sử dụng tính năng tìm kiếm tích hợp để tìm một mô hình, tải xuống và chạy nó. Bạn không cần thực hiện bất kỳ cấu hình nào, và nó là một giải pháp “plug-and-play” tương đương khi nói đến LLM. Nó đi kèm với tất cả các thư viện bạn cần để tận dụng tối đa phần cứng của mình, và hoạt động trên Windows, Linux và macOS, vì vậy nó loại bỏ mọi khó khăn trong việc tìm ra chính xác những gì bạn cần để chạy một LLM trên hệ thống của mình.
Tuyệt vời hơn nữa, cho mục đích phát triển, LM Studio có thể host một máy chủ tương thích OpenAI trong nền, vì vậy bạn có thể sử dụng nó để thử nghiệm các ứng dụng hoặc công cụ của riêng mình hiểu được OpenAI API khi bạn trỏ chúng đến endpoint được host cục bộ của mình. Nó dễ dàng, miễn phí và là một cách tuyệt vời để bắt đầu và cảm nhận việc tự host LLM trước khi triển khai đầy đủ ở một nơi khác. Tất cả các cài đặt chính mà bạn có thể muốn sửa đổi, từ system prompts đến context lengths, đều có thể sửa đổi được, vì vậy đây là một cách tuyệt vời để bắt đầu.
Lời kết
Việc tự host mô hình ngôn ngữ lớn (LLM) mang lại quyền kiểm soát vượt trội về dữ liệu và hiệu năng, nhưng cũng đi kèm với những thách thức riêng. Qua 7 bài học trên, chúng ta đã thấy rằng việc tối ưu hóa không chỉ dừng lại ở kích thước mô hình hay dung lượng VRAM, mà còn liên quan đến băng thông bộ nhớ, kỹ thuật lượng tử hóa thông minh, quản lý chi phí điện năng, và việc mở rộng tư duy sang các nhà sản xuất GPU khác ngoài Nvidia. Hơn nữa, những chiến lược như Prompt Engineering, RAG (Retrieval Augmented Generation) và sử dụng công cụ có thể nâng cao đáng kể khả năng của cả những mô hình nhỏ hơn, trong khi Mô hình Mixture of Experts (MoE) mở ra cánh cửa cho việc chạy các mô hình phức tạp hơn với nguồn lực hạn chế.
Cuối cùng, dù bạn là người mới hay đã có kinh nghiệm, hãy nhớ rằng bắt đầu một cách đơn giản với các công cụ như LM Studio có thể giúp bạn làm quen và tự tin hơn trước khi khám phá sâu hơn. Hy vọng những chia sẻ này sẽ giúp bạn tối ưu hóa trải nghiệm tự host LLM của mình một cách hiệu quả nhất. Bạn có những bài học hay mẹo nào khác muốn chia sẻ không? Hãy để lại bình luận bên dưới và cùng thảo luận nhé!