diff --git a/Cargo.lock b/Cargo.lock index 3707c1c..13673bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1355,6 +1355,7 @@ dependencies = [ "half", "indicatif", "native-tls", + "objc2", "ort", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index 11b61fb..6fc784e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,3 +43,5 @@ walkdir = "2" [target.'cfg(all(target_os = "macos", target_arch = "aarch64"))'.dependencies] coreml-native = "=0.2.0" +# Remove once coreml-native includes an autorelease pool in predict_batch(). +objc2 = "0.6" diff --git a/src/embed.rs b/src/embed.rs index 13ef0ec..7b7a93f 100644 --- a/src/embed.rs +++ b/src/embed.rs @@ -513,7 +513,9 @@ impl EmbeddingEngine { let input_refs: Vec<&[(&str, &dyn AsMultiArray)]> = inputs.iter().map(Vec::as_slice).collect(); let batch = BatchProvider::new(&input_refs)?; - let predictions = self.model.predict_batch(&batch)?; + // coreml-native 0.2.0 does not drain autoreleased CoreML batch + // outputs, eventually exhausting macOS's 16,384-IOSurface limit. + let predictions = objc2::rc::autoreleasepool(|_pool| self.model.predict_batch(&batch))?; (0..texts.len()) .map(|i| { let (embedding, shape) = predictions.get_f32(i, "div_1")?;