网易首页 > 网易号 > 正文 申请入驻

ollama v0.23.3 发布:MLX 性能优化、安全加固与传输并发控制

0
分享至




引言

2026年5月12日,Ollama 团队正式发布了 v0.23.3 版本。本次更新虽然只有 6 个 commit,但涉及 MLX 推理引擎优化、应用更新机制安全加固、传输并发控制、测试体系完善等多个关键领域。本文将基于官方发布说明,逐条解析本次更新的技术细节和实际影响。

一、版本概览

  • 版本号:v0.23.3

  • 发布日期:2026年5月12日

  • 提交数量:6 commits

  • 文件变更:40 个文件

  • 代码行数:+3,621 行 / -433 行

  • 贡献者:2 人

本次更新延续了 Ollama 在 Apple Silicon 平台上的深度优化路线,同时对安全性和网络传输效率做出了重要改进。

二、MLX 后端优化(核心亮点) 2.1 精细化模型推送行为

本次更新对 MLX 后端的模型推送逻辑进行了细化。这次改进主要解决了在推送 safetensors 格式模型时的行为一致性问题,确保推送操作与拉取操作遵循相同的状态转换规则,减少了因状态不一致导致的部分上传失败场景。

2.2 图像生成 Runner 的线程亲和性优化

针对 MLX 在 macOS 上的图像生成功能,本次添加了线程亲和性设置。这是一项针对 Apple Silicon 异构核心架构(性能核心与能效核心)的性能优化措施。通过将计算密集型任务绑定到高性能核心,避免调度器将其误分配到效率核心,显著提升了图像生成任务的推理速度和响应一致性。对于使用 MLX 后端进行图像生成的用户,这一改进会带来可感知的生成速度提升。

2.3 推理过程中的状态超时规避

在长时间推理任务中,MLX runner 可能出现状态更新超时的问题,导致进程被错误终止。本次更新通过调整状态报告机制,确保在长时间生成任务中状态信号能够持续发送,避免了因静默期过长而触发的超时误判。这一修复对大上下文长度生成和多轮对话场景尤为关键。

2.4 macOS 26 部署目标泄漏修复

在构建 v3 metallib 时,MLX 编译过程会泄漏 macOS 26 的部署目标设置,导致生成的二进制库包含不受支持的平台标记。构建脚本中新增了重新链接 metallib 的步骤:首先收集所有.air文件,然后使用xcrun -sdk macosx metallib重新链接,最后覆盖原始的mlx.metallib。这一修复确保了 MLX 库与 macOS 14.0 及以上版本的兼容性。

三、应用更新机制安全加固 3.1 更新流程的安全性增强

本次更新对app/updater包进行了全面重构,主要解决了路径遍历漏洞和文件名注入风险:

安全路径处理:新增updateStagePath函数,使用 SHA256 对 ETag 进行哈希处理,防止恶意构造的 ETag 或Content-Disposition中的文件名导致路径逃逸。经过哈希处理的 ETag 目录名类似a1b2c3...,无法包含../等路径遍历字符。

文件名安全验证:新增safeUpdateFilename函数,拒绝以下危险模式:

  • • 空文件名或纯空白字符串

  • ...相对路径

  • • 绝对路径(Unix 或 Windows)

  • • 包含\/:等路径分隔符

  • filepath.Base与原始文件名不匹配的情况

目录逃逸防护:新增ensurePathInDir函数,验证解析后的路径始终在指定的 stage 目录内,防止符号链接或相对路径组合导致的逃逸。

3.2 macOS 应用包验证增强

路径范围约束:在解压更新包时,新增bundleEntryPath函数要求所有解压条目必须在Ollama.app目录内(或者对于带 archive root 的包,必须在解压后的根目录内)。任何试图跳出应用包目录的条目都会被拒绝。

符号链接安全验证:新增validBundleLinkTarget函数,拒绝以下符号链接:

  • • 空链接目标

  • • 绝对路径

  • • 包含..组件且跳出应用包目录

  • • 指向应用包外部的任何路径

测试覆盖:新增了针对各种恶意构造的更新包的测试用例,包括路径逃逸、绝对符号链接、相对符号链接逃逸等场景。

3.3 Windows 安装程序签名验证

本次更新为 Windows 平台添加了安装程序数字签名验证:

WinVerifyTrust 调用:使用 Windows 的WinVerifyTrustExAPI 验证安装程序的 Authenticode 签名,确保更新包确实由 Ollama Inc. 签名且未被篡改。

签名者证书提取:通过CryptQueryObjectCryptMsgGetParam从 PKCS 签名中提取签名者证书信息,验证证书的组织名称是否为 "Ollama Inc."。

集成到升级流程:在DoUpgradeAtStartupDoUpgrade中都会调用VerifyDownload,如果验证失败,会删除损坏的更新包并返回错误,防止执行未签名的代码。

3.4 测试框架增强

实时更新测试:新增updater_live构建标签,允许运行真实的端到端更新测试。该测试会从 ollama.com 的正式更新端点下载当前操作系统的更新包,验证整个下载、验证、暂存流程。

单元测试覆盖:新增针对路径逃逸、不安全文件名、恶意 ETag、符号链接验证等场景的单元测试。

四、传输层并发控制 4.1 新增环境变量 OLLAMA_MAX_TRANSFER_STREAMS

本次更新引入了一个新的环境变量OLLAMA_MAX_TRANSFER_STREAMS,用于控制 safetensors 格式模型拉取和推送时的并发传输流数量。

默认值:4

作用:限制同时进行的带有请求体的 HTTP 传输数量,避免在较慢的家庭网络上过度占用带宽导致网络拥塞。这一设置不影响 GGUF 格式模型的传输(仍使用传统的上传/下载路径)。

代码集成:在server/images.gopullWithTransferpushWithTransfer函数中将BodyConcurrency设置为max(1, int(envconfig.MaxTransferStreams())),确保至少有 1 个并发流。

4.2 Transfer 包的并发控制重构

x/transfer/download.go中,新增了bodySem信号量字段和holdBody方法:

func (d *downloader) holdBody(ctx context.Context) (func(), error) {
if d.bodySem == nil {
return func() {}, nil
}
if err := d.bodySem.Acquire(ctx, 1); err != nil {
return nil, err
}
return func() { d.bodySem.Release(1) }, nil
}

Token 管理的线程安全:将原来的*stringtoken 指针改为带读写锁保护的string字段,新增authToken读取方法和refreshToken方法,确保在多个并发 goroutine 同时收到 401 响应时,只有一个会执行实际的 token 刷新操作。

下载摘要日志:在下载完成后输出统计信息,包括 blob 数量、下载字节数、耗时和传输速率,方便排查性能问题。

五、测试体系完善 5.1 CI 工作流改进

.github/workflows/test.yaml中新增了app_changed输出,用于检测app/**目录的变更。当应用代码发生变化且运行在 macOS 或 Windows 平台时,会执行带有updater_live标签的测试:

- name:gotestappwithliveupdatertag
if:${{needs.changes.outputs.app_changed=='True'&&contains(fromJSON('["macos-latest","windows-latest"]'),matrix.os)}}
run:gotest-count=1-tagsupdater_live ./app/...
5.2 集成测试优化

Token 管理修复:在envconfig/test_home_test.goserver/test_home_test.go中添加t.Setenv("OLLAMA_MODELS", ""),避免测试间环境变量污染导致的 token 验证失败。

错误信息改进:在integration/api_test.go中,将错误输出从打印Messages结构改为调用summarizeMessages函数,该函数会截断图片数据的完整内容,避免日志中出现超长的整数数组。

超时调整:针对TestUnicodeTestLongInputContext等慢速测试增加了超时时间,适应 GPU 负载不足时的性能波动。

新增辅助函数

  • skipIfMLXUnsupported:检测 MLX 不支持的错误信息,在非 Apple Silicon 平台上跳过测试

  • skipIfModelTooLargeForVRAM:检查模型大小是否超过 OLLAMA_MAX_VRAM 的 75%,超过则跳过

  • containsEmoji:用于验证故事生成测试中是否包含表情符号

5.3 模型测试集更新

更新了多个测试模型列表:

  • 聊天模型:新增nemotron3:33blaguna-xs.2:q4_K_Mgemma4

  • MLX 模型:新增laguna-xs.2:nvfp4qwen3.5:2b-nvfp4gemma4:e2b-nvfp4

  • 视觉模型:新增nemotron3:33bgemma4

  • 工具调用模型:新增nemotron3:33blaguna-xs.2gemma4

六、命令行界面优化 6.1 环境变量文档格式化

cmd/cmd.go中,将环境变量文档的输出宽度从 24 字符调整为 27 字符,使得较长的变量名(如OLLAMA_MAX_TRANSFER_STREAMS)能够完整显示,改善了ollama help命令的可读性。

6.2 环境变量注册

envconfig/config.go中注册了OLLAMA_MAX_TRANSFER_STREAMS变量,包含描述信息:"Maximum parallel transfer streams for safetensors model pulls/pushes (default 4)"。

同时更新了环境变量映射表,统一调整了各变量名的对齐格式。

七、服务端错误处理优化 7.1 流式响应中的错误传递

server/routes.gohandleImageGenerate函数中,改进了流式响应中的错误处理逻辑:

原行为:如果流已经开始但后续生成失败,只能返回 200 状态码并在响应体末尾附加错误信息,客户端可能无法正确解析。

新行为:当isStreaming为 true 但streamStarted为 false 时,仍然返回 JSON 错误响应;当流已经开始后发生错误,会输出一个 JSON 格式的错误行并刷新缓冲区:

data, _ := json.Marshal(gin.H{"error": err.Error()})
c.Writer.Write(append(data, '\n'))
c.Writer.Flush()

这使得客户端能够正确区分正常的流结束和异常错误。

7.2 图像生成错误测试

新增server/routes_generate_test.go,包含两个测试用例:

  • TestImageGenerateStreamFalseErrorAfterProgress:非流式请求在发送进度后发生错误,验证返回 500 状态码

  • TestImageGenerateStreamingErrorAfterProgress:流式请求在发送进度后发生错误,验证先输出进度数据再输出错误行

八、MLX Runner 状态缓存机制 8.1 内存状态缓存

x/mlxrunner/status_memory.go中新增statusMemoryCache结构,用于缓存 MLX 的内存使用状态,避免每次健康检查都阻塞等待 MLX 工作线程:

核心特性

  • • 异步刷新:后台 goroutine 每 50ms 刷新一次内存统计

  • • 等待超时:如果刷新未及时完成,返回缓存值而不阻塞健康检查

  • • 并发安全:使用互斥锁保护共享状态

  • • 上下文取消:检测到 context 完成时立即退出

内存读取封装:在x/mlxrunner/server.go中,将内存读取操作改为通过mlxthread.Call在工作线程中执行,同时使用缓存机制减少调用频率。

8.2 工作线程生命周期管理

x/imagegen/runner.go中,图像生成 runner 也集成了新的线程管理机制:

MLX 初始化:通过mlxthread.Start启动工作线程,在专用的 goroutine 中执行 MLX 初始化操作。

请求串行化:每个图像生成请求通过s.mlxThread.Do在工作线程中执行,确保 MLX 操作不会并发执行导致状态冲突。

优雅关闭:在服务关闭时调用worker.Stop,并传入清理函数mlx.ClearCache,等待正在进行的操作完成后释放资源。

九、传输层测试覆盖率提升

本次更新对x/transfer包进行了大规模测试重构(transfer_test.go变更有 +1,062/-83 行),主要新增和改进了以下测试场景:

  1. 1.下载并发控制测试:验证BodyConcurrency参数能够正确限制并发的 body-bearing 请求数量

  2. 2.Token 刷新竞态测试:模拟多个并发请求同时收到 401 响应,验证只有一个 token 刷新请求被执行

  3. 3.上传路径遍历防护测试:验证恶意构造的文件名无法逃出暂存目录

  4. 4.大文件断点续传测试:验证 HTTP Range 请求在部分下载后能够正确恢复

  5. 5.分片上传回退测试:测试当服务器要求分片上传时的兼容性路径

十、实际应用建议 10.1 Apple Silicon 用户

如果你使用 macOS 且主要运行 safetensors 格式模型(如 MLX 优化版本),建议:

  • • 升级后验证图像生成功能的性能提升

  • • 检查长时间推理任务是否不再出现超时错误

10.2 网络受限环境

如果你的 Ollama 服务运行在家庭宽带或移动网络环境下:

  • • 设置OLLAMA_MAX_TRANSFER_STREAMS为 2 或更小的值,避免网络拥塞

  • • 观察模型拉取/推送时的带宽占用情况,按需调整

10.3 Windows 用户

如果你在 Windows 上运行 Ollama 并启用了自动更新:

  • • 新版本会自动验证更新包的数字签名

  • • 如果更新失败,请检查安装程序是否被第三方安全软件拦截

10.4 自建 Ollama 服务的开发者

如果你维护自定义的 Ollama 构建或镜像:

  • • 注意更新机制中的路径验证逻辑变更,确保自定义更新 URL 返回的Content-DispositionETag符合安全要求

  • • MLX 构建过程新增了 metallib 重新链接步骤,请更新构建脚本

结语

代码地址:github.com/ollama/ollama

Ollama v0.23.3 是一个以稳定性和安全性为主的维护版本。MLX 后端的多项优化显著改善了 Apple Silicon 平台上的推理体验,更新机制的加固为用户提供了更安全的自动升级保障,而传输并发控制的引入则为受限网络环境下的模型分发提供了灵活调整空间。建议所有用户升级到此版本,特别是 macOS 用户和启用了自动更新的 Windows 用户。

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
失业的沪上中产阶级:从星巴克集体退场,涌入党群服务中心

失业的沪上中产阶级:从星巴克集体退场,涌入党群服务中心

将军箭
2026-08-03 17:22:26
邹市明和冉莹颖开的拳馆,前员工甩出账目明细:300万水晶灯来自表弟,800万装修进了表妹公司,450万安保费包给外甥,70万绿植钱归亲哥

邹市明和冉莹颖开的拳馆,前员工甩出账目明细:300万水晶灯来自表弟,800万装修进了表妹公司,450万安保费包给外甥,70万绿植钱归亲哥

背包旅行
2026-07-31 11:39:46
天津之眼母子救人溺亡!路人视角回顾整件事过程,并不是因弟弟而起!

天津之眼母子救人溺亡!路人视角回顾整件事过程,并不是因弟弟而起!

王老师你还好吗
2026-08-08 04:39:02
3500万镑“骗局”!曼联抄底8000万级中场,这价格你敢信?

3500万镑“骗局”!曼联抄底8000万级中场,这价格你敢信?

曹老师评球
2026-08-08 09:38:00
曼晚:马雷斯卡将亲自掌控球队,不让球员投票选出下一任队长

曼晚:马雷斯卡将亲自掌控球队,不让球员投票选出下一任队长

懂球帝
2026-08-08 20:37:43
“老人天天吃保心丸,孩子病倒在酒店!” 16万高端河轮游,变每天赶大巴拉练,游轮公司道歉

“老人天天吃保心丸,孩子病倒在酒店!” 16万高端河轮游,变每天赶大巴拉练,游轮公司道歉

21世纪经济报道
2026-08-08 00:22:16
四野顶级悍将刚牺牲,好兄弟却强娶其遗孀,竟然还要求孩子随他姓

四野顶级悍将刚牺牲,好兄弟却强娶其遗孀,竟然还要求孩子随他姓

睡前讲故事
2026-07-18 16:28:27
张继科事件升级!涉事人员工作不保仅开胃菜,更严重的还在后面

张继科事件升级!涉事人员工作不保仅开胃菜,更严重的还在后面

枫尘余往逝
2026-08-07 20:44:29
特朗普已做好开战准备?王毅曾警告:一旦中美冲突,结局只剩一个

特朗普已做好开战准备?王毅曾警告:一旦中美冲突,结局只剩一个

国际风云录
2026-08-08 00:09:45
阿森纳官宣28岁纽卡队长加盟!签约4年+周薪25万镑 转会费7500万

阿森纳官宣28岁纽卡队长加盟!签约4年+周薪25万镑 转会费7500万

我爱英超
2026-08-08 19:07:00
从谣言到官宣:《蜘蛛侠4》琴·葛蕾登场,萨迪·辛克谈X战警未来

从谣言到官宣:《蜘蛛侠4》琴·葛蕾登场,萨迪·辛克谈X战警未来

浅遇时光
2026-08-08 00:48:47
冠军赛爆大冷!4强诞生,国乒大胜,19岁小将决赛,松岛惊天逆转

冠军赛爆大冷!4强诞生,国乒大胜,19岁小将决赛,松岛惊天逆转

帛河体育
2026-08-08 16:06:06
太狠了!雷州通报特教招聘违规处理:副校长撤职,老师连降6级

太狠了!雷州通报特教招聘违规处理:副校长撤职,老师连降6级

教育人看世界
2026-08-07 21:57:57
票房不到2000万,预计亏损超2亿,没有哪吒,这块金字招牌失灵

票房不到2000万,预计亏损超2亿,没有哪吒,这块金字招牌失灵

影视高原说
2026-08-07 17:21:26
香港保险业联会回应:内地对境外保单收益征收20%个人所得税为不实消息

香港保险业联会回应:内地对境外保单收益征收20%个人所得税为不实消息

赖博士说
2026-08-08 16:45:16
反转!重庆游客睡车上伊犁酒店收150元后续:游客隐瞒事实,酒店方发声,大喊无辜

反转!重庆游客睡车上伊犁酒店收150元后续:游客隐瞒事实,酒店方发声,大喊无辜

李晚书
2026-08-07 13:25:23
噩耗传来!梅西父亲离世,终年68岁!一个钢铁厂工人的无限托举:他用大半生,把儿子送上世界之巅

噩耗传来!梅西父亲离世,终年68岁!一个钢铁厂工人的无限托举:他用大半生,把儿子送上世界之巅

华人生活网
2026-08-09 00:32:25
中方不救的话,日元一旦崩盘,美债也要完蛋?最大接盘国已被逼出

中方不救的话,日元一旦崩盘,美债也要完蛋?最大接盘国已被逼出

牛锅巴小钒
2026-08-08 12:54:10
男女混打!NBA首轮16号秀!宣布参加WNBA选秀大会

男女混打!NBA首轮16号秀!宣布参加WNBA选秀大会

篮球教学论坛
2026-08-08 18:30:21
儿科医生韩杰漏诊被判刑,周兆成:谈谈医疗事故罪边界,悲剧不应只有单向追责!

儿科医生韩杰漏诊被判刑,周兆成:谈谈医疗事故罪边界,悲剧不应只有单向追责!

周兆成律师
2026-08-08 12:26:09
2026-08-09 03:08:49
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1382文章数 78关注度
往期回顾 全部

科技要闻

SpaceX最快下周完成600亿美元收购Cursor

头条要闻

十多万人报名的考试成绩全作废 考生:为何让别人买单

头条要闻

十多万人报名的考试成绩全作废 考生:为何让别人买单

体育要闻

蓉城0-1玉昆 中超6轮不胜仍13分领跑 奥斯卡头球制胜+赛季16球

娱乐要闻

萧敬腾坦白!与大14岁妻子选择丁克

财经要闻

一枚“回旋镖”,击中王思聪

汽车要闻

华为乾崑+大六座 星海V6预售8.99万元起

态度原创

本地
时尚
亲子
数码
军事航空

本地新闻

课本里的童年,绍兴正上演

立秋之后,穿最浪漫的裤子去散步

亲子要闻

这年头孩子太聪明了,大人都被套路了

数码要闻

Linux 7.3给苹果用户画饼:M3 Pro/Max/Ultra能开机了 但GPU还是摆设

军事要闻

伊朗公布“被击落的美以战机残骸”

无障碍浏览 进入关怀版