I got the IndexError: list index out of range on FedPAC when training on 30 clients with join rate 0.5 on some dataset with 0.1 Dirichlet parameter.
Regarding these 2 functions in FedPAC server
def receive_models(self):
assert (len(self.selected_clients) > 0)
active_clients = random.sample(
self.selected_clients, int((1-self.client_drop_rate) * self.current_num_join_clients))
self.uploaded_ids = []
self.uploaded_weights = []
self.uploaded_models = []
self.uploaded_heads = []
tot_samples = 0
for client in active_clients:
try:
client_time_cost = client.train_time_cost['total_cost'] / client.train_time_cost['num_rounds'] + \
client.send_time_cost['total_cost'] / client.send_time_cost['num_rounds']
except ZeroDivisionError:
client_time_cost = 0
if client_time_cost <= self.time_threthold:
tot_samples += client.train_samples
self.uploaded_ids.append(client.id)
self.uploaded_weights.append(client.train_samples)
self.uploaded_models.append(client.model.base)
self.uploaded_heads.append(client.model.head)
for i, w in enumerate(self.uploaded_weights):
self.uploaded_weights[i] = w / tot_samples
def aggregate_and_send_heads(self):
head_weights = solve_quadratic(len(self.uploaded_ids), self.Vars, self.Hs)
for idx, cid in enumerate(self.uploaded_ids):
print('(Client {}) Weights of Classifier Head'.format(cid))
print(head_weights[idx],'\n')
if head_weights[idx] is not None:
new_head = self.add_heads(head_weights[idx])
else:
new_head = self.uploaded_heads[cid]
self.clients[cid].set_head(new_head)
if the head_weights[idx] is None, it is impossible to obtain the new_head using self.uploaded_heads[cid] (In my case, with join rate 0.5)
Here, cid is a client ID, not the position in the list.
That means you're treating uploaded_heads like a dictionary, but it's actually a list?
I got the IndexError: list index out of range on FedPAC when training on 30 clients with join rate 0.5 on some dataset with 0.1 Dirichlet parameter.
Regarding these 2 functions in FedPAC server
if the head_weights[idx] is None, it is impossible to obtain the new_head using self.uploaded_heads[cid] (In my case, with join rate 0.5)
Here, cid is a client ID, not the position in the list.
That means you're treating uploaded_heads like a dictionary, but it's actually a list?