Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
ac3268b
Fix comparison/logical ops
mklimenko-nv Jul 13, 2026
b5c31ef
Fix missing MIL params
mklimenko-nv Jul 13, 2026
32244b6
QDQ subgraph fixes
mklimenko-nv Jul 13, 2026
a2a2b82
Fix interface and logic issues
mklimenko-nv Jul 13, 2026
ff7debd
Fix dtype and constraint fixes
mklimenko-nv Jul 13, 2026
f297ca5
Add missing operations
mklimenko-nv Jul 14, 2026
d6d1b9f
Fix default axes and transposes
mklimenko-nv Jul 14, 2026
6a68a5b
Fix prelu, is_inf and clamp
mklimenko-nv Jul 14, 2026
ebfc082
Cast and reshape fixes
mklimenko-nv Jul 14, 2026
4670dab
Upgrade weight file to blob format v2
mklimenko-nv Jul 14, 2026
454f6cd
Fix conv2d nhwc output shape
mklimenko-nv Jul 14, 2026
a511210
Fix slice and axis mismatch
mklimenko-nv Jul 14, 2026
4c59c26
Fix pooling and normalization
mklimenko-nv Jul 14, 2026
d5d3a00
Fix non-const mean
mklimenko-nv Jul 14, 2026
159b42e
Fix explicit empty axes
mklimenko-nv Jul 14, 2026
e524541
Fix int8 correctness
mklimenko-nv Jul 14, 2026
5788eec
Fix l2pool
mklimenko-nv Jul 14, 2026
196b598
Fix average pooling padding
mklimenko-nv Jul 14, 2026
f57ebf3
Int boundary proxy
mklimenko-nv Jul 14, 2026
4b5c4b4
Generalize int32 proxy
mklimenko-nv Jul 14, 2026
9a9a04e
Fix scatterElements
mklimenko-nv Jul 14, 2026
198d2e2
Fix layernorm default axes
mklimenko-nv Jul 14, 2026
5994253
Improve pooling coverage
mklimenko-nv Jul 14, 2026
a5d2f39
Fix quantization
mklimenko-nv Jul 14, 2026
bb81f7b
Decompose lstm and gru
mklimenko-nv Jul 14, 2026
7b207f8
Decompose sequence gru and lstm
mklimenko-nv Jul 14, 2026
b67a2d0
Add int4 quantization support
mklimenko-nv Jul 14, 2026
62f3969
Residual fixes
mklimenko-nv Jul 14, 2026
93f8a13
Fix clamp with a workaround
mklimenko-nv Jul 14, 2026
da547a6
Fix cargo check warnings
mklimenko-nv Jul 14, 2026
4aee702
Fix formatting
mklimenko-nv Jul 14, 2026
a8018d3
Update CoreML operator support doc
mklimenko-nv Jul 14, 2026
75cf108
Match CI behavior
mklimenko-nv Jul 14, 2026
9c35d15
Use all logical cores for test-wpt-coreml
mklimenko-nv Jul 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ test-wpt-litert:
$(CARGO) test --test run_wpt_conformance --features "litert-runtime" -- litert --test-threads=1

test-wpt-coreml:
$(CARGO) test --test run_wpt_conformance --features coreml-runtime -- coreml --test-threads 1
$(CARGO) test --test run_wpt_conformance --features coreml-runtime -- coreml

test-wpt-coreml-report:
@mkdir -p reports
Expand Down
126 changes: 64 additions & 62 deletions docs/development/backend-operator-support.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,76 +24,78 @@ Executor-level operator coverage follows converter coverage for this backend.

- Converter source: `src/converters/coreml_mlprogram.rs`
- Executor source: `src/executors/coreml.rs`
- Converter operator count: **88**
- Executor operator count: **88**
- Converter operator count: **92**
- Executor operator count: **92**

### Converter Operators

- `abs`, `hardSigmoid`, `reducemin`
- `add`, `hardSwish`, `reduceproduct`
- `argMax`, `identity`, `reducesum`
- `argMin`, `instanceNormalization`, `reducesumsquare`
- `averagePool2d`, `layerNormalization`, `relu`
- `batchNormalization`, `leakyRelu`, `reshape`
- `cast`, `lesser`, `reverse`
- `ceil`, `lesserOrEqual`, `roundEven`
- `clamp`, `log`, `scatterElements`
- `concat`, `logicalAnd`, `scatterND`
- `conv2d`, `logicalNot`, `sigmoid`
- `convTranspose2d`, `logicalOr`, `sign`
- `cos`, `logicalXor`, `sin`
- `cumulativeSum`, `matmul`, `slice`
- `dequantizeLinear`, `max`, `softmax`
- `div`, `maxPool2d`, `softplus`
- `elu`, `min`, `softsign`
- `equal`, `mul`, `split`
- `erf`, `neg`, `sqrt`
- `exp`, `pad`, `squeeze`
- `expand`, `pow`, `sub`
- `floor`, `prelu`, `tan`
- `gather`, `quantizeLinear`, `tanh`
- `gatherElements`, `reciprocal`, `tile`
- `gelu`, `reducel1`, `transpose`
- `gemm`, `reducel2`, `triangular`
- `globalAveragePool`, `reducelogsum`, `unsqueeze`
- `globalMaxPool`, `reducelogsumexp`, `where`
- `greater`, `reducemax`
- `greaterOrEqual`, `reducemean`
- `abs`, `hardSigmoid`, `reducemax`
- `add`, `hardSwish`, `reducemean`
- `argMax`, `identity`, `reducemin`
- `argMin`, `instanceNormalization`, `reduceproduct`
- `averagePool2d`, `isInfinite`, `reducesum`
- `batchNormalization`, `isNaN`, `reducesumsquare`
- `cast`, `l2pool2d`, `relu`
- `ceil`, `layerNormalization`, `reshape`
- `clamp`, `leakyRelu`, `reverse`
- `concat`, `lesser`, `roundEven`
- `conv2d`, `lesserOrEqual`, `scatterElements`
- `convTranspose2d`, `log`, `scatterND`
- `cos`, `logicalAnd`, `sigmoid`
- `cumulativeSum`, `logicalNot`, `sign`
- `dequantizeLinear`, `logicalOr`, `sin`
- `div`, `logicalXor`, `slice`
- `elu`, `matmul`, `softmax`
- `equal`, `max`, `softplus`
- `erf`, `maxPool2d`, `softsign`
- `exp`, `min`, `split`
- `expand`, `mul`, `sqrt`
- `floor`, `neg`, `squeeze`
- `gather`, `pad`, `sub`
- `gatherElements`, `pow`, `tan`
- `gatherND`, `prelu`, `tanh`
- `gelu`, `quantizeLinear`, `tile`
- `gemm`, `reciprocal`, `transpose`
- `globalAveragePool`, `reducel1`, `triangular`
- `globalMaxPool`, `reducel2`, `unsqueeze`
- `greater`, `reducelogsum`, `where`
- `greaterOrEqual`, `reducelogsumexp`

### Executor Operators

Executor-level operator coverage follows converter coverage for this backend.

- `abs`, `hardSigmoid`, `reducemin`
- `add`, `hardSwish`, `reduceproduct`
- `argMax`, `identity`, `reducesum`
- `argMin`, `instanceNormalization`, `reducesumsquare`
- `averagePool2d`, `layerNormalization`, `relu`
- `batchNormalization`, `leakyRelu`, `reshape`
- `cast`, `lesser`, `reverse`
- `ceil`, `lesserOrEqual`, `roundEven`
- `clamp`, `log`, `scatterElements`
- `concat`, `logicalAnd`, `scatterND`
- `conv2d`, `logicalNot`, `sigmoid`
- `convTranspose2d`, `logicalOr`, `sign`
- `cos`, `logicalXor`, `sin`
- `cumulativeSum`, `matmul`, `slice`
- `dequantizeLinear`, `max`, `softmax`
- `div`, `maxPool2d`, `softplus`
- `elu`, `min`, `softsign`
- `equal`, `mul`, `split`
- `erf`, `neg`, `sqrt`
- `exp`, `pad`, `squeeze`
- `expand`, `pow`, `sub`
- `floor`, `prelu`, `tan`
- `gather`, `quantizeLinear`, `tanh`
- `gatherElements`, `reciprocal`, `tile`
- `gelu`, `reducel1`, `transpose`
- `gemm`, `reducel2`, `triangular`
- `globalAveragePool`, `reducelogsum`, `unsqueeze`
- `globalMaxPool`, `reducelogsumexp`, `where`
- `greater`, `reducemax`
- `greaterOrEqual`, `reducemean`
- `abs`, `hardSigmoid`, `reducemax`
- `add`, `hardSwish`, `reducemean`
- `argMax`, `identity`, `reducemin`
- `argMin`, `instanceNormalization`, `reduceproduct`
- `averagePool2d`, `isInfinite`, `reducesum`
- `batchNormalization`, `isNaN`, `reducesumsquare`
- `cast`, `l2pool2d`, `relu`
- `ceil`, `layerNormalization`, `reshape`
- `clamp`, `leakyRelu`, `reverse`
- `concat`, `lesser`, `roundEven`
- `conv2d`, `lesserOrEqual`, `scatterElements`
- `convTranspose2d`, `log`, `scatterND`
- `cos`, `logicalAnd`, `sigmoid`
- `cumulativeSum`, `logicalNot`, `sign`
- `dequantizeLinear`, `logicalOr`, `sin`
- `div`, `logicalXor`, `slice`
- `elu`, `matmul`, `softmax`
- `equal`, `max`, `softplus`
- `erf`, `maxPool2d`, `softsign`
- `exp`, `min`, `split`
- `expand`, `mul`, `sqrt`
- `floor`, `neg`, `squeeze`
- `gather`, `pad`, `sub`
- `gatherElements`, `pow`, `tan`
- `gatherND`, `prelu`, `tanh`
- `gelu`, `quantizeLinear`, `tile`
- `gemm`, `reciprocal`, `transpose`
- `globalAveragePool`, `reducel1`, `triangular`
- `globalMaxPool`, `reducel2`, `unsqueeze`
- `greater`, `reducelogsum`, `where`
- `greaterOrEqual`, `reducelogsumexp`

## TensorRT Backend

Expand Down
32 changes: 30 additions & 2 deletions src/backends/coreml.rs
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,35 @@ impl<'context> MLBackendContext<'context> for CoremlContext {
source: format!("model did not produce output '{name}'").into(),
})?;
let logical = tensor_byte_len(ml_tensor.descriptor());
if data.len() < logical {

// When the graph output type is int64/uint64 but CoreML produced int32
// bytes (argmin/argmax proxy, or a cast to int64/uint64), widen each
// 4-byte value to 8 bytes. int64 is sign-extended so negative results
// survive; uint64 is zero-extended.
use crate::operator_enums::MLOperandDataType;
let out_dt = ml_tensor.descriptor().data_type();
let expanded: Option<Vec<u8>> = if data.len() * 2 == logical
&& matches!(out_dt, MLOperandDataType::Int64 | MLOperandDataType::Uint64)
{
let sign_extend = matches!(out_dt, MLOperandDataType::Int64);
let count = data.len() / 4;
let mut buf = vec![0u8; count * 8];
for i in 0..count {
let v = i32::from_le_bytes(data[i * 4..i * 4 + 4].try_into().unwrap());
let widened: i64 = if sign_extend {
v as i64
} else {
i64::from(v as u32)
};
buf[i * 8..i * 8 + 8].copy_from_slice(&widened.to_le_bytes());
}
Some(buf)
} else {
None
};
let effective = expanded.as_deref().unwrap_or(data.as_slice());

if effective.len() < logical {
return Err(Error::GraphDispatchError {
source: format!(
"output '{name}': CoreML produced {} bytes, descriptor expects {logical}",
Expand All @@ -286,7 +314,7 @@ impl<'context> MLBackendContext<'context> for CoremlContext {
.into(),
});
}
dst[..logical].copy_from_slice(&data[..logical]);
dst[..logical].copy_from_slice(&effective[..logical]);
}
Ok(())
}
Expand Down
Loading
Loading