当前位置: 首页 > news >正文

如何低比特量化算法的工程实战与落地优化

网罗开发(小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


文章目录

    • 摘要
    • 引言
    • 低比特量化的工程要点与指标
      • 先对齐的目标与约束
      • 指标怎么量
    • 工具链选型与搭配建议
      • 8-bit 常见路线(稳)
      • 4-bit 常见路线(省)
      • 经验法则
    • 4-bit 实战:bitsandbytes 与 AutoGPTQ/AWQ
      • 用 bitsandbytes 快速 4-bit 加载(无需离线量化)
        • 代码解析(关键点)
      • 用 AutoGPTQ 离线 4-bit(更稳定的长期 Serving)
        • 代码解析(关键点)
    • 8-bit 实战:PyTorch 与 ONNX Runtime
      • PyTorch 动态 INT8(CPU 上手最快)
        • 代码解析(关键点)
      • ONNX Runtime 静态 INT8(有校准,更稳)
        • 代码解析(关键点)
    • 误差修正与稳定性优化
      • SmoothQuant(激活-权重重排平衡)
      • Bias Correction(偏置校正)
      • GPTQ / AWQ 的本质差异
      • 不要量化的模块 & 常见坑
    • 可运行 Demo 代码模块(含详细解析)
      • Demo A:DistilBERT 动态 INT8(CPU)
    • 6.2 Demo B:OPT-125M 4-bit(bitsandbytes)推理
    • 6.3 Demo C:ONNX Runtime 静态 INT8(含校准)
    • 误差诊断与回滚机制
      • 如何快速定位“量化导致”的质量下滑
      • 回滚与灰度
    • 应用场景(含示例代码与详细介绍)
      • 场景一:客服机器人(LLM)显存吃紧,改用 4-bit + QLoRA 小样本域内微调
      • 场景二:搜索排序的轻量模型(BERT 小型)CPU 线上推理,切 INT8 动态量化
      • 场景三:多轮对话长上下文(LLM),引入 SmoothQuant + INT8 激活
    • QA 环节
    • 总结

摘要

模型越大、预算越紧,这是多数团队的真实处境。推理侧既要快、又要稳,还要省钱。低比特量化(4-bit / 8-bit)正是工程上最“见效快”的手段之一:显著降低显存/内存占用与吞吐成本,同时尽量守住精度底线。本文聚焦工程实战与落地优化:从工具链选型、参数与激活的量化策略,到误差修正(SmoothQuant、Bias Correction、GPTQ/AWQ 等)与业务案例复盘,并给出可运行的 Demo 代码模块与详解,帮助你快速上手、稳定上线。

引言

过去两年里,8-bit 在视觉/文本小中型模型上几乎成了“默认配置”;而 4-bit 则在大语言模型(LLM)侧迅速普及(如 weight-only 的 GPTQ/AWQ、以及 4-bit + LoRA 的 QLoRA 微调范式)。工具链层面,PyTorch(动态/静态量化)、bitsandbytes(4-bit NF4/FP4)、AutoGPTQ/AWQ(离线权重量化)、ONNX Runtime/TensorRT(生产推理)已经比较成熟。真正的难点,落在“精度-性能的平衡”与“工程稳定性”:不合适的校准样本、随意量化 LayerNorm/Embedding、KV Cache 处理不当,都可能导致线上效果抖动。本文给出一套“可复制”的落地手册。

低比特量化的工程要点与指标

先对齐的目标与约束

  • 目标:在给定硬件/预算下,把吞吐(QPS)与时延(P50/P95)拉到业务可接受的范围,并控制离线/在线评测指标的下降不超过阈值(如 AUC/准确率/召回率下降 ≤ 0.5pp)。

  • 约束

    • 硬件:CPU(AVX512/VNNI)、NVIDIA GPU(TensorRT-LLM、CUDA cores)、推理引擎(ONNX Runtime、Triton)支持程度不同。
    • 模型结构:是否有大规模矩阵乘、是否包含 LayerNorm/Embedding、是否能轻松导出 ONNX。
    • 数据分布:是否存在激活值长尾/离群通道(Outliers),是否有典型长上下文(LLM)。

指标怎么量

  • 资源:显存/内存峰值、模型加载时间、冷启动时间。
  • 性能:吞吐(QPS)、平均时延/尾延(P50/P95/P99)、Token/s(LLM)。
  • 精度:离线评测(AUC/Acc/F1/ROUGE),以及在线 A/B。
  • 稳定性:多批次多种输入分布下的方差;滚动发布的回退策略要明确。

工具链选型与搭配建议

8-bit 常见路线(稳)

  • PyTorch 动态/静态量化:CPU 推理简单好用,配合 quantize_dynamic 常用于 BERT/DistilBERT 类模型线下推理。
  • ONNX Runtime INT8(QDQ):适合生产化与异构部署,配合校准集能拿到稳定收益。
  • TensorRT-LLM INT8:GPU 上追求极致延迟/吞吐的首选(需要工程投入与算子支持)。

4-bit 常见路线(省)

  • bitsandbytes(NF4/FP4):weight-only 量化 + 4-bit 加载,无需离线量化,上手快;常用于 LLM 推理与 QLoRA 微调。
  • AutoGPTQ / AWQ离线权重量化,通过最小化重建误差(GPTQ)或激活感知(AWQ)手段在 4-bit 下尽量维持精度,适合长期稳定 Serving。

经验法则

  • 追求稳定且广泛兼容:优先 8-bit(CPU/ONNX)。
  • 追求显存极致节省(LLM):4-bit weight-only(AutoGPTQ/AWQ 或 bnb NF4)。
  • 要微调:QLoRA(4-bit base + LoRA 适配器,训练显存小)。
  • 别量化:LayerNorm/Embedding 一般不量化;优先 per-channel 权重量化;Activation 用对称/非对称结合校准。

4-bit 实战:bitsandbytes 与 AutoGPTQ/AWQ

用 bitsandbytes 快速 4-bit 加载(无需离线量化)

下面示例演示如何用 Transformers + bitsandbytes 把一个 Causal LM 以 4-bit 方式加载并生成文本。

# pip install transformers accelerate bitsandbytes>=0.43.0
from transformers import AutoModelForCausalLM, AutoTokenizer
import torchmodel_id = "facebook/opt-125m"   # 示例用小模型,方便本地验证
tokenizer = AutoTokenizer.from_pretrained(model_id, use_fast=True)compute_dtype = torch.float16
bnb_config = {"load_in_4bit": True,"bnb_4bit_quant_type": "nf4",       # 核心:NF4 更稳"bnb_4bit_use_double_quant": True,  # 双重量化,进一步省显存"bnb_4bit_compute_dtype": compute_dtype
}model = AutoModelForCausalLM.from_pretrained(model_id,device_map="auto",**bnb_config
)prompt = "Explain low-bit quantization in one paragraph:"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():out = model.generate(**inputs,max_new_tokens=80,do_sample=False,temperature=None)
print(tokenizer.decode(out[0], skip_special_tokens=True))
代码解析(关键点)
  • nf4:对权重量化分布更友好,通常比 fp4 更稳。
  • use_double_quant:对量化常数再量化,节省显存。
  • 算子兼容性:weight-only,不动激活,部署简单且鲁棒。
  • 显存估算:权重从 FP16(2 bytes/param)降到 4-bit(0.5 bytes/param),理论上约 4× 节省(实际还要加上量化常数与缓存开销)。

用 AutoGPTQ 离线 4-bit(更稳定的长期 Serving)

适合对“精度更敏感”的服务:先离线量化再上线。

# pip install auto-gptq transformers accelerate datasets
from transformers import AutoTokenizer, AutoModelForCausalLM
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
from datasets import load_dataset
import torchmodel_id = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_id, use_fast=True)# 1) 准备一个小校准集(和线上分布尽量相似)
dataset = load_dataset("wikitext", "wikitext-2-raw-v1", split="train[:2%]")
def tokenize(sample):return tokenizer(sample["text"], truncation=True, padding="max_length", max_length=512)
calib = dataset.map(tokenize, batched=True, remove_columns=dataset.column_names)# 2) 配置 GPTQ(误差最小化)
quantize_config = BaseQuantizeConfig(bits=4,group_size=128,        # 组粒度(影响压缩率与精度)desc_act=False,        # 不量化激活damp_percent=0.01      # 抑制 Hessian 噪声
)# 3) 离线量化与保存
model = AutoGPTQForCausalLM.from_pretrained(model_id, quantize_config, device_map="auto")
model.quantize(calib, use_triton=False)
save_dir = "./opt-125m-gptq-4bit"
model.save_quantized(save_dir, use_safetensors=True)
tokenizer.save_pretrained(save_dir)# 4) 加载量化模型推理
quant_model = AutoGPTQForCausalLM.from_quantized(save_dir, device_map="auto")
inputs = tokenizer("Quantization tips:", return_tensors="pt").to(quant_model.device)
with torch.no_grad():out = quant_model.generate(**inputs, max_new_tokens=60)
print(tokenizer.decode(out[0], skip_special_tokens=True))
代码解析(关键点)
  • 校准集:尽量贴近线上分布,宁少不滥(512~2048 条高质量样本通常够用)。
  • group_size:越小越精准但开销越大;常见 32/64/128。
  • 误差目标:GPTQ 基于二阶信息做“最优舍入”,在 4-bit 下通常更稳。
  • 产物:产出可直接 Serving 的 4-bit 权重,易于版本化与回滚。

8-bit 实战:PyTorch 与 ONNX Runtime

PyTorch 动态 INT8(CPU 上手最快)

对 BERT/DistilBERT 一类模型,quantize_dynamic 可迅速拿到收益。

# pip install torch torchvision torchaudio transformers
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizermodel_id = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(model_id)
fp32_model = AutoModelForSequenceClassification.from_pretrained(model_id)
fp32_model.eval()# 1) 动态量化:把 Linear 层替换为 INT8 内核
int8_model = torch.quantization.quantize_dynamic(fp32_model, {torch.nn.Linear}, dtype=torch.qint8
)
int8_model.eval()# 2) 简单对比推理与输出
text = "I love quantization because it makes inference fast and cheap!"
inputs = tokenizer(text, return_tensors="pt")
with torch.no_grad():logits_fp32 = fp32_model(**inputs).logitslogits_int8 = int8_model(**inputs).logitsprint("fp32 logits:", logits_fp32)
print("int8 logits:", logits_int8)
代码解析(关键点)
  • 动态量化:权重预量化,激活在运行时量化/反量化,部署简单。
  • 适用层:对 nn.Linear 最有效;不要量化 LayerNorm/Embedding。
  • 落地:CPU 服务上常能得到 1.3×~2× 的速度提升,损失很小。

ONNX Runtime 静态 INT8(有校准,更稳)

适合生产环境,配合校准集做 QDQ(Quantize-DeQuantize)标注。

# pip install onnx onnxruntime onnxruntime-tools onnxruntime-gpu onnxruntime-training --extra-index-url https://download.pytorch.org/whl/cu121
# 以 DistilBERT 为例导出 ONNX 并静态量化(示范流程)
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer
from onnxruntime.quantization import CalibrationDataReader, QuantType, quantize_static
import onnxmodel_id = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForSequenceClassification.from_pretrained(model_id)
model.eval()# 1) 导出 ONNX
dummy = tokenizer("hello quantization", return_tensors="pt")
torch.onnx.export(model,(dummy["input_ids"], dummy["attention_mask"]),"distilbert.onnx",input_names=["input_ids","attention_mask"],output_names=["logits"],dynamic_axes={"input_ids": {0:"batch",1:"seq"}, "attention_mask":{0:"batch",1:"seq"}, "logits":{0:"batch"}},opset_version=17
)# 2) 构建一个简易的校准数据读取器
class ToyReader(CalibrationDataReader):def __init__(self, samples):self.samples = samplesself.iter = iter(self.samples)def get_next(self):try:item = next(self.iter)enc = tokenizer(item, return_tensors="np", padding="max_length", truncation=True, max_length=32)return {"input_ids": enc["input_ids"], "attention_mask": enc["attention_mask"]}except StopIteration:return Nonecalib_texts = ["this movie is awesome", "bad product", "service is great", "the food was terrible","I will buy again", "worst experience", "highly recommended", "not good at all"
]
dr = ToyReader(calib_texts)# 3) 静态量化(对称权重 + 合理的激活量化)
quantize_static("distilbert.onnx","distilbert.int8.onnx",dr,per_channel=True,weight_type=QuantType.QInt8
)print("Saved: distilbert.int8.onnx")
代码解析(关键点)
  • 校准:小而精的样本,覆盖典型输入分布与长度。
  • per_channel 权重量化:更稳(尤其是大矩阵)。
  • 导出参数dynamic_axes 适配不同输入长度;opset_version 选新一点的算子集以利于后端优化。
  • 部署:ONNX Runtime Server 或 Triton Inference Server 上线方便。

误差修正与稳定性优化

SmoothQuant(激活-权重重排平衡)

在导出前对激活做通道级缩放、把放大/缩小“转移”到权重,减少激活长尾,适合全量化(权重+激活)。
要点:统计激活的通道峰值/分布;选择平衡因子 α(如 0.5);在导出或离线量化前做一次性重排。

Bias Correction(偏置校正)

量化后以少量样本做前向,比较每层量化/非量化输出的均值差异,用差补到偏置项上,抵消系统性偏移。
伪代码:

# 以 Linear 为例:bias_new = bias_old + mean(fp32_out - int8_out)

GPTQ / AWQ 的本质差异

  • GPTQ:以最小化重建误差(近似二阶信息)为目标做最优舍入。
  • AWQ:关注激活对输出的影响(把“重要通道”的权重量化得更“细致”)。
    工程建议:LLM 上两者都可靠,取决于你已有的工具链与数据流;都有成熟实现与社区模型可直接复用。

不要量化的模块 & 常见坑

  • LayerNorm/Embedding 通常不量化;
  • KV Cache(LLM):可考虑 INT8/FP8,但要逐步评估尾延与质量;
  • 激活溢出:注意长序列/极端输入触发;
  • 动态形状:导出/部署时核对 ONNX/TensorRT 支持的动态维度策略。

可运行 Demo 代码模块(含详细解析)

Demo A:DistilBERT 动态 INT8(CPU)

应用:文本分类/情感分析的 CPU 服务降本增效。

# pip install torch transformers
import time
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizermodel_id = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(model_id)
fp32_model = AutoModelForSequenceClassification.from_pretrained(model_id).eval()int8_model = torch.quantization.quantize_dynamic(fp32_model, {torch.nn.Linear}, dtype=torch.qint8
).eval()texts = ["This product is amazing!","I will never use this again.","It was okay, nothing special."
]
inputs = tokenizer(texts, return_tensors="pt", padding=True, truncation=True)def bench(m):t0 = time.time()with torch.no_grad():for _ in range(50):_ = m(**inputs).logitsreturn (time.time() - t0)/50print("avg latency fp32:", bench(fp32_model))
print("avg latency int8:", bench(int8_model))with torch.no_grad():logits = int8_model(**inputs).logits
print("logits example (int8):", logits[0])

解析与验证

  • 用 50 次前向取平均时延,观察 INT8 相对 FP32 的速度提升。
  • 业务落地时再加批量尺寸、并发度、CPU 线程亲和等配置测试。

6.2 Demo B:OPT-125M 4-bit(bitsandbytes)推理

应用:小型 LLM 的显存压缩与快速部署。

# pip install transformers accelerate bitsandbytes>=0.43.0
import torch
from transformers import AutoModelForCausalLM, AutoTokenizermodel_id = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_id)model_4bit = AutoModelForCausalLM.from_pretrained(model_id,device_map="auto",load_in_4bit=True,bnb_4bit_quant_type="nf4",bnb_4bit_use_double_quant=True,bnb_4bit_compute_dtype=torch.float16
)prompt = "Give me three tips for production quantization:"
inputs = tokenizer(prompt, return_tensors="pt").to(model_4bit.device)
with torch.no_grad():out = model_4bit.generate(**inputs, max_new_tokens=64)
print(tokenizer.decode(out[0], skip_special_tokens=True))

解析与验证

  • 代码即开即用,重点关注 nf4double_quant
  • 对比 FP16 与 4-bit 的显存(如 nvidia-smitorch.cuda.memory_allocated())。

6.3 Demo C:ONNX Runtime 静态 INT8(含校准)

应用:生产化部署、可控的量化过程。

误差诊断与回滚机制

如何快速定位“量化导致”的质量下滑

  • 分层对比:记录若干关键层(如每个 Transformer block 的输出)在 FP32 与 INT8 的差异(cos 相似度、KL 散度)。
  • 排除法:先只量化 Linear,再尝试更激进的模块;或先只量化权重,确认激活问题再引入 SmoothQuant。
  • 典型输入回放:建立一套“问题样本集”,每次变更都跑一遍,避免回归。

回滚与灰度

  • 双版本部署:FP16/FP32 与量化版并存,按流量比例灰度。
  • 健康阈值:在线指标(如转化率/投诉率)超过阈值即回滚。
  • 版本化产物:离线量化产物(.safetensors / .onnx)按语义版本管理。

应用场景(含示例代码与详细介绍)

场景一:客服机器人(LLM)显存吃紧,改用 4-bit + QLoRA 小样本域内微调

问题:基础大模型上直接服务,显存与成本吃不消;同时需要一点点行业知识适配。
方案:底座 4-bit 加载 + LoRA(QLoRA 思路)做域内小样本微调,保持推理仍用 4-bit base + LoRA 适配器

# pip install peft transformers accelerate bitsandbytes datasets
import torch
from datasets import Dataset
from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_trainingmodel_id = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_id, use_fast=True)model = AutoModelForCausalLM.from_pretrained(model_id,load_in_4bit=True,bnb_4bit_quant_type="nf4",bnb_4bit_use_double_quant=True,bnb_4bit_compute_dtype=torch.float16,device_map="auto"
)model = prepare_model_for_kbit_training(model)peft_config = LoraConfig(r=16, lora_alpha=32, target_modules=["q_proj","v_proj","k_proj","o_proj"], lora_dropout=0.05, bias="none"
)
model = get_peft_model(model, peft_config)# 玩具数据:问答拼接成简单的 SFT 格式
data = [{"prompt":"退货流程怎么走?","answer":"登录订单-申请退货-选择原因-提交快递单号。"},{"prompt":"发票开具规则?","answer":"支持电子发票,售后期内在个人中心-发票管理下载。"}]
def to_sft(sample):text = f"用户:{sample['prompt']}\n客服:{sample['answer']}"ids = tokenizer(text, truncation=True, padding="max_length", max_length=256, return_tensors="pt")return {"input_ids": ids["input_ids"][0], "attention_mask": ids["attention_mask"][0], "labels": ids["input_ids"][0]}
ds = Dataset.from_list(data).map(to_sft)args = TrainingArguments(per_device_train_batch_size=2,gradient_accumulation_steps=2,num_train_epochs=1,learning_rate=2e-4,logging_steps=5,output_dir="./qlora-demo",save_steps=1000
)def collate(features):keys = ["input_ids","attention_mask","labels"]return {k: torch.stack([f[k] for f in features]) for k in keys}trainer = Trainer(model=model, args=args, train_dataset=ds, data_collator=collate)
trainer.train()# 推理仍用 4-bit base + LoRA
prompt = "退货流程怎么走?"
inputs = tokenizer(f"用户:{prompt}\n客服:", return_tensors="pt").to(model.device)
with torch.no_grad():out = model.generate(**inputs, max_new_tokens=64)
print(tokenizer.decode(out[0], skip_special_tokens=True))

解析

  • prepare_model_for_kbit_training:让 4-bit 权重支持微调的数值稳定性。
  • LoRA target_modules:聚焦注意力的 Q/K/V/O 投影层最有效。
  • 收益:在极低显存下做域内“轻微适配”,线上仍保持 4-bit 推理成本。

场景二:搜索排序的轻量模型(BERT 小型)CPU 线上推理,切 INT8 动态量化

问题:QPS 顶不住,CPU 成本高。
方案:动态量化 Linear 层,批量推理+线程绑定组合拳,收益稳定。

落地提示

  • 控制 batch size序列长度,避免激活溢出;
  • 与工程侧联动 CPU 亲和、NUMA 交叉、预热;
  • 用离线 AUC + 在线点击率做双指标兜底。

场景三:多轮对话长上下文(LLM),引入 SmoothQuant + INT8 激活

问题:长上下文输入导致激活长尾,INT8 全量化抖动。
方案:上线前跑一遍 SmoothQuant,对激活按通道缩放,之后再做 INT8(权重 per-channel + 激活 per-tensor)。
实现要点

  • 采样 512~1024 条长上下文校准样本;
  • 平衡因子 α 网格搜索(如 0.3/0.5/0.7);
  • 对比未处理与处理后的激活分布(可视化直方图)再量化。

QA 环节

Q1:4-bit 和 8-bit 怎么选?

  • 追求最大化省显存(尤其 LLM):先看 4-bit(bnb/AutoGPTQ/AWQ)。
  • 追求工程稳定与广泛兼容:优先 8-bit(PyTorch/ONNX)。
  • 有微调需求:QLoRA(4-bit base + LoRA)是低成本首选。

Q2:校准集需要多大?

  • 量化是“代表性样本优先”,512~2048 条高质量样本通常足够。覆盖不同长度/领域,避免脏数据。

Q3:为什么量化后线上波动大?

  • 输入分布变了(节假日/新品/活动);
  • 量化了不该量化的层(LayerNorm/Embedding);
  • 激活溢出(长上下文/异常输入)未被 SmoothQuant 处理;
  • 监控与回滚策略缺失。

Q4:KV Cache 要不要量化?

  • 能省显存,但对长序列质量可能更敏感。建议灰度 + 充分 A/B,再决定规模化。

Q5:如何验证“没坏”?

  • 分三层:单样本逐层对比 → 离线指标 → 在线指标;
  • 设定阈值:如 AUC 下降 ≤ 0.5pp 才允许放量;
  • 版本化产物与一键回滚。

总结

  • 路线选择:8-bit(稳)与 4-bit(省)不是对立,是工具箱里不同的扳手。选谁取决于硬件、模型与业务目标。
  • 工程要义:小而精的校准集、谨慎的层选择(不动 LN/Emb)、per-channel 权重、必要时的 SmoothQuant/Bias Correction。
  • 工具链:PyTorch 动态 INT8 快速起步;ONNX Runtime 静态 INT8 生产可控;bitsandbytes/AutoGPTQ/AWQ 完成 4-bit 在 LLM 场景的显存释放。
  • 可复制流程:离线评测(分布/样本/指标)→ 小流量灰度(监控/告警/回滚)→ 成本-质量双目标优化。
http://www.dtcms.com/a/340732.html

相关文章:

  • 从零开始的云计算生活——第四十七天,细水长流,kubernetes模块之ingress资源对象
  • 开源 AR 眼镜怎么选?OpenGlass ,OSSG,cheApR 分析推荐
  • 无需驱动!单文件实现键盘按键禁用的技术方案
  • 通用物联网接口调用完整解决方案2
  • Ubuntu_22.04安装文档
  • k8s--Discuz论坛lnmp平台部署
  • 软件可视化与前端、后端技术开发的关系
  • WPF MVVM进阶系列教程(四、ViewModel通信)
  • std::map 的插入元素方式
  • 下拉组件Tag支持自定义背景颜色,图片组支持设置刷新频率,DataEase开源BI工具v2.10.12 LTS版本发布
  • iOS 应用上架常见问题与解决方案,多工具组合的实战经验
  • 深入解析RAGFlow六阶段架构
  • iOS 应用迭代与上架节奏管理 从测试包到正式发布的全流程实践
  • 操作系统:资源竞争或者同步问题;锁、信号量等机制
  • Mac 上安装并使用 frpc(FRP 内网穿透客户端)指南
  • MacBook Pro M1升级Burp Suite2025.8
  • Mac电脑上虚拟机共享文件夹权限问题
  • 数据挖掘笔记:点到线段的距离计算
  • 5.3 包管理工具 npm yarn pnpm 对比
  • AI与BI的协同:未来企业数据分析的趋势
  • 【考研408数据结构-06】 树与二叉树(上):遍历算法全解析
  • 【考研408数据结构-07】 树与二叉树(下):特殊树结构与应用
  • HTTPS协议与HTTP协议的区别
  • Web前端调试与性能优化,Charles抓包工具的高效应用
  • 计算机视觉(二)------OpenCV图像视频操作进阶:从原理到实战
  • vscode连接docker
  • 【网络运维】Linux:正则表达式
  • Gin自定义Error中间件
  • 【C++】--指针与引用深入解析和对比
  • Gin传参和接收参数的方式