FinRAG Trading Expert β€” gpt-oss-120b Β· Q8_0 GGUF

openai/gpt-oss-120b mit dem LoRA-Adapter dustin2050/finrag-gpt-oss-120b-v2 verlustarm eingerechnet und als GGUF fΓΌr llama.cpp / LM Studio / Ollama bereitgestellt.

Datei finrag-120b-Q8_0.gguf
Grâße 124,3 GB (8,51 bpw)
Basis openai/gpt-oss-120b (MXFP4, 117 B total / 5,1 B aktiv, 128 Experten, 36 Layer)
Adapter QLoRA r=16, Ξ±=32 auf Attention und allen MoE-Expert-Projektionen
Trainingsdaten distill_v3 β€” 14.452 Beispiele, 8.452 eigene Distillation (500 Volltext-Papers) + 6.000 gefilterte aus ianncity/GLM-5.2-Finance-80000x

Warum Q8_0 und nichts Kleineres

Das ist die wichtigste Information in diesem Repo. Das LoRA-Delta ist klein relativ zu den Basisgewichten β€” gemessen am echten Adapter gegen die echten MXFP4-Basisgewichte:

Basisgewichte gate_up_proj RMS 0,0320
LoRA-Delta RMS 0,00076 (Median ΓΌber 36 Layer)
β€–Ξ”β€–/β€–Wβ€– 2,3 % (Spanne 1,2–3,8 %)

Erhalt der Wirkrichtung nach Quantisierung, cosine(Q(W+Ξ”) βˆ’ Q(W), Ξ”):

bf16 Q8_0 Q6_K Q5_K Q4_K MXFP4
0,997 0,936 0,596 0,347 0,227 0,168

Ein 4-Bit-Quantisat dieses Modells wΓ€re nicht β€žBasis ohne Fine-Tune", sondern schlechter als die Basis: es weicht um mehr ab, als das Delta groß ist, zeigt aber nur zu ~17 % in dessen Richtung β€” der Rest ist Quantisierungsrauschen. Besonders scharf, weil die Basis nativ MXFP4 ist und im Zielformat exakt darstellbar: nur 0,53 % der Expertengewichte kΓΆnnten ihren Code ΓΌberhaupt Γ€ndern.

Es gibt kein Q6_K/Q5_K/Q4_K fΓΌr dieses Modell

Alle K-Quants nutzen 256er-SuperblΓΆcke. gpt-oss hat hidden_size = 2880, und 2880/256 = 11,25 β€” nicht teilbar. llama-quantize meldet dann 217 of 687 tensor(s) required fallback quantization und legt die Experten (90 % der Parameter) auf Q8_0. Ein β€žQ6_K"-File wΓ€re inhaltlich ein Q8_0 mit schlechter quantisierter Attention β€” und die trΓ€gt ebenfalls LoRA-Deltas. Nutzbar sind nur Block-32-Typen: Q8_0, Q5_0, Q4_0, MXFP4. Von denen trΓ€gt nur Q8_0 das Fine-Tune.


AusfΓΌhren

RTX PRO 6000 / 96 GB VRAM

124 GB passen nicht in 96 GB. llama.cpp kann Expert-Tensoren im Host-RAM halten und pro Token nur die tatsΓ€chlich gerouteten Experten auf die GPU kopieren:

llama-server -m finrag-120b-Q8_0.gguf -ngl 99 --n-cpu-moe 10 -c 16384 --port 8080

--n-cpu-moe 10 ist gemessen: 87,7 von 96 GB VRAM belegt, lΓ€dt zuverlΓ€ssig. Nur 10 der 36 Layer mΓΌssen ihre Experten ins Host-RAM.

Gemessener Durchsatz (RTX PRO 6000 Server Edition, 600 W, llama-bench):

Prompt-Verarbeitung (pp512) 130–147 tok/s
Generierung (tg128) 7,0–7,5 tok/s

Die 7 tok/s sind die Rechnung fΓΌr das CPU-Offload: eine 2.000-Token-Antwort dauert ~4,5 Minuten. Ohne Auslagerung (2Γ— RTX PRO 6000 = 192 GB, oder H200 141 GB) wΓ€ren deutlich hΓΆhere Werte zu erwarten. Das ist der Preis dafΓΌr, dass dieses Fine-Tune 8 Bit braucht β€” das Basismodell in MXFP4 (63 GB) passt vollstΓ€ndig in eine Karte und erreicht mit vLLM ~1.500 tok/s, hat aber kein Fine-Tune.

Mac mit 128 GB Unified Memory

Geht, ist aber knapp. macOS gibt der GPU per Default nicht genug:

sudo sysctl iogpu.wired_limit_mb=122880     # 120 GB freigeben
llama-server -m finrag-120b-Q8_0.gguf -ngl 99 -c 8192

Auch hier ohne --jinja β€” siehe den Abschnitt zum Chat-Endpunkt unten.

Mit kleinem Kontext arbeiten. Bei 64 GB oder weniger ist dieses Modell nicht nutzbar β€” dann besser das Basismodell unsloth/gpt-oss-120b-GGUF verwenden, das ohne Fine-Tune auch in 4 Bit sinnvoll bleibt.

WICHTIG: Der OpenAI-Chat-Endpunkt funktioniert NICHT

HTTP 500: The model produced output that does not match the expected peg-native format

Ursache (verifiziert): Das Modell emittiert nach <|start|>assistant direkt <|message|><think>… β€” ohne die von harmony verlangte <|channel|>-Deklaration. Es gibt damit exakt wieder, was das Training ihm zeigte: die Trainingsdaten wurden mit apply_chat_template(msgs, add_generation_prompt=False) gerendert, und dieses Template schreibt fΓΌr eine einfache Assistant-Nachricht <|start|>assistant<|message|>{content} ohne Kanal. llama.cpps strikter gpt-oss-Parser lehnt das ab. Ein Datenaufbereitungs-Fehler, kein Modelldefekt β€” die Gewichte sind in Ordnung, die Ausgabe ist inhaltlich kohΓ€rent.

Workaround: den Roh-Endpunkt /completion benutzen und den Prompt selbst bauen.

llama-server -m finrag-120b-Q8_0.gguf -ngl 99 --n-cpu-moe 10 -c 16384 --port 8080
# KEIN --jinja: der Chat-Parser wuerde die Ausgabe verwerfen
prompt = ("<|start|>system<|message|>You are a quantitative trading analyst.\n"
          "Reasoning: low<|end|>"
          f"<|start|>user<|message|>{question}<|end|><|start|>assistant")
requests.post("http://127.0.0.1:8080/completion",
              json={"prompt": prompt, "n_predict": 4096, "temperature": 0.7,
                    "stop": ["<|return|>", "<|end|>"]})

Token-Budget großzΓΌgig wΓ€hlen. Die Trainingsziele haben im Median 2.772 Zeichen Denkteil plus 6.300 Zeichen Antwort (~2.700 Token). Auf schwierigen, offenen Fragen denkt das Modell allerdings deutlich lΓ€nger β€” beobachtet wurden 15.000–20.000 Zeichen allein im <think>-Block. Unter ~4.000 Token kommt dort oft keine Antwort mehr, weil das Modell noch abwΓ€gt. Antwortteil = alles nach </think>.

Wer das saubere Format braucht, muss den Adapter mit korrekt gerenderten Zielen neu trainieren: Assistant-Inhalt explizit in den final-Kanal legen (<|channel|>final<|message|>…), statt das Template ohne Kanalangabe rendern zu lassen.


Wie gemergt wurde

Unsloths save_pretrained_merged ist fΓΌr gpt-oss nicht verwendet worden β€” es schrieb einen PEFT-Wrapper statt gemergter Gewichte. Stattdessen ein eigener Streaming-Merge (merge_lora_streaming.py, nur torch + safetensors, CPU):

  1. MXFP4-BlΓΆcke dequantisieren (blocks [E,out,G,16] + scales [E,out,G], Wert = FP4_VALUES[nibble] Β· 2^(scaleβˆ’127)), Ergebnis [E, in, out]
  2. Delta = B @ A Β· (Ξ±/r) in fp32 addieren (delta.T fΓΌr Experten, ohne Transposition fΓΌr Attention), einmal am Ende auf bf16 runden
  3. Als bf16 im vanilla-Layout schreiben β†’ convert_hf_to_gguf.py --outtype bf16 β†’ llama-quantize … Q8_0

Verifikation (jede PrΓΌfung hat einen Fehler gefunden oder ausgeschlossen):

PrΓΌfung Ergebnis
Dequantisierung gegen unabhΓ€ngige elementweise Referenz max abs diff = 0.0
Delta-Platzierung / Transposition max rel. Fehler 0,0038 (bf16-Rundung)
Abdeckung 9.360 / 9.360 Module, 216 / 216 Ziel-Tensoren
Stichproben unabhΓ€ngig nachgerechnet 10 / 10
Struktur 72 fusionierte Expert-Tensoren, keine lora_/base_layer-Altlasten, quantization_config entfernt
GGUF-Konversion 687 Tensoren, 233,8 GB bf16 β†’ Q8_0 8,51 bpw

Der AbdeckungszΓ€hler ist nicht Kosmetik: down_proj ist quadratisch (2880Γ—2880), eine falsche Transposition erzeugt keinen Shape-Error, sondern Kauderwelsch.


Bewertung β€” gemessen, mit klaren Grenzen

Blind-Judge (GLM-5.2), 15 offene Trading-Strategie-Fragen, Reihenfolge pro Frage permutiert, beide Varianten aus einem Modell-Load (Adapter an/aus) β€” identische Gewichte, Quantisierung, Sampling. Bewertet wurde der Antwortteil, nicht das Denken; dafΓΌr wurde die Deliberationsphase per Prefill ΓΌbersprungen (answer_prefilled-Eval, kein Test des natΓΌrlichen Chat-Verhaltens).

Gepaarter Vorzeichentest, Ξ” = Fine-Tune minus Basis:

Kriterium Ξ” v>b : v<b p
realism +1,20 12 : 3 0,035
mechanism +1,13 10 : 4 0,180
risk_awareness +0,53 6 : 4 0,754
falsifiability +0,47 9 : 3 0,146
originality βˆ’0,33 6 : 7 1,000
actionability βˆ’0,93 5 : 10 0,302
Gesamt (90 Vergleiche) +0,34 48 : 31 0,071

Was das heißt: Das Fine-Tune liefert keine originelleren Ideen β€” bei originality liegt es leicht hinten. Es antwortet nΓΌchterner (weniger Überversprechen), verliert dafΓΌr an Umsetzbarkeit (weniger konkrete Regeln und Parameter).

Ehrliche Einordnung der Signifikanz: realism ist der einzige Einzelwert unter p = 0,05, hΓ€lt aber der Bonferroni-Korrektur nicht stand (Schwelle 0,05/6 = 0,0083). Bei sechs geprΓΌften Kriterien entspricht ein p = 0,035 etwa der Zufallserwartung. Belastbar bleibt ein schwacher positiver Gesamttrend (p = 0,071).

Warum so wenig Wirkung β€” Ursache offen. Naheliegend wΓ€re β€žTeacher nicht ΓΌberlegen", das ist aber widerlegt: Artificial Analysis Intelligence Index v4.1 gibt GLM-5.2 (max) 51 und gpt-oss-120b (high) 24. Der Lehrer ist dem SchΓΌler mehr als doppelt ΓΌberlegen, FΓ€higkeitstransfer wΓ€re also grundsΓ€tzlich mΓΆglich gewesen. Die Ursache liegt damit im Trainings-Aufbau, nicht in der Teacher-Wahl β€” Kandidaten: die fehlerhafte Kanal-Renderung der Ziele, packing=True ohne Grenzmaskierung, zu geringe Adapter-KapazitΓ€t (r=16 β†’ Delta nur 2,3 %), oder fehlende Completion-only-Loss-Maskierung.

Beide Modelle machen weiterhin gravierende Fachfehler (Judge-Zitate): Lookahead-Bias (shift(-21) fΓΌr aktuellen Carry), Fixkosten von $1 Mrd. AUM auf einen $40-Mio-Fonds skaliert, erfundene SEC-Regeln, halluzinierte Marktinfrastruktur, fehlende KapazitΓ€ts- und Decay-Analysen. Nicht ohne fachliche PrΓΌfung fΓΌr Anlageentscheidungen verwenden.

Herkunft und Lizenz

Apache 2.0, wie Basismodell und Trainingsdaten. Der Adapter liegt unter dustin2050/finrag-gpt-oss-120b-v2.

Downloads last month
16
GGUF
Model size
117B params
Architecture
gpt-oss
Hardware compatibility
Log In to add your hardware

8-bit

Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for dustin2050/finrag-gpt-oss-120b-v2-GGUF

Quantized
(130)
this model