|
--- |
|
license: apache-2.0 |
|
datasets: |
|
- imdb |
|
language: |
|
- en |
|
metrics: |
|
- f1 |
|
- accuracy |
|
- recall |
|
- precision |
|
library_name: peft |
|
--- |
|
# A Finetuned Bloom 1b1 Model for Sequence Classification |
|
|
|
<!-- Provide a quick summary of what the model is/does. --> |
|
|
|
The model was developed as a personal learning experience to fine tune a ready language model for Text Classification and to use it |
|
on real life data from the internet to perform sentiment analysis. |
|
|
|
It has been generated using [this raw template](https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/templates/modelcard_template.md?plain=1). |
|
|
|
## Model Details |
|
|
|
The model achieves the following scores on the evaluation set during the fine tuning: |
|
|
|
![Screenshot 2024-01-03 at 16.08.46.png](https://cdn-uploads.huggingface.co/production/uploads/64857e2b745fb671250a5beb/26EB2jJDKI0gsnvjHA9WP.png) |
|
|
|
Here is the train/ eval/ test split: |
|
|
|
``` |
|
DatasetDict({ |
|
train: Dataset({ |
|
features: ['review', 'sentiment'], |
|
num_rows: 36000 |
|
}) |
|
test: Dataset({ |
|
features: ['review', 'sentiment'], |
|
num_rows: 5000 |
|
}) |
|
eval: Dataset({ |
|
features: ['review', 'sentiment'], |
|
num_rows: 9000 |
|
}) |
|
}) |
|
``` |
|
|
|
### Model Description |
|
|
|
<!-- Provide a longer summary of what this model is. --> |
|
|
|
|
|
|
|
- **Developed by:** Snoop088 |
|
- **Model type:** Text Classification / Sequence Classification |
|
- **Language(s) (NLP):** English |
|
- **License:** Apache 2.0 |
|
- **Finetuned from model: bigscience/bloom-1b1 |
|
|
|
### Model Sources [optional] |
|
|
|
<!-- Provide the basic links for the model. --> |
|
|
|
- **Repository:** https://huggingface.co/snoop088/imdb_tuned-bloom1b1-sentiment-classifier/tree/main |
|
- **Paper [optional]:** [More Information Needed] |
|
- **Demo [optional]:** [More Information Needed] |
|
|
|
## Uses |
|
|
|
The model is intended to be used for Text Classification. |
|
|
|
### Direct Use |
|
|
|
Example script to use the model. Please note that this is peft adapter on the Bloom 1b model: |
|
|
|
``` |
|
DEVICE = "cuda:0" if torch.cuda.is_available() else "cpu" |
|
model_name = 'snoop088/imdb_tuned-bloom1b1-sentiment-classifier' |
|
loaded_model = AutoModelForSequenceClassification.from_pretrained(model_name, |
|
trust_remote_code=True, |
|
num_labels=2, |
|
device_map="auto") |
|
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) |
|
tokenizer.pad_token = tokenizer.eos_token |
|
|
|
my_set = pd.read_csv("./data/df_manual.csv") |
|
|
|
inputs = tokenizer(list(my_set["review"]), truncation=True, padding="max_length", max_length=256, return_tensors="pt").to(DEVICE) |
|
outputs = loaded_model(**inputs) |
|
outcome = np.argmax(torch.Tensor.cpu(outputs.logits), axis=-1) |
|
|
|
``` |
|
|
|
[More Information Needed] |
|
|
|
### Downstream Use [optional] |
|
|
|
The purpose of this model is to be used to perform sentiment analysis on a dataset similar to the one by IMDB. It should work well on product reviews, too in my opinion. |
|
|
|
|
|
[More Information Needed] |
|
|
|
### Out-of-Scope Use |
|
|
|
<!-- This section addresses misuse, malicious use, and uses that the model will not work well for. --> |
|
|
|
[More Information Needed] |
|
|
|
## Bias, Risks, and Limitations |
|
|
|
<!-- This section is meant to convey both technical and sociotechnical limitations. --> |
|
|
|
[More Information Needed] |
|
|
|
### Recommendations |
|
|
|
<!-- This section is meant to convey recommendations with respect to the bias, risk, and technical limitations. --> |
|
|
|
Users (both direct and downstream) should be made aware of the risks, biases and limitations of the model. More information needed for further recommendations. |
|
|
|
## How to Get Started with the Model |
|
|
|
Use the code below to get started with the model. |
|
|
|
[More Information Needed] |
|
|
|
## Training Details |
|
|
|
### Training Data |
|
|
|
<!-- This should link to a Dataset Card, perhaps with a short stub of information on what the training data is all about as well as documentation related to data pre-processing or additional filtering. --> |
|
|
|
Training is done on the IMDB dataset available on the Hub: |
|
|
|
[imdb](https://huggingface.co/datasets/imdb) |
|
|
|
[More Information Needed] |
|
|
|
### Training Procedure |
|
|
|
``` |
|
training_arguments = TrainingArguments( |
|
output_dir="your_tuned_model_name", |
|
save_strategy="epoch", |
|
per_device_train_batch_size=4, |
|
per_device_eval_batch_size=4, |
|
gradient_accumulation_steps=4, |
|
optim="adamw_torch", |
|
evaluation_strategy="steps", |
|
logging_steps=5, |
|
learning_rate=1e-5, |
|
max_grad_norm = 0.3, |
|
eval_steps=0.2, |
|
num_train_epochs=2, |
|
warmup_ratio= 0.1, |
|
# group_by_length=True, |
|
fp16=False, |
|
weight_decay=0.001, |
|
lr_scheduler_type="constant", |
|
) |
|
|
|
peft_model = get_peft_model(model, LoraConfig( |
|
task_type="SEQ_CLS", |
|
r=16, |
|
lora_alpha=16, |
|
target_modules=[ |
|
'query_key_value', |
|
'dense' |
|
], |
|
bias="none", |
|
lora_dropout=0.05, # Conventional |
|
)) |
|
|
|
``` |
|
LORA results in: trainable params: 3,542,016 || all params: 1,068,859,392 || trainable%: 0.3313827830405592 |
|
|
|
<!-- This relates heavily to the Technical Specifications. Content here should link to that section when it is relevant to the training procedure. --> |
|
|
|
#### Preprocessing [optional] |
|
|
|
Simple preprocessing with DataCollator: |
|
|
|
``` |
|
def process_data(example): |
|
item = tokenizer(example["review"], truncation=True, max_length=320) # see if this is OK for dyn padding |
|
item["labels"] = [ 1 if sent == 'positive' else 0 for sent in example["sentiment"]] |
|
return item |
|
|
|
tokenised_data = tokenised_data.remove_columns(["review", "sentiment"]) |
|
data_collator = DataCollatorWithPadding(tokenizer=tokenizer) |
|
``` |
|
|
|
|
|
#### Training Hyperparameters |
|
|
|
- **Training regime:** [More Information Needed] <!--fp32, fp16 mixed precision, bf16 mixed precision, bf16 non-mixed precision, fp16 non-mixed precision, fp8 mixed precision --> |
|
|
|
#### Speeds, Sizes, Times [optional] |
|
|
|
<!-- This section provides information about throughput, start/end time, checkpoint size if relevant, etc. --> |
|
|
|
[More Information Needed] |
|
|
|
## Evaluation |
|
|
|
<!-- This section describes the evaluation protocols and provides the results. --> |
|
Evaluation function: |
|
``` |
|
import evaluate |
|
|
|
def compute_metrics(eval_pred): |
|
# All metrics are already predefined in the HF `evaluate` package |
|
precision_metric = evaluate.load("precision") |
|
recall_metric = evaluate.load("recall") |
|
f1_metric= evaluate.load("f1") |
|
accuracy_metric = evaluate.load("accuracy") |
|
|
|
logits, labels = eval_pred # eval_pred is the tuple of predictions and labels returned by the model |
|
predictions = np.argmax(logits, axis=-1) |
|
precision = precision_metric.compute(predictions=predictions, references=labels)["precision"] |
|
recall = recall_metric.compute(predictions=predictions, references=labels)["recall"] |
|
f1 = f1_metric.compute(predictions=predictions, references=labels)["f1"] |
|
accuracy = accuracy_metric.compute(predictions=predictions, references=labels)["accuracy"] |
|
# The trainer is expecting a dictionary where the keys are the metrics names and the values are the scores. |
|
return {"precision": precision, "recall": recall, "f1-score": f1, 'accuracy': accuracy} |
|
|
|
``` |
|
|
|
### Testing Data, Factors & Metrics |
|
|
|
#### Testing Data |
|
|
|
<!-- This should link to a Dataset Card if possible. --> |
|
|
|
[More Information Needed] |
|
|
|
#### Factors |
|
|
|
<!-- These are the things the evaluation is disaggregating by, e.g., subpopulations or domains. --> |
|
|
|
[More Information Needed] |
|
|
|
#### Metrics |
|
|
|
<!-- These are the evaluation metrics being used, ideally with a description of why. --> |
|
|
|
[More Information Needed] |
|
|
|
### Results |
|
|
|
[More Information Needed] |
|
|
|
#### Summary |
|
|
|
|
|
|
|
## Model Examination [optional] |
|
|
|
<!-- Relevant interpretability work for the model goes here --> |
|
|
|
[More Information Needed] |
|
|
|
## Environmental Impact |
|
|
|
<!-- Total emissions (in grams of CO2eq) and additional considerations, such as electricity usage, go here. Edit the suggested text below accordingly --> |
|
|
|
Carbon emissions can be estimated using the [Machine Learning Impact calculator](https://mlco2.github.io/impact#compute) presented in [Lacoste et al. (2019)](https://arxiv.org/abs/1910.09700). |
|
|
|
- **Hardware Type:** [More Information Needed] |
|
- **Hours used:** [More Information Needed] |
|
- **Cloud Provider:** [More Information Needed] |
|
- **Compute Region:** [More Information Needed] |
|
- **Carbon Emitted:** [More Information Needed] |
|
|
|
## Technical Specifications [optional] |
|
|
|
### Model Architecture and Objective |
|
|
|
[More Information Needed] |
|
|
|
### Compute Infrastructure |
|
|
|
[More Information Needed] |
|
|
|
#### Hardware |
|
|
|
- Model: 6.183.1 "13th Gen Intel(R) Core(TM) i9-13900K" |
|
- GPU: Nvidia RTX 4900/ 24 GB |
|
- Memory: 64 GB |
|
|
|
#### Software |
|
|
|
- python 3.11.6 |
|
- transformers 4.36.2 |
|
- torch 2.1.2 |
|
- peft 0.7.1 |
|
- numpy 1.26.2 |
|
- datasets 2.16.0 |
|
|
|
## Citation [optional] |
|
|
|
<!-- If there is a paper or blog post introducing the model, the APA and Bibtex information for that should go in this section. --> |
|
|
|
**BibTeX:** |
|
|
|
[More Information Needed] |
|
|
|
**APA:** |
|
|
|
[More Information Needed] |
|
|
|
## Glossary [optional] |
|
|
|
<!-- If relevant, include terms and calculations in this section that can help readers understand the model or model card. --> |
|
|
|
[More Information Needed] |
|
|
|
## More Information [optional] |
|
|
|
[More Information Needed] |
|
|
|
## Model Card Authors [optional] |
|
|
|
[More Information Needed] |
|
|
|
## Model Card Contact |
|
|
|
[More Information Needed] |
|
|
|
|
|
|