Core AI

Core AI — стек инференса на устройстве от Apple. LibreYOLO захватывает модель через torch.export, понижает её представление конвертером Core AI и записывает ассет .aimodel с метаданными модели и именами экспортированных выходов.

Флаг
export(format="coreai")
Записывает
Один ассет .aimodel с прикреплёнными метаданными
Extra
pip install "libreyolo[coreai]"
Обратная загрузка
Не через LibreYOLO. Потребители используют среду выполнения Core AI напрямую.
Формы
Фиксированный холст. dynamic=True вызывает NotImplementedError.
Точность
Только FP32. half=True и int8=True отклоняются.
Требуется
macOS. Тулчейн нигде больше не конвертирует и не запускает модели, а coreai-torch фиксирует torch на 2.11.x.

Установка

Этот формат работает только на macOS. У зависимости coreai-torch стоит маркер sys_platform == 'darwin', и тулчейн нигде больше не конвертирует и не запускает модели.

Установка, на macOS
# Намеренно не входит ни в один сводный extra: coreai-torch фиксирует# torch на 2.11.x и утянул бы всё окружение на эту версию.pip install "libreyolo[coreai]"

Этот extra не входит ни в один сводный extra, включая libreyolo[all], потому что coreai-torch фиксирует torch на серии 2.11. Ставьте его в то окружение, которое вы готовы ограничить этой парой.

Экспорт

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9t.pt") # Записывает weights/LibreYOLO9t.aimodelpath = model.export(format="coreai", imgsz=640)print(path)
CLI
libreyolo export --model LibreYOLO9t.pt --format coreai --imgsz 640
Аргументы
model.export(    format="coreai",    imgsz=640,        # int или (высота, ширина); это холст запуска    batch=1,    output_path=None, # None записывает weights/<stem>.aimodel) # dynamic=True вызывает NotImplementedError.# half=True и int8=True отклоняются на этапе валидации.

Захват выполняется через torch.export — это настоящий захват графа с guard-условиями, а не одна записанная трассировка. Такой путь строже, чем у Core ML: чтения скалярных значений на хосте и зависящий от данных поток управления отклоняются, а не запекаются молча, и именно поэтому несколько семейств здесь заблокированы с записанной ошибкой захвата.

Три шага подготовки выполняются внутри области видимости, которая восстанавливает живую модель вызывающей стороны независимо от того, удался экспорт или нет. У семейств, производных от Darknet, батч-нормализация в режиме инференса точно сворачивается в предшествующие свёртки, потому что Core AI 0.4.1 не сохраняет формулу Darknet с эпсилон после квадратного корня. У семейств с сеткой и якорями якоря замораживаются под фиксированный холст. У RF-DETR позиционный эмбеддинг перезапекается под запрошенный холст повторным прогоном собственного пути запекания модели, потому что у конвертера нет понижения для aten._upsample_bicubic2d_aa.

На этапе понижения эталонная декомпозиция PyTorch для aten.grid_sampler_2d добавляется в таблицу декомпозиций, поскольку у конвертера Core AI нет понижения для сэмплера deformable attention, который используют семейства DETR.

Ассеты объявляют минимальную версию ОС v27 — единственное значение, которое предлагает тулчейн. Это ограничивает развёртывание, а не конвертацию: конвертация и запуск на стороне Python работают и на более ранних macOS через среду выполнения внутри wheel-пакета, но численные результаты различаются между версиями ОС, поэтому записанный паритет измеряется на macOS 27.

Запуск артефакта

В libreyolo/backends нет записи для Core AI, поэтому LibreYOLO() не загружает .aimodel. Потребители используют среду выполнения Core AI напрямую, а предобработка, декодирование, NMS и пересчёт координат — на их стороне. Проверенная строка в матрице поддержки означает, что экспортированный граф считает те же числа, что и эталон, а не то, что его запустит predict.

Единственное, что потребитель не может вывести сам, — это порядок выходов:

Чтение порядка выходов перед подключением потребителя
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9t.pt")model.export(format="coreai", imgsz=640) # Метаданные ассета записывают имена экспортированных выходов в порядке# графа под ключом "coreai_output_names". Сопоставляйте по имени словарь,# который возвращает Core AI, используя этот список; никогда не связывайте# его по позиции с кортежем eager-режима.

Core AI возвращает именованный словарь, порядок ключей в котором не совпадает ни с порядком кортежа из eager-прохода вперёд, ни с чем-либо угадываемым. Именно поэтому экспортированные имена записываются в метаданные ассета как coreai_output_names. Сопоставляйте по имени.

Ограничения

Фиксированный холст, FP32, батч такой, каким его экспортировали. dynamic=True вызывает NotImplementedError, а half=True и int8=True отклоняются на этапе валидации.

Покрытие на стороне конвертации широкое. В число проверенных комбинаций входят детекция в семействах YOLO9, YOLOX, YOLO7, четырёх детекторах эпохи Darknet, YOLO-NAS, PicoDet, RTMDet, RT-DETR, RT-DETRv2, RT-DETRv4, D-FINE, DEIM, DEIMv2, EC и RF-DETR; четыре CNN-семейства классификации плюс CLIP и SigLIP2 с фиксированными классами; Depth Anything V2 и ZipDepth; восстановление NAFNet и Real-ESRGAN; семантическая сегментация PIDNet и LingBotVision; детекция точек FOMO. У каждой комбинации свой записанный контекст, который печатает libreyolo formats.

Заблокировано, с причиной, записанной для каждой комбинации:

КомбинацияПочему
Семантическая сегментация EoMTСтрогий захват падает с GuardOnDataDependentSymNode: что-то в пути масок читает значение из тензора и ветвится по нему
Семантическая сегментация SegFormerПуть захвата не оценивали, а опубликованные веса всё равно некоммерческие независимо от формата
Оценка взгляда L2CSСама модель поддерживает только ONNX, TorchScript, ExecuTorch, TensorRT и OpenVINO — это решение на стороне модели
Оценка глубины Depth Anything 3Семейство отклоняет экспорт во все форматы

С RF-DETR связана одна оговорка, которую стоит прочитать до сравнения артефактов. Паритет для него записан относительно графа, который готовит сам экспортёр Core AI, а не относительно ONNX, и на холсте 640 ONNX-артефакт RF-DETR расходится с этим подготовленным графом. Перезапекание в Core AI сохраняет ресайз со сглаживанием, который выполняет eager-модель, тогда как путь ONNX сглаживание отключает. Поэтому ONNX — некорректный эталон для этого семейства на неродном холсте.

О более раннем формате Apple читайте в Core ML. Полную таблицу семейств и задач смотрите в матрице экспорта. Для одной комбинации:

Проверка одного семейства и задачи перед экспортом
libreyolo formats --family yolo9 --task detect

Прочитано из libreyolo/export/coreai.py, libreyolo/export/coreai_compat.py, libreyolo/export/exporter.py, libreyolo/export/support.py и pyproject.toml в ветке dev.