硬件条件:RDKS100

软件条件:ubuntu22.04系统及板子的基本配置、ollama

---

大模型分发与运行逻辑

1. 核心流程拆解:从乐谱到演奏

要把一个大模型(如 DeepSeek-R1)跑在你的 RDK S100 上,通常要经历以下四个关键节点:

① 下载模型权重(Raw Weights)
  • 现状:大模型最初是在超级计算机上用 BF16FP32(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 到底是干什么的?

Releases · ollama/ollama

Ollama 的设计哲学是:让普通用户像使用 Docker 一样使用 AI。

在 Ollama 出现之前,你想在 Linux 上跑模型,得自己编译 C++ 代码、自己下载权重、自己手动执行量化脚本,非常痛苦。

Ollama 帮你封装了这一切:

  1. 管理模型:你执行 ollama run deepseek-r1:1.5b 时,它自动去服务器下权重(而且是已经量化好的 GGUF)。

  2. 自动调度:它会自动探测你的硬件。如果有 NVIDIA 显卡就用显卡,没有就调用 ARM 核心的 NEON 加速指令集(S100 的 A78AE 核心支持这个)。

  3. 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. 你的标准操作流程

没错,你现在的“标准姿势”应该是这样的:

  1. 启动服务

    export OLLAMA_MODELS=/jinyl_dev/ollama_models && ollama serve &
    • 为什么要这一步? 服务端(Serve)是模型的“管家”,它负责管理内存、调度 CPU 算力以及监听 API 请求。

  2. 运行对话

    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 内部的物理路径如下:

  1. 外存 -> 内存:内核从 /jinyl_dev读取二进制 Blob 映射到虚拟内存空间。

  2. 内存 -> CPU 缓存:CPU A78AE 核心通过内存控制器(DDR4/LPDDR5)将模型权重拉入 L3 Cache。

  3. 计算流转

    • Prompt 阶段:CPU 预处理你的提问。

    • Inference 阶段:CPU 循环进行矩阵乘法(GEMM),生成预测 Token。

  4. 内存 -> 终端显示:生成的字符通过套接字(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)会进行以下动作:

  1. 销毁进程控制块(PCB):内核将该进程从调度序列中剔除。

  2. 释放页表:之前加载到内存里的 1.1GB 模型权重所占用的物理页框(Page Frames)被标记为“空闲”。

  3. 解除映射:如果模型是映射在 Swap 里的,相关的磁盘块索引也会被释放。

  4. 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 也会瞬间安静下来。

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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐