Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
edc0205
feat(models)!: resolve DEFAULT model variant per platform
msluszniak Aug 27, 2026
6ea2b97
feat(models): prefer MLX on iOS and Vulkan on Android
msluszniak Aug 27, 2026
923bd38
feat(models): add the fp16 Core ML build of RF-DETR keypoint
msluszniak Aug 27, 2026
8a236a0
Revert "feat(models): add the fp16 Core ML build of RF-DETR keypoint"
msluszniak Aug 28, 2026
c7fee75
docs(models): record the real reason behind each iOS pin
Aug 28, 2026
58b18a4
docs(models): fp16 RF-DETR keypoint is blocked on the export env, not…
Aug 28, 2026
2130f9d
feat(models): default RF-DETR keypoint to the new fp16 Core ML build …
Aug 28, 2026
0565d9a
fix(models): point RF-DETR keypoint at v0.10.0, where its files actua…
Aug 28, 2026
3e4365c
feat(models): drop the RF-DETR keypoint fp32 Core ML build, repoint n…
Aug 28, 2026
776f515
fix(computer-vision): the keypoint demo still offered the removed fp3…
Aug 28, 2026
ce6fbb7
feat(models): wire every published variant the registry was missing
msluszniak Aug 28, 2026
96253f0
feat(models): wire the all-MiniLM-L6-v2 Vulkan export
msluszniak Aug 30, 2026
a4f78e1
feat(models): wire the whisper-tiny Vulkan exports
msluszniak Aug 31, 2026
66ab3cd
feat(models): wire the remaining whisper Vulkan sizes
msluszniak Aug 31, 2026
b785ea8
feat(models): default the embedding models to Vulkan fp16 on Android
msluszniak Aug 31, 2026
5916c4f
feat(models): add Vulkan fp16 for the remaining sentence-transformer …
msluszniak Aug 31, 2026
a3d8794
feat(models): add Vulkan fp16 for distiluse
msluszniak Sep 1, 2026
4629bf4
feat(models): add Vulkan fp16 for Supertonic
msluszniak Sep 1, 2026
5bef340
feat(speech): offer the Vulkan Supertonic build in the demo
msluszniak Sep 1, 2026
2ecba9e
Merge branch 'rne-rewrite' into @ms/platform-default-models
msluszniak Sep 1, 2026
1bf7dff
Address review: inline the variant helpers, restore the kokoro paths …
msluszniak Sep 2, 2026
7555c31
Merge branch 'rne-rewrite' into @ms/platform-default-models
msluszniak Sep 2, 2026
4490098
feat(models): add Vulkan int8 for the mpnet embedders
Sep 2, 2026
f8241d4
fix(models): keep fp16 the Android default for both mpnet embedders
Sep 2, 2026
9af11c0
refactor(models): address review on default variant resolution
msluszniak Sep 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .cspell-wordlist.txt
Original file line number Diff line number Diff line change
Expand Up @@ -350,3 +350,4 @@ phonemizes
həlˈoʊ
NSURL
backgrounding
LibriSpeech
4 changes: 2 additions & 2 deletions apps/computer-vision/app/detection/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ import { BoundingBox } from '../../components/BoundingBox';
const MODEL_OPTIONS: ModelOption[] = [
{
label: 'SSDLite 320 MobileNet V3 Large (XNNPACK FP32)',
value: models.objectDetection.SSDLITE320_MOBILENET_V3_LARGE.DEFAULT,
value: models.objectDetection.SSDLITE320_MOBILENET_V3_LARGE.XNNPACK_FP32,
},
{
label: 'RF-DETR Nano (XNNPACK FP32)',
value: models.objectDetection.RFDETR_NANO.DEFAULT,
value: models.objectDetection.RFDETR_NANO.XNNPACK_FP32,
},
{
label: 'RF-DETR Nano (CoreML FP16)',
Expand Down
6 changes: 3 additions & 3 deletions apps/computer-vision/app/keypoint/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { BoundingBox } from '../../components/BoundingBox';
const MODEL_OPTIONS: ModelOption[] = [
{
label: 'BlazeFace (XNNPACK FP32)',
value: models.keypointDetection.BLAZEFACE.DEFAULT,
value: models.keypointDetection.BLAZEFACE.XNNPACK_FP32,
},
{
label: 'YOLO26 Pose (XNNPACK FP32)',
Expand All @@ -27,8 +27,8 @@ const MODEL_OPTIONS: ModelOption[] = [
value: models.keypointDetection.RFDETR_KEYPOINT.XNNPACK_FP32,
},
{
label: 'RF-DETR Keypoint (CoreML FP32)',
value: models.keypointDetection.RFDETR_KEYPOINT.COREML_FP32,
label: 'RF-DETR Keypoint (CoreML FP16)',
value: models.keypointDetection.RFDETR_KEYPOINT.COREML_FP16,
disabled: Platform.OS !== 'ios',
},
{
Expand Down
4 changes: 3 additions & 1 deletion apps/computer-vision/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@
"instanceSegmentation",
"keypointDetection",
"objectDetection",
"ocr",
"semanticSegmentation",
"styleTransfer"
"styleTransfer",
"textToImage"
]
},
"scripts": {
Expand Down
25 changes: 25 additions & 0 deletions apps/speech/app/audio-file-transcription/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,31 @@ const MODELS = [
config: models.speechToText.WHISPER.TINY.MLX_BF16,
disabled: Platform.OS !== 'ios',
},
{
name: 'Tiny Multilingual (Vulkan fp16)',
config: models.speechToText.WHISPER.TINY.VULKAN_FP16,
disabled: Platform.OS !== 'android',
},
{
name: 'Tiny Multilingual (Vulkan int8)',
config: models.speechToText.WHISPER.TINY.VULKAN_INT8,
disabled: Platform.OS !== 'android',
},
{
name: 'Tiny English (Vulkan fp16)',
config: models.speechToText.WHISPER.EN.TINY.VULKAN_FP16,
disabled: Platform.OS !== 'android',
},
{
name: 'Base Multilingual (Vulkan fp16)',
config: models.speechToText.WHISPER.BASE.VULKAN_FP16,
disabled: Platform.OS !== 'android',
},
{
name: 'Small Multilingual (Vulkan fp16)',
config: models.speechToText.WHISPER.SMALL.VULKAN_FP16,
disabled: Platform.OS !== 'android',
},
{
name: 'Base Multilingual (CPU)',
config: models.speechToText.WHISPER.BASE.XNNPACK_FP32,
Expand Down
25 changes: 25 additions & 0 deletions apps/speech/app/microphone-transcription/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,31 @@ const MODELS = [
config: models.speechToText.WHISPER.TINY.MLX_BF16,
disabled: Platform.OS !== 'ios',
},
{
name: 'Tiny Multilingual (Vulkan fp16)',
config: models.speechToText.WHISPER.TINY.VULKAN_FP16,
disabled: Platform.OS !== 'android',
},
{
name: 'Tiny Multilingual (Vulkan int8)',
config: models.speechToText.WHISPER.TINY.VULKAN_INT8,
disabled: Platform.OS !== 'android',
},
{
name: 'Tiny English (Vulkan fp16)',
config: models.speechToText.WHISPER.EN.TINY.VULKAN_FP16,
disabled: Platform.OS !== 'android',
},
{
name: 'Base Multilingual (Vulkan fp16)',
config: models.speechToText.WHISPER.BASE.VULKAN_FP16,
disabled: Platform.OS !== 'android',
},
{
name: 'Small Multilingual (Vulkan fp16)',
config: models.speechToText.WHISPER.SMALL.VULKAN_FP16,
disabled: Platform.OS !== 'android',
},
{
name: 'Base Multilingual (CPU)',
config: models.speechToText.WHISPER.BASE.XNNPACK_FP32,
Expand Down
5 changes: 4 additions & 1 deletion apps/speech/app/text-to-speech/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,14 @@ const STEPS_OPTIONS = [
const MODEL_OPTIONS = [
{ label: 'XNNPACK (CPU)', value: 'XNNPACK_FP32' as const },
{ label: 'MLX (Apple Silicon)', value: 'MLX_FP32' as const, disabled: Platform.OS !== 'ios' },
{ label: 'Vulkan (GPU)', value: 'VULKAN_FP16' as const, disabled: Platform.OS !== 'android' },
];

function TTSContent() {
const [text, setText] = useState(SAMPLE_TEXT);
const [selectedModel, setSelectedModel] = useState<'XNNPACK_FP32' | 'MLX_FP32'>('XNNPACK_FP32');
const [selectedModel, setSelectedModel] = useState<'XNNPACK_FP32' | 'MLX_FP32' | 'VULKAN_FP16'>(
Platform.OS === 'android' ? 'VULKAN_FP16' : 'XNNPACK_FP32'
);
const [selectedVoice, setSelectedVoice] = useState<SupertonicDefaultVoiceName>('F1');
const [selectedLang, setSelectedLang] = useState<speech.SupertonicLanguage>('en');
const [speed, setSpeed] = useState(1.05);
Expand Down
1 change: 1 addition & 0 deletions apps/speech/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"react-native-executorch": {
"features": [
"vad",
"speechToText",
"textToSpeech"
]
},
Expand Down
39 changes: 35 additions & 4 deletions docs/docs/01-fundamentals/01-getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -213,17 +213,48 @@ The three lists are merged, so you can pair a `features` set with an extra `back

### Feature → backend / lib mapping

These tasks are available today:
Each feature provisions the union of the backends its models are published for, so that the `DEFAULT` variant of every model in that family can resolve to the fastest export the device supports (see below).

| Feature | Backends | Extra libs |
| --- | --- | --- |
| `llm` | xnnpack, mlx | — |
| `multimodalLLM` | xnnpack, mlx, vulkan | opencv |
| `privacyFilter` | xnnpack, mlx | — |
| `speechToText` | xnnpack, coreml, mlx | — |
| `textToSpeech` | xnnpack, mlx | phonemis |
| `vad` | xnnpack | — |
| `textEmbeddings` | xnnpack, mlx | — |
| `imageEmbeddings` | xnnpack, coreml, mlx | opencv |
| `classification` | xnnpack, coreml | opencv |
| `semanticSegmentation` | xnnpack | opencv |
| `styleTransfer` | xnnpack, coreml | opencv |
| `objectDetection` | xnnpack, coreml | opencv |
| `keypointDetection` | xnnpack, coreml, mlx | opencv |
| `semanticSegmentation` | xnnpack, coreml | opencv |
| `instanceSegmentation` | xnnpack, coreml | opencv |
| `ocr` | xnnpack, coreml, vulkan | opencv |
| `verticalOCR` | xnnpack | opencv |
| `styleTransfer` | xnnpack, coreml | opencv |
| `textToImage` | xnnpack, coreml | opencv |
| `segmentAnything` | xnnpack, coreml | opencv |
| `tokenizer` | — | — |

The map also contains forward-looking entries (`llm`, `multimodalLLM`, `speechToText`, `objectDetection`, `ocr`, …) for tasks that are not yet exposed in the JS API; requesting one provisions the right binaries but has no hook to call yet.
### How the backends you pick change which model runs

Models published for more than one backend expose their exports as named variants next to a `DEFAULT` alias:

```ts
models.classification.EFFICIENTNET_V2_S.DEFAULT; // resolved for this device
models.classification.EFFICIENTNET_V2_S.COREML_FP16; // always this export
models.classification.EFFICIENTNET_V2_S.XNNPACK_INT8;
```

`DEFAULT` is not a fixed file. It is resolved when the library loads, to the fastest export the device can actually run. A model is only exported to an accelerated backend once it has been shown to run better there, so a published accelerated variant is preferred and XNNPACK is the fallback:

- **iOS device** — Core ML where one exists, otherwise MLX, otherwise XNNPACK.
- **Android** — Vulkan where one exists, otherwise XNNPACK.
- **iOS simulator** — XNNPACK. The simulator has no Neural Engine, cannot run Core ML models at all, and MLX ships a device slice only.
- **All of them, narrowed by your config** — only backends your app downloaded are considered. Trimming `coreml` out of an iOS build moves those `DEFAULT`s to the next best export rather than failing to load.

A handful of models publish both a Core ML and an MLX export. There the two are close enough that the winner is a per-model benchmark result, so the registry pins it explicitly rather than letting the order above decide. Naming any variant directly always overrides the resolution.

### Platform notes

Expand Down
Loading