@@ -483,23 +483,29 @@ class _ExpertBucketMember:
483483 in_features : int
484484 n_snps : int
485485 snp_indices : np .ndarray
486+ fc_0_kernel : int
486487
487488
488489def _bucket_experts (
489490 members : list [_ExpertBucketMember ],
490491 tolerance : float ,
491492) -> list [list [_ExpertBucketMember ]]:
492- sorted_members = sorted (members , key = lambda m : m .in_features )
493+ by_kernel : dict [int , list [_ExpertBucketMember ]] = {}
494+ for m in members :
495+ by_kernel .setdefault (m .fc_0_kernel , []).append (m )
496+
493497 buckets : list [list [_ExpertBucketMember ]] = []
494- current : list [_ExpertBucketMember ] = [sorted_members [0 ]]
495- for m in sorted_members [1 :]:
496- bucket_min = current [0 ].in_features
497- if m .in_features <= bucket_min * (1 + tolerance ):
498- current .append (m )
499- else :
500- buckets .append (current )
501- current = [m ]
502- buckets .append (current )
498+ for kernel in sorted (by_kernel ):
499+ sorted_members = sorted (by_kernel [kernel ], key = lambda m : m .in_features )
500+ current : list [_ExpertBucketMember ] = [sorted_members [0 ]]
501+ for m in sorted_members [1 :]:
502+ bucket_min = current [0 ].in_features
503+ if m .in_features <= bucket_min * (1 + tolerance ):
504+ current .append (m )
505+ else :
506+ buckets .append (current )
507+ current = [m ]
508+ buckets .append (current )
503509 return buckets
504510
505511
@@ -721,15 +727,7 @@ def __init__(
721727 cutoff = self .model_config .cutoff
722728 assert isinstance (cutoff , int )
723729
724- self ._use_batched_experts = (
725- model_config .expert_batching and not model_config .auto_scale_fc0_kernel
726- )
727- if model_config .expert_batching and model_config .auto_scale_fc0_kernel :
728- logger .warning (
729- "expert_batching is enabled but auto_scale_fc0_kernel is True; "
730- "falling back to per-expert loop (batching not yet supported for "
731- "auto-scaled kernels)."
732- )
730+ self ._use_batched_experts = model_config .expert_batching
733731
734732 self ._expert_output_dim = model_config .expert_output_dim
735733
@@ -873,12 +871,17 @@ def _init_batched_experts(
873871 for name , snp_indices in expert_snp_indices .items ():
874872 n_snps = len (snp_indices )
875873 in_features = n_snps * data_dimensions .channels * data_dimensions .height
874+ if model_config .auto_scale_fc0_kernel :
875+ member_kernel = _get_auto_scaled_fc0_kernel (n_snps = n_snps )
876+ else :
877+ member_kernel = fc_0_kernel_size
876878 members .append (
877879 _ExpertBucketMember (
878880 name = name ,
879881 in_features = in_features ,
880882 n_snps = n_snps ,
881883 snp_indices = snp_indices ,
884+ fc_0_kernel = member_kernel ,
882885 )
883886 )
884887
@@ -899,8 +902,10 @@ def _init_batched_experts(
899902 padded_n_snps * data_dimensions .channels * data_dimensions .height
900903 )
901904
905+ group_kernel = group [0 ].fc_0_kernel
906+ assert all (m .fc_0_kernel == group_kernel for m in group )
902907 bucket_fc_0_kernel = _clamp_kernel_for_min_chunks (
903- kernel_size = fc_0_kernel_size ,
908+ kernel_size = group_kernel ,
904909 in_features = padded_in_features ,
905910 min_chunks = 4 ,
906911 min_kernel = 4 ,
@@ -959,6 +964,7 @@ def _init_batched_experts(
959964 self .expert_buckets .append (bucket )
960965
961966 bucket_sizes = [len (g ) for g in bucket_groups ]
967+ bucket_kernels = [g [0 ].fc_0_kernel for g in bucket_groups ]
962968 pad_waste = []
963969 for g in bucket_groups :
964970 min_snps = min (m .n_snps for m in g )
@@ -969,10 +975,11 @@ def _init_batched_experts(
969975 logger .info (
970976 "LCLInformedMoEModel: expert_batching enabled. "
971977 "%d experts grouped into %d buckets. "
972- "Bucket sizes: %s. Pad waste: %s." ,
978+ "Bucket sizes: %s. fc_0 kernels: %s. Pad waste: %s." ,
973979 len (members ),
974980 len (bucket_groups ),
975981 bucket_sizes ,
982+ bucket_kernels ,
976983 pad_waste ,
977984 )
978985
0 commit comments