Class EmbeddingNotSerializableException
- Namespace
- NT2I.ONNX.Abstractions.Exceptions
- Assembly
- NT2I.ONNX.Abstractions.dll
Exception levée quand ISam2Embedding.Save est appelé sur un embedding
dont les tenseurs résident en mémoire GPU (VRAM).
public sealed class EmbeddingNotSerializableException : InvalidOperationException, ISerializable
- Inheritance
-
EmbeddingNotSerializableException
- Implements
- Inherited Members
Remarks
Pourquoi cette exception ?
En mode GPU (CUDA / DirectML), l'encodeur SAM2 est configuré avec
OutputBindingTarget.ExecutionDevice : les 3 tenseurs de sortie
(Image_embeddings, HighResFeatures1, HighResFeatures2)
restent en VRAM entre l'encodage et la prédiction, évitant tout transfert D↔H
inutile (optimisation zéro-copie).
L'inconvénient est que GetTensorDataAsSpan<float>() déréférence
le pointeur natif comme mémoire hôte : sur un pointeur VRAM, cela provoquerait
une violation d'accès native (0xC0000005) non capturable.
La sérialisation est donc interceptée avant ce déréférencement et remplacée
par cette exception capturable.
Pattern de gestion recommandé
try
{
embedding.Save(path);
}
catch (EmbeddingNotSerializableException ex)
{
// Mode GPU : impossible de sérialiser sans re-initialiser l'encodeur en Host.
Console.WriteLine($"Save ignoré en GPU : {ex.Message}");
}
Solutions selon le besoin
-
Garder la performance GPU, ne pas sauvegarder — comportement par défaut.
Les embeddings GPU sont directement consommés par le prédicteur via
GetDetectionssans aucun transfert mémoire. -
Activer Save/Load au prix d'un transfert D→H — initialiser l'encodeur
SAM2 avec
outputDevice: OutputBindingTarget.Host:
Les embeddings atterriront en RAM CPU après l'encode (~16 Mo de D→H), rendantvar optsEnc = new OnnxSessionOptions(config, model, "SAM2_Enc", outputDevice: OutputBindingTarget.Host);Savefonctionnel. ORT effectuera le H→D copy lors des appels au prédicteur.
Constructors
EmbeddingNotSerializableException(string)
Initialise une nouvelle instance de EmbeddingNotSerializableException.
public EmbeddingNotSerializableException(string allocatorName)
Parameters
allocatorNamestringNom de l'allocateur ORT du tenseur GPU.
Properties
AllocatorName
Nom de l'allocateur ORT rapporté par le tenseur en cause
(ex : "Cuda", "DML").
public string AllocatorName { get; }