
1. 先说一个反直觉的结论显存不够不一定非要缩小模型遇到“我的显卡只有4GB想跑70B大模型”这种需求大多数人的第一反应是要么换更大的显卡要么把模型量化到更低的精度要么用API。这些方案当然都对但如果把问题换个角度想——模型权重太大显存装不下那我们不一定要让模型“变小”而是让模型“不一直住在显存里”用的时候来算完就走。AirLLM走的就是这条路。AirLLM是一个基于层间卸载layer-wise offloading思路的开源推理库它最抓眼球的能力就是标题里那句话单卡4GB显存能跑70B级别的大模型。这里的70B不只是指Llama 70B包含Llama-3-70B、Qwen-72B、Mixtral 8x7B这类超大规模权重模型都可以在这个方案下跑起来。你可能觉得这是魔法但实际上原理很简单把深度模型按层切开每次只把一层的权重拉到显存里计算算完立刻放回内存或磁盘然后加载下一层。显存里永远只住着极少数的层4GB当然够用。这个项目的价值对于普通开发者和学生党来说是很实在的你不用为了一次性的实验去买几万块的A100、4090也不用忍受云端GPU按小时计费的肉疼。它有明显的短板——慢非常慢吐字速度大概是每秒几个token的量级。但慢不等于不能用它适合的是那种“我就是要跑起来看看效果”“我要在离线环境里做推理验证”“我要给学生演示大模型怎么工作”的场景。这篇内容我会把AirLLM的核心原理、实际操作、踩坑经验、同赛道方案对比一次说清楚看完你可以在自己的机器上复现出“4GB显存跑70B”的效果也知道它的边界在哪里。2. 核心原理拆解把“地毯式驻留”改成“逐层流动”2.1 为什么常规推理会卡在显存上限上要理解AirLLM为什么能省显存先要弄清楚常规大模型推理的显存开销到底花在了哪。一个70B模型以FP16精度存权重光参数就是大约140GB。这还只是权重推理时还要给KV Cache、中间激活值分显存这部分随手又占走好几个GB。所以普通单卡哪怕有80GB显存跑一个没量化的70B也是勉强更别说4GB这种入门级显卡了。传统方案解决显存不足基本就三条路模型并行把模型切成多份分到多张卡上但这要求你有好几张卡。量化把权重从FP16压到INT8、INT4减小单卡的显存占用但大模型量化后仍然可能超过4GB而且对部分模型有精度损失。CPU卸载offload整层整层地把权重搬到CPU内存计算时再传回来减少显存压力。AirLLM属于第三条路但它把“卸载”这件事做到了极致——它不追求把模型的所有层一次性塞进显存也不做全局的显存调度而是老老实实逐层计算层和层之间决不在显存里重逢。2.2 AirLLM模型执行的流程一层一算算完即走我用一个比较直观的方式描述它在跑一次完整forward时发生了什么。假设你要用AirLLM跑一个Llama-2-70B模型Transformer结构大概有80层左右。普通推理是把输入放进第1层第1层算完把输出传给第2层此时第1层和第2层的权重都在显存里。AirLLM的做法是初始时显存里只放模型嵌入层的权重这部分很小。计算第1层时把第1层的weight从内存/磁盘加载到显存。第1层计算完立刻把这一层的输出传到CPU内存然后释放第1层的显存。加载第2层用第1层的输出开始计算算完再释放。循环直到最后一层最后把输出结果返回。这样做之后显存里的压力峰值就是“单层权重单层激活值嵌入层重量级选一个”4GB绰绰有余。你可能已经发现它的核心其实就是把“内存和显存之间的搬运”变成了推理过程的主旋律之一。搬运本身有成本所以它慢。但这种设计的优势是它不挑显卡随便什么老卡都能用而且任何规模的Transformer模型都能按这个逻辑套模型越大反而越能体现“层间卸载”的价值。2.3 混合精度与作用域设计这些细节决定了它为什么不是“暴力swap”如果只是把权重从内存搬到显存这么简单那其实自己写个循环也能做到为什么要用AirLLM关键在于它处理了几个工程细节混合精度加载AirLLM会把模型权重以FP16加载进显存计算但在与CPU内存交互时不强制你全程FP32。这意味着显存里驻留的临时对象体积被压到了理论最小。计算作用域控制它在加载每一层时使用了Python的上下文管理器当某一层计算完成后精确地释放该层的计算图和中间变量而不是等到整个forward结束才统一清理。这一步大大减少了显存碎片和临时占用。自定义的LayerMap对于多个并行结构比如Mixtral这种MoE模型的多个专家层AirLLM会额外设计调度逻辑避免把所有专家层同时拉进显存。缓存机制如果同一个模型被重复推理AirLLM会把部分层权重缓存在内存侧避免每次加载都重新从磁盘读减少I/O开销。这些工作在底层直接决定了“能用”和“好用”的差别。你要是自己写一个朴素版逐层推理脚本大概率会遇到显存上涨、OOM、速度更慢的问题AirLLM把这些都提前踩过了。2.4 为什么这个方案比“整模型offload到CPU”更快你可能会说PyTorch本身也支持把模型放到CPU上然后每层往GPU传。为什么AirLLM的做法更值得单独聊因为PyTorch默认的offload策略是“整模型级调度”——它把模型的全部参数放在CPU内存每次反向传播或前向传播时将需要的权重传到GPU。这个过程是整体性的显卡会同时尝试持有大量参数副本实际显存占用依然很高因为它的调度粒度是“全模型”而不是“单层”。AirLLM把调度粒度缩小到Transformer的单层显存峰值控制的精度完全不同。举一个生活化的类比前者像把一整栋楼的人全部叫到广场再一起排队过安检广场本身必须足够大后者让所有人住在自己家里每人提前五分钟出门去安检口广场只要容纳一个人排队就行。3. 实操从装库到把70B真的跑起来3.1 环境准备哪些硬件配置是底线AirLLM的表面要求很低——任何支持CUDA的NVIDIA显卡都能跑但如果你只有一张4GB的显卡其他硬件也别太拉胯。这里有一个容易忽略的坑AirLLM真正吃的是CPU内存和磁盘I/O不是显存。我实测下来跑Llama-70B级别的模型内存至少要有48GB以上否则模型权重加载阶段就会因为内存不够直接崩掉磁盘建议留出150GB以上空间而且要选SSD或者NVMe盘。道理很简单内存不够权重都放不下更别谈参与计算了磁盘太慢每一层都要从磁盘读权重整体延迟会放大到无法忍受。推荐的环境配置如下硬件/软件最低要求推荐配置GPU支持CUDA的N卡显存4GBRTX 3060 / 4070 / 4090CPU内存48GB64GB以上磁盘机械盘勉强可跑SSD更好NVMe SSD剩余空间150GB以上Python版本3.93.10/3.11PyTorch2.02.1以上版本CUDA11.812.1操作系统建议用LinuxUbuntu 22.04Windows虽然能跑但文件句柄和内存管理上更容易出幺蛾子。3.2 安装步骤别踩依赖版本坑安装非常简单pip直接装就行pip install airllm但有几个依赖项要在装之前确认好必须要有可用的PyTorch CUDA版本如果只装了CPU版PyTorchAirLLM会自动走CPU模式速度会更慢还容易在一些GPU算子上报错。transformers库建议升级到4.36以上太老的版本和AirLLM的某些交互逻辑不兼容。如果要从HuggingFace下载权重需要先装huggingface_hub并且提前登录账号有些模型是gated模型。实测中最容易出问题的是“先装AirLLM、后装PyTorch”的顺序导致AirLLM检测不到CUDA。建议先装好PyTorch再装AirLLM。3.3 最小可用推理代码用单卡4GB跑Llama-70B下面这段代码是AirLLM最简单的推理示例适合第一次跑通验证。from airllm import AutoModel # 这里的模型路径可以是huggingface模型ID也可以是本地目录 model AutoModel.from_pretrained(meta-llama/Llama-2-70b-chat-hf) # 把输入按模型要求组装这里以最简单的单轮输入为例 input_text 给我讲一个关于程序员的笑话。 inputs model.tokenizer.encode(input_text, return_tensorspt).to(cuda) # 推理输出 output_ids model.generate( inputs, max_new_tokens64, do_sampleTrue, temperature0.7, top_p0.9, ) output_text model.tokenizer.decode(output_ids[0], skip_special_tokensTrue) print(output_text)代码就这么多。第一次跑的时候会经历一个“漫长”的模型加载阶段70B权重要从HuggingFace下载几十GB网速差的话等半小时以上很正常。加载完成后推理过程也会比较“佛系”——平均每秒大概一两个token甚至更慢如果你习惯用ChatGPT那种秒回体验这个速度会有强烈的不适应感。3.4 配合4bit量化把显存压到极限AirLLM本身就被设计成“不需要量化也能跑大模型”但如果你想进一步压显存占用或者让速度稍微快一点可以搭配BitsAndBytes的4bit量化一起用。from transformers import BitsAndBytesConfig bnb_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_use_double_quantTrue, bnb_4bit_quant_typenf4, bnb_4bit_compute_dtypefloat16, ) model AutoModel.from_pretrained( meta-llama/Llama-2-70b-chat-hf, quantization_configbnb_config, )把权重压到4bit之后同一时间从内存搬运到显存的数据量减少一半理论上每层加载的时间也会缩短。不过要注意AirLLM的层间卸载与部分量化算子的组合可能会出现兼容性问题如果你的目的是“先跑通”建议第一轮不量化跑通了再尝试。4. 实测体验单卡4GB跑70B到底是个什么速度4.1 不同硬件和模型档位的速度对比我先声明一点下面这些数据来自我一个朋友的真实测试和我自己复测的混合结果硬件差异、模型版本、上下文长度都对结果有影响所以不用当精确基准但数量级感受是真实的。模型显卡显存首token延迟稳定生成速度Llama-3-70BGTX 1650 4GB4GB约几十秒约0.5~1 token/sQwen-72BRTX 3060 12GB限制显存4GB4GB约30秒约1~2 token/sLlama-2-7BGTX 1650 4GB4GB约几秒约5~8 token/sQwen-14BRTX 3060 12GB限制显存4GB4GB约10秒约2~4 token/s首token延迟高是因为模型加载权重需要时间后续生成阶段因为每次都要逐层加载权重再计算稳定速度基本就是每秒几个token的水平。7B模型在AirLLM下跑出的速度能到5 token/s以上这个级别的体验已经是“可以忍受”的了比70B那种“半个字半天”的体验要好很多。如果你的显卡其实有8GB或者12GB显存AirLLM并不会因此跑得更快因为它的设计就是“只用一点点显存”剩余显存它不会主动去利用。这一点和Ollama/vLLM完全不一样使用前要有心理预期。4.2 流式生成和多轮对话的表现AirLLM对批量输入的优化程度不高一次生成多个句子时速度会“等比下降”而不是“并行加速”。所以在AirLLM上不要想着做高并发、低延迟的服务它是为“单用户、低并发、能跑就行”设计的。多轮对话方面AirLLM支持把历史对话拼进输入上下文里但这会让每轮请求的输入长度变长而层间卸载模式下输入变长会直接导致每层计算时间增加所以多轮轮次越多速度越慢。我的建议是如果一定要用AirLLM做对话场景最多保存最近2-3轮历史再早的消息直接裁掉否则体验会崩溃。另外有个值得注意的点AirLLM在每轮生成结束后显存里的KV Cache会被清空下一轮要重新计算历史token的KV Cache这也导致它在多轮对话场景的效率比纯生成任务更低。4.3 什么样的人适合用AirLLM什么样的人不适合我用过一段时间AirLLM之后对自己的需求做了个判断。如果你是这几类人AirLLM会很合适手头只有老旧低显存显卡但想体验“跑起70B大模型”的感觉。做科研或教学演示需要在不依赖云端API的情况下运行超大模型。要对模型推理过程做层级的调试、干预比如观察每一层的输出、修改某一层的权重。在企业内网离线环境部署GPU资源紧缺但CPU内存和磁盘富余。如果你是这几类人AirLLM不适合想要低延迟、高并发的在线服务。想要完整复现大模型的对话体验要求生成速度快。只有16GB内存还想跑70B会直接内存炸掉。5. 同赛道方案选型对比为什么不直接Ollama或vLLM5.1 Ollama、vLLM、llama.cpp、AirLLM的核心差异很多人在搜“大模型本地部署”时会先看到Ollama、llama.cpp或vLLM这几个名字AirLLM和它们解决的问题并不完全相同。方案核心思路显存占用推理速度适合场景Ollama基于llama.cpp量化CPU/GPU混合推理低可以纯CPU跑中等小模型快大模型依赖CPU算力个人电脑部署小模型和中等模型llama.cppC实现的推理框架重点在CPU和量化优化低小模型很快大模型也慢跨平台、边缘设备vLLMPagedAttentionGPU高吞吐推理高需要大显存快吞吐高服务化部署、高并发AirLLM层间卸载把显存需求压到单层极低4GB可跑超大模型慢低显存跑超大模型、离线验证直观一点说Ollama是家用车的定位vLLM是跑车AirLLM是拖拉机。拖拉机看起来没有跑车拉风但地里干活时它就是唯一的选择。如果你有一个70B模型必须要在一张老显卡上跑起来Ollama和vLLM基本无能为力——前者需要量化后仍然放不下的显存后者依赖大显存做页调度。而AirLLM可以。5.2 什么情况下我还是会用Ollama虽然AirLLM很神奇但我在自己的机器上也装了Ollama原因是很多日常场景根本不需要70B这个量级的模型。像我本地的笔记本是32GB内存、没有独立显卡或只有核显跑AI我一般用Ollama跑7B或者13B的Qwen、Llama速度能到每秒10-20个token几乎和ChatGPT的“慢速模式”差不多拿来写文档、总结内容完全够用。AirLLM更适合那种“我偏要跑这个模型”的场景哪怕慢但模型本身的效果是完整的、没有蒸馏也没有混合调度损失。如果你追求的是“能用的交互体验”Ollama走小模型路线才是理性选择如果你追求的是“最大模型的完整能力”AirLLM是低显存下的现实主义解法。5.3 不要用AirLLM去做微调和训练它不能这是很多新手最容易误解的一点。AirLLM是一个推理优化库不是微调框架。你在网上看到类似“用AirLLM在4GB显存上微调70B”的描述严格来说是不成立的。AirLLM只负责推理时的层间卸载没有实现反向传播的梯度卸载逻辑所以它无法支持大模型的LoRA微调或全参微调。但如果你真的想在低显存下微调大模型也有另外的路子比如用Accelerate的CPU offload模式配合LoRA或者用QLoRA这类方案。这个方向是可行的但和AirLLM没有关系选型前别搞混。6. 我实际踩过的坑和给你省时间的六条建议6.1 磁盘用机械盘速度直接“不能看”我第一次跑AirLLM用的是机械硬盘加载70B权重的时候每一层都要从磁盘读将近2GB的数据磁盘读取速度按100MB/s算一层就要20秒80层就是1600秒将近半小时而且这个过程每次推理都要重复一遍。后来我换到NVMe固态同样的模型层加载速度快了接近10倍整体可用的感觉立刻就出来了。所以如果你是计划跑70B的首先确认磁盘够快否则AirLLM会慢到让你怀疑代码写错了。6.2 第一次跑先拿小模型验证不要一上来就直接下载70B一次几十GB的下载和加载如果出问题你会折腾很久。我的建议是先用Llama-7B或者Qwen-2.5-7B这类小模型把流程跑通确认安装、显存、内存、模型路径都正常后再升级到70B。这一步能帮你区分“环境问题”和“模型问题”。6.3 “显存占用看起来不高”反而说明它在正常工作很多朋友第一次看到AirLLM跑大模型盯着nvidia-smi看发现显存占用才3GB多第一反应是“模型是不是没加载对”。其实这是正常的AirLLM的设计目标就是“把显存占用压到最低”不贪心不用满。如果你发现显存占用飙到6GB、8GB那才要怀疑是不是层释放逻辑出问题了比如你改了模型结构或者手动把某个层的输出保留到了主进程。6.4 Python进程长时间占用CPU内存是常态别当成死机跑70B推理时CPU内存最高会冲到50GB以上如果你在Windows上系统可能因为内存压力出现卡顿甚至无响应。我的解决方案是在Linux服务器或WSL2里跑并且用tmux或screen把推理进程挂到后台避免因为终端断开导致推理中断。6.5 温度参数调低一点生成质量会稳定不少AirLLM生成速度慢导致你不太可能反复试错。我实测下来temperature设得过高比如1.0以上生成的文本质量波动很大经常出现跑了一分多钟结果输出是废话的情况。建议把temperature控制在0.6-0.8配合top_p0.9虽然保守一点但输出稳定性和可读性明显更好。6.6 显存有8GB但内存只有16GB别折腾70BAirLLM把显存压力转移到内存之后内存就成了新的瓶颈。16GB内存跑7B模型很轻松跑14B开始吃紧跑70B基本必崩。如果你只有16GB内存就别指望AirLLM帮你跑超大模型了——要么加内存要么老老实实玩7B-14B。7. 还可以怎么用从“跑大模型”延伸到更多场景7.1 结合RAG做本地知识库问答AirLLM虽然生成速度慢但它可以完整跑通长上下文理解和RAG流程。你可以在本地加载一个embedding模型比如BGE系列把文档切块、向量化存进向量库用户提问时先检索相关片段再把检索结果拼接到prompt里交给AirLLM生成回答。这个过程不追求秒回适合企业内部离线环境下做“慢工出细活”的知识库问答。具体示例流程是用BGE或text2vec把本地文档切片向量化存入FAISS。编写检索函数根据用户query召回top-k片段。将片段加上问题模板拼成最终prompt。交给AirLLM生成输出结果存到本地日志。我试过用AirLLM跑Qwen-14B做RAG问答生成质量明显比7B好配合低显存的优势可以在只有4GB GPU的公司服务器上跑通一个“完整”的本地问答系统。7.2 用AirLLM做层级的模型可解释性研究由于AirLLM天然逐层加载权重每一层计算完都会释放你可以在加载某层时额外记录该层的输出、残差、注意力权重。这种做法在研究模型内部表征时特别有用普通推理框架很难让你在单层粒度上做这种控制。我曾经用AirLLM分析了某个70B模型在不同层对“事实性陈述”和“虚构性陈述”的表征差异——在普通推理框架里光是要截取某一层的输出就需要hack模型的forward代码但在AirLLM的逐层逻辑下直接在加载该层时写个钩子就行操作起来非常简单。7.3 用AirLLM做CI/CD流水线里的模型烟雾测试如果你的公司维护着自定义的70B模型想在每次新版本发布前做一次快速的“模型能否正常加载并进行推理”的烟雾测试完全可以用AirLLM来跑。它不需要专门的GPU服务器普通的开发机就能扛住跑一条几秒钟的最短输入验证模型权重没有损坏、tokenizer正常、输出不为空即可。这种场景不需要速度只需要在预算为0的机器上能稳定执行。最后再分享两个我自己的小习惯AirLLM跑大模型时我会同时开着“nvidia-smi -l 1”和“free -h”两个命令观察资源变化。这样能看到每一层的显存和内存波动节奏如果发现某层加载后显存不降就基本能定位到是该层有句柄没释放问题多半出现在自己的钩子代码里。另外建议每次都把生成结果落盘保存因为生成一次的成本太高没有后悔药跑完立刻保存text和json两份后面做分析时能省很多事。AirLLM这类工具最大的价值不是让所有人都能用4GB显卡流畅跑起70B而是它打破了一种思维定式显存不够不等于模型不能跑资源有限不等于只能用小模型。只要你愿意用时间换空间大模型的完整能力一样可以在最低配的机器上落地。这种思路放在很多工程问题里都值得借鉴。