jianjunz opened PR #8964 from jianjunz:f16-i64 to bytecodealliance:main:
Some devices may not support FP32.
jianjunz updated PR #8964.
jianjunz updated PR #8964.
jianjunz updated PR #8964.
jianjunz updated PR #8964.
jianjunz has marked PR #8964 as ready for review.
jianjunz requested wasmtime-core-reviewers for a review on PR #8964.
jianjunz requested alexcrichton for a review on PR #8964.
jianjunz requested wasmtime-default-reviewers for a review on PR #8964.
alexcrichton requested abrown for a review on PR #8964.
abrown submitted PR review.
abrown created PR review comment:
When is this needed?
abrown created PR review comment:
Are we sure
castis right here? Poking around inwindows-rs, I see that it has aCanIntoimplementation forTensorFeatureDescriptorhere — doesn't that mean we should be usinginto()instead?
abrown created PR review comment:
let inspectable =
abrown created PR review comment:
You probably only need
implementfor this PR, right?
abrown created PR review comment:
Is this correct? ONNX is going to represent this type with 4 bytes instead of 2 bytes? If so, maybe we should add a comment describing why this is the case and linking to some documentation; otherwise, it's a bit surprising.
abrown created PR review comment:
I don't think this makes sense. The
cargo testabove runs both the unit tests within the library as well as the integration tests in thetestsdirectory.
abrown created PR review comment:
Not sure if it's any faster, but this would avoid the size calculation:
let data = view.into_iter().map(f32::to_le_bytes).collect();We might want to note somewhere that the LE ordering is here to match WebAssembly's ordering, not the platform we're running on (in which case always doing LE could be incorrect).
abrown created PR review comment:
We can do this once at the top of the function.
abrown created PR review comment:
When doing this
unsafe"cast" to a slice, we also need to make sure that theu8pointer totensor.datais aligned in such a way that thef32s indatawill also be aligned to their 4-byte alignment. Here's an example of how to do the check fromopenvino-rs. And the docs forstd::slice::from_raw_partshave all the details. I think it would be fine here to fail if things aren't aligned correctly (instead of trying to shift everything!), at least for the time being.
abrown created PR review comment:
_ => unimplemented!("the winml backend only supports tensors, found: {}", kind),
abrown created PR review comment:
tensor.data.as_ptr().cast<i64>,These days clippy tells me this is the preferred way to do this.
abrown created PR review comment:
This kind of comment can be moved from here to the
unimplemented!()at the end ofto_tensorso that both users and code readers can take advantage of this information.
abrown created PR review comment:
abrown created PR review comment:
TensorType::Fp32 => unsafe {Isn't
TensorTypealready imported?
abrown created PR review comment:
It took me a second to understand that what we're trying to do is "roundtrip" a tensor through
to_inspectableand back throughto_tensor. To make this more clear, can you look at factoring out some of the duplication here?
jianjunz updated PR #8964.
jianjunz submitted PR review.
jianjunz created PR review comment:
You're right. The
cargo testabove also runs unit tests. https://github.com/bytecodealliance/wasmtime/actions/runs/9969920948/job/27547820669#step:8:409
jianjunz submitted PR review.
jianjunz created PR review comment:
Removed. They're not needed for this one.
jianjunz submitted PR review.
jianjunz created PR review comment:
output_tensor's type is unknown at the top of the function.
jianjunz created PR review comment:
WinML may report an error
self.binding.Bind("input", tensor of shape [10]); self.binding.Bind("input", tensor of shape [11]); <-- errorBut it works
self.binding.Bind("input", tensor of shape [10]); self.binding.Clear(); self.binding.Bind("input", tensor of shape [11]);
jianjunz created PR review comment:
WinML may use 2 bytes internally because it's fp16, but f16 is not officially supported by Rust stable, so we use f32 here.
jianjunz submitted PR review.
jianjunz created PR review comment:
Removed
crate::wit::types::.
jianjunz created PR review comment:
Done.
jianjunz created PR review comment:
Removed.
jianjunz created PR review comment:
Done.
jianjunz created PR review comment:
view's type isIVectorView, not a rust collection, so the short version doesn't work here.
jianjunz submitted PR review.
jianjunz created PR review comment:
My understanding is
casthere is for COM interfaces, similar as QueryInterface, whileintois for converting derived class into base class?
jianjunz updated PR #8964.
jianjunz submitted PR review.
jianjunz created PR review comment:
Replaced with
cast.
jianjunz updated PR #8964.
jianjunz submitted PR review.
jianjunz created PR review comment:
Thanks for the info. Added assertion when getting length.
jianjunz submitted PR review.
jianjunz created PR review comment:
Implemented
PartialEqforTensor, so we don't need a lot ofassert_eq!here.
abrown submitted PR review.
abrown created PR review comment:
Ok, so this needs to be fixed then in this PR?
abrown created PR review comment:
No, I don't think that is not correct. I checked out the code and
let data = view.into_iter().flat_map(f32::to_le_bytes).collect();(changingmaptoflat_map) seems to compile ok.
abrown created PR review comment:
We should probably be using
shapehere to verify thattensor.dimensionsmatches.
abrown created PR review comment:
Not sure that answers the question...
abrown created PR review comment:
If you'd like to do this in a more standard way, I just learned of
align_towhich can be used to do the same thing.
jianjunz updated PR #8964.
jianjunz submitted PR review.
jianjunz created PR review comment:
I mean
casthere queries if the COM object can be convert into a derived class, whileintois used to convert into a base class. That's my understanding.
jianjunz created PR review comment:
No, not in this one. It cannot be easily fixed by adding a
self.binding.Clear()here because a model may have multiple input features. In this case, application callsset_inputmore than once.
jianjunz created PR review comment:
Thanks for pointing out the duplication here. I think we don't need to verify shape here, WinML will check it later, so
shapeis removed.
jianjunz submitted PR review.
jianjunz created PR review comment:
flat_mapworks. Thanks.
jianjunz updated PR #8964.
abrown submitted PR review.
abrown created PR review comment:
I think I understand what you're saying about
Clear: it erases _all_ the bindings, even for other model inputs. We can't have that. But what happens in this conceivable sequence?
- Wasm guest calls
set_inputon input N with shape A- Wasm guest again calls
set_inputon input N with shape BThis is valid, though silly. The user should not have to face an error from wasi-nn in this case, right? But, if WinML is going to raise an error, then should we protect this some other way, e.g., by checking that the tensor shape is what the model expects (either A or B)?
abrown created PR review comment:
How about
let itensor = inspectable.cast<ITensor>()?; let dimensions = dimensions_as_u32(&itensor.Shape()?)?;or something like that?
abrown created PR review comment:
Ok, please add a comment explaining that and link to the docs I mentioned.
abrown created PR review comment:
I'm not familiar enough with COM so I'll take your word for it that this is the right approach.
abrown submitted PR review.
abrown created PR review comment:
Probably should just
#[derive(PartialEq)]since it's equivalent to this I think.
jianjunz updated PR #8964.
jianjunz submitted PR review.
jianjunz created PR review comment:
That's a variable input, accepts both A and B (like a string with different length). I feel like this is a bug of WinML, or the calling flow is incorrect.
Clearfixes the issue but I'm not sure if that's the only solution, so I'm not addingClearat this time.
jianjunz created PR review comment:
It works, but
GetAsVectorViewis a method ofTensorFloat16Bit. Then we'll need to castitensoragain to specific tensor type. The change above makes code clean but will it be a performance issue to cast twice?
jianjunz updated PR #8964.
jianjunz submitted PR review.
jianjunz created PR review comment:
It works. Thanks.
jianjunz updated PR #8964.
abrown updated PR #8964.
abrown submitted PR review.
abrown merged PR #8964.
Last updated: Dec 13 2025 at 19:03 UTC