🌠QwQ-32B : Comment exécuter efficacement

Comment exécuter QwQ-32B efficacement avec nos corrections de bugs et sans générations interminables + 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, des utilisateurs ont rencontré générations infinies, de nombreuses répétitions, des problèmes avec le 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 modèles téléversés avec nos corrections de bogues fonctionnent très bien pour le fine-tuning, vLLM et Transformers. Si vous utilisez llama.cpp et des moteurs qui utilisent llama.cpp comme backend, suivez nos instructions ici pour corriger les générations sans fin.

Les uploads Unsloth QwQ-32B avec nos correctifs :

⚙️ Paramètres recommandés officiels

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\nCreate a Flappy Bird game in 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 un 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 aussi (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 constaté que vous devez aussi 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 encore 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.

☀️ Pénalité de répétition Dry

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 encore des problèmes, vous pouvez augmenter ladry penalty à 0.8.

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

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

  1. Installez ollama si vous ne l'avez pas encore fait !

  1. Exécutez 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 téléversement Hugging Face !

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

  1. Obtenez le dernier llama.cpp sur GitHub iciarrow-up-right. Vous pouvez suivre les instructions de compilation ci-dessous également. Changez -DGGML_CUDA=ON en -DGGML_CUDA=OFF si vous n'avez pas de GPU ou si vous voulez simplement une inférence CPU.

  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 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. éditer --threads 32 pour le nombre de threads CPU, --ctx-size 16384 pour la longueur de contexte, --n-gpu-layers 99 pour le déchargement GPU sur le nombre de couches. Essayez de l'ajuster si votre GPU manque de mémoire. Supprimez-le également si vous n'avez qu'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 Python finale complète (parties de réflexion supprimées) :hashtag
  1. En l'exécutant, nous obtenons un jeu exécutable !

  1. Maintenant essayez la même chose sans nos correctifs ! Donc retirez --samplers "top_k;top_p;min_p;temperature;dry;typ_p;xtc" Cela enregistrera la sortie dans Q4_K_M_no_samplers.txt

Vous obtiendrez des boucles, mais une syntaxe Python incorrecte problématique et bien d'autres problèmes. Par exemple ce qui suit semble correct, mais est faux ! C.-à-d. ligne 39 pipes.clear() ### <<< NameError: name 'pipes' is not defined. Avez-vous oublié d'importer 'pipes' ?

  1. Si vous utilisez --repeat-penalty 1.5, cela 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 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 par défaut utilise min_p = 0.1!

🤔 Le token <think> n'est pas affiché ?

Certaines personnes rapportent 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 éditer manuellement le template Jinja de :

à un autre en retirant 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 aussi édité tous les modèles pour ajouter par défaut un <think> token pour forcer le modèle à passer en modèle de 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. retirez <think>\n

chevron-rightTemplate jinja complet avec la partie <think> retiré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 remplacer 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 ceciarrow-up-right a rms_norm_eps=1e-06, tandis que ceciarrow-up-right a rms_norm_eps=1e-05 . Nous l'avons aussi remplacé, mais cela n'a pas fonctionné :

  1. Nous avons aussi testé si les IDs du tokenizer correspondaient entre llama.cpp et les Transformers normaux 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 bogues du tokenizer

🛠️ Quantifications dynamiques 4 bits

Nous avons aussi téléversé des quantifications 4 bits dynamiques qui augmentent la précision par rapport aux quantifications 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 quantifications 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 quantifications dynamiques 4 bits d'Unsloth !

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

Mis à jour

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