AirLLM: Chạy LLM 70B trên GPU 4GB
AirLLM cho phép bạn chạy model Llama 70B trên một GPU 4GB duy nhất bằng cách tải từng layer transformer lên card thay vì tải toàn bộ model cùng lúc. Hãy dùng AirLLM nếu bạn có ổ đĩa dung lượng lớn và đủ kiên nhẫn với tốc độ decode chậm theo từng layer; bỏ qua nếu bạn cần throughput tương tác nhanh, vì việc stream weight từ đĩa ở mỗi token chính là đánh đổi, không phải một giải pháp miễn phí.
AirLLM Là Gì?
AirLLM là một thư viện Python giúp giảm nhu cầu bộ nhớ GPU cho việc chạy inference các large language model, bằng cách phân rã model thành từng layer và tải chúng lên GPU lần lượt thay vì tải toàn bộ cùng lúc. AirLLM được phân phối dưới dạng gói pip airllm và cung cấp hàm AutoModel.from_pretrained() theo mô hình của Hugging Face Transformers, nên việc thay bằng một Hugging Face repo ID gần như là toàn bộ công việc tích hợp cho LLM inference.
AirLLM Tối Ưu VRAM Như Thế Nào
- ✓Streaming từng layer một: tại mỗi thời điểm chỉ có một layer transformer nằm trên GPU, nên lượng VRAM cần dùng phụ thuộc vào kích thước của một layer, không phải tổng số tham số của cả model.
- ✓Với model sparse MoE, AirLLM stream từng expert một thay vì cả layer — đây là cách AirLLM chạy được Kimi K3 (2.8T tham số) trong dưới 4GB, đo được ở mức 3.72GB trên một RTX 6000 Ada.
- ✓Tùy chọn nén block-wise quantization ('4bit' hoặc '8bit') giúp thu nhỏ model trên đĩa hơn nữa và theo README, tăng tốc inference lên tới 3x với mức mà README gọi là 'gần như không đáng kể' về độ chính xác.
- ✓Prefetching chồng lấp việc tải model với quá trình tính toán, changelog ghi nhận mức cải thiện tốc độ 10%.
- ✓Bước phân rã layer-wise diễn ra một lần, tách và lưu checkpoint gốc dưới dạng safetensors ra đĩa trước lần inference đầu tiên, nên lần chạy đầu cần dung lượng đĩa trống thực sự.
- ✓delete_original cho phép xóa checkpoint Hugging Face gốc đã tải về sau khi chuyển đổi, chỉ giữ lại bản đã tách layer để tiết kiệm dung lượng đĩa.
Các Model Được Hỗ Trợ Và Yêu Cầu GPU
- •Chạy các model dòng Llama (2, 3, 3.1, 3.3, 4) trên một GPU tiêu dùng duy nhất thay vì một dàn nhiều GPU.
- •Tải các checkpoint Qwen (1, 2, 2.5, 3, gồm cả biến thể MoE và FP8) để inference cục bộ.
- •Chạy DeepSeek V2, V3 và R1, bao gồm DeepSeek-V3 (671B tham số) với khoảng 12GB VRAM theo bảng của README.
- •Thử Mistral, Mixtral, Phi, Gemma, ChatGLM, Baichuan, InternLM hoặc Yi qua cùng một lệnh AutoModel.
- •Chạy Llama 3.1 405B với khoảng 8GB VRAM, hoặc một model Llama 3.x 70B ở full precision với khoảng 4GB, theo bảng VRAM của README.
Bắt Đầu Với AirLLM
Cài đặt được tài liệu hóa rõ với một lệnh pip duy nhất: `pip install airllm`. Để dùng tính năng tăng tốc bằng model compression, README yêu cầu thêm một dependency: `pip install -U bitsandbytes`, cùng với việc đảm bảo phiên bản airllm đã cài mới hơn 2.0.0 (`pip install -U airllm`). Hỗ trợ MacOS cần cài mlx và torch riêng, chỉ chạy trên Apple silicon; README cũng lưu ý một số máy MacOS cần cài Python bản native thay vì bản Homebrew. Hỗ trợ Kimi K3 kéo theo thêm các gói khác — `pip install compressed-tensors flash-attn`, bản torch build cho CUDA 12, và transformers ghim ở nhánh 4.56.x, vì remote code của model này không load được trên transformers 5.x.
Thực Hiện LLM Inference
Cách dùng được tài liệu hóa bằng Python có thể chạy trực tiếp: `from airllm import AutoModel`, sau đó `model = AutoModel.from_pretrained("Qwen/Qwen3-32B")` — dùng repo ID Hugging Face bất kỳ hoặc đường dẫn local đều hoạt động như nhau. Tokenize input bằng chính `model.tokenizer(...)`, gọi `model.generate(input_tokens['input_ids'].cuda(), max_new_tokens=20, use_cache=True, return_dict_in_generate=True)`, rồi decode bằng `model.tokenizer.decode(...)`. README lưu ý lần gọi đầu tiên sẽ phân rã và lưu checkpoint ra đĩa theo từng layer trước khi bắt đầu generate, nên cần chuẩn bị dung lượng đĩa xấp xỉ kích thước đầy đủ của model cho lần chạy đầu. Các model Hugging Face bị gated cần truyền tham số `hf_token` khi load.
Điểm Mạnh
- ✓Chỉ một lệnh `AutoModel.from_pretrained()` bao phủ Llama, Qwen, DeepSeek, Mistral, Mixtral, Phi, Gemma, ChatGLM, Baichuan, InternLM và Yi — không cần chọn class riêng cho từng dòng model.
- ✓API bám sát Hugging Face Transformers đến mức các lệnh tokenizer và generate() hiện có gần như không cần viết lại.
- ✓Yêu cầu GPU tỉ lệ theo kích thước một layer của model thay vì tổng số tham số, đó là lý do checkpoint DeepSeek-V3 671B chạy vừa trong khoảng 12GB theo bảng của README.
- ✓Nén block-wise 4-bit/8-bit là tùy chọn, không bắt buộc — bạn có thể chạy đường dẫn không nén trước rồi chỉ thêm nén khi đĩa hoặc tốc độ trở thành vấn đề.
Lưu Ý Và Yêu Cầu
- △Lần chạy đầu tiên phải lưu lại toàn bộ checkpoint ra đĩa theo từng layer trước khi generate được gì, nên dung lượng đĩa — chứ không phải VRAM — mới là nút thắt thực sự mà README nhắc tới.
- △Streaming từng layer đánh đổi tốc độ lấy bộ nhớ: chính các con số trong README mô tả cơ chế này là bị giới hạn bởi đĩa, và lỗi đầu tiên trong FAQ (MetadataIncompleteBuffer) xảy ra do hết dung lượng đĩa giữa lúc split model.
- △Hỗ trợ MacOS chỉ dành cho Apple silicon và cần cài mlx cùng torch, README còn cảnh báo một số máy cần cài Python bản native thay vì bản Homebrew.
- △Hỗ trợ model mới nhất không miễn phí về mặt cài đặt: Kimi K3 cần compressed-tensors, flash-attn, bản torch CUDA 12, và transformers ghim ở 4.56.x — không cái nào áp dụng cho bản cài đặt cơ bản.
Các Phương Pháp Tối Ưu Bộ Nhớ LLM Khác
Câu Hỏi Thường Gặp
Lỗi `safetensors_rust.SafetensorError: ... MetadataIncompleteBuffer` của AirLLM hầu như luôn có nghĩa là đĩa hết dung lượng trong lúc split layer, vì quá trình này rất tốn đĩa. Cách khắc phục theo README là giải phóng dung lượng đĩa, xóa cache Hugging Face rồi chạy lại.
Lỗi này ở AirLLM thường do bạn load checkpoint QWen hoặc ChatGLM bằng class AirLLMLlama2. Chuyển sang `from airllm import AutoModel` rồi gọi `AutoModel.from_pretrained(...)`, đây là cách khắc phục mà README liệt kê cho cả hai dòng model.
Truyền access token Hugging Face của bạn qua tham số `hf_token` khi gọi `AutoModel.from_pretrained(...)`, ví dụ `AutoModel.from_pretrained("meta-llama/Llama-2-7b-hf", hf_token='HF_API_TOKEN')`. Nếu không, AirLLM sẽ báo lỗi 401 với các repo bị gated như trên.
AirLLM có thể báo một `ValueError` về việc thiếu padding token với vài model. Cách khắc phục theo README là truyền `padding=False` trong lệnh gọi `model.tokenizer(...)` thay vì tự đặt padding token.
Vấn Đề AirLLM Giải Quyết
Chạy một model 70B tỷ tham số thông thường đòi hỏi sở hữu hoặc thuê nhiều GPU VRAM lớn, vì toàn bộ weight phải nằm trong bộ nhớ GPU cùng lúc. Góc nhìn riêng của AirLLM là phần lớn áp lực bộ nhớ đó đến từ việc giữ mọi layer thường trú cùng lúc, chứ không phải từ khối lượng tính toán, nên cách AirLLM tối ưu bộ nhớ GPU là thay đổi những gì đang thường trú tại một thời điểm chứ không phải thu nhỏ weight — đó chính là điều biến một card 4GB thành thứ có thể hoàn thành một forward pass 70B.
Ai Nên Dùng — Và Ai Nên Bỏ Qua
Hãy thử AirLLM nếu bạn đang thử nghiệm một model 70B+ trên một GPU tiêu dùng duy nhất, có ổ đĩa local nhanh và đủ kiên nhẫn với tốc độ sinh token chậm do bị giới hạn bởi đĩa — phù hợp với sinh viên, người tự học và researcher muốn kiểm tra xem một model có vừa hay không trước khi thuê GPU cloud. Bỏ qua nếu bạn đang phục vụ traffic production nơi throughput và latency quan trọng, hoặc nếu bạn đã chạy model GGUF đã quantize qua Ollama hay llama.cpp và không cần weight full-precision.
