下载了LLM却没法双击运行?揭秘推理引擎背后的’内存魔法
https://www.youtube.com/watch?v=B18zBnjZKmc
一、核心问题:模型文件 ≠ 可执行文件
-
下载的模型是一组文件(artifacts),包括: model.safetensors
(约15GB):存储模型权重(类似大型JSON) config.json
:定义模型架构(注意力头数、层数、词汇表大小等) -
不能直接运行,需要推理引擎(如 llama.cpp,vLLM,TGI)来加载和服务模型。
二、推理引擎的差异
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
语言快慢(C++/Rust vs Python)并不直接决定推理速度,因为内存管理和调度策略更重要。
三、模型加载的关键技术:mmap(内存映射)
- 问题
:模型权重(15GB)从 SSD → RAM → GPU 可能产生重复内存和拷贝开销。 - 解决方案
: mmap让操作系统管理内存: -
不立即加载全部权重,而是懒加载(lazy loading) -
权重在需要时才从 SSD 调入 RAM -
若 RAM 被其他应用占用,OS 可驱逐不活跃的权重,再次访问时重新从 SSD 加载 - 性能
: -
PCIe 带宽约 7 GB/s(NVMe) -
假设 15GB 模型中 5%(750MB)被驱逐 → 加载延迟仅约 107 毫秒 - 实际效果
: llama.cpp
加载模型 < 10 秒 vLLM
加载需 几分钟(因为编译和初始化开销大)
四、量化(Quantization)
量化是为了减少模型大小和内存占用,同时尽量保持精度。类比:4K → 1080p → 4K 的压缩与还原。
4.1 常见量化格式
-
RTN(Round to Nearest) -
AWQ、GGUF(Q4_0, Q4_1, Q4_K, Q4_KM)、EXL2、EXL3、FP8、NVFP4
4.2 量化基本方法
- 原始精度
:BF16 - 目标精度
:INT4 / INT8 - 对称量化
:基于最大值/最小值范围 - 非对称量化
:包含偏置(bias)
4.3 分组量化(Group Quantization)
-
将权重分组(如32个一组),每组内计算 min/max,归一化后取整。 -
保留16位 scale 用于反量化。
4.4 K-quants(如 Q4_K_S, Q4_K_M)
- 分层缩放
:大组(256个权重) + 小组(32个权重) - 混合精度
:不同类型层(embedding, attention, FFN)使用不同位数 -
Q4_K_S:所有层4位(除归一化层) -
Q4_K_M:输出投影和FFN门用6位
4.5 AWQ(Activation-aware Weight Quantization)
-
使用校准数据集找出重要权重(salient weights) -
通过缩放重要权重来减少量化误差
4.6 EXL2
-
类似 AWQ,但使用Hessian矩阵(二阶导数)评估权重对误差的敏感度 - 混合精度存储
: -
高误差组 → 高精度(4–6位) -
低误差组 → 低精度(2–3位) - 性能优势
:EXL2 在 tokens/秒 和 困惑度(perplexity)上表现最佳
五、硬件相关量化
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
这些需要特定 GPU 才能发挥性能。
六、为什么 GGUF 仍然最流行?
-
大多数本地运行模型的人内存受限 -
GGUF 支持混合 RAM + GPU 卸载(像双层床一样分层存储) -
消费者显卡通常 ≤ 32GB,发烧友 ≤ 70GB
七、后续预告(作者计划)
若观众反馈良好,后续视频将覆盖:
- Prefill & Decoding
(预填充与解码) - Serving
(服务调度) - Speculative Decoding
(推测解码) - KV Cache 管理
- Scheduling & Concurrency
(调度与并发)
八、总结观点
-
推理引擎的选择影响加载时间、内存使用和最终吞吐量。 -
量化方法在“精度 vs 速度 vs 内存”之间权衡,没有绝对最优。 mmap
是高效加载的关键技术,尤其适合大模型。 -
本地推理的瓶颈常常是内存层次结构,而非 CPU/GPU 的原始算力。
夜雨聆风