| | import logging |
| | from huggingface_hub import HfApi, create_repo, upload_folder |
| | from transformers import AutoConfig, AutoModelForCausalLM, PreTrainedModel |
| | from transformers.models.llama.modeling_llama import LlamaConfig, LlamaForCausalLM |
| | from torch import nn |
| |
|
| | |
| | from src.training.utils.quantization import BitLinear |
| | from src.training.utils.linear_to_bitlinear import replace_linears_in_hf |
| |
|
| | |
| |
|
| | class BitNetConfig(LlamaConfig): |
| | model_type = "bitnet" |
| |
|
| | def __init__(self, **kwargs): |
| | super().__init__(**kwargs) |
| |
|
| | class BitNetModel(PreTrainedModel): |
| | config_class = BitNetConfig |
| |
|
| | def __init__(self, config): |
| | super().__init__(config) |
| | self.model = LlamaForCausalLM(config) |
| |
|
| | def forward(self, *args, **kwargs): |
| | return self.model(*args, **kwargs) |
| |
|
| | |
| | AutoConfig.register("bitnet", BitNetConfig) |
| | AutoModelForCausalLM.register(BitNetConfig, BitNetModel) |
| |
|
| | def save_convert_and_push_model(trainer, output_path, huggingface_id, new_model_name, hf_token, convert_to_bitnet=False, do_push=True): |
| | """ |
| | Convierte el modelo a BitNet si se solicita, guarda el modelo y opcionalmente lo sube a Hugging Face Hub. |
| | |
| | Args: |
| | trainer: Trainer instance con el modelo ya entrenado. |
| | output_path: Ruta para guardar el modelo localmente. |
| | huggingface_id: ID del usuario u organizaci贸n en Hugging Face Hub. |
| | new_model_name: Nombre del nuevo modelo que se subir谩 al Hub. |
| | hf_token: Token de acceso para Hugging Face Hub. |
| | convert_to_bitnet (bool): Flag para decidir si se convierte a BitNet. |
| | do_push (bool): Flag para decidir si se hace push al Hugging Face Hub. |
| | |
| | Returns: |
| | None |
| | """ |
| | logger = logging.getLogger(__name__) |
| |
|
| | |
| | if convert_to_bitnet: |
| | logger.info("馃攧 Converting the model to BitNet architecture.") |
| | replace_linears_in_hf(trainer.model) |
| | output_dir = f"{output_path}/bitnet_model" |
| | else: |
| | output_dir = f"{output_path}/final_model" |
| |
|
| | |
| | logger.info(f"馃捑 Saving the model locally to {output_dir}.") |
| | trainer.model.save_pretrained(output_dir) |
| | trainer.tokenizer.save_pretrained(output_dir) |
| |
|
| | |
| | if do_push: |
| | logger.info("鈽侊笍 Uploading the model and tokenizer to Hugging Face Hub.") |
| | api = HfApi() |
| | create_repo( |
| | repo_id=f"{huggingface_id}/{new_model_name}", |
| | repo_type="model", |
| | exist_ok=True, |
| | token=hf_token, |
| | ) |
| | upload_folder( |
| | folder_path=output_dir, |
| | repo_type="model", |
| | repo_id=f"{huggingface_id}/{new_model_name}", |
| | token=hf_token, |
| | ) |
| |
|
| | |