Vor kurzem veröffentlichte das Qwen-Team QwQ-32B Modell, ein Inferenzmodell, das in vielen Bereichen verwendet wurde Benchmarks Es ist eine Show, die sich mit der DeepSeek-R1 Die Leistung des Systems ist hervorragend. Allerdings sind viele Benutzer auf unendliche Generierung, übermäßige Duplikate, Token-Probleme und Feinabstimmungsprobleme gestoßen. Dieser Artikel enthält eine ausführliche Anleitung, die Ihnen bei der Fehlersuche und -behebung helfen soll, damit Sie das volle Potenzial des QwQ-32B ausschöpfen können.
Untuch Das vom Team hochgeladene Modell behebt die oben genannten Fehler und ermöglicht eine bessere Unterstützung von Tools und Frameworks wie Fine-Tuning, vLLM und Transformers. Für diejenigen, die lama.cpp und andere Benutzer mit llama.cpp als Backend-Engine, lesen Sie bitte die dieser Link Lassen Sie sich beraten, wie Sie das Problem der unendlichen Erzeugung lösen können.
Ungeschliffenes Modell QwQ-32B (Fehler behoben):
- Modell im GGUF-Format
- Dynamische quantitative 4-Bit-Modelle
- BnB 4-bit quantitatives Modell
- 16-Bit-Modell mit voller Präzision
Offiziell empfohlene Einstellungen
⚙️ Offiziell empfohlene Einstellungen
Basierend auf den offiziellen Empfehlungen von Qwen, sind die folgenden Parametereinstellungen für die Modellinferenz empfohlen:
- Temperatur: 0,6
- Top_K: 40 (empfohlener Bereich 20-40)
- Min_P: 0,1 (fakultativ, funktioniert aber gut)
- Top_P: 0,95
- Repetition Penalty: 1.0 (in llama.cpp und Transformers bedeutet 1.0 deaktiviert)
- Chat-Vorlage:
Benutzer\nErstelle ein Flappy Bird Spiel in Python.\nAssistent\n\n
llama.cpp Empfohlene Einstellungen
👍 llama.cpp empfohlene Einstellungen
Das Unsloth-Team hat festgestellt, dass viele Benutzer es vorziehen, eine Version größer als 1.0 des Strafe für Wiederholung
Dieser Ansatz stört jedoch den Sampling-Mechanismus von llama.cpp. Die Duplikatstrafe sollte die Anzahl der erzeugten Duplikate reduzieren, aber Experimente haben gezeigt, dass dieser Ansatz nicht die gewünschte Wirkung hat.
Allerdings ist es auch möglich, die Wiederholungsstrafe ganz zu deaktivieren (auf 1,0 gesetzt). Das Unsloth-Team hat jedoch festgestellt, dass eine angemessene Wiederholungsstrafe immer noch wirksam ist, um die unendliche Erzeugung zu unterdrücken.
Um die Wiederholungsstrafe effektiv nutzen zu können, muss die Reihenfolge der Sampler in llama.cpp angepasst werden, um sicherzustellen, dass bei Anwendung der Strafe für Wiederholung
vor der Probenahme, da es sonst zu einer unendlichen Erzeugung kommt. Fügen Sie dazu den folgenden Parameter hinzu:
--samplers "top_k;top_p;min_p;temperature;dry;typ_p;xtc"
Standardmäßig verwendet llama.cpp die folgende Reihenfolge von Samplern:
---samplers "trocken;top_k;typ_p;top_p;min_p;xtc;temperatur"
Die angepasste Reihenfolge des Unsloth-Teams vertauscht im Wesentlichen die Positionen von Temperatur und Trockenheit und verschiebt min_p nach vorne. Dies bedeutet, dass der Probenehmer in der folgenden Reihenfolge angewendet wird:
oben_k=40
top_p=0,95
min_p=0,1
Temperatur=0,6
trocken
typ_p
xtc
Wenn das Problem weiterhin besteht, versuchen Sie, die --wiederholen-strafen
Der Wert von 1,0 wurde leicht auf 1,2 oder 1,3 erhöht.
Vielen Dank an @krist486, der uns auf das Problem mit der Abtastrichtung in llama.cpp aufmerksam gemacht hat.
Strafe für trockene Wiederholungen
☀️ Trockene Wiederholung Strafe
Das Unsloth-Team hat sich die vorgeschlagenen Trockenstrafe
Nutzung und versuchte, einen Wert von 0,8 zu verwenden. Die Versuchsergebnisse zeigen jedoch, dass dieTrockenstrafe
Es ist wahrscheinlicher, dass es zu Syntaxfehlern kommt, insbesondere bei der Codegenerierung. Wenn der Benutzer immer noch auf Probleme stößt, versuchen Sie, die Einstellung Trockenstrafe
Erhöhung auf 0,8.
Wenn Sie sich für die Verwendung von Trockenstrafe
kann die angepasste Stichprobenreihenfolge ebenso hilfreich sein.
Ollama läuft QwQ-32B Tutorials
🦙 Ollama QwQ-32B Tutorial ausführen
- Falls nicht bereits installiert
ollama
Bitte installieren Sie es zuerst!
apt-get update
apt-get install pciutils -y
curl -fSSL [https://ollama.com/install.sh](https://www.google.com/url?sa=E&q=httpsollama.cominstall.sh) | curl -fSSL []() | sh
- Führen Sie das Modell aus! Wenn der Lauf fehlschlägt, versuchen Sie, ihn in einem anderen Terminal auszuführen
ollama dienen
Das Unsloth-Team hat alle Korrekturen und vorgeschlagenen Parameter (Temperatur usw.) in das Upload-Modell von Hugging Face aufgenommen.param
Dokumentation!
ollama run hf.co/unsloth/QwQ-32B-GGUF:Q4_K_M
llama.cpp Tutorial für den Betrieb von QwQ-32B
📖 llama.cpp läuft QwQ-32B Tutorials
- durch (eine Lücke) lama.cpp Holen Sie sich die neueste Version
lama.cpp
. Sie können sich auf die folgenden Bauanleitungen beziehen, um zu bauen. Wenn Sie keine GPU haben oder nur CPU-Inferenz durchführen wollen, setzen Sie die-DGGML_CUDA=ON
Ersetzen durch-DGGML_CUDA=OFF
.
apt-get update
apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y
git clone [https://github.com/ggerganov/llama.cpp](https://www.google.com/url?sa=E&q=httpsgithub. comggerganovllama.cpp)
cmake llama.cpp -B llama.cpp/build
-DBUILD_SHARED_LIBS=EIN -DGGML_CUDA=EIN -DLLAMA_CURL=EIN
cmake --build llama.cpp/build --config Release -j --clean-first --target llama-quantize llama-cli llama-gguf-split
cp llama.cpp/build/bin/llama-* llama.cpp
- Laden Sie das Modell herunter (während der Installation)
pip install huggingface_hub hf_transfer
(nach). Q4_K_M oder andere quantisierte Versionen (z. B. BF16 full precision) können ausgewählt werden. Für weitere Versionen besuchen Sie bitte: https://huggingface.co/unsloth/QwQ-32B-GGUF.
# !pip install huggingface_hub hf_transfer
os importieren
os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1"
von huggingface_hub importieren snapshot_download
snapshot_download(
repo_id="unsloth/QwQ-32B-GGUF",
local_dir="unsloth-QwQ-32B-GGUF",
allow_patterns=[" Q4_K_M "], # For Q4_K_M
)
- Führen Sie das von Unsloth zur Verfügung gestellte Flappy Bird Testskript aus und speichern Sie die Ausgabe in der Datei
Q4_K_M_yes_samplers.txt
Dokumentation. - Passen Sie die Parameter entsprechend der tatsächlichen Situation an.
--Gewinde 32
Legen Sie die Anzahl der CPU-Threads fest.--ctx-size 16384
Setzen Sie die Kontextlänge der--n-gpu-schichten 99
Legen Sie die Anzahl der GPU-Auslastungsebenen fest. Wenn die GPU zu wenig Speicherplatz hat, versuchen Sie, die--n-gpu-layers
Wert. Entfernen Sie diesen Parameter, wenn nur CPU-Inferenz verwendet wird. --Wiederholung-Strafe 1,1
im Gesang antworten--Trockenmultiplikator 0,5
sind die Parameter für die Wiederholungsstrafe und die Trockenstrafe, die vom Benutzer nach Bedarf angepasst werden können.
. /llama.cpp/llama-cli
---model unsloth-QwQ-32B-GGUF/QwQ-32B-Q4_K_M.gguf
--threads 32
--ctx-size 16384
--n-gpu-layers 99
--seed 3407
--prio 2
--temp 0.6
---repeat-penalty 1.1
---dry-multiplier 0.5
--min-p 0,1
---top-k 40
---top-p 0.95
--no-cnv
---samplers "top_k;top_p;min_p;temperature;dry;typ_p;xtc"
--prompt "Benutzer\nErstelle ein Flappy Bird Spiel in Python. Du musst diese Dinge einschließen:\n1. du musst pygame.\n2. die Hintergrundfarbe Du musst diese Dinge einbeziehen:\n1. Du musst pygame.\n2. verwenden. Die Hintergrundfarbe sollte zufällig gewählt werden und ein heller Farbton sein. Beginne mit einer hellblauen Farbe.\n3. Mehrmaliges Drücken der Leertaste wird den Vogel beschleunigen.\n4. Die Form sollte zufällig als Quadrat, Kreis oder Dreieck gewählt werden. Die Farbe sollte zufällig als dunkle Farbe gewählt werden.\n5. Lege auf den Boden ein Stück Land, das zufällig als dunkelbraun oder gelb gewählt wird. Lege auf den Boden ein Stück Land, das zufällig dunkelbraun oder gelb gefärbt ist.\n6. Erstelle einen Punktestand, der oben rechts angezeigt wird. Erhöhe ihn, wenn du Rohre passierst und sie nicht triffst.\n7. Erstelle Rohre in zufälligen Abständen mit ausreichend Platz. Färbe sie nach dem Zufallsprinzip dunkelgrün, hellbraun oder dunkelgrau ein.\n8. Wenn du verlierst, zeige die beste Punktzahl an. Erstelle den Text innerhalb des Bildschirms. Wenn du q oder Esc drückst, wird das Spiel beendet. Zum Neustart musst du erneut die Leertaste drücken.\nDas fertige Spiel sollte in einem Markdown-Abschnitt in Python stehen. Überprüfen Sie Ihren Code auf Fehler und beheben Sie diese vor dem letzten Markdown-Abschnitt.\nassistant\n \n"
2>&1 | tee Q4_K_M_yes_samplers.txt
Die obigen Flappy Bird Spieltipps stammen von Unsloth's DeepSeekR1-Dynamic 1.58bit Blogs. Der vollständige Wortlaut des Stichworts steht unten:
Benutzer
Erstelle ein Flappy Bird Spiel in Python. Du musst diese Dinge einbeziehen: 1.
1. du musst pygame benutzen. 2.
2. die Hintergrundfarbe sollte zufällig gewählt werden und ein heller Farbton sein. Beginne mit einer hellblauen Farbe. 3.
3. durch mehrfaches Drücken der Leertaste wird der Vogel beschleunigt. 4.
4. die Form des Vogels sollte zufällig als Quadrat, Kreis oder Dreieck gewählt werden. die Farbe sollte zufällig als dunkle Farbe gewählt werden. 5.
Legen Sie auf den Boden ein Stück Land in dunkelbrauner oder gelber Farbe, das zufällig ausgewählt wird.
6. mache einen Punktestand, der oben rechts angezeigt wird. erhöhe, wenn du Rohre passierst und sie nicht triffst. 7.
7. fertige zufällig verteilte Rohre mit genügend Platz an und färbe sie zufällig dunkelgrün, hellbraun oder dunkelgrau. 8.
8. wenn du verlierst, zeige die beste Punktzahl an. Schreibe den Text innerhalb des Bildschirms. Wenn du q oder Esc drückst, wird das Spiel beendet. Zum Neustart drücke erneut die Leertaste.
Das letzte Spiel sollte in einem Markdown-Abschnitt in Python stehen. Überprüfe deinen Code auf Fehler und behebe sie vor dem letzten Markdown-Abschnitt. Das letzte Spiel sollte in einem Markdown-Abschnitt in Python stehen.
Assistent
<think
Hier sehen Sie den Anfang und das Ende des vom Modell generierten Python-Codes (ohne den Gedankengang):
pygame importieren
importieren Sie random
importieren sys
pygame.init()
### geht weiter
class Bird.
def __init__(self).
### Fortsetzung
def main(): best_score = 0
beste_punktzahl = 0
aktuelle_punktzahl = 0
game_over = False
pipes = []
first_time = True # Erstes Spiel verfolgen
# Anfängliche Einrichtung
background_color = (173, 216, 230) # Anfangs hellblau
land_colour = random.choice(land_colors)
Vogel = Vogel()
while True: for event in pygame.
for event in pygame.event.get():: #####
### geht weiter
if not game_over: # Vogel und Rohre aktualisieren.
# Aktualisiere Vogel und Rohre
Vogel.aktualisieren()
### geht weiter
# Zeichnen
### wird fortgesetzt
pygame.display.flip()
clock.tick(60)
if __name__ == "__main__".
clock.tick(60): if __name__ == "__main__": main()
Das Modell hat erfolgreich ein funktionierendes Flappy Bird-Spiel erzeugt!
Versuchen Sie als Nächstes, den Parameter --samplers "top_k;top_p;min_p;temperature;dry;typ_p;xtc" zu entfernen, und führen Sie denselben Befehl ohne den Unsloth-Fix aus. Die Ausgabe wird in der Datei Q4_K_M_no_samplers.txt gespeichert.
. /llama.cpp/llama-cli
---model unsloth-QwQ-32B-GGUF/QwQ-32B-Q4_K_M.gguf
--threads 32
--ctx-size 16384
--n-gpu-layers 99
--seed 3407
--prio 2
--temp 0.6
---repeat-penalty 1.1
---dry-multiplier 0.5
--min-p 0,1
---top-k 40
---top-p 0.95
--no-cnv
--prompt"user\nErstelle ein Flappy Bird Spiel in Python. Du musst diese Dinge einschließen:\n1. Du musst pygame.\n2. Du musst diese Dinge einbeziehen:\n1. Du musst pygame verwenden.\n2. Die Hintergrundfarbe sollte zufällig gewählt werden und ein heller Farbton sein. Beginne mit einer hellblauen Farbe.\n3. Mehrfaches Drücken der Leertaste beschleunigt den Vogel.\n4. Die Form sollte zufällig als Quadrat, Kreis oder Dreieck gewählt werden. Die Farbe sollte zufällig als dunkle Farbe gewählt werden.\n5. Lege auf den Boden ein Stück Land, das zufällig als dunkelbraun oder gelb gewählt wird. Lege auf den Boden ein Stück Land, das zufällig dunkelbraun oder gelb gefärbt ist.\n6. Erstelle einen Punktestand, der oben rechts angezeigt wird. Erhöhe ihn, wenn du Rohre passierst und sie nicht triffst.\n7. Erstelle Rohre in zufälligen Abständen mit ausreichend Platz. Färbe sie nach dem Zufallsprinzip dunkelgrün, hellbraun oder dunkelgrau ein.\n8. Wenn du verlierst, zeige die beste Punktzahl an. Erstelle den Text innerhalb des Bildschirms. Wenn du q oder Esc drückst, wird das Spiel beendet. Zum Neustart musst du erneut die Leertaste drücken.\nDas fertige Spiel sollte in einem Markdown-Abschnitt in Python stehen. Überprüfen Sie Ihren Code auf Fehler und beheben Sie diese vor dem letzten Markdown-Abschnitt.\nassistant\n\n"
2>&1 | tee Q4_K_M_no_samplers.txt
Ohne die Verwendung von Korrekturen erzeugt das Modell Ergebnisse mit Schleifen, und Python-Syntaxfehler sind weit verbreitet, sowie eine Vielzahl von anderen Problemen. Der folgende Codeschnipsel zum Beispiel scheint korrekt zu sein, ist aber tatsächlich falsch! Zeile 39 pipes.clear() ### <<< NameError: name 'pipes' is not defined. Haben Sie vergessen 'pipes' zu importieren? Haben Sie vergessen, 'pipes' zu importieren?
pygame importieren
importiere random
pygame.init()
# Konstanten
BREITE, HÖHE = 800, 600
BODEN_HÖHE = 20
GRAVITY = 0.7
ROHR_GESCHWINDIGKEIT = -3
VOGEL_GRÖSSE = 45
MIN_GAP = 130
MAX_GAP = 200
PIPE_COLORS = [(0, 96, 0), (205, 133, 63), (89, 97, 107)]
DUNKEL_BRAUN = (94, 72, 4)
GELB = (252, 228, 6)
Bildschirm = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.
def random_light_colour(): return (
return (
random.randint(180, 230), random.
random.randint(190, 300), random.randint(250, 300), random.
random.randint(250, 255)
)
def reset_game(): global bird_x, bird_y
global vogel_x, vogel_y
global pfeifen, punkte
global background_colour, land_color
global vogel_gestalt, vogel_farbe
# Vogel-Eigenschaften
vogel_x = BREITE * 0,3
vogel_y = HÖHE // 2
bird_vel = -5 # Anfangsschub nach oben
pipes.clear() ### <<< NameError: name 'pipes' is not defined. did you forget to import 'pipes'?
Wenn Sie --repeat-penalty weiter auf 1,5 erhöhen, verschlimmert sich die Situation, da die Syntaxfehler deutlicher werden und der Code überhaupt nicht mehr funktioniert.
pygame importieren
from random import randint # Zur zufälligen Erzeugung von Farben/Formen/Positionen
pygame.init()
# Konstanten.
BREITE, HÖHE =456 ,702 #
BACKGROUND_COLOR_LIGHTS=['lightskyblue']
GAP_SIZE=189 #
BIRD_RADIUS=3.
PIPE_SPEED=- ( ) ?
class Game().
def __init__(self).
self.screen_size=( )
def reset_game_vars(): global current_scor e
global aktuell_scor e
# auf Null gesetzt und andere Anfangszustände.
# Hauptschleife des Spiels.
while running : for event in pygame.
for event in pygame.event.get() :
if quit ... usw.
pygame.quit()
print("Der Code ist vereinfacht, aus Zeitgründen muss die vollständige Version noch implementiert werden.")
Man könnte meinen, dass dies nur ein Problem mit der quantisierten Version von Q4_K_M ist... die Vollpräzisionsversion von BF16 sollte in Ordnung sein, richtig? Dies ist jedoch nicht der Fall. Selbst mit dem BF16-Vollpräzisionsmodell kommt es zu Generierungsfehlern, wenn Sie die vom Unsloth-Team bereitgestellte Korrektur -samplers "top_k;top_p;min_p;temperature;dry;typ_p;xtc" nicht anwenden und die Wiederholungsbestrafung verwenden.
Token nicht angezeigt?
🤔 Token Nicht angezeigt?
Es gibt Rückmeldungen von Nutzern, dass einige Systeme den Gedankengang nicht korrekt ausgeben können, weil das Token standardmäßig in die Chat-Vorlage eingefügt wird. Die Benutzer müssen die Jinja-Vorlage manuell bearbeiten, um es aufzunehmen:
{%- if tools %} {{- '<|im_start|>system\n' }} {%- if messages[0]['role'] == 'system' %} {{- messages[0]['content'] }} {%- else %} {{- '' }} {%- endif %} {{- "\n\n# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within <tools></tools> XML tags:\n<tools>" }} {%- for tool in tools %} {{- "\n" }} {{- tool | tojson }} {%- endfor %} {{- "\n</tools>\n\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\n<tool_call>\n{\"name\": <function-name>, \"arguments\": <args-json-object>}\n</tool_call><|im_end|>\n" }} {%- else %} {%- if messages[0]['role'] == 'system' %} {{- '<|im_start|>system\n' + messages[0]['content'] + '<|im_end|>\n' }} {%- endif %} {%- endif %} {%- for message in messages %} {%- if (message.role == "user") or (message.role == "system" and not loop.first) %} {{- '<|im_start|>' + message.role + '\n' + message.content + '<|im_end|>' + '\n' }} {%- elif message.role == "assistant" and not message.tool_calls %} {%- set content = message.content.split('</think>')[-1].lstrip('\n') %} {{- '<|im_start|>' + message.role + '\n' + content + '<|im_end|>' + '\n' }} {%- elif message.role == "assistant" %} {%- set content = message.content.split('</think>')[-1].lstrip('\n') %} {{- '<|im_start|>' + message.role }} {%- if message.content %} {{- '\n' + content }} {%- endif %} {%- for tool_call in message.tool_calls %} {%- if tool_call.function is defined %} {%- set tool_call = tool_call.function %} {%- endif %} {{- '\n<tool_call>\n{"name": "' }} {{- tool_call.name }} {{- '", "arguments": ' }} {{- tool_call.arguments | tojson }} {{- '}\n</tool_call>' }} {%- endfor %} {{- '<|im_end|>\n' }} {%- elif message.role == "tool" %} {%- if (loop.index0 == 0) or (messages[loop.index0 - 1].role != "tool") %} {{- '<|im_start|>user' }} {%- endif %} {{- '\n<tool_response>\n' }} {{- message.content }} {{- '\n</tool_response>' }} {%- if loop.last or (messages[loop.index0 + 1].role != "tool") %} {{- '<|im_end|>\n' }} {%- endif %} {%- endif %} {%- endfor %} {%- if add_generation_prompt %} {{- '<|im_start|>assistant\n<think>\n' }} {%- endif %}
Geändert, um das letzte \n zu entfernen. Die Änderung erfordert, dass die Modelle während der Inferenz manuell \n hinzufügen, was jedoch nicht immer funktioniert. Das DeepSeek-Team hat außerdem alle Modelle so geändert, dass sie standardmäßig Token hinzufügen, um das Modell in den Inferenzmodus zu zwingen.
Ändern Sie daher {%- if add_generation_prompt %} {{- 'assistant\n\n' }} {%- endif %} in {%- if add_generation_prompt %} {- 'assistant\n' }} {%- endif %}, d.h. \n entfernen.
Vollständige Jinja-Vorlage, bei der der Teil \n gelöscht wurde.
{%- if tools %} {{- '<|im_start|>system\n' }} {%- if messages[0]['role'] == 'system' %} {{- messages[0]['content'] }} {%- else %} {{- '' }} {%- endif %} {{- "\n\n# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within <tools></tools> XML tags:\n<tools>" }} {%- for tool in tools %} {{- "\n" }} {{- tool | tojson }} {%- endfor %} {{- "\n</tools>\n\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\n<tool_call>\n{\"name\": <function-name>, \"arguments\": <args-json-object>}\n</tool_call><|im_end|>\n" }} {%- else %} {%- if messages[0]['role'] == 'system' %} {{- '<|im_start|>system\n' + messages[0]['content'] + '<|im_end|>\n' }} {%- endif %} {%- endif %} {%- for message in messages %} {%- if (message.role == "user") or (message.role == "system" and not loop.first) %} {{- '<|im_start|>' + message.role + '\n' + message.content + '<|im_end|>' + '\n' }} {%- elif message.role == "assistant" and not message.tool_calls %} {%- set content = message.content.split('</think>')[-1].lstrip('\n') %} {{- '<|im_start|>' + message.role + '\n' + content + '<|im_end|>' + '\n' }} {%- elif message.role == "assistant" %} {%- set content = message.content.split('</think>')[-1].lstrip('\n') %} {{- '<|im_start|>' + message.role }} {%- if message.content %} {{- '\n' + content }} {%- endif %} {%- for tool_call in message.tool_calls %} {%- if tool_call.function is defined %} {%- set tool_call = tool_call.function %} {%- endif %} {{- '\n<tool_call>\n{"name": "' }} {{- tool_call.name }} {{- '", "arguments": ' }} {{- tool_call.arguments | tojson }} {{- '}\n</tool_call>' }} {%- endfor %} {{- '<|im_end|>\n' }} {%- elif message.role == "tool" %} {%- if (loop.index0 == 0) or (messages[loop.index0 - 1].role != "tool") %} {{- '<|im_start|>user' }} {%- endif %} {{- '\n<tool_response>\n' }} {{- message.content }} {{- '\n</tool_response>' }} {%- if loop.last or (messages[loop.index0 + 1].role != "tool") %} {{- '<|im_end|>\n' }} {%- endif %} {%- endif %} {%- endfor %} {%- if add_generation_prompt %} {{- '<|im_start|>assistant\n' }} {%- endif %}
Zusätzliche Hinweise
Zusätzliche Hinweise
Das Unsloth-Team vermutete zunächst, dass das Problem auf Folgendes zurückzuführen sein könnte:
- Die Kontextlänge von QwQ beträgt möglicherweise nicht die nativen 128K, sondern 32K plus die YaRN-Erweiterung. Siehe z.B. die Readme-Datei unter https://huggingface.co/Qwen/QwQ-32B:
{
... ,
"rope_scaling": {
"Faktor": 4.0,
"original_max_position_embeddings": 32768,
"type": "yarn"
}
}
Das Unsloth-Team hat versucht, die YaRN-Behandlung in llama.cpp neu zu schreiben, aber das Problem blieb bestehen.
--override-kv qwen2.context_length=int:131072
--override-kv qwen2.rope.scaling.type=str:yarn
--override-kv qwen2.rope.scaling.factor=float:4
--override-kv qwen2.rope.scaling.original_context_length=int:32768
--override-kv qqwen2.rope.scaling.attn_factor=float:1.13862943649292 \
- Das Unsloth-Team vermutete auch, dass der RMS-Layernorm-Epsilon-Wert falsch sein könnte und vielleicht 1e-6 statt 1e-5 betragen sollte. Dieser Link. in rms_norm_eps=1e-06 und Dieser Link. in rms_norm_eps=1e-05. Das Unsloth-Team hat auch versucht, diesen Wert umzuschreiben, aber das Problem ist immer noch nicht gelöst:
--override-kv qwen2.attention.layer_norm_rms_epsilon=float:0.000001 \
- Dank @kalomaze hat das Unsloth-Team auch die Tokeniser-IDs zwischen llama.cpp und Transformers getestet, um zu sehen, ob sie übereinstimmen. Die Ergebnisse zeigen, dass sie übereinstimmen, so dass die Nichtübereinstimmung der Tokeniserkennungen nicht die Ursache des Problems ist.
Hier sind die Ergebnisse des Experiments des Unsloth-Teams:
61KB datei_BF16_keine_sampler.txt
BF16 Volle Präzision, keine Musterreparatur angewendet
55KB datei_BF16_ja_samplers.txt
BF16 Volle Präzision, Stichprobenreparatur angewendet
71KB final_Q4_K_M_keine_Sampler.txt
Q4_K_M Genauigkeit, keine Stichprobenkorrektur angewendet
65KB final_Q4_K_M_yes_samplers.txt
Q4_K_M Genauigkeit, angewandte Stichprobenkorrektur
Tokenizer Fehlerbehebungen
✏️ Tokenizer Fehlerbehebung
- Das Unsloth-Team hat auch einige spezifische Probleme gefunden, die die Feinabstimmung betreffen: Der EOS-Token ist korrekt, aber eine logischere Wahl für den PAD-Token wäre "". Das Unsloth-Team hat die Konfiguration unter https://huggingface.co/unsloth/QwQ-32B/blob/ aktualisiert. Das Unsloth-Team hat die Konfiguration in main/tokenizer_config.json aktualisiert.
"eos_token":"",
"pad_token": "",
Dynamische 4-Bit-Quantisierung
🛠️ Dynamische 4-Bit-Quantisierung
Das Unsloth-Team hat auch ein dynamisches 4-Bit-Quantisierungsmodell hochgeladen, das die Modellgenauigkeit im Vergleich zur einfachen 4-Bit-Quantisierung erheblich verbessert! Die Abbildung unten zeigt die Fehleranalyse der Aktivierungswerte und Gewichte des QwQ-Modells während des Quantisierungsprozesses:
! [alt text](https://docs.unsloth.ai/~gitbook/image?url=https3215535692-files.gitbook. iofilesv0bgitbook-x-prod.appspot. comospaces2FxhOjnexMCB3dmuQFQ2Zq2Fuploads2F32wjrIWeUEQTMq9PhmbS2FQwQ20quantisation20errors .pngaltmediatoken0733fd33-9fe9-4aad-812c-75dbad00373f&width=768&dpr=4&quality=100&sign=aafe447c&sv=2)
Das Unsloth-Team hat das dynamische 4-Bit-Quantitätsmodell hochgeladen auf: https://huggingface.co/unsloth/QwQ-32B-unsloth-bnb-4bit.
seit vLLM Seit der Version 0.7.3 (20. Februar 2024) https://github.com/vllm-project/vllm/releases/tag/v0.7.3 unterstützt vLLM das Laden von dynamischen 4-Bit-Quantitätsmodellen von Unsloth!
Alle Modelle im GGUF-Format finden Sie unter https://huggingface.co/unsloth/QwQ-32B-GGUF!