跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • 浅色
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • 深色
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(LCZ-Blue)
  • 不使用皮肤
  • LCZ-Green
  • LCZ-Blue
  • LCZ-Black
折叠
品牌标识

抡锤者

首页 版块 标签
硬件
装备秀
AI 广场 App
  1. 主页
  2. 版块
  3. LLM讨论区
  4. 把 Strata 搬上 SGLang 引擎 的嘗試

把 Strata 搬上 SGLang 引擎 的嘗試

已定时 已固定 已锁定 已移动 精华 热议 LLM讨论区
7900xtxstrata多卡部署
17 帖子 10 发布者 987 浏览 2 关注中
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • Benjy LeiB Benjy Lei

    @fcme 一开始就是看到你的贴子才决定试一试的。真的,能跑起来,但优化很高难度。

    fcmeF
    fcmeF
    fcme
    王侯将相
    编写于 最后由 编辑
    #5

    @Benjy-Lei
    哦,原来如此。
    你可以再试试,但是要先研究清楚那个关键卡点在哪里,然后详细的做个规划,然后一步一步来实施。嗯,这个需要用比较强的模型,后面需要模型可以写c++。
    哎,我暂时没时间搞了,等有时间了再搞吧

    个人的repo,欢迎指教
    https://github.com/halonc/R9700-Strata-Qwen3.8-Flash-Next-Tuning
    https://github.com/halonc/AMD-R9700-rdna4-SGlang-Maxx

    1 条回复 最后回复
    0
    • Benjy LeiB
      Benjy LeiB
      Benjy Lei
      体面乡绅
      编写于 最后由 编辑
      #6

      續:把 Strata 搬上 SGLang 引擎(二)—— 四個「無 error 但錯」的慣例坑

      前一篇:把 Strata 搬上 SGLang 引擎:32 個 patch、9 個窗口、一次 serve、一個 −exp 的坑
      這一篇是後續:serve 之後仍然講不出人話,於是逐個慣例去對。已修四個真 bug、排除五個假設,
      現在知道錯在哪一類,但還未修好。數字全部是實測。
      硬體:雙 7900XTX(gfx1100 / ROCm)、94 GB RAM;模型:Qwen3.8-Flash-Next ISTA GSQ-RCO IQ3_S(MoE,專家走 NVMe)
      建議 tags:7900xtx strata 多卡部署 qwen-flash

      TL;DR

      • serve 得,但輸出是退化文字。四個真 bug 已修好並落機,每一個都是「無 error、形狀合法、但算錯」。
      • 最有價值的一項:GDN 的輸出 gate,引擎用 sigmoid(z),fork 預設 swish(z·σ(z)),36/48 層、每 token、per-head 乘性錯。修完之後輸出質變(由隨機詞湯變成另一種壞法),證明它是主因之一。
      • 五個假設被證據排除,其中一個是我自己判斷錯:partial rotary 根本沒壞。
      • 性能:1.4–1.75 tok/s(同 harness 生產 26–34;生產自己長文 95–107)。差距是結構性的(無 RAM tier / 無 MTP / 單卡),不是調參。
      • 現時症狀已定性為「狀態一累積就崩」,下一步用逐 op parity 去釘,不再開窗猜。

      這一輪的四個坑(都可复用成 checklist)

      1. ssm_a 已經是 −exp(A_log)

      llama.cpp 匯出 GGUF 時,A_log 已被轉成 ssm_a = −exp(A_log);fork 把它原值塞進 linear_attn.A_log,
      而 gating kernel 會再做一次 −exp()。結果 decay 乘數 ≈ −exp(−exp(A_log)) ≈ −1,
      per-token decay 由 3.3e-06 變成 1.00(36 層 GDN 的 state 幾乎凍結)。

      • 修法:落地縫 A_log := log(−ssm_a),先 assert 全部 < 0(fail-closed)
      • 實測:transformed 36/36;gate 數值對引擎 rel 1.68e-08;decay 0.526086 兩邊相同
      • 事後發現 fork 自己對另一個模型家族早有正確 helper(kimi_k3_gguf._kda_a_log_target_value)——
        先 grep 一下有沒有同族模型已經讀過同一個慣例,比自己去推快得多

      2. norm 是 plain gain,fork 卻做 1+w

      artifact 的 norm 值域中心 ≈ 1(hc_attn_norm mean 0.9365、ssm_norm 0.9668、attn_q_norm 1.4437),
      即訓練時直接乘 w;fork 的 GemmaRMSNorm forward 是 x * (1.0 + w)。

      這不是一個 scale,是 per-channel 扭曲:同一隻 tensor 內 (1+w)/w 由 1.00 到 20.7,
      負 gain 的 channel 連符號都反。

      • 修法:只對 148 隻「consumer 做 1+w」的 norm 落 w−1;36 隻 linear_attn.norm(FLA gated RMSNorm,plain x*rstd*w)原樣不動,並用測試證明 byte-identical
      • 要注意的陷阱位:input_layernorm/post_attention_layernorm 在這個模型被 delattr 掉了、
        final norm 叫 output_hc_norm、hyper-connection 的 hc_*_norm 也是 1+w(不要以為「hyper-connection 就是 plain」)
      • 實測:transformed 148/148 … 36 plain untouched

      3. GDN 輸出 gate:sigmoid 不是 SiLU

      • 引擎:y = rms_norm(o) * ssm_norm * sigmoid(z)(gdn.cu 註解直接寫「SIGMOID, not SiLU」,layer.cpp 再寫一次)
      • fork:RMSNormGated 因 config 沒有 output_gate_type 而取 default swish ⇒ z·σ(z)
      • 修法:bridge config 一行 text_config.output_gate_type = "sigmoid"
      • 效果:唯一令輸出「變質」的修正——由「隨機詞湯」變成「重複標點退化」

      教訓:vender kernel 裡出現「X, not Y」這種註解,就當它是 spec。

      4. PLE 完全 inert(層號 + 大表)

      • artifact 的 PLE 在 blk.1,引擎判斷 layer == 1;fork 卻掛在 layers.0
      • per_layer_token_embd(320M 行 IQ4_NL)不在任何 model param,gsq_ple 的 row-read 從未被呼叫
      • 怎麼知道它 ≡ 0:把 ple_layer_ids 設成 [] 完全關掉,輸出逐字不變
      • 修法:層號由 name map 推導;大表走 fail-closed 的 row-read
      • 實測:3 條真 prompt、608 次 row 請求、600 unique rows / 54 kB(表的 1.87e-6),
        與獨立 pread + 獨立 IQ4_NL 解碼器對 240 rows(散佈整個 320M 範圍)38,400 值逐位相同;
        PLE 關掉時 64 步軌跡 sha 逐位一致(不變性控制)

      被排除的五個(附證據,省你時間)

      假設 結論 證據
      mixed-quant dequant 壞 清白 27 隻真 tensor、16,200 blocks、1,900,800 值 bit-exact(18/20/21/22/23);12/13/14 只差 fp16 ulp;42 全等
      iq3xs_grid 4× 折是 bug 被平反 它與 kernel 的 (0.5+nib)*0.5 是耦合重構(4×0.5×0.5 ≡ 1);單邊改會變 4× 幅度錯。表與公式永遠要一起看
      pack 的 gate/up 標籤互換 清白 12 + 48 抽樣,加 L17 全 512 專家 gate+up = 720,896,000 B 逐 byte 全等;負控制有能力 FAIL
      tokenizer 不同 清白 引擎 vocab.json vs bridge tokenizer.json:248,320 tokens、0 個 id 不符
      partial rotary(我以為 fork 轉足 256 維) phantom pre-fix 參數是 (head_dim=256, factor=0.25),int(256×0.25) 本來就是 64。我當初只讀 rotary_dim=self.head_dim 就下結論,漏了下游 factor

      性能(誠實版)

      量 Path B 生產 Strata
      64 token 短請求 0.9 / 1.0 / 1.2 tok/s 26.1 / 29.7 / 34.1
      BENCH-256 1.75 tok/s —
      生產長文基線(usage 計數) — decode 95.5–106.6 tok/s、prefill 3,336–3,601

      差距的結構原因:沒有 RAM tier(expert 每次由 NVMe 讀,staging_pinned=4,VRAM 只有 436 個 unit 的 cache)、
      沒有 MTP(生產 --spec 3,accept 0.81)、單卡(生產雙卡 layer split)。這不是調參能救。

      現在的症狀與判斷

      sigmoid 未修 → '用户,,,的,...,,。。。。/。///'
      PLE 接上後   → '用户请求,用户请求,请求,query'
      chat 格式重測 → '用户请求,,,。。。的前力/白白/白/////白/白//白////'
      

      形態固定:先幾個似樣 token,然後崩塌成標點/單字符循環。而且 raw completion 與 chat template 一樣退化
      (所以不是 prompt 格式問題)。

      判讀:這不再是「慣例錯配」(慣例錯會由第一個 token 就亂),而是狀態一累積就崩:
      GDN 的 recurrent / conv state,或某個 op 級數值偏差。下一步是逐 op parity——
      fork 側環境變數 gate 的 dump(x / conv_out / q,k,v,z / b,a / beta / dt / decay / state / y)
      對 numpy 參考(用真權重 + 逆向 transcript 的引擎公式),報第一個超容差的 op。

      方法論(這次真的救了幾次)

      1. 每個 landing 都要 fail-closed + 計數:transformed N/M,N≠M 就 raise,數值像另一種慣例就 raise,重複轉換就 raise。artifact 與 fork 的慣例差異是常態,不是例外;默認行為是「靜默錯」。
      2. worker 自報不算數:我自己重跑才計。這一輪抓到兩次假 FAIL(兩個 runner 並行撞同一 scratch)和一次自己的證據錯(gguf_offset 已含 data_start,又加了一次,dd 出來的「真 bytes」只有 18,588/245,760 個位置對)。
      3. 讀 x = <expr> 要讀到最後一個 operator:rotary_dim=self.head_dim 之後還有 int(head_dim*factor)。整個 4034 合約建在半行之上,最後證實是 no-op。
      4. byte-identical 證明的是 pack,不是數學:pack 與 GGUF 逐 byte 相同,但 dequant 還得逐 type 驗。
      5. 窗口紀律:preflight 失敗 exit 6 且在 systemctl stop 之前;trap 要 kill sglang:: 子進程並等 GPU VRAM ❤ GB 才重啟(引擎會用「空閒 VRAM」自動定 expert cache 大小,殘留子進程會靜默把 10,352 slots 變 6,938)。

      一句話

      「跑得起」與「跑得對」之間,隔著四個 artifact 慣例;「跑得對」與「跑得快」之間,隔著一整個 RAM tier。
      下一篇應該就是逐 op parity 的結果。

      1 条回复 最后回复
      3
      • terryT
        terryT
        terry
        易有太极
        编写于 最后由 编辑
        #7

        继续,有进展了我置顶。

        油管:https://www.youtube.com/@抡锤者

        1 条回复 最后回复
        0
        • E
          E
          Enigma
          体面乡绅 硕果累累
          编写于 最后由 编辑
          #8

          顶你!!借助AI的翅膀,尽情遨游在以前不敢想象的任务......

          1 条回复 最后回复
          0
          • Benjy LeiB
            Benjy LeiB
            Benjy Lei
            体面乡绅
            编写于 最后由 编辑
            #9

            續:把 Strata 搬上 SGLang 引擎(三)—— 第五個坑修好終於講人話;然後發現牆不是 kernel,是把 kernel 直接搬過來

            上一篇結束時的狀態:serve 得、四個慣例坑已修、但輸出仍然退化,承諾「下一篇是逐 op parity 的結果」。這篇就是,加上之後性能線的完整轉折:三個優化被同窗 A/B 判死、profiler 拆出真牆、最後把生產引擎現成的 kernel 直接橋進 torch,一次過把 decode 和 prefill 兩條 kernel 線實測過判準。數字全部實測。

            硬體:雙 7900XTX(gfx1100 / ROCm)、94 GB RAM;模型:Qwen3.8-Flash-Next ISTA GSQ-RCO IQ3_S(MoE,512 experts × 48 層,top-10 路由)
            建議 tags:7900xtx strata sglang 多卡部署 qwen-flash

            TL;DR

            1. 逐 op parity 釘到第五個真 bug:GDN 的 value-head → key-head 配對,引擎用 modulo、fork 用 interleave,44/48 個 head 讀錯 key。修完(config 一行)輸出逐字正確:法國首都→巴黎、17×23→391、通順廣東話,與Strata一致。
            2. 語義收線之後全力追速度,三個結果:expert-scoped 佈局(只算路由到該 expert 的 rows)把 prefill 18.3 → 125.5 tok/s(6.87×);但之後兩個「減少呼叫次數」的改寫——micro-batch(op 數削 35 倍)和 bf16 slab(呼叫數削 64 倍)——同窗 A/B 實測一個只快 0–6%、一個反而慢 9–28%,全部判死。
            3. 進程內 profiler 拆牆:每個 expert 單元 2.127 ms 裡,CPU 讀取+dequant 佔 84.5%,H2D 只 4.6%,GEMM 10.9%。每 token 要搬 480 份 ×9 MB 權重 ≈ 3.8 GB/s——牆是搬 bytes,不是算力、不是 op 數、也不是 PCIe。
            4. 於是換路:不自己寫 kernel,把生產引擎現成的 grouped expert kernel(一次 call 做齊 gather→dequant→gate/up→SwiGLU→down→scatter)用薄 torch 橋接直接用。真 artifact bytes 上實渗 decode 4.96 µs/expert——判準預算是 30 µs,6 倍餘裕。
            5. 橋接本身 15/15 gates:三種量化格式 × 兩個 kernel 佈局 × 引擎的優化臂,輸出 bitwise 相同;prefill 那邊的 MMQ kernel 也實測四個 context 判準點全過。
            6. 誠實講:還沒接線進 SGLang 主路徑。下一個裁決點是 expert 常駐 VRAM 的命中率——全模型 expert 46.8 GiB,對 2×24 GB 顯卡,這才是計劃成立與否的真正未知。

            一、第五個坑:GDN head 配對(講人話的最後一里)

            上一篇的方法:fork 側用環境變數 gate 逐 op dump,對 numpy 參考(真權重+從引擎源碼逆向的公式),報第一個超容差的 op。

            結果:conv 3.7e-3、split 0.0、beta 7.7e-4、dt 2.2e-8、decay 1.9e-8、epilogue 1.7e-3——全部在 bf16 噪聲內。唯一爆表的是 delta rule 的 head 配對:rel 1.246。

            機制:48 個 value head 共享 16 個 key head。引擎 kernel 用 modulo 配對(h % h_k),fork 的 FLA kernels 用 interleave(i_h // (H/Hg))。兩種都是合法慣例,但同一個模型只能用一種——錯了之後 44/48 個 head 在錯的 key 上累積 delta state。形狀全對、無 NaN、文字流暢,「講得出話、講錯事」,而且狀態越長崩得越厲害。

            修法:bridge config 一行 gdn_head_pairing = "modulo"(默認 interleave 不變,其他模型零影響;prefill/decode 兩條 kernel 路都要覆蓋)。

            修完的語義驗收錨是「短 prompt 答案與生產逐字相同」,不是 gate 數、不是 tok/s:巴黎、391、通順粵語,三條全中。五個坑修完(A_log 變換、plain gain norm、sigmoid gate、PLE 層號+大表、head 配對),「跑得對」這一關正式收線。

            二、速度線:兩個「減少呼叫」的優化判死,profiler 拆出真牆

            expert-scoped 佈局修掉的是真正的浪費:舊路對每個受路由 expert 都跑完整批 token 的 FFN 再用 mask 丟結果,每 chunk 實做 990 TFLOP、必要 19.3 TFLOP(51.2× 冗餘);修完 prefill 18.3 → 125.5 tok/s。

            之後的瓶頸量測指向「每 expert 一次 Python 呼叫 ×0.73 ms」,於是做了兩個直覺上正確的改寫:

            • micro-batch:把每層 N 個 expert × 11 個 torch op 壓成常數個 batched GEMM。op 數 19,478 → 550(35×)、fp32 權重展開 1,536 次 → 0。同窗兩腿 A/B:只快 0–6%,T=7 反而慢 9%。
            • bf16 slab:把整個 block 的 experts 疊成一個大矩陣,叫上游 triton fused-experts kernel 一次算完。同窗 A/B:慢 9–28%。

            第二個的死因有外部佐證:log 裡每個 block 都印 "Using default MoE kernel config"。實查 SGLang 樹:configs/ 有 386 個 device json,MI300 有 8 個,RX7900XTX 是 0 個;而且 configs 目錄只有 triton 3.5/3.6/3.7 的版本目錄,我們跑的是 3.8——就算有人補了 config 也讀不到。

            但真正值錢的是反推:micro-batch 把 op 削了 35 倍而時間不動,說明 0.73 ms/expert 不是 Python dispatch 的錢,是搬權重的錢——24,576 次 expert 呼叫 × 9 MB ≈ 221 GB / 57.9 s ≈ 3.8 GB/s,PCIe 級。再用進程內 profiler(環境變數 gate,每 expert 單元累計 read+dequant / H2D / GEMM,引擎退出時印一行)把 decode 拆開:每單元 2.127 ms,讀取+dequant 84.5%、H2D 4.6%、GEMM 10.9%。H2D 只 0.098 ms——「PCIe 是瓶頸」這個講法也被否證,牆一直在 CPU 側的解壓。

            結論收束成一句:expert 權重要以量化 bytes 常駐 VRAM、dequant 融進 kernel 裡,同一塊 VRAM 容納 4.7× 單元數——這正是生產引擎的設計。那為什麼不直接用它的 kernel?

            三、判準定調,然後把生產 kernel 橋進 torch

            判準先定(不然 gate 都是拍腦殼):單流,Path B 要達到生產基準的 2/3(差距 ≤ 1/3)。生產基準(temp 0、nonce、usage 計數、3 reps 取中位):

            context decode 基準 prefill 基準 Path B 判準
            64K 96.5 tok/s 6,130 tok/s decode ≥ 64.3 / prefill ≥ 4,087
            256K 105.7 4,343 ≥ 70.5 / ≥ 2,895

            decode 判準換算:每 token 15.55 ms,480 個 expert 單元 ⇒ 30 µs/單位。現況是 2,127 µs——差 66 倍,自己的 torch 路永遠追不到,必須 grouped fused kernel。

            做法:寫一個 torch extension(一個 .cpp),直接 link 生產引擎已編好的 kernel 靜態庫,暴露五個 op。不寫任何量化 kernel。

            decode 實測(引擎自帶 bench、真 GGUF rows、兩個 kernel 佈局互相 bitwise 對拍、interleave 取三輪最小;T=1 token、G=10 experts=一層一次 grouped call;六種 gate/up×down 格式組合全覆蓋):

            gate/up / down 格式 每層 call gate/up 頻寬
            IQ3_XXS / IQ4_NL 47.0 µs 520 GB/s
            IQ2_S / Q2_0 50.6 µs 377 GB/s
            IQ3_S / IQ4_NL 50.4 µs 521 GB/s
            (其餘三組合) 47.8–49.9 µs —

            49.6 µs ÷ 10 = 4.96 µs/單位;×48 層 = 2.38 ms/token = decode 預算的 15–17%。launch 攤薄的算術也實測了:單 expert 一次 call 16.9 µs(launch 主導,kernel 內約 4 個 launch),grouped 10 個的邊際成本 3.64 µs/個;40 個 expert 一次過 3.86 µs/個 @ 564–672 GB/s。「每層一次 call」不是風格,是算術必須。

            torch 橋接 15/15 gates:blob 幾何三源一致(kernel 庫算的 ≡ 引擎 pack 表 ≡ 2,176,000/1,510,400/2,329,600 B 逐層吻合);mode A/B × EXPDEC 優化臂三臂輸出 hash 完全相同(bitwise);每層 call 57–60 µs(多出的 ~10 µs 是 Python dispatch,graph capture 可收回)。一個實務細節給想 replicate 的人:torch 的 ROCm wheel 環境沒有 cuda_runtime_api.h,ATen 的 CUDAContext.h 編不過——解法是照 sgl_kernel AOT 的慣例,stream 由 Python 端以 int64 傳進來,shim 不 include 任何 CUDA header。

            prefill 那邊(MMQ 級 batched 量化 GEMM,一批 token 共享一次權重讀取):4,096-token chunk 的形狀(每 expert 平均 80 rows)實測每 16-expert launch 0.546 ms,一個 chunk 的 MoE 共 839 ms。對判準:

            context 判準 實測(MoE+attention 估算) 判
            64K 4,087 tok/s 4,548 過
            128K 3,659 4,255 過
            192K 3,264 4,001 過
            256K 2,895 3,766 過

            (attention 項用先前實測的線性律斜率估算 62–249 ms/chunk;MMQ 臂只量了 IQ3_S+IQ4_NL 兩種格式+合成權重,是可行性證據不是端到端承諾。效率隨 chunk 增大:600-token chunk 只有 ~1,600 tok/s,32K chunk ~11,300——launch 攤薄差。)

            數據通路也閉了:引擎的 expert blob 與我們 pack 的 objects(gate‖up‖down 拼接)逐 byte 相同(實測對拍 True),GGUF plane 內每 expert stride 704,000 B 無 padding——零轉換直接餵。

            四、還沒證的(比已證的重要)

            1. 所有 kernel 數字都假設 expert 已在 VRAM。全模型 46.8 GiB,雙卡 48 GB 理論剛好,但 KV、mamba state、dense 權重都要位。生產引擎靠 KV 放 host RAM+int8 KV 才塞得下;Path B 的命中率 ≥80% 未實證——這是下一個裁決點。
            2. 雙卡 expert 並行的 all-to-all 在 gfx1100 沒跑過;hybrid(mamba/GDN)模型的 host KV 在 SGLang 沒證。這兩個任何一個不成立,工期翻倍。
            3. 沒有 MTP(生產 --spec 3、accept 0.81);對「取代」對照時要補,投機的倍數不能記在 kernel 頭上。
            4. 還沒接線:decode/prefill 都還是獨立 bench 的數字,SGLang 主路徑的接線正在做。

            兩個要收回的舊結論:一、「TP=2 有 block 對齊死牆」——建立在抄錯的量化表上(把 IQ4_NL 的 (32,18) 當成 256 值 block),live manifest 逐 object 驗算後 down 層全部整除,而 expert 維切分(EP=2)本來就零 pack 改動、負載平衡 1.000000。二、「單流做完也就 25–40 tok/s」——那個階梯假設要自寫 kernel;現成 kernel 的實測數字已經超過它的終點值。

            性能(誠實版,同 harness 對拍)

            量 Path B(語義正確版) 生產 Strata
            decode(長文 sweep 64K–256K) 1.67–1.70 tok/s 96.5–105.7
            prefill 短請求(~5.9K token) 94.8 tok/s —
            prefill(長文 sweep 64K–256K) (外推 ~30,未實測 64K 點) 4,343–6,130

            方法論(這輪救了幾次)

            • 同窗兩腿是唯一可信比較:同一 config 隔幾小時的對照腿只剩歷史值的 ~75%(94.9 vs 125.5 tok/s)。跨窗口的歷史數字不是 baseline,任何「快了/慢了」都當場同窗重跑控制腿。
            • 報 N 倍必附可重算算式;推導值與 instrumented 實測值分開標。micro-batch 那次就是算式推翻了直覺:counter 綠(op 數大跌)而 wall 不動 ⇒ 成本模型錯,不是量測不準。
            • bitwise 對拍 + 負控制:兩個佈局互相 bitwise 才信 wiring;驗證鏈要故意弄壞一個 byte 證明會紅。一個從未紅過的綠鏈沒有證據力。
            • 效果 gate 的量綱先對齊:拿一個 5.9K-token 請求去除以「每 4,096-chunk」的律,會憑空多出 3 倍假差距——先對齊 chunk 數再比。
            • GPU 實測全程停產引擎窗口(stop→test→restore trap),單窗中斷 <10 秒,收窗驗 health 200。

            一句話

            「跑得對」與「跑得快」之間隔著 480 份 9 MB;這一輪證明了不用自己填——把生產引擎的橋直接架過來就行,剩下的難題是停車位(VRAM residency),不是引擎。

            下一篇應該是接線後 SGLang 自己跑出來的第一組數字。

            1 条回复 最后回复
            2
            • starryskyknightS
              starryskyknightS
              starryskyknight
              硕果累累 贵族大夫
              编写于 最后由 编辑
              #10

              這太猛了 必須頂

              1 条回复 最后回复
              0
              • 懒人烘培懒
                懒人烘培懒
                懒人烘培
                王侯将相
                编写于 最后由 编辑
                #11

                这数据确实很猛~

                双 7900 XTX:模型本地跑,Token 随便烧!

                1 条回复 最后回复
                0
                • Benjy LeiB
                  Benjy LeiB
                  Benjy Lei
                  体面乡绅
                  编写于 最后由 编辑
                  #12

                  【7900xtx·qwen-flash】Flash-Next 混合 GDN 移植日記(二):併發開考 7.7× + MTP 頭移植八堵牆拆七

                  環境聲明(對齊單位先):雙 XTX 7900(gfx1100,PCIe 無 P2P)· SGLang fork(gfx1100 系)·
                  Qwen3.8-Flash-Next GSQ IQ3_S(48 層=36 GDN+12 attention,512 專家/層,專家由 host 流式進
                  VRAM arena)· 兩卡 layer-split(各 24 層專家全套)· 無 CUDA graph、無 MTP。以下數字全部
                  端到端 wall 口徑、usage.completion_tokens 實算,counting 任務(250 token/流、temp 0)、
                  同窗同 harness,冷/暖態標明。


                  一、decode 速度:併發全梯(本篇主菜)

                  先講一個前提故事。開 --max-running-requests 8 打 4 條併發 request,聚合睇落有「1.9×」
                  加速——但翻 rank log:45 條 Decode batch 紀錄,#running-req 全部=1。由頭到尾冇 batch 過,
                  「加速」純粹係首 phase 冷啟(Triton/arena 暖機)拖低咗分母。教訓:判斷併發之前必睇
                  running-req 直方圖
                  ,聚合吞吐會講大話。

                  根因:mamba admission 鉗制(hybrid GDN 模型專有)

                  追 kv_cache_configurator.py 嘅 admission 計算:

                  max_running_requests = min( 你叫嘅 8 , max_mamba_cache_size ÷ 每請求 slot 數 )
                                       = min( 8 , 7 ÷ 5 ) = 1      ← 靜靜鉗死
                  
                  • radix+overlap 開 → 每請求帳面 5 個 mamba state slot;專家 arena 食緊 VRAM,pool 淨得 7 slot
                  • 7÷5=1 → scheduler 永遠零新請求准入。server 唔報錯,得 startup 一行提示
                  • 解法一個 flag:--disable-radix-cache(slot 5→1,pool 直接對齊 8)。獨立 prompt 場景零損失

                  全梯實測(250 token/流,八流完全公平)

                  併發 聚合 tok/s 每流 tok/s 加速比
                  1(冷啟) 2.55 2.55 1×
                  1(暖態) ~4.0 ~4.0 —
                  2 6.97 3.48 2.7×
                  4 12.01 3.00 4.7×
                  8 19.51(重跑 18.11) 2.44 7.7×
                  • running-req 直方圖齊晒 1→2→4→8,引擎瞬時 20.2 tok/s 仲未見頂
                  • 每流 3.48→3.00→2.44 緩降=專家搬運攤薄紅利漸被 batch 計算量抵消,但 c=4→8 聚合仲有 +63%
                  • 呢個架構(專家 host 流式入 VRAM)嘅 throughput 鑰匙係併發:N 條流嘅路由專家喺同一次
                    arena pass 撞埋一齊,fetch 次數唔線性涨。單流 kernel 微調救唔到 decode(我哋實測過,零效果)
                  • 對照組(單位講明):同 harness 全 resident 引擎單流 95-107 tok/s——我哋單流輸緊一截,
                    併發斜率先係呢條路嘅存在理由

                  二、MTP 頭移植:八堵牆拆咗七(改咗幾多代碼)

                  Flash-Next 原生帶 MTP 頭(單層尾部 drafter:1 個 full-attn+MoE block+input fusion,
                  共享主模型 lm_head;權重源係 HF BF16 checkpoint,GGUF 本身冇)。目標=接上 SGLang 嘅
                  NEXTN 投機解碼,乘上 accept rate。由「draft 連 load 都入唔到」去到「draft→target verify
                  行勻兩卡專家 arena」,八堵牆:

                  # 牆 根因 修復
                  1 draft 撞主模型嘅 GGUF loader draft 繼承全局 --load-format --speculative-draft-load-format auto
                  2 loader 拒 13 個 GSQ config key 全局 --model-loader-extra-config 流入 draft 樹 patch:draft 載入時掉目標 extra-config(loud log)
                  3 layer-split 要求 ≥2 層 全局 GSQ_LAYER_SPLIT env 流入 draft(佢得 1 層) 樹 patch:draft runner 豁免
                  4 KV pool 起唔到 BF16 draft 7GB+投機 mamba intermediate 擠爆 24GB 卡 --max-running-requests 4(intermediate 2.15GB 實測)+ mem-fraction 調整
                  5 lm_head.weight 唔存在 GSQ 量化 head 只有 qweight;共享機制假設 BF16 tensor 樹 patch:量化 head 回傳 None,draft 直接共享成個 module(零 VRAM)
                  6 mamba state commit assert 兩卡 layer-split 手術將 mamba_cache 換成跨卡路由視圖,isinstance 唔識 樹 patch:放行路由視圖(逐層存取本來就回傳真 tensor,verify 前向已實證)
                  7-8 觀測盲區 error 訊息用扣減前嘅數,raise 條件對 fraction 唔敏感 觀測器 patch:admission 全代數印實數(available/slack/intermediate)

                  打字打到呢度先講清楚:全部 patch additive——唔開 spec flags=逐 byte 原行為,
                  .bak 留底,py_compile 過先上樹。現狀:首個完整 spec-on boot 差最後一個 commit 接縫
                  (修復已落樹,驗證窗跑緊)。spec-on 數據(accept rate、單流/c=8×MTP)下一帖交。

                  量化臂同時開咗題:draft 專家 Q2_0 化(675MB,同引擎生產配方 bitstream 一致),
                  draft 常駐 5GB→0.83GB——因為牆#4 證明 BF16 draft 同專家 arena 喺 24GB 卡本質唔共存。
                  builder 已寫好跑通(重打包 vs 官方 gguf 位元級一致)。

                  三、附:早前同批嘅 TP2 silent 語義地雷(未發過,一併記低)

                  兩進程 TP2 起機後語義全錯但輸出流利、零 NaN、兩卡 bit-identical。逐層 capture 鎖定
                  第一個 GDN 層輸出已偏,最終根因:

                  呢隻 artifact 用 modulo head-pairing(v-head h 讀 k-head h%16)。fla Triton kernel 嘅
                  i_h % Hg 喺 TP 下攞本卡 local Hg=8——連續半切之下 16/48 個 v-head 讀咗隔離卡嘅
                  k-head。值貌似合理、兩 rank 對稱壞,shape check 全部捉唔到。interleave pairing 唔中招。

                  呢個已經落咗 fail-closed guard(modulo×TP>1 直接 raise 拒絕起機,唔會靜靜服務壞數)。

                  標籤建議:7900xtx qwen-flash 多卡部署

                  张光璞张 1 条回复 最后回复
                  2
                  • XiaoteX
                    XiaoteX
                    Xiaote
                    易有太极
                    编写于 最后由 编辑
                    #13

                    ⭐ 版主审定:本帖设为精华,作者 +6 积分奖励,希望再接再厉!

                    奖励凭证:精华 +6 分 · 编号 f2793-3382-1

                    老特的AI助手,DeepSeek Flash驱动,没回你是因为被限速了~除了管理员不能私信我,别浪费时间~尝试多了被封号就不好了~

                    1 条回复 最后回复
                    0
                    • ,terryT terry 固定了此主题
                    • xiongjie gaoX
                      xiongjie gaoX
                      xiongjie gao
                      王侯将相
                      编写于 最后由 xiongjie gao 编辑
                      #14

                      这项目搞通了论坛里高低要混把大神交椅
                      👏加油

                      https://github.com/shawn86574-prog/x99-7900xtx-p2p
                      https://github.com/shawn86574-prog/kuzuryusen

                      1 条回复 最后回复
                      0
                      • Benjy LeiB Benjy Lei

                        【7900xtx·qwen-flash】Flash-Next 混合 GDN 移植日記(二):併發開考 7.7× + MTP 頭移植八堵牆拆七

                        環境聲明(對齊單位先):雙 XTX 7900(gfx1100,PCIe 無 P2P)· SGLang fork(gfx1100 系)·
                        Qwen3.8-Flash-Next GSQ IQ3_S(48 層=36 GDN+12 attention,512 專家/層,專家由 host 流式進
                        VRAM arena)· 兩卡 layer-split(各 24 層專家全套)· 無 CUDA graph、無 MTP。以下數字全部
                        端到端 wall 口徑、usage.completion_tokens 實算,counting 任務(250 token/流、temp 0)、
                        同窗同 harness,冷/暖態標明。


                        一、decode 速度:併發全梯(本篇主菜)

                        先講一個前提故事。開 --max-running-requests 8 打 4 條併發 request,聚合睇落有「1.9×」
                        加速——但翻 rank log:45 條 Decode batch 紀錄,#running-req 全部=1。由頭到尾冇 batch 過,
                        「加速」純粹係首 phase 冷啟(Triton/arena 暖機)拖低咗分母。教訓:判斷併發之前必睇
                        running-req 直方圖
                        ,聚合吞吐會講大話。

                        根因:mamba admission 鉗制(hybrid GDN 模型專有)

                        追 kv_cache_configurator.py 嘅 admission 計算:

                        max_running_requests = min( 你叫嘅 8 , max_mamba_cache_size ÷ 每請求 slot 數 )
                                             = min( 8 , 7 ÷ 5 ) = 1      ← 靜靜鉗死
                        
                        • radix+overlap 開 → 每請求帳面 5 個 mamba state slot;專家 arena 食緊 VRAM,pool 淨得 7 slot
                        • 7÷5=1 → scheduler 永遠零新請求准入。server 唔報錯,得 startup 一行提示
                        • 解法一個 flag:--disable-radix-cache(slot 5→1,pool 直接對齊 8)。獨立 prompt 場景零損失

                        全梯實測(250 token/流,八流完全公平)

                        併發 聚合 tok/s 每流 tok/s 加速比
                        1(冷啟) 2.55 2.55 1×
                        1(暖態) ~4.0 ~4.0 —
                        2 6.97 3.48 2.7×
                        4 12.01 3.00 4.7×
                        8 19.51(重跑 18.11) 2.44 7.7×
                        • running-req 直方圖齊晒 1→2→4→8,引擎瞬時 20.2 tok/s 仲未見頂
                        • 每流 3.48→3.00→2.44 緩降=專家搬運攤薄紅利漸被 batch 計算量抵消,但 c=4→8 聚合仲有 +63%
                        • 呢個架構(專家 host 流式入 VRAM)嘅 throughput 鑰匙係併發:N 條流嘅路由專家喺同一次
                          arena pass 撞埋一齊,fetch 次數唔線性涨。單流 kernel 微調救唔到 decode(我哋實測過,零效果)
                        • 對照組(單位講明):同 harness 全 resident 引擎單流 95-107 tok/s——我哋單流輸緊一截,
                          併發斜率先係呢條路嘅存在理由

                        二、MTP 頭移植:八堵牆拆咗七(改咗幾多代碼)

                        Flash-Next 原生帶 MTP 頭(單層尾部 drafter:1 個 full-attn+MoE block+input fusion,
                        共享主模型 lm_head;權重源係 HF BF16 checkpoint,GGUF 本身冇)。目標=接上 SGLang 嘅
                        NEXTN 投機解碼,乘上 accept rate。由「draft 連 load 都入唔到」去到「draft→target verify
                        行勻兩卡專家 arena」,八堵牆:

                        # 牆 根因 修復
                        1 draft 撞主模型嘅 GGUF loader draft 繼承全局 --load-format --speculative-draft-load-format auto
                        2 loader 拒 13 個 GSQ config key 全局 --model-loader-extra-config 流入 draft 樹 patch:draft 載入時掉目標 extra-config(loud log)
                        3 layer-split 要求 ≥2 層 全局 GSQ_LAYER_SPLIT env 流入 draft(佢得 1 層) 樹 patch:draft runner 豁免
                        4 KV pool 起唔到 BF16 draft 7GB+投機 mamba intermediate 擠爆 24GB 卡 --max-running-requests 4(intermediate 2.15GB 實測)+ mem-fraction 調整
                        5 lm_head.weight 唔存在 GSQ 量化 head 只有 qweight;共享機制假設 BF16 tensor 樹 patch:量化 head 回傳 None,draft 直接共享成個 module(零 VRAM)
                        6 mamba state commit assert 兩卡 layer-split 手術將 mamba_cache 換成跨卡路由視圖,isinstance 唔識 樹 patch:放行路由視圖(逐層存取本來就回傳真 tensor,verify 前向已實證)
                        7-8 觀測盲區 error 訊息用扣減前嘅數,raise 條件對 fraction 唔敏感 觀測器 patch:admission 全代數印實數(available/slack/intermediate)

                        打字打到呢度先講清楚:全部 patch additive——唔開 spec flags=逐 byte 原行為,
                        .bak 留底,py_compile 過先上樹。現狀:首個完整 spec-on boot 差最後一個 commit 接縫
                        (修復已落樹,驗證窗跑緊)。spec-on 數據(accept rate、單流/c=8×MTP)下一帖交。

                        量化臂同時開咗題:draft 專家 Q2_0 化(675MB,同引擎生產配方 bitstream 一致),
                        draft 常駐 5GB→0.83GB——因為牆#4 證明 BF16 draft 同專家 arena 喺 24GB 卡本質唔共存。
                        builder 已寫好跑通(重打包 vs 官方 gguf 位元級一致)。

                        三、附:早前同批嘅 TP2 silent 語義地雷(未發過,一併記低)

                        兩進程 TP2 起機後語義全錯但輸出流利、零 NaN、兩卡 bit-identical。逐層 capture 鎖定
                        第一個 GDN 層輸出已偏,最終根因:

                        呢隻 artifact 用 modulo head-pairing(v-head h 讀 k-head h%16)。fla Triton kernel 嘅
                        i_h % Hg 喺 TP 下攞本卡 local Hg=8——連續半切之下 16/48 個 v-head 讀咗隔離卡嘅
                        k-head。值貌似合理、兩 rank 對稱壞,shape check 全部捉唔到。interleave pairing 唔中招。

                        呢個已經落咗 fail-closed guard(modulo×TP>1 直接 raise 拒絕起機,唔會靜靜服務壞數)。

                        標籤建議:7900xtx qwen-flash 多卡部署

                        张光璞张
                        张光璞张
                        张光璞
                        贵族大夫 硕果累累
                        编写于 最后由 张光璞 编辑
                        #15

                        @Benjy-Lei 说:

                        【7900xtx·qwen-flash】Flash-Next 混合 GDN 移植日記(二):併發開考 7.7× + MTP 頭移植八堵牆拆七

                        。。。。。。。。。。。。。。。
                        | 3 | layer-split 要求 ≥2 層 | 全局 GSQ_LAYER_SPLIT env 流入 draft(佢得 1 層) | 樹 patch:draft runner 豁免 |
                        標籤建議:7900xtx qwen-flash 多卡部署

                        NB啊! 在各大佬的努力下 7900XTX 终将留名青史

                        1 条回复 最后回复
                        0
                        • XiaoteX
                          XiaoteX
                          Xiaote
                          易有太极
                          编写于 最后由 编辑
                          #16

                          🔥 本帖参与讨论人数已达 10+,入选热议,作者 +3 积分奖励!

                          奖励凭证:热议 +3 分 · 编号 h2793-3382-1

                          老特的AI助手,DeepSeek Flash驱动,没回你是因为被限速了~除了管理员不能私信我,别浪费时间~尝试多了被封号就不好了~

                          1 条回复 最后回复
                          0
                          • Benjy LeiB
                            Benjy LeiB
                            Benjy Lei
                            体面乡绅
                            编写于 最后由 编辑
                            #17

                            【7900xtx·qwen-flash】prefill 36.8 → 334 tok/s:把 Strata 的三個原理逐條驗證,同 decode 真正的牆

                            一句話:照 Strata 的源碼+論文逐條驗證它的三個核心原理,prefill 由 36.8 升到 334.1 tok/s(9.1×),
                            兩日內把差距由 26× 收到 5.2×;但 decode 的真正牆不是我一開始以為的地方 —— 它藏在一個 counter 裡。


                            對象與環境

                            • 機器:雙 Radeon 7900 XTX(gfx1100,PCIe 無 P2P)· Ryzen 5 3700X(Zen2,無 AVX-512)· 94 GB DDR4
                            • 模型:Qwen3.8-Flash-Next GSQ IQ3_S,48 層(36 GDN + 12 attention)× 512 專家,pack 46.98 GiB
                            • 引擎:SGLang fork(Path B)vs Strata v0.2.7(同機同 pack,作基準)
                            • 量測:全部端到端 wall,PREFILL2 aggregate / CONC aggregate 走 usage 口徑,temperature 0
                            • 基準線:Strata prefill 8K = 1,719 tok/s、decode 單流 = 78 tok/s

                            所有數字都標明 arena / 分塊 / c / 冷暖。跨 config 唔相減 —— 這條紀律今天救了我兩次。


                            問題

                            我們(起點) Strata 差距
                            prefill 8K 暖 36.8 tok/s 1,719 47×
                            decode 單流 2.37 tok/s 78 33×

                            做法:Strata 的三個原理,逐條量

                            論文與源碼(expert_cache.hpp、prefill.cpp、docs/paper/Strata-Paper.pdf)拆得出三個可驗證的原理:

                            1. expert cache 要填滿剩餘 VRAM | 每 GB ≈ 700 個專家,每個在 VRAM 的專家就係 CPU 唔使算的。
                            2. prefill 的 miss 要分塊 stage | 我們一次過把整層 miss 塞入 arena,arena 比 miss 數細 ⇒ 自己逐出自己。
                            3. h_layer = 0.0456 | 只有 4.6% 的 (layer, token) 對能讓 10 個專家全部 resident ⇒ per-layer grouped kernel 數學上無用。

                            原理 1 的實測:我們白放了 13.5 GB VRAM

                            card0 used 20,050 / 24,560 MiB   → 白放 4,510
                            card1 used 15,564 / 24,560 MiB   → 白放 8,996
                            

                            48 GB 卡只用 35.5 GB。但這裡有個坑:arena 係計入 --mem-fraction-static 預算的,
                            所以「arena 加大 + mf 調細」的直覺係錯的(mf 0.28 直接被拒:權重已佔 0.419)。
                            card0 的 arena 天花板 ≈ 24,560 − 10,550 ≈ 13,000 MiB。

                            原理 2 的實測:thrash 才是真兇

                            GSQ_GFM_CHUNK 把「一次 stage 350 個 miss」切成「每批 64」。效果:

                            arena 分塊 prefill rep1 rep2(暖)
                            9,500/12,000 冇 43.1 65.6
                            9,500/12,000 64 98.1 273.6
                            12,000/18,500 冇 54.9 121.8
                            12,000/18,500 64 101.8 330.5
                            12,000/18,500 128 104.0 334.1

                            兩個槓桿不是乘法:分塊單獨 4.17×、arena 單獨 1.86×,但兩者同時只有 5.04×。
                            因為分塊消除 thrash 之後,arena 變大的邊際由 1.86 跌到 1.21。
                            命中率確實由 52.8% 升到 67.0%,但 tok/s 只多 21% —— 成本搬到別處了。


                            結果

                            項目 起點 現在 倍數 對 Strata
                            prefill 8K 暖 36.8 334.1 9.1× 5.2× 落後(原 47×)
                            prefill 8K 冷 25.5 104.0 4.1× —
                            decode 單流 2.37 2.89 1.22× 27× 落後
                            decode c=8 聚合 — 19.86 8.95× vs c=1 Strata 做不到
                            命中率 @40k 52.8% 67.0% +14pp Strata adaptive 72%

                            decode 真正的牆:唔是 staging、唔是命中率、唔是併發

                            四個窗的 steady-state 最小二乘(n=26,交叉檢查誤差 +0.7%):

                            ms/fwd = 10.887 × units_staged + 0.567 × hits
                            hits + units = 479.98/fwd = 48 層 × top_k 10      ← counter 自洽
                            
                            356.3 ms/fwd 拆解:
                              hit 路徑   268.0 ms  (75.2%)   ← 牆
                              staging     79.3 ms  (22.2%)
                              rendezvous   0.6 ms   (0.2%)
                              未解釋       8.4 ms
                            

                            480 個 hit unit × 0.567 ms = 272 ms。 這個數字同「48 層 × 10 專家」完全對得上,
                            所以它不是數學成本,而是「每個 expert 一次 dispatch」。

                            對照 Strata:78 tok/s = 12.8 ms/fwd,我們 356 ms —— 28×。
                            Strata 的論文原話:「The whole 48-layer pass is one captured CUDA graph per window size,
                            so the host never waits on a synchronizing driver call.」

                            而我們全部窗都帶 --disable-cuda-graph。試過開 graph,引擎直接在載入前拒絕:

                            GSQInvariantError: cuda graphs not disabled
                              (GSQ v1 needs --disable-cuda-graph; GSQ_V2=1 lifts this only for the v2 fast path)
                            

                            引擎自己知道 graph 要配 GSQ_V2=1。 這是下一步。


                            併發:Strata 結構上做不到的 8.95×

                            c 每流 聚合 vs c=1
                            1 2.22 2.22 1.00×
                            2 3.67 7.34 3.31×
                            4 3.15 12.61 5.68×
                            8 2.48 19.86 8.95×
                            c=1 : 450 ms/forward(每次 1 token)
                            c=8 : 403 ms/forward(每次 8 token)
                            ⇒ 8 倍 token、0.90 倍時間。第 2–8 個 token 邊際成本 ≈ 0
                            

                            原因同上面的歸因一致:forward 的成本是按 480 個 expert 計,唔是按 token 計。
                            Strata 是 FIFO 串行,這個乘數它拿不到。

                            但誠實講:我們 c=8 的聚合 19.86,仍然只有 Strata 單流 78 的 25%。
                            併發乘的是一個太細的基數。


                            今日我錯了三次(都記在 counter 與日誌裡)

                            1. pin190 結論作廢 —— 我以為「arena 按熱度釘選」無效,其實我的 patch 有 bug:
                              TOP=190 對 190 個 slot ⇒ 每個 resident 都被 pin ⇒ victim is None ⇒ 退化成純 LRU。
                              即係根本冇測到 pin。這是對抗審查(Claude Code,16 KB 逐 file:line)抓出來的。
                            2. 「跨層 prefetch 是第一槓桿」錯 —— 它只碰得到 staging 的 22%。真牆在 hit 路徑。
                            3. 一個 agent 講「prefill 從來冇行 grouped kernel」 —— 我用 counter 反證:
                              4049a bypass 次數 = 0,加上源碼註釋「GSQ_GROUPED_DEVICE_MAX_TOK=off restores the old
                              same-device behaviour」,證明 prefill 確實在跑 kernel。

                            三個結構性後續(都不是兩日能完成)

                            # 做什麼 狀態
                            1 packed bytes 直接餵 kernel 早已在樹上(GSQ_GROUPED_FIRST_MISS=1)。kernel 本來就食 packed bytes;read_dequant 那個 28% 來自未開 GFM 的舊 config,不適用於快路徑。
                            2 固定 ring + 指針表 + CUDA graph 週級工程。v2_fast_launch 目前零 call site,且 AT=24 拓撲下 capture 死在跨卡 index(index is on cuda:1)。天花板取決於 decode 的 device-busy 比例,未量。
                            3 H2D 與 compute 重疊 降級。PROF 的 h2d 桶量的是 4039 fallback 路徑的 blocking pageable copy(bf16, 10.65 MB/expert),而 arena 走 packed blob(2.33 MB/expert)。按 ρ=4.57 重算,真路徑的 h2d 只佔 4–16%,原本「≥30% 才做」的判準在目標路徑上不成立。

                            這三條都不是可以「今晚開工、明天收貨」的東西。 原本我把 #1 當成最快的一刀,查證後發現它已經完成了;#3 的 33% 是我用舊路徑的數字去論證新路徑,跨 config 了。

                            真正的問題回到一個更基本的量測:decode 的 362 ms 裡,GPU 忙幾多 %?
                            ≥60% ⇒ device-bound,槓桿在 kernel(per-group 小 GEMM、無 dedup);
                            ≤30% ⇒ host-bound,graph 與 batching 才有意義。
                            這個數字未出之前,任何結構性重構都只是押注。


                            三條方法論紀律(其中一條是今天我違反了的)

                            1. 預先寫判準,再看數據。 我寫死「h2d 佔比 ≥ 30% 才值得做 stream 重構」,量到 33%,
                              一度以為過關。但查 PROF 的定義之後發現:那個 h2d 桶量的是 4039 fallback 路徑
                              (dequant 後 bf16、10.65 MB/expert),而 arena 走的是 packed blob(2.33 MB/expert)。
                              同一個名字,兩條路徑,差 4.57 倍 bytes。 判準本身沒錯,是我把它套在錯的路徑上。
                            2. 跨 config 唔相減,跨路徑唔借比例。 這條我今天犯了三次(arena vs 分塊、
                              h2d 舊路徑 vs 快路徑、read_dequant 的 28% 其實來自冇開 GFM 的 config)。
                              每次都是「同一個指標名」讓我放鬆了警惕。
                            3. counter 要自證。 hits + units = 479.98/fwd = 48 × 10 這種恆等式,比任何解釋都可靠。
                              反面教材:一個 agent 用「全部 512 專家都要搬」推出 51.9 GB 上限,而我們實際只搬 33% miss。

                            現在的誠實定位

                            prefill   334.1 vs 1,719   → 差 5.2×(起點 47×)
                            decode    2.89  vs 78      → 差 27×(單流)
                                      19.86 vs 78 串行 → c=8 聚合仍然落後 3.9×
                            

                            兩日內能交的是「prefill 9.1× + 併發 8.95× + decode 完整的歸因」,
                            不是「追平 Strata」。要追平必須完成上面三件結構性的事 —— 那是週級,不是日級。

                            把這句話寫在交付前面,比交付一個漂亮數字重要。

                            1 条回复 最后回复
                            0
                            • ,系统 取消固定了此主题

                            你好!看起来您对这段对话很感兴趣,但您还没有一个账号。

                            厌倦了每次访问都刷到同样的帖子?您注册账号后,您下次访问时都将自动回到上次浏览的位置,并可选择接收新回复的通知(通过电子邮件或推送通知)。您还可以收藏帖子、为帖子点赞,以此向其他社区成员表达您的感谢。

                            有了你的建议,这篇帖子会更精彩哦 💗

                            注册 登录
                            回复
                            • 在新帖中回复
                            登录后回复
                            • 从旧到新
                            • 从新到旧
                            • 最多赞同


                            • 登录

                            • 登录或注册以进行搜索。
                            • 第一个帖子
                              最后一个帖子
                            0
                            • 版块
                            • 最新
                            • 标签
                            • 热门
                            • 用户
                            • 群组