news 2026/5/28 9:18:06

大模型轻量化部署:格式选型(ONNX/GGUF/TFLite) + 压缩三剑客(量化/剪枝/蒸馏)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
大模型轻量化部署:格式选型(ONNX/GGUF/TFLite) + 压缩三剑客(量化/剪枝/蒸馏)

文章目录

  • 大模型格式:从训练到部署
    • 0. 训练/微调的起点:Hugging Face Transformers 格式
    • 一、部署推理阶段:三种大模型部署格式
      • 1.1. 选择合适的部署格式
    • 二、模型优化【重点】
      • 2.1. **模型压缩:让大模型变小、变快**
        • 2.1.1. 模型压缩三剑客:权重量化、权重剪枝、蒸馏
        • 2.1.2. 权重量化(在原模型上降精度)
        • 2.1.3. 权重剪枝(在原模型上删连接)
        • 2.1.4. 知识蒸馏(训练一个全新的小模型)

大模型格式:从训练到部署

大模型的生命周期通常分为两个阶段:训练/微调阶段部署推理阶段,分别对应不同格式。

0. 训练/微调的起点:Hugging Face Transformers 格式

Hugging Face 格式的核心文件:config.json + model.safetensors / .bin + tokenizer 系列文件,如下图(在 Llama-Factory 导出的完整微调后的大模型)。

定位:工业标准的模型训练和微调的原始格式,用于模型训练、微调、评估。
特点:生态最完整(Hugging Face Hub 上有超 16 万模型),支持 PyTorch/TensorFlow 后端,灵活性最高
注意:不适合直接部署(体积大、推理速度慢),需要转换为下方三种部署格式之一


转换关系
Hugging Face 格式 (原始格式)
├── 转换为 GGUF → 用于 llama.cpp / Ollama 等本地 CPU 推理
├── 导出为 ONNX → 可进一步转为 TensorRT / OpenVINO / Core ML
└── 转换为 TFLite → 用于 Android / 嵌入式设备

一、部署推理阶段:三种大模型部署格式

三种大模型部署时用的文件格式 / 载体:ONNX、GGUF与TFLite。

真实场景应基于部署设备去选择模型:

格式主要优势典型适用场景
GGUF轻量本地推理首选,支持多级量化,CPU 内存映射实现秒级加载,llama.cpp 原生支持普通电脑(消费级 CPU / 低显存 GPU)、Ollama、llama.cpp 生态
ONNX跨框架兼容好,NVIDIA 硬件优化完善(兼容好)PC / GPU 服务器、边缘设备、需要跨框架迁移的场景
TFLite专为移动设备优化,Android 生态支持好Android和IoT设备的首选格式,体积小、内存占用低

补充说明:

  • 如果你要部署到 iOS / macOS,更推荐 Core ML 格式。
  • 如果是 NVIDIA 云端 GPU 极致加速,可用 TensorRT (.engine),它通常通过 ONNX 转换得到。

例如 ONNX 格式的大模型
https://www.modelscope.cn/models/onnx-community/Qwen3-0.6B-ONNX

例如 TFLite 格式的大模型
https://www.modelscope.cn/models/google/gemma-1.1-2b-it-tflite

1.1. 选择合适的部署格式

iOS > Core ML (优先使用ANE)
Android > TFLite + Hexagon Delegate 或 ONNX Runtime Mobile

二、模型优化【重点】

如果部署后发现模型运行效率低、或模型太大需要进一步压缩模型。
注:选择模型时尽量选择已经蒸馏、剪枝完的模型;避免自己再进行蒸馏。

模型的进一步压缩的目标:在尽量不牺牲精度的前提下,让AI模型跑得更快、更省、更远。

2.1.模型压缩:让大模型变小、变快

基础知识了解

最重要的概念:模型文件里装的是什么?
1. 下载的模型文件(几个 GB),里面装的是无数个数字(权重)。
没有文字、没有知识库,从头到尾就只有一大堆普通小数,比如 0.25、1.36、-0.78 这种。
AI 所有的聪明、会说话、懂知识,全靠这堆数字撑起来

2. 7B=70亿参数,就是整整70亿个这种数字
参数 =就是一个单独的数字
7B 模型,直白说:文件里老老实实存了70亿个独立数字

3. 重点:每个数字,代表神经元之间「连接的重要程度」
把神经网络想成无数个节点(神经元)互相拉线连起来

  • 每两根神经元之间有一根连线
  • 每一根连线,对应一个数字
    这个数字多大,就代表这根连线影响力有多强
    • 数字大:这条通路很重要,信号优先走这里
    • 数字小:这条通路不重要,几乎不起作用
    • 负数:起到抑制、抵消的作用

简单说:一个数字 = 一根神经连线的强弱等级
模型学知识的过程,就是自动把这70亿个数字调到最合适的大小,固定下来存进文件。

4. 微调:调整这些数字
模型出厂自带一套默认70亿个数字,是通用能力。
微调不改变网络结构,只少量修改里面一部分数字
改完之后,神经连线的强弱变了,模型就专门擅长某一件事(比如写文案、做客服、懂行业术语)。

5. 量化:压缩这些数字的精度
原本每个数字精度很高(占用字节多,文件大、耗显存)。
量化就是:不改变数字大致大小,只降低它的精细度
比如原本是超高精度小数,改成普通精度整数,
数字还能用、模型智商几乎没变,但文件变小、跑得更快

核心一句话总结(只记数字)

  1. 模型里全是海量普通数字,名字叫权重;
  2. 一个数字对应一条神经连线的强弱
  3. 70亿参数 = 70亿个控制连线强弱的数字;
  4. 微调 = 改这些数字,量化 = 压缩这些数字的精细度。

大模型推理执行流程:
你输入中文问题
⬇️
【第一步】分词器 Tokenizer
汉字 / 词语 →逐字转换为整数数字编号,
示例:你好➡️对应转换成编号:[1024, 2048]
⬇️
【第二步】嵌入编码 Embedding
将每一个数字编号,分别转换为专属语义向量(一串小数)
你 1024 → 向量 [0.15, -0.27, 0.63……]
好 2048 → 向量 [0.22, 0.51, -0.33……]
⬇️
【第三步】进入模型权重计算
输入向量 和 模型内几十亿权重数字做矩阵运算
⬇️
【第四步】自动激活相关权重
和问题语义相关的权重 → 自动激活、参与主导计算
无关的权重 → 抑制弱化、不参与主导
⬇️
【第五步】预测下一字概率
依靠激活的权重运算,逐个算出后续汉字的概率
⬇️
【第六步】分词器解码转文字
概率数字 → 反向翻译还原为中文汉字
⬇️
输出 AI 最终回答


**接下来先继续了解概念:**什么是神经网络、什么是权重?**

1. 先认识一下:什么是神经网络?

简单说,神经网络就是一张由“圆圈”和“连线”组成的网:

  • 圆圈 = 神经元(可以想象成一个小计算器)
  • 连线 = 连接(神经元之间的通道)

它的工作方式:给你看一张猫的图片,信息从左边进入,依次流过每一层的**“神经元”和它们之间的“连接”**,一层接一层,直到最右边输出结果——“这是猫”。

🍎打个比方:就像一条工厂流水线。原料(图片)从入口进入,经过一道道工序(神经元层),每道工序的工人之间用手递材料(连接),最后产品(判断结果)从出口出来。

“学习”是什么意思:就是不断调整每条“连线”上的数字,让最终输出越来越准。这些数字就是下面要讲的权重


2. 什么叫“权重”(Weight)?
这个名字来自一个非常生活化的类比:

想象你要决定“今晚吃什么”。

  • 朋友说“火锅好吃”(权重 = 0.7—— 很重要)
  • 你说“太辣了”(权重 = 0.3—— 不太重要)
  • 最后你说“今天太累”(权重 = 0.1—— 基本忽略)

每个因素都有一个重要性程度,或者叫**“加权值”。数值越大,这个因素在最终决策中的“分量越重”**。

在神经网络里完全一样:

  • 输入A → 乘以 权重0.9 → 对结果影响很大(权重高)
  • 输入B → 乘以 权重0.1 → 对结果影响很小(权重低)

所以这些可调的数字,就叫做权重——因为它们决定了每个输入信号的“分量”


2.1.1. 模型压缩三剑客:权重量化、权重剪枝、蒸馏

1. 权重量化(Quantization)【类比有一把毫米级精度的尺子,实际用不到这么大的精度,权重量化就是把精度调低
2. 权重剪枝(Pruning)【剪掉可有可无的连接(例如剪掉权重值小于0.01的连接),类比剪掉多余的树枝,操作简单一行代码搞定
3. 知识蒸馏(Knowledge Distillation)【大模型当老师教小模型,只学“解题思路”不背“全部细节”。例如用整本百科全书(大模型)的考试要点,训练一本小手册(小模型)达到同等考试水平】

在实际工业应用中,这三者经常组合使用:

  1. 先用知识蒸馏训练一个小模型(学生);
  2. 再对这个学生模型做剪枝(去掉不重要的连接);
  3. 最后做量化(降低数值精度)。

三种模型优化比较:

2.1.2. 权重量化(在原模型上降精度)

参考来源:https://cloud.tencent.com/developer/article/2546431

在部署推理时量化(只在加载到显存/内存的那一刻才转成 INT8),不改变原模型文件。

# 案例:将 FP32 转为 INT8/INT4 等低位精度,加载到内存/显存中。fromtransformersimportAutoModelForCausalLM,AutoTokenizer,BitsAndBytesConfig# 8-bit 量化配置quantization_config=BitsAndBytesConfig(load_in_8bit=True,# 加载时将 FP32/FP16 权重转为 INT8,减少约一半显存)# 模型 ID(Qwen 最小开源模型,约 0.6B 参数)model_id="Qwen/Qwen3-0.6B"# 以 8-bit 精度加载模型model=AutoModelForCausalLM.from_pretrained(model_id,quantization_config=quantization_config,# 使用上面定义的 8-bit 配置device_map="auto"# 自动分配到可用的 GPU/CPU)# 加载对应的分词器tokenizer=AutoTokenizer.from_pretrained(model_id)

如果 Hugging Face 下载慢,可以换成 ModelScope 魔塔的加载方式:

frommodelscopeimportAutoModelForCausalLM,AutoTokenizerfromtransformersimportBitsAndBytesConfig# 8-bit 量化配置quantization_config=BitsAndBytesConfig(load_in_8bit=True,# 加载时转为 INT8 精度)# 模型 ID(ModelScope 路径)model_id="qwen/Qwen3-0.6B"# 以 8-bit 精度加载模型model=AutoModelForCausalLM.from_pretrained(model_id,quantization_config=quantization_config,# 8-bit 量化device_map="auto"# 自动分配设备)# 加载分词器tokenizer=AutoTokenizer.from_pretrained(model_id)
2.1.3. 权重剪枝(在原模型上删连接)

直接修改原模型的权重矩阵,生成新模型文件。

删除不重要的权重连接以减小模型规模。可用 torch.nn.utils.prune 实现。

importtorchimporttorch.nn.utils.pruneasprunefromtransformersimportAutoModelForCausalLM# 1. 加载需要裁剪的模型(Qwen 最小开源模型)model_id="Qwen/Qwen3-0.6B"model=AutoModelForCausalLM.from_pretrained(model_id,torch_dtype=torch.float32,# 剪枝需要 fp32 精度device_map="auto")# 2. 开始剪枝(对第一层 Transformer 的注意力输出投影做 30% 随机剪枝)prune.random_unstructured(model.model.layers[0].self_attn.o_proj,# Qwen3 的层名name="weight",# 裁剪权重amount=0.3# 裁剪30%)# 3. 验证稀疏度sparsity=(model.model.layers[0].self_attn.o_proj.weight==0).float().mean()print(f"稀疏度:{sparsity:.2%}")# 4. 固化剪枝结果并保存prune.remove(model.model.layers[0].self_attn.o_proj,"weight")model.save_pretrained("./qwen0.6b-pruned")
2.1.4. 知识蒸馏(训练一个全新的小模型)

训练一个全新的小模型,模仿大模型的行为。

# 简化伪代码teacher_logits=teacher(input_ids).logits# 老师:大模型student_logits=student(input_ids).logits# 学生:小模型# 本质是让学生模仿老师的“思考方式”(输出概率),而非仅背答案# 💡 实际使用时建议加入温度参数 T 软化分布,学习效果更好loss=nn.KLDivLoss()(F.log_softmax(student_logits),# 学生侧:log-概率F.softmax(teacher_logits)# 老师侧:概率分布)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 9:15:27

ARM开发中__aeabi_assert未定义错误解析与解决方案

1. ARM开发中遇到的__aeabi_assert未定义错误解析最近在使用Keil MDK配合Arm Compiler 6进行嵌入式开发时,遇到了一个典型的链接错误:"Error: L6218E: Undefined symbol __aeabi_assert (referred from *.o)"。这个问题在基于ARM Cortex-M系列…

作者头像 李华
网站建设 2026/5/28 9:14:10

【Python基础-认识趣事】for循环的作用不仅在于赋值

额话先说,作为业余python我对循环的使用并没有理解很到位 看到一段实例,是print(‘*’)相关的 for i in range(1, 10):print(a)for i in range(7):print(b)解释为:为变量i进行9次循环,以此为i赋予从2到10的num值 对于几乎只会用fo…

作者头像 李华
网站建设 2026/5/28 9:12:06

本地Cookie安全导出终极指南:Get cookies.txt LOCALLY完全使用手册

本地Cookie安全导出终极指南:Get cookies.txt LOCALLY完全使用手册 【免费下载链接】Get-cookies.txt-LOCALLY Get cookies.txt, NEVER send information outside. 项目地址: https://gitcode.com/gh_mirrors/ge/Get-cookies.txt-LOCALLY 你是否曾经遇到过这…

作者头像 李华
网站建设 2026/5/28 9:08:00

导电聚合物枝晶生长机制与神经形态器件应用

1. 导电聚合物枝晶(CPD)的生长机制与技术背景导电聚合物枝晶(Conducting Polymer Dendrites, CPD)是一种通过电化学聚合方法在电极间生长的微纳米级导电结构。这类材料在柔性电子、神经形态计算和生物电子接口等领域展现出独特优势。CPD的生长过程本质上…

作者头像 李华