Don't reload model for the merge step;

This commit is contained in:
extio-de
2025-02-08 11:25:12 +01:00
parent a0e9a5a33a
commit f253fde344
3 changed files with 39 additions and 40 deletions

View File

@@ -1,9 +1,12 @@
import configparser import configparser
import torch import torch
from peft import PeftModel
from sympy.printing import str from sympy.printing import str
class Context: class Context:
model: PeftModel
accel: bool accel: bool
device: str device: str
purgeTargetDirectories: bool purgeTargetDirectories: bool

View File

@@ -7,15 +7,17 @@ class Merger:
def mergeAndStore(self, context: Context): def mergeAndStore(self, context: Context):
if not context.mergeFull: if not context.mergeFull:
return return
if not context.storeAdapter:
raise Exception("Configuration problem: mergeFull requires storeAdapter")
print("Reloading model") if not context.model:
baseModel = ModelLoader().load(context.locBaseModel, False, True, context) if not context.storeAdapter:
peftModel = PeftModel.from_pretrained(baseModel, context.locAdapter) raise Exception("Configuration problem: mergeFull requires storeAdapter")
print("Loading model")
baseModel = ModelLoader().load(context.locBaseModel, False, True, context)
context.model = PeftModel.from_pretrained(baseModel, context.locAdapter)
print("Merging") print("Merging")
mergedModel = peftModel.merge_and_unload() mergedModel = context.model.merge_and_unload()
print("Dequantize") print("Dequantize")
try: try:

View File

@@ -16,42 +16,36 @@ class Trainer:
baseModel = ModelLoader().load(context.locBaseModel, False, True, context) baseModel = ModelLoader().load(context.locBaseModel, False, True, context)
sftTrainer = self.__createTrainer(baseModel, context) sftTrainer = self.__createTrainer(baseModel, context)
try: context.model = sftTrainer.model
vInplace = context.validate and context.vInplace
validator = None
if vInplace:
validator = Validator()
try:
cnt = 0
continueTraining = True
while continueTraining:
cnt += 1
print(f"Training run {cnt}")
self.__train(sftTrainer)
if vInplace:
continueTraining = not validator.validateInPlace(sftTrainer.tokenizer, sftTrainer.model, context)
else:
continueTraining = False
print(f"Total training runs: {cnt} epochs {cnt * (context.trEpochs or 1)}")
finally:
if vInplace:
print(f"Validation statistics:\n{validator.statistics}")
validator.unload(context)
if context.storeAdapter:
self.__storeAdapter(sftTrainer, context)
vInplace = context.validate and context.vInplace
validator = None
if vInplace:
validator = Validator()
try:
cnt = 0
continueTraining = True
while continueTraining:
cnt += 1
print(f"Training run {cnt}")
self.__train(sftTrainer)
if vInplace:
continueTraining = not validator.validateInPlace(sftTrainer.tokenizer, sftTrainer.model, context)
else:
continueTraining = False
print(f"Total training runs: {cnt} epochs {cnt * (context.trEpochs or 1)}")
finally: finally:
del sftTrainer if vInplace:
del baseModel print(f"Validation statistics:\n{validator.statistics}")
gc.collect() validator.unload(context)
if context.accel:
torch.cuda.empty_cache() if context.storeAdapter:
self.__storeAdapter(sftTrainer, context)
def __createTrainer(self, baseModel, context: Context): def __createTrainer(self, baseModel, context: Context):
tokenizer = AutoTokenizer.from_pretrained( tokenizer = AutoTokenizer.from_pretrained(