SigLIP2 so400m patch14-384 vision encoder (OpenVINO IR)
This is an OpenVINO export of the vision tower of google/siglip2-so400m-patch14-384,
revision e8e487298228002f3d8a82e0cd5c8ea9c567f57f.
- Input:
uint8RGB, NCHW, shape[N, 3, 384, 384]. The graph includes normalization ((x/255 - 0.5) / 0.5). - Output:
pooler_output, shape[N, 1152]. This is the attention-pooled image embedding; it is not L2-normalized. - Precision: weights are stored in fp32. On CPUs with AVX-512 BF16, use
INFERENCE_PRECISION_HINT: bf16for speed.
import openvino as ov
core = ov.Core()
model = core.compile_model("model.xml", "CPU", {"INFERENCE_PRECISION_HINT": "bf16"})
embeddings = model([pixels_u8_nchw])[model.output(0)]
Parity
validation.npz contains a deterministic uint8 probe (pixels) and the PyTorch fp32
reference output for it (reference).
On 16 real 720p video frames, center-square cropped to 384 px, the table compares this export with the original PyTorch fp32 vision model on the same pixels:
| OpenVINO precision | cosine min | cosine mean |
|---|---|---|
| f32 | 1.00000 | 1.00000 |
| bf16 | 0.99941 | 0.99980 |
Resizing and cropping are not part of the graph. The reference image processor squashes the full image to 384×384. On non-square frames, a center-square crop gives different embeddings: mean cosine 0.92 on 16:9 frames.
Conversion
The graph was converted with openvino.convert_model from a module that wraps
vision_model with uint8 normalization buffers (OpenVINO 2026.4.0, transformers
5.17.0). It was saved with compress_to_fp16=False. On the probe, PyTorch fp32 vs
OpenVINO f32 cosine is ≥ 0.99999. model.json lists the file hashes.