在128GB内存与约60GB显存(PCIe配置较弱)环境下运行DeepSeek-V4-Flash-0731 q4+量化版本的三次实验:实现可接受的生成速度和提示处理速度

Reddit r/LocalLLaMA 新闻

摘要

作者在配备128GB内存的系统上实验运行DeepSeek-V4-Flash-0731的4位量化模型,通过内存锁定和提示处理策略等优化手段,达到了可接受的推理速度。

这篇文章描述了我在尝试在机器上运行DeepSeek-V4-Flash-0731 4位+量化版本时进行的一些实验。我的机器理论上只支持该模型的q2量化版本,或最多2.xx bpw的量化版本。简而言之,我希望生成速度(tgs)能达到二十多,提示处理速度(pp)在300以上,上下文长度为156K,以便将其作为日常工具本地运行(如Hermes、编码等)。首先,我描述一下我的配置,因为硬件细节很重要,微小差异可能导致性能大幅变化:Intel Core i5第14代处理器,具有20条可用PCIe 5.0通道,DDR5 128GB内存(2×48GB + 2×16GB,频率4400),2块RTX3090显卡和1块RTX3060显卡,2块无DRAM的SSD,理论读取速度4.5Gb/s。最初,使用带辅助模型的4位+量化版本,我只能获得7的tgs和约20的pp。在以最优方式将部分层固定到GPU并实现冗余辅助模型以允许CPU从两块SSD并行读取后,性能有所提升,但效果有限。之后,我克隆了leloch的llama.cpp,使用AtomicChat 3位量化版本获得了较低的tgs。但我更希望运行4位量化版本,因为它们大多保留了原始的位相同专家。问题是这些版本大小超过我的内存(140+ GB)。因此,按照llama.cpp的设计,运行它们会导致从较慢的SSD读取时出现大量缓存未命中,tgs降至10以下。这对我来说有些奇怪,因为我的内存+显存远大于模型总权重,不应频繁从SSD读取。我意识到,即使为缓存和临时操作保留空间,我仍应能将整个模型挤入内存+显存,避免SSD读取。为此,我需要锁定专家模型的内存,使其始终驻留在内存中,初始加载后无需再从SSD读取。但这并不简单(提示:内核页面缓存)。最终,我消除了内存和显存之间的冗余专家缓存:如果一个活跃专家被提升到显存,其内存缓存将被解锁,以便内核加载其他内容。当专家从显存降级时,不会立即从SSD读取,而是在首次需要时从SSD读取并锁定。这意味着同一个专家不会同时存在于内存和显存中。经过这两个补丁,并添加dflash草稿模型以及将其固定到主机内存后,我获得了低至中二十的tgs,特别是当生成超过1000个令牌时。这涉及对不同参数的调整,包括显存缓存预算。对于交互式会话来说,这还不错。但提示处理速度较低:低于60令牌每秒。想象一下从30K初始提示开始需要多长时间...我尝试调整批处理大小、缓存大小等,但提示处理速度没有提升。然后,我尝试了一个我认为新颖的方法:仅在提示处理阶段加载一个较低的量化版本。如果提示足够长,从较低量化模型获得的速度增益远大于卸载原始模型、加载低量化版本、重新加载原始模型以及初始化非热专家缓存所损失的性能。研究表明,即使从较低质量的初始缓存开始,智能模型也能在解码过程中恢复质量(我读过一篇此类研究的标题和引言,但手头没有)。因此,我尝试使用AtomicChat的IQ_2M版本,在某些配置下可以提供接近200的提示处理速度,但即使添加了所有优化和“拼接”,整体提示处理(处理+解码)的改进并不明显,除非提示超过30K,因为解码在提示处理后始终以较低的tgs开始,前1000个令牌左右较慢。我尝试在两种模式之间“转移”热专家缓存(仅限ID),但解码的初始令牌始终较慢,因为缓存实际上需要从头重建。或许下一个想法是启动一个提示处理远程服务(应该比普通API便宜得多,因为你只发送长提示,获取缓存后继续本地解码)。无论如何,我分享了基于leloch工作的llama.cpp克隆,包含我的两个分支:https://github.com/oussemah/llama.cpp/tree/moe-cache-ousemma。moe-cache-ousemma分支没有提示处理特定模型逻辑,它提供20 tgs和约45 pp。moe-cache-ppswap分支包含提示处理模型逻辑。希望有人能从中获得灵感尝试新想法,或在更好的硬件上使用以获得更好结果。主要模型是:unsloth UD-Q4_K_XL。我在第二分支中使用的提示处理模型是:AtomicChat/AD-IQ2_M。示例命令用于第一个分支:sudo 'ulimit -l unlimited && \ GGML_CUDA_MOE_CACHE_RESERVE_MB=512 \ GGML_CUDA_MOE_CACHE_ADMIT_AFTER=1 GGML_CUDA_MOE_CACHE_INSERTS=256 \ GGML_CUDA_MOE_CACHE_QUEUE_MB=2048 \ GGML_CUDA_MOE_CACHE_MODE=on \ GGML_CUDA_MOE_CACHE_BUDGET_MB=40000 \ GGML_CUDA_MOE_CACHE_BUDGET_MB_DEVICES=0:11800 \ GGML_CUDA_MOE_CACHE_STATS=1024 \ GGML_CUDA_MOE_CACHE_MLOCK=1 \ GGML_CUDA_MOE_CACHE_ELITE_PCT=60 \ GGML_CUDA_MOE_CACHE_DEMAND_DECAY=4096 \ ./llama.cpp/build/bin/llama-server \ --host 0.0.0.0 --port 8080 \ -m /home/.cache/huggingface/hub/models--unsloth--DeepSeek-V4-Flash-0731-GGUF/snapshots/fbbb5b93fb787c21338159b0af3318bb3f4d9768/UD-Q4_K_XL/DeepSeek-V4-Flash-0731-UD-Q4_K_XL-00001-of-00005.gguf \ -md /home/dspark-DeepSeek-V4-Flash-0731-Q8_0.gguf \ --spec-type draft-dspark \ -ngld 0 \ -td 20 \ --spec-draft-n-max 5 \ -c 167936 --parallel 1 \ --split-mode layer \ -t 16 -tb 20 \ --cache-type-k q8_0 --cache-type-v q8_0 \ -b 4096 -ub 4096 --flash-attn on \ --moe-cache auto \ --jinja --temp 1.0 --top-p 0.95 \ --reasoning on -lv 4 \ --reasoning-format deepseek \ --slot-save-path /home/data/ \ --alias DeepSkee-v4-Flash-0731-UD-Q4_K_XL \ -lv 4 '。用于提示处理模型分支的示例命令:sudo 'ulimit -l unlimited && \ GGML_CUDA_MOE_CACHE_RESERVE_MB=512 \ GGML_CUDA_MOE_CACHE_ADMIT_AFTER=1 GGML_CUDA_MOE_CACHE_INSERTS=256 \ GGML_CUDA_MOE_CACHE_QUEUE_MB=2048 \ GGML_CUDA_MOE_CACHE_MODE=on \ GGML_CUDA_MOE_CACHE_BUDGET_MB=40000 \ GGML_CUDA_MOE_CACHE_BUDGET_MB_DEVICES=0:11800 \ GGML_CUDA_MOE_CACHE_STATS=1024 \ GGML_CUDA_MOE_CACHE_MLOCK=1 \ GGML_CUDA_MOE_CACHE_ELITE_PCT=60 \ GGML_CUDA_MOE_CACHE_DEMAND_DECAY=4096 \ LLAMA_EXPERT_SWAP_NO_PRELOAD=0 \ LLAMA_EXPERT_SWAP_PREFETCH=1 \ LLAMA_EXPERT_SWAP_MLOCK=1 \ /home/ous/infra/llama.cpp/build/bin/llama-server \ --host 0.0.0.0 --port 8080 \ -m /home/.cache/huggingface/hub/models--unsloth--DeepSeek-V4-Flash-0731-GGUF/snapshots/fbbb5b93fb787c21338159b0af3318bb3f4d9768/UD-Q4_K_XL/DeepSeek-V4-Flash-0731-UD-Q4_K_XL-00001-of-00005.gguf \ --prompt-processing-model /home/.cache/huggingface/hub/models--AtomicChat--DeepSeek-V4-Flash-0731-GGUF/snapshots/5f8e5b74544ad821d71aedf658c2b8acdecd4b2b/AD-IQ2_M/DeepSeek-V4-Flash-0731-AD-IQ2_M-00001-of-00004.gguf \ --prompt-processing-min-tokens 8192 \ -md /home/dspark-DeepSeek-V4-Flash-0731-Q8_0.gguf \ --spec-type draft-dspark \ -ngld 0 \ -td 20 \ --spec-draft-n-max 5 \ -c 167936 --parallel 1 \ --split-mode layer \ -t 16 -tb 20 \ --cache-type-k q8_0 --cache-type-v q8_0 \ -b 4096 -ub 4096 --flash-attn on \ --moe-cache auto \ --jinja --temp 1.0 --top-p 0.95 \ --reasoning on -lv 4 \ --reasoning-format deepseek \ --slot-save-path /home/data/ \ --alias DeepSkee-v4-Flash-0731-UD-Q4_K_XL \ -lv 4 \ --prompt-processing-gpu-moe 0 '。
查看原文

相似文章

DeepSeek-v4-Flash-Mini 54GB GGUF 运行速度约 20.5 t/s

Reddit r/LocalLLaMA

一个社区构建将 DeepSeek-V4-Flash 压缩为 54GB 的 IQ2_XXS GGUF 变体,采用激进的 2 位量化,在本地硬件上实现了约 20.5 tokens/s 的速度,同时大幅降低了显存/内存占用。