Paper · 2022-12-03 · cs.LG, cs.CR, cs.CV, cs.DC
FedRolex: Model-Heterogeneous Federated Learning with Rolling Sub-Model Extraction
FedRolex lets clients with different capacities train sub-models cut from a larger server model. A window over each layer's nodes advances one node per round, so every server parameter is trained evenly. Updates are averaged per parameter over the clients that trained it. Author-reported: it beats other partial-training methods on CIFAR-10/100 and Stack Overflow.
Federated learningFederated aggregationModel-heterogeneous federated learningfederated-learningmodel-heterogeneitypartial-training
arXivPDFCodeMarkdown17 min read
AI-compiled by claude-haiku-5-5 on 2026-11-06, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
Federated learning trains one model across many devices without collecting their data. Those devices differ a lot: some are weak and cannot run the same network the server runs. Most methods make every device use the same model, which shuts out the weakest devices and keeps the shared model small.
FedRolex lets each device train a smaller slice of the server's model. The slice moves. Each round the window of parts it takes shifts along, so over time every part of the big server model gets trained on data from many devices. The server then averages each part using only the devices that trained it. The result is a server model larger than any single device could run, and, according to the authors' experiments, better accuracy than the other slicing methods.
TL;DR
- FedRolex is a partial-training method for federated learning with heterogeneous clients §3.2.
- Each client trains a sub-model cut from the server model. The cut is a window over each layer's nodes that advances one step per round, wrapping around §3.2 eq. 4.
- The server averages each parameter over the clients that updated it §3.2 eq. 10.
- Author-reported: beats HeteroFL and Federated Dropout on CIFAR-10/100 and Stack Overflow tab. 3; trains server models larger than the largest client §4.4 fig. 4.
- The paper has no convergence proof, and it does not cover deploying the trained server model to clients §5.
Problem
Most cross-device FL studies assume the server and every client run the same model §1. That excludes low-end clients and blocks large models on resource-limited devices §1.
Knowledge-distillation methods can handle different architectures, but they need public data for competitive accuracy and they send client models or outputs to the server, which conflicts with secure aggregation §1 §2.
Partial-training methods avoid both problems. Random extraction (Federated Dropout) and static extraction (HeteroFL, FjORD) pick the sub-model in a fixed or random way. Under those schemes, parts of the server model are trained unevenly, and some parts never see low-end clients' data §1 §2 §3.3.
Method
Setting §3.1. Each client n holds local data and trains a sub-model whose capacity is β_n. β_n is the fraction of nodes it keeps in each layer. The server model θ is split into client sub-models θ_n, and each client's loss uses its own θ_n eq. 3.
Rolling extraction §3.2. For layer i with K_i nodes, the server selects node indices for client n in round j by the window in eq. 4. The window starts at ĵ = j mod K_i and covers ⌊β_n K_i⌋ consecutive nodes, wrapping from K_i − 1 back to 0 eq. 4. The paper's illustration uses 5 nodes per layer: a large client keeps 4 and a small client keeps 3, over three rounds §3.2 fig. 1.
Server round §3.2 alg. 1.
- Sample a subset M of clients from N alg. 1.
- For each client m in M, extract its sub-model with the window of eq. 4 and broadcast it alg. 1.
- Each client runs local training on its data and returns its updated sub-model alg. 1.
- Aggregate per parameter with the selective average of eq. 10 §3.2 app. A.2.
Aggregation §3.2 app. A.2. A parameter's new value is the average of the client values for clients whose sub-model contains that parameter. Clients are not weighted: p_m is set to 1 (or 1/N), and the weights cancel app. A.2. A parameter that no client updated in the round stays unchanged §3.2.
Comparison with other extraction schemes §3.3. The paper compares the rolling window against random extraction §3.3.1 and static extraction §3.3.2. In the random scheme, each round selects a random set of nodes eq. 5. In the static scheme, the same leading block of nodes is always selected for a capacity eq. 6, and smaller clients' models are prefixes of larger ones §3.3.2 fig. 2.
Statistical argument §3.3.1 app. A.1. For random extraction, the expected number of rounds until every node is selected at least m times grows as I·log I + I(m−1)·log log I app. A.1. The paper then says the rolling scheme needs about m·I rounds §3.3.1. Its derivation for the rolling scheme is not in the visible source; only the random-scheme bound is derived.
Pseudocode. The first block restates the window of eq. 4 as a function. The second block is one server round alg. 1. The third block is the aggregation rule eq. 10. The client update is a plain gradient step on the extracted sub-model alg. 1.
# Rolling window of node indices for one layer [eq. 4]
# Input: round j; layer width K; capacity beta
# Output: list of selected node indices
def rolling_indices(j, K, beta):
# The window starts at j mod K and advances one node per round [eq. 4]
start = j % K
# Number of nodes this client keeps in the layer [§3.2] [eq. 4]
width = floor(beta * K)
# Consecutive nodes from start, wrapping past K back to 0 [eq. 4]
return [(start + t) % K for t in range(width)]# One server round [alg. 1]
# Input: global params theta; round j; participants M; capacities beta
# Output: updated global params theta
def server_round(theta, j, participants, beta):
# Each participant gets a sub-model cut with its own window [§3.2]
updates = []
for m in participants:
# Node indices for every layer of this client [eq. 4]
idx = {i: rolling_indices(j, K[i], beta[m]) for i in layers}
# Copy the selected slice of the global model to the client [alg. 1]
local = extract(theta, idx)
# Local training on the client's data [alg. 1]
local = client_train(local, data[m], lr)
updates.append((idx, local))
# Average each parameter over the clients that trained it [eq. 10]
return aggregate(theta, updates)# Selective averaging with equal client weights [eq. 10] [§3.2]
# Input: global params theta; list of (idx, local) pairs
# Output: updated global params theta
def aggregate(theta, updates):
# Visit every scalar parameter of the global model [app. A.2]
for each entry e in theta:
# Local values from clients whose window covers entry e [eq. 10]
senders = [local[e] for idx, local in updates if covers(idx, e)]
# Keep the old value when no client trained this entry [§3.2]
if senders:
theta[e] = mean(senders)
return theta# Local training on the extracted sub-model [alg. 1] [tab. 8]
# Algorithm 1 writes a per-sample step; Table 8 gives batch sizes.
# Input: local params; data; learning rate lr
# Output: trained local params
def client_train(local, data, lr):
# Table 8 uses 1 local epoch [tab. 8]
for batch in data:
# Gradient step on the batch loss [alg. 1]
local = local - lr * grad_loss(local, batch)
return localEquation 4, the window (full):
\mathcal{S}^{(j)}_{n,i} = \begin{cases} \{\hat j, \dots, \hat j + \lfloor \beta_n K_i \rfloor - 1\} & \text{if } \hat j + \lfloor \beta_n K_i \rfloor \le K_i, \\ \{\hat j, \dots, K_i - 1\} \cup \{0, \dots, \hat j + \lfloor \beta_n K_i \rfloor - 1 - K_i\} & \text{otherwise,} \end{cases} \qquad \hat j = j \bmod K_i eq. 4
Equation 10, the aggregation (full):
\theta_{[i,k]} = \frac{1}{\sum_{m \in \mathcal{M}_k} p_m} \sum_{m \in \mathcal{M}_k} p_m \, \theta_{m,[i,k]} eq. 10
Here M_k is the set of clients that updated parameter k of layer i app. A.2.
Architectures §4.
- Small regime: pre-activated ResNet-18 on CIFAR-10 and CIFAR-100. Batch normalization is replaced by static batch normalization, and a scalar module follows each convolution §4.
- Large regime: a 3-layer Transformer on Stack Overflow with a vocabulary of 10,000 words, token embedding size 128, feed-forward hidden size 2048, ReLU, 8 attention heads §4.
- Width levels for clients: β ∈ {1, 1/2, 1/4, 1/8, 1/16}. For ResNet-18 the number of convolution kernels is scaled. For the Transformer, the hidden width of the attention heads is scaled §4.
- Server model: same width as the largest client in the main comparison §4.1. In §4.4 the server is γ ∈ {2, 4, 8, 16} times the client width §4.4.
Data heterogeneity §4. On CIFAR-10 each client holds L = 2 labels (high heterogeneity) or L = 5 (low). On CIFAR-100, L = 20 or L = 50. These levels approximately match Dirichlet α = 0.1 and 0.5 §4. Stack Overflow is partitioned by user ID §4.
Participation §4. CIFAR: 100 clients, 10% (10 clients) per round. Stack Overflow: 342,477 clients, 200 per round per the text §4 (see Paper vs code).
Hyperparameters
Training settings for the FedRolex and partial-training rows of tab. 3 tab. 8:
| Name | Value | Where | Notes |
|---|---|---|---|
| Local epochs | 1 (all datasets) | tab. 8 | |
| Clients per round | 10 of 100 (CIFAR); 200 of 342,477 (Stack Overflow) | §4 tab. 8 | Code uses 50 for Stack Overflow; see Paper vs code |
| Batch size (train) | 10 (CIFAR-10), 24 (CIFAR-100), 24 (Stack Overflow) | tab. 8 | |
| Initial learning rate | 2e-4 (CIFAR-10), 1e-4 (CIFAR-100), 2e-4 (Stack Overflow) | tab. 8 | Warm-up not stated |
| Decay points (high heterogeneity) | CIFAR-10: rounds 800, 1500; CIFAR-100: 1000, 1500; Stack Overflow: 600, 800 | tab. 8 | Multi-step schedule |
| Decay points (low heterogeneity) | CIFAR-10: 800, 1250; CIFAR-100: 1000, 1500; Stack Overflow: 600, 800 | tab. 8 | |
| Decay factor | 0.1 | tab. 8 | Code uses 0.25 for CIFAR; see Paper vs code |
| Communication rounds (high heterogeneity) | CIFAR-10: 2500; CIFAR-100: 3500; Stack Overflow: 1200 | tab. 8 | |
| Communication rounds (low heterogeneity) | CIFAR-10: 2000; CIFAR-100: 3500; Stack Overflow: 1200 | tab. 8 | |
| Optimizer | SGD, momentum 0.9, weight decay 5e-4 | tab. 8 | Code uses 1e-3 for CIFAR; see Paper vs code |
| Augmentation (CIFAR) | Bounding-box crop | §4 | |
| Dropout (Stack Overflow) | 0.1 | §4 | |
| Seeds | 5 (CIFAR), 3 (Stack Overflow) | §4 | |
| Hardware | 8 NVIDIA A6000 GPUs; PyTorch and Ray | §4 |
Homogeneous baselines use different settings tab. 9:
| Name | CIFAR-10 | CIFAR-100 | Stack Overflow | Source |
|---|---|---|---|---|
| Local epochs | 1 | 1 | 1 | tab. 9 |
| Cohort size | 10 | 10 | 200 | tab. 9 |
| Batch size | 10 | 24 | 24 | tab. 9 |
| Initial learning rate | 2e-4 | 1e-4 | 2e-4 | tab. 9 |
| Decay points, high het. | 500, 1000 | 1000, 1500 | 300 | tab. 9 |
| Decay points, low het. | 500, 1000 | 1000, 1500 | 300 | tab. 9 |
| Decay factor | 0.1 | 0.1 | 0.1 | tab. 9 |
| Communication rounds, high het. | 1250 | 3500 | 1000 | tab. 9 |
| Communication rounds, low het. | 1500 | 3500 | 1000 | tab. 9 |
| Optimizer / momentum / weight decay | SGD / 0.9 / 5e-4 | SGD / 0.9 / 5e-4 | SGD / 0.9 / 5e-4 | tab. 9 |
Settings for the ρ sweep fig. 3 tab. 10 tab. 11: ρ is the share of large-capacity clients. For CIFAR-10 (high and low heterogeneity alike), decay points are 500 and 1000 with 1250 rounds for ρ ∈ {0.0, 0.1, 0.2, 0.8, 0.9, 1.0}, and 700 and 1200 with 1500 rounds for ρ ∈ {0.3, 0.4, 0.6, 0.7}. CIFAR-100 uses decay points 1000 and 1500 with 2000 rounds for all ρ. Stack Overflow uses decay point 800 and 1500 rounds for all ρ. Other values are as in tab. 8.
Settings for the server-size sweep fig. 4 tab. 12: decay points 800 and 1200 with 1500 rounds for CIFAR-10 and CIFAR-100 (both heterogeneity levels); Stack Overflow uses decay point 800 and 1500 rounds. The table gives only these values; batch size and client count are not stated there.
Settings for the emulated real-world distribution fig. 5 tab. 13: identical to tab. 8.
Client-capacity distribution for the real-world experiment fig. 7: the paper maps household income to capacity. The pie shares are 6, 10, 11, 18 and 55 (sum 100) for 1×, 1/2×, 1/4×, 1/8× and 1/16×. Income bands: 1/16× below $75,000; 1/8× $75,000–$100,000; 1/4× $100,000–$150,000; 1/2× $150,000–$200,000; 1× above $200,000 fig. 7.
Clients per round: 10% of 100 clients is ceil(0.1 · 100) = 10 config.yml main_resnet.py.
Results
Author-reported. All numbers are mean ± a spread the text does not define, from 5 seeds (CIFAR) or 3 seeds (Stack Overflow) §4. Global accuracy is the server model on the test set. Stack Overflow reports next-word accuracy, including OOV and end-of-sentence tokens §4.
Table 3 (global accuracy, tab. 3).
| Group | Method | CIFAR-10 high het. | CIFAR-100 high het. | CIFAR-10 low het. | CIFAR-100 low het. | Stack Overflow |
|---|---|---|---|---|---|---|
| KD-based | FedDF | 73.81 (±0.42) | 31.87 (±0.46) | 76.55 (±0.32) | 37.87 (±0.31) | N/A |
| KD-based | DS-FL | 65.27 (±0.53) | 29.12 (±0.51) | 68.44 (±0.47) | 33.56 (±0.55) | N/A |
| KD-based | Fed-ET | 78.66 (±0.31) | 35.78 (±0.45) | 81.13 (±0.28) | 41.58 (±0.36) | N/A |
| PT-based | HeteroFL | 63.90 (±2.74) | 52.38 (±0.80) | 73.19 (±1.71) | 57.44 (±0.42) | 27.21 (±0.22) |
| PT-based | Federated Dropout | 46.64 (±3.05) | 45.07 (±0.07) | 76.20 (±2.53) | 46.40 (±0.21) | 23.46 (±0.12) |
| PT-based | FedRolex | 69.44 (±1.50) | 56.57 (±0.15) | 84.45 (±0.36) | 58.73 (±0.33) | 29.22 (±0.24) |
| Homogeneous | smallest model | 38.82 (±0.88) | 12.69 (±0.50) | 46.86 (±0.54) | 19.70 (±0.34) | 27.32 (±0.12) |
| Homogeneous | largest model | 75.74 (±0.42) | 60.89 (±0.60) | 84.48 (±0.58) | 62.51 (±0.20) | 29.79 (±0.32) |
KD-based rows are copied from another paper tab. 3 note, not re-run here. The paper says KD results are not from identical settings §4.1.
Headline numbers §4.1 tab. 3: FedRolex beats both PT baselines in all columns. It is below FedDF and Fed-ET on CIFAR-10 high heterogeneity, and above all KD baselines on CIFAR-100. On Stack Overflow it is 29.22 vs. 29.79 for the largest homogeneous model tab. 3.
Table 4 (emulated real-world distribution, tab. 4).
| Dataset | Method | High het. local | High het. global | Low het. local | Low het. global |
|---|---|---|---|---|---|
| CIFAR-10 | Homogeneous (smallest) | 85.90 (±0.46) | 38.82 (±0.88) | 66.02 (±0.52) | 46.86 (±0.54) |
| CIFAR-10 | Homogeneous (largest) | 95.54 (±0.26) | 75.74 (±0.41) | 93.54 (±0.44) | 84.48 (±0.58) |
| CIFAR-10 | FedRolex | 94.05 (±1.01) | 63.17 (±1.45) | 91.03 (±0.36) | 80.14 (±0.52) |
| CIFAR-100 | Homogeneous (smallest) | 34.51 (±0.56) | 12.69 (±0.50) | 33.22 (±0.10) | 19.70 (±0.34) |
| CIFAR-100 | Homogeneous (largest) | 81.99 (±0.78) | 60.89 (±0.60) | 76.43 (±0.54) | 62.51 (±0.20) |
| CIFAR-100 | FedRolex | 73.33 (±0.96) | 45.78 (±1.71) | 66.31 (±0.34) | 48.44 (±0.51) |
| Stack Overflow is reported in one column only, as global accuracy under the emulated distribution: homogeneous smallest 27.32 (±0.12), homogeneous largest 29.79 (±0.32), FedRolex 29.55 (±0.41) tab. 4. |
The FedRolex low-heterogeneity CIFAR-10 global cell is missing an opening parenthesis in the source; the value is read as 80.14 (±0.52). Local accuracy is the server model on each client's local data §4.
Claims §4.5 fig. 5: FedRolex beats the smallest homogeneous model on global accuracy for all three datasets. On local accuracy it beats the smallest model on CIFAR-10 and CIFAR-100. The per-client distribution shift is shown in fig. 5 and described in words only.
Table 5 (client weighting ablation, high heterogeneity, tab. 5).
| Dataset | Weighting | Local accuracy | Global accuracy |
|---|---|---|---|
| CIFAR-10 | Non-weighting (used) | 95.95 (±0.81) | 69.44 (±1.50) |
| CIFAR-10 | Model-size based | 95.98 (±0.67) | 69.09 (±1.42) |
| CIFAR-10 | Model-update based | 96.01 (±0.71) | 68.83 (±0.89) |
| CIFAR-10 | Hybrid | 96.05 (±0.96) | 68.78 (±0.89) |
| CIFAR-100 | Non-weighting (used) | 81.58 (±0.59) | 56.57 (±0.15) |
| CIFAR-100 | Model-size based | 81.23 (±1.56) | 56.99 (±0.27) |
| CIFAR-100 | Model-update based | 81.23 (±1.07) | 56.63 (±0.36) |
| CIFAR-100 | Hybrid | 81.49 (±1.07) | 56.71 (±0.20) |
The paper finds no weighting scheme significantly better and keeps non-weighting app. A.3.
Table 6 (client participation, CIFAR-10, global accuracy, tab. 6).
| Method | 5% | 10% | 20% |
|---|---|---|---|
| HeteroFL | 48.43 (±1.78) | 63.90 (±2.74) | 65.07 (±2.17) |
| Federated Dropout | 42.06 (±1.29) | 46.64 (±3.05) | 55.20 (±4.64) |
| FedRolex | 57.90 (±2.72) | 69.44 (±1.50) | 71.85 (±1.22) |
Table 7 (per-client cost, tab. 7). Averages over participating clients per round app. A.6.
| Quantity | Homogeneous (largest) | FedRolex | Homogeneous (smallest) |
|---|---|---|---|
| Parameters per client (millions) | 11.1722 | 2.9781232 | 0.04451 |
| FLOPs per client (millions) | 557.656 | 149.048384 | 2.41318 |
| Model size per client (MB) | 42.62 | 11.36 | 0.17 |
Figures, described in words.
- fig. 3 (§4.3): global accuracy vs. ρ, the share of large-capacity clients (β = 1) against small ones (β = 1/16). On CIFAR-10 the gap between high and low heterogeneity stays large for ρ from 0.1 to 1. On CIFAR-100 the heterogeneity gap is much smaller, and the largest capacity is the bottleneck. On all three datasets a small share of large clients gives most of the gain, and more of them add little §4.3.
- fig. 4 (§4.4): global accuracy as γ (server/client width ratio) grows from 2 to 16. Accuracy drops for both FedRolex and Federated Dropout, mostly from γ = 1 to 4. FedRolex is higher than Federated Dropout at every γ on CIFAR-10 and CIFAR-100. On Stack Overflow the drop is much smaller.
- fig. 6 (app. A.4): effect of the overlap ratio r on accuracy; the effect is non-linear and inconsistent.
Paper vs code
Official repository: AIoT-MLSys-Lab/FedRolex, linked from the paper's abstract (arXiv metadata) README.md. Commit 813510997e1802eb756d53baa4229c90ce5ac008. License: Apache-2.0 (LICENSE file). The repo is built on HeteroFL README.md. I read the ResNet and Transformer servers, the client, the data settings, and the configs.
Differences:
-
Roll direction. Paper: the window starts at ĵ and moves forward, for example {a,b,c,d} → {b,c,d,e} §3.2 eq. 4 fig. 1. Code:
torch.rollwith a positive shift, so the start index is (−round) mod K and the window moves backwards resnet_server.py transformer_server.py. The set of nodes covered over time is the same, but the order differs from the paper's illustration. -
--overlappath is not the paper's scheme. The default (overlapunset, the README command) follows eq. 4 with the rollrounds % Kresnet_server.py README.md. When--overlap ris set, the code (a) uses a random permutation of the K nodes per layer resnet_server.py; (b) advances the offset by 1 + ⌊L(1−r)⌋ per round and takes it modulo the local width L, not K resnet_server.py; and (c) callsreshuffle_params()wheneverrounds % 512is non-zero, which is almost every round, and this also runs on the default path, where the permutation is unused resnet_server.py resnet_server.py. The reshuffle resets the offset to 0 resnet_server.py. So the offset never accumulates, and each round selects a fresh random set of nodes, closer to Federated Dropout than to eq. 4. This reading is from the source and was not executed. The paper's ablation app. A.4 describes r = 1 as FedRolex, but the code path for r is different. The paper does not say which path produced its reported numbers. -
CIFAR weight decay and decay factor. Paper: weight decay 5e-4 and decay factor 0.1 tab. 8. Code:
process_controlsets weight decay 1e-3 and decay factor 0.25 for CIFAR-10/100 utils.py utils.py. It runs after argument parsing, so the command line cannot override these values main_resnet.py main_resnet.py. Momentum 0.9 and SGD agree utils.py. -
Stack Overflow cohort. Paper: 200 clients per round §4 tab. 8. Code:
active_user = 50for Stack Overflow utils.py; the server uses it as the cohort size main_transformer.py. -
Learning rate, schedule and epochs. Paper: 2e-4 (CIFAR-10), 1e-4 (CIFAR-100), 2e-4 (Stack Overflow); decay points and round counts in tab. 8. Code defaults:
lr3e-4 and Adam inconfig.ymlconfig.yml, 200 epochs and milestones 100 and 150 config.yml. The CIFAR and Stack Overflow branches override the optimizer to SGD utils.py utils.py. The README example uses--lr 2e-4,--g_epoch 3200, and--schedule 1200, which match none of tab. 8 README.md. Use the flags to reproduce tab. 8; the defaults do not. -
Batch size. Paper: 10 (CIFAR-10), 24 (CIFAR-100 and Stack Overflow) tab. 8. Code agrees for CIFAR-10 (10) and Stack Overflow (24) utils.py utils.py. CIFAR-100 uses 10 in the code too utils.py; the paper says 24 tab. 8.
-
Masked classifier, not in the paper. The code masks the classifier output to the labels of each client during training (
maskis 1 in the control string), by setting other logits to 0 rather than −∞ resnet.py utils.py. For the linear layer, aggregation uses only the rows for the client's labels resnet_server.py resnet_server.py. The paper does not describe either step. -
Aggregation default. Code default
weighting = 'avg'main_resnet.py sets K = 1 resnet_server.py, so the average is an unweighted mean over the clients that updated each entry resnet_server.py. This matches eq. 10 with p_m = 1. Batch-norm and bias entries are multiplied by a running update count, which cancels within the average because all clients share the count per entry. No difference in effect. -
Transformer heads. Paper: 8 heads with 12-dimensional query, key and value vectors §4. Code: embedding 128 and 8 heads utils.py. The server splits the output width by 8 heads transformer_server.py, so each head gets 16 for width 128. The paper's 12 × 8 = 96 does not match 128 in the paper itself.
-
Client step. Algorithm 1 writes a plain per-sample step alg. 1. Table 8 gives batch sizes, and the code iterates over batches with
optimizer.step()resnet_client.py. -
Static batch norm. Paper: static batch normalization §4. Code:
BatchNorm2dwithtrack_running_stats=Falseby default resnet.py resnet.py. This matches the paper's "static" BN; see Pitfalls for the test-time effect. -
Not compared: FjORD, because its code was not open source §4 fn.. The paper says so.
Search steps: the paper's own link to the repository (step 1) was enough, so no GitHub search was run. No other repository was considered.
Pitfalls
- Use the flags for Table 8. The defaults in
config.yml(Adam, lr 3e-4, 200 epochs) are not the paper's settings. The CIFAR branch then overrides weight decay and decay factor (see Paper vs code 3), so the paper's CIFAR values cannot be set from the command line. - Overlap ablation is not FedRolex. If you implement the
--overlapidea, implement eq. 4 directly: take the window of nodes in a fixed order and advance it by a step. Do not use the code path described in Paper vs code 2. - Roll direction. If you match the paper's illustration (forward), use
(j + t) % K. If you match the code's order, use(−j + t) % K. The coverage over rounds is the same. - Static batch norm changes inference. With
track_running_stats=False, batch norm uses batch statistics even at test time resnet.py. Evaluate with batches that are representative, or plan a separate statistics step. The paper does not say how evaluation handled BN. - Masked classifier. The code masks the output layer to each client's labels during training and aggregates the linear layer per label (Paper vs code 7). The paper does not describe either step. To match the reported numbers, follow the code and mark this as a code-only detail.
- Participation count. Stack Overflow cohort: 200 in the paper, 50 in the code. Set it explicitly.
- Rolling statistics. The "rolling needs m·I rounds" claim in §3.3.1 has no visible derivation; only the random-scheme bound is derived in app. A.1. Do not rely on the rolling number without re-deriving it.
- Stated limits. The paper gives no full convergence analysis §5. It does not cover deploying a trained server model to devices of the lower capacities §5.
- ± is undefined. The visible text does not define the ± in the tables. A source comment says "mean and standard deviation", but that line is commented out §4.
- KD numbers are borrowed. FedDF, DS-FL and Fed-ET results come from Cho et al. tab. 3 note. Their settings are described as similar, not identical §4.1. Do not treat them as re-run baselines.
- Stack Overflow claim. The text says FedRolex is "on par" with the largest homogeneous model. The numbers are 29.22 and 29.79, with the uncertainty given in tab. 3.
- Communication and compute costs are client-side averages app. A.6. Server-side cost is not reported.
Lineage
- Builds on: partial training as in HeteroFL (static extraction) and Federated Dropout (random extraction), both cited in §2 §2. Named here without arXiv ids; this card uses no content from those papers.
- Compared against: FedDF, DS-FL and Fed-ET (knowledge distillation); HeteroFL and Federated Dropout (partial training); homogeneous FL at the smallest and largest client size §4 tab. 3.
- Related concurrent work named in the introduction: Federated Select §1.
Source and license
Adapted from “FedRolex: Model-Heterogeneous Federated Learning with Rolling Sub-Model Extraction” by Samiul Alam, Luyang Liu, Ming Yan, Mi Zhang (arXiv:2212.01548), used under CC BY-SA 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors. This page is licensed under CC BY-SA 4.0. Code citations refer to https://github.com/AIoT-MLSys-Lab/FedRolex at commit 813510997e18 (Apache-2.0). Any quoted code is shown under that license.