Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ env/
build_output/
outputs/
profile_out/
artifacts/
*.log

# Local editor and agent metadata
Expand Down
2 changes: 1 addition & 1 deletion pypto-lib
Submodule pypto-lib updated 80 files
+12 −4 .claude/skills/github-pr/SKILL.md
+14 −1 golden/runner.py
+18 −2 models/deepseek/v4-flash/decode_attention_csa.py
+10 −1 models/deepseek/v4-flash/decode_attention_hca.py
+25 −19 models/deepseek/v4-flash/decode_compressor_ratio128.py
+21 −18 models/deepseek/v4-flash/decode_compressor_ratio4.py
+143 −79 models/deepseek/v4-flash/decode_fwd.py
+40 −24 models/deepseek/v4-flash/decode_indexer.py
+27 −22 models/deepseek/v4-flash/decode_indexer_compressor.py
+136 −0 models/deepseek/v4-flash/decode_input_pack.py
+532 −0 models/deepseek/v4-flash/decode_metadata_device.py
+384 −270 models/deepseek/v4-flash/decode_mtp.py
+38 −16 models/deepseek/v4-flash/hc_pre.py
+223 −6 models/deepseek/v4-flash/lm_head.py
+117 −0 models/deepseek/v4-flash/lookup_embedding.py
+173 −187 models/deepseek/v4-flash/mtp_projection.py
+62 −32 models/deepseek/v4-flash/prefill_attention_csa.py
+28 −2 models/deepseek/v4-flash/prefill_attention_hca.py
+21 −2 models/deepseek/v4-flash/prefill_attention_swa.py
+3 −2 models/deepseek/v4-flash/prefill_fwd.py
+127 −46 models/deepseek/v4-flash/prefill_indexer.py
+23 −23 models/deepseek/v4-flash/prefill_indexer_compressor.py
+202 −159 models/deepseek/v4-flash/prefill_mtp.py
+439 −183 models/deepseek/v4-flash/prefill_sparse_attn.py
+13 −14 models/deepseek/v4-flash/qkv_proj_rope.py
+58 −0 models/deepseek/v4-flash/rope_interleave.py
+29 −3 models/deepseek/v4-pro/config.py
+1 −1 models/deepseek/v4-pro/decode_attention_csa.py
+1 −1 models/deepseek/v4-pro/decode_attention_hca.py
+1 −1 models/deepseek/v4-pro/decode_attention_swa.py
+1 −1 models/deepseek/v4-pro/decode_compressor_ratio128.py
+1 −1 models/deepseek/v4-pro/decode_compressor_ratio4.py
+73 −24 models/deepseek/v4-pro/decode_fwd.py
+5 −2 models/deepseek/v4-pro/decode_indexer.py
+1 −1 models/deepseek/v4-pro/decode_indexer_compressor.py
+62 −118 models/deepseek/v4-pro/decode_layer.py
+1 −1 models/deepseek/v4-pro/decode_metadata.py
+1 −1 models/deepseek/v4-pro/decode_mtp.py
+2 −2 models/deepseek/v4-pro/decode_sparse_attn.py
+1 −1 models/deepseek/v4-pro/decode_sparse_attn_hca.py
+1 −1 models/deepseek/v4-pro/decode_sparse_attn_swa.py
+12 −2 models/deepseek/v4-pro/expert_routed.py
+45 −15 models/deepseek/v4-pro/expert_shared.py
+42 −5 models/deepseek/v4-pro/gate.py
+1 −1 models/deepseek/v4-pro/hc_head.py
+1 −1 models/deepseek/v4-pro/hc_post.py
+10 −5 models/deepseek/v4-pro/hc_pre.py
+2 −2 models/deepseek/v4-pro/lm_head.py
+4 −4 models/deepseek/v4-pro/moe.py
+1 −1 models/deepseek/v4-pro/mtp_projection.py
+15 −1 models/deepseek/v4-pro/prefill_attention_csa.py
+15 −1 models/deepseek/v4-pro/prefill_attention_hca.py
+15 −1 models/deepseek/v4-pro/prefill_attention_swa.py
+1 −1 models/deepseek/v4-pro/prefill_compressor_ratio128.py
+1 −1 models/deepseek/v4-pro/prefill_compressor_ratio4.py
+98 −42 models/deepseek/v4-pro/prefill_fwd.py
+22 −11 models/deepseek/v4-pro/prefill_indexer.py
+1 −1 models/deepseek/v4-pro/prefill_indexer_compressor.py
+53 −5 models/deepseek/v4-pro/prefill_layer.py
+1 −1 models/deepseek/v4-pro/prefill_mtp.py
+35 −22 models/deepseek/v4-pro/prefill_sparse_attn.py
+28 −5 models/deepseek/v4-pro/qkv_proj_rope.py
+1 −1 models/deepseek/v4-pro/rmsnorm.py
+5 −2 models/qwen3/14b/config.py
+7 −2 models/qwen3/14b/constants.py
+36 −22 models/qwen3/14b/contract.py
+155 −119 models/qwen3/14b/decode_fwd.py
+105 −90 models/qwen3/14b/decode_layer_a8w8.py
+8 −8 models/qwen3/14b/greedy_sample.py
+38 −8 models/qwen3/14b/kernels/paged_attention_cce/kernel/fai_body.hpp
+738 −1,070 models/qwen3/14b/kernels/paged_attention_cce/kernel/rope_qkv_generated.hpp
+27 −14 models/qwen3/14b/paged_attention_cce.py
+34 −34 models/qwen3/14b/prefill_fwd.py
+15 −15 models/qwen3/14b/prefill_fwd_a8w8.py
+37 −37 models/qwen3/14b/rms_lm_head.py
+418 −0 models/qwen3/14b/rope_qkv_regen.py
+2 −2 models/qwen3/14b/test_paged_attention_cce.py
+12 −12 models/qwen3/14b/topk_select.py
+145 −13 tests/contract/test_qwen3_14b_contract.py
+122 −0 tests/golden/test_runner.py
5 changes: 5 additions & 0 deletions pypto_serving/model/common/executor/executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ def supports_device_embedding(self) -> bool:
"""
return False

@property
def supports_device_decode_embedding(self) -> bool:
"""Return whether decode kernels gather embeddings from token IDs."""
return self.supports_device_embedding

@property
def max_prefill_batch_size(self) -> int | None:
"""Return an executor-specific prefill dispatch limit, if any."""
Expand Down
34 changes: 21 additions & 13 deletions pypto_serving/model/deepseek/npu_executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,14 @@
DEEPSEEK_V4_CSA_INNER_STATE_DIM,
DEEPSEEK_V4_CSA_MAIN_OUT_DIM,
DEEPSEEK_V4_CSA_STATE_DIM,
DEEPSEEK_V4_CACHE_GROUP_NAMES,
DEEPSEEK_V4_HCA_MAIN_OUT_DIM,
DEEPSEEK_V4_HCA_STATE_DIM,
DEEPSEEK_V4_HC_MULT,
DEEPSEEK_V4_IDX_HEAD_DIM,
DEEPSEEK_V4_LM_HEAD_TP_SIZE,
DEEPSEEK_V4_MAX_LOGIT_ROWS,
DEEPSEEK_V4_SAMPLED_IDS_PAD,
DeepSeekV4CacheLayout,
DeepSeekV4CompiledKernels,
DeepSeekV4L3Callable,
Expand Down Expand Up @@ -100,10 +102,13 @@
"decode_attention_hca",
"decode_attention_swa",
"decode_fwd",
"decode_input_pack",
"decode_indexer",
"decode_indexer_compressor",
"decode_layer",
"decode_metadata_device",
"decode_mtp",
"lookup_embedding",
"decode_sparse_attn",
"decode_sparse_attn_csa",
"decode_sparse_attn_hca",
Expand Down Expand Up @@ -327,6 +332,11 @@ def supports_device_sampling(self) -> bool:
"""Enable executor-provided greedy token acceptance for MTP only."""
return self._enable_mtp

@property
def supports_device_decode_embedding(self) -> bool:
"""Use token IDs directly in the packed DeepSeek decode kernels."""
return True

def lookup_embeddings(self, model: RuntimeModel, token_ids: torch.Tensor) -> torch.Tensor:
"""Lookup token embeddings from the lazily loaded DeepSeekV4 embedding table."""
compiled = self._compiled.get(model.config.model_id)
Expand Down Expand Up @@ -839,7 +849,9 @@ def stacked(name: str, count: int) -> torch.Tensor:

values.update(
{
"x_hc": torch.empty((ranks, tokens, DEEPSEEK_V4_HC_MULT, hidden), dtype=torch.float32),
"embed_weight": torch.empty(
(ranks, model.config.vocab_size, hidden), dtype=torch.bfloat16
),
# FWD-stacked work caches (x43).
"kv_cache": torch.empty(
(
Expand Down Expand Up @@ -912,18 +924,6 @@ def stacked(name: str, count: int) -> torch.Tensor:
),
# Shared single-copy per-step inputs.
"block_table": torch.empty((ranks, batch, layout.ori_table_max_blocks), dtype=torch.int32),
"ori_slot_mapping": torch.empty((ranks, tokens), dtype=torch.long),
"window_swa_indices": torch.empty((ranks, tokens, layout.sliding_window), dtype=torch.int32),
"window_swa_lens": torch.empty((ranks, tokens), dtype=torch.int32),
"swa_slot_mapping": torch.empty((ranks, tokens), dtype=torch.long),
"swa_indices": torch.empty((ranks, tokens, layout.sliding_window), dtype=torch.int32),
"swa_lens": torch.empty((ranks, tokens), dtype=torch.int32),
"hca_cmp_slot_mapping": torch.empty((ranks, tokens), dtype=torch.long),
"hca_state_slot_mapping": torch.empty((ranks, tokens), dtype=torch.long),
"csa_cmp_slot_mapping": torch.empty((ranks, tokens), dtype=torch.long),
"csa_idx_slot_mapping": torch.empty((ranks, tokens), dtype=torch.long),
"csa_state_slot_mapping": torch.empty((ranks, tokens), dtype=torch.long),
"csa_inner_state_slot_mapping": torch.empty((ranks, tokens), dtype=torch.long),
"position_ids": torch.empty((ranks, tokens), dtype=torch.int32),
"kv_seq_lens": torch.empty((ranks, batch), dtype=torch.int32),
"hca_compress_state_block_table": torch.empty(
Expand All @@ -940,6 +940,10 @@ def stacked(name: str, count: int) -> torch.Tensor:
),
"cmp_block_table": torch.empty((ranks, batch, layout.cmp_max_blocks), dtype=torch.int32),
"idx_block_table": torch.empty((ranks, batch, layout.idx_max_blocks), dtype=torch.int32),
"block_counts": torch.empty(
(ranks, batch, len(DEEPSEEK_V4_CACHE_GROUP_NAMES)),
dtype=torch.int32,
),
# hc_head output-collapse weights (single copy per rank).
"hc_head_fn": torch.empty((ranks, DEEPSEEK_V4_HC_MULT, hc_dim), dtype=torch.float32),
"hc_head_scale": torch.empty((ranks, 1), dtype=torch.float32),
Expand All @@ -961,6 +965,10 @@ def stacked(name: str, count: int) -> torch.Tensor:
),
"hidden_out": torch.empty((ranks, tokens, hidden), dtype=torch.bfloat16),
"logits": torch.empty((ranks, tokens, model.config.vocab_size), dtype=torch.float32),
"sampled_ids": torch.empty(
(ranks, DEEPSEEK_V4_MAX_LOGIT_ROWS, DEEPSEEK_V4_SAMPLED_IDS_PAD),
dtype=torch.int32,
),
"num_tokens_per_owner": torch.full((ranks,), tokens, dtype=torch.int32),
"logit_row_indices": _dummy_logit_row_indices(ranks, tokens),
}
Expand Down
Loading
Loading