如何在 4GB 显卡上跑 70B 大模型:AirLLM 低显存推理完整指南
【免费下载链接】airllmAirLLM 70B inference with single 4GB GPU项目地址: https://gitcode.com/GitHub_Trending/ai/airllm
70B 大模型向来不是普通显卡能碰的领域——全精度推理需要上百 GB 显存,绝大多数人只能看看参数表。AirLLM 把这道门槛降了下来:单张 4GB 显卡跑 70B,8GB 显存跑 405B,而且不需要量化和蒸馏。思路一句话:把模型放在磁盘上,一层一层流式搬进 GPU 显存,边搬边算。本文带你 10 分钟走完安装、首跑、调参与避坑。
一分钟搞懂层间流式加载原理
看流媒体视频时,播放器不用把整部片子下完才播,而是边看边取后面的片段。AirLLM 的显存优化就是这个思路:首次加载时把模型按层拆开存到磁盘;推理时 GPU 里只驻留当前正在算的那一层,算完就腾掉、再装下一层。为了避免干等磁盘,它还会在当前层计算的同时预取下一层,让 IO 和计算互相重叠。所以显存占用只取决于单层大小,与总参数量无关——70B 因此能塞进 4GB,405B 能塞进 8GB,连 Kimi K3(2.8T 稀疏 MoE)也能以不到 4GB 流式运行。
三步跑起第一个 70B 大模型
从零到第一次回答分三步。第一步,安装,它是一个 pip 包,前提是已有 PyTorch 和 CUDA 环境:
pip install airllm第二步和第三步,加载模型、提问:
from airllm import AutoModel # 首次运行会逐层拆分模型并落盘, 磁盘留足空间 model = AutoModel.from_pretrained("Qwen/Qwen-7B") # HF 仓库 ID 或本地路径均可 input_tokens = model.tokenizer(['What is the capital of China?'], return_tensors='pt', padding=False, truncation=True, max_length=128) out = model.generate(input_tokens['input_ids'].cuda(), max_new_tokens=20, use_cache=True, return_dict_in_generate=True) print(model.tokenizer.decode(out.sequences[0]))与普通 transformers 模型唯一的区别:首次运行会慢一些,因为它在拆层写盘,之后再跑就直接复用逐层文件了。
显存与速度的代价:AirLLM 方案对比
说实话,账要算清楚:
| 项目 | 传统全精度加载 | AirLLM 层间流式 |
|---|---|---|
| 70B 所需显存 | 百 GB 级(BF16 权重约 140GB) | 约 4GB |
| 每 token 速度 | 最快,无磁盘 IO | 瓶颈在逐层读盘,明显更慢 |
| 硬件成本 | 多卡或大显存服务器卡 | 单张 4GB 消费级显卡 |
| 模型覆盖 | 取决于显存预算 | Llama、Qwen、ChatGLM 等主流开源家族 |
取舍是真实的:拿速度换显存。每个 token 都要经历逐层从磁盘搬入,端到端速度无法和全量驻留 GPU 的模型比。换来的是以前要集群显存的事,现在一台台式机就能干。在意速度可以看下一节的 4bit/8bit 压缩,最多能提速 3 倍。
主流模型加载:Llama、Qwen、ChatGLM 怎么换
AutoModel 会根据模型 config 识别架构,所以所有主流家族走同一行代码,只换仓库 ID:
- Llama 系:
AutoModel.from_pretrained('meta-llama/Llama-2-7b-hf')(gated 模型需带 hf_token,见踩坑手册) - Qwen 系:
AutoModel.from_pretrained('Qwen/Qwen-7B'),新的 Qwen3 系列同样可直接替换 - ChatGLM:
AutoModel.from_pretrained('THUDM/chatglm3-6b-base') - Baichuan、InternLM、Mistral 等同理,更多模型示例见 air_llm/examples/run_all_types_of_models.ipynb
Apple Silicon 的 Mac 也能跑:额外pip install mlx后代码完全不用改,AutoModel 在 macOS 上会自动切换到 MLX 后端,参考 air_llm/examples/run_on_macos.ipynb。
常见报错排查:四个高频坑
- 拆层时出现
safetensors_rust.SafetensorError: MetadataIncompleteBuffer:原因是磁盘写满,拆层过程会临时占用数倍于模型的磁盘空间;解法是清理 HF cache、扩容,或重跑时传delete_original=True删掉原始模型省一半磁盘。 - 下载模型报
401 Client Error ... is gated:模型被设为 gated 需要鉴权;解法是加载时传hf_token='你的HF令牌'。 - 分词时抛
ValueError: Asking to pad but the tokenizer does not have a padding token:该模型分词器没有 padding token;解法是分词时设padding=False。 - 加载 QWen/ChatGLM 时抛
ValueError: max() arg is an empty sequence:原因一般是硬编码了 AirLLMLlama2 类去加载非 Llama 模型;解法统一用 AutoModel 自动识别。
进阶调参:压缩、预取等参数一览
参数都在from_pretrained里直接传:
| 参数 | 默认 | 作用 |
|---|---|---|
compression | None | 传 '4bit'/'8bit' 做块级量化压缩权重(需 bitsandbytes),加载体积变小、最多提速 3 倍,精度损失很小 |
prefetching | 开 | 计算当前层时预取下一层,重叠 IO 与计算,约提速 10%(目前仅 Llama 系) |
profiling_mode | False | True 时打印各阶段耗时,定位慢在哪 |
layer_shards_saving_path | HF cache | 逐层拆分文件的自定义存放路径 |
delete_original | False | 拆完删除原始模型,省一半磁盘 |
hf_token | None | gated 模型鉴权 |
例如:AutoModel.from_pretrained('meta-llama/Llama-2-7b-hf', compression='4bit')。
收尾:接下来去哪里
AirLLM 不会让推理变快,它只是把显存门槛降了下来。但「跑得动」和「跑不动」是两回事:单张 4GB 显卡上体验 70B 级别模型的行为,做模型评估、RAG 演示、教学都够用了。
想继续深入:完整参数清单与 FAQ 在 README.md,最小可运行脚本在 air_llm/inference_example.py。手边有闲卡的话,pip install airllm跑一次就知道了。
【免费下载链接】airllmAirLLM 70B inference with single 4GB GPU项目地址: https://gitcode.com/GitHub_Trending/ai/airllm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考