大模型实战(一):本地部署大模型
本文详细介绍了在RDKS100开发板上部署大语言模型的完整流程和技术原理。主要内容包括:1)模型部署的四个关键步骤:下载原始权重、格式转换、量化压缩和推理引擎运行;2)Ollama工具的作用及运行机制,包括其客户端/服务器架构设计;3)RDKS100硬件特性,对比CPU和BPU的运行差异;4)具体操作流程和系统资源管理方法,包括启动、运行和终止模型服务的详细指令。文章特别强调了量化技术的重要性,以
硬件条件:RDKS100
软件条件:ubuntu22.04系统及板子的基本配置、ollama
---
大模型分发与运行逻辑
1. 核心流程拆解:从乐谱到演奏
要把一个大模型(如 DeepSeek-R1)跑在你的 RDK S100 上,通常要经历以下四个关键节点:
① 下载模型权重(Raw Weights)
-
现状:大模型最初是在超级计算机上用
BF16或FP32(32位浮点数)训练出来的。 -
形态:通常是一堆
.safetensors格式的文件,体积巨大(比如 7B 模型原始权重约 14GB-15GB)。 -
隐喻:这相当于一份极其精细、每个音符都写得清清楚楚的原始乐谱。
② 转换格式(Format Conversion)
-
为什么转:原始格式是为 PyTorch 开发环境设计的,不适合边缘侧(ARM/手机/机器人)的高效读取。
-
目标:转换为 GGUF 格式。这是目前大模型社区最流行的二进制格式,它把模型权重和元数据(如分词器配置)打包在一起,且支持内存映射(mmap),让模型加载速度极快。
-
隐喻:把纸质乐谱扫描成电子版,并打好了书签。
③ 量化(Quantization)—— 核心步骤
-
原理:这是你提到的“量化”。它把原本 16 位的浮点数($1.234567...$)压缩成 4 位或 8 位的整数($1$ 或 $2$)。
-
目的:
-
省内存:7B 模型量化到
4-bit后,体积从 14GB 缩减到约 4.5GB,S100 的内存才能吃得下。 -
提速:CPU 处理整数(int)的速度远快于浮点数(float)。
-
-
代价:智力会有轻微损失,但 4-bit 量化通常能保留 95% 以上的能力。
-
隐喻:为了省纸,把乐谱上的音符四舍五入,虽然声音没那么圆润了,但旋律还在。
④ 推理引擎(Inference Engine)
-
角色:这就是 Ollama、llama.cpp 或地平线的
hobot_llm所处的位置。 -
任务:它负责把量化后的权重载入内存,接收你的输入(Tokenize),在 CPU/BPU 上进行矩阵乘法运算,最后生成回复。
2. Ollama 到底是干什么的?
Ollama 的设计哲学是:让普通用户像使用 Docker 一样使用 AI。
在 Ollama 出现之前,你想在 Linux 上跑模型,得自己编译 C++ 代码、自己下载权重、自己手动执行量化脚本,非常痛苦。
Ollama 帮你封装了这一切:
-
管理模型:你执行
ollama run deepseek-r1:1.5b时,它自动去服务器下权重(而且是已经量化好的 GGUF)。 -
自动调度:它会自动探测你的硬件。如果有 NVIDIA 显卡就用显卡,没有就调用 ARM 核心的 NEON 加速指令集(S100 的 A78AE 核心支持这个)。
-
API 服务:它在后台运行一个服务器(Port 11434),你可以用 Python、网页插件甚至你的机器人代码去调用它。
3. S100 的特殊性:CPU vs BPU
-
你现在做的:是在用 CPU 跑。Ollama 会吃满你 S100 的 6 个核心。
-
地平线 AI 工具链(OpenExplorer)做的:是把模型转换成
.bin跑在 BPU 上。BPU 是专为矩阵乘法设计的“硬核乐器”,效率会高出数倍。 -
现状:由于 DeepSeek 这种大语言模型太新,官方针对 BPU 的深度优化(如 KV Cache 优化)还在迭代,所以先用 Ollama 把 CPU 跑通是最高效的入门方式。
当你稍后运行模型时,你可以输入 htop,你会看到 6 个 CPU 核心全部处于 100% 负载,这就是 CPU 在拼命进行向量化计算。
启动ollama 运行本地部署的大模型
1. 你的标准操作流程
没错,你现在的“标准姿势”应该是这样的:
-
启动服务:
export OLLAMA_MODELS=/jinyl_dev/ollama_models && ollama serve &-
为什么要这一步? 服务端(Serve)是模型的“管家”,它负责管理内存、调度 CPU 算力以及监听 API 请求。
-
-
运行对话:
ollama run deepseek-r1:1.5b-
为什么要这一步? 客户端(Run)是你的“交互窗口”,它把你的文字发给管家,再把管家的思考结果展示给你。
-
2. run 的时候发生了什么?(数据去向)
当你第一次输入 run 时,Ollama 确实在后台进行了大规模的搬运:
-
下载路径:正是下载到了你设置的环境变量路径
/jinyl_dev/ollama_models下。 -
文件结构:如果你现在执行
ls /jinyl_dev/ollama_models,你会发现里面有blobs(模型权重二进制文件)和manifests(描述文件)。 -
专属文件夹:没错,它完全避开了空间窄小的根目录
/root,住进了你划定的“大房子”里。
3.原理刨析
1. 设计哲学:为什么非要先启动服务?
Ollama 采用了 C/S(客户端/服务器)架构。
-
服务端(Server):它是真正的“大脑”。它把 1.1GB 的模型加载到物理内存或 Swap 中。它通常常驻后台,因为它加载一次模型非常沉重,不希望你每问一句话就重启一次。
-
客户端(Client):就是那个
ollama run。它非常轻量,只负责把你的输入传给服务器。
2. 源码逻辑:下载与解压
原理补丁:当你 run 一个不存在的模型时,它会自动触发 pull 操作。它将模型切成多个 Block 并行下载,并存放在 blobs 文件夹里,以文件的 SHA256 哈希值 命名。这样做是为了实现“层复用”(Layer Reuse)——如果你以后下载另一个基于 Qwen 的模型,相同的部分就不用重下了。
3. 当你执行 run 之后,数据在 RDK S100 内部的物理路径如下:
-
外存 -> 内存:内核从
/jinyl_dev读取二进制 Blob 映射到虚拟内存空间。 -
内存 -> CPU 缓存:CPU A78AE 核心通过内存控制器(DDR4/LPDDR5)将模型权重拉入 L3 Cache。
-
计算流转:
-
Prompt 阶段:CPU 预处理你的提问。
-
Inference 阶段:CPU 循环进行矩阵乘法(GEMM),生成预测 Token。
-
-
内存 -> 终端显示:生成的字符通过套接字(Unix Socket)传回给你的交互界面。
终止ollama运行
1. 怎么退出对话(Client 层面)
当你正在 >>> 界面和 DeepSeek 聊天,想回到 Linux 的 Bash 提示符时:
-
快捷键(最快):直接按
Ctrl + D。 -
指令:输入
/exit然后回车。 -
结果:这只是关掉了“聊天窗口”,你的
ollama serve(后台大脑)依然在运行,模型依然占着内存。
2. 怎么杀死进程(Server 层面)
如果你发现 htop 里 CPU 还是很高,或者想彻底把内存腾出来(比如要去写 C++ 代码或编译项目),必须干掉后台服务:
第一步:常规查杀(温柔版)
# 指令:停止所有名为 ollama 的进程
# 目的:通知后台服务安全关闭
sudo pkill ollama
第二步:暴力查杀(强制版)
如果执行完上面那条,htop 里的 CPU 还没降下来(说明进程卡死了),直接上“大杀器”:
# 指令:发送 SIGKILL 信号(信号 9)
# 为什么这么做:不经过进程同意,由内核直接强制回收资源
sudo pkill -9 ollama
第三步:清理残留(选做)
有时候 Ollama 会拉起一个叫做 runner 的子进程,如果它还在:
# 目的:确保没有任何推理后端还在偷偷吃 CPU
sudo pkill -9 runner
3.原理刨析
1. 为什么 exit 之后 CPU 还不掉?
-
设计哲学:Ollama 采用了 “预热机制”。它认为你关掉聊天窗可能只是暂时的,所以它会默认让模型在内存里多呆 5分钟(Keep-alive),方便你下次“秒开”。
-
源码逻辑:
ollama run只是一个前端(Client),它通过 API 和ollama serve(Server)通信。你关掉前端,后端依然在等待下一个请求。
2. 信号量的区别(SIGTERM vs SIGKILL)
-
pkill(SIGTERM):像是在宿舍门口喊“要关灯了,请大家保存好游戏退出”。 -
pkill -9(SIGKILL):像是直接拉掉了整栋楼的电闸。在 S100 内存溢出或 I/O 卡死时,必须用“拉电闸”的方式。
3. 当你执行 sudo pkill -9 ollama 后,内核(Kernel)会进行以下动作:
-
销毁进程控制块(PCB):内核将该进程从调度序列中剔除。
-
释放页表:之前加载到内存里的 1.1GB 模型权重所占用的物理页框(Page Frames)被标记为“空闲”。
-
解除映射:如果模型是映射在 Swap 里的,相关的磁盘块索引也会被释放。
-
CPU 回归:A78AE 的 6 个核心失去计算任务,进入 C-state(低功耗状态),主频下降,开始降温。
你可以把下面这两行代码存成一个叫 stop_ai.sh 的脚本,以后直接运行它,一秒清场:
# 复制以下内容保存为脚本
sudo pkill -9 ollama
sudo pkill -9 runner
sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
做完这些,你的 htop 应该会彻底变绿(低占用),S100 也会瞬间安静下来。

如果本文对你在本地部署大模型有一点帮助 那就是我最大的心愿 下篇再见
更多推荐

所有评论(0)