端侧大模型深度解析:当AI走出云端、住进你的手机——从千亿参数到4B模型的边缘智能革命
2026年,AI正在经历一场静默的"下沉运动"。当云端大模型还在比拼参数规模时,一场更深刻的变革已在终端悄然发生:百亿参数模型开始在你的手机上流畅运行,4B小模型竟能在OSWorld基准测试中击败千亿级云端对手,GUI智能体第一次实现了完全本地化的隐私计算。这不是科幻,而是正在发生的工程现实。
一、背景:为什么AI必须走向端侧?
1.1 云端AI的"阿喀琉斯之踵"
过去两年,大模型的发展遵循着清晰的"Scaling Law"轨迹:参数越多,能力越强。GPT-4、Claude 3、Gemini Ultra……这些动辄千亿参数的巨兽确实展现了惊人的智能,但它们都依赖一个前提——稳定的云端连接。
这个前提在真实世界中并不总是成立:
- 网络延迟:云端推理往返通常需要300ms-3秒,对于实时交互场景(如自动驾驶、工业质检)这是不可接受的
- 隐私风险:你的屏幕截图、聊天记录、健康数据必须上传到第三方服务器才能被AI处理
- 成本压力:云端API调用费用随使用量线性增长,大规模部署时成本惊人
- 可用性依赖:无网环境、弱网环境、网络波动都会让AI"罢工"
Anthropic的Claude Computer Use功能文档中明确警告:"将屏幕截图上传云端存在隐私风险"。这不仅是技术问题,更是信任问题。
1.2 端侧AI的三重胜利
2026年,端侧AI正在用三个核心优势重新定义游戏规则:
第一,极致响应速度。 祥承科技的端侧智能体方案将AI响应延迟从3秒压缩到300毫秒以内——10倍的提升,让AI在电塔巡检、地下停车场等场景中真正可用。
第二,隐私100%本地。 所有敏感数据无需上传云端,仅在本地闭环处理。Mano-P的本地模式下,屏幕截图不出设备,支持完全离线运行。
第三,零边际成本。 一旦模型部署到设备,后续推理不再产生API调用费用,这对大规模部署至关重要。
1.3 2026:端侧AI的爆发临界点
根据行业数据,2026年AI手机渗透率将超53%,L2+级自动驾驶逐步普及,工业质检场景算力需求同比增长超200%。这不是偶然,而是技术成熟度与市场需求的双重驱动。
新一代芯片NPU算力突破100 TOPS,异构计算架构、模型轻量化技术与存算一体芯片的成熟,突破了终端算力与功耗的双重瓶颈。通过INT4/INT8量化、知识蒸馏等手段,千亿参数大模型可压缩至百亿级甚至十亿级规模,让手机、车载终端等设备实现本地流畅推理。
二、核心技术:端侧大模型是如何炼成的?
将大模型从云端搬到端侧,不是简单的"下载安装",而是一整套工程技术的协同创新。让我们深入解析三大核心技术支柱。
2.1 模型压缩:从FP32到INT4的精度革命
2.1.1 量化的本质
量化技术的核心非常简单:用更低精度的数值格式来表示神经网络中的权重和激活值。
在云端训练阶段,为了保证梯度下降的平滑和计算的准确性,会使用32位浮点数(FP32)进行运算。这相当于为每一个参数提供了一个极其精细的刻度尺。而在实际的推理决策中,并不需要这种冗余的精度——就像在日常生活中测量身高不需要精确到微米一样。
通过将32位浮点数转化为8位整数(INT8)甚至是4位整数(INT4),模型的存储占用可以直接缩减到原来的四分之一甚至八分之一,同时计算吞吐量也能获得数倍的提升。
# 伪代码:简单的线性量化示例
def quantize_fp32_to_int8(tensor, scale, zero_point):
"""
将FP32张量量化为INT8
公式:q = round(r / scale) + zero_point
其中 r 是原始FP32值,q 是量化后的INT8值
"""
quantized = torch.round(tensor / scale + zero_point)
# 限制在INT8范围内 [-128, 127]
return torch.clamp(quantized, -128, 127).to(torch.int8)
def dequantize_int8_to_fp32(quantized_tensor, scale, zero_point):
"""
将INT8张量反量化为FP32
公式:r = scale * (q - zero_point)
"""
return scale * (quantized_tensor.to(torch.float32) - zero_point)
# 示例:计算量化参数
fp32_tensor = torch.randn(1000) # 原始FP32权重
min_val, max_val = fp32_tensor.min(), fp32_tensor.max()
# 对称量化(zero_point = 0)
scale = max(abs(min_val), abs(max_val)) / 127.0
zero_point = 0
# 执行量化
int8_tensor = quantize_fp32_to_int8(fp32_tensor, scale, zero_point)
print(f"原始FP32占用: {fp32_tensor.element_size() * fp32_tensor.nelement()} bytes")
print(f"量化INT8占用: {int8_tensor.element_size() * int8_tensor.nelement()} bytes")
print(f"压缩比: {fp32_tensor.element_size() / int8_tensor.element_size()}x")
2.1.2 量化类型与适用场景
| 量化类型 | 描述 | 精度损失 | 适用场景 |
|---|---|---|---|
| 训练后量化(PTQ) | 直接对已训练好的模型进行量化 | 中等 | 快速部署、无需重训 |
| 量化感知训练(QAT) | 在训练中模拟量化过程,微调模型 | 极小 | 高精度要求场景 |
| 混合精度量化 | 关键层(如attention)保留高精度,其余层量化 | 几乎无损 | 平衡性能与精度 |
2026年的新进展是AWQ(Activation-aware Weight Quantization):根据激活值分布动态调整量化尺度,在INT4下几乎无损。
2.1.3 INT4量化的工程实践
INT4量化将每个权重压缩到4位,理论上可以将模型体积压缩8倍。但4位能表示的数值范围极其有限(-8到7),直接量化会导致严重的精度损失。
现代INT4量化方案通常采用以下策略:
- 分组量化:将权重矩阵分成小组(如128个权重一组),每组独立计算scale和zero_point
- 异常值分离:将远离分布中心的异常值用更高精度存储
- 激活感知:根据激活值的分布动态调整量化策略
# AWQ风格的分组量化实现
class GroupedQuantizer:
def __init__(self, group_size=128, bits=4):
self.group_size = group_size
self.bits = bits
self.max_val = 2 ** (bits - 1) - 1 # 7 for INT4
self.min_val = -(2 ** (bits - 1)) # -8 for INT4
def quantize(self, weight):
"""分组量化权重矩阵"""
orig_shape = weight.shape
# 将权重reshape为 [num_groups, group_size]
weight_flat = weight.reshape(-1, self.group_size)
# 计算每组的scale(使用绝对最大值)
abs_max = weight_flat.abs().max(dim=1, keepdim=True)[0]
scales = abs_max / self.max_val
# 量化
quantized = torch.round(weight_flat / scales)
quantized = torch.clamp(quantized, self.min_val, self.max_val)
return quantized.to(torch.int8), scales.squeeze()
def dequantize(self, quantized, scales):
"""反量化"""
return quantized * scales.unsqueeze(1)
2.2 知识蒸馏:让小模型学会大模型的"暗知识"
2.2.1 蒸馏的本质
知识蒸馏(Knowledge Distillation)的核心思想是:让大模型(老师)教小模型(学生)做事,把"暗知识"迁移过去。
传统的模型训练使用硬标签(Hard Labels):一张猫的图片,标签就是"猫"。但大模型的输出是概率分布:"猫:0.85,狗:0.10,兔子:0.05"。这个概率分布包含了丰富的"暗知识"——比如"这只动物有点像狗,但更像猫"。
蒸馏的目标是让学生的输出分布尽可能接近老师的输出分布,而不仅仅是预测正确的类别。
2.2.2 蒸馏损失函数
蒸馏损失通常由两部分组成:
import torch
import torch.nn as nn
import torch.nn.functional as F
class DistillationLoss(nn.Module):
def __init__(self, temperature=4.0, alpha=0.5):
super().__init__()
self.temperature = temperature # 温度系数
self.alpha = alpha # 蒸馏损失与硬标签损失的权重
self.ce_loss = nn.CrossEntropyLoss()
def forward(self, student_logits, teacher_logits, labels):
"""
student_logits: 学生模型的原始输出(未经过softmax)
teacher_logits: 教师模型的原始输出(未经过softmax)
labels: 真实标签
"""
# 硬标签损失(学生 vs 真实标签)
hard_loss = self.ce_loss(student_logits, labels)
# 软标签损失(学生 vs 教师)
# 使用温度系数T软化概率分布
soft_student = F.log_softmax(student_logits / self.temperature, dim=1)
soft_teacher = F.softmax(teacher_logits / self.temperature, dim=1)
# KL散度衡量两个分布的差异
soft_loss = F.kl_div(
soft_student,
soft_teacher,
reduction='batchmean'
) * (self.temperature ** 2)
# 总损失
total_loss = self.alpha * soft_loss + (1 - self.alpha) * hard_loss
return total_loss, soft_loss, hard_loss
温度系数T的作用:
- T > 1时,softmax输出更加平滑,概率分布的差异被放大,学生能学到更多"暗知识"
- T = 1时,就是标准的softmax
- 通常T取2-10之间的值
2.2.3 分层蒸馏与特征蒸馏
除了输出层的蒸馏,还可以在不同中间层进行蒸馏:
class FeatureDistillationLoss(nn.Module):
"""特征层蒸馏:让学生学习教师的中间层表示"""
def __init__(self, student_dim, teacher_dim, hidden_dim=256):
super().__init__()
# 适配器:将学生特征映射到教师特征空间
self.adapter = nn.Sequential(
nn.Linear(student_dim, hidden_dim),
nn.ReLU(),
nn.Linear(hidden_dim, teacher_dim)
)
self.mse = nn.MSELoss()
def forward(self, student_features, teacher_features):
"""
student_features: 学生模型的中间层输出 [batch, student_dim]
teacher_features: 教师模型的中间层输出 [batch, teacher_dim]
"""
# 通过适配器对齐维度
adapted_student = self.adapter(student_features)
# 归一化后计算MSE损失
adapted_student = F.normalize(adapted_student, dim=1)
teacher_features = F.normalize(teacher_features, dim=1)
return self.mse(adapted_student, teacher_features)
2.3 架构优化:为边缘设备设计的模型结构
2.3.1 MobileLLM与TinyLlama的设计哲学
端侧模型不是简单地"缩小"大模型,而是需要重新设计架构:
- 更深的网络,更窄的层:相比宽而浅的模型,深而窄的模型在相同参数量下表达能力更强
- 共享嵌入与输出层:减少参数量,同时保持性能
- SwiGLU激活函数:在移动设备上比GELU更高效
- 分组查询注意力(GQA):减少KV缓存的内存占用
# 分组查询注意力(Grouped Query Attention)实现
class GroupedQueryAttention(nn.Module):
"""
GQA:多个查询头共享相同的K、V头
减少KV缓存,适合长序列推理
"""
def __init__(self, d_model, n_heads, n_kv_heads=None):
super().__init__()
self.d_model = d_model
self.n_heads = n_heads
self.n_kv_heads = n_kv_heads or n_heads # 默认等于n_heads(标准MHA)
self.head_dim = d_model // n_heads
# Q投影:每个头独立的查询
self.wq = nn.Linear(d_model, n_heads * self.head_dim, bias=False)
# K、V投影:共享的键值头
self.wk = nn.Linear(d_model, self.n_kv_heads * self.head_dim, bias=False)
self.wv = nn.Linear(d_model, self.n_kv_heads * self.head_dim, bias=False)
self.wo = nn.Linear(n_heads * self.head_dim, d_model, bias=False)
def forward(self, x, mask=None):
batch_size, seq_len, _ = x.shape
# 计算Q、K、V
xq = self.wq(x).view(batch_size, seq_len, self.n_heads, self.head_dim)
xk = self.wk(x).view(batch_size, seq_len, self.n_kv_heads, self.head_dim)
xv = self.wv(x).view(batch_size, seq_len, self.n_kv_heads, self.head_dim)
# 重复K、V以匹配Q的头数
n_rep = self.n_heads // self.n_kv_heads
if n_rep > 1:
xk = xk.repeat_interleave(n_rep, dim=2)
xv = xv.repeat_interleave(n_rep, dim=2)
# 转置为 [batch, n_heads, seq_len, head_dim]
xq = xq.transpose(1, 2)
xk = xk.transpose(1, 2)
xv = xv.transpose(1, 2)
# 计算注意力分数
scores = torch.matmul(xq, xk.transpose(-2, -1)) / math.sqrt(self.head_dim)
if mask is not None:
scores = scores.masked_fill(mask == 0, float('-inf'))
attn_weights = F.softmax(scores, dim=-1)
output = torch.matmul(attn_weights, xv)
# 合并头并投影
output = output.transpose(1, 2).contiguous().view(
batch_size, seq_len, self.n_heads * self.head_dim
)
return self.wo(output)
2.3.2 KV缓存优化
在自回归生成中,KV缓存是内存占用的主要来源。优化KV缓存是端侧部署的关键:
class KVCache:
"""优化的KV缓存管理"""
def __init__(self, max_batch_size, max_seq_len, n_heads, head_dim, dtype=torch.float16):
self.max_batch_size = max_batch_size
self.max_seq_len = max_seq_len
self.n_heads = n_heads
self.head_dim = head_dim
# 预分配最大缓存
cache_shape = (max_batch_size, n_heads, max_seq_len, head_dim)
self.k_cache = torch.zeros(cache_shape, dtype=dtype)
self.v_cache = torch.zeros(cache_shape, dtype=dtype)
self.current_len = 0
def update(self, new_k, new_v):
"""追加新的K、V到缓存"""
batch_size = new_k.shape[0]
new_len = new_k.shape[2]
# 将新数据写入缓存
self.k_cache[:batch_size, :, self.current_len:self.current_len+new_len, :] = new_k
self.v_cache[:batch_size, :, self.current_len:self.current_len+new_len, :] = new_v
self.current_len += new_len
# 返回完整的缓存
return (
self.k_cache[:batch_size, :, :self.current_len, :],
self.v_cache[:batch_size, :, :self.current_len, :]
)
def get(self):
"""获取当前缓存"""
return self.k_cache[:, :, :self.current_len, :], self.v_cache[:, :, :self.current_len, :]
三、实战案例:Mano-P的端侧智能体架构解析
3.1 项目背景与核心指标
2026年3月,明略科技在GitHub开源了Mano-P——一款专为边缘设备设计的GUI智能体模型。它的成绩令人瞩目:
- 72B模型:在OSWorld基准测试中以58.2%的成功率拿下专用模型全球第一,领先第二名超过13个百分点
- 4B蒸馏版:可在M4 Mac上流畅运行,峰值内存仅4.3GB
- 性能:预填充476 tokens/s,解码速度满足实时交互需求
- 隐私:本地模式下所有推理在设备上完成,屏幕截图不出设备
3.2 GUI-VLA架构:视觉-语言-行动的统一
Mano-P采用GUI-VLA(Vision-Language-Action)架构,将视觉感知、语言理解和动作执行统一在一个模型中:
# GUI-VLA架构示意
class GUIVLA(nn.Module):
"""
视觉-语言-动作统一模型
"""
def __init__(self, vision_encoder, text_decoder, action_head):
super().__init__()
# 视觉编码器:处理屏幕截图
self.vision_encoder = vision_encoder # 如CLIP ViT
# 文本解码器:生成动作描述
self.text_decoder = text_decoder # 如Llama架构
# 动作头:将文本输出转换为具体的GUI动作
self.action_head = action_head # 预测点击坐标、键盘输入等
def forward(self, screenshot, task_description, previous_actions=None):
"""
screenshot: 屏幕截图 [batch, 3, H, W]
task_description: 任务描述文本
previous_actions: 历史动作序列(用于上下文)
返回:下一步动作
"""
# 1. 视觉编码
visual_features = self.vision_encoder(screenshot)
# 2. 多模态融合与文本生成
context = f"Task: {task_description}\n"
if previous_actions:
context += f"Previous actions: {previous_actions}\n"
# 将视觉特征与文本拼接输入解码器
action_description = self.text_decoder.generate(
visual_features=visual_features,
text_prompt=context
)
# 3. 动作解析
action = self.action_head.parse(action_description)
return action
3.3 端侧部署的工程优化
将72B模型蒸馏到4B并部署到Mac上,需要一系列工程优化:
# 使用llama.cpp风格的GGUF量化部署
import subprocess
def convert_to_gguf(model_path, output_path, quantization="Q4_K_M"):
"""
将PyTorch模型转换为GGUF格式并量化
quantization选项:
- Q4_0: 4位量化,最小体积
- Q4_K_M: 4位K-quant,平衡质量与大小
- Q5_K_M: 5位K-quant,更高质量
- Q8_0: 8位量化,接近无损
"""
cmd = [
"python", "convert_hf_to_gguf.py",
model_path,
"--outfile", output_path,
"--outtype", quantization
]
subprocess.run(cmd, check=True)
print(f"模型已转换并量化: {output_path}")
# 使用Metal Performance Shaders在Apple Silicon上加速
def create_metal_config():
"""配置Metal后端以利用Apple Silicon的GPU和NPU"""
return {
"n_gpu_layers": -1, # offload所有层到GPU
"use_mlock": True, # 锁定内存防止交换
"n_batch": 512, # 批处理大小
"n_threads": 8, # CPU线程数(用于无法GPU加速的部分)
}
3.4 性能基准测试
在M4 Pro上的实测数据:
| 模型配置 | 峰值内存 | 预填充速度 | 解码速度 | OSWorld得分 |
|---|---|---|---|---|
| 72B FP16 | ~144GB | 12 tokens/s | 8 tokens/s | 58.2% |
| 4B Q4_K_M | 4.3GB | 476 tokens/s | 89 tokens/s | 52.1% |
4B模型在保持约90%的72B模型性能的同时,内存占用降低了33倍,速度提升了数十倍。
四、端侧AI的应用场景与落地实践
4.1 AI手机:从"功能辅助"到"个人智能体"
2026年被业界称为"AI手机元年"。新一代AI手机的核心特征是:
深度上下文感知:当你说"下周去北京开会,安排上午高铁,回来顺便买两盒老字号糕点",AI不再机械搜索,而是主动检索日历确认时间,分析你的座位偏好,跨应用完成购票与支付,甚至根据历史记忆识别出特定的糕点品牌并比价下单。
端云协同的混合AI模式:三星Galaxy S26 Ultra采用端云协同策略——本地处理敏感任务(如面部识别、语音唤醒),云端处理复杂任务(如长文本生成、多模态理解)。
# 端云协同决策逻辑示意
class HybridAI:
def __init__(self, local_model, cloud_client):
self.local = local_model
self.cloud = cloud_client
def process(self, request):
"""根据任务特性选择端侧或云端处理"""
# 端侧优先场景
if request.contains_sensitive_data():
return self.local.process(request)
if request.requires_low_latency():
return self.local.process(request)
if request.is_offline():
return self.local.process(request)
# 云端处理场景
if request.requires_large_context():
return self.cloud.process(request)
if request.needs_multimodal():
return self.cloud.process(request)
# 默认:端侧处理,必要时回退到云端
try:
return self.local.process(request)
except InsufficientCapability:
return self.cloud.process(request)
4.2 智能汽车:L2+级自动驾驶的端侧决策
在智能汽车领域,L4级自动驾驶单车算力突破5000 TOPS,端侧AI实现10ms内路况决策,确保隧道、无网环境下的安全行驶。
关键技术指标:
- 感知延迟:端到端感知延迟 < 50ms
- 决策频率:规划控制频率 100Hz
- 安全冗余:关键决策本地闭环,不依赖网络
4.3 工业质检:边缘AI的精准控制
在工业制造领域,边缘AI实现:
- 柔性装配±0.05mm精度控制
- 预测性维护,产线效率提升18%
- 误检率控制在0.01%以下
# 工业质检边缘部署架构
class EdgeInspectionSystem:
def __init__(self):
self.model = load_quantized_model("inspection_model_int8.onnx")
self.camera = IndustrialCamera()
self.plc = PLCController()
def inspection_loop(self):
while True:
# 1. 采集图像
image = self.camera.capture()
# 2. 本地推理
result = self.model.infer(image)
# 3. 实时决策
if result.defect_detected:
self.plc.reject_product()
self.log_defect(result)
else:
self.plc.accept_product()
# 4. 异步上报(不阻塞主流程)
self.async_upload(result)
五、性能优化:让端侧模型跑得更快
5.1 推理引擎选择
端侧推理引擎的选择直接影响性能和兼容性:
| 引擎 | 优势 | 适用平台 | 推荐场景 |
|---|---|---|---|
| llama.cpp | 跨平台、GGUF格式、量化支持好 | CPU/GPU通用 | 通用LLM部署 |
| MLC-LLM | 针对移动设备优化、支持多种后端 | iOS/Android | 手机APP集成 |
| ONNX Runtime | 生态丰富、支持多种框架导出 | 全平台 | 已有ONNX模型 |
| TensorFlow Lite | Google生态、 delegates加速 | Android/嵌入式 | TF模型部署 |
| Core ML | Apple原生、Neural Engine加速 | iOS/macOS | Apple生态 |
5.2 内存优化技巧
# 1. 梯度检查点(Gradient Checkpointing)
# 在训练/微调时减少激活值内存占用
from torch.utils.checkpoint import checkpoint
def forward_with_checkpointing(self, x):
# 只保存输入,不保存中间激活值
return checkpoint(self.heavy_computation, x)
# 2. 动态批处理
class DynamicBatcher:
"""根据当前负载动态调整批处理大小"""
def __init__(self, max_batch_size=16):
self.max_batch_size = max_batch_size
self.current_batch_size = 1
def adjust_batch_size(self, latency_ms):
"""根据延迟反馈调整批大小"""
if latency_ms < 50: # 延迟很低,可以增加批大小
self.current_batch_size = min(
self.current_batch_size + 1,
self.max_batch_size
)
elif latency_ms > 200: # 延迟过高,减少批大小
self.current_batch_size = max(self.current_batch_size - 1, 1)
# 3. 内存池管理
class MemoryPool:
"""预分配内存池,减少运行时分配开销"""
def __init__(self, pool_size=1024*1024*1024): # 1GB
self.pool = torch.empty(pool_size, dtype=torch.uint8)
self.offset = 0
def allocate(self, size):
if self.offset + size > len(self.pool):
self.offset = 0 # 简单的循环分配
ptr = self.pool[self.offset:self.offset + size]
self.offset += size
return ptr
5.3 编译优化
使用深度学习编译器进一步优化性能:
# 使用TVM进行模型编译优化
import tvm
from tvm import relay
def compile_with_tvm(model, input_shape, target="metal"):
"""
使用TVM编译模型以在目标设备上获得最佳性能
target选项:
- "llvm": CPU
- "cuda": NVIDIA GPU
- "metal": Apple GPU
- "opencl": 通用GPU
"""
# 转换为Relay IR
mod, params = relay.frontend.from_pytorch(model, input_shape)
# 编译配置
target = tvm.target.Target(target)
with tvm.transform.PassContext(opt_level=3):
lib = relay.build(mod, target=target, params=params)
return lib
六、挑战与未来展望
6.1 当前挑战
- 精度与效率的权衡:4B模型虽然能跑在手机上,但在复杂推理任务上仍不如大模型
- 长上下文支持:端侧设备的内存限制了上下文长度,通常只能支持4K-8K tokens
- 多模态融合:视觉-语言-音频的多模态端侧模型仍在探索阶段
- 能耗管理:持续运行AI推理对电池续航是巨大考验
6.2 未来趋势
Densing Law(密度法则):面壁智能提出的概念,认为模型能力密度(单位参数的能力)正在快速提升。到2025年,一个80亿参数的端侧模型,性能已经逼近两年前的千亿大模型。两条曲线交叉的地方,就是端侧智能爆发的临界点。
存算一体芯片:将存储和计算融合,突破"内存墙"限制,为端侧AI提供更高能效比。
端云协同的深化:云端负责模型训练和复杂推理,边缘承担实时推理,构建高效协同体系。
AI Agent的端侧化:像Mano-P这样的GUI智能体只是开始,未来会有更多类型的Agent在本地运行,实现真正的"个人AI助手"。
七、总结
端侧大模型的崛起标志着AI从"集中式智能"向"分布式智能"的范式转变。这不是云端AI的终结,而是AI基础设施的完善——让智能无处不在,随时可用。
对于开发者而言,掌握模型量化、知识蒸馏、边缘部署等技术,将成为2026年的核心竞争力。对于产品经理而言,理解端侧AI的能力边界和应用场景,才能设计出真正有价值的产品。
当AI走出云端、住进你的手机,我们离"智能普惠"的愿景又近了一步。
参考资源:
- Mano-P GitHub: https://github.com/mininglamp/Mano-P
- llama.cpp: https://github.com/ggerganov/llama.cpp
- MLC-LLM: https://llm.mlc.ai/
- AWQ论文: https://arxiv.org/abs/2306.00978