112112DESCRIPTOR_PHYSICAL_ABI_POLICY_BANKED_BY_DTYPE = "banked_by_dtype"
113113DESCRIPTOR_PHYSICAL_ABI_POLICY_BANKED_BY_ROLE = "banked_by_role"
114114DESCRIPTOR_PORTABLE_KERNEL_BUFFER_LIMIT = 31
115- DESCRIPTOR_SHARED_SCRATCH_SPILL_THRESHOLD_BYTES = 4 * 1024
116- DESCRIPTOR_SHARED_SCRATCH_BUDGET_BYTES = 24 * 1024
115+ DESCRIPTOR_SHARED_SCRATCH_SPILL_THRESHOLD_BYTES = 1024
116+ DESCRIPTOR_SHARED_SCRATCH_BUDGET_BYTES = 12 * 1024
117117MAMBA3_BWD_REPLAY_CHECKPOINT_INTERVAL = 64
118118_DESCRIPTOR_ROOT_READS_MARKER = "cppmega_path_c_root_reads"
119119_DESCRIPTOR_ROOT_WRITES_MARKER = "cppmega_path_c_root_writes"
139139 "mamba3_delta_grad" ,
140140 }
141141)
142+ DESCRIPTOR_ROW_PHASED_BWD_SCRATCH_ABI_CANONICALS = frozenset (
143+ {
144+ "hidden" ,
145+ "attention_hidden" ,
146+ "hidden_after_mamba3" ,
147+ "m2rnn_hidden" ,
148+ "m2rnn_delta" ,
149+ "mamba3_delta" ,
150+ "q_fp8" ,
151+ "q_scale" ,
152+ "kv_fp8" ,
153+ "kv_scale" ,
154+ }
155+ )
142156DESCRIPTOR_DEFAULT_MAX_ROWS_PER_LAUNCH = 64
143157DESCRIPTOR_ROW_DISPATCH_GRID_CHUNKS = "grid_chunks"
144158DESCRIPTOR_ROW_DISPATCH_LAUNCHER_CHUNKS = "launcher_chunks"
@@ -3033,9 +3047,9 @@ def _spill_large_shared_scratch_to_abi(
30333047 byte_count = _flattened_extent (shape ) * _DTYPE_NBYTES [dtype ]
30343048 total_shared_bytes += byte_count
30353049 scratch_name = match .group ("name" )
3036- force_scratch_abi = scratch_name in DESCRIPTOR_ROW_PHASED_BWD_SCRATCH_ABI_BUFFERS
3050+ force_scratch_abi = _is_row_phased_bwd_scratch_abi_buffer ( scratch_name )
30373051 if (
3038- byte_count > DESCRIPTOR_SHARED_SCRATCH_SPILL_THRESHOLD_BYTES
3052+ byte_count >= DESCRIPTOR_SHARED_SCRATCH_SPILL_THRESHOLD_BYTES
30393053 or force_scratch_abi
30403054 ):
30413055 candidates .append (
@@ -3178,6 +3192,21 @@ def rewrite_scratch_refs(line: str) -> str:
31783192 return "\n " .join (rewritten ) + "\n " , spilled
31793193
31803194
3195+ def _is_row_phased_bwd_scratch_abi_buffer (buffer_name : str ) -> bool :
3196+ """Return True for internal bwd scratch that must be a device ABI buffer."""
3197+
3198+ name = str (buffer_name )
3199+ if name in DESCRIPTOR_ROW_PHASED_BWD_SCRATCH_ABI_BUFFERS :
3200+ return True
3201+ if not name .endswith ("_grad" ):
3202+ return False
3203+ canonical = _canonical_buffer_name (name )
3204+ if canonical in DESCRIPTOR_ROW_PHASED_BWD_SCRATCH_ABI_CANONICALS :
3205+ return True
3206+ base = name [: - len ("_grad" )]
3207+ return base .endswith (("_hidden" , "_delta" , "_out" ))
3208+
3209+
31813210def _validated_internal_buffer_policy (policy : str ) -> str :
31823211 normalized = str (policy )
31833212 if normalized not in {
@@ -3594,6 +3623,27 @@ def _row_local_internal_buffer_shape(
35943623 shape_env : PathCModelShapeEnv ,
35953624) -> tuple [int , ...]:
35963625 canonical_name = _canonical_buffer_name (buffer_name )
3626+ if str (buffer_name ).endswith ("_grad" ) and (
3627+ canonical_name in DESCRIPTOR_ROW_PHASED_BWD_SCRATCH_ABI_CANONICALS
3628+ or str (buffer_name )[: - len ("_grad" )].endswith (("_hidden" , "_delta" , "_out" ))
3629+ ):
3630+ if canonical_name == "q_fp8" :
3631+ return (
3632+ shape_env .sequence_length
3633+ * shape_env .attention_num_q_heads
3634+ * shape_env .attention_head_dim ,
3635+ )
3636+ if canonical_name == "q_scale" :
3637+ return (shape_env .sequence_length * shape_env .attention_num_q_heads ,)
3638+ if canonical_name == "kv_fp8" :
3639+ return (
3640+ shape_env .sequence_length
3641+ * shape_env .attention_num_kv_heads
3642+ * shape_env .attention_head_dim ,
3643+ )
3644+ if canonical_name == "kv_scale" :
3645+ return (shape_env .sequence_length * shape_env .attention_num_kv_heads ,)
3646+ return (shape_env .sequence_length * shape_env .hidden_size ,)
35973647 if canonical_name in {
35983648 "mamba3_delta" ,
35993649 "m2rnn_hidden" ,
@@ -3616,23 +3666,6 @@ def _row_local_internal_buffer_shape(
36163666 * shape_env .attention_num_kv_heads
36173667 * shape_env .attention_sparse_topk ,
36183668 )
3619- if str (buffer_name ).endswith ("_grad" ):
3620- if canonical_name == "q_fp8" :
3621- return (
3622- shape_env .sequence_length
3623- * shape_env .attention_num_q_heads
3624- * shape_env .attention_head_dim ,
3625- )
3626- if canonical_name == "q_scale" :
3627- return (shape_env .sequence_length * shape_env .attention_num_q_heads ,)
3628- if canonical_name == "kv_fp8" :
3629- return (
3630- shape_env .sequence_length
3631- * shape_env .attention_num_kv_heads
3632- * shape_env .attention_head_dim ,
3633- )
3634- if canonical_name == "kv_scale" :
3635- return (shape_env .sequence_length * shape_env .attention_num_kv_heads ,)
36363669 if canonical_name == "kv_fp8" :
36373670 return (shape_env .attention_num_kv_heads * shape_env .attention_head_dim ,)
36383671 if canonical_name == "kv_scale" :
@@ -12290,13 +12323,14 @@ def _dynamic_descriptor_target_for_region(
1229012323 acceptance_profile ,
1229112324 descriptors ,
1229212325 )
12326+ train_step_output_abi = _region_requires_train_step_output_abi (region , nodes )
1229312327 physical_abi_policy = _physical_abi_policy_for_region (
1229412328 nodes ,
1229512329 shape_env = shape_env ,
1229612330 internal_buffer_policy = internal_buffer_policy ,
1229712331 loop_policy = loop_policy ,
12332+ train_step_output_abi = train_step_output_abi ,
1229812333 )
12299- train_step_output_abi = _region_requires_train_step_output_abi (region , nodes )
1230012334 schedule_name = (
1230112335 acceptance_profile .schedule_name
1230212336 if acceptance_profile is not None
@@ -12412,6 +12446,7 @@ def _physical_abi_policy_for_region(
1241212446 shape_env : PathCModelShapeEnv | None ,
1241312447 internal_buffer_policy : str ,
1241412448 loop_policy : str ,
12449+ train_step_output_abi : bool = False ,
1241512450) -> str :
1241612451 internal_buffers = _internal_buffers_for_nodes (
1241712452 nodes ,
@@ -12420,6 +12455,10 @@ def _physical_abi_policy_for_region(
1242012455 loop_policy = loop_policy ,
1242112456 )
1242212457 external_buffer_count = len (_external_buffers_for_nodes (nodes , internal_buffers ))
12458+ if train_step_output_abi :
12459+ external_buffer_count += len (_TRAIN_STEP_SCALAR_OUTPUT_ABI_NAMES )
12460+ external_buffer_count += len (_TRAIN_STEP_SUFFIX_LOSS_INPUT_ABI_NAMES )
12461+ external_buffer_count += len (_TRAIN_STEP_SUFFIX_LOSS_PARAMETER_GRAD_ABI_NAMES )
1242312462 if external_buffer_count > DESCRIPTOR_PORTABLE_KERNEL_BUFFER_LIMIT :
1242412463 return DESCRIPTOR_PHYSICAL_ABI_POLICY_BANKED_BY_ROLE
1242512464 return DESCRIPTOR_PHYSICAL_ABI_POLICY_DIRECT
0 commit comments