Антон Гордон
Введение: OpenAI GPT-3 — это мощная языковая модель, которую можно точно настроить для различных задач обработки естественного языка (NLP), включая классификацию документов. В этой статье мы рассмотрим, как точно настроить GPT-3 для классификации документов с помощью библиотеки Transformers Hugging Face и развернуть ее на AWS Lambda с помощью Serverless Framework. Мы будем использовать набор данных 20 групп новостей, широко используемый в исследованиях НЛП, состоящий примерно из 20 000 сообщений групп новостей из 20 различных категорий.
Раздел 1: Настройка доступа к API OpenAI Для начала вам необходимо зарегистрироваться для доступа к API OpenAI и получить ключ API. Вы можете подписаться на ключ API на веб-сайте OpenAI. Получив ключ API, вы можете установить пакет OpenAI Python с помощью pip:
!pip install openai
Вам также потребуется установить библиотеку трансформеров от Hugging Face, которую мы будем использовать для тонкой настройки модели GPT-3:
!pip install transformers
Затем настройте учетные данные OpenAI API в среде Python:
import openai_secret_manager assert "openai" in openai_secret_manager.get_services() secrets = openai_secret_manager.get_secret("openai") # Authenticate with OpenAI import openai openai.api_key = secrets["api_key"]
Раздел 2. Подготовка данных для точной настройки
Перед точной настройкой модели GPT-3 нам необходимо подготовить данные. Мы будем использовать набор данных 20 групп новостей, который доступен в scikit-learn. Давайте загрузим набор данных и предварительно обработаем данные, удалив стоп-слова и объединив слова с помощью библиотеки nltk.
import numpy as np from sklearn.datasets import fetch_20newsgroups from nltk.corpus import stopwords from nltk.stem import SnowballStemmer # Load the dataset newsgroups_train = fetch_20newsgroups(subset='train') newsgroups_test = fetch_20newsgroups(subset='test') # Define the stop words and stemmer stop_words = set(stopwords.words('english')) stemmer = SnowballStemmer('english') # Preprocess the data def preprocess_text(text): # Remove punctuation and lowercase the text text = ''.join(c for c in text if c.isalnum() or c.isspace()) text = text.lower() # Remove stop words and stem the words words = [stemmer.stem(word) for word in text.split() if word not in stop_words] # Join the words back into a string return ' '.join(words) # Preprocess the train and test data X_train = [preprocess_text(text) for text in newsgroups_train.data] y_train = newsgroups_train.target X_test = [preprocess_text(text) for text in newsgroups_test.data] y_test = newsgroups_test.target
Раздел 3. Тонкая настройка GPT-3 для классификации документов
Теперь, когда у нас есть предварительно обработанные данные, мы можем точно настроить модель GPT-3 для классификации документов. Мы будем использовать модель GPT-3, предоставляемую API OpenAI и библиотекой трансформеров. Мы настроим модель, используя обучающие данные, и оценим ее производительность на тестовых данных.
# Set up the GPT-3 pipeline tokenizer = GPT2Tokenizer.from_pretrained("gpt2") model = pipeline("text-classification", model="text-babbage-001") # Convert the training data to a format that GPT-3 can use train_texts = [{"label": newsgroups_train.target_names[label], "text": text} for label, text in zip(y_train, X_train)] # Fine-tune the model on the training data model.train(train_texts, max_steps=1000) # Evaluate the model on the test data test_texts = [{"label": newsgroups_test.target_names[label], "text": text} for label, text in zip(y_test, X_test)] results = model.predict(test_texts) accuracy = np.mean([result["label"] == result["predicted_label"] for result in results]) print(f"Accuracy: {accuracy}")
Раздел 4: Сохранение настроенной модели
Настроив модель GPT-3 для классификации документов, мы можем сохранить ее, чтобы позже развернуть на AWS Lambda. Мы будем использовать библиотеку pickle
для сериализации модели и сохранения ее в файл.
import pickle # Save the fine-tuned model to a file with open("model.pkl", "wb") as f: pickle.dump(model.model, f)
Раздел 5. Развертывание модели на AWS Lambda
Теперь, когда наша настроенная модель GPT-3 сохранена в файле, мы можем развернуть ее на AWS Lambda с помощью Serverless Framework. Для этого нам потребуется учетная запись AWS и знакомство с Serverless Framework.
Во-первых, мы создадим новый проект Serverless Framework:
sls create --template aws-python3 --path my-service cd my-service
Далее установим необходимые зависимости:
npm init -y npm install --save-dev serverless-python-requirements
Нам также нужно добавить следующую конфигурацию в наш файл serverless.yml
:
service: my-service provider: name: aws runtime: python3.8 functions: classify: handler: handler.classify memorySize: 1024 timeout: 10 environment: MODEL_PATH: /var/task/model.pkl plugins: - serverless-python-requirements custom: pythonRequirements: dockerizePip: true
Эта конфигурация устанавливает новую функцию AWS Lambda с именем classify
, которая будет использовать функцию handler.classify
в качестве точки входа. Мы также указали размер памяти и время ожидания для функции и установили переменную среды MODEL_PATH
на путь, по которому будет храниться наш сериализованный файл модели.
Далее мы создадим файл handler.py
в корне нашего проекта (убедитесь, что у вас есть соответствующие права доступа и установите awscli):
import os import pickle import json import base64 def classify(event, context): # Load the model from the serialized file model_path = os.environ["MODEL_PATH"] with open(model_path, "rb") as f: model = pickle.load(f) # Extract the text from the event body = json.loads(event["body"]) text = base64.b64decode(body["text"]).decode() # Classify the text using the model result = model({"text": text}) # Return the result response = { "statusCode": 200, "headers": {"Content-Type": "application/json"}, "body": json.dumps(result) } return response
Этот код определяет новую функцию Python под названием classify
, которая принимает событие и контекст в качестве аргументов. Аргумент event
содержит информацию о входящем запросе, включая текст, который необходимо классифицировать. Загружаем модель из сериализованного файла с помощью библиотеки pickle
и извлекаем текст из события. Затем мы классифицируем текст с помощью объекта model
, загруженного из сериализованного файла, и возвращаем результат в виде строки в кодировке JSON.
Наконец, мы развернем функцию Lambda на AWS с помощью Serverless Framework:
sls deploy
Эта команда упакует и развернет функцию Lambda в AWS и выведет URL-адрес развернутой функции. Мы можем использовать этот URL-адрес для запросов к нашей развернутой функции, которая будет классифицировать входящий текст с помощью нашей тонко настроенной модели GPT-3.
В заключение мы увидели, как настроить модель GPT-3 для классификации документов с помощью Python и библиотеки Hugging Face Transformers. Затем мы сохранили сериализованную модель и развернули ее в AWS Lambda с помощью Serverless Framework. Это позволяет нам классифицировать документы в режиме реального времени, используя возможности GPT-3, не беспокоясь об управлении серверами или инфраструктурой.
Дополнительные материалы на PlainEnglish.io.
Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .
Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.