跳到主要内容

创建一个通用 CoreML 推理器 (coreml.new_model_request)

coreml.new_model_request 用于加载一个已经编译好的 CoreML 模型,并创建一个不依赖 Vision 的通用推理器。
它适合文本模型、张量输入模型、多输入多输出模型、Embedding 模型以及任何“输入不是一张普通图片”的模型。

如果模型本身是图片识别流程,且希望直接传 image 对象做视觉推理,应优先使用 new_vision_request
如果需要自己准备输入特征,或模型输入包含 MLMultiArray、文本 token、多个命名输入,应使用该接口。

另外,coreml.session(...) 是这个函数的别名。

声明

通用推理器对象, 错误信息 = coreml.new_model_request(编译好的模型路径)

通用推理器对象, 错误信息 = coreml.new_model_request({
compiled_model_path = 编译好的模型路径,
uses_cpu_only = 是否只使用 CPU,
compute_units = 计算单元配置,
})

参数

  • compiled_model_path 文本型,已经编译完成的 .mlmodelc 模型目录路径。

  • uses_cpu_only 布尔型,可选参数,是否默认只使用 CPU 推理,默认 false

  • compute_units 文本型,可选参数,iOS 12+ 生效。支持以下值:

    • "all"
    • "cpu_only""cpu"
    • "cpu_and_gpu""gpu"
    • "cpu_and_neural_engine""ane""neural_engine"iOS 16+

    uses_cpu_only = true 时,会优先强制使用 CPUOnly 配置。

返回值

  • 通用推理器对象
    通用推理器对象,创建失败返回 nil

  • 错误信息
    文本型,创建成功返回 nil,失败时返回错误信息。

说明

该函数在 20260319 以后版本方可使用

  • 基础能力支持 iOS 11+
  • compute_units 相关配置依赖 iOS 12+
  • 如果模型声明的是 image feature,且你想把 image_object 直接作为输入传给这个通用 request,则需要 iOS 13+
  • 传入输入参数时,需使用“输入名映射表”的形式,例如 { input_ids = ids }
  • 输入值支持数字、字符串、布尔值、字典、MLMultiArray,以及模型声明为图片特征时的 image 对象
  • 这个对象只负责模型推理,不负责图片预处理或文本分词;这些步骤需要在 Lua 层自行准备
  • 同一个推理器对象可以重复调用 predict() / run(),适合缓存起来反复使用,而不是每次推理都重新创建
  • 如果老设备或某些模型在默认后端上不稳定,可以在创建时设置 uses_cpu_only = true

类型判断

声明

是否通用推理器 = coreml.is_model_request(需要判断的值)

是否通用推理器 = coreml.is_session(需要判断的值)

参数

  • 需要判断的值
    值,需要判断是否为 CoreML 通用推理器对象的值。

返回值

  • 是否通用推理器
    布尔型,是返回 true,否则返回 false

说明

  • coreml.is_session()coreml.is_model_request() 是同义接口
  • 适合在通用 Lua 封装里做类型保护或参数校验
  • 如果你已经明确持有的是 new_model_request(...) / session(...) 返回值,通常不需要额外调用它

示例

local compiled_model_path = XXT_HOME_PATH.."/models/demo_text.mlmodelc"

local req, err = coreml.new_model_request({
compiled_model_path = compiled_model_path,
uses_cpu_only = false,
compute_units = "all",
})
if not req then
error(err)
end

local out = assert(req:predict({
input_ids = ids,
}))

print(req:input_names())
print(req:output_names())
print(out[1])