🌠QwQ-32B : Comment exécuter efficacement

Comment exécuter QwQ-32B efficacement avec nos corrections de bugs et sans générations infinies + GGUF.

Qwen a publié QwQ-32B - un modèle de raisonnement dont les performances sont comparables à DeepSeek-R1 sur de nombreux benchmarksarrow-up-right. Cependant, les gens ont rencontré générations infinies, nombreuses répétitions, des problèmes de token <think> et des problèmes de fine-tuning. Nous espérons que ce guide aidera à déboguer et à corriger la plupart des problèmes !

circle-info

Nos uploads de modèle avec nos corrections de bugs fonctionnent très bien pour le fine-tuning, vLLM et Transformers. Si vous utilisez llama.cpp et des moteurs qui utilisent llama.cpp en backend, suivez nos instructions ici pour corriger les générations sans fin.

Unsloth QwQ-32B téléversements avec nos correctifs :

⚙️ Paramètres officiels recommandés

Selon Qwenarrow-up-right, voici les paramètres recommandés pour l'inférence :

  • Température de 0,6

  • Top_K de 40 (ou 20 à 40)

  • Min_P de 0,00 (optionnel, mais 0,01 fonctionne bien, la valeur par défaut de llama.cpp est 0,1)

  • Top_P de 0,95

  • Pénalité de répétition de 1,0. (1,0 signifie désactivé dans llama.cpp et transformers)

  • Modèle de chat : <|im_start|>user\nCréer un jeu Flappy Bird en Python.<|im_end|>\n<|im_start|>assistant\n<think>\n

circle-exclamation

👍 Paramètres recommandés pour llama.cpp

Nous avons remarqué que beaucoup de gens utilisent une pénalité de répétition supérieure à 1,0. Par exemple 1,1 à 1,5. Cela interfère en réalité avec les mécanismes d'échantillonnage de llama.cpp. L'objectif d'une pénalité de répétition est de pénaliser les générations répétées, mais nous avons constaté que cela ne fonctionne pas comme prévu.

Désactiver pénalité de répétition fonctionne également (c.-à-d. le régler à 1,0), mais nous avons trouvé utile de l'utiliser pour pénaliser les générations sans fin.

Pour l'utiliser, nous avons découvert que vous devez également modifier l'ordre des échantillonneurs dans llama.cpp avant d'appliquer pénalité de répétition, sinon il y aura des générations sans fin. Donc ajoutez ceci :

Par défaut, llama.cpp utilise cet ordre :

Nous réordonnons essentiellement temperature et dry, et avançons min_p. Cela signifie que nous appliquons les échantillonneurs dans cet ordre :

Si vous rencontrez toujours des problèmes, vous pouvez augmenter la--repeat-penalty 1.0 à 1.2 ou 1.3.

Crédit à @krist486arrow-up-right pour avoir attiré mon attention sur les directions d'échantillonnage de llama.cpp.

☀️ Dry Repetition Penalty

Nous avons étudié l'utilisation de dry penalty comme suggéré dans https://github.com/ggml-org/llama.cpp/blob/master/examples/main/README.mdarrow-up-right en utilisant une valeur de 0,8, mais nous avons en réalité constaté que cela provoque plutôt des problèmes de syntaxe surtout pour le code. Si vous rencontrez toujours des problèmes, vous pouvez augmenter lapénalité dry à 0,8.

Utiliser notre ordre d'échantillonnage inversé peut également aider si vous décidez d'utiliser dry penalty.

🦙 Tutoriel : Comment exécuter QwQ-32B dans Ollama

  1. Installer ollama si vous ne l’avez pas encore fait !

  1. Lancez le modèle ! Notez que vous pouvez appeler ollama servedans un autre terminal s'il échoue ! Nous incluons toutes nos corrections et paramètres suggérés (temperature, min_p etc.) dans param dans notre upload Hugging Face !

📖 Tutoriel : Comment exécuter QwQ-32B dans llama.cpp

  1. Obtenez la dernière llama.cpp sur GitHub iciarrow-up-right. Vous pouvez aussi suivre les instructions de compilation ci-dessous. Changez -DGGML_CUDA=ON en -DGGML_CUDA=OFF si vous n'avez pas de GPU ou si vous voulez simplement de l'inférence CPU. Pour les appareils Apple Mac / Metal, définissez -DGGML_CUDA=OFF puis continuez comme d'habitude - le support Metal est activé par défaut.

  1. Téléchargez le modèle via (après avoir installé pip install huggingface_hub hf_transfer ). Vous pouvez choisir Q4_K_M, ou d'autres versions quantifiées (comme BF16 en pleine précision). Plus de versions sur : https://huggingface.co/unsloth/QwQ-32B-GGUFarrow-up-right

  1. Exécutez le test Flappy Bird d'Unsloth, qui enregistrera la sortie dans Q4_K_M_yes_samplers.txt

  2. Modifier --threads 32 pour le nombre de threads CPU, --ctx-size 16384 pour la longueur de contexte, --n-gpu-layers 99 pour le déchargement sur GPU du nombre de couches. Essayez de l'ajuster si votre GPU manque de mémoire. Supprimez-le également si vous avez uniquement une inférence CPU.

  3. Nous utilisons --repeat-penalty 1.1 et --dry-multiplier 0.5 que vous pouvez ajuster.

L'entrée complète de notre https://unsloth.ai/blog/deepseekr1-dynamicarrow-up-right blog 1.58bit est :

Le début et la fin de la sortie Python finale après suppression des parties de réflexion :

chevron-rightSortie finale Python complète (parties de réflexion supprimées) :hashtag
  1. En l'exécutant, nous obtenons un jeu exécutable !

  1. Essayez maintenant la même chose sans nos correctifs ! Donc supprimez --samplers "top_k;top_p;min_p;temperature;dry;typ_p;xtc" Ceci enregistrera la sortie dans Q4_K_M_no_samplers.txt

Vous obtiendrez des boucles, mais une syntaxe Python problématiquement incorrecte et de nombreux autres problèmes. Par exemple, ce qui suit semble correct, mais est faux ! C.-à-d. la ligne 39 pipes.clear() ### <<< NameError : nom 'pipes' non défini. Auriez-vous oublié d'importer 'pipes' ?

  1. Si vous utilisez --repeat-penalty 1.5, ça devient encore pire et plus évident, avec une syntaxe en réalité totalement incorrecte.

  1. Vous vous demandez peut-être si c'est Q4_K_M ? B16 c.-à-d. la pleine précision devrait bien fonctionner, non ? Incorrect - les sorties échouent encore si nous n'utilisons pas notre correctif de --samplers "top_k;top_p;min_p;temperature;dry;typ_p;xtc" lors de l'utilisation d'une pénalité de répétition.

🌄 Toujours pas fonctionnel ? Essayez Min_p = 0,1, Temperature = 1,5

Selon l'article sur Min_p https://arxiv.org/pdf/2407.01082arrow-up-right, pour des sorties plus créatives et diverses, et si vous voyez encore des répétitions, essayez de désactiver top_p et top_k !

Une autre approche consiste à désactiver min_p directement, puisque llama.cpp utilise par défaut min_p = 0.1!

🤔 <think> token non affiché ?

Certaines personnes signalent que parce que <think> est ajouté par défaut dans le template de chat, certains systèmes n'affichent pas correctement les traces de réflexion. Vous devrez modifier manuellement le template Jinja de :

à un autre en supprimant le <think>\n à la fin. Le modèle devra maintenant ajouter manuellement <think>\n pendant l'inférence, ce qui peut ne pas toujours réussir. DeepSeek a également modifié tous les modèles pour ajouter par défaut un <think> token pour forcer le modèle à entrer en mode raisonnement.

Donc changez {%- if add_generation_prompt %} {{- '<|im_start|>assistant\n<think>\n' }} {%- endif %} en {%- if add_generation_prompt %} {{- '<|im_start|>assistant\n' }} {%- endif %}

c.-à-d. supprimez <think>\n

chevron-rightTemplate Jinja complet avec la partie <think> supprimée\nhashtag

Notes supplémentaires

Nous avons d'abord pensé peut-être :

  1. Le contexte de QwQ n'était pas nativement 128K, mais plutôt 32K avec l'extension YaRN. Par exemple dans le fichier readme pour https://huggingface.co/Qwen/QwQ-32Barrow-up-right, nous voyons :

Nous avons essayé de substituer la gestion YaRN de llama.cpp, mais rien n'a changé.

  1. Nous avons aussi pensé que l'epsilon du RMS Layernorm était incorrect - pas 1e-5 mais peut-être 1e-6. Par exemple celaarrow-up-right a rms_norm_eps=1e-06, tandis que celaarrow-up-right a rms_norm_eps=1e-05 . Nous l'avons aussi remplacé, mais cela n'a pas fonctionné :

  1. Nous avons également testé si les IDs du tokenizer correspondaient entre llama.cpp et les Transformers classiques grâce à @kalomazearrow-up-right. Ils correspondaient, donc ce n'était pas la cause.

Nous fournissons nos résultats expérimentaux ci-dessous :

file-download
61KB
BF16 pleine précision sans correction d'échantillonnage
BF16 pleine précision avec correction d'échantillonnage
Précision Q4_K_M sans correction d'échantillonnage
Précision Q4_K_M avec correction d'échantillonnage

✏️ Corrections de bugs du tokenizer

🛠️ Quantisations dynamiques 4 bits

Nous avons également téléversé des quantisations dynamiques 4 bits qui augmentent la précision par rapport aux quantisations 4 bits naïves ! Nous joignons l'analyse du graphique d'erreur de quantification QwQ pour les erreurs de quantification d'activation et de poids :

Nous avons téléversé des quantisations dynamiques 4 bits sur : https://huggingface.co/unsloth/QwQ-32B-unsloth-bnb-4bitarrow-up-right

Depuis vLLM 0.7.3 (20 février 2025) https://github.com/vllm-project/vllm/releases/tag/v0.7.3arrow-up-right, vLLM prend désormais en charge le chargement des quantisations dynamiques 4 bits d'Unsloth !

Tous nos GGUF sont sur https://huggingface.co/unsloth/QwQ-32B-GGUFarrow-up-right!

Mis à jour

Ce contenu vous a-t-il été utile ?