Антон Гордон

Введение: 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 .

Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.