@@ -28,6 +28,8 @@ def ring_ragged_sort(
2828 ep_name ,
2929 ep_size ,
3030 buffer_size = None ,
31+ enforce_gather_fallback = False ,
32+ enforce_gather_reduce_fallback = False ,
3133):
3234 """Ragged-gather variant for AG-RS Expert Parallelism token routing.
3335
@@ -102,6 +104,7 @@ def _ring_ragged_sort_fwd(hidden_states_local, topk_indices_local):
102104 token_indices_sorted ,
103105 shard_output_start [None ],
104106 shard_output_end [None ],
107+ enforce_fallback = enforce_gather_fallback ,
105108 )
106109 else :
107110 local_buffer_size = buffer_size
@@ -122,6 +125,7 @@ def _ring_ragged_sort_fwd(hidden_states_local, topk_indices_local):
122125 sliced_indices ,
123126 jnp .int32 (0 )[None ],
124127 gather_end [None ],
128+ enforce_fallback = enforce_gather_fallback ,
125129 )
126130
127131 out = (x , group_sizes_local , topk_argsort_revert_indices )
@@ -173,6 +177,7 @@ def _ring_ragged_sort_bwd(res, g_out):
173177 topk_weights = jnp .ones ((n ,), dtype = jnp .float32 ),
174178 valid_rows_mask = valid_rows_mask ,
175179 reduce_group_size = topk ,
180+ enforce_fallback = enforce_gather_reduce_fallback ,
176181 )
177182 else :
178183 # Buffering: g_x has size `local_buffer_size` (packed).
@@ -195,6 +200,7 @@ def _ring_ragged_sort_bwd(res, g_out):
195200 topk_weights = jnp .ones ((n ,), dtype = jnp .float32 ),
196201 valid_rows_mask = valid_rows_mask ,
197202 reduce_group_size = topk ,
203+ enforce_fallback = enforce_gather_reduce_fallback ,
198204 )
199205 return grad_hidden_states , None
200206
@@ -211,6 +217,8 @@ def ring_ragged_unsort(
211217 local_num_experts ,
212218 ep_name ,
213219 topk_weights ,
220+ enforce_gather_fallback = False ,
221+ enforce_gather_reduce_fallback = False ,
214222):
215223 """Dual of :func:`ring_ragged_sort`.
216224
@@ -282,6 +290,7 @@ def _ring_ragged_unsort_fwd(sorted_tokens_local, group_sizes_local, topk_argsort
282290 topk_weights = topk_weights_flat ,
283291 valid_rows_mask = valid_rows_mask ,
284292 reduce_group_size = topk ,
293+ enforce_fallback = enforce_gather_reduce_fallback ,
285294 )
286295 else :
287296 # Shift indices so they map to the packed local buffer [0, local_num_tokens).
@@ -297,6 +306,7 @@ def _ring_ragged_unsort_fwd(sorted_tokens_local, group_sizes_local, topk_argsort
297306 topk_weights = topk_weights_flat ,
298307 valid_rows_mask = valid_rows_mask ,
299308 reduce_group_size = topk ,
309+ enforce_fallback = enforce_gather_reduce_fallback ,
300310 )
301311
302312 res = (
@@ -352,6 +362,7 @@ def _ring_ragged_unsort_bwd(res, g_out):
352362 shard_output_end [None ],
353363 weights = weight_for_sorted ,
354364 has_weights = True ,
365+ enforce_fallback = enforce_gather_fallback ,
355366 )
356367 else :
357368 # Slice the inverse permutation to match the packed local buffer.
@@ -368,6 +379,7 @@ def _ring_ragged_unsort_bwd(res, g_out):
368379 gather_end [None ],
369380 weights = sliced_weights ,
370381 has_weights = True ,
382+ enforce_fallback = enforce_gather_fallback ,
371383 )
372384 return grad_sorted_tokens , None , None , None
373385
@@ -379,7 +391,7 @@ def _ring_ragged_unsort_bwd(res, g_out):
379391 return _ring_ragged_unsort (sorted_tokens_local , group_sizes_local , topk_argsort_revert_indices , topk_weights_flat )
380392
381393
382- def a2a_ragged_sort (inputs , sort_indices , valid_end ):
394+ def a2a_ragged_sort (inputs , sort_indices , valid_end , enforce_gather_fallback = False , enforce_gather_reduce_fallback = False ):
383395 """Ragged-gather variant for ``local_permute``.
384396
385397 Unlike :func:`ring_ragged_sort`, the rows valid for this shard live in
@@ -442,6 +454,7 @@ def _a2a_ragged_sort_bwd(res, g_out):
442454 topk_weights = jnp .ones ((n ,), dtype = jnp .float32 ),
443455 valid_rows_mask = valid_rows_mask [idx_inv ],
444456 reduce_group_size = 1 ,
457+ enforce_fallback = enforce_gather_reduce_fallback ,
445458 )
446459 # custom_vjp must return one gradient per primal arg; valid_end is integer
447460 # and non-differentiable, so we return None for it.
@@ -451,7 +464,9 @@ def _a2a_ragged_sort_bwd(res, g_out):
451464 return _a2a_ragged_sort (inputs , sort_indices , valid_end )
452465
453466
454- def a2a_ragged_unsort (sorted_tokens , revert_indices , valid_end ):
467+ def a2a_ragged_unsort (
468+ sorted_tokens , revert_indices , valid_end , enforce_gather_fallback = False , enforce_gather_reduce_fallback = False
469+ ):
455470 """Dual of :func:`a2a_ragged_sort`.
456471
457472 Forward:
@@ -492,6 +507,7 @@ def _a2a_ragged_unsort_fwd(sorted_tokens, revert_indices, valid_end):
492507 topk_weights = jnp .ones ((n ,), dtype = jnp .float32 ),
493508 valid_rows_mask = valid_rows_mask ,
494509 reduce_group_size = 1 ,
510+ enforce_fallback = enforce_gather_reduce_fallback ,
495511 )
496512 res = (revert_indices , end , sorted_tokens .shape , start )
497513 return out , res
0 commit comments