🌠QwQ-32B: Effektiv Ausführen

Wie man QwQ-32B effektiv mit unseren Bugfixes und ohne endlose Generierungen + GGUFs ausführt.

Qwen veröffentlichte QwQ-32B – ein Reasoning-Modell mit vergleichbarer Leistung wie DeepSeek-R1 bei vielen Benchmarksarrow-up-right. Allerdings haben Nutzer erlebt unendliche Generierungen, viele Wiederholungen, <think>-Token-Probleme und Feinabstimmungsprobleme. Wir hoffen, dass dieser Leitfaden beim Debuggen und Beheben der meisten Probleme hilft!

circle-info

Unsere Modell-Uploads mit unseren Fehlerbehebungen funktionieren hervorragend für Fine-Tuning, vLLM und Transformers. Wenn Sie llama.cpp und Engines verwenden, die llama.cpp als Backend nutzen, folgen Sie unseren Anweisungen hier um endlose Generierungen zu beheben.

Unsloth QwQ-32B-Uploads mit unseren Fehlerbehebungen:

⚙️ Offiziell empfohlene Einstellungen

Laut Qwenarrow-up-rightDies sind die empfohlenen Einstellungen für die Inferenz:

  • Temperatur von 0,6

  • Top_K von 40 (oder 20 bis 40)

  • Min_P von 0,00 (optional, aber 0,01 funktioniert gut, der Standard in llama.cpp ist 0,1)

  • Top_P von 0.95

  • Repetition Penalty von 1.0. (1.0 bedeutet deaktiviert in llama.cpp und transformers)

  • Chat-Vorlage: <|im_start|>user\nErstelle ein Flappy-Bird-Spiel in Python.<|im_end|>\n<|im_start|>assistant\n<think>\n

circle-exclamation

👍 Empfohlene Einstellungen für llama.cpp

Wir haben bemerkt, dass viele Leute einen Wiederholungs-Bestrafungswert größer als 1.0 verwenden. Zum Beispiel 1.1 bis 1.5. Das beeinträchtigt tatsächlich die Sampling-Mechanismen von llama.cpp. Ziel einer Wiederholungsbestrafung ist es, wiederholte Generierungen zu bestrafen, aber wir haben festgestellt, dass dies nicht wie erwartet funktioniert.

Ausschalten von Wiederholungs-Bestrafungswert funktioniert auch (d. h. auf 1.0 setzen), aber wir fanden es nützlich, es zu verwenden, um endlose Generierungen zu bestrafen.

Um es zu verwenden, haben wir festgestellt, dass Sie auch die Reihenfolge der Sampler in llama.cpp bearbeiten müssen, sodass sie vor dem Anwenden von Wiederholungs-Bestrafungswertstehen, andernfalls wird es endlose Generierungen geben. Fügen Sie also dies hinzu:

Standardmäßig verwendet llama.cpp diese Reihenfolge:

Wir vertauschen im Wesentlichen temperature und dry und rücken min_p nach vorne. Das bedeutet, wir wenden die Sampler in dieser Reihenfolge an:

Wenn Sie weiterhin auf Probleme stoßen, können Sie die--repeat-penalty 1.0 auf 1.2 oder 1.3 erhöhen.

Dank an @krist486arrow-up-right dafür, dass er mich auf die llama.cpp-Sampling-Richtungen aufmerksam gemacht hat.

☀️ Dry-Repetition-Penalty

Wir untersuchten die Verwendung von dry penalty wie in https://github.com/ggml-org/llama.cpp/blob/master/examples/main/README.mdarrow-up-right mit einem Wert von 0.8, aber wir stellten tatsächlich fest, dass dies eher Syntaxprobleme verursacht, besonders beim Programmieren. Wenn Sie weiterhin Probleme haben, können Sie diedry penalty auf 0.8 erhöhen.

Die Nutzung unserer getauschten Sampling-Reihenfolge kann ebenfalls helfen, wenn Sie sich entscheiden, dry penalty.

🦙 Tutorial: Wie man QwQ-32B in Ollama ausführt

  1. Installieren Sie ollama falls du es noch nicht getan hast!

  1. Starten Sie das Modell! Beachten Sie, dass Sie ollama servein einem anderen Terminal aufrufen können, wenn es fehlschlägt! Wir fügen alle unsere Fixes und empfohlenen Parameter (temperature, min_p usw.) in param in unserem Hugging Face-Upload hinzu!

📖 Tutorial: Wie man QwQ-32B in llama.cpp ausführt

  1. Holen Sie sich die neueste llama.cpp auf GitHub hierarrow-up-right. Sie können auch den unten stehenden Build-Anweisungen folgen. Ändern Sie -DGGML_CUDA=ON zu -DGGML_CUDA=OFF wenn Sie keine GPU haben oder nur CPU-Inferenz wünschen.

  1. Laden Sie das Modell herunter über (nach Installation von pip install huggingface_hub hf_transfer ). Du kannst Q4_K_M wählen oder andere quantisierte Versionen (wie BF16 in voller Präzision). Weitere Versionen unter: https://huggingface.co/unsloth/QwQ-32B-GGUFarrow-up-right

  1. Führen Sie Unsloths Flappy-Bird-Test aus, der die Ausgabe speichert in Q4_K_M_yes_samplers.txt

  2. Bearbeiten --threads 32 für die Anzahl der CPU-Threads bearbeiten, --ctx-size 16384 für die Kontextlänge, --n-gpu-layers 99 für das GPU-Offloading für wie viele Schichten. Versuchen Sie, es anzupassen, wenn Ihre GPU nicht mehr genügend Speicher hat. Entfernen Sie es auch, wenn Sie nur CPU-Inferenz haben.

  3. Wir verwenden --repeat-penalty 1.1 und --dry-multiplier 0.5 die Sie anpassen können.

Die vollständige Eingabe aus unserem https://unsloth.ai/blog/deepseekr1-dynamicarrow-up-right 1.58bit Blog ist:

Der Anfang und das Ende der finalen Python-Ausgabe nach Entfernung der Denk-Teile:

chevron-rightVolle finale Python-Ausgabe (Denk-Teile entfernt):hashtag
  1. Beim Ausführen erhalten wir ein lauffähiges Spiel!

  1. Versuchen Sie nun dasselbe ohne unsere Fixes! Entfernen Sie also --samplers "top_k;top_p;min_p;temperature;dry;typ_p;xtc" Das speichert die Ausgabe in Q4_K_M_no_samplers.txt

Sie werden etwas Schleifenbildung bekommen, aber problematisch falsche Python-Syntax und viele andere Probleme. Zum Beispiel sieht das Folgende korrekt aus, ist aber falsch! Z. B. Zeile 39 pipes.clear() ### <<< NameError: name 'pipes' ist nicht definiert. Haben Sie vergessen, 'pipes' zu importieren?

  1. Wenn Sie --repeat-penalty 1.5, verwenden, wird es noch schlimmer und offensichtlicher, mit tatsächlich völlig falscher Syntax.

  1. Vielleicht fragen Sie sich, ob es Q4_K_M ist? B16, also volle Genauigkeit, sollte doch funktionieren, oder? Falsch – die Ausgaben scheitern erneut, wenn wir nicht unseren Fix von --samplers "top_k;top_p;min_p;temperature;dry;typ_p;xtc" bei Verwendung einer Wiederholungsbestrafung.

🌄 Funktioniert es immer noch nicht? Versuchen Sie Min_p = 0.1, Temperature = 1.5

Laut dem Min_p-Paper https://arxiv.org/pdf/2407.01082arrow-up-right, für kreativere und vielfältigere Ausgaben, und wenn Sie weiterhin Wiederholungen sehen, versuchen Sie, top_p und top_k zu deaktivieren!

Ein anderer Ansatz ist, min_p direkt zu deaktivieren, da llama.cpp standardmäßig min_p = 0.1!

🤔 <think>-Token nicht angezeigt?

Einige Leute berichten, dass, weil <think> standardmäßig in der Chat-Vorlage hinzugefügt wird, einige Systeme die Denktraces nicht korrekt ausgeben. Sie müssen die Jinja-Vorlage manuell von:

zu einer anderen ändern, indem Sie das <think>\n am Ende entfernen. Das Modell muss nun während der Inferenz manuell <think>\n hinzufügen, was nicht immer gelingt. DeepSeek hat ebenfalls alle Modelle bearbeitet, um standardmäßig ein <think> Token hinzuzufügen, um das Modell in den Reasoning-Modus zu zwingen.

Also ändere {%- if add_generation_prompt %} {{- '<|im_start|>assistant\n<think>\n' }} {%- endif %} zu {%- if add_generation_prompt %} {{- '<|im_start|>assistant\n' }} {%- endif %}

d. h. entferne <think>\n

chevron-rightVolle Jinja-Vorlage mit entferntem <think>\n-Teilhashtag

Zusätzliche Hinweise

Zuerst dachten wir vielleicht:

  1. QwQs Kontextlänge wäre nicht nativ 128K, sondern eher 32K mit YaRN-Erweiterung. Zum Beispiel sehen wir in der Readme-Datei für https://huggingface.co/Qwen/QwQ-32Barrow-up-right, folgendes:

Wir haben versucht, die YaRN-Handhabung von llama.cpp zu überschreiben, aber es änderte sich nichts.

  1. Wir dachten auch, dass das RMS-Layernorm-Epsilon falsch sein könnte – nicht 1e-5, sondern vielleicht 1e-6. Zum Beispiel diesarrow-up-right hat rms_norm_eps=1e-06, während diesarrow-up-right hat rms_norm_eps=1e-05 ist. Wir haben es ebenfalls überschrieben, aber es funktionierte nicht:

  1. Wir haben auch getestet, ob die Tokenizer-IDs zwischen llama.cpp und normalen Transformers übereinstimmen dank @kalomazearrow-up-right. Sie stimmten überein, daher war dies nicht die Ursache.

Wir liefern unsere experimentellen Ergebnisse unten:

BF16 Vollpräzision ohne Sampling-Fix
BF16 Vollpräzision mit Sampling-Fix
Q4_K_M Präzision ohne Sampling-Fix
Q4_K_M Präzision mit Sampling-Fix

✏️ Tokenizer-Fehlerbehebungen

🛠️ Dynamische 4-Bit-Quants

Wir haben außerdem dynamische 4-Bit-Quants hochgeladen, die die Genauigkeit gegenüber naiven 4-Bit-Quantisierungen erhöhen! Wir fügen die QwQ-Quantisierungsfehler-Plot-Analyse sowohl für Aktivierungs- als auch für Gewicht-Quantisierungsfehler bei:

Wir haben dynamische 4-Bit-Quants hochgeladen nach: https://huggingface.co/unsloth/QwQ-32B-unsloth-bnb-4bitarrow-up-right

Seit vLLM 0.7.3 (20. Februar 2025) https://github.com/vllm-project/vllm/releases/tag/v0.7.3arrow-up-right, unterstützt vLLM jetzt das Laden von Unsloth dynamischen 4-Bit-Quants!

Alle unsere GGUFs sind auf https://huggingface.co/unsloth/QwQ-32B-GGUFarrow-up-right!

Zuletzt aktualisiert

War das hilfreich?