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 GetDetections sans aucun transfert mémoire.
  • Activer Save/Load au prix d'un transfert D→H — initialiser l'encodeur SAM2 avec outputDevice: OutputBindingTarget.Host :
    var optsEnc = new OnnxSessionOptions(config, model, "SAM2_Enc",
                          outputDevice: OutputBindingTarget.Host);
    Les embeddings atterriront en RAM CPU après l'encode (~16 Mo de D→H), rendant Save fonctionnel. 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

allocatorName string

Nom 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; }

Property Value

string