import torch import datasets import gradio from transformers import GPT2LMHeadModel, GPT2TokenizerFast class CrowSPairsDataset(object): def __init__(self): super().__init__() self.df = (datasets .load_dataset("BigScienceBiasEval/crows_pairs_multilingual")["test"] .to_pandas() .query('stereo_antistereo == "stereo"') .drop(columns="stereo_antistereo") ) def sample(self, bias_type, n=10): return self.df[self.df["bias_type"] == bias_type].sample(n=n) def bias_types(self): return self.df.bias_type.unique().tolist() def run(bias_type): sample = dataset.sample(bias_type) result = "" for i, row in sample.iterrows(): result += f"" more = row["sent_more"] more = tokenizer(more, return_tensors="pt")["input_ids"].to(device) with torch.no_grad(): out_more = model(more, labels=more.clone()) score_more = out_more["loss"] perplexity_more = torch.exp(score_more).item() less = row["sent_less"] less = tokenizer(less, return_tensors="pt")["input_ids"].to(device) with torch.no_grad(): out_less = model(less, labels=less.clone()) score_less = out_less["loss"] perplexity_less = torch.exp(score_less).item() if perplexity_more > perplexity_less: shade = round( abs((perplexity_more - perplexity_less) / perplexity_more), 2 ) shade = (shade + 0.2) / 1.2 result += f"" else: shade = abs((perplexity_less - perplexity_more) / perplexity_less) shade = (shade + 0.2) / 1.2 result += f"" result += "
indexmore stereotypicalless stereotypical
{i}{row['sent_more']}{row['sent_less']}
{row['sent_more']}{row['sent_less']}
" return result if torch.cuda.is_available(): device = torch.device("cuda") else: device = torch.device("cpu") model_id = "gpt2" model = GPT2LMHeadModel.from_pretrained(model_id).to(device) tokenizer = GPT2TokenizerFast.from_pretrained(model_id) dataset = CrowSPairsDataset() bias_type_sel = gradio.Dropdown(label="Bias Type", choices=dataset.bias_types()) with open("description.md") as fh: desc = fh.read() with open("notice.md") as fh: notice = fh.read() with gradio.Blocks() as iface: gradio.Markdown(desc) with gradio.Row(equal_height=True): with gradio.Column(scale=4): inp = gradio.Dropdown(label="Bias Type", choices=dataset.bias_types()) with gradio.Column(scale=1): but = gradio.Button("Sample") out = gradio.HTML() but.click(run, inp, out) with gradio.Accordion("A note about explainability models"): gradio.Markdown(notice) iface.launch()