| """RoBERTa fine-tuned with LoRA (parameter-efficient) for intent classification.""" |
|
|
| from peft import LoraConfig, PeftModel, TaskType, get_peft_model |
| from transformers import AutoModelForSequenceClassification, AutoTokenizer, PreTrainedTokenizerBase |
|
|
| BASE_MODEL_NAME = "roberta-base" |
| MAX_LENGTH = 256 |
|
|
|
|
| def load_tokenizer() -> PreTrainedTokenizerBase: |
| return AutoTokenizer.from_pretrained(BASE_MODEL_NAME) |
|
|
|
|
| def tokenize_batch(batch: dict, tokenizer: PreTrainedTokenizerBase) -> dict: |
| return tokenizer(batch["text"], truncation=True, max_length=MAX_LENGTH) |
|
|
|
|
| def build_lora_roberta( |
| num_labels: int, |
| r: int = 32, |
| lora_alpha: int = 64, |
| lora_dropout: float = 0.05, |
| ) -> PeftModel: |
| """Wrap roberta-base for sequence classification with LoRA adapters on Q/K/V projections.""" |
| base_model = AutoModelForSequenceClassification.from_pretrained(BASE_MODEL_NAME, num_labels=num_labels) |
| lora_config = LoraConfig( |
| task_type=TaskType.SEQ_CLS, |
| r=r, |
| lora_alpha=lora_alpha, |
| lora_dropout=lora_dropout, |
| bias="none", |
| target_modules=["query", "key", "value"], |
| ) |
| return get_peft_model(base_model, lora_config) |
|
|