𝗟𝘂̛𝗼̛̣𝗻𝗴 𝘁𝘂̛̉ 𝗵𝗼́𝗮 𝗞𝗩 𝗖𝗮𝗰𝗵𝗲 𝗰𝗵𝗼 𝗰𝗮́𝗰 𝗟𝗟𝗠 𝗰𝗵𝗮̣𝘆 𝘁𝗿𝗲̂𝗻 𝘁𝗵𝗶𝗲̂́𝘁 𝗯𝗶̣ (𝗢𝗻-𝗗𝗲𝘃𝗶𝗰𝗲 𝗟𝗟𝗠𝘀)
Chạy Llama 3.2 3B trên một thiết bị Android với 2 GB RAM là một thử thách lớn. Hầu hết các nhà phát triển chỉ tập trung vào trọng số mô hình (model weights). Đây là một sai lầm. "Kẻ sát nhân" bộ nhớ thực sự chính là KV cache.
KV cache tăng dần khi bạn trò chuyện. Nếu bạn sử dụng độ chính xác FP16 tiêu chuẩn, cache sẽ ngốn hàng trăm megabyte. Điều này khiến ứng dụng của bạn bị crash chỉ sau vài lượt hội thoại.
Bạn có thể khắc phục điều này bằng ba bước cụ thể.
- Sử dụng Lượng tử hóa Độ chính xác Hỗn hợp (Mixed-Precision Quantization) Key và value không cần cùng một mức độ chính xác. Key cache xử lý tốt độ chính xác thấp, nhưng value cache thì không.
- Sử dụng INT4 cho keys.
- Sử dụng INT8 cho values.
Cách tiếp cận này giúp giảm 62% kích thước cache của bạn. Với ngữ cảnh 2048 token, bạn sẽ giảm từ 224 MB xuống còn 84 MB. Điều này diễn ra mà không cần thay đổi trọng số mô hình.
Triển khai Cơ chế Loại bỏ Cửa sổ Trượt (Sliding Window Eviction) Bạn không thể giữ mọi token trong bộ nhớ hoạt động. Hãy sử dụng một cửa sổ trượt để chỉ giữ lại 1536 token gần nhất. Giữ lại 64 token đầu tiên làm mốc (anchors) để bảo toàn system prompt.
Sử dụng Flash Spilling Khi các token rời khỏi cửa sổ trượt, hãy chuyển chúng sang bộ nhớ flash. Sử dụng các tệp ánh xạ bộ nhớ (memory-mapped files) trên Android. Bộ nhớ UFS 4.0 hiện đại đủ nhanh để nạp (page) dữ liệu này ngược lại bộ nhớ mà không gây trễ.
Kết quả thu được rất đáng kể. Trên Snapdragon 8 Gen 3:
- Bộ nhớ đỉnh (peak memory) giảm xuống dưới giới hạn 2 GB.
- Số lượt hội thoại tối đa tăng từ 4 lên hơn 12.
- Tốc độ token tăng lên vì cache nhỏ hơn giúp sử dụng băng thông bộ nhớ hiệu quả hơn.
- Chất lượng mô hình gần như không đổi.
Tránh những sai lầm sau:
- Đừng lượng tử hóa keys và values ở cùng một mức độ. Bạn sẽ bị giảm chất lượng.
- Đừng bỏ qua hiện tượng hạ xung nhiệt (thermal throttling). Quá trình suy luận (inference) liên tục sẽ làm thiết bị nóng lên. Hãy kiểm tra Android Thermal HAL để quản lý hiệu suất.
- Đừng quên vòng đời của cache. Luôn gắn các buffer đã ánh xạ (mapped buffers) với một phạm vi (scope) phù hợp để tránh rò rỉ bộ nhớ.
Hãy lập ngân sách bộ nhớ trước khi xây dựng các tính năng.
Nguồn: https://dev.to/software_mvp-factory/kv-cache-quantization-for-on-device-llms-kf