diff --git a/apps/computer-vision/app/classification/index.tsx b/apps/computer-vision/app/classification/index.tsx index 1dcd140a5a..e8e9b90eea 100644 --- a/apps/computer-vision/app/classification/index.tsx +++ b/apps/computer-vision/app/classification/index.tsx @@ -17,10 +17,6 @@ const MODEL_OPTIONS: ModelOption[] = [ label: 'EfficientNetV2-S (XNNPACK INT8)', value: models.classification.EFFICIENTNET_V2_S.XNNPACK_INT8, }, - { - label: 'EfficientNetV2-S (XNNPACK FP32)', - value: models.classification.EFFICIENTNET_V2_S.XNNPACK_FP32, - }, { label: 'EfficientNetV2-S (CoreML FP16)', value: models.classification.EFFICIENTNET_V2_S.COREML_FP16, diff --git a/apps/computer-vision/app/detection/index.tsx b/apps/computer-vision/app/detection/index.tsx index dd910711fe..0ecbc1012a 100644 --- a/apps/computer-vision/app/detection/index.tsx +++ b/apps/computer-vision/app/detection/index.tsx @@ -22,38 +22,34 @@ const MODEL_OPTIONS: ModelOption[] = [ label: 'RF-DETR Nano (XNNPACK INT8)', value: models.objectDetection.RFDETR_NANO.XNNPACK_INT8, }, - { - label: 'RF-DETR Nano (XNNPACK FP32)', - value: models.objectDetection.RFDETR_NANO.XNNPACK_FP32, - }, { label: 'RF-DETR Nano (CoreML FP16)', value: models.objectDetection.RFDETR_NANO.COREML_FP16, disabled: Platform.OS !== 'ios', }, { - label: 'YOLO26 Nano 384 (XNNPACK FP32)', - value: models.objectDetection.YOLO26.NANO.SIZE_384.XNNPACK_FP32, + label: 'YOLO26 Nano 384 (XNNPACK INT8)', + value: models.objectDetection.YOLO26.NANO.SIZE_384.XNNPACK_INT8, }, { - label: 'YOLO26 Nano 640 (XNNPACK FP32)', - value: models.objectDetection.YOLO26.NANO.SIZE_640.XNNPACK_FP32, + label: 'YOLO26 Nano 640 (XNNPACK INT8)', + value: models.objectDetection.YOLO26.NANO.SIZE_640.XNNPACK_INT8, }, { - label: 'YOLO26 Small 640 (XNNPACK FP32)', - value: models.objectDetection.YOLO26.SMALL.SIZE_640.XNNPACK_FP32, + label: 'YOLO26 Small 640 (XNNPACK INT8)', + value: models.objectDetection.YOLO26.SMALL.SIZE_640.XNNPACK_INT8, }, { - label: 'YOLO26 Medium 640 (XNNPACK FP32)', - value: models.objectDetection.YOLO26.MEDIUM.SIZE_640.XNNPACK_FP32, + label: 'YOLO26 Medium 640 (XNNPACK INT8)', + value: models.objectDetection.YOLO26.MEDIUM.SIZE_640.XNNPACK_INT8, }, { - label: 'YOLO26 Large 640 (XNNPACK FP32)', - value: models.objectDetection.YOLO26.LARGE.SIZE_640.XNNPACK_FP32, + label: 'YOLO26 Large 640 (XNNPACK INT8)', + value: models.objectDetection.YOLO26.LARGE.SIZE_640.XNNPACK_INT8, }, { - label: 'YOLO26 X-Large 640 (XNNPACK FP32)', - value: models.objectDetection.YOLO26.XLARGE.SIZE_640.XNNPACK_FP32, + label: 'YOLO26 X-Large 640 (XNNPACK INT8)', + value: models.objectDetection.YOLO26.XLARGE.SIZE_640.XNNPACK_INT8, }, ]; diff --git a/apps/computer-vision/app/imageEmbeddings/index.tsx b/apps/computer-vision/app/imageEmbeddings/index.tsx index 2d6dcf6323..d2def3fc13 100644 --- a/apps/computer-vision/app/imageEmbeddings/index.tsx +++ b/apps/computer-vision/app/imageEmbeddings/index.tsx @@ -22,8 +22,8 @@ import { Button } from '../../components/Button'; const IMAGE_MODEL_OPTIONS: ModelOption[] = [ { - label: 'CLIP ViT-B/32 (XNNPACK FP32)', - value: models.imageEmbeddings.CLIP_VIT_BASE_PATCH32.XNNPACK_FP32, + label: 'CLIP ViT-B/32 (XNNPACK INT8)', + value: models.imageEmbeddings.CLIP_VIT_BASE_PATCH32.XNNPACK_INT8, }, { label: 'CLIP ViT-B/32 (CoreML FP16)', diff --git a/apps/computer-vision/app/instanceSegmentation/index.tsx b/apps/computer-vision/app/instanceSegmentation/index.tsx index f6bfe82dfe..3720f47836 100644 --- a/apps/computer-vision/app/instanceSegmentation/index.tsx +++ b/apps/computer-vision/app/instanceSegmentation/index.tsx @@ -28,18 +28,10 @@ const MODEL_OPTIONS: ModelOption[] = [ label: 'YOLO26 Nano (XNNPACK INT8)', value: models.instanceSegmentation.YOLO26.NANO.SIZE_384.XNNPACK_INT8, }, - { - label: 'YOLO26 Nano (XNNPACK FP32)', - value: models.instanceSegmentation.YOLO26.NANO.SIZE_384.XNNPACK_FP32, - }, { label: 'RFDETR (XNNPACK INT8)', value: models.instanceSegmentation.RFDETR_NANO.XNNPACK_INT8, }, - { - label: 'RFDETR (XNNPACK FP32)', - value: models.instanceSegmentation.RFDETR_NANO.XNNPACK_FP32, - }, { label: 'RFDETR (CoreML FP16)', value: models.instanceSegmentation.RFDETR_NANO.COREML_FP16, @@ -49,18 +41,10 @@ const MODEL_OPTIONS: ModelOption[] = [ label: 'FastSAM Small (XNNPACK INT8)', value: models.instanceSegmentation.FASTSAM.S.XNNPACK_INT8, }, - { - label: 'FastSAM Small (XNNPACK FP32)', - value: models.instanceSegmentation.FASTSAM.S.XNNPACK_FP32, - }, { label: 'FastSAM X-Large (XNNPACK INT8)', value: models.instanceSegmentation.FASTSAM.X.XNNPACK_INT8, }, - { - label: 'FastSAM X-Large (XNNPACK FP32)', - value: models.instanceSegmentation.FASTSAM.X.XNNPACK_FP32, - }, { label: 'FastSAM Small (CoreML FP16)', value: models.instanceSegmentation.FASTSAM.S.COREML_FP16, diff --git a/apps/computer-vision/app/keypoint/index.tsx b/apps/computer-vision/app/keypoint/index.tsx index aa58c108e8..2a7729c789 100644 --- a/apps/computer-vision/app/keypoint/index.tsx +++ b/apps/computer-vision/app/keypoint/index.tsx @@ -32,18 +32,10 @@ const MODEL_OPTIONS: ModelOption[] = [ label: 'YOLO26 Pose (XNNPACK INT8)', value: models.keypointDetection.YOLO26_POSE.SIZE_384.XNNPACK_INT8, }, - { - label: 'YOLO26 Pose (XNNPACK FP32)', - value: models.keypointDetection.YOLO26_POSE.SIZE_384.XNNPACK_FP32, - }, { label: 'RF-DETR Keypoint (XNNPACK INT8)', value: models.keypointDetection.RFDETR_KEYPOINT.XNNPACK_INT8, }, - { - label: 'RF-DETR Keypoint (XNNPACK FP32)', - value: models.keypointDetection.RFDETR_KEYPOINT.XNNPACK_FP32, - }, { label: 'RF-DETR Keypoint (CoreML FP16)', value: models.keypointDetection.RFDETR_KEYPOINT.COREML_FP16, diff --git a/apps/computer-vision/app/textToImage/index.tsx b/apps/computer-vision/app/textToImage/index.tsx index f7ab5a9b35..da7d6d5207 100644 --- a/apps/computer-vision/app/textToImage/index.tsx +++ b/apps/computer-vision/app/textToImage/index.tsx @@ -26,10 +26,6 @@ const MODEL_OPTIONS: ModelOption[] = [ label: 'SDXS-512-DreamShaper (XNNPACK INT8)', value: models.textToImage.SDXS_512_DREAMSHAPER.XNNPACK_INT8, }, - { - label: 'SDXS-512-DreamShaper (XNNPACK FP32)', - value: models.textToImage.SDXS_512_DREAMSHAPER.XNNPACK_FP32, - }, { label: 'SDXS-512-DreamShaper (CoreML FP16)', value: models.textToImage.SDXS_512_DREAMSHAPER.COREML_FP16, diff --git a/apps/speech/app/audio-file-transcription/index.tsx b/apps/speech/app/audio-file-transcription/index.tsx index 1bba02bab5..8d90041568 100644 --- a/apps/speech/app/audio-file-transcription/index.tsx +++ b/apps/speech/app/audio-file-transcription/index.tsx @@ -19,7 +19,7 @@ import { theme } from '../../theme'; const MODELS = [ { name: 'Tiny English (CPU)', - config: models.speechToText.WHISPER.EN.TINY.XNNPACK_FP32, + config: models.speechToText.WHISPER.EN.TINY.XNNPACK_INT8, }, { name: 'Tiny English (CoreML)', @@ -33,7 +33,7 @@ const MODELS = [ }, { name: 'Base English (CPU)', - config: models.speechToText.WHISPER.EN.BASE.XNNPACK_FP32, + config: models.speechToText.WHISPER.EN.BASE.XNNPACK_INT8, }, { name: 'Base English (CoreML)', @@ -47,7 +47,7 @@ const MODELS = [ }, { name: 'Small English (CPU)', - config: models.speechToText.WHISPER.EN.SMALL.XNNPACK_FP32, + config: models.speechToText.WHISPER.EN.SMALL.XNNPACK_INT8, }, { name: 'Small English (CoreML)', @@ -61,7 +61,7 @@ const MODELS = [ }, { name: 'Tiny Multilingual (CPU)', - config: models.speechToText.WHISPER.TINY.XNNPACK_FP32, + config: models.speechToText.WHISPER.TINY.XNNPACK_INT8, }, { name: 'Tiny Multilingual (CoreML)', @@ -100,7 +100,7 @@ const MODELS = [ }, { name: 'Base Multilingual (CPU)', - config: models.speechToText.WHISPER.BASE.XNNPACK_FP32, + config: models.speechToText.WHISPER.BASE.XNNPACK_INT8, }, { name: 'Base Multilingual (CoreML)', @@ -114,7 +114,7 @@ const MODELS = [ }, { name: 'Small Multilingual (CPU)', - config: models.speechToText.WHISPER.SMALL.XNNPACK_FP32, + config: models.speechToText.WHISPER.SMALL.XNNPACK_INT8, }, { name: 'Small Multilingual (CoreML)', diff --git a/apps/speech/app/microphone-transcription/index.tsx b/apps/speech/app/microphone-transcription/index.tsx index b30ec6b0b9..92c78ae473 100644 --- a/apps/speech/app/microphone-transcription/index.tsx +++ b/apps/speech/app/microphone-transcription/index.tsx @@ -12,7 +12,7 @@ import { theme } from '../../theme'; const MODELS = [ { name: 'Tiny English (CPU)', - config: models.speechToText.WHISPER.EN.TINY.XNNPACK_FP32, + config: models.speechToText.WHISPER.EN.TINY.XNNPACK_INT8, }, { name: 'Tiny English (CoreML)', @@ -26,7 +26,7 @@ const MODELS = [ }, { name: 'Base English (CPU)', - config: models.speechToText.WHISPER.EN.BASE.XNNPACK_FP32, + config: models.speechToText.WHISPER.EN.BASE.XNNPACK_INT8, }, { name: 'Base English (CoreML)', @@ -40,7 +40,7 @@ const MODELS = [ }, { name: 'Small English (CPU)', - config: models.speechToText.WHISPER.EN.SMALL.XNNPACK_FP32, + config: models.speechToText.WHISPER.EN.SMALL.XNNPACK_INT8, }, { name: 'Small English (CoreML)', @@ -54,7 +54,7 @@ const MODELS = [ }, { name: 'Tiny Multilingual (CPU)', - config: models.speechToText.WHISPER.TINY.XNNPACK_FP32, + config: models.speechToText.WHISPER.TINY.XNNPACK_INT8, }, { name: 'Tiny Multilingual (CoreML)', @@ -93,7 +93,7 @@ const MODELS = [ }, { name: 'Base Multilingual (CPU)', - config: models.speechToText.WHISPER.BASE.XNNPACK_FP32, + config: models.speechToText.WHISPER.BASE.XNNPACK_INT8, }, { name: 'Base Multilingual (CoreML)', @@ -107,7 +107,7 @@ const MODELS = [ }, { name: 'Small Multilingual (CPU)', - config: models.speechToText.WHISPER.SMALL.XNNPACK_FP32, + config: models.speechToText.WHISPER.SMALL.XNNPACK_INT8, }, { name: 'Small Multilingual (CoreML)', diff --git a/apps/speech/app/text-to-speech/index.tsx b/apps/speech/app/text-to-speech/index.tsx index eece65771e..c24a60fcd9 100644 --- a/apps/speech/app/text-to-speech/index.tsx +++ b/apps/speech/app/text-to-speech/index.tsx @@ -51,15 +51,15 @@ const STEPS_OPTIONS = [ ]; const MODEL_OPTIONS = [ - { label: 'XNNPACK (CPU)', value: 'XNNPACK_FP32' as const }, + { label: 'XNNPACK (CPU)', value: 'XNNPACK_INT8' 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' | 'VULKAN_FP16'>( - Platform.OS === 'android' ? 'VULKAN_FP16' : 'XNNPACK_FP32' + const [selectedModel, setSelectedModel] = useState<'XNNPACK_INT8' | 'MLX_FP32' | 'VULKAN_FP16'>( + Platform.OS === 'android' ? 'VULKAN_FP16' : 'XNNPACK_INT8' ); const [selectedVoice, setSelectedVoice] = useState('F1'); const [selectedLang, setSelectedLang] = useState('en'); diff --git a/docs/docs/01-fundamentals/02-downloading-models.md b/docs/docs/01-fundamentals/02-downloading-models.md index 87e4c8b51a..220ba56462 100644 --- a/docs/docs/01-fundamentals/02-downloading-models.md +++ b/docs/docs/01-fundamentals/02-downloading-models.md @@ -53,7 +53,7 @@ import { useResourceDownload, models } from 'react-native-executorch'; function Example() { const { resource, downloadProgress, downloadError } = useResourceDownload( - models.classification.EFFICIENTNET_V2_S.XNNPACK_FP32 + models.classification.EFFICIENTNET_V2_S.XNNPACK_INT8 ); // resource is undefined until the download resolves, then mirrors the config @@ -83,7 +83,7 @@ paths — ready to pass straight to a `create` factory: ```typescript import { download, models } from 'react-native-executorch'; -const model = await download(models.classification.EFFICIENTNET_V2_S.XNNPACK_FP32, { +const model = await download(models.classification.EFFICIENTNET_V2_S.XNNPACK_INT8, { onProgress: (p) => console.log(`${Math.round(p * 100)}%`), }); diff --git a/packages/react-native-executorch/__tests__/api/modelVariants.test.ts b/packages/react-native-executorch/__tests__/api/modelVariants.test.ts index ef303485c6..6c02187464 100644 --- a/packages/react-native-executorch/__tests__/api/modelVariants.test.ts +++ b/packages/react-native-executorch/__tests__/api/modelVariants.test.ts @@ -33,6 +33,11 @@ const modelPathsOf = (config: Node): string => .sort() .join('|'); +const modelUrlsOf = (config: Node): string[] => + typeof config.modelPath === 'string' + ? [config.modelPath] + : Object.values(config.modelPaths as Node).map(String); + const isUpperKey = (key: string) => /^[A-Z0-9_]+$/.test(key); /** Every group that names a `DEFAULT`, with the dotted path it sits at. */ @@ -326,6 +331,79 @@ describe('variant selection rules', () => { }); }); +describe('deprecated variants', () => { + /** The devices a `DEFAULT` can resolve differently on. */ + const devices = [ + { os: 'ios' as const }, + { os: 'android' as const }, + { os: 'ios' as const, isEmulator: true }, + { os: 'ios' as const, backends: ['XnnpackBackend'] }, + { os: 'android' as const, backends: ['XnnpackBackend'] }, + ]; + + /** + * Every group of the registry as resolved on `device`, with the notices of + * the variants it deprecates. Read from the deprecation module the reloaded + * registry registered them in. + */ + function deprecationsFor(device: Parameters[0]) { + const registry = registryFor(device); + const { deprecationOf } = require('../../src/deprecation') as { + deprecationOf: (modelPath: string) => string | undefined; + }; + return variantGroups(registry).map(({ label, group }) => ({ + label, + group, + notices: new Map( + namedVariants(group).flatMap(([key, config]) => { + const notice = modelUrlsOf(config) + .map(deprecationOf) + .find((n) => n !== undefined); + return notice === undefined ? [] : [[key, notice] as const]; + }) + ), + })); + } + + it('finds deprecated variants to check', () => { + const count = deprecationsFor({ os: 'android' }).reduce( + (n, { notices }) => n + notices.size, + 0 + ); + expect(count).toBeGreaterThan(0); + }); + + it('never defaults to a deprecated variant, on any device', () => { + const offenders = devices.flatMap((device) => + deprecationsFor(device) + .filter(({ group, notices }) => notices.has(defaultKeyOf(group) ?? '')) + .map(({ label, group }) => `${JSON.stringify(device)} ${label}: ${defaultKeyOf(group)}`) + ); + + expect(offenders).toEqual([]); + }); + + it('points every deprecated variant at a supported sibling', () => { + const offenders = deprecationsFor({ os: 'android' }).flatMap(({ label, group, notices }) => + [...notices].flatMap(([key, notice]) => { + const prefix = `models.${label}.`; + const named = notice.match(/^(\S+) is deprecated.* Use (\S+), which/); + const replacement = named?.[2]?.startsWith(prefix) + ? named[2].slice(prefix.length) + : undefined; + const ok = + named?.[1] === `${prefix}${key}` && + replacement !== undefined && + isConfig(group[replacement]) && + !notices.has(replacement); + return ok ? [] : [`${label}.${key}: ${notice}`]; + }) + ); + + expect(offenders).toEqual([]); + }); +}); + describe('feature map', () => { // `models...DEFAULT` only reaches the accelerated export when // the app downloaded that backend, and `features` is the documented way to diff --git a/packages/react-native-executorch/__tests__/fetcher/download.test.ts b/packages/react-native-executorch/__tests__/fetcher/download.test.ts index 003ac5180a..d3fa796924 100644 --- a/packages/react-native-executorch/__tests__/fetcher/download.test.ts +++ b/packages/react-native-executorch/__tests__/fetcher/download.test.ts @@ -1,4 +1,5 @@ import { isRnExecuTorchError } from '../../src/core/error'; +import { registerDeprecation } from '../../src/deprecation'; import { download } from '../../src/fetcher/fetcher'; import { setTelemetryEnabled } from '../../src/fetcher/telemetry'; import { until } from '../support/async'; @@ -108,6 +109,22 @@ describe('download — resolution', () => { }); }); +describe('download — deprecated models', () => { + it('warns once per deprecated model, however often it is downloaded', async () => { + const warn = jest.spyOn(console, 'warn').mockImplementation(() => {}); + const deprecatedUrl = 'https://huggingface.co/software-mansion/model/resolve/v1/old.pte'; + registerDeprecation(deprecatedUrl, 'old.pte is deprecated.'); + fakeNet.serve(deprecatedUrl); + fakeNet.serve(URL_B); + + await download({ modelPath: deprecatedUrl, tokenizerPath: URL_B }); + await download({ modelPath: deprecatedUrl }); + + expect(warn.mock.calls).toEqual([['[React Native ExecuTorch] old.pte is deprecated.']]); + warn.mockRestore(); + }); +}); + describe('download — caching', () => { it('serves a second call from the cache without a request', async () => { fakeNet.serve(URL_A); diff --git a/packages/react-native-executorch/src/deprecation.ts b/packages/react-native-executorch/src/deprecation.ts new file mode 100644 index 0000000000..3fd6b4dd39 --- /dev/null +++ b/packages/react-native-executorch/src/deprecation.ts @@ -0,0 +1,45 @@ +/** + * Registry variants on their way out. A variant is deprecated once a twin on the + * same backend runs faster from a smaller download without losing accuracy. It + * keeps working until v1.0.0, warning whenever it is downloaded, and is then + * removed. + */ + +// Keyed by model URL rather than by config object, so a config the app copied +// or extended (`{ ...models.x.Y.XNNPACK_FP32, modelOpts }`) still warns. +const notices = new Map(); +const warned = new Set(); + +/** + * Records that the model at `modelPath` is deprecated. + * @param modelPath The variant's remote `.pte` URL. + * @param notice What to tell the developer, including what to use instead. + */ +export function registerDeprecation(modelPath: string, notice: string): void { + notices.set(modelPath, notice); +} + +/** + * The deprecation notice for a model URL, if it has one. + * @param modelPath A remote `.pte` URL. + * @returns The notice, or `undefined` for a supported model. + */ +export function deprecationOf(modelPath: string): string | undefined { + return notices.get(modelPath); +} + +/** + * Warns, once per URL and in development only, about every deprecated model + * among `urls`. + * @param urls The remote sources about to be downloaded. + */ +export function warnIfDeprecated(urls: Iterable): void { + if (!__DEV__) return; + for (const url of urls) { + const notice = notices.get(url); + if (notice === undefined || warned.has(url)) continue; + warned.add(url); + // eslint-disable-next-line no-console + console.warn(`[React Native ExecuTorch] ${notice}`); + } +} diff --git a/packages/react-native-executorch/src/fetcher/fetcher.ts b/packages/react-native-executorch/src/fetcher/fetcher.ts index dc0985c0a6..1a2d29dbf9 100644 --- a/packages/react-native-executorch/src/fetcher/fetcher.ts +++ b/packages/react-native-executorch/src/fetcher/fetcher.ts @@ -8,6 +8,7 @@ import { type BackgroundDownloadTask, } from './backgroundDownloader'; import { RnExecuTorchError } from '../core/error'; +import { warnIfDeprecated } from '../deprecation'; const IS_ANDROID = Platform.OS === 'android'; @@ -754,7 +755,7 @@ function substituteRemoteSources(node: T, resolved: ReadonlyMap` factory: * * ```ts - * const model = await download(models.classification.EFFICIENTNET_V2_S.XNNPACK_FP32); + * const model = await download(models.classification.EFFICIENTNET_V2_S.XNNPACK_INT8); * const { classify, dispose } = await createClassifier(model); * ``` * @@ -778,6 +779,7 @@ function substituteRemoteSources(node: T, resolved: ReadonlyMap(source: T, options: DownloadOptions = {}): Promise { const urls = [...collectRemoteSources(source)]; + warnIfDeprecated(urls); // Nothing to fetch — every source is already a local path. if (urls.length === 0) { diff --git a/packages/react-native-executorch/src/models.ts b/packages/react-native-executorch/src/models.ts index de37ec051d..4f43e54d49 100644 --- a/packages/react-native-executorch/src/models.ts +++ b/packages/react-native-executorch/src/models.ts @@ -16,6 +16,7 @@ import { Platform } from 'react-native'; import { rnexecutorchJsi } from './native/bridge'; import { getRegisteredBackends } from './utils'; +import { registerDeprecation } from './deprecation'; import type { ClassifierModel } from './extensions/cv/tasks/classification'; import type { ObjectDetectorModel } from './extensions/cv/tasks/objectDetection'; import type { StyleTransferModel } from './extensions/cv/tasks/styleTransfer'; @@ -173,6 +174,62 @@ function family>( return { ...map, DEFAULT: map[first]!.DEFAULT as V[keyof V]['DEFAULT'] }; } +// Deprecated variants, mapped to the key of the sibling that replaces them. +// The registry is walked once it is built, so that each warning can name both +// by their full path. +const REPLACEMENTS = new Map(); + +/** + * Marks a variant deprecated in favour of a sibling in the same group. It still + * loads, and warns on download, until it is removed in v1.0.0. + * Never declare it ahead of its replacement, or it can become the `DEFAULT`. + * @typeParam T The variant's config. + * @param config The deprecated variant. + * @param replacement The key of the sibling variant to use instead. + * @returns `config`, unchanged. + */ +function deprecated< + T extends { readonly modelPath: string } | { readonly modelPaths: Record }, +>(config: T, replacement: string): T { + REPLACEMENTS.set(config, replacement); + return config; +} + +/** + * The remote `.pte` URLs of a variant config. + * @param config A single-file (`modelPath`) or multi-file (`modelPaths`) config. + * @returns Its model URLs. + */ +function modelUrls(config: object): string[] { + if ('modelPath' in config) return [(config as { modelPath: string }).modelPath]; + return Object.values((config as { modelPaths: Record }).modelPaths); +} + +/** + * Registers the download warning of every variant marked {@link deprecated}. + * @param node A registry branch. + * @param path The branch's dotted path, starting at `models`. + */ +function registerDeprecations(node: object, path: string): void { + for (const [key, value] of Object.entries(node)) { + if (key === 'DEFAULT' || typeof value !== 'object' || value === null) continue; + const replacement = REPLACEMENTS.get(value); + if (replacement !== undefined) { + const notice = + `${path}.${key} is deprecated and will be removed in v1.0.0. ` + + `Use ${path}.${replacement}, which is faster and smaller.`; + // A multi-file variant warns only for the files its replacement does not + // reuse (Supertonic int8 keeps the fp32 duration predictor and text encoder). + const kept = new Set(modelUrls((node as Record)[replacement]!)); + for (const url of modelUrls(value)) { + if (!kept.has(url)) registerDeprecation(url, notice); + } + } else if (!('modelPath' in value) && !('modelPaths' in value)) { + registerDeprecations(value, `${path}.${key}`); + } + } +} + const BASE_URL = 'https://huggingface.co/software-mansion/react-native-executorch'; // Models resolve through VERSION_TAG, the latest published stable tag, unless // they have been re-exported for the next release, in which case their URL moves @@ -191,7 +248,7 @@ const EFFICIENTNET_V2_S_OPTS = { labels: IMAGENET1K_LABELS, }; const EFFICIENTNET_V2_S_XNNPACK_INT8: ClassifierModel = { - modelPath: `${BASE_URL}-efficientnet-v2-s/${VERSION_TAG}/xnnpack/efficientnet_v2_s_xnnpack_int8.pte`, + modelPath: `${BASE_URL}-efficientnet-v2-s/${NEXT_VERSION_TAG}/xnnpack/efficientnet_v2_s_xnnpack_int8.pte`, modelOpts: EFFICIENTNET_V2_S_OPTS, }; const EFFICIENTNET_V2_S_XNNPACK_FP32: ClassifierModel = { @@ -361,7 +418,7 @@ const DEEPLAB_V3_MOBILENET_V3_LARGE_XNNPACK_FP32: SemanticSegmenterModel = { - modelPath: `${BASE_URL}-deeplab-v3/${VERSION_TAG}/xnnpack/deeplab_v3_mobilenet_v3_large_xnnpack_int8.pte`, + modelPath: `${BASE_URL}-deeplab-v3/${NEXT_VERSION_TAG}/xnnpack/deeplab_v3_mobilenet_v3_large_xnnpack_int8.pte`, modelOpts: DEEPLAB_V3_OPTS, }; const DEEPLAB_V3_MOBILENET_V3_LARGE_COREML_FP16: SemanticSegmenterModel = { @@ -1179,6 +1236,10 @@ const ALL_MINILM_L6_V2_VULKAN_FP16: TextEmbedderModel = { modelPath: `${BASE_URL}-all-MiniLM-L6-v2/${VERSION_TAG}/vulkan/all_minilm_l6_v2_vulkan_fp16.pte`, tokenizerPath: `${BASE_URL}-all-MiniLM-L6-v2/${VERSION_TAG}/tokenizer.json`, }; +const ALL_MPNET_BASE_V2_XNNPACK_INT8: TextEmbedderModel = { + modelPath: `${BASE_URL}-all-mpnet-base-v2/${NEXT_VERSION_TAG}/xnnpack/all_mpnet_base_v2_xnnpack_int8.pte`, + tokenizerPath: `${BASE_URL}-all-mpnet-base-v2/${VERSION_TAG}/tokenizer.json`, +}; const ALL_MPNET_BASE_V2_XNNPACK_8DA4W: TextEmbedderModel = { modelPath: `${BASE_URL}-all-mpnet-base-v2/${NEXT_VERSION_TAG}/xnnpack/all_mpnet_base_v2_xnnpack_8da4w.pte`, tokenizerPath: `${BASE_URL}-all-mpnet-base-v2/${VERSION_TAG}/tokenizer.json`, @@ -1215,6 +1276,10 @@ const MULTI_QA_MINILM_L6_COS_V1_VULKAN_FP16: TextEmbedderModel = { modelPath: `${BASE_URL}-multi-qa-MiniLM-L6-cos-v1/${VERSION_TAG}/vulkan/multi_qa_minilm_l6_cos_v1_vulkan_fp16.pte`, tokenizerPath: `${BASE_URL}-multi-qa-MiniLM-L6-cos-v1/${VERSION_TAG}/tokenizer.json`, }; +const MULTI_QA_MPNET_BASE_DOT_V1_XNNPACK_INT8: TextEmbedderModel = { + modelPath: `${BASE_URL}-multi-qa-mpnet-base-dot-v1/${NEXT_VERSION_TAG}/xnnpack/multi_qa_mpnet_base_dot_v1_xnnpack_int8.pte`, + tokenizerPath: `${BASE_URL}-multi-qa-mpnet-base-dot-v1/${VERSION_TAG}/tokenizer.json`, +}; const MULTI_QA_MPNET_BASE_DOT_V1_XNNPACK_8DA4W: TextEmbedderModel = { modelPath: `${BASE_URL}-multi-qa-mpnet-base-dot-v1/${NEXT_VERSION_TAG}/xnnpack/multi_qa_mpnet_base_dot_v1_xnnpack_8da4w.pte`, tokenizerPath: `${BASE_URL}-multi-qa-mpnet-base-dot-v1/${VERSION_TAG}/tokenizer.json`, @@ -1232,8 +1297,8 @@ const MULTI_QA_MPNET_BASE_DOT_V1_VULKAN_FP16: TextEmbedderModel = { tokenizerPath: `${BASE_URL}-multi-qa-mpnet-base-dot-v1/${VERSION_TAG}/tokenizer.json`, }; const PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_EMBEDDINGS: TextEmbedderModel = { - modelPath: `${BASE_URL}-paraphrase-multilingual-MiniLM-L12-v2/${VERSION_TAG}/xnnpack/paraphrase_multilingual_minilm_l12_v2_xnnpack_8da4w.pte`, - tokenizerPath: `${BASE_URL}-paraphrase-multilingual-MiniLM-L12-v2/${VERSION_TAG}/tokenizer.json`, + modelPath: `${BASE_URL}-paraphrase-multilingual-MiniLM-L12-v2/${NEXT_VERSION_TAG}/xnnpack/paraphrase_multilingual_minilm_l12_v2_xnnpack_8da4w.pte`, + tokenizerPath: `${BASE_URL}-paraphrase-multilingual-MiniLM-L12-v2/${NEXT_VERSION_TAG}/tokenizer.json`, }; const PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_XNNPACK_FP32: TextEmbedderModel = { modelPath: `${BASE_URL}-paraphrase-multilingual-MiniLM-L12-v2/${VERSION_TAG}/xnnpack/paraphrase_multilingual_minilm_l12_v2_xnnpack_fp32.pte`, @@ -1252,8 +1317,8 @@ const PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_VULKAN_FP16: TextEmbedderModel = { tokenizerPath: `${BASE_URL}-paraphrase-multilingual-MiniLM-L12-v2/${VERSION_TAG}/tokenizer.json`, }; const DISTILUSE_BASE_MULTILINGUAL_CASED_V2_EMBEDDINGS: TextEmbedderModel = { - modelPath: `${BASE_URL}-distiluse-base-multilingual-cased-v2/${VERSION_TAG}/xnnpack/distiluse_base_multilingual_cased_v2_xnnpack_8da4w.pte`, - tokenizerPath: `${BASE_URL}-distiluse-base-multilingual-cased-v2/${VERSION_TAG}/tokenizer.json`, + modelPath: `${BASE_URL}-distiluse-base-multilingual-cased-v2/${NEXT_VERSION_TAG}/xnnpack/distiluse_base_multilingual_cased_v2_xnnpack_8da4w.pte`, + tokenizerPath: `${BASE_URL}-distiluse-base-multilingual-cased-v2/${NEXT_VERSION_TAG}/tokenizer.json`, }; const DISTILUSE_BASE_MULTILINGUAL_CASED_V2_XNNPACK_FP32: TextEmbedderModel = { modelPath: `${BASE_URL}-distiluse-base-multilingual-cased-v2/${VERSION_TAG}/xnnpack/distiluse_base_multilingual_cased_v2_xnnpack_fp32.pte`, @@ -1559,7 +1624,7 @@ const WHISPER_SMALL_EN_XNNPACK_FP32: WhisperSttModel<'en'> = { vadModel: FSMN_VAD_XNNPACK_FP32, }; const WHISPER_SMALL_EN_XNNPACK_INT8: WhisperSttModel<'en'> = { - modelPath: `${BASE_URL}-whisper-small.en/${VERSION_TAG}/xnnpack/whisper_small_en_xnnpack_int8.pte`, + modelPath: `${BASE_URL}-whisper-small.en/${NEXT_VERSION_TAG}/xnnpack/whisper_small_en_xnnpack_int8.pte`, tokenizerPath: `${BASE_URL}-whisper-small.en/${VERSION_TAG}/tokenizer.json`, supportedLanguages: ['en'], vadModel: FSMN_VAD_XNNPACK_FP32, @@ -1945,11 +2010,6 @@ const LFM2_5_1_2B_XNNPACK_8DA4W: LLMModel = { tokenizerPath: `${LFM2_5_BASE_URL}/1_2b/tokenizer.json`, tokenizerConfigPath: `${LFM2_5_BASE_URL}/1_2b/tokenizer_config.json`, }; -const LFM2_5_1_2B_XNNPACK_FP16: LLMModel = { - modelPath: `${LFM2_5_BASE_URL}/1_2b/xnnpack/lfm_2_5_1_2b_xnnpack_fp16.pte`, - tokenizerPath: `${LFM2_5_BASE_URL}/1_2b/tokenizer.json`, - tokenizerConfigPath: `${LFM2_5_BASE_URL}/1_2b/tokenizer_config.json`, -}; const LFM2_5_1_2B_MLX_INT4: LLMModel = { modelPath: `${LFM2_5_BASE_URL}/1_2b/mlx/lfm_2_5_1_2b_mlx_int4.pte`, tokenizerPath: `${LFM2_5_BASE_URL}/1_2b/tokenizer.json`, @@ -1960,11 +2020,6 @@ const LFM2_5_350M_XNNPACK_8DA4W: LLMModel = { tokenizerPath: `${LFM2_5_BASE_URL}/350m/tokenizer.json`, tokenizerConfigPath: `${LFM2_5_BASE_URL}/350m/tokenizer_config.json`, }; -const LFM2_5_350M_XNNPACK_FP16: LLMModel = { - modelPath: `${LFM2_5_BASE_URL}/350m/xnnpack/lfm_2_5_350m_xnnpack_fp16.pte`, - tokenizerPath: `${LFM2_5_BASE_URL}/350m/tokenizer.json`, - tokenizerConfigPath: `${LFM2_5_BASE_URL}/350m/tokenizer_config.json`, -}; const LFM2_5_350M_MLX_INT4: LLMModel = { modelPath: `${LFM2_5_BASE_URL}/350m/mlx/lfm_2_5_350m_mlx_int4.pte`, tokenizerPath: `${LFM2_5_BASE_URL}/350m/tokenizer.json`, @@ -2039,11 +2094,6 @@ const BIELIK_V3_1_5B_XNNPACK_8DA4W: LLMModel = { tokenizerPath: `${BIELIK_V3_1_5B_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${BIELIK_V3_1_5B_BASE_URL}/tokenizer_config.json`, }; -const BIELIK_V3_1_5B_XNNPACK_FP16: LLMModel = { - modelPath: `${BIELIK_V3_1_5B_BASE_URL}/xnnpack/bielik_v3_0_1_5b_xnnpack_fp16.pte`, - tokenizerPath: `${BIELIK_V3_1_5B_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${BIELIK_V3_1_5B_BASE_URL}/tokenizer_config.json`, -}; const LLAMA3_2_BASE_URL = `${BASE_URL}-llama-3.2/${VERSION_TAG}`; @@ -2052,21 +2102,11 @@ const LLAMA3_2_3B_SPINQUANT: LLMModel = { tokenizerPath: `${LLAMA3_2_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${LLAMA3_2_BASE_URL}/tokenizer_config.json`, }; -const LLAMA3_2_3B_BF16: LLMModel = { - modelPath: `${LLAMA3_2_BASE_URL}/3b/xnnpack/llama_3_2_3b_xnnpack_bf16.pte`, - tokenizerPath: `${LLAMA3_2_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${LLAMA3_2_BASE_URL}/tokenizer_config.json`, -}; const LLAMA3_2_1B_SPINQUANT: LLMModel = { modelPath: `${LLAMA3_2_BASE_URL}/1b/xnnpack/llama_3_2_1b_xnnpack_spinquant.pte`, tokenizerPath: `${LLAMA3_2_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${LLAMA3_2_BASE_URL}/tokenizer_config.json`, }; -const LLAMA3_2_1B_BF16: LLMModel = { - modelPath: `${LLAMA3_2_BASE_URL}/1b/xnnpack/llama_3_2_1b_xnnpack_bf16.pte`, - tokenizerPath: `${LLAMA3_2_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${LLAMA3_2_BASE_URL}/tokenizer_config.json`, -}; const LLAMA3_2_1B_MLX_INT4: LLMModel = { modelPath: `${LLAMA3_2_BASE_URL}/1b/mlx/llama_3_2_1b_mlx_int4.pte`, tokenizerPath: `${LLAMA3_2_BASE_URL}/tokenizer.json`, @@ -2118,31 +2158,16 @@ const HAMMER2_1_0_5B_XNNPACK_8DA4W: LLMModel = { tokenizerPath: `${HAMMER2_1_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${HAMMER2_1_BASE_URL}/tokenizer_config.json`, }; -const HAMMER2_1_0_5B_XNNPACK_BF16: LLMModel = { - modelPath: `${HAMMER2_1_BASE_URL}/0_5b/xnnpack/hammer_2_1_0_5b_xnnpack_bf16.pte`, - tokenizerPath: `${HAMMER2_1_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${HAMMER2_1_BASE_URL}/tokenizer_config.json`, -}; const HAMMER2_1_1_5B_XNNPACK_8DA4W: LLMModel = { modelPath: `${HAMMER2_1_BASE_URL}/1_5b/xnnpack/hammer_2_1_1_5b_xnnpack_8da4w.pte`, tokenizerPath: `${HAMMER2_1_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${HAMMER2_1_BASE_URL}/tokenizer_config.json`, }; -const HAMMER2_1_1_5B_XNNPACK_BF16: LLMModel = { - modelPath: `${HAMMER2_1_BASE_URL}/1_5b/xnnpack/hammer_2_1_1_5b_xnnpack_bf16.pte`, - tokenizerPath: `${HAMMER2_1_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${HAMMER2_1_BASE_URL}/tokenizer_config.json`, -}; const HAMMER2_1_3B_XNNPACK_8DA4W: LLMModel = { modelPath: `${HAMMER2_1_BASE_URL}/3b/xnnpack/hammer_2_1_3b_xnnpack_8da4w.pte`, tokenizerPath: `${HAMMER2_1_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${HAMMER2_1_BASE_URL}/tokenizer_config.json`, }; -const HAMMER2_1_3B_XNNPACK_BF16: LLMModel = { - modelPath: `${HAMMER2_1_BASE_URL}/3b/xnnpack/hammer_2_1_3b_xnnpack_bf16.pte`, - tokenizerPath: `${HAMMER2_1_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${HAMMER2_1_BASE_URL}/tokenizer_config.json`, -}; const HAMMER2_1_0_5B_MLX_INT4: LLMModel = { modelPath: `${HAMMER2_1_BASE_URL}/0_5b/mlx/hammer_2_1_0_5b_mlx_int4.pte`, tokenizerPath: `${HAMMER2_1_BASE_URL}/tokenizer.json`, @@ -2166,11 +2191,6 @@ const PHI4_MINI_XNNPACK_8DA4W: LLMModel = { tokenizerPath: `${PHI4_MINI_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${PHI4_MINI_BASE_URL}/tokenizer_config.json`, }; -const PHI4_MINI_XNNPACK_BF16: LLMModel = { - modelPath: `${PHI4_MINI_BASE_URL}/xnnpack/phi_4_mini_xnnpack_bf16.pte`, - tokenizerPath: `${PHI4_MINI_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${PHI4_MINI_BASE_URL}/tokenizer_config.json`, -}; const PHI4_MINI_MLX_INT4: LLMModel = { modelPath: `${PHI4_MINI_BASE_URL}/mlx/phi_4_mini_mlx_int4.pte`, tokenizerPath: `${PHI4_MINI_BASE_URL}/tokenizer.json`, @@ -2184,31 +2204,16 @@ const QWEN2_5_0_5B_XNNPACK_8DA4W: LLMModel = { tokenizerPath: `${QWEN2_5_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${QWEN2_5_BASE_URL}/tokenizer_config.json`, }; -const QWEN2_5_0_5B_XNNPACK_BF16: LLMModel = { - modelPath: `${QWEN2_5_BASE_URL}/0_5b/xnnpack/qwen_2_5_0_5b_xnnpack_bf16.pte`, - tokenizerPath: `${QWEN2_5_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${QWEN2_5_BASE_URL}/tokenizer_config.json`, -}; const QWEN2_5_1_5B_XNNPACK_8DA4W: LLMModel = { modelPath: `${QWEN2_5_BASE_URL}/1_5b/xnnpack/qwen_2_5_1_5b_xnnpack_8da4w.pte`, tokenizerPath: `${QWEN2_5_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${QWEN2_5_BASE_URL}/tokenizer_config.json`, }; -const QWEN2_5_1_5B_XNNPACK_BF16: LLMModel = { - modelPath: `${QWEN2_5_BASE_URL}/1_5b/xnnpack/qwen_2_5_1_5b_xnnpack_bf16.pte`, - tokenizerPath: `${QWEN2_5_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${QWEN2_5_BASE_URL}/tokenizer_config.json`, -}; const QWEN2_5_3B_XNNPACK_8DA4W: LLMModel = { modelPath: `${QWEN2_5_BASE_URL}/3b/xnnpack/qwen_2_5_3b_xnnpack_8da4w.pte`, tokenizerPath: `${QWEN2_5_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${QWEN2_5_BASE_URL}/tokenizer_config.json`, }; -const QWEN2_5_3B_XNNPACK_BF16: LLMModel = { - modelPath: `${QWEN2_5_BASE_URL}/3b/xnnpack/qwen_2_5_3b_xnnpack_bf16.pte`, - tokenizerPath: `${QWEN2_5_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${QWEN2_5_BASE_URL}/tokenizer_config.json`, -}; const QWEN2_5_0_5B_MLX_INT4: LLMModel = { modelPath: `${QWEN2_5_BASE_URL}/0_5b/mlx/qwen_2_5_0_5b_mlx_int4.pte`, tokenizerPath: `${QWEN2_5_BASE_URL}/tokenizer.json`, @@ -2250,31 +2255,16 @@ const QWEN3_0_6B_XNNPACK_8DA4W: LLMModel = { tokenizerPath: `${QWEN3_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${QWEN3_BASE_URL}/tokenizer_config.json`, }; -const QWEN3_0_6B_XNNPACK_BF16: LLMModel = { - modelPath: `${QWEN3_BASE_URL}/0_6b/xnnpack/qwen_3_0_6b_xnnpack_bf16.pte`, - tokenizerPath: `${QWEN3_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${QWEN3_BASE_URL}/tokenizer_config.json`, -}; const QWEN3_1_7B_XNNPACK_8DA4W: LLMModel = { modelPath: `${QWEN3_BASE_URL}/1_7b/xnnpack/qwen_3_1_7b_xnnpack_8da4w.pte`, tokenizerPath: `${QWEN3_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${QWEN3_BASE_URL}/tokenizer_config.json`, }; -const QWEN3_1_7B_XNNPACK_BF16: LLMModel = { - modelPath: `${QWEN3_BASE_URL}/1_7b/xnnpack/qwen_3_1_7b_xnnpack_bf16.pte`, - tokenizerPath: `${QWEN3_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${QWEN3_BASE_URL}/tokenizer_config.json`, -}; const QWEN3_4B_XNNPACK_8DA4W: LLMModel = { modelPath: `${QWEN3_BASE_URL}/4b/xnnpack/qwen_3_4b_xnnpack_8da4w.pte`, tokenizerPath: `${QWEN3_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${QWEN3_BASE_URL}/tokenizer_config.json`, }; -const QWEN3_4B_XNNPACK_BF16: LLMModel = { - modelPath: `${QWEN3_BASE_URL}/4b/xnnpack/qwen_3_4b_xnnpack_bf16.pte`, - tokenizerPath: `${QWEN3_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${QWEN3_BASE_URL}/tokenizer_config.json`, -}; const QWEN3_0_6B_MLX_INT4: LLMModel = { modelPath: `${QWEN3_BASE_URL}/0_6b/mlx/qwen_3_0_6b_mlx_int4.pte`, tokenizerPath: `${QWEN3_BASE_URL}/tokenizer.json`, @@ -2318,9 +2308,12 @@ export const models = { * architecture providing high accuracy for general-purpose image * classification. */ + // int8 keeps its squeeze-excitation blocks fp32: 75.0% top-1 on 1000 + // ImageNetV2 images against fp32's 75.8%, still 2.2x faster than fp32. EFFICIENTNET_V2_S: variants({ XNNPACK_INT8: EFFICIENTNET_V2_S_XNNPACK_INT8, - XNNPACK_FP32: EFFICIENTNET_V2_S_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(EFFICIENTNET_V2_S_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: EFFICIENTNET_V2_S_COREML_FP16, }), }, @@ -2336,7 +2329,8 @@ export const models = { */ CANDY: variants({ XNNPACK_INT8: STYLE_TRANSFER_CANDY_XNNPACK_INT8, - XNNPACK_FP32: STYLE_TRANSFER_CANDY_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(STYLE_TRANSFER_CANDY_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: STYLE_TRANSFER_CANDY_COREML_FP16, VULKAN_FP16: STYLE_TRANSFER_CANDY_VULKAN_FP16, }), @@ -2346,7 +2340,8 @@ export const models = { */ MOSAIC: variants({ XNNPACK_INT8: STYLE_TRANSFER_MOSAIC_XNNPACK_INT8, - XNNPACK_FP32: STYLE_TRANSFER_MOSAIC_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(STYLE_TRANSFER_MOSAIC_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: STYLE_TRANSFER_MOSAIC_COREML_FP16, VULKAN_FP16: STYLE_TRANSFER_MOSAIC_VULKAN_FP16, }), @@ -2356,7 +2351,8 @@ export const models = { */ RAIN_PRINCESS: variants({ XNNPACK_INT8: STYLE_TRANSFER_RAIN_PRINCESS_XNNPACK_INT8, - XNNPACK_FP32: STYLE_TRANSFER_RAIN_PRINCESS_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(STYLE_TRANSFER_RAIN_PRINCESS_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: STYLE_TRANSFER_RAIN_PRINCESS_COREML_FP16, VULKAN_FP16: STYLE_TRANSFER_RAIN_PRINCESS_VULKAN_FP16, }), @@ -2366,7 +2362,8 @@ export const models = { */ UDNIE: variants({ XNNPACK_INT8: STYLE_TRANSFER_UDNIE_XNNPACK_INT8, - XNNPACK_FP32: STYLE_TRANSFER_UDNIE_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(STYLE_TRANSFER_UDNIE_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: STYLE_TRANSFER_UDNIE_COREML_FP16, VULKAN_FP16: STYLE_TRANSFER_UDNIE_VULKAN_FP16, }), @@ -2401,7 +2398,8 @@ export const models = { */ LRASPP_MOBILENET_V3_LARGE: variants({ XNNPACK_INT8: LRASPP_MOBILENET_V3_LARGE_XNNPACK_INT8, - XNNPACK_FP32: LRASPP_MOBILENET_V3_LARGE_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(LRASPP_MOBILENET_V3_LARGE_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: LRASPP_MOBILENET_V3_LARGE_COREML_FP16, }), /** @@ -2411,7 +2409,8 @@ export const models = { */ DEEPLAB_V3_RESNET50: variants({ XNNPACK_INT8: DEEPLAB_V3_RESNET50_XNNPACK_INT8, - XNNPACK_FP32: DEEPLAB_V3_RESNET50_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(DEEPLAB_V3_RESNET50_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: DEEPLAB_V3_RESNET50_COREML_FP16, }), /** @@ -2421,7 +2420,8 @@ export const models = { */ DEEPLAB_V3_RESNET101: variants({ XNNPACK_INT8: DEEPLAB_V3_RESNET101_XNNPACK_INT8, - XNNPACK_FP32: DEEPLAB_V3_RESNET101_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(DEEPLAB_V3_RESNET101_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: DEEPLAB_V3_RESNET101_COREML_FP16, }), /** @@ -2429,9 +2429,12 @@ export const models = { * classes, see {@link PASCAL_VOC_LABELS}). Combines DeepLabV3 feature * extraction quality with a lightweight mobile backbone. */ + // int8 keeps the stem and the classifier convolution fp32: 68.88 mIoU on + // 300 VOC2012 val images against fp32's 69.13. DEEPLAB_V3_MOBILENET_V3_LARGE: variants({ XNNPACK_INT8: DEEPLAB_V3_MOBILENET_V3_LARGE_XNNPACK_INT8, - XNNPACK_FP32: DEEPLAB_V3_MOBILENET_V3_LARGE_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(DEEPLAB_V3_MOBILENET_V3_LARGE_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: DEEPLAB_V3_MOBILENET_V3_LARGE_COREML_FP16, }), /** @@ -2440,7 +2443,8 @@ export const models = { */ FCN_RESNET50: variants({ XNNPACK_INT8: FCN_RESNET50_XNNPACK_INT8, - XNNPACK_FP32: FCN_RESNET50_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(FCN_RESNET50_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: FCN_RESNET50_COREML_FP16, }), /** @@ -2449,7 +2453,8 @@ export const models = { */ FCN_RESNET101: variants({ XNNPACK_INT8: FCN_RESNET101_XNNPACK_INT8, - XNNPACK_FP32: FCN_RESNET101_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(FCN_RESNET101_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: FCN_RESNET101_COREML_FP16, }), }, @@ -2474,7 +2479,8 @@ export const models = { */ RFDETR_NANO: variants({ XNNPACK_INT8: RFDETR_NANO_DETECTOR_XNNPACK_INT8, - XNNPACK_FP32: RFDETR_NANO_DETECTOR_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(RFDETR_NANO_DETECTOR_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: RFDETR_NANO_DETECTOR_COREML_FP16, VULKAN_FP16: RFDETR_NANO_DETECTOR_VULKAN_FP16, }), @@ -2492,19 +2498,22 @@ export const models = { NANO: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_NANO_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_NANO_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_NANO_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_NANO_384_COREML_FP16, VULKAN_FP16: YOLO26_NANO_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_NANO_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_NANO_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_NANO_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_NANO_512_COREML_FP16, VULKAN_FP16: YOLO26_NANO_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_NANO_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_NANO_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_NANO_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_NANO_640_COREML_FP16, VULKAN_FP16: YOLO26_NANO_640_VULKAN_FP16, }), @@ -2516,19 +2525,22 @@ export const models = { SMALL: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_SMALL_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_SMALL_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_SMALL_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_SMALL_384_COREML_FP16, VULKAN_FP16: YOLO26_SMALL_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_SMALL_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_SMALL_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_SMALL_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_SMALL_512_COREML_FP16, VULKAN_FP16: YOLO26_SMALL_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_SMALL_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_SMALL_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_SMALL_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_SMALL_640_COREML_FP16, VULKAN_FP16: YOLO26_SMALL_640_VULKAN_FP16, }), @@ -2540,19 +2552,22 @@ export const models = { MEDIUM: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_MEDIUM_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_MEDIUM_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_MEDIUM_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_MEDIUM_384_COREML_FP16, VULKAN_FP16: YOLO26_MEDIUM_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_MEDIUM_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_MEDIUM_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_MEDIUM_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_MEDIUM_512_COREML_FP16, VULKAN_FP16: YOLO26_MEDIUM_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_MEDIUM_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_MEDIUM_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_MEDIUM_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_MEDIUM_640_COREML_FP16, VULKAN_FP16: YOLO26_MEDIUM_640_VULKAN_FP16, }), @@ -2563,19 +2578,22 @@ export const models = { LARGE: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_LARGE_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_LARGE_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_LARGE_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_LARGE_384_COREML_FP16, VULKAN_FP16: YOLO26_LARGE_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_LARGE_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_LARGE_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_LARGE_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_LARGE_512_COREML_FP16, VULKAN_FP16: YOLO26_LARGE_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_LARGE_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_LARGE_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_LARGE_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_LARGE_640_COREML_FP16, VULKAN_FP16: YOLO26_LARGE_640_VULKAN_FP16, }), @@ -2587,19 +2605,22 @@ export const models = { XLARGE: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_XLARGE_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_XLARGE_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_XLARGE_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_XLARGE_384_COREML_FP16, VULKAN_FP16: YOLO26_XLARGE_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_XLARGE_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_XLARGE_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_XLARGE_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_XLARGE_512_COREML_FP16, VULKAN_FP16: YOLO26_XLARGE_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_XLARGE_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_XLARGE_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_XLARGE_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_XLARGE_640_COREML_FP16, VULKAN_FP16: YOLO26_XLARGE_640_VULKAN_FP16, }), @@ -2640,19 +2661,22 @@ export const models = { YOLO26_POSE: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_POSE_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_POSE_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_POSE_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_POSE_384_COREML_FP16, VULKAN_FP16: YOLO26_POSE_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_POSE_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_POSE_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_POSE_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_POSE_512_COREML_FP16, VULKAN_FP16: YOLO26_POSE_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_POSE_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_POSE_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_POSE_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_POSE_640_COREML_FP16, VULKAN_FP16: YOLO26_POSE_640_VULKAN_FP16, }), @@ -2664,7 +2688,8 @@ export const models = { RFDETR_KEYPOINT: variants( { XNNPACK_INT8: RFDETR_KEYPOINT_XNNPACK_INT8, - XNNPACK_FP32: RFDETR_KEYPOINT_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(RFDETR_KEYPOINT_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: RFDETR_KEYPOINT_COREML_FP16, VULKAN_FP16: RFDETR_KEYPOINT_VULKAN_FP16, }, @@ -2688,7 +2713,8 @@ export const models = { */ S: variants({ XNNPACK_INT8: FASTSAM_S_XNNPACK_INT8, - XNNPACK_FP32: FASTSAM_S_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(FASTSAM_S_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: FASTSAM_S_COREML_FP16, VULKAN_FP16: FASTSAM_S_VULKAN_FP16, }), @@ -2697,7 +2723,8 @@ export const models = { */ X: variants({ XNNPACK_INT8: FASTSAM_X_XNNPACK_INT8, - XNNPACK_FP32: FASTSAM_X_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(FASTSAM_X_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: FASTSAM_X_COREML_FP16, VULKAN_FP16: FASTSAM_X_VULKAN_FP16, }), @@ -2709,7 +2736,8 @@ export const models = { */ RFDETR_NANO: variants({ XNNPACK_INT8: RFDETR_NANO_SEG_XNNPACK_INT8, - XNNPACK_FP32: RFDETR_NANO_SEG_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(RFDETR_NANO_SEG_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: RFDETR_NANO_SEG_COREML_FP16, VULKAN_FP16: RFDETR_NANO_SEG_VULKAN_FP16, }), @@ -2727,19 +2755,22 @@ export const models = { NANO: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_NANO_SEG_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_NANO_SEG_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_NANO_SEG_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_NANO_SEG_384_COREML_FP16, VULKAN_FP16: YOLO26_NANO_SEG_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_NANO_SEG_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_NANO_SEG_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_NANO_SEG_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_NANO_SEG_512_COREML_FP16, VULKAN_FP16: YOLO26_NANO_SEG_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_NANO_SEG_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_NANO_SEG_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_NANO_SEG_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_NANO_SEG_640_COREML_FP16, VULKAN_FP16: YOLO26_NANO_SEG_640_VULKAN_FP16, }), @@ -2751,19 +2782,22 @@ export const models = { SMALL: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_SMALL_SEG_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_SMALL_SEG_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_SMALL_SEG_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_SMALL_SEG_384_COREML_FP16, VULKAN_FP16: YOLO26_SMALL_SEG_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_SMALL_SEG_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_SMALL_SEG_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_SMALL_SEG_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_SMALL_SEG_512_COREML_FP16, VULKAN_FP16: YOLO26_SMALL_SEG_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_SMALL_SEG_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_SMALL_SEG_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_SMALL_SEG_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_SMALL_SEG_640_COREML_FP16, VULKAN_FP16: YOLO26_SMALL_SEG_640_VULKAN_FP16, }), @@ -2775,19 +2809,22 @@ export const models = { MEDIUM: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_MEDIUM_SEG_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_MEDIUM_SEG_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_MEDIUM_SEG_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_MEDIUM_SEG_384_COREML_FP16, VULKAN_FP16: YOLO26_MEDIUM_SEG_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_MEDIUM_SEG_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_MEDIUM_SEG_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_MEDIUM_SEG_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_MEDIUM_SEG_512_COREML_FP16, VULKAN_FP16: YOLO26_MEDIUM_SEG_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_MEDIUM_SEG_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_MEDIUM_SEG_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_MEDIUM_SEG_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_MEDIUM_SEG_640_COREML_FP16, VULKAN_FP16: YOLO26_MEDIUM_SEG_640_VULKAN_FP16, }), @@ -2799,19 +2836,22 @@ export const models = { LARGE: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_LARGE_SEG_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_LARGE_SEG_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_LARGE_SEG_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_LARGE_SEG_384_COREML_FP16, VULKAN_FP16: YOLO26_LARGE_SEG_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_LARGE_SEG_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_LARGE_SEG_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_LARGE_SEG_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_LARGE_SEG_512_COREML_FP16, VULKAN_FP16: YOLO26_LARGE_SEG_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_LARGE_SEG_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_LARGE_SEG_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_LARGE_SEG_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_LARGE_SEG_640_COREML_FP16, VULKAN_FP16: YOLO26_LARGE_SEG_640_VULKAN_FP16, }), @@ -2823,19 +2863,22 @@ export const models = { XLARGE: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_XLARGE_SEG_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_XLARGE_SEG_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_XLARGE_SEG_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_XLARGE_SEG_384_COREML_FP16, VULKAN_FP16: YOLO26_XLARGE_SEG_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_XLARGE_SEG_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_XLARGE_SEG_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_XLARGE_SEG_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_XLARGE_SEG_512_COREML_FP16, VULKAN_FP16: YOLO26_XLARGE_SEG_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_XLARGE_SEG_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_XLARGE_SEG_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(YOLO26_XLARGE_SEG_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_XLARGE_SEG_640_COREML_FP16, VULKAN_FP16: YOLO26_XLARGE_SEG_640_VULKAN_FP16, }), @@ -2879,7 +2922,8 @@ export const models = { TINY: variants( { XNNPACK_INT8: WHISPER_TINY_XNNPACK_INT8, - XNNPACK_FP32: WHISPER_TINY_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(WHISPER_TINY_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: WHISPER_TINY_COREML_FP16, MLX_BF16: WHISPER_TINY_MLX_BF16, MLX_INT8: WHISPER_TINY_MLX_INT8, @@ -2896,7 +2940,8 @@ export const models = { BASE: variants( { XNNPACK_INT8: WHISPER_BASE_XNNPACK_INT8, - XNNPACK_FP32: WHISPER_BASE_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(WHISPER_BASE_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: WHISPER_BASE_COREML_FP16, MLX_BF16: WHISPER_BASE_MLX_BF16, MLX_INT8: WHISPER_BASE_MLX_INT8, @@ -2913,7 +2958,8 @@ export const models = { SMALL: variants( { XNNPACK_INT8: WHISPER_SMALL_XNNPACK_INT8, - XNNPACK_FP32: WHISPER_SMALL_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(WHISPER_SMALL_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: WHISPER_SMALL_COREML_FP16, MLX_INT8: WHISPER_SMALL_MLX_INT8, VULKAN_FP16: WHISPER_SMALL_VULKAN_FP16, @@ -2928,15 +2974,18 @@ export const models = { // WER and small.en 3.42% -> 3.38%: too little to outweigh halving the // download (247 MB against 399, 448 against 1129). `TINY` keeps fp32 // first because there int8 costs 6.08% -> 7.77%, a quarter of the - // accuracy the smallest model has left. + // accuracy the smallest model has left. The fp32 builds of the other two + // are deprecated: int8 is also 1.55x (base.en) and 1.68x (small.en) + // faster on an S26 Ultra. EN: { /** * English-only Whisper Tiny model. Fast and compact for English STT. */ TINY: variants( { - XNNPACK_FP32: WHISPER_TINY_EN_XNNPACK_FP32, XNNPACK_INT8: WHISPER_TINY_EN_XNNPACK_INT8, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(WHISPER_TINY_EN_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: WHISPER_TINY_EN_COREML_FP16, MLX_BF16: WHISPER_TINY_EN_MLX_BF16, MLX_INT8: WHISPER_TINY_EN_MLX_INT8, @@ -2953,7 +3002,8 @@ export const models = { BASE: variants( { XNNPACK_INT8: WHISPER_BASE_EN_XNNPACK_INT8, - XNNPACK_FP32: WHISPER_BASE_EN_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(WHISPER_BASE_EN_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: WHISPER_BASE_EN_COREML_FP16, MLX_BF16: WHISPER_BASE_EN_MLX_BF16, MLX_INT8: WHISPER_BASE_EN_MLX_INT8, @@ -2970,7 +3020,8 @@ export const models = { SMALL: variants( { XNNPACK_INT8: WHISPER_SMALL_EN_XNNPACK_INT8, - XNNPACK_FP32: WHISPER_SMALL_EN_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(WHISPER_SMALL_EN_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: WHISPER_SMALL_EN_COREML_FP16, MLX_INT8: WHISPER_SMALL_EN_MLX_INT8, VULKAN_FP16: WHISPER_SMALL_EN_VULKAN_FP16, @@ -3005,7 +3056,6 @@ export const models = { */ LFM2_5_1_2B: variants({ XNNPACK_8DA4W: LFM2_5_1_2B_XNNPACK_8DA4W, - XNNPACK_FP16: LFM2_5_1_2B_XNNPACK_FP16, MLX_INT4: LFM2_5_1_2B_MLX_INT4, }), /** @@ -3016,7 +3066,6 @@ export const models = { */ LFM2_5_350M: variants({ XNNPACK_8DA4W: LFM2_5_350M_XNNPACK_8DA4W, - XNNPACK_FP16: LFM2_5_350M_XNNPACK_FP16, MLX_INT4: LFM2_5_350M_MLX_INT4, }), /** @@ -3050,7 +3099,6 @@ export const models = { */ BIELIK_V3_1_5B: variants({ XNNPACK_8DA4W: BIELIK_V3_1_5B_XNNPACK_8DA4W, - XNNPACK_FP16: BIELIK_V3_1_5B_XNNPACK_FP16, }), /** * Meta Llama 3.2 1B lightweight instruction-tuned multilingual model. @@ -3061,7 +3109,6 @@ export const models = { */ LLAMA3_2_1B: variants({ XNNPACK_SPINQUANT: LLAMA3_2_1B_SPINQUANT, - XNNPACK_BF16: LLAMA3_2_1B_BF16, MLX_INT4: LLAMA3_2_1B_MLX_INT4, }), /** @@ -3072,7 +3119,6 @@ export const models = { */ LLAMA3_2_3B: variants({ XNNPACK_SPINQUANT: LLAMA3_2_3B_SPINQUANT, - XNNPACK_BF16: LLAMA3_2_3B_BF16, MLX_INT4: LLAMA3_2_3B_MLX_INT4, }), /** @@ -3112,7 +3158,6 @@ export const models = { */ HAMMER2_1_0_5B: variants({ XNNPACK_8DA4W: HAMMER2_1_0_5B_XNNPACK_8DA4W, - XNNPACK_BF16: HAMMER2_1_0_5B_XNNPACK_BF16, MLX_INT4: HAMMER2_1_0_5B_MLX_INT4, }), /** @@ -3122,7 +3167,6 @@ export const models = { */ HAMMER2_1_1_5B: variants({ XNNPACK_8DA4W: HAMMER2_1_1_5B_XNNPACK_8DA4W, - XNNPACK_BF16: HAMMER2_1_1_5B_XNNPACK_BF16, MLX_INT4: HAMMER2_1_1_5B_MLX_INT4, }), /** @@ -3133,7 +3177,6 @@ export const models = { */ HAMMER2_1_3B: variants({ XNNPACK_8DA4W: HAMMER2_1_3B_XNNPACK_8DA4W, - XNNPACK_BF16: HAMMER2_1_3B_XNNPACK_BF16, MLX_INT4: HAMMER2_1_3B_MLX_INT4, }), /** @@ -3144,7 +3187,6 @@ export const models = { */ PHI4_MINI: variants({ XNNPACK_8DA4W: PHI4_MINI_XNNPACK_8DA4W, - XNNPACK_BF16: PHI4_MINI_XNNPACK_BF16, MLX_INT4: PHI4_MINI_MLX_INT4, }), /** @@ -3155,7 +3197,6 @@ export const models = { */ QWEN2_5_0_5B: variants({ XNNPACK_8DA4W: QWEN2_5_0_5B_XNNPACK_8DA4W, - XNNPACK_BF16: QWEN2_5_0_5B_XNNPACK_BF16, MLX_INT4: QWEN2_5_0_5B_MLX_INT4, }), /** @@ -3166,7 +3207,6 @@ export const models = { */ QWEN2_5_1_5B: variants({ XNNPACK_8DA4W: QWEN2_5_1_5B_XNNPACK_8DA4W, - XNNPACK_BF16: QWEN2_5_1_5B_XNNPACK_BF16, MLX_INT4: QWEN2_5_1_5B_MLX_INT4, }), /** @@ -3176,7 +3216,6 @@ export const models = { */ QWEN2_5_3B: variants({ XNNPACK_8DA4W: QWEN2_5_3B_XNNPACK_8DA4W, - XNNPACK_BF16: QWEN2_5_3B_XNNPACK_BF16, MLX_INT4: QWEN2_5_3B_MLX_INT4, }), /** @@ -3187,7 +3226,6 @@ export const models = { */ QWEN3_0_6B: variants({ XNNPACK_8DA4W: QWEN3_0_6B_XNNPACK_8DA4W, - XNNPACK_BF16: QWEN3_0_6B_XNNPACK_BF16, MLX_INT4: QWEN3_0_6B_MLX_INT4, }), /** @@ -3197,7 +3235,6 @@ export const models = { */ QWEN3_1_7B: variants({ XNNPACK_8DA4W: QWEN3_1_7B_XNNPACK_8DA4W, - XNNPACK_BF16: QWEN3_1_7B_XNNPACK_BF16, MLX_INT4: QWEN3_1_7B_MLX_INT4, }), /** @@ -3208,7 +3245,6 @@ export const models = { */ QWEN3_4B: variants({ XNNPACK_8DA4W: QWEN3_4B_XNNPACK_8DA4W, - XNNPACK_BF16: QWEN3_4B_XNNPACK_BF16, MLX_INT4: QWEN3_4B_MLX_INT4, }), /** @@ -3236,7 +3272,8 @@ export const models = { */ ALL_MINILM_L6_V2: variants({ XNNPACK_INT8: ALL_MINILM_L6_V2_XNNPACK_INT8, - XNNPACK_FP32: ALL_MINILM_L6_V2_EMBEDDINGS, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(ALL_MINILM_L6_V2_EMBEDDINGS, 'XNNPACK_INT8'), COREML_INT8: ALL_MINILM_L6_V2_COREML_INT8, COREML_FP16: ALL_MINILM_L6_V2_COREML_FP16, VULKAN_FP16: ALL_MINILM_L6_V2_VULKAN_FP16, @@ -3246,8 +3283,10 @@ export const models = { * Provides higher quality semantic embeddings compared to MiniLM. */ ALL_MPNET_BASE_V2: variants({ + XNNPACK_INT8: ALL_MPNET_BASE_V2_XNNPACK_INT8, XNNPACK_8DA4W: ALL_MPNET_BASE_V2_XNNPACK_8DA4W, - XNNPACK_FP32: ALL_MPNET_BASE_V2_EMBEDDINGS, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(ALL_MPNET_BASE_V2_EMBEDDINGS, 'XNNPACK_INT8'), VULKAN_FP16: ALL_MPNET_BASE_V2_VULKAN_FP16, VULKAN_INT8: ALL_MPNET_BASE_V2_VULKAN_INT8, }), @@ -3257,7 +3296,8 @@ export const models = { */ MULTI_QA_MINILM_L6_COS_V1: variants({ XNNPACK_INT8: MULTI_QA_MINILM_L6_COS_V1_XNNPACK_INT8, - XNNPACK_FP32: MULTI_QA_MINILM_L6_COS_V1_EMBEDDINGS, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(MULTI_QA_MINILM_L6_COS_V1_EMBEDDINGS, 'XNNPACK_INT8'), COREML_INT8: MULTI_QA_MINILM_L6_COS_V1_COREML_INT8, COREML_FP16: MULTI_QA_MINILM_L6_COS_V1_COREML_FP16, VULKAN_FP16: MULTI_QA_MINILM_L6_COS_V1_VULKAN_FP16, @@ -3267,8 +3307,10 @@ export const models = { * question-answering matching using dot product distance. */ MULTI_QA_MPNET_BASE_DOT_V1: variants({ + XNNPACK_INT8: MULTI_QA_MPNET_BASE_DOT_V1_XNNPACK_INT8, XNNPACK_8DA4W: MULTI_QA_MPNET_BASE_DOT_V1_XNNPACK_8DA4W, - XNNPACK_FP32: MULTI_QA_MPNET_BASE_DOT_V1_EMBEDDINGS, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(MULTI_QA_MPNET_BASE_DOT_V1_EMBEDDINGS, 'XNNPACK_INT8'), VULKAN_FP16: MULTI_QA_MPNET_BASE_DOT_V1_VULKAN_FP16, VULKAN_INT8: MULTI_QA_MPNET_BASE_DOT_V1_VULKAN_INT8, }), @@ -3278,7 +3320,8 @@ export const models = { */ PARAPHRASE_MULTILINGUAL_MINILM_L12_V2: variants({ XNNPACK_8DA4W: PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_EMBEDDINGS, - XNNPACK_FP32: PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_XNNPACK_FP32, 'XNNPACK_8DA4W'), COREML_INT8: PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_COREML_INT8, COREML_FP16: PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_COREML_FP16, VULKAN_FP16: PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_VULKAN_FP16, @@ -3290,7 +3333,11 @@ export const models = { DISTILUSE_BASE_MULTILINGUAL_CASED_V2: variants( { XNNPACK_8DA4W: DISTILUSE_BASE_MULTILINGUAL_CASED_V2_EMBEDDINGS, - XNNPACK_FP32: DISTILUSE_BASE_MULTILINGUAL_CASED_V2_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated( + DISTILUSE_BASE_MULTILINGUAL_CASED_V2_XNNPACK_FP32, + 'XNNPACK_8DA4W' + ), COREML_INT8: DISTILUSE_BASE_MULTILINGUAL_CASED_V2_COREML_INT8, COREML_FP16: DISTILUSE_BASE_MULTILINGUAL_CASED_V2_COREML_FP16, MLX_INT8: DISTILUSE_BASE_MULTILINGUAL_CASED_V2_MLX_INT8, @@ -3310,7 +3357,8 @@ export const models = { */ CLIP_VIT_BASE_PATCH32_TEXT: variants({ XNNPACK_INT8: CLIP_VIT_BASE_PATCH32_TEXT_XNNPACK_INT8, - XNNPACK_FP32: CLIP_VIT_BASE_PATCH32_TEXT_EMBEDDINGS, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(CLIP_VIT_BASE_PATCH32_TEXT_EMBEDDINGS, 'XNNPACK_INT8'), COREML_INT8: CLIP_VIT_BASE_PATCH32_TEXT_COREML_INT8, COREML_FP16: CLIP_VIT_BASE_PATCH32_TEXT_COREML_FP16, VULKAN_FP16: CLIP_VIT_BASE_PATCH32_TEXT_VULKAN_FP16, @@ -3379,7 +3427,8 @@ export const models = { CLIP_VIT_BASE_PATCH32: variants( { XNNPACK_INT8: CLIP_VIT_BASE_PATCH32_IMAGE_XNNPACK_INT8, - XNNPACK_FP32: CLIP_VIT_BASE_PATCH32_IMAGE_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(CLIP_VIT_BASE_PATCH32_IMAGE_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: CLIP_VIT_BASE_PATCH32_IMAGE_COREML_FP16, MLX_INT8: CLIP_VIT_BASE_PATCH32_IMAGE_MLX_INT8, VULKAN_FP16: CLIP_VIT_BASE_PATCH32_IMAGE_VULKAN_FP16, @@ -3401,7 +3450,8 @@ export const models = { */ SDXS_512_DREAMSHAPER: variants({ XNNPACK_INT8: SDXS_512_DREAMSHAPER_XNNPACK_INT8, - XNNPACK_FP32: SDXS_512_DREAMSHAPER_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(SDXS_512_DREAMSHAPER_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: SDXS_512_DREAMSHAPER_COREML_FP16, VULKAN_FP16: SDXS_512_DREAMSHAPER_VULKAN_FP16, }), @@ -3419,7 +3469,8 @@ export const models = { */ SUPERTONIC: variants({ XNNPACK_INT8: SUPERTONIC_3_XNNPACK_INT8, - XNNPACK_FP32: SUPERTONIC_3_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(SUPERTONIC_3_XNNPACK_FP32, 'XNNPACK_INT8'), MLX_FP32: SUPERTONIC_3_MLX_FP32, VULKAN_FP16: SUPERTONIC_3_VULKAN_FP16, }), @@ -3491,10 +3542,13 @@ export const models = { */ PPOCRV6_SMALL: variants({ XNNPACK: PPOCRV6_SMALL_XNNPACK_INT8, - XNNPACK_FP32: PPOCRV6_SMALL_XNNPACK_FP32, + /** @deprecated Use `XNNPACK`. Removed in v1.0.0. */ + XNNPACK_FP32: deprecated(PPOCRV6_SMALL_XNNPACK_FP32, 'XNNPACK'), COREML: PPOCRV6_SMALL_COREML_INT8, VULKAN: PPOCRV6_SMALL_VULKAN_FP16, }), }, }, }; + +registerDeprecations(models, 'models');