feat(AI): 添加MLX内存管理和AI模型互斥卸载机制

为防止应用因内存溢出被系统终止,在项目中添加了MLX框架依赖,
并在应用启动时配置GPU缓存限制,设置256MB缓存上限以避免内存过度使用。

同时实现了LLM和VL模型的互斥卸载机制,确保大模型不会同时常驻内存,
通过在加载一个模型前先卸载另一个模型来控制内存使用,防止jetsam OOM。

chore(project): 配置代码签名授权文件

refactor(localization): 调整本地化字符串并清理冗余条目

修正了提醒任务和建议相关的本地化文本,调整了多个UI字符串,
清理了过时和重复的本地化条目,更新了AI识别相关的新字符串资源。
```
This commit is contained in:
link2026
2026-05-31 23:22:50 +08:00
parent db7cc1bba7
commit d72a1fec17
5 changed files with 161 additions and 34 deletions

View File

@@ -1,4 +1,5 @@
import Foundation
import MLX
enum AIRuntimeError: Error, LocalizedError {
case notReady
@@ -33,6 +34,16 @@ actor AIRuntime {
private init() {}
/// App : MLX GPU , reuse cache
/// App ( CPU, Metal abort)
/// increased-memory-limit entitlement + LLM/VL , jetsam OOM
nonisolated static func configureMLXMemory() {
#if !targetEnvironment(simulator)
// 256MB cache : 3GB MB
MLX.GPU.set(cacheLimit: 256 * 1024 * 1024)
#endif
}
/// ,
func prepare() async throws {
switch status {
@@ -52,6 +63,10 @@ actor AIRuntime {
throw AIRuntimeError.notReady
}
// OOM (§3.1):LLM(~1GB) VL(~3GB), App jetsam
// LLM VL, ModelContainer + MLX
unloadVL()
status = .loading
do {
let session = try await LLMSession.load(
@@ -120,6 +135,10 @@ actor AIRuntime {
throw AIRuntimeError.notReady
}
// OOM (§3.1): VL(~3GB) LLM(~1GB), jetsam
// App 退
unloadLLM()
vlStatus = .loading
do {
let session = try await VLSession.load(
@@ -133,6 +152,26 @@ actor AIRuntime {
}
}
// MARK: - (OOM )
/// LLM, ModelContainer MLX
/// : generate() , session ,;
/// /,
private func unloadLLM() {
guard llmSession != nil else { return }
llmSession = nil
status = .notReady
MLX.GPU.clearCache()
}
/// VL, ModelContainer MLX
private func unloadVL() {
guard vlSession != nil else { return }
vlSession = nil
vlStatus = .notReady
MLX.GPU.clearCache()
}
/// JSON ( VLPrompts.reportExtraction )
/// + 退(§3.2)
/// AIRuntime actor, LLM.generate() , OOM