公司动态

AirLLM 非分片模型实战:低显存 GPU 跑通小模型的完整路径

📅 2026/9/2 13:29:31
AirLLM 非分片模型实战:低显存 GPU 跑通小模型的完整路径
AirLLM 非分片模型实战低显存 GPU 跑通小模型的完整路径【免费下载链接】airllmAirLLM 70B inference with single 4GB GPU项目地址: https://gitcode.com/GitHub_Trending/ai/airllm手里只有一张 6GB 的卡想跑个 7B 模型却在torch.cuda分配那一步直接 OOM这正是 AirLLM 非分片模型要解决的问题。它不把整个模型塞进显存而是逐层从磁盘流式换入所以 7B 模型的峰值显存只有一层 KV cache的量而不是 fp16 完整模型的 14GB。对低显存 GPU 推理来说这条路径绕开了显存装不下的死结 ⚡分片 vs 非分片小模型为什么该走另一条路先分清两种加载方式。分片路径是给 70B 这类超大模型准备的checkpoint 本身是多份 safetensorsAirLLM 还要在磁盘上按层切出 layer shards再一层一层流式换入显存你得额外管layer_shards_saving_path切分过程还很吃磁盘。非分片是 v2.10.1 加进来的checkpoint 是单文件或小目录时框架直接对原始文件做逐层流式省掉切分这步预处理。小模型7B 以下走非分片更划算原因很具体。Llama 系 7B 大约 32 层单层放进显存的峰值本就低切分能省下的显存几乎为零却平添了写盘开销和更多可能出错的环节。层数少、单卡显存又够用直接流式加载原始 checkpoint路径更短、加载更稳。换句话说分片是为装不下服务的而小模型本来就装得下没必要为它切一刀。从零跑通三步完成 AutoModel 非分片加载入口统一是AutoModel.from_pretrained实现在 airllm/auto_model.py 里它先读config判断架构命中特殊布局如 ChatGLM、Qwen、Kimi K3走对应子类其余架构统统落到通用的AirLLMBaseModel后者能流式处理任何标准*ForCausalLM所以新架构基本不用改代码。Step 1先跑通非分片加载。小模型直接给本地路径或 repo id不传任何切分参数即可from airllm import AutoModel # 小模型直接给本地路径或 repo id走非分片流式加载 model AutoModel.from_pretrained(Qwen/Qwen-7B)Step 2上小模型 4bit 量化压缩磁盘分片。AirLLM 的瓶颈在磁盘 IO 而非显存所以量化压的是 on-disk shards 的体积用来加快加载。注意 compression 依赖bitsandbytesmodel AutoModel.from_pretrained( Qwen/Qwen-7B, compression4bit, # 或 8bit压缩磁盘上的 shards )Step 3挂 profiling 并回收磁盘。调参阶段打开计时确认无误后让框架删掉原始 checkpoint 省空间model AutoModel.from_pretrained( Qwen/Qwen-7B, profiling_modeTrue, # 打印每层加载/压缩耗时 delete_originalTrue, # 用完删原始 checkpoint 省盘 )跨平台落地Linux、macOS、CPU 各自怎么跑Linux 是默认场景device取cuda:0标准 GPU 流式推理要用量化就先把bitsandbytes装上否则 compression 参数不生效。macOS 走的是另一条路auto_model.py在platform darwin时直接改调AirLLMLlamaMlx底层交给 MLX 框架贴合 Apple Silicon 的统一内存省去了 CUDA 依赖。CPU 推理是 v2.10.1 同时带来的能力适合完全没独显的机器——把device指到 CPU 即可跑代价是吞吐明显下降适合验证逻辑或低并发批处理不适合追求低延迟的在线服务。开启profiling_mode调参、或量化后核对评估侧指标时可以像上图这样跟踪曲线变化确认压缩没有把精度打崩。踩坑清单这些配置项最容易翻车磁盘不足时开delete_originalTrue会翻车。切分本身很吃盘原始 checkpoint 和 shards 并存那段时间磁盘压力最大盘不够就中途失败。解法是先给足余量或手动清一下缓存目录再重跑别在半途把空间吃光。量化级别和显存/加载速度的匹配是第二坑。很多人以为 4bit 就是更快但在 AirLLM 里 compression 会直接禁用 prefetching源码里明确两者互斥而 prefetching 正是用下一层的磁盘读取去重叠当前层计算的关键。所以 4bit 省了盘、却可能让加载变慢显存和盘都够时优先 8bit保精度、少踩这个互斥追求极致省盘再上 4bit并且别指望 prefetching 帮忙。最后是profiling_mode的隐形开销。它会在每次load_layer里插桩计时add_profiling_time逐层累加。调参、排障时开着很有用但生产环境长期开着只会平添计时成本跑稳了就关掉。 配置不复杂关键是分清瓶颈在哪。想确认自己的模型命中了哪个子类、compression和profiling_mode具体怎么接线直接翻 airllm/auto_model.py 里from_pretrained的分支或者拿你手头那个 7B 以下的小模型按上面三步试跑一次显存曲线会替你说话。【免费下载链接】airllmAirLLM 70B inference with single 4GB GPU项目地址: https://gitcode.com/GitHub_Trending/ai/airllm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考