Módulo ONNX Runtime (onnxruntime)
Este módulo solo está disponible a partir de la versión 20260402
Solo admite sistemas iOS 13 y posteriores
El módulo onnxruntime permite cargar y ejecutar directamente modelos ONNX en el dispositivo, y resulta adecuado para inferencia de texto, embeddings, clasificación, detección y tensores de uso general.
Cargar el módulo
local ort = require("onnxruntime")
Es un módulo que se carga bajo demanda; a diferencia de coreml, no es un módulo global integrado.
Después de ejecutar correctamente require("onnxruntime"), también inyecta dos grupos de interfaces puente en el módulo integrado coreml:
coreml.multi_array_from_ort_tensor(tensor[, data_type])multi_array:to_ort_tensor([data_type])
Ambas conversiones copian directamente en la capa nativa y no pasan por una tabla Lua.
Funciones de nivel de módulo
Entorno de ejecución e información básica
onnxruntime.version()onnxruntime.providers()onnxruntime.configure(opts)
Explicación:
providers()devuelve la lista de Execution Provider realmente disponible en el entorno ORT actualconfigure()establece los valores predeterminados globales del entorno; debe llamarse antes de crear cualquier session
Asistentes para tensores, imágenes y valores numéricos
onnxruntime.tensor(type, shape[, data])onnxruntime.tensor_from_bytes(type, shape, bytes)onnxruntime.tensor_from_cv_mat(mat[, opts])onnxruntime.tensor_from_quad(mat, quad[, opts])onnxruntime.tensor_from_quads(mat, quads[, opts])onnxruntime.tensor_from_image(image[, opts])onnxruntime.tensor_from_images(images[, opts])onnxruntime.image_from_tensor(tensor[, opts])onnxruntime.clamp(tensor, min, max)onnxruntime.sigmoid(tensor)onnxruntime.exp(tensor)onnxruntime.where(condition, x, y)onnxruntime.matmul(lhs, rhs)onnxruntime.concat(tensors[, axis])onnxruntime.stack(tensors[, axis])
Explicación:
clamp(),sigmoid(),exp()ymatmul()equivalen a los métodostensor:del mismo nombre; la diferencia es que reciben tensor como primer parámetrowhere()permite mezclar escalares, valores booleanos y tensor, y genera el resultado según las reglas de broadcasting- Consulta los detalles del preprocesamiento de imágenes, el puente OpenCV y
image_from_tensor()en el módulo de tensores
Asistentes de detección, decodificación y posprocesamiento
onnxruntime.nms(boxes, scores[, opts])onnxruntime.box_points(rotated_boxes)onnxruntime.xywh_to_xyxy(boxes)onnxruntime.xyxy_to_xywh(boxes)onnxruntime.rotated_iou(lhs_box, rhs_box)onnxruntime.rotated_nms(boxes, scores[, opts])onnxruntime.create_decoder(schema)onnxruntime.decode_yolo(output[, opts])onnxruntime.decode_yolo_obb(output[, opts])onnxruntime.decode_matrix_candidates(output, schema[, opts])onnxruntime.decode_dense_detection(output, opts)onnxruntime.records_from_boxes(boxes, scores, class_ids[, keep_indices])onnxruntime.obb_records_from_rows(rows, scores, class_ids[, angles[, keep_indices[, opts]]])onnxruntime.points_to_records(points[, opts])onnxruntime.threshold_masks(masks, threshold)onnxruntime.crop_masks_by_boxes(masks, boxes)onnxruntime.resize_masks(masks, width, height[, opts])onnxruntime.mask_iou(lhs_mask, rhs_mask)onnxruntime.mask_to_polygon(mask[, opts])onnxruntime.proto_masks(proto, coeffs, boxes, image_width, image_height[, opts])onnxruntime.project_masks(proto, coeffs, boxes, image_width, image_height[, opts])onnxruntime.db_postprocess(score_map[, opts])onnxruntime.tracker([opts])onnxruntime.reshape_keypoints(points[, keypoint_count[, keypoint_dim|opts]])onnxruntime.scale_boxes(boxes, transform)onnxruntime.clip_boxes(boxes, clip_width, clip_height)onnxruntime.scale_points(points, transform[, opts])onnxruntime.scale_keypoints(points, transform[, opts])onnxruntime.clip_keypoints(points, clip_width, clip_height[, opts])onnxruntime.ctc_greedy_decode(logits[, opts])onnxruntime.sample_logits(logits[, opts])
Explicación:
tensor_from_quad()/tensor_from_quads()requieren primerorequire("image.cv")y sirven para generar directamente tensores después de recortar cuadriláteros para OCRbox_points()recibe un tensor de cajas rotadas con forma[5],[1, 5]o[N, 5], no cinco parámetros escalares separadoscreate_decoder()devuelve un objeto decoder compatible con:decode(),:task()y:schema()tracker()devuelve un objeto tracker compatible con:update(),:reset(),:state()y:close()records_from_boxes(),obb_records_from_rows()ypoints_to_records()organizan los resultados tensor en tablas record más fáciles de consumir desde Luaproto_masks()yproject_masks()usan actualmente la misma implementación; el segundo es solo un aliasmask_iou()calcula directamente la intersección sobre unión de dos mask y también admite un tercer parámetroopts, concompare_size = trueowidth/heightexplícitosdb_postprocess()es adecuado para el posprocesamiento de detección de texto de tipo DB / DBNet; cada elemento devuelto incluyescore,pointsyboxdecode_dense_detection()requiere queopts.stridessea una matriz no vacía de enteros positivos y también necesitadecode_widthydecode_height; actualmente solo admitebox_encoding = "grid_center_log_wh"ctc_greedy_decode()admiteblank_index,merge_repeated,apply_softmax,return_probabilitiesycharsetctc_greedy_decode()siempre devuelveindices; solo devuelvetextsi se proporcionacharset;confidencesolo aparece al activarapply_softmaxoreturn_probabilities;probabilitiesyprobability_confidencesolo aparecen al activarreturn_probabilitiesnms()/rotated_nms()devuelven un tensorint64con índices 1-basedsample_logits()admiteargmax,temperature,top_k,top_p,min_pyseedsample_logits()devuelve un índice individual para logits 1D y un tensorint64para logits por lotes
Valores estructurados
onnxruntime.value(value)onnxruntime.optional(value, type_info)onnxruntime.sequence(items)onnxruntime.map(key_type, value_type, pairs)onnxruntime.sparse_tensor(type, dense_shape, indices, values)onnxruntime.sparse_tensor_from_dense(tensor)
Son adecuados para entradas y salidas que no sean solo tensor, como optional, sequence, map y sparse tensor.
El comportamiento actual puede resumirse así:
onnxruntime.value(x): sixya es un ORT tensor, value, sequence, map o sparse tensor, lo devuelve sin cambios; si es una tabla Lua, la trata comosequence; en caso contrario, envuelve el escalar en un tensoronnxruntime.optional(value, type_info): el segundo parámetro es obligatorio;type_infopuede ser una cadena o la tabla de información de tipos devuelta porsession:input_info(...)/output_info(...); un optional vacío se representa comoonnxruntime.optional(nil, type_info)onnxruntime.map(key_type, value_type, pairs): actualmentekey_typesolo admite"string"o"int64"onnxruntime.sparse_tensor(type, dense_shape, indices, values): actualmente solo admite tensores dispersos numéricos /bool, construidos en formato COO;indicespuede ser una matriz plana o una matriz de coordenadasonnxruntime.sparse_tensor_from_dense(tensor): actualmente no admite tensorstring
Métodos habituales de los objetos:
value:type()/value:has_value()/value:get()sequence:length()/sequence:get(i)/sequence:items()map:get(key)/map:set(key, value)/map:keys()/map:pairs()sparse_tensor:dense_shape()/sparse_tensor:values()/sparse_tensor:indices()/sparse_tensor:format()/sparse_tensor:to_dense()
Sesiones e inferencia
onnxruntime.session(model_path[, opts])onnxruntime.session_from_bytes(model_bytes[, opts])onnxruntime.run_options([opts])onnxruntime.load_custom_op_library(path)
El objeto session se encarga de cargar el modelo, consultar la información de entradas y salidas, ejecutar la inferencia y gestionar IOBinding. Consulta el módulo de sesiones.
Tipos de datos admitidos
La interfaz de tensores admite actualmente los siguientes nombres de tipos de elemento:
"float32"/"float""float16""bfloat16""uint8""uint16""uint32""uint64""int8""int16""int32""int64""double"/"float64""bool""string"
Explicación:
tensor_from_bytes()ycopy_from_bytes()solo admiten tipos numéricos yboolbytes()no admite tensorstringtensor:to("string")actualmente solo admitestring -> string
Proveedores
onnxruntime.providers() devuelve la lista de providers visibles para el entorno, pero las cadenas de provider que las opciones de session procesan y admiten de forma nativa son:
"cpu""coreml"
Explicación:
provider/providerstambién aceptan alias comoCPUExecutionProvideryCoreMLExecutionProvider, que internamente se normalizan a"cpu"y"coreml"- Si no se especifica un provider o la lista está vacía, la creación de la session añade automáticamente el provider CPU
- Si la lista incluye
"coreml"yfallback_to_cpu = true, la implementación también puede añadir CPU como ruta de respaldo - Si se pasa
providers = {"coreml", "cpu"}, se intenta primero CoreML y luego CPU
Integración con CoreML
Para reutilizar el tokenizador coreml o el flujo de preprocesamiento de MLMultiArray, se recomienda esta combinación:
local ort = require("onnxruntime")
local tokenizer = assert(coreml.new_text_tokenizer({
type = "wordpiece",
vocab_path = XXT_HOME_PATH.."/models/demo/vocab.txt",
context_length = 52,
}))
local input_ids = assert(tokenizer:encode("hello", {
output = "ort_tensor",
}))
También se puede convertir directamente un MLMultiArray existente en un tensor ORT:
local ort = require("onnxruntime")
local tensor = assert(multi_array:to_ort_tensor("int64"))