打開 macOS 快取一看:ChatGPT 桌面版偷偷塞了一整套 LibreOffice
simonwillison.net · 2026-09-02
Simon Willison 在 2026 年 9 月 1 日用磁碟空間分析工具 OmniDiskSweeper 檢查自己 Mac 的 ~/.cache/ 目錄時,發現 OpenAI 的 Codex 桌面應用程式(現已併入 ChatGPT app)在背地裡快取了一整套 LibreOffice 安裝檔案。整個 codex-runtimes 快取資料夾吃掉 1.7GB 磁碟空間,光是 LibreOffice 元件就佔了 429.7MB。他把這次調查寫成一篇貼文,翻出了 AI 桌面工具為了讓模型「動手操作」文件,背後藏了多少非模型本體的執行環境。
快取資料夾裡到底裝了什麼
Willison 追蹤的路徑是 ~/.cache/codex-runtimes/codex-primary-runtime/,底下的 dependencies/ 資料夾裡塞的不只 LibreOffice。完整清單涵蓋好幾套獨立的執行環境,全部收在 dependencies/native/ 之下,等於把好幾套完整的開發/文件處理工具鏈整包複製進沙箱。
- Node.js — 446.4MB
- Python — 440.6MB
- LibreOffice — 429.7MB
- Poppler(PDF 處理函式庫)— 187.9MB
- git — 148.1MB
為什麼要塞整套辦公軟體
答案藏在另一個路徑裡:codex-primary-runtime/plugins/openai-primary-runtime/plugins/documents/。這個資料夾裡的「skills」設定檔,作用是告訴 Codex 背後的模型該怎麼找到、呼叫這些二進位檔案。換句話說,當使用者請模型處理一份 Word 文件或試算表時,Codex 並不是呼叫使用者電腦上已經裝好的 Office 軟體,而是直接呼叫沙箱裡自帶的那套 LibreOffice 命令列工具去做轉檔、解析。
這種做法背後的邏輯不難理解:沙箱環境無法假設使用者電腦上裝了什麼,要保證「讀寫 Office 文件」這個功能在任何一台機器上都能穩定運作,最保險的方式就是把整套工具鏈打包進執行環境,而不是依賴系統既有安裝。代價是應用程式的磁碟體積因此暴增到 GB 等級,光是執行環境本身的快取就逼近 2GB,還沒算上模型本體或使用者的實際檔案。
這篇貼文本身沒有太多評論,主要就是把挖出來的檔案結構和大小攤開來給讀者看,屬於典型的「工程師好奇心驅動的檔案系統考古」,任何用過磁碟空間分析工具的人都能重現同樣的調查過程。
原始來源:simonwillison.net
Wasmi 2.0 如何用累加器暫存器把 WebAssembly 直譯器榨出 2.2 倍效能
wasmi-labs.github.io · 2026-09-01
WebAssembly 直譯器專案 Wasmi 在 2026 年 9 月 1 日發布 2.0.0 版,維護團隊公開了完整的效能改造過程:重寫指令分派機制、導入累加器暫存器、修掉一個因 Rust 編譯器優化導致的分支預測劣化 bug。三者疊加後,整體效能在 Apple M2 Pro 上以 wasmi-benchmarks 的 geometric mean 計算,比 1.0 版快了 2.2 倍。
背景:WebAssembly 直譯器在算什麼
WebAssembly 規格定義的是一台堆疊機(stack machine):運算元隱含放在虛擬堆疊頂端,位元組碼編碼精簡,代價是執行時要不斷做堆疊存取與搬移。暫存器機(register machine)把運算元位置寫死在指令裡,一條指令常能取代 3 條以上的堆疊指令,但指令本身變複雜。Wasmi 走堆疊機路線,2.0 版則是在不脫離 Wasm 堆疊語意下,把常見運算元路徑改用隱含累加器暫存器頂替顯式堆疊存取。
三個累加器暫存器
Wasmi 2.0 引入三個累加器:ireg(64 位元整數/參照)、freg32、freg64(32/64 位元浮點數)。以 i64.add 為例,Wasmi 1.0 需要三次記憶體讀寫,Wasmi 2.0 只要在 ireg 上做一次加法即可。這個設計也延伸到控制流:block/if/loop 的回傳值只要條件允許就盡量留在累加器裡不落地,迴圈的歸納變數甚至能整圈都待在暫存器中不寫回堆疊。
指令分派模式:四選一
Wasmi 2.0 同時支援四種指令分派策略,依平台可切換:
| 模式 | 效能 | 記憶體 |
|---|---|---|
| Direct-Threaded Code | 最快 | 較高 |
| Indirect-Threaded Code | 慢約 10–15% | 較省 |
| Switch-Loop(1.0 舊法) | 中等 | 中等 |
| Call-Loop | 最慢 | 較差 |
預設的 auto-dispatch feature 會依編譯目標平台自動挑選最適合的模式,不需要使用者手動指定。
Instance 存取與 lock-free CodeMap
Wasmi 1.0 存取模組實例(instance)的記憶體、全域變數要走三步:拿 handle、查表、上 mutex 鎖。2.0 版把這些物件攤平進一個 InstanceEntity,取用只是從 instance 做一次指標偏移,指標在具現化階段就由新的 StableArena 快取好,砍掉查表和上鎖。存放已編譯函式的 CodeMap 也重寫成只能附加(append-only)的分桶結構,取代「mutex 保護的 Vec 一旦重新配置就整組失效」的舊設計,讓 call_internal 變成零查找操作,多執行緒併發存取也不再需要鎖。
一個因編譯器優化而生的效能回歸
團隊還抓出一個藏很深的效能劣化:Rust 1.92 編譯器的 DestinationPropagation MIR 優化,會把兩個獨立的分支位置合併成單一 csel 指令,讓 CPU 分支預測器失去線索、效能反而變差。團隊在生成組語層級手動維持兩個獨立分支位置,這一個修正讓 CoreMark 分數從約 2800 拉到 4200 以上,單一個 fix 就貢獻近 50% 提升;同樣手法套用在另一個直譯器 Stitch 上也救回 30% 回歸。
固定 64 位元 cell 與其他變動
Wasmi 1.0 的堆疊 cell 大小依情況是 64 或 128 位元(開 SIMD 就用 128),2.0 版改成永遠固定 64 位元,SIMD 數值改用兩個相鄰 cell 存放,消除了原本開 SIMD 就拖慢約 8% 效能的懲罰,也不浪費記憶體。新版另外加了縮減編譯產物體積的 validate feature,以及跨版本穩定的 fuel 計量。已知使用 Wasmi 的專案包括 Typst、Zellij 與 Soroban。
花 67 美分、訓練 1.5 小時,小型 transformer 衝上 ARC-AGI-1 的 44%
mvakde.github.io · 2026-09-01
mvakde.github.io 的作者在 2026 年 9 月 1 日發布一篇技術貼文,說明如何用一台 RTX 5090、花費 67 美分、訓練 1.5 小時,讓一個從零開始訓練的小型 transformer 在 ARC-AGI-1 公開評測集上拿下 44% 的分數。這個結果沒有靠任何預訓練的大型語言模型,而是針對每一批測驗題現場訓練一個小模型去解題,成本比作者自己先前的版本再壓低了超過一半。
ARC-AGI 在測什麼
ARC-AGI(Abstraction and Reasoning Corpus)是 François Chollet 在 2019 年提出的基準測試,目的是衡量 AI 系統的流體智力(fluid intelligence)——面對從沒見過的新問題時的抽象推理能力,而不是考驗模型記住多少既有知識。整個測試集約有 1000 道題目,每題先給幾組「輸入方格 → 輸出方格」的範例,讓解題者自己歸納出隱藏的轉換規則,再套用到新的測試輸入上,設計上刻意讓每道題都獨一無二。後續推出的 ARC-AGI-2 進一步拉高難度,官方數據顯示多數大型語言模型在上面幾乎拿零分。
不是微調,是「現場訓練」
作者採用的技術路線叫測試時訓練(test-time training):模型不是先訓練好再拿去解題,而是把訓練資料集和要解的評測題目輸入(答案先隱藏)一起丟進去,以自回歸方式針對每一批題目重新從零訓練一次。這代表每次評測其實都在訓練一個全新的、只認識這批題目的小模型,訓練與推論的界線因此變得模糊。
模型架構的調整
這一版模型從 4 層加深到 8 層,並換上幾個近年常見的架構元件:SwiGLU 前饋層、RMSNorm、以及 3D RoPE 位置編碼。作者還加入「每個任務可學習的加性嵌入」,讓模型能在同一次訓練跑裡同時吸收多個任務的資訊;訓練資料以打包方式串接 token 序列、不做 padding,並用支援變長輸入的 flash attention 加速。根據原始碼倉庫 mvakde/mdlARC 的說明,整個模型是一個約 7500 萬參數的標準 transformer。
訓練資料與去汙染處理
訓練集除了 ARC-1 本身的題目,還混入從 ARC-2 與 ConceptARC 篩選出、確認和評測集不重疊的題目,避免資料洩漏灌水分數。作者也對輸入輸出方格做顏色置換與二面體(旋轉、翻轉)變換增強,並在增強後去除重複樣本,藉此在題目數量有限的情況下擴充有效訓練資料量。
成績與成本對比
這次結果是 ARC-AGI-1 拿下 44%,同時在難度更高的 ARC-AGI-2 上拿到 7%。作者把這個數字和同樣採用測試時訓練路線的其他方法相比,而不是跟一般大型語言模型比較:
| 方法 | ARC-AGI-1 分數 | 備註 |
|---|---|---|
| 本次結果 | 44% | 1.5 小時、67 美分(RTX 5090) |
| 作者前一版模型 | 27.5% | 3 小時、1.80 美元(A100) |
| CompressARC | 約 15–18% | 類似條件下比較 |
| TRM/HRM | 相近分數 | 成本明顯較高 |
相較於前一版在 A100 上跑 3 小時、花費 1.80 美元才拿到 27.5%,這次把訓練時間壓到 1.5 小時、成本壓到 67 美分,分數卻幾乎翻倍。架構調整——尤其是加深層數與換上現代化元件——帶來的效益,遠大於單純堆算力。