primary_app / app.py
kaitehtzeng's picture
Update app.py
c3ef27a verified
raw
history blame
6.86 kB
# -*- coding: utf-8 -*-
"""After model-fitting
Automatically generated by Colaboratory.
Original file is located at
https://colab.research.google.com/#fileId=https%3A//storage.googleapis.com/kaggle-colab-exported-notebooks/after-model-fitting-b220d687-d8e5-4eb5-aafd-6a7e94d72073.ipynb%3FX-Goog-Algorithm%3DGOOG4-RSA-SHA256%26X-Goog-Credential%3Dgcp-kaggle-com%2540kaggle-161607.iam.gserviceaccount.com/20240128/auto/storage/goog4_request%26X-Goog-Date%3D20240128T102031Z%26X-Goog-Expires%3D259200%26X-Goog-SignedHeaders%3Dhost%26X-Goog-Signature%3D31877cdd720f27bacaa0efcdbe500b0697792af355976ce5280054514cedfe1be4c17db45656212f46a080c0a7f0369fbd3d051fd9be4a1275e0ea4bd55be70f65a681f6868cda1616ea83b3c65a363b81d4f59b864aa1aa82188ce4bbfca0d326422ccfaf462a4a322a86e8d752e875e2c7940fde584e9a1f0e25847bb77ad8e0131724aaec47d49e4ab42a1d2be2199c9053a26a40f3bf2a31489822ec9bb6dd378bec74e97866da9613ee7c54c6ed2ce69eee5fe34ea90293cb546e4cb1f84b3fcc6563aea8318d70e68b71e43b6d85e04a20e01980dd0c94bb837aa81446d9ecfdad1d56cbc1c940670eba9cf9dc647a8972ac13c6af15a28da735db694f
"""
# IMPORTANT: RUN THIS CELL IN ORDER TO IMPORT YOUR KAGGLE DATA SOURCES
# TO THE CORRECT LOCATION (/kaggle/input) IN YOUR NOTEBOOK,
# THEN FEEL FREE TO DELETE THIS CELL.
# NOTE: THIS NOTEBOOK ENVIRONMENT DIFFERS FROM KAGGLE'S PYTHON
# ENVIRONMENT SO THERE MAY BE MISSING LIBRARIES USED BY YOUR
# NOTEBOOK.
import os
import sys
from tempfile import NamedTemporaryFile
from urllib.request import urlopen
from urllib.parse import unquote, urlparse
from urllib.error import HTTPError
from zipfile import ZipFile
import tarfile
import shutil
# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
# Input data files are available in the read-only "../input/" directory
# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory
# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using "Save & Run All"
# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session
"""## Import Necessary Library"""
import subprocess
subprocess.run(['pip', 'install', 'transformer'])
from transformers import AutoModel
from transformers import AutoTokenizer
subprocess.run(['pip', 'install', 'tokenizers'])
from tokenizers import Tokenizer, trainers, pre_tokenizers, models
from transformers import DebertaTokenizer
from sklearn.model_selection import train_test_split
import torch
import torch.nn as nn
import numpy as np
import pandas as pd
#import spacy
import re
import gc
# ----------
import os
config = {
'model': 'microsoft/deberta-v3-base',
'dropout': 0.2,
'max_length': 512,
'batch_size':3,
'epochs': 1,
'lr': 1e-5,
'device': 'cpu',
'scheduler': 'CosineAnnealingWarmRestarts'
}
"""### Preparation
Comparing two essays. <br>
One predicted written by students, one predicted written by LLM
"""
train_essays = pd.read_csv("train_essays.csv")
import transformers
print('transformers version:', transformers.__version__)
#train_df,val_df = train_test_split(train_essays,test_size=0.2,random_state = 101)
#train_df, val_df = train_df.reset_index(), val_df.reset_index()
#print('dataframe shapes:',train_df.shape, val_df.shape)
tokenizer = AutoTokenizer.from_pretrained(config['model'])
tokenizer.train_new_from_iterator(train_essays['text'], 52000)
"""Build the Model"""
class mymodel(nn.Module):
def __init__(self,config):
super(mymodel,self).__init__()
self.model_name = config['model']
self.deberta = AutoModel.from_pretrained(self.model_name)
#128001 = len(tokenizer)
self.deberta.resize_token_embeddings(128001)
self.dropout = nn.Dropout(config['dropout'])
self.fn0 = nn.Linear(self.deberta.config.hidden_size,256)
self.fn2 = nn.Linear(256,1)
self.pooling = MeanPooling()
def forward(self, input):
output = self.deberta(**input,return_dict = True)
output = self.pooling(output['last_hidden_state'],input['attention_mask'])
output = self.dropout(output)
output = self.fn0(output)
output = self.dropout(output)
output = self.fn2(output)
output = torch.sigmoid(output)
return output
import torch.nn as nn
class MeanPooling(nn.Module):
def __init__(self):
super(MeanPooling,self).__init__()
def forward(self,last_hidden_state, attention_mask):
new_weight = attention_mask.unsqueeze(-1).expand(last_hidden_state.size()).float()
final = torch.sum(new_weight*last_hidden_state,1)
total_weight = new_weight.sum(1)
total_weight = torch.clamp(total_weight, min = 1e-9)
mean_embedding = final/total_weight
return mean_embedding
model = mymodel(config)
model.load_state_dict(torch.load('my_model.pth',map_location=torch.device('cpu') ))
model.eval()
#preds = []
#for (inputs) in eval_loader:
# inputs = {k:inputs[k].to(device=config['device']) for k in inputs.keys()}
#
# outputs = model(inputs)
# preds.append(outputs.detach().cpu())
#preds = torch.concat(preds)
#val_df['preds'] = preds.numpy()
#val_df['AI'] = val_df['preds']>0.5
#sample_predict_AI = val_df.loc[val_df['AI'] == True].iloc[0]['text']
#sample_predict_student = val_df.loc[val_df['AI'] == False].iloc[0]['text']
#sample_predict_AI
#sample_predict_student
def trial(text):
tokenized = tokenizer.encode_plus(text,
None,
add_special_tokens=True,
max_length= config['max_length'],
truncation=True,
padding="max_length"
)
inputs = {
"input_ids": torch.tensor(tokenized['input_ids'],dtype=torch.long),
"token_type_ids": torch.tensor(tokenized['token_type_ids'],dtype=torch.long),
"attention_mask": torch.tensor(tokenized['attention_mask'],dtype = torch.long)
}
inputs = {k:inputs[k].unsqueeze(0) for k in inputs.keys()}
if model(inputs).item()>=0.5:
return "AI"
else:
return "Student"
import subprocess
# Use subprocess to run the pip install command
subprocess.run(['pip', 'install', '-q', 'gradio==3.45.0'])
import gradio as gr
demo = gr.Interface(
fn=trial,
inputs=gr.Textbox(placeholder="..."),
outputs="textbox"
)
demo.launch(share=True)