第 4 章 人工智能开发框架(下):应用开发流程、llama.cpp 部署与 AI 芯片
《人工智能学习笔记》系列第 6 篇,共 9 篇。
4.4 AI 应用开发流程

| 步骤 | 要做的事 | 容易踩的坑 |
|---|---|---|
| 需求分析 | 解决什么问题、有什么数据、怎么解、要什么效果、多少算力/什么设备/什么框架 | 省了这步,后面全在返工 |
| 开发环境 | 哪个框架,本地 / 云 / 服务器 | 框架版本、Python 版本、硬件三者要对得上 |
| 数据准备 | 占比最大的一块 | 脏数据要剔;无标签数据要打标(除非算法本身是自监督/无监督);开源数据集已处理好,真实数据不是 |
| 构建网络 | 输入层 / 隐藏层 / 输出层 + 损失函数 + 超参数 | 隐藏层靠试错;损失多用内置,GAN 这类要自己设计 |
| 训练与测试 | 训练 → 保存 → 测试,不达标回去调 | 只看训练损失会骗人 |
| 部署与推理 | 转成适配硬件的格式,降延迟、降占用 | 推理前忘关梯度、忘切评估模式 |
建网的三个口子:输入层取决于数据形态(将整张图片作为特征向量分类时先展平;文本要想好第一层收多少神经元);输出层几类就几个神经元,回归一个;隐藏层没有公式,靠试错——「深度学习像炼丹,出不出好丹得开炉才知道」。实践捷径是拿开源结构 + 预训练参数,冻结一部分只训一部分。超参数(学习率、epoch、动量)多是经验之谈,资源够就用网格搜索 / 随机搜索。
案例:五类花卉图像分类。定性为 CV 里最基础的图像分类、有监督。数据五类、3000 多张(不到 4000),量太小,从零训 ResNet 出不了成果,所以走迁移学习;结构选 ResNet-50(有开源预训练权重)。
残差为什么重要:网络加深理论更强,现实却会退化(加深到一定程度反而变差)。残差在两层计算后把输入 x 加回输出,梯度沿这条加法通路回去不消失,于是能做到上千层不退化。ResNet-50 骨架:7×7/64(stride 2)→ 3×3 maxpool(stride 2)→ 若干瓶颈模块 → 全局平均池化 → 全连接。瓶颈模块 = 1×1 → 3×3 → 1×1:先降维、再升维,让 3×3 在低维上提特征,算力省下一大截,中间那层也顺带整合了跨通道信息;主路与跳连要和得起来,靠最后一个 1×1(必要时跳连上再加一个投影卷积)。18/34/50/101/152 的差别是块的类型 + 堆叠的份数:18/34 用两个 3×3 叠成的 basic block,50/101/152 换成瓶颈块。
两种训练方式:① 从零训(随机初始化,3000 张图硬碰硬);② 迁移学习(加载 ImageNet 权重 → 冻结主干 → 1000 类分类头改成 5 类 → 只训分类头)。推理:PyTorch 先 no_grad + eval。
模型压缩:把大模型塞进小设备
模型压缩是「部署」的前置动作。
为什么必须压缩。推理不更新权重,所以对硬件的算力要求低于训练,但显存和带宽一点没省:
| 压力来源 | 具体表现 |
|---|---|
| 推理性能 | 带宽是瓶颈时,参数越多,每次推理要搬的数据越多,速度掉得快;显存装不下就得退回 CPU,再掉一档 |
| 部署成本 | 参数越多,对存储、算力、显存的要求越高,能跑得动的设备越少越贵;而大显存、高带宽恰恰是最贵的指标 |
| 显存占用 | Batch Size 与序列长度一涨,KV 缓存跟着涨,访存压力继续放大 |
所以想让 AI 落到手机、摄像头这类端边设备上,压缩是绕不过去的一步。
两种主要方法:
| 方法 | 一句话 | 做法与代价 |
|---|---|---|
| 模型剪枝 | 把不重要的权重和分支裁掉,让网络稀疏化 | 连接就是权重矩阵,剪枝就是把矩阵里一部分元素置零,相当于剪掉贡献小的「突触」甚至整个神经元。代价是可能掉精度,得在模型大小与性能之间找平衡点 |
| 知识蒸馏 | 让小网络学大网络 | 本质是带迁移学习理念的压缩:大网络(教师)性能好但冗余多、运算量大;把其中有用信息提取出来迁移给小网络(学生),小网络就能以接近的性能、低得多的算力完成同样的任务 |

部署工具示例:
| 工具 | 阵营 | 定位 |
|---|---|---|
| llama.cpp | 独立 | C++ 实现,目标是在各种硬件(本地与云)上以最少配置实现 LLM 推理,完全不需要 AI 框架(第 6 章 6.3 就是它) |
4.5 开发框架实验
本节用 PyTorch 练习基础 API、图像分类与 ResNet。重点是使用流程和 API 参数含义——nn.Conv2d 摆在你面前,得知道每个参数在干什么。
PyTorch 实验:基础 API → CIFAR-10 的「卷积 + 全连接」网络(50 个 epoch,准确率 75.97%,正好体会「结构不够复杂,上限就在那」)→ ResNet(Python 版本按所选 PyTorch 的支持范围匹配,环境示例见 6.0;ImageFolder + DataLoader 设 batch_size、shuffle、多线程;瓶颈块用 nn.Sequential 打包;全局平均池化接分类头)。
留下的三个思考题:① 训练中损失不降反而回弹是什么原因?② 加大 epoch,精度会一直升吗?为什么?③ 不改 ResNet-50 结构、准确率只有 70~75%,还能怎么提?
4.6 模型部署与应用实验(llama.cpp)

前一实验止于「训完保存」,这个实验把模型变成服务:用 llama.cpp 在笔记本上跑一个 1B 量化模型,先做命令行对话,再做 Web 服务供代码调用。
| 项 | 要求 |
|---|---|
| CPU | 本节按 x86-64 笔记本示例准备程序;预编译包的指令集要求须与本机匹配,这不是 llama.cpp 项目本身的架构限制 |
| 系统 | Windows 10 以上,或 Ubuntu 22.04 以上 |
| Python | 3.x,仅实验二(requests 调接口)需要 |
| 其他 | 准备 llama.cpp 程序与 GGUF 模型文件 |
本节以笔记本为例。llama.cpp 上游支持 ARM,也可在树莓派上构建运行;应按目标设备选择匹配的程序版本。
准备三样:程序(从 llama.cpp 上游获取与系统、硬件匹配的版本;项目更新频繁,命令参数以所用版本的帮助为准)、模型文件(本节用 1B 量化版;同模型有 FP16 约 2.48 GB、Q8 等版本,这里以 800 多 MB 的量化文件为例,换版本时同步改模型名)、下载源(HuggingFace 国内直连受限时可用 hf 镜像站)。
实验一:命令行
llama-cli -m 模型路径 -cnv --chat-template llama3 --color
-m 模型路径;-cnv 对话模式(不打印前缀);--chat-template 指定或覆盖对话模板——指令模型需要正确套用模板(Llama、Gemma 等格式不同),模型内置元数据且所用版本支持时可自动读取,缺失或需覆盖时再显式指定;填错等于用错格式;--color 区分人机颜色;另有温度、top-k、重复惩罚控制输出随机性。实测 1B 的 Llama 3.2 中文很差(中英混杂),建议用英文问;同一问题每次回答也不同,因为采样本身带随机。
实验二:Web 服务
llama-server -m 模型路径 -c 上下文长度
-c 是上下文(序列)长度,按 token 计,超出不让输入。先看服务状态:健康检查接口 200 正常、503 异常;要开给局域网同学用,服务端还需用 --host 局域网IP 或 --host 0.0.0.0 监听外部连接,并按需允许对应端口入站,客户端再将 127.0.0.1 换成服务端局域网 IP;仅监听 127.0.0.1 时不能靠改客户端 URL 共享,勿直接暴露到公网。
| 调用方式 | 接口 | 特点 | 返回怎么取 |
|---|---|---|---|
| 原始 API | 原始补全接口 | 采样参数有默认值,具体值依版本;原始 prompt 不自动等同聊天消息,未正确套模板时可能呈现续写风格 | 从 json 里取内容 |
| OpenAI 兼容 | /v1/chat/completions | 按 OpenAI 消息模板传,多数参数已默认,回答正常 | choices[0].message.content |
| openai 库 | 同上 | 最省代码 | 三级剥:完整结果 → choices[0].message → .content |
两个要点:OpenAI 兼容接口里 role: system 优先级最高,先于用户提问——实验给它一句「你现在是 ChatGPT 助手」,它就真自称 ChatGPT,本质是提示词的「催眠」,模型没变;用 openai 库时 base_url 只写到 /v1,库会自动补后续路径,写全了反而重复。
注意:Kimi 那类「超长文本」宣传,实际指上下文 token 数;token 与汉字不是一对一,不能按字数直接换算。
4.7 AI 芯片概览
为什么需要专用芯片
全连接、Transformer 拆开看都是矩阵乘加。一个常被引用的量级:AI 任务中 99% 以上的运算是矩阵运算。既然只有一种运算,硬件就该把晶体管几乎全给乘法器。
定义:广义与狭义
| 口径 | 定义 | 典型例子 |
|---|---|---|
| 广义 AI 芯片 | 能承担 AI 的大量计算任务,同时也能干别的活 | NVIDIA 游戏卡 / GPU(如 RTX 4090、5090) |
| 狭义 AI 芯片 | 针对 AI 算法做了特殊加速设计,但不意味着只能做 AI;计算 GPU 也可用于 HPC、数据分析 | NVIDIA 的 A100 / H100 / B100 / B200 一类加速卡 |
维基式定义:AI 加速器是一类专用硬件加速器或计算系统,用于加速 AI 与机器学习应用,含神经网络与机器视觉(指传统人工设计算子如 Laplacian 提边缘,不是今天的 CNN)。
四个共性特征:多核并行(AI 要海量并行)、低精度(相对渲染与超算的 FP64;AI 里 FP32 已算高,大模型之前 FP16+FP32 混合精度够,量化后主流 INT8/INT4,NVIDIA 在推 FP8/FP4)、数据流设计、存内计算。
训练与推理:两种任务,两种要求

| 训练 | 推理 | |
|---|---|---|
| 做什么 | 权重随机初始化 → 喂数据 → 比对标签算 loss → 反向传播更新权重 | 权重已固定,给输入直接出结果,像 y = f(x) |
| 计算量 | 极大 | 小得多,但仍是大量矩阵运算 |
| 精度 | 高——迭代上万次,一点误差会累积 | 相对低 |
| 可扩展性 | 高,模型涨得比芯片快,必须组集群(典型是万卡集群) | 也可分布式推理 |
按部署位置分:终端 / 边缘 / 云
| 维度 | 终端(手机) | 边缘(路侧、小站) | 云·训练 | 云·推理 |
|---|---|---|---|---|
| 功耗 | 超低:5~6 W 已偏高,超 10 W 算太高 | 低(体积比终端大,可放宽) | 在机房散热允许内尽可能高(功耗高才性能高) | 低(算力打不满就是浪费) |
| 吞吐 | 较低 | 中 | 高 | 高(多用户并发) |
| 精度 | 中 | 中 | 高 | 中高 |
| 可扩展性 | 不需要 | 不需要 | 需要(组集群) | 需要(分布式推理) |
| 主要任务 | 推理为主,可做联邦学习式增量训练 | 抓拍、违法识别 | 训练 | 推理 |
诀窍:本表左两列是终端/边缘,右两列是云训练/云推理;按表中需求,右两列强调扩展性,云训练尤其追求高吞吐。
终端使用本地 NPU 的考虑:调云端有三毛病——没网用不了、延迟高、拿不到本地数据。
发展进程
| 时间 | 事件 |
|---|---|
| 1990s | 有人发现可用 FPGA 加速神经网络,但 AI 当时不火,未被重视 |
| 2006 | Hinton 证明大规模 DNN 可学习;同年 NVIDIA 发布 CUDA |
| 其后 | NVIDIA 推出早期 AI 芯片;IBM 做类脑芯片 |
| 2012 | AlexNet 用 GPU 加速夺冠,比手工构造特征的方法领先好几个百分点——分水岭 |
| 2015 | Google 第一代 TPU,属狭义 AI 芯片 |
四条技术路线

| 路线 | 定位 | 优点 | 缺点 |
|---|---|---|---|
| GPU | 通用(图形 + 计算) | 生态与设计制造工艺成熟 | 推理阶段并行能力发挥不满(厂商正在改,缺点已变小) |
| FPGA | 半定制、可编程 | 可编程改功能;平均性能较高、功耗较低、开发周期短,适合抢新市场 | 单件成本高,量产也降不下来 |
| ASIC | 硬件电路固定(TPU 属此;仍可编程换模型) | 同工艺同面积下性能能效最高;量产后成本极低 | 超出硬件能力的需求难适配;研发失败或没人用就摊不平,只有大厂玩得起 |
| 类脑芯片 | 理想形态 | 功耗低、效率高、认知能力强 | 仍在科研探索,未大规模应用 |

两个学习要点细节:FPGA 运行前要加载硬件配置,ASIC 流片后硬件电路固定,但可编程 ASIC 仍可加载不同程序/模型;且 AI 本质仍是矩阵运算,把矩阵运算优化好性能就高——这是 ASIC 专用数据通路设计的思路。
通用计算与 AI 计算:CPU 为什么不适合

| CPU(x86 等) | GPU / NPU | |
|---|---|---|
| 内部构成 | ALU(算)+ 控制单元(指挥)+ Cache(缓存) | 控制与缓存占比大幅压缩,算力单元堆满 |
| 晶体管 | 70% 以上给控制与缓存,真正算的很少 | 大量 ALU,缓存很小 |
| 特点 | 适合复杂逻辑、分支跳转、中断;NPU 能做的 CPU 基本都能做,只是效率低 | 适合类型高度统一、依赖少的大规模数据 + 不需打断的纯净计算环境 |
| 核与频率 | 核少(数据中心 CPU 上百核,个人机十几核)、频率高、单核强 | GPU 有大量小型算术执行单元;NPU 内含并行计算单元,核数粒度不同;利用率取决于任务 |
| 精度 | 支持 FP64,传统超算(流体、电磁仿真)用它 | FP16 / INT8 即可 |
CPU 蹭 AI 的四条路:加核数、加指令集(AVX-512 一类,Intel 11 代做过但生态没跟上)、提频率、片内塞专用 NPU 单元(如 Intel Core Ultra)。GPU 的路是加专用计算单元(Tensor Core、矩阵核心)——都在从通用走向专用。
本章学习要点
- 框架的三层位置:上算法应用、中 AI 框架、下硬件算力;五项必有功能是数据处理、开发接口、可视化调试、编译、部署。
- 框架的全链路:前端接口 → 构图 → 图优化 → 编译 → 调度执行(内存/显存管理)→ 训练 → 部署;换框架能跑而原框架爆显存,差别在调度。
- 张量是框架唯一的基础数据结构:0 维标量、1 维向量、2 维矩阵、3 维图像、4 维加 batch。
- 张量五属性:shape、ndim、dtype、device、name;dtype 能否混用取决于算子,PyTorch 加减乘常自动提升、矩阵乘等常要求同类型;跨设备运算通常先迁移到同一设备,name 用于定位某层做微调。
- 图像维度顺序:PyTorch 常规
Conv2d用 NCHW、TensorFlow 默认 NHWC;喂错可能报通道数错误,尺寸偶合时也可能静默错义,需显式转换,不会自动混合 batch。 - TFRecord 用于改善磁盘与网络 IO(减少大量小文件操作);可不压缩,也支持 GZIP / ZLIB,体积取决于数据与设置。
- 模型文件格式:pth 可存参数或整模型、bin 用于大模型分片、ONNX 用于跨框架迁移。
- 计算图 = 张量 + 算子的有向无环图,价值在可编译优化、支撑自动微分、便于大模型切分并行。
- 静态图 vs 动态图:静态图效率高、易优化易部署但难调试;动态图灵活易调试但效率低;做法是开发用动态图、部署转静态图;动静统一只统一 API 与底层,语法难统一。
- PyTorch 建模方法:继承
nn.Module,写__init__+forward。 - 训练闭环:前向 → 算损失 → 清梯度 → 反向 → 更新;推理前
no_grad+eval。 - AI 应用开发六步 + 残差的价值:需求分析 → 环境 → 数据(占比最大)→ 建网 → 训练测试 → 部署推理;ResNet 用跳连加法解决退化,瓶颈模块 1×1 卷积升降维。
更多推荐



所有评论(0)