pr72-2-glm-dcp-draft-path.patch 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. diff --git a/vllm/model_executor/layers/sparse_attn_indexer.py b/vllm/model_executor/layers/sparse_attn_indexer.py
  2. index e6e6f01cc..2767ebdd2 100644
  3. --- a/vllm/model_executor/layers/sparse_attn_indexer.py
  4. +++ b/vllm/model_executor/layers/sparse_attn_indexer.py
  5. @@ -1982,6 +1982,19 @@ class SparseAttnIndexer(CustomOp):
  6. self.max_model_len = max_model_len
  7. self.max_total_seq_len = max_total_seq_len
  8. self.topk_indices_buffer = topk_indices_buffer
  9. + if topk_scores_buffer is None and topk_indices_buffer is not None:
  10. + try:
  11. + from vllm.distributed.parallel_state import get_dcp_group
  12. +
  13. + dcp_world_size = get_dcp_group().world_size
  14. + except Exception:
  15. + dcp_world_size = 1
  16. + if dcp_world_size > 1 and use_b12x_sparse_indexer():
  17. + topk_scores_buffer = torch.empty(
  18. + topk_indices_buffer.shape,
  19. + dtype=torch.float32,
  20. + device=topk_indices_buffer.device,
  21. + )
  22. self.topk_scores_buffer = topk_scores_buffer
  23. self.skip_k_cache_insert = skip_k_cache_insert
  24. self.use_fp4_cache = use_fp4_cache
  25. diff --git a/vllm/model_executor/models/deepseek_mtp.py b/vllm/model_executor/models/deepseek_mtp.py
  26. index 552d6438a..d0fdbaf36 100644
  27. --- a/vllm/model_executor/models/deepseek_mtp.py
  28. +++ b/vllm/model_executor/models/deepseek_mtp.py
  29. @@ -346,10 +346,7 @@ class DeepSeekMultiTokenPredictorLayer(nn.Module):
  30. device=self.device,
  31. )
  32. topk_scores_buffer = None
  33. - if (
  34. - vllm_config.parallel_config.decode_context_parallel_size > 1
  35. - and use_b12x_sparse_indexer()
  36. - ):
  37. + if vllm_config.parallel_config.decode_context_parallel_size > 1:
  38. topk_scores_buffer = torch.empty(
  39. vllm_config.scheduler_config.max_num_batched_tokens,
  40. topk_tokens,
  41. diff --git a/vllm/v1/attention/backends/mla/indexer.py b/vllm/v1/attention/backends/mla/indexer.py
  42. index cbdc9be96..6260ee159 100644
  43. --- a/vllm/v1/attention/backends/mla/indexer.py
  44. +++ b/vllm/v1/attention/backends/mla/indexer.py
  45. @@ -1,7 +1,7 @@
  46. # SPDX-License-Identifier: Apache-2.0
  47. # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
  48. import os
  49. -from dataclasses import dataclass
  50. +from dataclasses import dataclass, replace
  51. import numpy as np
  52. import torch
  53. @@ -695,6 +695,7 @@ class DeepseekV32IndexerMetadataBuilder(AttentionMetadataBuilder):
  54. use_dcp_local_kv = (
  55. self.dcp_world_size > 1
  56. and common_attn_metadata.dcp_local_seq_lens is not None
  57. + and not getattr(self.kv_cache_spec, "dcp_replicated", False)
  58. )
  59. effective_dcp_world_size = self.dcp_world_size if use_dcp_local_kv else 1
  60. effective_dcp_rank = self.dcp_rank if use_dcp_local_kv else 0
  61. @@ -1021,6 +1022,49 @@ class DeepseekV32IndexerMetadataBuilder(AttentionMetadataBuilder):
  62. return attn_metadata
  63. + def build_for_drafting(
  64. + self,
  65. + common_attn_metadata: CommonAttentionMetadata,
  66. + draft_index: int,
  67. + ) -> DeepseekV32IndexerMetadata:
  68. + if draft_index > 0:
  69. + num_tokens = common_attn_metadata.num_actual_tokens
  70. + num_reqs = min(common_attn_metadata.num_reqs, num_tokens)
  71. + if num_tokens > 0 and num_reqs > 0:
  72. + needs_unpadded_decode_view = (
  73. + common_attn_metadata.batch_topology is not None
  74. + or common_attn_metadata.max_query_len > 1
  75. + or common_attn_metadata.num_reqs != num_reqs
  76. + or int(common_attn_metadata.query_start_loc_cpu[num_reqs])
  77. + != num_tokens
  78. + )
  79. + if needs_unpadded_decode_view:
  80. + query_start_loc = torch.arange(
  81. + num_reqs + 1,
  82. + dtype=common_attn_metadata.query_start_loc.dtype,
  83. + device=common_attn_metadata.query_start_loc.device,
  84. + )
  85. + query_start_loc_cpu = torch.arange(
  86. + num_reqs + 1,
  87. + dtype=common_attn_metadata.query_start_loc_cpu.dtype,
  88. + device=common_attn_metadata.query_start_loc_cpu.device,
  89. + )
  90. + common_attn_metadata = replace(
  91. + common_attn_metadata.unpadded(
  92. + num_actual_tokens=num_tokens,
  93. + num_actual_reqs=num_reqs,
  94. + ),
  95. + query_start_loc=query_start_loc,
  96. + query_start_loc_cpu=query_start_loc_cpu,
  97. + max_query_len=1,
  98. + )
  99. +
  100. + return self.build(
  101. + common_prefix_len=0,
  102. + common_attn_metadata=common_attn_metadata,
  103. + fast_build=True,
  104. + )
  105. +
  106. def build_prefill_chunk_metadata(
  107. start_idx: int,