Core AI
Core AI to stos inferencji na urządzeniu od Apple. LibreYOLO przechwytuje model przez torch.export, obniża jego reprezentację konwerterem Core AI i zapisuje zasób .aimodel z metadanymi modelu oraz nazwami wyeksportowanych wyjść.
- Flaga
export(format="coreai")- Zapisuje
- Jeden zasób .aimodel z dołączonymi metadanymi
- Extra
pip install "libreyolo[coreai]"- Wczytywanie z powrotem
- Nie przez LibreYOLO. Konsumenci używają środowiska uruchomieniowego Core AI bezpośrednio.
- Kształty
- Stałe płótno. dynamic=True zgłasza NotImplementedError.
- Precyzja
- Tylko FP32. half=True i int8=True są odrzucane.
- Wymaga
- macOS. Toolchain nigdzie indziej nie konwertuje ani nie uruchamia modeli, a coreai-torch przypina torch do 2.11.x.
Instalacja
Ten format działa tylko na macOS. Zależność coreai-torch ma marker
sys_platform == 'darwin', a toolchain nigdzie indziej nie konwertuje ani nie
uruchamia modeli.
# Celowo poza każdym zbiorczym extra: coreai-torch przypina torch# do 2.11.x i przeciągnąłby całe środowisko na tę wersję.pip install "libreyolo[coreai]"Ten extra znajduje się poza każdym zbiorczym extra, w tym libreyolo[all],
ponieważ coreai-torch przypina torch do serii 2.11. Zainstaluj go w
środowisku, które chcesz ograniczyć do tej pary.
Eksport
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9t.pt") # Zapisuje weights/LibreYOLO9t.aimodelpath = model.export(format="coreai", imgsz=640)print(path)libreyolo export --model LibreYOLO9t.pt --format coreai --imgsz 640model.export( format="coreai", imgsz=640, # int lub (wysokość, szerokość); to jest płótno uruchomienia batch=1, output_path=None, # None zapisuje weights/<stem>.aimodel) # dynamic=True zgłasza NotImplementedError.# half=True i int8=True są odrzucane podczas walidacji.Przechwytywanie realizuje torch.export, czyli prawdziwe przechwycenie grafu z
warunkami guard, a nie pojedynczy zapisany ślad. Jest to ścieżka bardziej
restrykcyjna niż w Core ML: odczyty skalarów po stronie hosta i przepływ
sterowania zależny od danych są odrzucane, zamiast być po cichu zapiekane,
dlatego kilka rodzin jest tu zablokowanych z zapisanym błędem przechwytywania.
Trzy kroki przygotowawcze wykonują się wewnątrz zakresu, który przywraca żywy
model strony wywołującej niezależnie od tego, czy eksport się powiedzie, czy
nie. W rodzinach wywodzących się z Darknet normalizacja batch w trybie
inferencji jest dokładnie zwijana w poprzedzające sploty, ponieważ Core AI 0.4.1
nie zachowuje formuły Darknet z epsilonem po pierwiastku kwadratowym. W
rodzinach siatkowych i kotwicowych kotwice są zamrażane pod stałe płótno. W
RF-DETR embedding pozycyjny jest ponownie zapiekany pod żądane płótno przez
powtórne uruchomienie własnej ścieżki zapiekania modelu, ponieważ konwerter nie
ma obniżania dla aten._upsample_bicubic2d_aa.
Na etapie obniżania referencyjna dekompozycja PyTorch dla
aten.grid_sampler_2d jest włączana do tabeli dekompozycji, ponieważ konwerter
Core AI nie ma obniżania dla samplera deformable attention używanego przez
rodziny DETR.
Zasoby deklarują minimalną wersję systemu v27, czyli jedyną wartość, jaką oferuje toolchain. Ogranicza to wdrożenie, a nie konwersję: konwersja i wykonanie po stronie Pythona działają na wcześniejszych wersjach macOS dzięki środowisku uruchomieniowemu wewnątrz pakietu wheel, ale wyniki numeryczne różnią się między wersjami systemu, więc zapisany parytet jest mierzony na macOS 27.
Uruchamianie artefaktu
W libreyolo/backends nie ma wpisu dla Core AI, więc LibreYOLO() nie wczytuje
pliku .aimodel. Konsumenci używają środowiska uruchomieniowego Core AI
bezpośrednio, a preprocessing, dekodowanie, NMS i przeskalowanie współrzędnych
leżą po ich stronie. Zwalidowany wiersz w macierzy wsparcia to deklaracja, że
wyeksportowany graf liczy te same wartości co referencja, a nie że uruchomi go
predict.
Jedyne, czego konsument nie jest w stanie odtworzyć samodzielnie, to kolejność wyjść:
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9t.pt")model.export(format="coreai", imgsz=640) # Metadane zasobu zapisują nazwy wyeksportowanych wyjść w kolejności grafu,# pod kluczem "coreai_output_names". Zwracany przez Core AI słownik mapuj# po nazwach z tej listy; nigdy nie paruj go pozycyjnie z krotką eager.Core AI zwraca nazwany słownik, którego kolejność kluczy nie odpowiada ani
kolejności krotki z przejścia w przód w trybie eager, ani niczemu, co dałoby się
odgadnąć. Właśnie dlatego wyeksportowane nazwy są zapisywane w metadanych zasobu
jako coreai_output_names. Mapuj po nazwie.
Ograniczenia
Stałe płótno, FP32, batch taki, jaki został wyeksportowany. dynamic=True
zgłasza NotImplementedError, a half=True i int8=True są odrzucane podczas
walidacji.
Pokrycie po stronie konwersji jest szerokie. Zwalidowane kombinacje obejmują
detekcję w rodzinach YOLO9, YOLOX, YOLO7, czterech detektorach z epoki Darknet,
YOLO-NAS, PicoDet, RTMDet, RT-DETR, RT-DETRv2, RT-DETRv4, D-FINE, DEIM, DEIMv2,
EC i RF-DETR; cztery rodziny klasyfikacji CNN oraz CLIP i SigLIP2 z zamrożonymi
klasami; Depth Anything V2 i ZipDepth; restaurację NAFNet i Real-ESRGAN;
segmentację semantyczną PIDNet i LingBotVision; a także detekcję punktów FOMO.
Każda ma własny zapisany kontekst, który wypisuje libreyolo formats.
Zablokowane, z przyczyną zapisaną dla każdej kombinacji:
| Kombinacja | Dlaczego |
|---|---|
| Segmentacja semantyczna EoMT | Ścisłe przechwytywanie kończy się błędem GuardOnDataDependentSymNode: coś w ścieżce masek odczytuje wartość z tensora i rozgałęzia się na jej podstawie |
| Segmentacja semantyczna SegFormer | Ścieżka przechwytywania nie została oceniona, a opublikowane wagi i tak są niekomercyjne niezależnie od formatu |
| Estymacja wzroku L2CS | Sam model obsługuje wyłącznie ONNX, TorchScript, ExecuTorch, TensorRT i OpenVINO, co jest decyzją po stronie modelu |
| Estymacja głębi Depth Anything 3 | Rodzina odrzuca eksport dla każdego formatu |
Z RF-DETR wiąże się jedno zastrzeżenie, które warto przeczytać przed porównywaniem artefaktów. Parytet jest tu zapisany względem grafu, który przygotowuje sam eksporter Core AI, a nie względem ONNX, i przy płótnie 640 artefakt ONNX dla RF-DETR rozjeżdża się z tym przygotowanym grafem. Ponowne zapiekanie w Core AI zachowuje skalowanie z antyaliasingiem wykonywane przez model w trybie eager, podczas gdy ścieżka ONNX antyaliasing wyłącza. ONNX nie jest więc poprawną referencją dla tej rodziny przy płótnie innym niż natywne.
Wcześniejszy format Apple opisuje Core ML. Pełną siatkę rodzin i zadań zawiera macierz eksportu. Dla jednej kombinacji:
libreyolo formats --family yolo9 --task detect