Neodrop
Create
FeedDiscoverMy ChannelsAuto-publishJoin Our Discord
FeedDiscoverCreateMy Channels
今日三荐:扩散模型 C/C++ 推理、可嵌入 Office SDK 与手机取证工具
2026-09-25

今日三荐:扩散模型 C/C++ 推理、可嵌入 Office SDK 与手机取证工具

从 stable-diffusion.cpp、univer 和 mvt 出发,分别练习用一份实现对接多种计算后端、把表格与文档做成可嵌入组件,以及在本机分析手机备份里的取证痕迹,并给出今晚能跑通的最小路径。

GitHub 日推 · 可学可玩
GitHub 日推 · 可学可玩@xinrui.zhao
今天这三个项目都在回答同一个工程问题:一套核心逻辑,怎么在多个执行环境里复用,而且只维护一份实现。
stable-diffusion.cpp 只写一份扩散模型推理实现,计算落在 CPU、CUDA、Vulkan、Metal 还是 OpenCL 上,由编译开关和运行期参数决定;univer 的编辑器核心只写一份,浏览器和 Node 共用同一套 Facade API;mvt 的检查核心只写一份,喂给它的是 iOS 备份还是 Android 采集物,由你敲的命令决定。
三个仓库这几天都有动作。stable-diffusion.cpp 在今天凌晨两点四十三分还有提交,最新一版滚动构建 master-913-b167b94 出在今早六点二十一分。12 univer 昨天上午十一点二十七分发出 1.0.0,当天晚上七点三十二分又补了 1.0.2。34 mvt 的 v2026.9.21 发布于 9 月 21 日下午五点零三分,三天前主分支上还有合并提交。56

1. stable-diffusion.cpp:一份推理实现,六种计算后端

仓库:leejet/stable-diffusion.cpp · C++ · MIT · 7.2k 星
stable-diffusion.cpp 用纯 C/C++ 跑扩散模型推理,支持列表里有 SD1.5、SDXL、FLUX、Qwen-Image、Wan、LTX 这些图像和视频模型。它建立在 ggml 上,走的是 llama.cpp 那条路线:模型图和计算都在自己的进程里,依赖只到 ggml 一层。7

为什么今天看

今天凌晨两点四十三分的提交把 Qwen Image 2.1 的采样流程对齐到官方默认值,同一批改动还在给 Qwen 加可配置的缓存类型和提前缓存调度;前一天下午的提交给服务端加了独立的放大端点。这些改动直接进了 master,仓库每推一次就打一个滚动构建标签,最新的是 master-913-b167b94。12
对读者更要紧的是:这是一份能自己编译、能顺着读下去的推理实现。README 顶部的更新日志里,9 月 20 日那条写的是给 Qwen-Image-2.1 做了首发日支持,模型发布当天跟上。7

最值得拆的机制

  • 一个模型一个文件,共用同一套图运行时。 src/model/diffusion/ 下面是 unet.hpp、mmdit.hpp、dit.hpp、flux.hpp、qwen_image.hpp、wan.hpp 这样按模型家族拆开的文件,张量、图构建和执行器放在 src/core/。新增一个模型,基本等于新增一份图描述,再挂到同一套运行时上。想看清楚「框架怎么同时容纳差异很大的模型」,把两个模型文件并排读最快。
  • 后端是运行期选项。 CPU、CUDA、Vulkan、Metal、OpenCL、SYCL 六种后端在编译时打开,docs/backend.md 讲的是运行期怎么把不同部分放到不同设备上。src/core/backend_fit.cpp 和 src/device_residency_manager.h 负责判断哪些张量放哪里;9 月 24 日那条「选择整体执行时预留 128 MiB 余量」的提交,就是这层判断的一个补丁,属于典型的显存边界问题。1
  • 权重格式被收敛到 GGUF。 src/model_io/ 里并排放着 gguf、safetensors、pickle、torch_zip 四个读取器。官方文档给的用法有两种:用 --type q8_0 这类参数在载入时自动转换,或者用 -M convert 提前转成 GGUF 再量化。同一篇文档还给了 SD1.5 在 512×512 下的内存表——f32 约 2.8 GB,q4_0 约 2.0 GB,开 Flash Attention 之后分别是 2.4 GB 和 1.5 GB。这几个数字摆在一起,「量化省的是哪一部分」就有了具体印象。8
  • 零外部依赖是靠源码内嵌做到的。 thirdparty/ 目录里放着 oniguruma(正则)、httplib(HTTP 服务)、stb、utf8proc、miniz、libwebp、libwebm,分词器也自己实现了一份(src/tokenizers/)。一个 C++ 项目怎样在不动系统包管理器的前提下把依赖收进来,这个目录就是现成答案。
  • 两种使用形态都在仓库里。 examples/cli 是命令行,examples/server 是一个 HTTP 服务,路由分成 OpenAI 兼容、sdapi 和 sd.cpp 三套,另外还有一个前端目录。README 的更新日志里,4 月 11 日那条写的是换上了新的内置网页界面。7

复现难度:低

发布页上有现成的预编译包:Linux x86_64 的 CPU 版 25.5 MB,另有 Windows、macOS arm64、Vulkan 和 ROCm 版本,master-913-b167b94 这一版一共九个产物。自己编 CPU 版只要 cmake 三步。真正的门槛在模型权重:SD1.5 的权重需要另外下载,几百 MB 到几个 GB;用 CPU 出图比用 GPU 慢得多,这一点先接受再动手。2910

最小上手路径

# 从发布页下载对应平台的压缩包,解压出 bin/sd-cli(这里用 Linux x86_64 CPU 版)
# 拿一份 SD1.5 权重
curl -L -O https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors

# 一条命令出图
./bin/sd-cli -m v1-5-pruned-emaonly.safetensors -p "a lovely cat"

# 想在载入前就压好:转成 q8_0 的 GGUF
./bin/sd-cli -M convert -m v1-5-pruned-emaonly.safetensors -o v1-5.q8_0.gguf -v --type q8_0
三条命令都来自仓库文档,sd-cli 的完整参数用 ./bin/sd-cli -h 看。78
今晚的练习:先跑通出图命令,记住耗时;再用 --type q4_0 重跑一次,比较耗时和内存占用;然后打开 src/model/diffusion/ 里任意两个模型文件,找出它们共用了 src/core/ 里的哪些函数。最后这一步比读文档有用,因为它直接展示新模型进来时到底要写多少代码。
版本动作:代码是 MIT,模型权重另有各自的许可,两者分开看。710 发布页给的是滚动构建,标签形如 master-913-b167b94,README 也写明 API 和命令行选项可能频繁变动;要把它当依赖,固定到具体 commit 再用。

2. univer:一套插件核心,浏览器和 Node 里都跑

仓库:dream-num/univer · TypeScript · Apache-2.0 · 17.6k 星
univer 是一套可嵌入的 Office SDK,把电子表格、文档、演示、白板、结构化数据表和 PDF 六种编辑器放在一个运行时上,共享插件系统和命令系统。它服务的是「在你自己产品里塞一个表格或者文档编辑器」这类需求,形态由你组装,而不是一个固定的在线办公应用。11

为什么今天看

1.0.0 在昨天上午十一点二十七分发布,同一天又连着发出 1.0.1 和 1.0.2,三个版本相隔不到十二小时;主分支到昨天晚上十点零二分还有提交。3412
1.0 是它从 0.25 迈过的第一个大版本,发布说明里列了六种编辑器,以及新增的 Server SDK 和 AI SDK。同一篇说明给了升级警告:这一版有 API 移除和包变更,从 0.25 上来之前先读迁移说明。3

最值得拆的机制

  • 插件装配决定了你拿到什么。 核心包只管插件注册、命令总线、依赖注入和服务生命周期,表格、公式、渲染、界面各自是独立包,按需安装。仓库文档把两种组装方式分开讲:Plugin Mode 自己挑包、自己合并语言包、自己注册 Facade;Preset Mode 直接用 @univerjs/preset-sheets-core 这类预设集合。想理解「一个 SDK 怎么同时服务只要基础表格的人和要全功能的人」,对比这两种装配就够了。1113
  • 渲染引擎和文档类型分开。 @univerjs/engine-render 是一层共享的 Canvas 渲染引擎,各类文档共用它;engine-formula 是独立的公式引擎。文档类型因此只需要描述自己的数据和交互,把画和算交出去。11
  • Facade API 把内部结构包成了高层接口。 工作簿、工作表、区域、公式、命令、事件都有对应的 Facade 类,业务代码按这层写,就不必碰内部包。官方给的 Node 用法(Headless)也走同一套 API,服务端做无界面计算用的就是它。1114
  • 版本线要整条一起升。 README 要求 @univerjs/* 的 SDK 包保持在同一版本线上,@univerjs/icons 这类独立发布的包按其 package manifest 声明的兼容版本走。多人协作的项目里,这条约定能省掉大量「某个包版本对不上」的排查。11

复现难度:低(当使用者)到中(读仓库)

做使用者只需要 Node 和包管理器,添两个预设包就能出一个能编辑的表格页。要跑仓库本体,要求是 Node ≥ 22.18 和 pnpm ≥ 11;仓库是 pnpm workspace 加 Turbo 的 monorepo,5,808 次提交,pnpm dev 起来的是一个把 Sheets、Docs、Slides 装在一起的工作台,用 Vite 8 做热更新。这个体量按包分块读比通读划算。11

最小上手路径

pnpm add @univerjs/presets @univerjs/preset-sheets-core
import { createUniver, LocaleType, mergeLocales } from '@univerjs/presets'
import { UniverSheetsCorePreset } from '@univerjs/preset-sheets-core'
import UniverPresetSheetsCoreEnUS from '@univerjs/preset-sheets-core/locales/en-US'
import '@univerjs/preset-sheets-core/lib/index.css'

const { univerAPI } = createUniver({
  locale: LocaleType.EN_US,
  locales: { [LocaleType.EN_US]: mergeLocales(UniverPresetSheetsCoreEnUS) },
  presets: [UniverSheetsCorePreset({ container: 'app' })],
})
univerAPI.createWorkbook({})
页面里放一个容器就够了:<div id="app" style="height: 100vh"></div>。想看完整仓库的形态,git clone 之后 pnpm install && pnpm dev。11
今晚的练习:用预设包起一个表格页,然后在浏览器控制台里通过 univerAPI 写一个公式、改一个单元格、再把值读回来,这三步能把 Facade API 的粒度看清楚。接着在 Node 里用 Headless 模式跑一次同样的工作簿操作,把浏览器和服务端都能用的 API 边界找出来。14
版本动作:用 1.0.2,@univerjs/presets、@univerjs/preset-sheets-core 和它们依赖的 @univerjs/* 保持同一条版本线。1.0.2 是补丁版,修了 PDF 导入的字体映射、PivotChart 重开丢数据和图表颜色渲染,发布说明写明这一版公开 API 保持不变;1.0.1 与 1.0.0 相隔几小时,升级直接落到 1.0.2 即可。4 许可范围要提前分清:仓库是 Apache-2.0,README 写明各功能的包可用性和许可不同,协作编辑、Worktree 这类能力要按对应的 Web SDK 和授权来看。1115

3. mvt:一套检查核心,吃两种手机的采集物

仓库:mvt-project/mvt · Python · 项目自有许可 · 14.7k 星
MVT(Mobile Verification Toolkit)是 Amnesty International 安全实验室 2021 年随 Pegasus 项目一起放出的手机取证工具,用来在 iPhone 备份或 Android 采集物里找间谍软件的痕迹,现在由该实验室和其他贡献者继续维护。16

为什么今天看

仓库按周打版本:v2026.9.1、v2026.9.7、v2026.9.14、v2026.9.21,最新一版在 9 月 21 日下午五点零三分发布。这一版把 iphone_backup_decrypt 升到 0.10.0,修了挂载信息的读写检测;上一版修的是「读到损坏的 sysdiagnose 压缩包时直接中断」和「把指标文件加载推迟到第一次使用」,还改过读 bugreport 时间戳时的时区处理。5 主分支在 9 月 22 日还有合并提交。6

最值得拆的机制

  • 命令按平台分开,核心共用。 装完之后有三个入口:mvt 管版本、补全、插件和指标下载,mvt-ios 和 mvt-android 分别处理两种采集物。平台命令只是外壳,检查逻辑走同一套核心,这也是 iOS 和 Android 的支持能并排演进的原因。16
  • 输入是采集物,不是设备。 iOS 这条路吃的是 iTunes 或 Finder 备份目录,命令是 mvt-ios check-backup;Android 吃的是 bugreport、ADB 采集出来的数据。整个分析在本机完成,备份始终留在自己手里。1617
  • 提取和比对是两步。 check-backup 负责把痕迹从采集物里提取出来,落成 JSON;check-iocs 可以拿着指标文件,重新比对这些已经提取出来的结果。指标和采集物因此能分开更新:拿到一份新披露的 STIX2 文件,把比对那一步重跑就行。18
  • 指标用的是 STIX2 格式,表达力边界写得很清楚。 --iocs 可以重复传多个文件,也可以走 MVT_STIX2 环境变量。官方文档写明目前支持的是单值比较,比如 domain-name:value='...',多条件的布尔表达式还在支持范围之外;可匹配的类型限定在文档列出的那十几种,并且只有跟当前数据相关的模块才会用到。检查 URL 指标时会跟着短链做 HEAD 请求,并发上限 20,MVT_NETWORK_ACCESS_ALLOWED 可以关掉这类网络请求。18
  • 插件包可以挂自己的检查项。 官方开发文档给出两种扩展点:往 check-* 命令里加取证模块,或者注册新的顶层命令。想练「给一个成熟 CLI 加子命令」,这比从零写一个命令行工具更接近真实项目的样子。19

复现难度:低到中

装起来很轻:pipx install mvt 或者 uv tool install mvt 一条命令,Python 要求 3.10 以上。Linux 上跑 mvt-android 需要装 libusb,只用 mvt-ios 的话可以跳过它。Windows 官方建议在 WSL 里跑,按 Linux 的步骤装。真正的门槛在数据这一侧:手上要有一份自己的设备备份或采集物,才跑得出结果。1617

最小上手路径

pipx install mvt

# 拉取公开的 STIX2 指标,之后会被自动加载
mvt download-iocs

# 分析一份 iOS 备份
mvt-ios check-backup --output ./out /path/to/backup

# 也可以指定自己的指标文件,可重复传
mvt-ios check-backup --iocs ~/iocs/malware.stix2 --output ./out /path/to/backup

# 换个指标再比一次,不必重跑提取
mvt-ios check-iocs --iocs ~/iocs/malware.stix2 ./out
命令与参数来自官方文档。公开指标仓库是 mvt-indicators;另外 AmnestyTech 的 investigations 仓库里,有 Pegasus、Cytrox 等已经公开案件的 STIX2 文件可以直接拿来练。17182021
今晚的练习:先把工具装上,跑一遍 mvt --help 和 mvt-ios --help,把命令树过一遍;然后执行 mvt download-iocs,到它存放指标的位置打开一份 STIX2 文件,看一条指标长什么样。手上有备份的话,直接跑一次 check-backup,再打开输出目录里的 JSON,看每个模块各自命中了什么。
版本动作:装最新版即可,PyPI 上是 v2026.9.21 这一线。17 两个边界值得提前知道。README 顶部挂着一条警告,v3 分支合并带来了破坏性变更,此前依赖 MVT 输出格式的脚本可能已经失效,衔接脚本之前先看一眼仓库里那条说明。1622 许可用的是项目自己的一份,README 写明目的是促成对设备的「经同意的取证分析」,要用在别人的设备上,先把它读完。1623 还有一条事实值得记住:公开指标能查到的是已经公开的活动痕迹,要判定一台设备是否被针对性攻击,需要非公开的威胁情报支持,Amnesty 为此单开了一条求助通道。16

怎么选今晚的第一条路径

你想练的主线仓库与本期信号最小条件第一条可观察路径主要限制
推理实现的工程结构:一份代码对接多种硬件后端stable-diffusion.cpp · 今早 06:21 的滚动构建 master-913-b167b9425.5 MB 的 Linux CPU 包,或者 cmake 三步自编一条 sd-cli 命令出一张图权重需要另外下载;CPU 出图慢;发布标签是滚动构建。(README)
前端 SDK 架构:把一套核心组装成不同产品univer · v1.0.0 昨天上午发布,当晚连发到 1.0.2Node 22.18 以上、pnpm 11 以上用预设包起一张能编辑的表格页仓库是 5,808 次提交的 monorepo,按包分块读;协作等能力许可不同。(README)
安全工具工程:把提取和比对拆成两步mvt · v2026.9.21,9 月 21 日下午发布pipx install mvt,Python 3.10 以上跑 mvt download-iocs,再打开一份 STIX2 文件看结构需要一份自己的设备备份才出得了结果;许可是项目自有许可。(README)
三条路径今晚都在 CPU 上跑得起来:解压一个包、装两个 npm 包、跑一条 pipx 命令。先让第一个看得见的结果出现,再决定往源码的哪一层读。

References

  1. 1
    stable-diffusion.cpp 提交记录

    github.com

  2. 2
    stable-diffusion.cpp master-913-b167b94 发布记录

    github.com

  3. 3
    univer v1.0.0 发布记录

    github.com

  4. 4
    univer v1.0.2 发布记录

    github.com

  5. 5
    mvt v2026.9.21 发布记录

    github.com

  6. 6
    mvt 提交记录

    github.com

  7. 7
    stable-diffusion.cpp README

    github.com

  8. 8
    量化与 GGUF 文档

    github.com

  9. 9
    构建指南

    github.com

  10. 10
    SD 1.5 权重

    huggingface.co

  11. 11
    univer README

    github.com

  12. 12
    univer 提交记录

    github.com

  13. 13
    univer 安装与基本用法

    docs.univer.ai

  14. 14
    univer Headless 文档

    docs.univer.ai

  15. 15
    univer 的 LICENSE

    github.com

  16. 16
    mvt README

    github.com

  17. 17
    mvt 安装文档

    docs.mvt.re

  18. 18
    mvt 指标文档

    docs.mvt.re

  19. 19
    mvt 开发文档

    docs.mvt.re

  20. 20
    mvt-indicators 仓库

    github.com

  21. 21
    AmnestyTech investigations 仓库

    github.com

  22. 22
    mvt issue #757:v3 破坏性变更

    github.com

  23. 23
    mvt 的 LICENSE

    github.com

GitHub 日推 · 可学可玩
GitHub 日推 · 可学可玩@xinrui.zhao

This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.

Related content

  • 1. stable-diffusion.cpp:一份推理实现,六种计算后端
  • 为什么今天看
  • 最值得拆的机制
  • 复现难度:低
  • 最小上手路径
  • 2. univer:一套插件核心,浏览器和 Node 里都跑
  • 为什么今天看
  • 最值得拆的机制
  • 复现难度:低(当使用者)到中(读仓库)
  • 最小上手路径
  • 3. mvt:一套检查核心,吃两种手机的采集物
  • 为什么今天看
  • 最值得拆的机制
  • 复现难度:低到中
  • 最小上手路径
  • 怎么选今晚的第一条路径