Модель HuggingFace FinBert в Google Collab

Когда я запускаю свою модель FinBert, она всегда приводит к сбою оперативной памяти в Google Collab на выходе = модель (** ввод)

      from transformers.utils.dummy_pt_objects import HubertModel
import textwrap
# Reads all files at once but you will have to upload it again
import pandas as pd
import glob
import numpy as np
import torch


all_files = glob.glob("*.csv")
tickerList = []
textList = []
model.eval()
for filename in all_files:
    # Get ticker symbol
    ticker = filename.split('_', 1)[0].replace('.', '').upper()
    #Read file into dataframe
    df = pd.read_csv(filename)
    headlines_array = np.array(df)
    # Data fram will not be a list of text for tokenizer to process
    text = list(headlines_array[:,0])
    textList.append(text)
    #Checks if we have seen this ticker before 
    if ticker not in tickerList:
      tickerList.append(ticker)

#Gets data to be an acceptable format for our model
    inputs = tokenizer(text, padding = True, truncation = True, return_tensors='pt')
    outputs = model(**inputs)  #time consuming and crashes RAM so can't up int for loop
    predictions = torch.nn.functional.softmax(outputs.logits, dim=-1)

    positive = predictions[:, 0].tolist()
    negative = predictions[:, 1].tolist()
    neutral = predictions[:, 2].tolist()

    table = {'Headline': text,
         'Ticker' : ticker,
         "Positive":positive,
         "Negative":negative, 
         "Neutral":neutral}

    df = pd.DataFrame(table, columns = ["Headline", "Ticker", "Positive", "Negative", "Neutral"])
    final_table = wandb.Table(columns=["Sentence", "Ticker", "Positive", "Negative", "Neutral"])

    for headline, pos, neg, neutr in zip(text, predictions[:, 0].tolist(), predictions[:, 1].tolist(), predictions[:, 2].tolist() ): 
      final_table.add_data(headline, ticker, pos, neg, neutr)

Не совсем уверен, что происходит не так, поскольку outputs = model(**input) отлично работает вне цикла for, но, кажется, не запускается ни разу, когда я ввожу его в цикл for.

1 ответ

Вы делаете

text = list(headlines_array[:,0])

а потом,

inputs = tokenizer(text, padding = True, truncation = True, return_tensors='pt')

Следовательно, вы даете токенизатору список текста. Он вернет вам тензор для каждого элемента в вашем headlines_array. Если вы не дадите его партиями, модель рассчитает все прогнозы сразу. Это может вызвать проблемы с памятью.

Вы можете сделать что-то вроде:

      def chunks(lst, n):
    """Yield successive n-sized chunks from list."""
    for i in range(0, len(lst), n):
        yield lst[i:i + n]

batch_size = 16
for batch in chunks(text, batch_size):
    inputs = tokenizer(batch, padding = True, truncation = True, return_tensors='pt')

А затем продолжите с остальной частью вашего кода.

Обратите внимание chunksфункция из Как разбить список на куски одинакового размера?

Другие вопросы по тегам