Module ONNX Runtime (onnxruntime)
Ce module est disponible à partir des versions postérieures au 20260402
Prend uniquement en charge les systèmes iOS 13 et versions ultérieures
Le module onnxruntime sert à charger et exécuter directement des modèles ONNX sur l’appareil. Il convient aux scénarios d’inférence de texte, d’Embedding, de classification, de détection et de tenseurs génériques.
Charger le module
local ort = require("onnxruntime")
Il s’agit d’un module chargé à la demande, contrairement à coreml, qui est un module global intégré.
Après l’exécution réussie de require("onnxruntime"), deux groupes d’interfaces de pont sont également injectés dans le module coreml intégré :
coreml.multi_array_from_ort_tensor(tensor[, data_type])multi_array:to_ort_tensor([data_type])
Ces deux conversions effectuent une copie directe au niveau natif, sans passer par une table Lua.
Fonctions au niveau du module
Exécution et informations de base
onnxruntime.version()onnxruntime.providers()onnxruntime.configure(opts)
Description :
providers()renvoie la liste des Execution Provider réellement disponibles dans le runtime ORT actuelconfigure()sert à définir les valeurs par défaut globales du runtime et doit être appelé avant la création de toute session
Tenseurs, images et fonctions numériques auxiliaires
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])
Description :
clamp(),sigmoid(),exp()etmatmul()sont équivalentes aux méthodestensor:du même nom ; elles transmettent simplement le tensor comme premier paramètrewhere()accepte un mélange de scalaires, de valeurs booléennes et de tensors, puis produit le résultat selon les règles de broadcasting- pour les détails du prétraitement d’image, du pont OpenCV et de
image_from_tensor(), consultez le module des tenseurs
Détection, décodage et fonctions auxiliaires de post-traitement
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])
Description :
tensor_from_quad()/tensor_from_quads()nécessitent d’abordrequire("image.cv")et conviennent à la génération directe d’un tenseur après le recadrage quadrilatéral OCRbox_points()reçoit un tensor de boîtes tournées de forme[5],[1, 5]ou[N, 5], et non cinq paramètres scalaires séparéscreate_decoder()renvoie un objet decoder prenant en charge:decode(),:task()et:schema()tracker()renvoie un objet tracker prenant en charge:update(),:reset(),:state()et:close()records_from_boxes(),obb_records_from_rows()etpoints_to_records()organisent les résultats tensoriels en tables de records mieux adaptées à leur utilisation côté Luaproto_masks()etproject_masks()utilisent actuellement la même implémentation ; le second n’est qu’un aliasmask_iou()sert à calculer directement l’intersection sur union de deux masques ; il accepte également un troisième paramètreopts, auquel on peut transmettrecompare_size = trueou fournir explicitementwidth/heightdb_postprocess()convient au post-traitement de détection de texte de type DB / DBNet ; chaque élément de détection renvoyé contientscore,pointsetboxdecode_dense_detection()exige queopts.stridessoit un tableau non vide d’entiers positifs, ainsi quedecode_widthetdecode_height; il ne prend actuellement en charge quebox_encoding = "grid_center_log_wh"ctc_greedy_decode()prend en chargeblank_index,merge_repeated,apply_softmax,return_probabilitiesetcharsetctc_greedy_decode()renvoie toujoursindices;textn’est renvoyé que sicharsetest fourni ;confidencen’est renvoyé que siapply_softmaxoureturn_probabilitiesest activé ;probabilitiesetprobability_confidencene sont renvoyés que sireturn_probabilitiesest activénms()/rotated_nms()renvoient un tensorint64, avec une sémantique d’index 1-basedsample_logits()prend en chargeargmax,temperature,top_k,top_p,min_petseed- pour des logits 1D,
sample_logits()renvoie un indice unique ; pour des logits par batch, elle renvoie un tensorint64
Valeurs structurées
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)
Ces fonctions servent à traiter des entrées et sorties qui ne sont pas de purs tensors, par exemple des optional, sequence, map et sparse tensor.
Le comportement actuel peut être résumé ainsi :
onnxruntime.value(x)
Sixest déjà un ORT tensor, value, sequence, map ou sparse tensor, la valeur est renvoyée telle quelle ; sixest une table Lua, elle est traitée comme unesequence; sinon, le scalaire est enveloppé dans un tensoronnxruntime.optional(value, type_info)
Le deuxième paramètre est obligatoire ;type_infopeut être une chaîne ou recevoir directement la table d’informations de type renvoyée parsession:input_info(...)/output_info(...); un optional vide est représenté paronnxruntime.optional(nil, type_info)onnxruntime.map(key_type, value_type, pairs)
Actuellement,key_typeaccepte uniquement"string"ou"int64"onnxruntime.sparse_tensor(type, dense_shape, indices, values)
Actuellement, seuls les sparse tensors numériques etboolsont pris en charge et construits selon le format COO ;indicespeut être un tableau aplati ou un tableau de coordonnéesonnxruntime.sparse_tensor_from_dense(tensor)
Les tensorsstringne sont actuellement pas pris en charge
Méthodes d’objet courantes :
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()
Session et inférence
onnxruntime.session(model_path[, opts])onnxruntime.session_from_bytes(model_bytes[, opts])onnxruntime.run_options([opts])onnxruntime.load_custom_op_library(path)
L’objet session est responsable du chargement du modèle, de la consultation des informations d’entrée et de sortie, de l’exécution de l’inférence et de IOBinding. Consultez le module des sessions.
Types de données pris en charge
L’interface tensor actuelle prend en charge les noms de types d’éléments suivants :
"float32"/"float""float16""bfloat16""uint8""uint16""uint32""uint64""int8""int16""int32""int64""double"/"float64""bool""string"
Description :
tensor_from_bytes()etcopy_from_bytes()prennent uniquement en charge les types numériques etboolbytes()ne prend pas en charge les tensorsstringtensor:to("string")ne prend actuellement en charge questring -> string
Description des Provider
onnxruntime.providers() renvoie la liste des providers visibles par le runtime, mais les chaînes de provider traitées et prises en charge nativement dans les options de session actuelles sont :
"cpu""coreml"
Description :
provider/providersacceptent également des alias tels queCPUExecutionProvideretCoreMLExecutionProvider, qui sont normalisés en interne en"cpu"et"coreml"- si aucun provider n’est spécifié explicitement ou si la liste des providers est vide, la création de la session ajoute automatiquement le provider CPU
- si la liste des providers contient
"coreml"et quefallback_to_cpu = true, l’implémentation peut également ajouter CPU comme chemin de repli - si vous transmettez
providers = {"coreml", "cpu"}, CoreML sera essayé en priorité, puis CPU
Utilisation conjointe avec CoreML
Pour réutiliser le tokenizer coreml ou le flux de prétraitement MLMultiArray, il est recommandé de les combiner ainsi :
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 bien, convertissez directement un MLMultiArray existant en tensor ORT :
local ort = require("onnxruntime")
local tensor = assert(multi_array:to_ort_tensor("int64"))