CoolFace
Modelpublic

aloksingh2130/Bloom-3B-Squad-v2

sourceHugging Faceupdated 3y agoView on Hugging Face
0likes4downloads
Model Card

Training procedure

Framework versions

  • —PEFT 0.6.0.dev0 Using LoRA to fine tune Bloom-3B model on Squad v2 dataset

How to use: Code below

!pip install -q bitsandbytes datasets accelerate loralib !pip install -q git+https://github.com/huggingface/peft.git git+https://github.com/huggingface/transformers.git

import torch torch.cuda.is_available()

import os os.environ["CUDAVISIBLEDEVICES"]="0" import torch import torch.nn as nn import bitsandbytes as bnb from transformers import AutoTokenizer, AutoConfig, AutoModelForCausalLM

model = AutoModelForCausalLM.frompretrained( "bigscience/bloom-3b", torchdtype=torch.float16, device_map='auto', )

tokenizer = AutoTokenizer.from_pretrained("bigscience/tokenizer")

print(model)

for param in model.parameters(): param.requires_grad = False # freeze the model - train adapters later if param.ndim == 1: # cast the small parameters (e.g. layernorm) to fp32 for stability param.data = param.data.to(torch.float32)

model.gradientcheckpointingenable() # reduce number of stored activations model.enableinputrequire_grads()

class CastOutputToFloat(nn.Sequential): def forward(self, x): return super().forward(x).to(torch.float32) model.lmhead = CastOutputToFloat(model.lmhead)

Helper Function

def printtrainableparameters(model): """ Prints the number of trainable parameters in the model. """ trainableparams = 0 allparam = 0 for , param in model.namedparameters(): allparam += param.numel() if param.requiresgrad: trainableparams += param.numel() print( f"trainable params: {trainableparams} || all params: {allparam} || trainable%: {100 * trainableparams / all_param}" )

from peft import LoraConfig, getpeftmodel

config = LoraConfig( r=8, loraalpha=16, targetmodules=["querykeyvalue"], loradropout=0.05, bias="none", tasktype="CAUSAL_LM" )

# r, the dimension of the low-rank matrices # loraalpha, scaling factor for the weight matrices # loradropout, dropout probability of the LoRA layers # bias, set to all to train all bias parameters

model = getpeftmodel(model, config) printtrainableparameters(model)

from datasets import loaddataset qadataset = loaddataset("squadv2")

def createprompt(context, question, answer): if len(answer["text"]) < 1: answer = "Cannot Find Answer" else: answer = answer["text"][0] prompttemplate = f"### CONTEXT\n{context}\n\n### QUESTION\n{question}\n\n### ANSWER\n{answer}</s>" return prompt_template

mappedqadataset = qadataset.map(lambda samples: tokenizer(createprompt(samples['context'], samples['question'], samples['answers'])))

torch.cuda.empty_cache()

Train MOdel on SQUAD DAtaset

import transformers

trainer = transformers.Trainer( # doc for parameter https://huggingface.co/docs/transformers/mainclasses/trainer model=model, traindataset=mappedqadataset["train"], evaldataset=mappedqadataset["validation"], args=transformers.TrainingArguments( perdevicetrainbatchsize=4, gradientaccumulationsteps=4, # evaluationstrategy="steps", # evalsteps=1000, warmupsteps=100, maxsteps=100, learningrate=2e-3, fp16=True, loggingsteps=1, outputdir='outputs', ), data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False) )

#Training Arguments

args = TrainingArguments(

output_dir = "/Content/mod",

evaluation_strategy = "epoch", #Can be epoch or steps

learning_rate=2e-5, #According to original bert paper

perdevicetrainbatchsize=32, #According to original bert paper

perdeviceevalbatchsize=32,

numtrainepochs=3, #should be inbetween 2-4 according to the paper

weight_decay=0.01,

predictionlossonly = True

)

For example if you use evaluationstrategy="steps" and evalsteps=2000 in the TrainingArguments,

you will get training and validation loss for every 2000 steps. If you wanna do it on an epoch level

\I think you need to set evaluationstrategy="epoch" and loggingstrategy="epoch" in the

TrainingArguments class.

model.config.use_cache = False # silence the warnings. Please re-enable for inference! trainer.train()

Push to HUB

HUGGINGFACEUSERNAME = "aloksingh2130" modelname = "Bloom-3B-Squad-v2" model.pushtohub(f"{HUGGINGFACEUSERNAME}/{modelname}", useauthtoken=True)