Обучение setfit с использованием фрейма данных pandas
Я хотел бы обучить классификатор нулевого выстрела на аннотированном выборочном наборе данных.
Я следую некоторым руководствам, но, поскольку все они используют свои собственные данные и одну и ту же заранее подготовленную модель, я пытаюсь подтвердить: это лучший подход?
Data example:
import pandas as pd
from datasets import Dataset
# Sample feedback data, it will have 8 samples per label
feedback_dict = [
{'text': 'The product is great and works well.', 'label': 'Product Performance'},
{'text': 'I love the design of the product.', 'label': 'Product Design'},
{'text': 'The product is difficult to use.', 'label': 'Usability'},
{'text': 'The customer service was very helpful.', 'label': 'Customer Service'},
{'text': 'The product was delivered on time.', 'label': 'Delivery Time'}
]
# Create a DataFrame with the feedback data
df = pd.DataFrame(feedback_dict)
# convert to Dataset format
df = Dataset.from_pandas(df)
Имея предыдущий формат данных, это подход для точной настройки модели:
from setfit import SetFitModel, SetFitTrainer
# Select a model
model = SetFitModel.from_pretrained("sentence-transformers/paraphrase-mpnet-base-v2")
# training with Setfit
trainer = SetFitTrainer(
model=model,
train_dataset=df, # to keep the code simple I do not create the df_train
eval_dataset=df, # to keep the code simple I do not create the df_eval
column_mapping={"text": "text", "label": "label"}
)
trainer.train()
Проблема здесь в том, что процесс никогда не заканчивается после более чем 500 часов работы на ноутбуке, а набор данных состоит всего из 88 записей с 11 метками.
2 ответа
Я попытался запустить пример, который вы разместили в Google Colab, на запуск обучения ушло 37 секунд.
Вот ваш код с некоторыми изменениями, чтобы он работал на Colab:
### Install libraries
%%capture
!pip install datasets setfit
После установки библиотек запустите следующий код:
### Import dataset
import pandas as pd
from datasets import Dataset
# Sample feedback data, it will have 8 samples per label
feedback_dict = [
{'text': 'The product is great and works well.', 'label': 'Product Performance'},
{'text': 'I love the design of the product.', 'label': 'Product Design'},
{'text': 'The product is difficult to use.', 'label': 'Usability'},
{'text': 'The customer service was very helpful.', 'label': 'Customer Service'},
{'text': 'The product was delivered on time.', 'label': 'Delivery Time'}
]
# Create a DataFrame with the feedback data
df = pd.DataFrame(feedback_dict)
# convert to Dataset format
df = Dataset.from_pandas(df)
### Run training
from setfit import SetFitModel, SetFitTrainer
# Select a model
model = SetFitModel.from_pretrained("sentence-transformers/paraphrase-mpnet-base-v2")
# training with Setfit
trainer = SetFitTrainer(
model=model,
train_dataset=df, # to keep the code simple I do not create the df_train
eval_dataset=df, # to keep the code simple I do not create the df_eval
column_mapping={"text": "text", "label": "label"}
)
trainer.train()
И, наконец, вы можете загрузить обученную модель на диск, а затем вручную загрузить ее на свой компьютер.
### Download model to drive
from google.colab import drive
drive.mount('/content/drive')
trainer.model._save_pretrained('/content/drive/path/to/target/folder')
Если ваша главная проблема — время тренировки, это должно решить проблему.
В вашем коде все в порядке, но вам нужна более мощная машина, возможно, с графическим процессором для обучения Трансформеров. Они не для бедных :-) Попробуйте Colab, Kaggle бесплатно или на частной виртуальной машине, если у вас есть возможность. Чтобы создать несколько эпох, требуется несколько секунд .
Я делюсь блокнотом Colab здесь , и вот как выглядят производительность и ресурсы:
Я бы посоветовал использовать бесплатные ноутбуки Kaggle с графическим процессором , которые медленнее, чем Colab (по моему опыту, примерно в 4 раза), но более щедры с точки зрения доступности и ограничений по времени. Вот также блокнот Kaggle для сравнения и игры.
Удачных тренировок на графическом процессоре!