Spaces:
Sleeping
Sleeping
import torch | |
from peft import PeftModel | |
from transformers import AutoModelForCausalLM, AutoTokenizer | |
from autotrain import logger | |
from autotrain.trainers.common import ALLOW_REMOTE_CODE | |
def merge_llm_adapter( | |
base_model_path, adapter_path, token, output_folder=None, pad_to_multiple_of=None, push_to_hub=False | |
): | |
""" | |
Merges a language model adapter into a base model and optionally saves or pushes the merged model. | |
Args: | |
base_model_path (str): Path to the base model. | |
adapter_path (str): Path to the adapter model. | |
token (str): Authentication token for accessing the models. | |
output_folder (str, optional): Directory to save the merged model. Defaults to None. | |
pad_to_multiple_of (int, optional): If specified, pad the token embeddings to a multiple of this value. Defaults to None. | |
push_to_hub (bool, optional): If True, push the merged model to the Hugging Face Hub. Defaults to False. | |
Raises: | |
ValueError: If neither `output_folder` nor `push_to_hub` is specified. | |
Returns: | |
None | |
""" | |
if output_folder is None and push_to_hub is False: | |
raise ValueError("You must specify either --output_folder or --push_to_hub") | |
logger.info("Loading adapter...") | |
base_model = AutoModelForCausalLM.from_pretrained( | |
base_model_path, | |
torch_dtype=torch.float16, | |
low_cpu_mem_usage=True, | |
trust_remote_code=ALLOW_REMOTE_CODE, | |
token=token, | |
) | |
tokenizer = AutoTokenizer.from_pretrained( | |
adapter_path, | |
trust_remote_code=ALLOW_REMOTE_CODE, | |
token=token, | |
) | |
if pad_to_multiple_of: | |
base_model.resize_token_embeddings(len(tokenizer), pad_to_multiple_of=pad_to_multiple_of) | |
else: | |
base_model.resize_token_embeddings(len(tokenizer)) | |
model = PeftModel.from_pretrained( | |
base_model, | |
adapter_path, | |
token=token, | |
) | |
model = model.merge_and_unload() | |
if output_folder is not None: | |
logger.info("Saving target model...") | |
model.save_pretrained(output_folder) | |
tokenizer.save_pretrained(output_folder) | |
logger.info(f"Model saved to {output_folder}") | |
if push_to_hub: | |
logger.info("Pushing model to Hugging Face Hub...") | |
model.push_to_hub(adapter_path) | |
tokenizer.push_to_hub(adapter_path) | |
logger.info(f"Model pushed to Hugging Face Hub as {adapter_path}") | |