<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>RTX 4090 on 鬼哥的空间</title><link>https://guige.ai/tags/rtx-4090/</link><description>Recent content in RTX 4090 on 鬼哥的空间</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Mon, 05 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://guige.ai/tags/rtx-4090/index.xml" rel="self" type="application/rss+xml"/><item><title>Qwen Image 40 步对上 Viggle Turbo 6 步：4090 上的四组实测</title><link>https://guige.ai/p/qwen-image-turbo/</link><pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate><guid>https://guige.ai/p/qwen-image-turbo/</guid><description>&lt;img src="https://guige.ai/" alt="Featured image of post Qwen Image 40 步对上 Viggle Turbo 6 步：4090 上的四组实测" /&gt;&lt;p&gt;最近鬼哥在折腾一件挺有意思的事：以自己的 4090 机器为算力核心，在本地搭起一整套做口播视频的工作流和基础服务。语音生成、字幕处理、图像生成、人物口播视频，逐步接进同一个工作台，从一段文案和一张人物图，走到带声音、带字幕的视频。&lt;/p&gt;
&lt;p&gt;先放一段已经做出来的成品：Diana 介绍 DI CLI 的口播。下面是带字幕的版本，约 12 秒，视频由 4090 上的 H3 生成。&lt;/p&gt;
&lt;video controls playsinline preload="none" poster="diana-poster.webp" style="width:100%;max-width:512px;height:auto;border-radius:12px;"&gt;
 &lt;source src="diana-talk.mp4" type="video/mp4"&gt;
 你的浏览器不支持内嵌视频，可以&lt;a href="diana-talk.mp4"&gt;下载 Diana 口播视频&lt;/a&gt;观看。
&lt;/video&gt;
&lt;p&gt;&lt;a class="link" href="diana-talk.mp4" &gt;下载 Diana 口播视频&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我想给后面自己做视频剧先铺好路。人物形象、配音、场景和口播都能在本地反复试，就不用每生成一版都去买云端额度了。机器已经在手，日常试错主要花的是电费和等待时间，改台词、换造型时也能更放得开。&lt;/p&gt;
&lt;p&gt;当然，一段口播离一部视频剧还有距离，角色一致性、镜头衔接、表演和剪辑都要继续磨。这套基础服务先把素材生成串起来，后面才有条件一集一集往下做。&lt;/p&gt;
&lt;p&gt;这篇先聊其中的&lt;strong&gt;生图部分&lt;/strong&gt;。语音、字幕和视频的部署细节留待后面展开；眼下要解决的问题是：给人物换造型、做场景素材时，能不能更快拿到一张可用的图？&lt;/p&gt;
&lt;h2 id="从一张咖啡海报开始"&gt;从一张咖啡海报开始
&lt;/h2&gt;&lt;p&gt;一张咖啡海报，左边画了四十步，右边只画了六步。把两张图并排放好，最先吸引我注意的，是它们都把“秋日限定 · 桂花拿铁”写对了。&lt;/p&gt;
&lt;p&gt;左边的工作流用了 38.4 秒，右边用了 10.2 秒。杯子、拉花和叶片有变化，但如果只是想给一杯秋日咖啡做张海报，右边已经很有说服力。&lt;/p&gt;
&lt;p&gt;&lt;img alt="中文咖啡海报对比，左为 Qwen Image 基础版 40 步，右为 Viggle Turbo 6 步" class="gallery-image" data-flex-basis="409px" data-flex-grow="170" height="900" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/qwen-image-turbo/poster-comparison.webp" srcset="https://guige.ai/p/qwen-image-turbo/poster-comparison_hu_31fea73db0c26bf1.webp 800w, https://guige.ai/p/qwen-image-turbo/poster-comparison.webp 1536w" width="1536"&gt;&lt;/p&gt;
&lt;p&gt;这组结果让我想继续看下去：&lt;strong&gt;生成快了将近四倍，省下的那些步骤，到底从画面哪里拿走了东西？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我把 Qwen-Image-2.1 和 Viggle 的 Turbo 方案放到自己的 4090 机器上，跑了人像、中文海报、换背景、换衣服四组对比。一共八张图，先看实际效果，再决定值不值得接进本地工作台。&lt;/p&gt;
&lt;h2 id="先认清这两位选手"&gt;先认清这两位选手
&lt;/h2&gt;&lt;p&gt;说是“两种模型”，它们其实有很近的亲缘关系。&lt;/p&gt;
&lt;p&gt;基础版用的是 &lt;strong&gt;Qwen-Image-2.1 的 INT8 权重&lt;/strong&gt;，这次跑 40 步。Turbo 则在同一个基础模型上，加载 &lt;strong&gt;Viggle v0.3 的六步蒸馏 LoRA，rank 128&lt;/strong&gt;，配合专用采样时间点运行。&lt;/p&gt;
&lt;p&gt;可以把每一步理解成模型对画面的一次修正。蒸馏让模型学习用更少的修正走到一个可用结果。因此，要得到这次的六步效果，需要 Turbo 的适配权重和采样配置一起配合。直接把基础版的步数框改成 6，并不等于完成了这套配置。&lt;a class="link" href="https://huggingface.co/Viggle/Qwen-Image-2.1-viggle-turbo" target="_blank" rel="noopener"
 &gt;Viggle 模型说明&lt;/a&gt;给出了具体用法。&lt;/p&gt;
&lt;p&gt;这轮两边都用相同提示词、seed 42、1024 × 1024 输出、CFG 1，并且关闭提示词增强。文生图用同样的文字，编辑任务用同一张参考图。每个场景各跑一次，所以这是一轮样片观察，还不足以给模型的整体能力排座次。&lt;/p&gt;
&lt;h2 id="干活的还是那台-4090"&gt;干活的还是那台 4090
&lt;/h2&gt;&lt;p&gt;&lt;img alt="鬼哥此前拍摄的 4090 主机内部照片，复用于本次实测文章" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="1200" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/qwen-image-turbo/cover.webp" srcset="https://guige.ai/p/qwen-image-turbo/cover_hu_edb61d0e495f5eb9.webp 800w, https://guige.ai/p/qwen-image-turbo/cover.webp 1600w" width="1600"&gt;&lt;/p&gt;
&lt;p&gt;这张照片之前放在&lt;a class="link" href="https://guige.ai/p/desktop-ai-studio/" &gt;《桌面 AI Studio》&lt;/a&gt;里。机器继续负责重推理，Mac 负责开发和整理结果。这次图像生成也交给它。&lt;/p&gt;
&lt;p&gt;先把最容易误会的规格写在前面：&lt;strong&gt;这张卡在系统里显示 49140 MiB 显存，约 48GB。&lt;/strong&gt; 读者如果拿普通 24GB 4090 对照，显存余量得另外算。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;硬件&lt;/th&gt;
 &lt;th&gt;本次机器&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;CPU&lt;/td&gt;
 &lt;td&gt;Intel Core i5-13600K，14 核、20 线程&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;系统内存&lt;/td&gt;
 &lt;td&gt;64GB，Linux 显示约 62 GiB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;GPU&lt;/td&gt;
 &lt;td&gt;NVIDIA GeForce RTX 4090&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;显存&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;nvidia-smi&lt;/code&gt; 显示 49140 MiB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;软件环境也列出来，方便以后对照：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;软件 / 模型组件&lt;/th&gt;
 &lt;th&gt;本次配置&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;操作系统&lt;/td&gt;
 &lt;td&gt;Ubuntu 24.04.3 LTS，x86_64&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;NVIDIA 驱动&lt;/td&gt;
 &lt;td&gt;570.158.01&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Python&lt;/td&gt;
 &lt;td&gt;3.12，独立虚拟环境&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PyTorch&lt;/td&gt;
 &lt;td&gt;2.11.0+cu128，CUDA 12.8 运行时&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ComfyUI&lt;/td&gt;
 &lt;td&gt;0.38.0，固定提交 &lt;code&gt;6b747c0428c34&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;主模型&lt;/td&gt;
 &lt;td&gt;Qwen-Image-2.1，INT8 convrot&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;文本编码器&lt;/td&gt;
 &lt;td&gt;Qwen3-VL 8B，INT8 convrot&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;VAE&lt;/td&gt;
 &lt;td&gt;Qwen-Image-2.1，BF16&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Turbo 适配器&lt;/td&gt;
 &lt;td&gt;Viggle v0.3，6-step LoRA，rank 128&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;注意力实现&lt;/td&gt;
 &lt;td&gt;PyTorch SDPA；关闭可选的 kitchen INT8 attention&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;主模型、文本编码器、VAE 和 LoRA 的权重文件合计约 18GB。这里的 INT8 指权重存储配置，不代表整个计算过程全部使用 INT8。&lt;/p&gt;
&lt;p&gt;图像环境有独立的 Python 虚拟环境和 ComfyUI 副本，与现有 H3 视频服务共用 GPU 排队锁。一次图像任务结束，运行时退出并释放显存。八张图跑完后，显存占用回到了 15 MiB，H3 的健康检查也正常。&lt;/p&gt;
&lt;p&gt;这个安排很适合我现在的用法：同一张卡轮流承担图像和视频任务，避免两个大任务一起上来争显存。&lt;/p&gt;
&lt;h2 id="人像第一处差别在脸上"&gt;人像：第一处差别在脸上
&lt;/h2&gt;&lt;p&gt;第一组提示词要的是成年东亚女性、黑色齐肩发、米色亚麻外套、左侧柔和窗光，以及自然的皮肤纹理。&lt;/p&gt;
&lt;p&gt;&lt;img alt="人像对比：左侧基础版 40 步，右侧 Turbo 6 步" class="gallery-image" data-flex-basis="409px" data-flex-grow="170" height="900" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/qwen-image-turbo/portrait-comparison.webp" srcset="https://guige.ai/p/qwen-image-turbo/portrait-comparison_hu_95d7159075b23ad8.webp 800w, https://guige.ai/p/qwen-image-turbo/portrait-comparison.webp 1536w" width="1536"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="portrait-base40.webp" &gt;基础版原尺寸图&lt;/a&gt; · &lt;a class="link" href="portrait-turbo6.webp" &gt;Turbo 原尺寸图&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;两张图的构图、衣服和光线都很接近。缩小看，六步版没有出现明显的结构崩坏，也没有突然换一种摄影风格。&lt;/p&gt;
&lt;p&gt;放大脸部，差别就有了：基础版的眼周、面颊纹理更明显，Turbo 的皮肤更平滑，五官的局部形态也有细微变化。&lt;/p&gt;
&lt;p&gt;如果用来试头像方向或看服装配色，我会愿意先用 Turbo。如果想要更有年龄感、更强调皮肤质地的人像，基础版这张更接近提示词里“自然纹理”的要求。这里的平滑是否算损失，取决于你想要什么样的照片。&lt;/p&gt;
&lt;p&gt;这一组很能说明问题：六步没有把画面压缩成半成品，但它改变了细节的表达。&lt;/p&gt;
&lt;h2 id="中文海报这次六步没有把字写坏"&gt;中文海报：这次六步没有把字写坏
&lt;/h2&gt;&lt;p&gt;开头那张海报指定了四行文字：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;慢下来，喝杯咖啡&lt;br&gt;
秋日限定 · 桂花拿铁&lt;br&gt;
每日现磨，新鲜烘焙&lt;br&gt;
营业时间 09:00—21:00&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;a class="link" href="poster-base40.webp" &gt;基础版原尺寸图&lt;/a&gt; · &lt;a class="link" href="poster-turbo6.webp" &gt;Turbo 原尺寸图&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;两边都把这四行文字画得正确、可读。版式也接近：大标题、品名、咖啡主体、小字说明，各自待在该待的位置。&lt;/p&gt;
&lt;p&gt;这比“画了一杯好看的咖啡”更让我在意。做中文配图，经常卡在最后几个字上：主体都很漂亮了，标题偏偏多一笔少一画，还得再抽一张。这一组里，六步版保住了文字，省下的等待才真正有用。&lt;/p&gt;
&lt;p&gt;当然，四行短句还难不倒所有模型的边界。长段落、密集小字、复杂表格，这次都没跑，不能从一张咖啡海报推导出“中文随便写”。&lt;/p&gt;
&lt;p&gt;至于杯形、拉花和叶片的差别，两边各有自己的画法，我没有看到足以让我为了这张海报坚持等待四十步的优势。&lt;/p&gt;
&lt;h2 id="换背景花园来了人也被轻轻改了一下"&gt;换背景：花园来了，人也被轻轻改了一下
&lt;/h2&gt;&lt;p&gt;后两组用的是现有工作台里的 girl-avatar。先放参考图，方便看清到底保留了什么。&lt;/p&gt;
&lt;p&gt;&lt;img alt="人物编辑使用的 girl-avatar 参考图" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="1024" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/qwen-image-turbo/girl-avatar.webp" srcset="https://guige.ai/p/qwen-image-turbo/girl-avatar_hu_4ea1cb82d792c1b2.webp 800w, https://guige.ai/p/qwen-image-turbo/girl-avatar.webp 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;第一项要求是把背景换成有阳光、虚化的花园，同时保留人物。&lt;/p&gt;
&lt;p&gt;&lt;img alt="换背景对比：左侧基础版 40 步，右侧 Turbo 6 步" class="gallery-image" data-flex-basis="409px" data-flex-grow="170" height="900" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/qwen-image-turbo/background-comparison.webp" srcset="https://guige.ai/p/qwen-image-turbo/background-comparison_hu_8fd5225ab9e8daaf.webp 800w, https://guige.ai/p/qwen-image-turbo/background-comparison.webp 1536w" width="1536"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="background-base40.webp" &gt;基础版原尺寸图&lt;/a&gt; · &lt;a class="link" href="background-turbo6.webp" &gt;Turbo 原尺寸图&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;两边都完成了花园背景。发夹、心形耳饰、白领灰衣这些显眼特征也都留住了，乍看很适合继续拿去做人物素材。&lt;/p&gt;
&lt;p&gt;但对着参考图看，会发现两版都稍微放宽了取景范围，展示出更多衣服和躯干，皮肤和发丝也有局部重绘。Turbo 的对比感更强一些，细节更平滑。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“人物看起来还是她”和“人物像素完全不动”，是两种不同的要求。&lt;/strong&gt; 这一组满足了前者，没有做到后者。需要严格保留原片时，仍然要考虑蒙版、抠图和合成流程，不能把一句“只换背景”当成锁定按钮。&lt;/p&gt;
&lt;p&gt;值得注意的是，基础版四十步也有这个问题。等得久一点，并没有自动换来像素级的编辑边界。&lt;/p&gt;
&lt;h2 id="换衣服六步已经能拿来试造型"&gt;换衣服：六步已经能拿来试造型
&lt;/h2&gt;&lt;p&gt;最后一组，把原来的服装改成藏蓝色西装，里面穿白色圆领上衣。&lt;/p&gt;
&lt;p&gt;&lt;img alt="换服装对比：左侧基础版 40 步，右侧 Turbo 6 步" class="gallery-image" data-flex-basis="409px" data-flex-grow="170" height="900" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/qwen-image-turbo/outfit-comparison.webp" srcset="https://guige.ai/p/qwen-image-turbo/outfit-comparison_hu_2b295dd9c513780e.webp 800w, https://guige.ai/p/qwen-image-turbo/outfit-comparison.webp 1536w" width="1536"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="outfit-base40.webp" &gt;基础版原尺寸图&lt;/a&gt; · &lt;a class="link" href="outfit-turbo6.webp" &gt;Turbo 原尺寸图&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;两边都完成了换装，脸、表情、发型和饰品整体接近参考图。西装的领口、面料和局部阴影各有差别，皮肤与发丝同样存在重绘。&lt;/p&gt;
&lt;p&gt;如果我要为工作台的人物试几个造型，这个结果已经足够让我继续往下做。先看看藏蓝西装是否合适，再决定换成衬衫还是针织衫，十几秒拿到一张图，会更愿意多试几次。&lt;/p&gt;
&lt;p&gt;不过，“更愿意多试”是我的使用判断。这里没有做多 seed 的稳定性统计，也没有测试连续编辑几轮后人物会漂移多少。&lt;/p&gt;
&lt;h2 id="到底省了多少时间"&gt;到底省了多少时间？
&lt;/h2&gt;&lt;p&gt;四组任务的数据放在一起：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;场景&lt;/th&gt;
 &lt;th style="text-align: right"&gt;基础版 40 步&lt;/th&gt;
 &lt;th style="text-align: right"&gt;Turbo 6 步&lt;/th&gt;
 &lt;th style="text-align: right"&gt;工作流加速比&lt;/th&gt;
 &lt;th style="text-align: right"&gt;显存峰值：基础 / Turbo&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;人像生成&lt;/td&gt;
 &lt;td style="text-align: right"&gt;38.44 秒&lt;/td&gt;
 &lt;td style="text-align: right"&gt;10.15 秒&lt;/td&gt;
 &lt;td style="text-align: right"&gt;3.79×&lt;/td&gt;
 &lt;td style="text-align: right"&gt;15.99 / 16.58 GiB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;中文海报&lt;/td&gt;
 &lt;td style="text-align: right"&gt;38.43 秒&lt;/td&gt;
 &lt;td style="text-align: right"&gt;10.15 秒&lt;/td&gt;
 &lt;td style="text-align: right"&gt;3.78×&lt;/td&gt;
 &lt;td style="text-align: right"&gt;15.99 / 16.58 GiB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;人物换背景&lt;/td&gt;
 &lt;td style="text-align: right"&gt;42.50 秒&lt;/td&gt;
 &lt;td style="text-align: right"&gt;12.19 秒&lt;/td&gt;
 &lt;td style="text-align: right"&gt;3.49×&lt;/td&gt;
 &lt;td style="text-align: right"&gt;20.74 / 21.21 GiB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;人物换服装&lt;/td&gt;
 &lt;td style="text-align: right"&gt;42.52 秒&lt;/td&gt;
 &lt;td style="text-align: right"&gt;12.18 秒&lt;/td&gt;
 &lt;td style="text-align: right"&gt;3.49×&lt;/td&gt;
 &lt;td style="text-align: right"&gt;20.71 / 21.24 GiB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这里的时间包含模型加载、文本编码、采样和 VAE 解码，是完整工作流耗时。加上独立运行时启动，基础版每张约 &lt;strong&gt;43～48 秒&lt;/strong&gt;，Turbo 约 &lt;strong&gt;15～17 秒&lt;/strong&gt;。如果以后改成长驻服务、复用已加载模型，还需要重新测量，不能直接拿这张表当服务延迟。&lt;/p&gt;
&lt;p&gt;四十步变成六步，步数少了约 6.7 倍，整个流程只加速约 3.5～3.8 倍，也很好理解：读模型、理解提示词、解码图片这些工作仍然要做，少采样并不会把它们一起省掉。&lt;/p&gt;
&lt;p&gt;另一个容易忽略的地方是显存。Turbo 在这四组里反而略高一点，最高约 21.24 GiB。它加快了生成，但没有在本轮测量中带来显存节省。&lt;/p&gt;
&lt;p&gt;这个峰值看起来落在 24GB 以内，我也不会据此承诺普通 24GB 4090 能照搬配置稳定运行。这里用的是 48GB 卡，而且显存数据是每两秒采集一次的全卡占用，可能漏掉短暂尖峰。&lt;/p&gt;
&lt;h2 id="我会怎么把它放进工作台"&gt;我会怎么把它放进工作台
&lt;/h2&gt;&lt;p&gt;看完这四组图，我倾向于把 &lt;strong&gt;Turbo 六步做成快速模式，基础版四十步保留作对照选项&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;人像试方向、海报试布局、人物试服装，先用六步出结果。碰到皮肤质地、细小文字或复杂编辑这些值得较真的地方，再拿基础版比较。两种配置生成的细节会不同，基础版也需要逐张判断。&lt;/p&gt;
&lt;p&gt;目前做到的是独立命令行评估，图像 API 和 WebUI 还没有接入。这次部署复用了机器上已有的 H3 源码与 CUDA 依赖，并没有完成一台全新 Ubuntu 从 checkout 开始的一键安装验收。&lt;/p&gt;
&lt;p&gt;下一轮真正值得加的，是更多随机种子、密集中文、多参考图和更高分辨率。它们会决定六步版能走多远。这四组样片已经回答了一个更小、也更实际的问题：它值得继续接进来试用。&lt;/p&gt;
&lt;p&gt;回到开头那杯咖啡。如果六步已经把布局、杯子和四行字交代清楚了，我更愿意把省下的时间用来改一句标题、换一种配色。那句“慢下来，喝杯咖啡”，倒是不必让显卡也照着执行。&lt;/p&gt;
&lt;h2 id="本轮参数备忘"&gt;本轮参数备忘
&lt;/h2&gt;&lt;p&gt;实测日期为 2026 年 10 月 5 日。基础版使用 Euler / simple、40 步；Turbo 使用独立、未合并的 LoRA，强度 1.0，以及作者提供的六步 sigma 配置。两边均使用 INT8 主模型与文本编码器、BF16 VAE、CFG 1，关闭提示词增强。&lt;/p&gt;
&lt;p&gt;每张图启动新进程，但没有清空操作系统文件缓存；每个场景每种配置只有一次记录，表中没有多次平均。这套 ComfyUI 配置也不等同于逐项复刻作者的 Diffusers 基准。&lt;/p&gt;
&lt;p&gt;正文并排图用于快速浏览，图下的原尺寸链接为原始 PNG 无损转换的 WebP，适合放大看细节。主机照片复用本人此前文章中的实拍图。&lt;/p&gt;
&lt;h2 id="参考资料"&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/Viggle/Qwen-Image-2.1-viggle-turbo" target="_blank" rel="noopener"
 &gt;Viggle：Qwen-Image-2.1-viggle-turbo 模型与用法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/Qwen/Qwen-Image-2.1" target="_blank" rel="noopener"
 &gt;Qwen-Image-2.1 官方模型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/Comfy-Org/Qwen-Image-2.1" target="_blank" rel="noopener"
 &gt;Comfy-Org：Qwen-Image-2.1 权重&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Comfy-Org/workflow_templates/blob/main/templates/image_qwen_image_2_1_t2i.json" target="_blank" rel="noopener"
 &gt;ComfyUI 官方 Qwen Image 2.1 文生图工作流&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://guige.ai/p/ollama-local-dev/" &gt;鬼哥：一张 4090 跑 Gemma4 26B&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;模型页面标注 Qwen Research 许可证；商用前请另行确认对应权重与适配器的许可条件。&lt;/p&gt;</description></item><item><title>口播视频的 API 账单有点贵，鬼哥把 Mac mini 和 4090 接成了一间 AI 演播室</title><link>https://guige.ai/p/local-talking-studio/</link><pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate><guid>https://guige.ai/p/local-talking-studio/</guid><description>&lt;img src="https://guige.ai/" alt="Featured image of post 口播视频的 API 账单有点贵，鬼哥把 Mac mini 和 4090 接成了一间 AI 演播室" /&gt;&lt;p&gt;做一个 AI 口播视频，最容易上头的时刻，是人物第一次开口。最容易冷静下来的时刻，是你想改一句文案，再生成一遍。&lt;/p&gt;
&lt;p&gt;鬼哥之前做了一套真人口播的 skill：给它人物照片、声音样本和文案，让 MiniMax 克隆声音、生成配音，再交给 HeyGen 做照片驱动的口播视频。先看短预览，满意了再出正式版，素材、任务和成品都能留档。&lt;/p&gt;
&lt;p&gt;流程顺了，另一个问题也顺着来了：创作很少一遍就满意。文案要改，语气要调，照片要换，预览看完又想试另一版。让 agent 来回编排会消耗 token，语音和视频服务还有各自的计费方式。&lt;strong&gt;省下了操作时间，试错仍然要付钱。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;鬼哥看了看桌上的 M6 Mac mini，又看了看自己的 4090：东西都买了，总得让它们多干点活。于是有了这间本地 AI 演播室——Qwen 管声音和人物图，MiniMax H3 管声画视频，Open WebUI 把它们接到同一个页面，字幕最后在 Mac 上收尾。&lt;/p&gt;
&lt;p&gt;先看结果。下面是 Diana 介绍 DI CLI 的带字幕口播，约 12 秒，视频由 4090 上的 H3 生成。&lt;/p&gt;
&lt;video controls playsinline preload="none" poster="diana-poster.webp" style="width:100%;max-width:512px;height:auto;border-radius:12px;"&gt;
 &lt;source src="diana-talk.mp4" type="video/mp4"&gt;
 你的浏览器不支持内嵌视频，可以&lt;a href="diana-talk.mp4"&gt;下载 Diana 口播视频&lt;/a&gt;观看。
&lt;/video&gt;
&lt;p&gt;&lt;a class="link" href="diana-talk.mp4" &gt;下载 Diana 口播视频&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这回再想让她换一句台词，本地生成链路不用先看云端 API 余额。当然，机器、电费和折腾时间都有成本；这里的“免费”，说的是不再为每次本地推理付云端调用费。模型许可也得另看，尤其不能把免费试验直接理解成无条件商用。&lt;/p&gt;
&lt;h2 id="两台机器终于不用挤同一张床"&gt;两台机器，终于不用挤同一张床
&lt;/h2&gt;&lt;p&gt;在&lt;a class="link" href="https://guige.ai/p/mac-mini-ai-workstation/" &gt;之前那篇 Mac mini 工作站文章&lt;/a&gt;里，鬼哥已经让 32G 的小盒子能聊天、能画图了。麻烦是两个大模型留在内存里不走，最后只好安排它们轮流上场。&lt;/p&gt;
&lt;p&gt;现在要加配音和视频，继续把所有活塞给 Mac，排队就更长了。这次分工干脆一点：Mac mini 留在桌面上当工作台，做语音和字幕；图像、视频这些重活，交给 Ubuntu 上的 4090。&lt;/p&gt;
&lt;img src="mac-mini-photo.webp" alt="鬼哥的 M6 Mac mini，负责工作台、本地配音和字幕处理" style="width:360px;max-width:100%;margin:24px auto;"&gt;
&lt;p&gt;Mac 上的主角是 Open WebUI 和独立的 &lt;code&gt;local-tts&lt;/code&gt; 服务。Open WebUI 保存音色、人物、文案和任务记录，调用模型的动作发生在它的后端。&lt;code&gt;local-tts&lt;/code&gt; 用 MLX / Metal 跑 Qwen3-TTS，也提供本地 Whisper 转写。字幕另有独立环境，走 CPU，把统一内存和 GPU 的余量留给语音。&lt;/p&gt;
&lt;p&gt;&lt;img alt="负责 Qwen Image 和 H3 视频推理的 4090 主机，复用鬼哥此前的实拍照片" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="1200" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/4090-photo.webp" srcset="https://guige.ai/p/local-talking-studio/4090-photo_hu_edb61d0e495f5eb9.webp 800w, https://guige.ai/p/local-talking-studio/4090-photo.webp 1600w" width="1600"&gt;&lt;/p&gt;
&lt;p&gt;4090 那边跑两个服务：Qwen-Image-2.1 图像 API，和 MiniMax H3 视频 API。底下各有自己的推理环境，避免把语音、图像、视频的 Python 依赖煮成一锅粥。&lt;/p&gt;
&lt;p&gt;先说个容易看漏的规格：鬼哥这张卡是 &lt;strong&gt;48GB 显存的 4090&lt;/strong&gt;，主机有 64GB 内存。普通 24GB 4090 能不能照搬，得按模型、量化和工作流重新算，不能只认“4090”这三个数字。&lt;/p&gt;
&lt;p&gt;这样一分，Mac 不用为了画一张人物图先把自己的声音服务挤走；4090 也不用承担网页、音色库和字幕编辑。哪台机器擅长哪件事，就让它干哪件事。&lt;/p&gt;
&lt;h2 id="audio-studio名字还是音频里面已经能拍视频了"&gt;&lt;code&gt;/audio-studio&lt;/code&gt;：名字还是音频，里面已经能拍视频了
&lt;/h2&gt;&lt;p&gt;浏览器打开 &lt;code&gt;http://localhost:8080/audio-studio&lt;/code&gt;，进入的是“视频语音工作台”。这里是鬼哥在本地 Open WebUI 源码上扩展的页面，装一个上游原版不会自动长出这些功能。&lt;/p&gt;
&lt;h3 id="先看整套架构页面在-mac重活在-4090"&gt;先看整套架构：页面在 Mac，重活在 4090
&lt;/h3&gt;&lt;p&gt;先把页面后面的关系看清楚，后面每点一个按钮，就知道是哪台机器在干活。浏览器只访问 Mac 上的 Open WebUI；配音交给本机 Qwen3-TTS，人物图和口播视频通过两条 SSH 隧道交给 4090，成片返回 Mac，再生成和烧录字幕。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Mac mini、4090、Open WebUI、语音、图像、视频与字幕服务架构" class="gallery-image" data-flex-basis="384px" data-flex-grow="160" height="1500" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/service-architecture.webp" srcset="https://guige.ai/p/local-talking-studio/service-architecture_hu_6d7f19e3412944e.webp 800w, https://guige.ai/p/local-talking-studio/service-architecture_hu_7545d708d67c1d3b.webp 1600w, https://guige.ai/p/local-talking-studio/service-architecture.webp 2400w" width="2400"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="diagram/service-architecture.svg" &gt;打开可放大的 SVG 架构图&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;登录、素材归属、任务历史和下载由 WebUI 后端管理，浏览器不会直接去访问无用户鉴权的模型服务。拿 Diana 来说，人物图和声音可以分别准备、保存；生成视频时再把选中的两份素材交给 H3。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;工作台要做的事&lt;/th&gt;
 &lt;th&gt;Mac 后端访问的地址&lt;/th&gt;
 &lt;th&gt;真正干活的位置与接口&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;预设配音、克隆与声音设计&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;127.0.0.1:8091&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Mac local-tts：&lt;code&gt;/v1/audio/speech&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;音色管理、录音转写&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;127.0.0.1:8091&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Mac local-tts：&lt;code&gt;/v1/audio/voices&lt;/code&gt;、&lt;code&gt;/v1/audio/transcriptions&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Qwen 生图、参考图编辑&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;127.0.0.1:28093&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;SSH 转发到 4090 的 &lt;code&gt;8093&lt;/code&gt;：&lt;code&gt;/v1/images/generations&lt;/code&gt;、&lt;code&gt;/v1/images/edits&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;H3 素材与视频任务&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;127.0.0.1:28092&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;SSH 转发到 4090 的 &lt;code&gt;8092&lt;/code&gt;：&lt;code&gt;/v1/video/assets&lt;/code&gt;、&lt;code&gt;/v1/video/jobs&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;字幕识别、对齐与烧录&lt;/td&gt;
 &lt;td&gt;WebUI 内部调用独立进程&lt;/td&gt;
 &lt;td&gt;Mac CPU：stable-ts / Whisper + FFmpeg / libass&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;两条隧道让后端像访问本机一样访问远端 API。远端服务继续只监听回环地址，Mac 本地转发口也绑定回环；图像 API 另外有 Bearer 密钥，由 WebUI 后端保存。当前机器用 launchd 保持隧道并自动重连。&lt;/p&gt;
&lt;h3 id="从音色和人物开始再让她开口"&gt;从音色和人物开始，再让她开口
&lt;/h3&gt;&lt;p&gt;当前导航有音色库、人物库、生成播报、生成视频，管理员还会看到生成图像。把它们放在一起，是因为做 Diana 这样的角色，最常重复使用的其实是她的脸和声音。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;音色库先解决“谁来说”。&lt;/strong&gt; 可以用 Serena 等九种预设音色，也可以上传录音，或用麦克风录制。参考录音支持 1–120 秒，参考原文可选；不想手工抄，就调用本地 Whisper 识别，再校对。音色可以命名、试听、编辑和删除，替换录音会留下新版本，已经排队的任务仍能找到自己那一份素材。&lt;/p&gt;
&lt;p&gt;&lt;img alt="音色库实截：左侧上传参考录音、填写原文，右侧按分类选择和试听预设音色" class="gallery-image" data-flex-basis="339px" data-flex-grow="141" height="1484" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/studio-voice-library.webp" srcset="https://guige.ai/p/local-talking-studio/studio-voice-library_hu_14555c8787188bd7.webp 800w, https://guige.ai/p/local-talking-studio/studio-voice-library_hu_3ab093b82f979c05.webp 1600w, https://guige.ai/p/local-talking-studio/studio-voice-library.webp 2097w" width="2097"&gt;&lt;/p&gt;
&lt;p&gt;还有个更好玩的入口：文字设计音色。比如描述“年轻女性，声音温暖，普通话清晰，说话自然，像在向朋友介绍一个新工具”，先让 VoiceDesign 生成一段试听。满意了，命名并保存成音色；后面的播报再拿这段录音去克隆。设计声音这一步有随机性，保存满意的样本，比每次重新许愿更适合养一个长期角色。&lt;/p&gt;
&lt;p&gt;&lt;img alt="文字设计音色实截：填写声音描述、选择语言和试听文案；图中为未提交的表单示例" class="gallery-image" data-flex-basis="146px" data-flex-grow="60" height="1311" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/studio-voice-design.webp" width="798"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;人物库保存“谁出镜”。&lt;/strong&gt; 上传人物图片，给角色起名，还可以绑定默认音色。下次选 Diana，不用重新在文件夹里找头像，也不用重新想她该用哪个声音。图像生成是独立入口，出图后仍需把选中的图保存到人物库；这里没有假装一张图出来就自动变成角色。&lt;/p&gt;
&lt;p&gt;&lt;img alt="人物库中的 Diana 实际卡片：保存人物图、图片尺寸和默认音色，点击“使用此人物”进入视频页" class="gallery-image" data-flex-basis="1195px" data-flex-grow="498" height="159" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/studio-portraits.webp" width="792"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;生成播报负责先把台词说顺。&lt;/strong&gt; 输入文案、选择音色和语速，后台排队生成，完成后试听、下载 MP3/WAV。结果会留在历史里，还能直接拿去做视频。声音不满意，先在这一步改；没必要每换一个停顿，就让视频模型再忙一轮。&lt;/p&gt;
&lt;p&gt;&lt;img alt="生成播报实截：选择 Serena、填写 Diana 的示例文案和语速；仅演示填写方式，未提交新的播报任务" class="gallery-image" data-flex-basis="168px" data-flex-grow="70" height="1205" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/studio-narration.webp" srcset="https://guige.ai/p/local-talking-studio/studio-narration_hu_dc5487c89bc82e2d.webp 800w, https://guige.ai/p/local-talking-studio/studio-narration.webp 848w" width="848"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;生成视频把人和声音合起来。&lt;/strong&gt; 可以选已有播报，也可以在视频页直接输入文本、先生成配音。页面分别提供本机 H3（Mac）、4090 H3，以及配置后可用的 HeyGen。走这篇文章的本地路线，就选 4090 H3；HeyGen 仍属于云端付费路线。任务有进度和结果，成片能播放、改名、下载，完成后接着处理字幕。&lt;/p&gt;
&lt;p&gt;&lt;img alt="生成视频参数页实截：选择本地 4090 H3 和 Diana，配音来源、画面比例、采样步数和短预览参数都在同一张表单中" class="gallery-image" data-flex-basis="65px" data-flex-grow="27" height="2754" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/studio-video.webp" width="755"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="已有 Diana 视频结果实截：4090 H3、512×512、十二步短预览，卡片可播放字幕版、下载原片或进入字幕编辑" class="gallery-image" data-flex-basis="351px" data-flex-grow="146" height="567" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/studio-video-result.webp" srcset="https://guige.ai/p/local-talking-studio/studio-video-result_hu_f3003369e7693bbe.webp 800w, https://guige.ai/p/local-talking-studio/studio-video-result.webp 831w" width="831"&gt;&lt;/p&gt;
&lt;p&gt;管理员还可以显式把音频或视频发到 Telegram。那是分享出口，生成本身不需要 Telegram；需要把素材留在本地，下载 MP4 就够了。&lt;/p&gt;
&lt;h2 id="qwen-给-diana-找声音也给她换衣服"&gt;Qwen 给 Diana 找声音，也给她换衣服
&lt;/h2&gt;&lt;p&gt;用户习惯叫它“qwen-voice”，这套部署里实际用的是 &lt;a class="link" href="https://github.com/QwenLM/Qwen3-TTS" target="_blank" rel="noopener"
 &gt;Qwen3-TTS&lt;/a&gt;，声音服务独立监听 &lt;code&gt;127.0.0.1:8091&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;三个模型各有一个用场。CustomVoice 提供预设音色；Base 用参考录音克隆声音；VoiceDesign 按文字描述设计新声音。Mac 端采用 1.7B 的 MLX 8bit 版本。克隆时，声音风格主要来自参考录音，不能把给预设音色用的风格指令当成万能旋钮。&lt;/p&gt;
&lt;p&gt;它对外提供熟悉的 OpenAI 风格接口：&lt;code&gt;POST /v1/audio/speech&lt;/code&gt; 返回 MP3 或 WAV，&lt;code&gt;GET /v1/audio/voices&lt;/code&gt; 列出音色，&lt;code&gt;POST /v1/audio/transcriptions&lt;/code&gt; 识别参考录音。Open WebUI 的音频引擎填“OpenAI”，只是选了接口格式；真正开口的是 Mac 上的 Qwen。&lt;/p&gt;
&lt;p&gt;想单独验证声音服务，不必先打开工作台：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl --fail-with-body http://127.0.0.1:8091/v1/audio/speech &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s1"&gt;&amp;#39;Content-Type: application/json&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s1"&gt;&amp;#39;{&amp;#34;model&amp;#34;:&amp;#34;qwen3-tts&amp;#34;,&amp;#34;input&amp;#34;:&amp;#34;你好，欢迎来到鬼哥的本地 AI 演播室。&amp;#34;,&amp;#34;voice&amp;#34;:&amp;#34;Serena&amp;#34;,&amp;#34;lang_code&amp;#34;:&amp;#34;chinese&amp;#34;,&amp;#34;response_format&amp;#34;:&amp;#34;mp3&amp;#34;}&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --output narration.mp3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这个服务返回完整音频文件，不支持 &lt;code&gt;stream=true&lt;/code&gt;。长文会按句分段再拼接；语速参数是生成后的 FFmpeg 调速，跟让模型换一种表演节奏是两回事。&lt;/p&gt;
&lt;p&gt;人物图则交给 4090 上的 Qwen-Image-2.1。工作台的“生成图像”提供两种模式：默认 Viggle Turbo 六步，或者基础版四十步。没参考图时按提示词生图；传一张参考图，就能做换背景、换衣服这样的编辑，结果可以下载原图。&lt;/p&gt;
&lt;p&gt;&lt;img alt="4090 图像工作台实截：连接状态、Turbo 六步模式、画面描述、参考图和随机种子；底部为之前保存的图像记录" class="gallery-image" data-flex-basis="339px" data-flex-grow="141" height="1484" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/studio-images.webp" srcset="https://guige.ai/p/local-talking-studio/studio-images_hu_a5e9306ee76d2c14.webp 800w, https://guige.ai/p/local-talking-studio/studio-images_hu_539d24b898b9e4f8.webp 1600w, https://guige.ai/p/local-talking-studio/studio-images.webp 2097w" width="2097"&gt;&lt;/p&gt;
&lt;p&gt;在&lt;a class="link" href="https://guige.ai/p/qwen-image-turbo/" &gt;前一篇四组实测&lt;/a&gt;里，同一台机器的人像和海报工作流，六步版约 10 秒，基础版约 38 秒；人物编辑约 12 秒和 42 秒。加上运行时启动，Turbo 的总时间约 15–17 秒。这些是那次固定配置的记录，工作台还要经过连接和保存，不能直接当成每次点击的承诺。&lt;/p&gt;
&lt;p&gt;对角色创作来说，快一点的意义很具体：你更愿意试三套衣服、两个背景，再选适合这次台词的那张。图像编辑仍可能改变局部细节和取景，选人物图时得看脸，也得看构图。Diana 不会因为有了人物库，就自动获得每一帧都不变的身份证。&lt;/p&gt;
&lt;h2 id="h3-收到配音后会重新生成声画"&gt;H3 收到配音后，会重新生成声画
&lt;/h2&gt;&lt;p&gt;人物和配音都有了，终于轮到视频模型。&lt;/p&gt;
&lt;p&gt;这里用的是 &lt;a class="link" href="https://huggingface.co/MiniMaxAI/MiniMax-H3" target="_blank" rel="noopener"
 &gt;MiniMax H3 的 Ref2VA&lt;/a&gt;，在 4090 上通过 ComfyUI 的 CUDA 运行时推理。部署采用裁剪后的 INT8 主模型、INT8 文本编码器与视频 VAE，以及 FP32 音频 VAE。整套权重下载约 51.5GB，跟“显存里同时要放多少”不是同一个数。&lt;/p&gt;
&lt;p&gt;有个区别会直接影响你怎么看成片：&lt;strong&gt;H3 会根据参考人物和音频生成自己的声画音轨。&lt;/strong&gt; 它不是给一份完全不动的 WAV 配上嘴形。参考配音在引导它，输出的声音、时长和细节仍可能变化，所以工作台保留模型实际生成的结果，不偷偷把原配音换回去。&lt;/p&gt;
&lt;p&gt;这也是字幕必须听最终视频的原因。按输入 WAV 的时间轴贴字幕，遇到 H3 改了停顿，字就可能比嘴先到。&lt;/p&gt;
&lt;p&gt;当前这套本地封装先收窄到 512×512、24fps、单段参考音频 2–15 秒，默认十二步，可选八步或二十步。官方模型的能力范围更宽，但鬼哥工作台还没有把官方整套高分辨率流程搬进来。&lt;/p&gt;
&lt;p&gt;部署时留过一份短样片记录：约 4.1 秒的参考音频、十二步，在这台 4090 上一次成功任务的全流程约 86 秒，输出约 4.49 秒。它说明这条 CUDA 路线已经实际出片，不能拿来按比例保证一分钟视频的耗时。前面的 Diana 约十二秒成片，也是已有结果；这篇没有另外给她编一个生成速度。&lt;/p&gt;
&lt;p&gt;长片开关目前关闭。服务已经有按停顿切段、保留已完成片段、继续失败任务的机制，但片段之间的人物姿态和声音衔接还需要验证。先把一段短口播做顺，比急着把它叫作全天候直播间踏实。&lt;/p&gt;
&lt;h2 id="模型之间怎么接力任务怎么留下来"&gt;模型之间怎么接力，任务怎么留下来
&lt;/h2&gt;&lt;p&gt;前面那张架构图里的两条连接，落到部署上就是 SSH 端口转发。连接好以后，工作台才能把图像和视频任务送到 4090。&lt;/p&gt;
&lt;p&gt;如果已经装好了远端服务，手工连接的核心就是这两条：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 两条命令分别在独立终端运行；把 user@4090-host 换成自己的 SSH 目标&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -NT -o &lt;span class="nv"&gt;ExitOnForwardFailure&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes -o &lt;span class="nv"&gt;ServerAliveInterval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -L 127.0.0.1:28092:127.0.0.1:8092 user@4090-host
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -NT -o &lt;span class="nv"&gt;ExitOnForwardFailure&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes -o &lt;span class="nv"&gt;ServerAliveInterval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -L 127.0.0.1:28093:127.0.0.1:8093 user@4090-host
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;它们只是连接方式，还不是把两台空白机器装好的全部命令。当前环境是一步步部署、修复、接通的，全新 Mac / Ubuntu 从 checkout 到整条链路一键可用，还没有完整验收。&lt;/p&gt;
&lt;p&gt;视频 API 用持久任务：先上传人物图和音频取得素材 ID，再创建任务，拿任务 ID 查询进度，完成后取 MP4。取消和重试也围绕这个 ID，断开隧道不等于远端任务已经停了，连接恢复后可以继续查。&lt;/p&gt;
&lt;p&gt;图像 API 目前是同步请求，没有同样的长队列和取消能力。它与 H3 共用 GPU 锁，约十五秒仍拿不到 GPU 会提示忙，留给用户稍后重试。生成结束，独立运行时退出，把显存还出来。&lt;/p&gt;
&lt;p&gt;这一点跟最初那台 32G Mac 的经验呼应上了：服务可以同时开着，大模型没必要同时赖在 GPU 里。做图和拍视频按顺序接力，48GB 也有自己的座位表。&lt;/p&gt;
&lt;h2 id="最后一公里让字幕跟上-diana-的嘴"&gt;最后一公里：让字幕跟上 Diana 的嘴
&lt;/h2&gt;&lt;p&gt;口播有画面、有声音了，手机上看的人却未必会开声音。字幕得跟上。&lt;/p&gt;
&lt;p&gt;这里有两套容易叫混的 Whisper。&lt;code&gt;local-tts&lt;/code&gt; 里的 MLX Whisper 用来识别音色参考录音；成片字幕则放在 Open WebUI 的独立 Python 环境，用 &lt;a class="link" href="https://github.com/jianfch/stable-ts" target="_blank" rel="noopener"
 &gt;stable-ts&lt;/a&gt; 配合本地 Whisper Small，当前走 CPU 四线程。&lt;/p&gt;
&lt;p&gt;完整视频有对应完整文案时，使用强制对齐：拿文字去最终音轨里找时间位置。截短预览或缺少文案时走 ASR，从实际音轨重新识别，避免把整篇台词硬塞进十几秒的预览。两种方式都可能出错，尤其是产品名、英文缩写和模型没有严格照读的地方，最后还是要看着成片校一次。&lt;/p&gt;
&lt;p&gt;新视频完成后会自动生成并烧录字幕，成功后卡片默认播放、下载字幕版。要改文字和时间，可以打开编辑器，逐句定位、拆分、合并；字号、颜色、上下位置、边距和底框也能调整。保存以后重新烧录，才得到这版字幕对应的 MP4。字幕失败可以单独重试，不必再跑一遍 H3。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Diana 已有视频的字幕编辑器实截：对照成片调整每句文字和起止时间，设置字幕样式，再保存、烧录和导出" class="gallery-image" data-flex-basis="106px" data-flex-grow="44" height="1787" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/studio-captions.webp" width="792"&gt;&lt;/p&gt;
&lt;p&gt;SRT、VTT、ASS 都能导出；想拿去剪辑软件继续做，用字幕文件；想直接发给朋友，用 FFmpeg / libass 烧好的视频。原片另保留一份，不会被字幕覆盖。&lt;/p&gt;
&lt;p&gt;中文还有一个朴素的坑：系统里有字体，不代表 libass 真选中了它。此前成片出现过汉字方框，最终在 Mac 上显式加载 Heiti SC 才修好。模型说得再流利，字幕变成口口口，也像主持人忘了带提词器。&lt;/p&gt;
&lt;h2 id="从一段短口播开始把试错留给自己"&gt;从一段短口播开始，把试错留给自己
&lt;/h2&gt;&lt;p&gt;拿 Diana 这样的角色来走这条链路，我会先选好人物图和声音，试听一小段台词。声音顺了，再送到 4090 H3；成片回来检查嘴形、人物和实际音轨，然后校字幕、下载。想换背景，就去图像页改；想换一句话，先重新配音。每一步都有自己的产物，出了问题能回到那一步。&lt;/p&gt;
&lt;p&gt;文案可以自己写，也可以让本地聊天模型帮忙。现有 Open WebUI / Ollama 的聊天路线能继续用，但 Audio Studio 目前仍需要你输入文案、选择素材和提交任务，尚未做到“给一个主题，自动拍完整支视频”。这里的端到端，是从文案、人物图走到带字幕成片，而不是把所有创作判断都省掉。&lt;/p&gt;
&lt;p&gt;还有一笔账要分清：Qwen-Image-2.1 和 Turbo 适配器有研究用途的许可条件，H3 用社区许可。自己的研究试验与收费交付是两回事，做商业内容前得逐项读模型条款；人物肖像和声音也要有相应授权。&lt;/p&gt;
&lt;p&gt;对鬼哥来说，这套系统目前最有价值的，是能反复试。角色库里放好一个 Diana，今天介绍工具，明天换个背景、换一段台词，不用每次从上传素材和充值开始。短片能力已经能用，更长的视频、连续的角色表演，留着往后磨。&lt;/p&gt;
&lt;p&gt;当初做 skill，是想让口播少一点手工操作。现在把后端搬回自己的机器，是想让“再试一版”少一点犹豫。&lt;/p&gt;
&lt;p&gt;桌上的 Mac mini 接文案，4090 开始干活，Diana 再开口。鬼哥这次要看的，是她有没有把话说好。&lt;/p&gt;
&lt;h2 id="参考资料"&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://guige.ai/p/mac-mini-ai-workstation/" &gt;鬼哥：32G 的 M6 Mac mini，怎么同时养活聊天和画图两个大模型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://guige.ai/p/qwen-image-turbo/" &gt;鬼哥：Qwen Image 40 步对上 Viggle Turbo 6 步，4090 上的四组实测&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/open-webui/open-webui" target="_blank" rel="noopener"
 &gt;Open WebUI 项目&lt;/a&gt;（本文工作台为本地定制扩展）&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/QwenLM/Qwen3-TTS" target="_blank" rel="noopener"
 &gt;Qwen3-TTS 官方代码与模型用法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Blaizzy/mlx-audio" target="_blank" rel="noopener"
 &gt;MLX Audio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/Qwen/Qwen-Image-2.1" target="_blank" rel="noopener"
 &gt;Qwen-Image-2.1 模型卡与许可&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/Viggle/Qwen-Image-2.1-viggle-turbo" target="_blank" rel="noopener"
 &gt;Viggle Qwen Image Turbo 适配器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/MiniMaxAI/MiniMax-H3" target="_blank" rel="noopener"
 &gt;MiniMax H3 模型卡、Ref2VA 与社区许可&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/comfyanonymous/ComfyUI" target="_blank" rel="noopener"
 &gt;ComfyUI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/jianfch/stable-ts" target="_blank" rel="noopener"
 &gt;stable-ts：转写与强制对齐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://ffmpeg.org/ffmpeg-filters.html#subtitles-1" target="_blank" rel="noopener"
 &gt;FFmpeg 字幕滤镜&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>一张 4090 跑 Gemma4 26B：用 Ollama 搭本地 AI 开发环境实测</title><link>https://guige.ai/p/ollama-local-dev/</link><pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate><guid>https://guige.ai/p/ollama-local-dev/</guid><description>&lt;img src="https://guige.ai/" alt="Featured image of post 一张 4090 跑 Gemma4 26B：用 Ollama 搭本地 AI 开发环境实测" /&gt;&lt;p&gt;以前本地大模型像玩具：能聊天，但一进开发工作流就露怯。现在一张 4090 已经能把 &lt;strong&gt;Gemma4 26B&lt;/strong&gt; 跑起来，还能接 Codex、Claude Code、Hermes Agent。问题只剩一个：&lt;strong&gt;它到底是生产力，还是昂贵的电子暖手宝？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这篇文章不讲玄学，直接上手：用 Ollama 部署本地模型、用 API 对话、接入开发工具，再看 RTX 4090 上的真实推理数据。&lt;/p&gt;
&lt;p&gt;&lt;img alt="本地 AI 开发工作站" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="941" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/ollama-local-dev/cover.webp" srcset="https://guige.ai/p/ollama-local-dev/cover_hu_8dcc5742ce0bf15c.webp 800w, https://guige.ai/p/ollama-local-dev/cover_hu_3c5675e75fce5a98.webp 1600w, https://guige.ai/p/ollama-local-dev/cover.webp 1672w" width="1672"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="先看结论"&gt;先看结论
&lt;/h2&gt;&lt;p&gt;我这台机器的实测环境：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;项目&lt;/th&gt;
 &lt;th style="text-align: right"&gt;数据&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;GPU&lt;/td&gt;
 &lt;td style="text-align: right"&gt;NVIDIA GeForce RTX 4090&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;nvidia-smi&lt;/code&gt; 显存&lt;/td&gt;
 &lt;td style="text-align: right"&gt;49140 MiB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;NVIDIA Driver&lt;/td&gt;
 &lt;td style="text-align: right"&gt;570.158.01&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CUDA&lt;/td&gt;
 &lt;td style="text-align: right"&gt;12.8&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Ollama&lt;/td&gt;
 &lt;td style="text-align: right"&gt;0.23.0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;模型&lt;/td&gt;
 &lt;td style="text-align: right"&gt;&lt;code&gt;gemma4:26b&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;模型文件大小&lt;/td&gt;
 &lt;td style="text-align: right"&gt;17 GB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Ollama 加载后显存&lt;/td&gt;
 &lt;td style="text-align: right"&gt;约 24.5 GB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;持续输出速度&lt;/td&gt;
 &lt;td style="text-align: right"&gt;约 160-166 tokens/s&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;长输出功耗&lt;/td&gt;
 &lt;td style="text-align: right"&gt;约 260-265W&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;长输出温度&lt;/td&gt;
 &lt;td style="text-align: right"&gt;54-60C&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;先打补丁：我这张 4090 在 &lt;code&gt;nvidia-smi&lt;/code&gt; 里显示约 &lt;strong&gt;48GB 显存&lt;/strong&gt;，不是常见 24GB 版本。普通 24GB 4090 也可以参考这篇文章的方法，但长上下文、并发和 Agent 场景要更保守。&lt;/p&gt;
&lt;p&gt;我的结论是：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;本地 26B 模型已经能做日常开发副驾，但还不能无脑替代云端顶级模型。&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;它适合解释私有代码、写脚本、生成小模块、做初步 code review；但复杂重构、跨仓库规划、长链路 Agent，仍然会被模型能力、上下文和工具链沙盒卡住。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="ollama-解决了什么"&gt;Ollama 解决了什么
&lt;/h2&gt;&lt;p&gt;Ollama 的价值不是让模型变聪明，而是把本地部署降到几条命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ollama pull gemma4:26b
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ollama run gemma4:26b
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;没有 Ollama，你要处理权重格式、量化版本、CUDA、服务启动、API 适配。用 Ollama 之后，它更像一个本地模型网关：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;开发工具 / 脚本 / Agent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;http://localhost:11434
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;本地 Gemma4 26B
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img alt="Ollama 本地模型网关" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="941" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/ollama-local-dev/ollama-stack.webp" srcset="https://guige.ai/p/ollama-local-dev/ollama-stack_hu_e8309c95dc255628.webp 800w, https://guige.ai/p/ollama-local-dev/ollama-stack_hu_f7897a4b19aa206b.webp 1600w, https://guige.ai/p/ollama-local-dev/ollama-stack.webp 1672w" width="1672"&gt;&lt;/p&gt;
&lt;p&gt;查看模型：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ollama list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;我本机输出里有：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME SIZE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gemma4:26b 17 GB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gemma4:e2b 7.2 GB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gemma4:latest 9.6 GB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpt-oss:20b 13 GB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpt-oss:120b 65 GB
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;查看运行状态：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ollama ps
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;实测加载后：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME SIZE PROCESSOR CONTEXT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gemma4:26b 25 GB 100% GPU 262144
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这行信息很关键：&lt;code&gt;100% GPU&lt;/code&gt; 说明没有明显落到 CPU，&lt;code&gt;262144&lt;/code&gt; 说明上下文窗口很大，但不代表每次都应该塞满。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="先直接对话"&gt;先直接对话
&lt;/h2&gt;&lt;p&gt;命令行对话：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ollama run gemma4:26b
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后直接问：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;用三句话解释 Ollama 是什么。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果要从程序里调用，用 Ollama 原生 API：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl http://localhost:11434/api/chat &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s1"&gt;&amp;#39;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;model&amp;#34;: &amp;#34;gemma4:26b&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;messages&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; {&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;用三句话解释 Ollama 是什么。&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;stream&amp;#34;: false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; }&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ollama 返回的 JSON 里有性能字段：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;字段&lt;/th&gt;
 &lt;th&gt;含义&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;load_duration&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;模型加载耗时&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;prompt_eval_count&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;输入 token 数&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;prompt_eval_duration&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;输入处理耗时&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;eval_count&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;输出 token 数&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;eval_duration&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;输出生成耗时&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;核心公式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;输出速度 = eval_count / eval_duration_seconds
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这比手动掐秒表靠谱。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="接入-codex默认沙盒失败授权后跑通"&gt;接入 Codex：默认沙盒失败，授权后跑通
&lt;/h2&gt;&lt;p&gt;Codex CLI 版本：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;codex-cli 0.128.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;启动方式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;codex --oss --local-provider ollama -m gemma4:26b
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;我先跑了一个只读任务：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;codex &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --oss &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --local-provider ollama &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -m gemma4:26b &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -s read-only &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --ephemeral &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;请阅读当前目录的 benchmark.sh，简要说明它会如何测试 Ollama 本地模型性能，不要修改任何文件。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Codex 成功识别了 Ollama provider：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;model: gemma4:26b
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;provider: ollama
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sandbox: read-only
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;但默认 read-only sandbox 下，内部执行读文件命令时失败：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这个结果很有价值：&lt;strong&gt;本地模型速度够，不代表 Agent 工具链一定顺。&lt;/strong&gt; 这次不是模型不行，而是当前 Linux 环境下 bubblewrap sandbox 权限受限。&lt;/p&gt;
&lt;p&gt;随后我显式授权绕过 Codex 内部 sandbox，仍然使用同一个只读任务：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;codex &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --oss &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --local-provider ollama &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -m gemma4:26b &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --dangerously-bypass-approvals-and-sandbox &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --ephemeral &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;请阅读当前目录的 benchmark.sh，简要说明它会如何测试 Ollama 本地模型性能，不要修改任何文件。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这次跑通了。Codex 成功执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat benchmark.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;并总结出脚本会调用本地 Ollama &lt;code&gt;/api/chat&lt;/code&gt;，保存原始 JSON，再用 &lt;code&gt;jq&lt;/code&gt; 计算 &lt;code&gt;load_s&lt;/code&gt;、&lt;code&gt;prompt_tokens_per_s&lt;/code&gt;、&lt;code&gt;output_tokens_per_s&lt;/code&gt; 等指标。换句话说，&lt;strong&gt;Codex + Ollama + Gemma4 26B 是可用的，但在这台机器上需要绕过 Codex sandbox 才能读文件。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Codex 本地模型测试截图" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="1080" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/ollama-local-dev/codex-local.webp" srcset="https://guige.ai/p/ollama-local-dev/codex-local_hu_58cb1772fb7c73c8.webp 800w, https://guige.ai/p/ollama-local-dev/codex-local_hu_5037a10b39c2a8a1.webp 1600w, https://guige.ai/p/ollama-local-dev/codex-local.webp 1920w" width="1920"&gt;&lt;/p&gt;
&lt;p&gt;遇到类似问题，优先检查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;是否在受限容器、远程桌面、特殊 sandbox 里运行&lt;/li&gt;
&lt;li&gt;系统是否允许 user namespace&lt;/li&gt;
&lt;li&gt;Codex sandbox 模式是否过严&lt;/li&gt;
&lt;li&gt;是否需要换普通终端或调整权限策略&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="接入-claude-code真实可用"&gt;接入 Claude Code：真实可用
&lt;/h2&gt;&lt;p&gt;Claude Code 版本：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2.1.126 (Claude Code)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ollama 提供了 Anthropic-compatible API，所以可以这样接：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ollama
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:11434
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;claude --model gemma4:26b
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;我用完整路径跑了一个非交互只读任务：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;env &lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ollama &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:11434 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /home/luoli/.local/bin/claude &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --model gemma4:26b &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --no-session-persistence &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --permission-mode dontAsk &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --tools Read &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --output-format json &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;请阅读当前目录的 benchmark.sh，简要说明它如何测试 Ollama 本地模型性能。不要修改任何文件。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;结果成功：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;指标&lt;/th&gt;
 &lt;th style="text-align: right"&gt;数据&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;状态&lt;/td&gt;
 &lt;td style="text-align: right"&gt;success&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;总耗时&lt;/td&gt;
 &lt;td style="text-align: right"&gt;7889 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;API 耗时&lt;/td&gt;
 &lt;td style="text-align: right"&gt;7824 ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;轮数&lt;/td&gt;
 &lt;td style="text-align: right"&gt;2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;输入 token&lt;/td&gt;
 &lt;td style="text-align: right"&gt;16319&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;输出 token&lt;/td&gt;
 &lt;td style="text-align: right"&gt;713&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;permission denials&lt;/td&gt;
 &lt;td style="text-align: right"&gt;0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Claude Code 正确读取了 &lt;code&gt;benchmark.sh&lt;/code&gt;，并总结出脚本会用 5 个 case 调用 Ollama &lt;code&gt;/api/chat&lt;/code&gt;，保存原始 JSON，再用 &lt;code&gt;jq&lt;/code&gt; 提取 &lt;code&gt;total_s&lt;/code&gt;、&lt;code&gt;load_s&lt;/code&gt;、&lt;code&gt;prompt_tokens_per_s&lt;/code&gt;、&lt;code&gt;output_tokens_per_s&lt;/code&gt; 等指标。&lt;/p&gt;
&lt;p&gt;这就是一个正面案例：&lt;strong&gt;同样是 Gemma4 26B，本地模型不只会聊天，也能通过 Claude Code 的 Read 工具进入真实开发上下文。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Claude Code 本地模型测试截图" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="1080" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/ollama-local-dev/claude-code-local.webp" srcset="https://guige.ai/p/ollama-local-dev/claude-code-local_hu_8293d8528b4e4587.webp 800w, https://guige.ai/p/ollama-local-dev/claude-code-local_hu_ba8dcb5692405d72.webp 1600w, https://guige.ai/p/ollama-local-dev/claude-code-local.webp 1920w" width="1920"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Codex、Claude Code 和 Hermes 接入本地模型" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="941" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/ollama-local-dev/codex-claude-hermes.webp" srcset="https://guige.ai/p/ollama-local-dev/codex-claude-hermes_hu_ebe3c6c4cfdeb503.webp 800w, https://guige.ai/p/ollama-local-dev/codex-claude-hermes_hu_f1d95a3b0e8c2050.webp 1600w, https://guige.ai/p/ollama-local-dev/codex-claude-hermes.webp 1672w" width="1672"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="接入-hermes-agent"&gt;接入 Hermes Agent
&lt;/h2&gt;&lt;p&gt;Hermes Agent 版本：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hermes Agent v0.12.0 (2026.4.30)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;快速启动：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ollama launch hermes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;也可以 oneshot 测试：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes --provider ollama &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -m gemma4:26b &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -z &lt;span class="s2"&gt;&amp;#34;请用三句话说明你当前是否在通过 Ollama 本地模型运行，并给一个开发建议。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;我本机能跑通。再用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;看到：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Model: gemma4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Provider: ollama-launch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这里有个细节：模型回答里可能说自己是 custom provider，但工具状态显示 &lt;code&gt;ollama-launch&lt;/code&gt;。所以验证 Agent 是否真的接入本地模型，不要只看模型自述，要看工具的 &lt;code&gt;status&lt;/code&gt; 或配置。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hermes 本地模型状态截图" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="1080" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/ollama-local-dev/hermes-local.webp" srcset="https://guige.ai/p/ollama-local-dev/hermes-local_hu_46d6eb2d1357671a.webp 800w, https://guige.ai/p/ollama-local-dev/hermes-local_hu_4759d992f5dbd81b.webp 1600w, https://guige.ai/p/ollama-local-dev/hermes-local.webp 1920w" width="1920"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="4090--gemma4-26b-实测"&gt;4090 + Gemma4 26B 实测
&lt;/h2&gt;&lt;p&gt;我写了一个 benchmark 脚本：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;content/post/ollama-local-dev/benchmark.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;它测试 5 类任务：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Case&lt;/th&gt;
 &lt;th&gt;目的&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Short chat&lt;/td&gt;
 &lt;td&gt;短对话&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Long Chinese output&lt;/td&gt;
 &lt;td&gt;长中文输出&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Code generation&lt;/td&gt;
 &lt;td&gt;代码生成&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Code review&lt;/td&gt;
 &lt;td&gt;代码审查&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Agent planning&lt;/td&gt;
 &lt;td&gt;Agent 规划&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;实测结果：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Case&lt;/th&gt;
 &lt;th style="text-align: right"&gt;总耗时&lt;/th&gt;
 &lt;th style="text-align: right"&gt;输出 tokens&lt;/th&gt;
 &lt;th style="text-align: right"&gt;输出速度&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;短对话&lt;/td&gt;
 &lt;td style="text-align: right"&gt;4.790s&lt;/td&gt;
 &lt;td style="text-align: right"&gt;697&lt;/td&gt;
 &lt;td style="text-align: right"&gt;165.93 tokens/s&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;长中文输出&lt;/td&gt;
 &lt;td style="text-align: right"&gt;18.728s&lt;/td&gt;
 &lt;td style="text-align: right"&gt;2785&lt;/td&gt;
 &lt;td style="text-align: right"&gt;160.84 tokens/s&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;代码生成&lt;/td&gt;
 &lt;td style="text-align: right"&gt;13.337s&lt;/td&gt;
 &lt;td style="text-align: right"&gt;1985&lt;/td&gt;
 &lt;td style="text-align: right"&gt;161.66 tokens/s&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;代码审查&lt;/td&gt;
 &lt;td style="text-align: right"&gt;14.430s&lt;/td&gt;
 &lt;td style="text-align: right"&gt;2143&lt;/td&gt;
 &lt;td style="text-align: right"&gt;161.16 tokens/s&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Agent 规划&lt;/td&gt;
 &lt;td style="text-align: right"&gt;13.631s&lt;/td&gt;
 &lt;td style="text-align: right"&gt;2028&lt;/td&gt;
 &lt;td style="text-align: right"&gt;161.48 tokens/s&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;长输出监控&lt;/td&gt;
 &lt;td style="text-align: right"&gt;24.020s&lt;/td&gt;
 &lt;td style="text-align: right"&gt;3554&lt;/td&gt;
 &lt;td style="text-align: right"&gt;159.79 tokens/s&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;结论很稳定：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Gemma4 26B 在这台机器上的持续输出速度约 160 tokens/s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img alt="本地推理性能仪表盘" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="941" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/ollama-local-dev/benchmark-dashboard.webp" srcset="https://guige.ai/p/ollama-local-dev/benchmark-dashboard_hu_b5432785d5043b2e.webp 800w, https://guige.ai/p/ollama-local-dev/benchmark-dashboard_hu_ef7de2d628236655.webp 1600w, https://guige.ai/p/ollama-local-dev/benchmark-dashboard.webp 1672w" width="1672"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="显存功耗和温度"&gt;显存、功耗和温度
&lt;/h2&gt;&lt;p&gt;模型加载后：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GPU Memory: 24527MiB / 49140MiB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Power: 72W
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Temp: 51C
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Process: /usr/local/bin/ollama
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;长输出期间用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nvidia-smi dmon -s pucvmet -c &lt;span class="m"&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;观察到：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;指标&lt;/th&gt;
 &lt;th style="text-align: right"&gt;数据&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;功耗&lt;/td&gt;
 &lt;td style="text-align: right"&gt;260-265W&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;温度&lt;/td&gt;
 &lt;td style="text-align: right"&gt;54-60C&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SM 利用率&lt;/td&gt;
 &lt;td style="text-align: right"&gt;82-87%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;显存占用&lt;/td&gt;
 &lt;td style="text-align: right"&gt;约 24529MB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;显存利用率&lt;/td&gt;
 &lt;td style="text-align: right"&gt;50-55%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;显存频率&lt;/td&gt;
 &lt;td style="text-align: right"&gt;10501 MHz&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;核心频率&lt;/td&gt;
 &lt;td style="text-align: right"&gt;2670-2685 MHz&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这说明推理确实主要在 GPU 上跑，而且负载不低。长时间跑 Agent 时，真正要关注的不只是 tokens/s，还有散热、风噪、电费和显存被其他任务抢占。&lt;/p&gt;
&lt;p&gt;&lt;img alt="系统监控摘要截图" class="gallery-image" data-flex-basis="544px" data-flex-grow="227" height="529" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/ollama-local-dev/btop-inference.webp" srcset="https://guige.ai/p/ollama-local-dev/btop-inference_hu_8be79f9a4ca7288f.webp 800w, https://guige.ai/p/ollama-local-dev/btop-inference.webp 1201w" width="1201"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="nvidia-smi dmon 监控截图" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="1080" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/ollama-local-dev/nvidia-smi-dmon.webp" srcset="https://guige.ai/p/ollama-local-dev/nvidia-smi-dmon_hu_3ae37218b0b7aca1.webp 800w, https://guige.ai/p/ollama-local-dev/nvidia-smi-dmon_hu_7ce71b247fb5ec8f.webp 1600w, https://guige.ai/p/ollama-local-dev/nvidia-smi-dmon.webp 1920w" width="1920"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一个容易误判的点thinking-也算-token"&gt;一个容易误判的点：thinking 也算 token
&lt;/h2&gt;&lt;p&gt;第一次烟测里，我只是问：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;用三句话解释 Ollama 是什么。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;但 API 返回里的 &lt;code&gt;eval_count&lt;/code&gt; 到了 887，因为模型生成了不少 thinking 内容。&lt;/p&gt;
&lt;p&gt;所以做 benchmark 时不要只看“用户看到多少字”。对推理耗时来说，模型实际生成的 token 才是成本，包括 thinking。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="适合怎么用"&gt;适合怎么用
&lt;/h2&gt;&lt;p&gt;我建议这样分工：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;场景&lt;/th&gt;
 &lt;th&gt;本地 Gemma4 26B 是否适合&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;私有代码解释&lt;/td&gt;
 &lt;td&gt;很适合&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;写脚本 / 小工具&lt;/td&gt;
 &lt;td&gt;很适合&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;生成测试样例&lt;/td&gt;
 &lt;td&gt;适合&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;初步 code review&lt;/td&gt;
 &lt;td&gt;适合&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;大型重构&lt;/td&gt;
 &lt;td&gt;谨慎&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;跨仓库复杂任务&lt;/td&gt;
 &lt;td&gt;不建议只靠本地&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;高风险生产改动&lt;/td&gt;
 &lt;td&gt;必须人工复核&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;最舒服的用法不是“让本地模型全自动开发完整系统”，而是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;本地模型负责高频、低风险、隐私敏感任务；
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;云端强模型负责低频、高难度、强推理任务。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img alt="本地模型能力边界" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="941" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/ollama-local-dev/local-ai-boundary.webp" srcset="https://guige.ai/p/ollama-local-dev/local-ai-boundary_hu_f7888c35499b88c9.webp 800w, https://guige.ai/p/ollama-local-dev/local-ai-boundary_hu_75fe98b77b5f6774.webp 1600w, https://guige.ai/p/ollama-local-dev/local-ai-boundary.webp 1672w" width="1672"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="takeaway"&gt;Takeaway
&lt;/h2&gt;&lt;p&gt;回顾一下，搭一个能用于开发的本地 AI 环境，只需要四步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用 Ollama 拉取模型：&lt;code&gt;ollama pull gemma4:26b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;用 API 或 CLI 确认模型能稳定对话&lt;/li&gt;
&lt;li&gt;把 Codex、Claude Code、Hermes 接到 &lt;code&gt;localhost:11434&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;用 tokens/s、显存、功耗、温度和 Agent 成功率一起评估体验&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这次实测最重要的结论不是“4090 很快”，而是：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;本地模型的下限已经很高，但上限取决于工具链。&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;Claude Code 能顺利读取文件，Codex 在同一环境里被 sandbox 卡住，Hermes 能跑通但 provider 映射要核验。这才是真实的本地 AI 开发体验：模型只是发动机，方向盘、刹车和路况一样重要。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="参考资料"&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.ollama.com/library/gemma4" target="_blank" rel="noopener"
 &gt;Ollama Gemma4 模型页&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.ollama.com/openai" target="_blank" rel="noopener"
 &gt;Ollama OpenAI-compatible API 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.ollama.com/integrations/codex" target="_blank" rel="noopener"
 &gt;Ollama Codex 集成文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.ollama.com/integrations/claude-code" target="_blank" rel="noopener"
 &gt;Ollama Claude Code 集成文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.ollama.com/integrations/hermes" target="_blank" rel="noopener"
 &gt;Ollama Hermes Agent 集成文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>