Я пытаюсь реализовать слияние моделей для T5-small, где хочу узнать коэффициенты слияния во время обучения. У меня есть эталонная реализация, которая работает для других моделей, но при ее адаптации для T5-small градиенты не перетекают в коэффициенты слияния.
вот ключевая часть эталонного кода:
Я пытаюсь реализовать слияние моделей для T5-small, где хочу узнать коэффициенты слияния во время обучения. У меня есть эталонная реализация, которая работает для других моделей, но при ее адаптации для T5-small градиенты не перетекают в коэффициенты слияния. вот ключевая часть эталонного кода: [code]class AdaMerging(torch.nn.Module): def __init__(self, paramslist, model, names, exam_datasets): super(AdaMerging, self).__init__() self.paramslist = paramslist self.model = model self.names = names self.pretrain_lambdas = torch.ones(len(paramslist[0]), 1) prior = 0.3 rlambdas = torch.ones(len(paramslist[0]), len(paramslist)-1) * prior # (1 * tasks) self.lambdas_raw = torch.nn.Parameter(rlambdas)
self.classifier = [] for dataset_name in exam_datasets: classification_head = get_classification_head(args, dataset_name) layer_name = 'classifier_{}'.format(dataset_name) self.add_module(layer_name, classification_head.to(args.device)) self.classifier.append(layer_name)
def get_image_encoder(self): alph = self.lambdas() params = tuple(sum(tuple(pi * lambdasi for pi, lambdasi in zip(p, alph[j].cpu()))) for j, p in enumerate(zip(*self.paramslist))) params = tuple(p.cuda(0) for p in params) load_weights(self.model, self.names, params) return self.model
def forward(self, inp, dataset_name): alph = self.lambdas() params = tuple(sum(tuple(pi * lambdasi for pi, lambdasi in zip(p, alph[j].cpu()))) for j, p in enumerate(zip(*self.paramslist)))
params = tuple(p.cuda(0) for p in params) load_weights(self.model, self.names, params) feature = self.model(inp)
layer_name = 'classifier_{}'.format(dataset_name) classification_head = getattr(self, layer_name) out = classification_head(feature) return out
... ... for epoch in range(epochs): losses = 0. for dataset_name in exam_datasets: dataset = get_dataset(dataset_name, pretrained_model.val_preprocess, location=args.data_location, batch_size=16) dataloader = get_dataloader_shuffle(dataset) for i, data in enumerate(tqdm.tqdm(dataloader)): data = maybe_dictionarize(data) x = data['images'].to(args.device) y = data['labels'].to(args.device)
outputs = adamerging(x, dataset_name) loss = softmax_entropy(outputs).mean(0) losses += loss optimizer.zero_grad() losses.backward() optimizer.step() [/code] Я использовал Cursor для генерации кода, но он не сработал — градиенты не распространялись: [code]class ModelMerging(nn.Module): def __init__(self, model, paramslist, names): super(ModelMerging, self).__init__() self.model = model self.names = names
assert all(p1.shape == p2.shape for p1, p2 in zip(paramslist[0], paramslist[1])), \ "Model parameters must have the same shapes"
state_dict = {name: param for name, param in zip(self.names, params)}
with torch.no_grad(): self.model.load_state_dict(state_dict)
outputs = self.model(**inputs)
if isinstance(outputs.loss, torch.Tensor): outputs.loss = outputs.loss.clone()
return outputs
... ... for epoch in range(NUM_EPOCHS): total_loss = 0 for step, batch in enumerate(train_dataloader): batch = {k: v.to(device) for k, v in batch.items()}
outputs = merged_model(**batch) loss = outputs.loss