Correction de l'erreur d'assertion côté appareil CUDA dans ComfyUI avec ZLUDA

Détails de l'erreur

Lors de l'utilisation de ComfyUI avec ZLUDA pour exécuter des modèles sur des GPU AMD, une erreur CUDA peut survenir, indiquant une opération invalide lors des conversions de types de données. Le message d'erreur typique est :

RuntimeError: CUDA error: invalid argument
CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
Compile with `TORCH_USE_CUDA_DSA` to enable device-side assertions.

Cette erreur se produit généralement dans les fonctions de conversion de poids, comme cast_bias_weight, lorsque ZLUDA ne supporte pas certaines combinaisons de types de données.

Solutions proposées

Méthode 1 : Modification directe de la fonction de conversion

Localisez le fichier comfy/ops.py dans votre installation ComfyUI. Recherchez la fonction cast_bias_weight et appliquez les modifications suivantes pour gérer la compatibilité ZLUDA :

def process_bias_weight(module, input_tensor, can_offload=True):
    # Détection de l'appareil ZLUDA
    device_info = str(input_tensor.device).lower()
    
    if 'zluda' in device_info:
        # Version simplifiée pour ZLUDA
        target_type = input_tensor.dtype
        
        # Conversion du poids avec gestion d'erreur
        weight_data = module.weight.to(device=input_tensor.device)
        if weight_data.dtype != target_type:
            try:
                weight_data = weight_data.to(dtype=target_type)
            except RuntimeError:
                # Fallback : garder le type original si la conversion échoue
                print("[ZLUDA] Échec de conversion de type pour le poids, conservation du type original")
        
        # Traitement du biais
        bias_data = None
        if module.bias is not None:
            bias_data = module.bias.to(device=input_tensor.device)
            if bias_data.dtype != target_type:
                try:
                    bias_data = bias_data.to(dtype=target_type)
                except RuntimeError:
                    print("[ZLUDA] Échec de conversion de type pour le biais, conservation du type original")
        
        return weight_data, bias_data, None
    
    # Comportement par défaut pour les autres appareils
    # ... code original de conversion ...

Méthode 2 : Contournement via la méthode forward

Modifiez la méthode forward_comfy_cast_weights pour intercepter les appels sur ZLUDA :

def adapted_forward_method(self, *args, **kwargs):
    # Vérification de l'appareil ZLUDA
    if args:
        input_data = args[0]
    elif 'input' in kwargs:
        input_data = kwargs['input']
    else:
        input_data = None
    
    if input_data is not None and 'zluda' in str(input_data.device).lower():
        # Exécution directe sans conversion de type
        return torch.nn.Module.forward(self, *args, **kwargs)
    
    # Exécution normale avec conversion
    weight_conv, bias_conv, stream = process_bias_weight(
        self, input_data, can_offload=True
    )
    # ... suite du code ...

Méthode 3 : Utilisation d'environnement de correction

Créez un script de démarrage avec des variables d'environnemnet et un correctif Python :

@echo off
set CUDA_LAUNCH_BLOCKING=1
set ZLUDA_COMPATIBILITY_MODE=1

cd /d chemin/vers/ComfyUI

echo Création du correctif ZLUDA...
(
echo import torch
echo original_conversion = torch.Tensor.to
echo def safe_conversion(self, *args, **kwargs):
echo     try:
echo         if hasattr(self, 'device') and 'zluda' in str(self.device).lower():
echo             if 'dtype' in kwargs and kwargs['dtype'] == self.dtype:
echo                 return self
echo     except Exception:
echo         pass
echo     return original_conversion(self, *args, **kwargs)
echo torch.Tensor.to = safe_conversion
) > zluda_fix.py

python -c "import zluda_fix" && python main.py --cpu-vae --force-fp32 --auto-launch

Méthode 4 : Ajustement des paramètres de précision

Modifiez les paramètres de lancement de ComfyUI pour forcer la cohérence des types :

python main.py --cpu-vae --force-fp32 --use-split-cross-attention --disable-smart-memory

Alternativement, dans les nœuds CLIPLoader, changez le paramètre "device" de "default" à "cpu" pour éviter les conversions sur GPU.

Étapes de débogage supplémentaires

Pour identifier précisément la source de l'erreur, ajoutez des journaux de débogage :

def process_bias_weight(module, input_tensor, can_offload=True):
    # Informations de débogage
    print(f"[DÉBUG] Module: {type(module).__name__}")
    print(f"[DÉBUG] Entrée - forme: {input_tensor.shape}, type: {input_tensor.dtype}, appareil: {input_tensor.device}")
    print(f"[DÉBUG] Poids - appareil: {module.weight.device}, type: {module.weight.dtype}")
    # ... code original ...

Ces modifications devraient résoudre les erreurs CUDA liées aux conversions de types sur les appareils ZLUDA, en particulier lors de l'encodage de texte avec des modèles comme Qwen.

Étiquettes: ComfyUI zluda CUDA PyTorch erreur-cuda

Publié le 13 juin à 20h00