ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SemIf 原生 MLX CLI 实战:Apple Silicon 终端录制重放、复现命令与决策输出解读

SemIf 原生 MLX CLI 实战:Apple Silicon 终端录制重放、复现命令与决策输出解读 【免费下载链接】SemIfSemantic ifs from open models, on a 3090 at home. Independent; not affiliated with Jev or TypeSafe.项目地址https://gitcode.com/gh_mirrors/op/SemIf点击查看免费下载SemIfSemantic ifs from open models在 Apple Silicon 上通过原生 MLX 后端可在 Metal GPU 上对 Qwen3.5-4B 等开源模型执行 direct / serial / shared 三种决策评分模式。本文以 docs/media/README.md 记录的 CLI 演示为中心讲解如何在本地重放这段 asciicast 终端录制、用semif-score精确复现同一条推理命令并逐字段解读保存下来的 JSONL 输出帮助你理解模型打分与生成式回答之间的本质区别以及 SemIf 推理结果的校验边界。一段可重放的终端录制openjev-mlx.cast仓库的 docs/media 目录保留了一份真实的 CLI 演示录制而非模拟的终端动画openjev-mlx.castasciicast v2 格式记录的是实际进程的真实输出与时间戳。下载后用asciinema play openjev-mlx.cast即可在本地终端中逐帧重放openjev-mlx.png在 asciinema-player 3.17.0 中渲染的浏览器截图展示录制完成后的最终画面适合快速预览openjev-mlx-results.jsonl本次运行真实保留下来的 CLI 输出包含模型 revision、源文件哈希、概率与计时元数据——它不是演示脚本生成的假数据。四个文件的 SHA-256 校验和记录在同目录的 SHA256SUMS 中cd docs/media shasum -a 256 -c SHA256SUMS捕获环境与软件栈录制于 2026-09-17具体环境如下均记录于 docs/media/README.md维度取值硬件Apple M5 Max128 GiB 统一内存计算后端MetalMLXMLX0.32.2MLX-LM0.32.0源码 pin 至 commita63e24c389382619eb6d9af656e3b46024be217a被测代码commit56e7ce2a38214137f476d2444e9193f72dcbb4ab位于 configurable-cache 后续改动之前分配器缓存未改动的默认值 256 MiB输入 fixtureexamples/decisions.jsonl关于版本 pinpyproject.toml 的mlxextra 有严格约束mlx0.32.2以及从github.com/ml-explore/mlx-lm.git指定 commit 安装的mlx-lm仅 macOS arm64 平台生效。docs/MLX.md 进一步说明该 pin 包含了上游 Qwen 循环 q/k 归一化修复——0.31.3 版本对 L2 epsilon 的应用存在错误。这意味着复现时必须安装 Git 并在隔离环境内完成否则版本漂移会直接影响概率输出。输入数据examples/decisions.jsonl 的结构本次录制使用仓库自带的 3 行决策样例作为输入每行是一个 JSON 对象包含四个字段id决策唯一标识state证据/上下文结构化状态可直接替换为任意 JSON 对象question要判断的问题options候选选项数组每项含id与description。{id:support-1,state:The deployment completed at 14:02 UTC. Health checks passed in all three zones. No rollback was initiated.,question:Is there evidence that the deployment succeeded?,options:[{id:yes,description:The deployment succeeded.},{id:no,description:The deployment did not succeed.},{id:insufficient,description:The evidence is insufficient to decide.}]}其余两行分别为路由分类route-1三个支持队列与策略判定policy-1是否需要变更工单。这类状态 问题 选项的 JSONL 结构贯穿 SemIf 的评测与基准相关数据还可见 benchmarks/data 下更大的 authored144 与 shape777 语料。复现命令从安装到打分录制保留的是项目更名前的 OpenJev 命令当前 SemIf checkout 使用semif-score。完整复现步骤来自 docs/MLX.md 的安装说明与 docs/media/README.md 的运行命令# 1) 在 Apple Silicon MacMetal 可用上创建隔离环境 python3 -m venv .venv source .venv/bin/activate pip install -e .[test,mlx] # 2) 从仓库根目录运行与录制等价的打分命令 semif-score --backend mlx --mode direct \ --model Qwen/Qwen3.5-4B \ --revision 851bf6e806efd8d0a36b00ddf55e13ccb7b8cd0a \ --input examples/decisions.jsonl \ --output results-mlx-demo.jsonl录制画面中的输出路径被缩写显示为new demo output实际运行时请为每次运行指定一个全新的输出文件——src/semif_phase1/cli.py 会拒绝覆盖已存在的输出Output must be new中断的运行也只会留下部分证据而不会被静默重写。该命令的关键参数及其在源码中的校验逻辑如下参数含义源码约束cli.py--backend mlx使用原生 MLX 后端默认是 torch--mlx-bits/--mlx-cache-limit-mib必须搭配 mlx--mode direct直接模式可选 direct / serial / sharedmlx 不支持 rerankerCUDA-only--modelHugging Face 模型 ID本演示固定为 Qwen/Qwen3.5-4B--revision远程必须为 40 位十六进制 commit见mlx_backend.load_model的正则校验--input/--output输入 JSONL 与新建输出 JSONL输出必须不存在max-tokens必须为正--max-tokens提示长度上限默认 4096超限直接报错不做截断录制时的运行前提录制环境特意满足以下条件checkpoint 已提前缓存到 Hugging Face 缓存目录、网络访问被禁用、下载进度条被抑制。因此录制的6.36 秒 wall time 包含模型加载与哈希计算是一次冷启动 推理的完整 CLI 演示而不是吞吐量基准吞吐数据请参考 results/mlx/README.md 中专门的 benchmark 套件。首次在本地运行时模型会被下载权重约 9 GB 磁盘占用来源 checkpoint 含视觉权重MLX-LM 的原生 sanitizer 会将其从文本模型中剔除GPU 执行还需额外内存基准精度为 BF16 部分 FP32 参数。输出结果逐字段解读录制保存的 openjev-mlx-results.jsonl 每行对应一条决策字段结构如下以support-1为例{id: support-1, option_ids: [yes, no, insufficient], probabilities: [0.9996297356502826, 0.00013978985022442624, 0.0002304744994929966], option_logits: [28.0, 19.125, 19.625], answer_token_ids: [32, 33, 34], input_tokens: 142, input_ids_sha256: 9c7ed3f4..., prompt_sha256: 7ac35785..., prompt_version: direct-options-v1, model: {source: Qwen/Qwen3.5-4B, revision: 851bf6e8..., backend: mlx, mlx_version: 0.32.2, mlx_lm_version: 0.32.0, transformers_version: 5.17.0, mlx_lm_source: {url: https://github.com/ml-explore/mlx-lm.git, vcs_info: {commit_id: a63e24c3...}}, allocator_cache_limit_bytes: 268435456, dtype: [mlx.core.bfloat16, mlx.core.float32], quantization: null, source_artifact_sha256: {chat_template.jinja: ..., config.json: ..., model.safetensors-00001-of-00002.safetensors: ..., ...}}, readout: native last-position logits restricted to declared answer slots; no generated tokens, probability_status: conditional option score; uncalibrated as decision confidence, forward_seconds: 0.18635591678321362, total_seconds: 0.19601654214784503}需要重点理解的部分概率与 logitsprobabilities是各选项的 softmax 归一化结果option_logits是模型词汇表最后一位置last-positionlogits 中、仅对声明选项槽位取值后的原始值。answer_token_ids对应三个答案槽位的 token id32/33/34即字母选项由_slot_ids保证每个字母必须是往返一致的单 token见 src/semif_phase1/direct.py。readout 字段明确说明这是原生最后位置 logits 限定到声明答案槽位未生成任何 token。SemIf 的 direct 模式从不调用模型生成回答而是直接读 logits——这是它与让模型写 yes/no 数组这类生成式方案的本质区别相关对比实验见 benchmarks/decision_vs_generation.py。概率状态conditional option score; uncalibrated as decision confidence——这些分数是在给定选项前提下的条件得分不是经过校准的决策置信度不能直接当作概率意义上的可信度使用。溯源字段prompt_sha256与input_ids_sha256保证提示文本与输入 token 可复验model子对象记录了运行时的 MLX / MLX-LM / transformers 版本、MLX-LM 的源码 commit、分配器缓存上限256 MiB × 1024² 268435456 字节、参数 dtype 集合以及每个源文件config.json、safetensors、tokenizer 等的 SHA-256 哈希。这些字段由 src/semif_phase1/mlx_backend.py 的load_model在加载时生成。计时字段forward_seconds是模型前向耗时total_seconds含编码等完整单行耗时。录制内三行分别为 0.196 / 0.0587 / 0.0500 秒total仅是单次直接评分的耗时参考。录制画面中的表格录制屏幕上的小表格为展示层数据它选取每一行的最大记录概率1.0000为四舍五入到四位小数的显示值其数据来源就是上述保存的 JSONL不涉及额外推理。三行的最大概率分别为id最大概率选项概率原文保留精度support-1yes0.9996297route-1account_access0.9999798policy-1not_required0.9379848从录制到三种评分模式与缓存正确性录制只演示了--mode direct但同一 MLX 后端还支持--mode serial连续相同状态复用前缀缓存与--mode shared全部行共享同一精确状态时单次 prefill 批量后缀前向。其实现要点src/semif_phase1/mlx_backend.pyQwen3.5 是注意力历史 循环卷积/delta 状态的混合架构serial 模式为每个问题copy.deepcopy整个原生前缀缓存分支状态绝不复用进另一个问题shared 模式将原生缓存按行复制entry.merge对后缀做右填充并通过prepare(lengths..., right_padding...)告知循环缓存每个后缀的真实长度最后只读取每个后缀的最后一个真实 token——填充 token 不会影响因果注意力结果缓存命中以精确的 prefix token id为键调用方若修改了之前传入的 JSON 对象状态不会意外命中过期缓存。test_mlx.py 用一个小型真实 Qwen3.5 混合模型无需下载权重覆盖了变长后缀、问题乱序、重复调用、状态变更与非法输入等回归场景验证三种模式的分数一致性。两条实用的 MLX 调参项详见 docs/MLX.md--mlx-bits 8/--mlx-bits 4在内存中做 group size 64 的确定性仿射量化不落盘新权重但会改变概率必须与未量化 BF16 运行分开评估--mlx-cache-limit-mib 512把 MLX 非活跃分配缓存从默认 256 MiB 调大0表示禁用。这是进程级分配器设置用来避免 MLX 默认近乎吞掉全部系统内存录制所在机器的相关经验见 results/mlx/README.md初始约 122 GiB 的非活跃缓存限制曾导致完整工作负载退出限制到 256 MiB 后全部完成。历史命名与更名说明这段录制属于历史证据保留了项目更名前的OpenJev命令与名称当前 SemIf checkout 的统一入口是semif-score注册于 pyproject.toml 的[project.scripts]。如果你在阅读 docs/MLX.md、results/mlx/README.md 或 benchmark 输出时看到 OpenJev 字样均属历史命名的有意保留。进一步验证与阅读复现完整基准python benchmarks/mlx_benchmark.py --suite all --output results/mlx/my-bf16quantization / precision-probe 用法见 docs/MLX.md 的 Reproduce 一节校验保留证据python benchmarks/mlx_evidence.py results/mlx/UNCOMPRESSED_SHA256SUMS与python benchmarks/verify_mlx.py results/mlx/my-bf16Apple Silicon 双后端对比PyTorch/MPS vs MLX见 docs/APPLE_SILICON.md实测的 BF16 / Q8 / Q4 运行目录见 results/mlx/README.md。一句话总结本文的实践要点semif-score --backend mlx是在 Apple Silicon 上复现 SemIf 决策打分的最短路径而readout与probability_status两个字段时刻提醒我们——这些概率是限定选项条件下的条件得分未生成 token、未经校准只能作为决策信号而非绝对置信度使用。赞分享【免费下载链接】SemIfSemantic ifs from open models, on a 3090 at home. Independent; not affiliated with Jev or TypeSafe.项目地址https://gitcode.com/gh_mirrors/op/SemIf点击查看免费下载相关推荐SemIf 在 Apple Silicon 上的运行指南PyTorch/MPS 与原生 MLX 双后端实战SemIf 在 Apple Silicon 上的运行指南PyTorch/MPS 与原生 MLX 双后端实战 SemIf 提供两条 Apple SiliconSemIf Apple Silicon MLX 实测证据全解读M5 Max 上 BF16/Q8/Q4 的精度、吞吐与可复现校验SemIf Apple Silicon MLX 实测证据全解读M5 Max 上 BF16/Q8/Q4 的精度、吞吐与可复现校验 本指南以 SemIf 仓库 rSoup 0.75.0 修复解读soup doctor 正确报告 Apple Silicon MLX 后端Soup 0.75.0 修复解读 soup doctor 正确报告 Apple Silicon MLX 后端 导读 在 Soup 0.75.0 中 变更记录人工智能大模型微调LoRACLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表