ONNX Runtime 會話模組
該模組在 20260402 以後版本方可使用
會話物件負責載入 ONNX 模型、查看輸入輸出資訊以及執行推理。
運行時設定
onnxruntime.configure(opts)
assert(onnxruntime.configure({
log_severity_level = 2,
log_id = "my-runtime",
use_global_thread_pools = false,
global_intra_op_num_threads = 0,
global_inter_op_num_threads = 0,
}))
說明:
- 必須在建立任何 session 之前呼叫
- 一旦已有活動 session,繼續呼叫會報錯
支援字段:
log_severity_levellog_iduse_global_thread_poolsglobal_intra_op_num_threadsglobal_inter_op_num_threads
建立會話
onnxruntime.session(model_path[, opts])
會話物件, 錯誤資訊 = onnxruntime.session(模型路徑, 選項)
從檔案路徑載入 ONNX 模型。
onnxruntime.session_from_bytes(model_bytes[, opts])
會話物件, 錯誤資訊 = onnxruntime.session_from_bytes(模型位元組字串, 選項)
從記憶體位元組建立會話。
Session 選項
通用字段
providers或provider可傳單個字串或字串陣列;目前原生處理並支援"cpu"、"coreml",也接受CPUExecutionProvider、CoreMLExecutionProvider這類別名fallback_to_cpu布林型,預設trueintra_op_num_threadsinter_op_num_threadslog_idsession_log_severity_levelsession_log_verbosity_leveloptimized_model_pathprofile_file_prefixfree_dimension_overridesconfig_entriesgraph_optimization_level可選"disable"、"basic"、"extended"、"all"execution_mode可選"sequential"、"parallel"deterministic_computedisable_per_session_threadsenable_cpu_mem_arenaenable_mem_patterncustom_op_libraries
補充說明:
free_dimension_overrides需要傳陣清單,每項結構為{ by = "name"|"denotation", key = "...", value = 整數 }config_entries必須是“字串鍵 -> 字串值”的 tablecustom_op_libraries可以是單個路徑字串、路徑陣列,或load_custom_op_library()返回的句柄;陣列里也可以混用路徑和句柄- 如果沒有顯式指定
providers,或者 provider 清單為空,目前實現會預設補上 CPU provider - 當 provider 清單裡包含
"coreml"且fallback_to_cpu = true時,CoreML provider 初始化失敗後可自動回退到 CPU - 如果你顯式寫成
providers = {"coreml", "cpu"},順序就表示先 CoreML、後 CPU
CoreML provider 相關字段
當 providers 中包含 "coreml" 時,還可使用:
coreml_compute_units推薦使用"all"、"cpu_only"、"cpu_and_gpu"、"cpu_and_neural_engine";解析器也兼容CPUOnly、CPUAndGPU、CPUAndNeuralEngine、MLComputeUnits...這些別名coreml_create_mlprogramcoreml_require_static_input_shapescoreml_enable_on_subgraphcoreml_flagscoreml_use_cpu_onlycoreml_use_cpu_and_gpucoreml_only_enable_device_with_ane
補充說明:
coreml_flags、coreml_use_cpu_only、coreml_use_cpu_and_gpu、coreml_only_enable_device_with_ane都是兼容舊寫法的字段- 新舊字段可以混用,但如果表達的含義互相衝突,session 建立會直接報錯
coreml_only_enable_device_with_ane不能和coreml_compute_units = "cpu_only"/"cpu_and_gpu"這類互斥設定同時使用
會話物件方法
基礎資訊
session:input_names()session:output_names()session:overridable_initializer_names()session:input_count()session:output_count()session:overridable_initializer_count()
類型資訊
session:input_info(name_or_index)session:output_info(name_or_index)session:overridable_initializer_info(name_or_index)
回傳值是類型資訊表,常見字段包括:
nameonnx_typeis_sparsedata_typetypehas_shapeshapesymbolic_shapeelementkey_typevalue
說明:
- tensor / sparse tensor 會帶
data_type、shape、symbolic_shape - sequence / optional 會帶嵌套的
element - map 會帶
key_type和嵌套的value
記憶體資訊
session:memory_info_for_inputs()session:memory_info_for_outputs()
回傳值既可以按順序訪問,也可以按名稱訪問。單項通常包含:
nameidmem_typeallocator_typedevice_typedevice_mem_typevendor_id
元資訊與生命週期
session:metadata()session:close()session:end_profiling()session:profiling_start_time_ns()session:set_ep_dynamic_options(opts)session:register_custom_op_library(path_or_handle)
說明:
end_profiling()返回 profiling 輸出檔案路徑set_ep_dynamic_options()會把傳入 table 的 key/value 都轉成字串再傳給 ORTregister_custom_op_library()會在目前 session 選項基礎上重建內部 sessionpath_or_handle既可以是路徑,也可以是load_custom_op_library()返回的句柄
執行推理
session:run(inputs[, output_names[, run_options]])
輸出表, 錯誤資訊 = session:run({
input_ids = 輸入張量,
attention_mask = 掩碼張量,
}, {
"logits",
}, run_options)
session:run_into(inputs, outputs[, run_options])
輸出表, 錯誤資訊 = session:run_into({
x = 輸入張量,
}, {
y = 復用輸出張量,
}, run_options)
session:run_with_iobinding(binding[, run_options])
輸出表, 錯誤資訊 = session:run_with_iobinding(binding, run_options)
輸入規則:
inputs可以是順序陣列,也可以是按輸入名組織的字典- 順序陣列按模型輸入順序匹配,後面也可以繼續覆蓋 overridable initializer
- 字典形式下,鍵必須與輸入名或 overridable initializer 名一致
- optional 輸入可以省略,也可以傳
onnxruntime.optional(nil, type_info)
輸出規則:
- 回傳值是一個 table
- 同一個輸出既可以用數字索引訪問,也可以用輸出名訪問
run_into()如果某個輸出復用了已有 tensor,返回表裡對應項就是原物件本身
Run Options
onnxruntime.run_options([opts])
local run_options = assert(onnxruntime.run_options({
tag = "session-run",
log_severity_level = 2,
log_verbosity_level = 1,
}))
支援字段:
taglog_severity_levellog_verbosity_level
物件方法:
run_options:tag([value])run_options:log_severity_level([value])run_options:log_verbosity_level([value])run_options:terminate()run_options:reset_terminate()
IOBinding
session:create_io_binding()
binding, 錯誤資訊 = session:create_io_binding()
binding:bind_input(name, value)
綁定輸入值。這裡不接受空 optional。
binding:bind_output(name[, spec_or_tensor])
支援三種形式:
binding:bind_output("y")綁定到 CPU 記憶體,稍後通過get_outputs()取回binding:bind_output("y", existing_tensor)直接寫入已有 tensorbinding:bind_output("y", {type = "float32", shape = {1, 2}})由介面建立一個輸出 tensor 並返回
也支援:
binding:bind_output("y", {mode = "device"})
其它方法
binding:clear_inputs()binding:clear_outputs()binding:synchronize_inputs()binding:synchronize_outputs()binding:get_outputs()
範例
local ort = require("onnxruntime")
local session = assert(ort.session(XXT_HOME_PATH.."/models/demo/model.onnx", {
providers = {"coreml", "cpu"},
fallback_to_cpu = true,
coreml_compute_units = "all",
}))
local x = assert(ort.tensor("float32", {1, 2}, {1.0, 2.0}))
local bias = assert(ort.tensor("float32", {1, 2}, {0.5, -0.5}))
local run_options = assert(ort.run_options({tag = "demo"}))
local outputs = assert(session:run({
x = x,
bias = bias,
}, {"y"}, run_options))
print(outputs.y:to_table()[1])