Módulo ONNX Runtime (onnxruntime)
Este módulo está disponível a partir da versão 20260402.
Compatível apenas com iOS 13 ou posterior.
O módulo onnxruntime carrega e executa modelos ONNX diretamente no dispositivo, sendo adequado para texto, embeddings, classificação, detecção e vários cenários de inferência com tensores.
Carregar o módulo
local ort = require("onnxruntime")
Este é um módulo carregado sob demanda; ao contrário de coreml, não é um módulo global integrado.
Depois que require("onnxruntime") é executado com sucesso, duas interfaces de ponte também são injetadas no módulo integrado coreml:
coreml.multi_array_from_ort_tensor(tensor[, data_type])multi_array:to_ort_tensor([data_type])
Ambas as conversões copiam os dados diretamente na camada nativa, sem passar por uma tabela Lua.
Funções do módulo
Informações básicas e do runtime
onnxruntime.version()onnxruntime.providers()onnxruntime.configure(opts)
Descrição:
providers()retorna a lista de Execution Providers realmente disponíveis no runtime ORT atual.configure()define os valores padrão globais do runtime e deve ser chamado antes da criação de qualquer session.
Auxiliares de tensores, imagens e 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])
Descrição:
clamp(),sigmoid(),exp()ematmul()são equivalentes aos métodostensor:de mesmo nome; a diferença é que o tensor é passado como primeiro argumento.where()aceita uma combinação de escalares, booleanos e tensores e gera o resultado seguindo as regras de broadcasting.- Para detalhes sobre pré-processamento de imagens, a ponte OpenCV e
image_from_tensor(), consulte o módulo de tensores.
Auxiliares de detecção, decodificação e pós-processamento
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])
Descrição:
tensor_from_quad()/tensor_from_quads()exigem primeirorequire("image.cv")e são adequados para gerar diretamente tensores após o recorte quadrilateral de OCR.box_points()recebe um tensor de caixa rotacionada com forma[5],[1, 5]ou[N, 5], não cinco parâmetros escalares separados.create_decoder()retorna um objeto decoder com suporte a:decode(),:task()e:schema().tracker()retorna um objeto tracker com suporte a:update(),:reset(),:state()e:close().records_from_boxes(),obb_records_from_rows()epoints_to_records()organizam os resultados tensor em tabelas de records mais adequadas ao consumo no lado Lua.proto_masks()eproject_masks()usam atualmente a mesma implementação; a segunda é apenas um alias.mask_iou()calcula diretamente a interseção sobre união de duas masks. Também aceita um terceiro argumentoopts, comcompare_size = trueouwidth/heightexplícitos.db_postprocess()é adequado ao pós-processamento de detecção de texto do tipo DB / DBNet; cada item retornado contémscore,pointsebox.decode_dense_detection()exige queopts.stridesseja um array não vazio de inteiros positivos e também exigedecode_widthedecode_height; atualmente aceita apenasbox_encoding = "grid_center_log_wh".ctc_greedy_decode()aceitablank_index,merge_repeated,apply_softmax,return_probabilitiesecharset.ctc_greedy_decode()sempre retornaindices;textsó é retornado quandocharseté fornecido;confidencesó é retornado quandoapply_softmaxoureturn_probabilitiesestá habilitado;probabilitieseprobability_confidencesó são retornados quandoreturn_probabilitiesestá habilitado.nms()/rotated_nms()retornam um tensorint64, com índices baseados em 1.sample_logits()aceitaargmax,temperature,top_k,top_p,min_peseed.- Para logits 1D,
sample_logits()retorna um único índice; para logits em batch, retorna um tensorint64.
Valores estruturados
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)
São adequados para entradas e saídas que não são apenas tensores, como optional, sequence, map e sparse tensor.
O comportamento atual pode ser resumido assim:
onnxruntime.value(x)Sexjá for um ORT tensor / value / sequence / map / sparse tensor, é retornado sem alterações; sexfor uma tabela Lua, será tratado comosequence; caso contrário, o escalar será encapsulado em um tensor.onnxruntime.optional(value, type_info)O segundo argumento é obrigatório;type_infopode ser uma string ou a tabela de informações de tipo retornada porsession:input_info(...)/output_info(...); um optional vazio é representado poronnxruntime.optional(nil, type_info).onnxruntime.map(key_type, value_type, pairs)Atualmente,key_typeaceita apenas"string"ou"int64".onnxruntime.sparse_tensor(type, dense_shape, indices, values)Atualmente, aceita apenas tensores esparsos numéricos /bool, construídos no formato COO;indicespode ser um array plano ou um array de coordenadas.onnxruntime.sparse_tensor_from_dense(tensor)Atualmente, não aceita tensorstring.
Métodos de objeto comuns:
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()
Sessions e inferência
onnxruntime.session(model_path[, opts])onnxruntime.session_from_bytes(model_bytes[, opts])onnxruntime.run_options([opts])onnxruntime.load_custom_op_library(path)
O objeto session é responsável por carregar o modelo, consultar informações de entrada e saída, executar inferência e usar IOBinding. Consulte o módulo de sessions.
Tipos de dados compatíveis
Atualmente, a interface de tensores aceita os seguintes nomes de tipos de elementos:
"float32"/"float""float16""bfloat16""uint8""uint16""uint32""uint64""int8""int16""int32""int64""double"/"float64""bool""string"
Descrição:
tensor_from_bytes()ecopy_from_bytes()aceitam apenas tipos numéricos ebool.bytes()não aceita tensorstring.tensor:to("string")atualmente aceita apenasstring -> string.
Sobre os Providers
onnxruntime.providers() retorna a lista de providers visíveis no runtime, mas as strings de provider processadas e aceitas nativamente nas opções de session são:
"cpu""coreml"
Descrição:
provider/providerstambém aceitam aliases comoCPUExecutionProvidereCoreMLExecutionProvider, normalizados internamente para"cpu"e"coreml".- Se nenhum provider for especificado explicitamente ou a lista de providers estiver vazia, a criação da session adicionará automaticamente o provider CPU.
- Se a lista contiver
"coreml"efallback_to_cpu = true, a implementação também poderá adicionar CPU como fallback. - Se você passar
providers = {"coreml", "cpu"}, a ordem indica que CoreML será tentado antes de CPU.
Integração com CoreML
Se você quiser reutilizar o tokenizador coreml ou o fluxo de pré-processamento MLMultiArray, recomenda-se esta combinação:
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",
}))
Ou converta diretamente um MLMultiArray existente em um tensor ORT:
local ort = require("onnxruntime")
local tensor = assert(multi_array:to_ort_tensor("int64"))