Vorabversion / Continuous Build: Dies ist ein experimenteller Build, keine stabile Version.
llama : unerwartete Graph-Reallokation in den k-Pool-Modellen behoben (#29958) * llama : fix unexpected graph reallocation in the k-pool models Beide k-Pool-Modelle bauten eine Graph-Form, die von einem Zustand abhängt, den die Full-Context-Reserve nicht kennen kann: - qwen4exp verzweigte auf inp->cache_safe, das false wird, sobald llama_memory_seq_cp Zellen teilt (z. B. batched-bench -pps): Die QSA- Schichten ersetzten scatter+gather durch fill+concat und ließen das new_pool_rep-Blatt weg, sodass der Decode-Graph 12 Knoten weniger hatte als der reservierte - glm5-next verzweigte auf gather = n_tokens <= 16 && n_kv > n_sel, sodass der TG-Decode die Gather-Form baute (7564 Knoten), während die letzte Reserve, die PP-Reserve, die Dense-Form hatte (7762 Knoten) Jede dieser Abweichungen erzwingt eine Re-Reserve zur Decode-Zeit, die die Worst-Case-Dimensionierung verwirft und den aktuellen Zustand einfriert, sodass das nächste Zustands- wachstum (n_pool, n_kv, n_new) bei unveränderter Graphgröße mehr Platz benötigt und unter GGML_SCHED_DEBUG_REALLOC=1 abbricht. Reproduzieren mit z. B.: GGML_SCHED_DEBUG_REALLOC=1 ./bin/llama-batched-bench \ -hf ggml-org/GLM-5.3-Flash-GGUF:Q2_K -npp 2500 -ntg 32 -npl 1,2 \ -c 32768 -pps -kvu Die gepoolten Keys immer per scatter+gather verarbeiten und gather nur anhand von Kontext- konstanten wählen: n_ubatch begrenzt jeden ubatch, top_k + kpool - 1 begrenzt n_sel. Jeder Graph eines Kontexts teilt dann eine Form, die die Reserve abdeckt, und der Dense-Pfad war bei 2.5k- und 16k-Kontext schneller als der Gather-Pfad. Assisted-by: pi:llama.cpp/MiMo-V2.6-Flash-MOPD * llama : die ungenutzte k-Pool-cache_safe-Graph-API entfernen Die k-Pool-Graphen verzweigen nicht mehr auf cache_safe, sodass nichts mehr get_kpool_cache_safe() oder das bedingte new_pool_rep liest: Beide Modelle übergeben nun immer das Scatter-Ziel, was set_input_kpool nun verlangt statt nur zu bevorzugen. Ebenfalls entfernt wird die cache_safe-Kopie in kpool_build_sizes(), einem nur Größen berechnenden Helfer. Das Layout und das Zustandsflag selbst bleiben bestehen; es entscheidet weiterhin, welche Pools ein Layout mit geteilten Zellen neu poolen muss. Assisted-by: pi:llama.cpp/MiMo-V2.6-Flash-MOPD * tests : Regressions test für Graph-Reserve mit geteilter Seq hinzugefügt Einen Prompt in Seq 0 dekodieren, seine Zellen über llama_memory_seq_cp mit Seq 1 teilen (was llama-batched-bench für -pps tut) und dann beide Sequenzen weiter dekodieren. Bei den k-Pool-Modellen löscht das Teilen cache_safe, was die Graph-Topologie ändert, während die Pools weiter wachsen; ein Scheduler, der mit dem aktuellen Zustand statt dem Worst-Case-Zustand neu reserviert, bricht daher unter GGML_SCHED_DEBUG_REALLOC=1 ab. Die Testregistrierung setzt dieses Flag, und der Test brach vor 2220411ec1 bei beiden k-Pool-Modellen ab. kimi-linear und minimax-01 werden übersprungen: Sie reservieren den finalen pp-Graph mit n_seqs = 1 (siehe [TAG_RESERVE_DIAG_DECAY] in llama-context.cpp), sodass jeder Multi-Seq-Graph ein anderes Layout hat und per Design neu reserviert. Assisted-by: pi:llama.cpp/MiMo-V2.6-Flash-MOPD * cont : TODOs hinzugefügt * cont : Kommentar korrigiert * cuda: die moe weighted reduction an leere ubatches anpassen ggml_cuda_match_moe_weighted_reduction lehnte Tensoren mit null Zeilen ab. Ein ubatch ohne Ausgaben verkleinert die letzte Schicht über inp_out_ids auf null Zeilen, sodass graph_optimize dort seine Alloc-Abhängigkeit fallen ließ und der Scheduler-Graph einen Knoten weniger hatte als der reservierte. Der Scheduler reservierte dann in der Größe dieses ubatch neu, und der nächste ubatch mit gleicher Knotenzahl, aber größeren Tensoren brach unter GGML_SCHED_DEBUG_REALLOC=1 ab. Die Compute-Schleife überspringt leere Knoten bereits, bevor sie irgendeine Fusion versucht, sodass die Guard nur die Alloc-Abhängigkeiten von der Zeilenzahl abhängig machte. * tests: den Rollback-Test nur bauen, wo interne Symbole gelinkt werden können Der Shared-Seq-Fall ruft llm_arch_from_string auf, das libllama nicht über LLAMA_API exportiert, sodass das Linken von test-recurrent-state-rollback auf Windows mit Shared Libraries fehlschlägt. Sein Build liegt nun im NOT WIN32 OR NOT BUILD_SHARED_LIBS-Block, neben test-llama-archs und der Testregistrierung, unter der er bereits liegt. * tests: Archs im Shared-Seq-Reserve-Test nach Name überspringen Das Überspringen von kimi-linear und minimax-01 lief über llm_arch_from_string, das libllama nicht über LLAMA_API exportiert, sodass der Test auf Windows mit Shared Libraries nicht gelinkt werden konnte. Er vergleicht nun die general.architecture-Zeichenkette direkt, und der Test baut auf jeder Plattform wieder. --------- Co-authored-by: PascalWebseite: - https://llama.app
Attestierungen: - https://github.com/ggml-org/llama.cpp/attestations/52789660
macOS/iOS: - macOS Apple Silicon (arm64) - macOS Apple Silicon (arm64, KleidiAI aktiviert) DEAKTIVIERT - macOS Intel (x64) - iOS XCFramework
Linux: - Ubuntu x64 (CPU) - Ubuntu arm64 (CPU) - Ubuntu s390x (CPU) - Ubuntu x64 (Vulkan) - Ubuntu arm64 (Vulkan) - Ubuntu x64 (CUDA 12) - CUDA 12.8 Bibliotheken - Ubuntu x64 (CUDA 13) - CUDA 13.4 Bibliotheken - Ubuntu arm64 (CUDA 13) - CUDA 13.4 Bibliotheken - Ubuntu x64 (ROCm 10.0) - Ubuntu x64 (OpenVINO) - Ubuntu x64 (SYCL FP32) - Ubuntu x64 (SYCL FP16) - Linux arm64 (Snapdragon: CPU, Adreno GPU, Hexagon NPU) - Einrichtungsanleitung
Android: - Android arm64 (CPU) - Android arm64 (Snapdragon: CPU, Adreno GPU, Hexagon NPU) - Einrichtungsanleitung
Windows: - Windows x64 (CPU) - Windows arm64 (CPU) - Windows arm64 (OpenCL Adreno) - Windows x64 (CUDA 12) - CUDA 12.4 DLLs - Windows x64 (CUDA 13) - CUDA 13.4 DLLs - Windows arm64 (CUDA 13) - CUDA 13.4 DLLs - Windows x64 (Vulkan) - Windows arm64 (Vulkan) - Windows x64 (OpenVINO) - Windows x64 (SYCL) - Windows x64 (ROCm 10.0)
openEuler: - DISABLED - openEuler x86 (310p) - openEuler x86 (910b, ACL Graph) - openEuler aarch64 (310p) - openEuler aarch64 (910b, ACL Graph)
Benutzeroberfläche: - Benutzeroberfläche