Skip to content

Commit 71f9fd6

Browse files
Support auto scaling FC0 kernel in batched GLN MoE LCL approach.
1 parent 9c29c04 commit 71f9fd6

1 file changed

Lines changed: 28 additions & 21 deletions

File tree

src/eir/models/input/array/models_locally_connected.py

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

488489
def _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

Comments
 (0)