@mmerterden/multi-agent-pipeline 20.7.0 → 20.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/LICENSE +0 -10
- package/docs/facts.json +1 -1
- package/manifest.json +266 -267
- package/package.json +2 -2
- package/pipeline/scripts/_notices.mjs +1 -1
- package/pipeline/skills/.skill-manifest.json +68 -68
- package/pipeline/skills/shared/README.md +70 -70
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
- package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
- package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
- package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
- package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
- package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
- package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
- package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
- package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
- package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +339 -277
- package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
- package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +105 -122
- package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +143 -166
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +307 -326
- package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
- package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +333 -360
- package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
- package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
- package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
- package/pipeline/skills/shared/external/authentication/SKILL.md +265 -381
- package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +133 -178
- package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
- package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
- package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
- package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
- package/pipeline/skills/shared/external/background-processing/SKILL.md +270 -382
- package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +169 -317
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
- package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
- package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
- package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
- package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
- package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +226 -376
- package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
- package/pipeline/skills/shared/external/core-data/SKILL.md +292 -368
- package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
- package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
- package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
- package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
- package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
- package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
- package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
- package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
- package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
- package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
- package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
- package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
- package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +230 -353
- package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
- package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
- package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
- package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
- package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
- package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
- package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
- package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
- package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
- package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
- package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
- package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
- package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
- package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
- package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
- package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
- package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
- package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
- package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
- package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
- package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
- package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
- package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
- package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
- package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +295 -267
- package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
- package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
- package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
- package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
- package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
- package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
- package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
- package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
- package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
- package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
- package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
- package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
- package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
- package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
- package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
- package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
- package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
- package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
- package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
- package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
- package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
- package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
- package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
- package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
- package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
- package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
- package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
- package/pipeline/skills/shared/external/storekit/references/core-patterns.md +298 -242
- package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
- package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
- package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
- package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
- package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
- package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +303 -351
- package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
- package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
- package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
- package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
- package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
- package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
- package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
- package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
- package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
- package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
- package/pipeline/skills/shared/external/swift-security/SKILL.md +180 -161
- package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
- package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +408 -476
- package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
- package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
- package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
- package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
- package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +352 -472
- package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
- package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
- package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
- package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +396 -457
- package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +188 -175
- package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
- package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +80 -84
- package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +392 -256
- package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
- package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
- package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
- package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
- package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
- package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
- package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
- package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
- package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
- package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
- package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
- package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
- package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
- package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
- package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
- package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
- package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +193 -168
- package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
- package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +132 -133
- package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
- package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +106 -140
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
- package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
- package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
- package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
- package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
- package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
- package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
- package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
- package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
- package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
- package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
- package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
- package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
- package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
- package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
- package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +152 -310
- package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +216 -288
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +414 -719
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md
CHANGED
|
@@ -1,347 +1,252 @@
|
|
|
1
|
-
# Core ML
|
|
1
|
+
# Core ML compression and profiling
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
profiling decisions. Defer Swift prediction/runtime wiring to the sibling
|
|
7
|
-
`coreml` skill unless the user explicitly asks for app integration code.
|
|
3
|
+
Keep the work here on the Python tooling and on profiling. Swift prediction
|
|
4
|
+
code and runtime setup belong to the `coreml` skill unless the user asked for
|
|
5
|
+
app code; the Swift section below is only a quick orientation.
|
|
8
6
|
|
|
9
7
|
## Contents
|
|
10
8
|
|
|
11
|
-
- [
|
|
12
|
-
- [
|
|
13
|
-
- [Palettization
|
|
14
|
-
- [Pruning
|
|
15
|
-
- [
|
|
16
|
-
- [Per-
|
|
17
|
-
- [Quantization-
|
|
18
|
-
- [Swift
|
|
19
|
-
- [MLTensor
|
|
20
|
-
- [Neural Engine
|
|
21
|
-
- [
|
|
9
|
+
- [Picking a technique](#picking-a-technique)
|
|
10
|
+
- [Data-free weight quantization](#data-free-weight-quantization)
|
|
11
|
+
- [Palettization](#palettization)
|
|
12
|
+
- [Pruning](#pruning)
|
|
13
|
+
- [Combining techniques](#combining-techniques)
|
|
14
|
+
- [Per-op settings](#per-op-settings)
|
|
15
|
+
- [Quantization-aware training](#quantization-aware-training)
|
|
16
|
+
- [Swift at a glance](#swift-at-a-glance)
|
|
17
|
+
- [MLTensor](#mltensor)
|
|
18
|
+
- [Neural Engine habits](#neural-engine-habits)
|
|
19
|
+
- [Faster loading](#faster-loading)
|
|
22
20
|
- [Profiling](#profiling)
|
|
23
|
-
- [
|
|
21
|
+
- [Compression mistakes](#compression-mistakes)
|
|
24
22
|
|
|
25
|
-
##
|
|
23
|
+
## Picking a technique
|
|
26
24
|
|
|
27
|
-
| Technique |
|
|
25
|
+
| Technique | Minimum OS | Size cut | Accuracy risk | Best on |
|
|
28
26
|
|---|---|---|---|---|
|
|
29
|
-
|
|
|
30
|
-
|
|
|
31
|
-
|
|
|
32
|
-
|
|
|
33
|
-
|
|
|
34
|
-
|
|
|
35
|
-
|
|
|
27
|
+
| 50% pruning | iOS 16 | about 2x | low | CPU, Neural Engine |
|
|
28
|
+
| 75% pruning | iOS 16 | about 4x | medium | CPU, Neural Engine |
|
|
29
|
+
| 4-bit palettization | iOS 16 | about 8x | low to medium | Neural Engine |
|
|
30
|
+
| 2-bit palettization | iOS 16 | about 16x | medium to high | Neural Engine |
|
|
31
|
+
| INT8, per channel | iOS 16 | about 4x | low | CPU and GPU |
|
|
32
|
+
| W8A8 | iOS 17 | about 4x | low | Neural Engine (A17 Pro, M4 and later) |
|
|
33
|
+
| INT4, per block | iOS 18 | about 8x | medium | GPU |
|
|
36
34
|
|
|
37
|
-
##
|
|
35
|
+
## Data-free weight quantization
|
|
38
36
|
|
|
39
|
-
|
|
37
|
+
INT8 on a converted model:
|
|
40
38
|
|
|
41
39
|
```python
|
|
42
|
-
|
|
40
|
+
# Data-free INT8 on an already converted model.
|
|
43
41
|
import coremltools.optimize as cto
|
|
44
42
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
mode="linear_symmetric", # or "linear" (asymmetric with zero-point)
|
|
49
|
-
weight_threshold=512, # only quantize tensors with > N elements
|
|
43
|
+
int8_op = cto.coreml.OpLinearQuantizerConfig(
|
|
44
|
+
weight_threshold=512, # skip tensors with this many elements or fewer
|
|
45
|
+
mode="linear_symmetric", # "linear" is the asymmetric variant with a zero point
|
|
50
46
|
)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
compressed.save("model_int8.mlpackage")
|
|
47
|
+
int8 = cto.coreml.OptimizationConfig(global_config=int8_op)
|
|
48
|
+
small = cto.coreml.linear_quantize_weights(mlmodel, config=int8)
|
|
54
49
|
```
|
|
55
50
|
|
|
56
|
-
|
|
51
|
+
INT4 per-block, applied to the PyTorch model before conversion:
|
|
57
52
|
|
|
58
53
|
```python
|
|
59
|
-
import coremltools.optimize as
|
|
54
|
+
import coremltools.optimize.torch.quantization as ptq
|
|
60
55
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
"granularity": "per_block",
|
|
65
|
-
"block_size": 128,
|
|
66
|
-
}
|
|
67
|
-
})
|
|
68
|
-
quantizer = cto.torch.quantization.PostTrainingQuantizer(model, config)
|
|
69
|
-
quantized_model = quantizer.compress()
|
|
56
|
+
int4_settings = {"block_size": 128, "granularity": "per_block", "weight_dtype": "int4"}
|
|
57
|
+
cfg = ptq.PostTrainingQuantizerConfig.from_dict({"global_config": int4_settings})
|
|
58
|
+
compressed = ptq.PostTrainingQuantizer(torch_model, cfg).compress()
|
|
70
59
|
```
|
|
71
60
|
|
|
72
|
-
|
|
61
|
+
With calibration data, GPTQ usually holds accuracy better:
|
|
73
62
|
|
|
74
63
|
```python
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
"weight_dtype": 4,
|
|
79
|
-
"granularity": "per_block",
|
|
80
|
-
"block_size": 128,
|
|
81
|
-
},
|
|
64
|
+
import coremltools.optimize.torch.layerwise_compression as lwc
|
|
65
|
+
|
|
66
|
+
gptq = lwc.LayerwiseCompressorConfig.from_dict({
|
|
82
67
|
"calibration_nsamples": 16,
|
|
68
|
+
"global_config": {"block_size": 128, "granularity": "per_block",
|
|
69
|
+
"weight_dtype": "uint4", "algorithm": "gptq"},
|
|
83
70
|
})
|
|
84
|
-
|
|
85
|
-
compressed_model = compressor.compress(calibration_dataloader)
|
|
71
|
+
compressed = lwc.LayerwiseCompressor(torch_model, gptq).compress(calibration_loader)
|
|
86
72
|
```
|
|
87
73
|
|
|
88
|
-
## Palettization
|
|
89
|
-
|
|
90
|
-
Especially effective on the Neural Engine. 4-bit palettization typically
|
|
91
|
-
preserves accuracy better than 4-bit linear quantization.
|
|
74
|
+
## Palettization
|
|
92
75
|
|
|
93
|
-
|
|
76
|
+
Palettization replaces weights with indices into a small table of values. The
|
|
77
|
+
Neural Engine handles it well, and a 4-bit palette tends to lose less accuracy
|
|
78
|
+
than 4-bit linear quantizing does.
|
|
94
79
|
|
|
95
80
|
```python
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
granularity="per_grouped_channel", # iOS 18+ for grouped
|
|
81
|
+
palette_op = cto.coreml.OpPalettizerConfig(
|
|
82
|
+
nbits=4, # allowed: 8, 6, 4, 3, 2, 1
|
|
83
|
+
mode="kmeans", # the other mode is "uniform"
|
|
100
84
|
group_size=16,
|
|
85
|
+
granularity="per_grouped_channel", # iOS 18+
|
|
101
86
|
)
|
|
102
|
-
|
|
103
|
-
|
|
87
|
+
palette = cto.coreml.OptimizationConfig(global_config=palette_op)
|
|
88
|
+
paletted = cto.coreml.palettize_weights(mlmodel, config=palette)
|
|
104
89
|
```
|
|
105
90
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
| Bits | Unique Values | Size Reduction | Typical Quality |
|
|
91
|
+
| Bits | Size cut | Typical quality | Distinct values |
|
|
109
92
|
|---|---|---|---|
|
|
110
|
-
| 8 |
|
|
111
|
-
| 6 |
|
|
112
|
-
| 4 |
|
|
113
|
-
| 3 |
|
|
114
|
-
| 2 |
|
|
115
|
-
| 1 |
|
|
93
|
+
| 8 | about 2x | excellent | 256 |
|
|
94
|
+
| 6 | about 2.7x | very good | 64 |
|
|
95
|
+
| 4 | about 8x | good | 16 |
|
|
96
|
+
| 3 | about 10.7x | moderate | 8 |
|
|
97
|
+
| 2 | about 16x | fair | 4 |
|
|
98
|
+
| 1 | about 32x | poor | 2 |
|
|
116
99
|
|
|
117
|
-
## Pruning
|
|
100
|
+
## Pruning
|
|
118
101
|
|
|
119
|
-
|
|
102
|
+
Zero out small weights by magnitude:
|
|
120
103
|
|
|
121
104
|
```python
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
weight_threshold=2048,
|
|
126
|
-
)
|
|
127
|
-
)
|
|
128
|
-
pruned = cto.coreml.prune_weights(model, config=config)
|
|
105
|
+
by_size = cto.coreml.OpMagnitudePrunerConfig(weight_threshold=2048, target_sparsity=0.75)
|
|
106
|
+
prune_cfg = cto.coreml.OptimizationConfig(global_config=by_size)
|
|
107
|
+
sparse = cto.coreml.prune_weights(mlmodel, config=prune_cfg)
|
|
129
108
|
```
|
|
130
109
|
|
|
131
|
-
|
|
110
|
+
Or by an absolute threshold:
|
|
132
111
|
|
|
133
112
|
```python
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
minimum_sparsity_percentile=0.5,
|
|
138
|
-
)
|
|
139
|
-
)
|
|
140
|
-
pruned = cto.coreml.prune_weights(model, config=config)
|
|
113
|
+
tiny = cto.coreml.OpThresholdPrunerConfig(minimum_sparsity_percentile=0.5, threshold=1e-12)
|
|
114
|
+
sparse = cto.coreml.prune_weights(
|
|
115
|
+
mlmodel, config=cto.coreml.OptimizationConfig(global_config=tiny))
|
|
141
116
|
```
|
|
142
117
|
|
|
143
|
-
##
|
|
118
|
+
## Combining techniques
|
|
144
119
|
|
|
145
|
-
|
|
120
|
+
Palettize first, then prune with `joint_compression=True` so the sparsity is
|
|
121
|
+
applied on top of the palette:
|
|
146
122
|
|
|
147
123
|
```python
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
final = cto.coreml.prune_weights(
|
|
151
|
-
palettized, prune_config, joint_compression=True
|
|
152
|
-
)
|
|
124
|
+
paletted = cto.coreml.palettize_weights(mlmodel, config=palette)
|
|
125
|
+
both = cto.coreml.prune_weights(paletted, config=prune_cfg, joint_compression=True)
|
|
153
126
|
```
|
|
154
127
|
|
|
155
|
-
## Per-
|
|
128
|
+
## Per-op settings
|
|
156
129
|
|
|
157
|
-
|
|
130
|
+
`OptimizationConfig` can vary the treatment by op type or by op name. `None`
|
|
131
|
+
leaves that op uncompressed, which is useful for embeddings and other sensitive
|
|
132
|
+
layers.
|
|
158
133
|
|
|
159
134
|
```python
|
|
160
|
-
|
|
161
|
-
global_config=
|
|
135
|
+
mixed = cto.coreml.OptimizationConfig(
|
|
136
|
+
global_config=cto.coreml.OpPalettizerConfig(nbits=6),
|
|
162
137
|
op_type_configs={
|
|
163
|
-
"linear":
|
|
164
|
-
"conv":
|
|
165
|
-
},
|
|
166
|
-
op_name_configs={
|
|
167
|
-
"embedding_layer": None, # None = skip compression
|
|
138
|
+
"linear": cto.coreml.OpPalettizerConfig(nbits=4),
|
|
139
|
+
"conv": cto.coreml.OpPalettizerConfig(nbits=6),
|
|
168
140
|
},
|
|
141
|
+
op_name_configs={"token_embedding": None},
|
|
169
142
|
)
|
|
170
143
|
```
|
|
171
144
|
|
|
172
|
-
## Quantization-
|
|
145
|
+
## Quantization-aware training
|
|
173
146
|
|
|
174
|
-
|
|
147
|
+
QAT gives the best accuracy at low bit widths because the model learns around
|
|
148
|
+
the quantization during fine-tuning:
|
|
175
149
|
|
|
176
150
|
```python
|
|
177
|
-
|
|
178
|
-
LinearQuantizer, LinearQuantizerConfig, ModuleLinearQuantizerConfig
|
|
179
|
-
)
|
|
151
|
+
import coremltools.optimize.torch.quantization as ptq
|
|
180
152
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
milestones=[0, 1000, 1000, 0],
|
|
185
|
-
)
|
|
153
|
+
module_cfg = ptq.ModuleLinearQuantizerConfig(
|
|
154
|
+
milestones=[0, 200, 400, 400],
|
|
155
|
+
quantization_scheme="symmetric",
|
|
186
156
|
)
|
|
187
|
-
|
|
188
|
-
quantizer.
|
|
189
|
-
|
|
190
|
-
# Training loop
|
|
191
|
-
for inputs, labels in data:
|
|
192
|
-
output = model(inputs)
|
|
193
|
-
loss = loss_fn(output, labels)
|
|
194
|
-
loss.backward()
|
|
195
|
-
optimizer.step()
|
|
196
|
-
quantizer.step()
|
|
157
|
+
qat_cfg = ptq.LinearQuantizerConfig(global_config=module_cfg)
|
|
158
|
+
quantizer = ptq.LinearQuantizer(torch_model, qat_cfg)
|
|
159
|
+
torch_model = quantizer.prepare(example_inputs=(sample,), inplace=True)
|
|
197
160
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
## Swift Integration
|
|
202
|
-
|
|
203
|
-
### Loading Models
|
|
204
|
-
|
|
205
|
-
```swift
|
|
206
|
-
// From Xcode-compiled model (auto-generated class)
|
|
207
|
-
let model = try MyImageClassifier(configuration: MLModelConfiguration())
|
|
208
|
-
|
|
209
|
-
// From URL at runtime
|
|
210
|
-
let config = MLModelConfiguration()
|
|
211
|
-
config.computeUnits = .all
|
|
212
|
-
let model = try MLModel(contentsOf: modelURL, configuration: config)
|
|
213
|
-
|
|
214
|
-
// From pre-compiled model (.mlmodelc) for faster loading
|
|
215
|
-
let compiledURL = try MLModel.compileModel(at: sourceModelURL)
|
|
216
|
-
let model = try MLModel(contentsOf: compiledURL)
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
### MLModelConfiguration
|
|
220
|
-
|
|
221
|
-
```swift
|
|
222
|
-
let config = MLModelConfiguration()
|
|
223
|
-
config.computeUnits = .all
|
|
224
|
-
config.allowLowPrecisionAccumulationOnGPU = true
|
|
225
|
-
// config.functionName = "adapter_1" // For multifunction models (iOS 18+)
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
### Synchronous Prediction
|
|
229
|
-
|
|
230
|
-
```swift
|
|
231
|
-
let input = MyModelInput(image: pixelBuffer)
|
|
232
|
-
let output = try model.prediction(input: input)
|
|
233
|
-
let label = output.classLabel
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
### Async Prediction (iOS 17+)
|
|
237
|
-
|
|
238
|
-
```swift
|
|
239
|
-
let output = try await model.prediction(input: input)
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
Thread-safe, supports Task cancellation, integrates with Swift concurrency.
|
|
243
|
-
~60% faster than synchronous for batch workloads.
|
|
244
|
-
|
|
245
|
-
### Batch Prediction
|
|
161
|
+
for batch in train_loader:
|
|
162
|
+
train_step(torch_model, batch)
|
|
163
|
+
quantizer.step()
|
|
246
164
|
|
|
247
|
-
|
|
248
|
-
let batchInputs: [MyModelInput] = images.map { MyModelInput(image: $0) }
|
|
249
|
-
let batchOutputs = try model.predictions(inputs: batchInputs)
|
|
165
|
+
torch_model = quantizer.finalize(inplace=True)
|
|
250
166
|
```
|
|
251
167
|
|
|
252
|
-
|
|
168
|
+
## Swift at a glance
|
|
253
169
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
"input": MLFeatureValue(pixelBuffer: pixelBuffer),
|
|
257
|
-
"threshold": MLFeatureValue(double: 0.5),
|
|
258
|
-
])
|
|
259
|
-
let output = try model.prediction(from: features)
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
### Vision Framework Integration
|
|
170
|
+
For orientation only; loading, configuration and prediction lifecycle in an app
|
|
171
|
+
belong to the `coreml` skill.
|
|
263
172
|
|
|
264
173
|
```swift
|
|
265
|
-
import Vision
|
|
266
174
|
import CoreML
|
|
267
175
|
|
|
268
|
-
let
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
print("\(topResult?.identifier ?? ""): \(topResult?.confidence ?? 0)")
|
|
273
|
-
}
|
|
274
|
-
let handler = VNImageRequestHandler(cgImage: image)
|
|
275
|
-
try handler.perform([request])
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
### Natural Language Integration
|
|
279
|
-
|
|
280
|
-
```swift
|
|
281
|
-
import NaturalLanguage
|
|
176
|
+
let runSettings = MLModelConfiguration()
|
|
177
|
+
runSettings.computeUnits = .all
|
|
178
|
+
runSettings.allowLowPrecisionAccumulationOnGPU = true
|
|
179
|
+
// runSettings.functionName = "legal" // multifunction models, iOS 18+
|
|
282
180
|
|
|
283
|
-
let
|
|
284
|
-
let
|
|
181
|
+
let generated = try LeafClassifier(configuration: runSettings) // Xcode-generated class
|
|
182
|
+
let compiledLocation = try await MLModel.compileModel(at: downloadedPackageURL)
|
|
183
|
+
let runtime = try MLModel(contentsOf: compiledLocation, configuration: runSettings)
|
|
285
184
|
```
|
|
286
185
|
|
|
287
|
-
|
|
186
|
+
- `model.prediction(input:)` is synchronous. From iOS 17, the async
|
|
187
|
+
`try await model.prediction(input:)` is thread-safe and cancellable, and
|
|
188
|
+
running several predictions concurrently this way can raise throughput for
|
|
189
|
+
batch workloads; measure the gain on your model.
|
|
190
|
+
- `model.predictions(inputs:)` runs a batch.
|
|
191
|
+
- Without a generated class, build inputs with
|
|
192
|
+
`MLDictionaryFeatureProvider(dictionary:)` using
|
|
193
|
+
`MLFeatureValue(pixelBuffer:)` or `MLFeatureValue(double:)` and call
|
|
194
|
+
`prediction(from:)`.
|
|
195
|
+
- Vision: wrap with `VNCoreMLModel(for:)`, run a `VNCoreMLRequest` through
|
|
196
|
+
`VNImageRequestHandler(cgImage:).perform([request])`, and read
|
|
197
|
+
`[VNClassificationObservation]` in the completion.
|
|
198
|
+
- Natural Language: `NLModel(mlModel:)` then `predictedLabel(for:)`.
|
|
288
199
|
|
|
289
|
-
|
|
200
|
+
## MLTensor
|
|
290
201
|
|
|
291
|
-
|
|
292
|
-
import CoreML
|
|
202
|
+
From iOS 18, `MLTensor` handles multidimensional math next to Core ML models:
|
|
293
203
|
|
|
294
|
-
|
|
295
|
-
let
|
|
296
|
-
let
|
|
297
|
-
let
|
|
204
|
+
```swift
|
|
205
|
+
let logits = MLTensor([2.0, 0.5, -1.0, 3.0] as [Float]).reshaped(to: [2, 2])
|
|
206
|
+
let probabilities = logits.softmax()
|
|
207
|
+
let identity = MLTensor(shape: [2, 2], scalars: [1, 0, 0, 1] as [Float])
|
|
208
|
+
let projected = logits.matmul(identity)
|
|
298
209
|
```
|
|
299
210
|
|
|
300
|
-
## Neural Engine
|
|
211
|
+
## Neural Engine habits
|
|
301
212
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
213
|
+
- Ops the Neural Engine cannot run push the graph to the CPU or GPU and add
|
|
214
|
+
transfer cost. Find and replace them.
|
|
215
|
+
- Use 4-bit or 6-bit palettization for the best Neural Engine memory use and
|
|
216
|
+
latency.
|
|
217
|
+
- On A17 Pro and M4 or later, W8A8 unlocks fast INT8 compute on the Neural
|
|
218
|
+
Engine.
|
|
307
219
|
|
|
308
|
-
##
|
|
220
|
+
## Faster loading
|
|
309
221
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
222
|
+
- Ship or cache `.mlmodelc`. The first load of an uncompiled model runs a slow,
|
|
223
|
+
device-specific compile; after `MLModel.compileModel(at:)`, move the result
|
|
224
|
+
to a permanent location and reuse it.
|
|
225
|
+
- Split very large, slow-to-load models with `bisect_model()`.
|
|
226
|
+
- `MLComputePlan` (iOS 17.4+) reports per-op placement and cost from code.
|
|
315
227
|
|
|
316
228
|
## Profiling
|
|
317
229
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
### Reshape Frequency Hint
|
|
230
|
+
- Xcode: open the `.mlpackage` and use the Performance tab for load time,
|
|
231
|
+
prediction time and the compute unit each op runs on.
|
|
232
|
+
- Instruments: the Core ML instrument.
|
|
233
|
+
- Code: `MLComputePlan`.
|
|
234
|
+
- coremltools debugging helpers: `MLModelValidator`, `MLModelComparator`,
|
|
235
|
+
`MLModelInspector`, `MLModelBenchmarker`.
|
|
236
|
+
- Tell Core ML that input shapes rarely change:
|
|
326
237
|
|
|
327
238
|
```python
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
"reshapeFrequency": ct.ReshapeFrequency.Infrequent
|
|
331
|
-
})
|
|
239
|
+
hints = {"reshapeFrequency": ct.ReshapeFrequency.Infrequent}
|
|
240
|
+
tuned = ct.models.MLModel("Segmenter.mlpackage", optimization_hints=hints)
|
|
332
241
|
```
|
|
333
242
|
|
|
334
|
-
##
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
5. **Ignoring compute_units configuration.** Default `.all` is correct for
|
|
345
|
-
production. `.cpuOnly` is for debugging only.
|
|
346
|
-
6. **Not testing on physical devices.** Simulator does not support Metal GPU or
|
|
347
|
-
Neural Engine.
|
|
243
|
+
## Compression mistakes
|
|
244
|
+
|
|
245
|
+
| Mistake | Fix |
|
|
246
|
+
|---|---|
|
|
247
|
+
| Compressing without checking accuracy | Compare outputs with the original, for example with `MLModelComparator` |
|
|
248
|
+
| Ignoring `weight_threshold` | Leave tensors under about 512 elements unquantized; the overhead outweighs the saving |
|
|
249
|
+
| Calling sync prediction from async code | Use async prediction (iOS 17+) |
|
|
250
|
+
| Skipping precompilation | Compile once and cache `.mlmodelc` |
|
|
251
|
+
| Wrong compute units | `.all` in production, `.cpuOnly` only while debugging |
|
|
252
|
+
| Testing only in the Simulator | It has no Metal GPU or Neural Engine; use devices |
|