Узнайте, как реализовать проекты LLM с помощью Snowflake

Введение

Стоит ли упоминать, что «большие языковые модели» — это термин, который в последнее время набирает популярность в сфере технологий? LLM относится к нейронной сети, которая может обучаться на больших объемах текстовых данных и генерировать выходные данные на естественном языке. LLM использовались для обобщения текста, перевода текста, генерации текста и диалоговых агентов.

Недавний прорыв, без всякого сомнения, обусловлен фантастической производительностью Chat-GPT компании Openai. С тех пор компании начали верить в невероятный потенциал обработки и генерации языков с помощью искусственного интеллекта.

Однако, несмотря на шумиху вокруг LLM, большинство людей все еще не понимают, что нужно сделать для реализации простых вариантов использования, таких как анализ настроений, классификация текста или даже более привлекательная автоматическая генерация текста. Прежде всего, когда дело доходит до того, чтобы сделать это в экосистеме Snowflake, это добавляет в уравнение немного недоумения.

В Infostrux мы стремимся построить машинное обучение и возможности MLOps на основе технологии облачных баз данных Snowflake. Если вы хотите узнать больше о работе Infostrux и наших услугах, посетите наш сайт и другие публикации в нашем блоге здесь.

В этом уроке мы быстро рассмотрим некоторые концепции LLM; затем мы выполним шаги, необходимые для получения пользовательских функций Snowlake, которые мы можем использовать для вывода LLM.

Что мы будем делать ?

Мы будем

  1. Импортируйте и сериализуйте модели машинного обучения huggingface.
  2. Зарегистрируйте их в учетной записи Snowflake как функции, используемые для вывода.
  3. Выполните вывод на выборке данных

Перед этим мы подготовим среду нашей снежинки:

  1. Создать сцену
  2. Заполнение таблиц примерами данных

Как будет выглядеть результат?

У нас будет что-то вроде

SELECT generate_text(field) 
from table

Результатом будет список записей, содержащих выходные данные функции нарушения (в данном примере —generate_text).

Что мы будем использовать?

Обнимающее лицо и библиотека трансформеров

Чтобы обучить большую языковую модель с помощью Chat-GPT или BERT, необходимо собрать, подготовить и обработать огромное количество текстовых данных и предоставить необходимые ресурсы и время для обработки. Это означает огромные усилия и ресурсы для одного прохождения обучения и для последующих (и углеродный след, если хотите).

К счастью, можно повторно использовать предварительно обученную модель. Huggingface.co 🤗 — это огромный репозиторий предварительно обученных моделей машинного обучения и сопутствующих сервисов.

Нас интересует использование библиотеки Transformers от Huggingface. Трансформеры предоставляют доступ к широкому спектру функций больших языковых моделей.

Кстати, я настоятельно рекомендую прочитать объяснение моделей, контрольных точек и архитектуры, если вы не знакомы с этими понятиями. В этом уроке мы будем использовать один термин — модель, но чтобы понять, почему мы можем использовать анализ настроений либо с помощью distilbert-base-uncased-finetuned-sst-2-English, либо просто с BERT, перейдите по следующей ссылке https ://huggingface.co/learn/nlp-course/chapter1/4#architecture-vs-checkpoints

Насколько просто использовать трансформаторы?

Использование трансформаторов на вашем локальном компьютере может быть таким же простым, как следующий код. Чтобы его можно было использовать на Snowflake, требуются некоторые дополнительные шаги.

from transformers import pipeline
sentiment_analysis_model = pipeline("sentiment-analysis", model='distilbert-base-uncased-finetuned-sst-2-english')
results=sentiment_analysis_model("I love the way we implement ML models at Infostrux")
print(results)

Выход:

[{'label': 'POSITIVE', 'score': 0.9992141723632812}]

Отказ от ответственности:

Поскольку наша цель — простота, мы не будем настраивать наши модели точно. Предварительно обученные модели по-прежнему могут быть полезны, но вы можете настроить их, чтобы сделать еще более адаптированными к вашей отрасли и сценариям использования.

По тем же причинам мы используем простой метод аутентификации по имени пользователя и паролю. Мы рекомендуем использовать другие методы при реализации в ваших средах.

Библиотека Python Joblib

Как только модель обнимающегося лица будет создана с помощью функции конвейера трансформеров Huggingface, нам нужно будет сериализовать ее обратно в файловую систему. Это означает, что мы сохраним нашу модель в файле, чтобы ее можно было загрузить обратно при необходимости. В нашем случае мы загрузим этот файл на сцену снежинки, чтобы использовать его в функции.

Давайте сделаем рисунок:

Сноупарк

Библиотека Snowpark от Snowflake поможет нам с взаимодействием со Snowflake. В частности, он предоставит нам метод загрузки нашей сериализованной модели на этап Snowflake и поможет нам зарегистрировать пользовательскую функцию в базе данных Snowflake, и именно эту последнюю функцию мы будем использовать для вывода.

Заполним нашу схему:

Мы объединим эти компоненты в одном скрипте Python, который приведет нас от репозитория Hugging Face к готовому к использованию UDF. За исключением некоторых подготовительных действий, таких как импорт библиотек, создание стадий и т. д.

Далее давайте взглянем на наши варианты использования и опишем весь процесс, прежде чем проверять, как создать экземпляр процесса для каждого варианта использования.

Наши варианты использования:

В Части I мы рассмотрим следующие варианты использования простым способом, без обучения и тонкой настройки с Huggingface и переноса на Snowflake.

  • Анализ настроений: мы уже видели первый пример, показанный выше.
  • Tex Summarization: узнайте смысл текста, используя гораздо меньше слов.

Процесс реализации:

Чтобы создать функцию снежинки (UDF) для вывода ML на основе предварительно обученной модели «обнимающего лица», вам необходимо выполнить следующие шаги. Не беспокойтесь о фрагментах Python; мы соберем все части в один сценарий, чтобы он имел для вас смысл.

  1. Создайте сцену в Snowflake. Этап будет содержать сериализованные модели (в рамках данного урока вы можете сделать это один раз).
USE ROLE SYSADMIN ;
CREATE DATABASE ML_DEMO_DB; 
CREATE SCHEMA LLM_SCHEMA;
CREATE WAREHOUSE ML_OPS_DEMO_WAREHOUSE;
CREATE STAGE my_pretrained_models_stage ;

2. Создайте образцы таблиц (их мы увидим в примерах)

3. Установите библиотеку трансформеров (она понадобится один раз для каждой среды). Обратите внимание, что я использовал версию 4.14.1, поскольку использование версии, отличной от той, что доступна на Snowflake, приведет к непредсказуемым результатам.

pip3 install transformers==4.14.1

4. Напишите код Python на своей локальной/виртуальной машине (я использовал рабочее пространство AWS на основе Debian, дайте мне знать в комментариях, если вы используете что-то другое и столкнетесь с проблемами)

а. Импортируйте функцию конвейера

б. Используя функцию конвейера, создайте свою модель на основе предварительно обученной. Модель будет основана на библиотеке по умолчанию, если вы ее не укажете, но у вас все равно будет возможность выбрать библиотеку, которую вы хотите использовать (мы увидим это в одном из примеров)
Ниже приведена пример создания модели из предварительно обученной модели анализа настроений. Конечно, эта часть кода будет меняться в зависимости от нашего варианта использования.

from transformers import pipeline
sentiment_analysis_model = pipeline("sentiment-analysis")

в. Используя библиотеку joblib, сериализуйте (преобразуйте и сохраните в локальном хранилище) только что импортированную модель.

import joblib
joblib.dump(sentiment_analysis_model, 'sentiment-analysis.jobless)

д. Теперь наша модель готова к загрузке на сцену «Снежинка». Этот шаг необходим, чтобы наша пользовательская функция вывода могла импортировать и использовать предварительно обученную модель.

session = Session.builder.configs({
  "account": "your_snowflake_account_locator",
  "user": "your_username",
  "password": "your_password", # you'll work on improving the security of this script
  "role": "SYSADMIN",          # you would apply the least privilege principle to chose the role
  "warehouse": "SNOWPARK_DEMO",
  "database": "ML_DEMO_DB",
  "schema": "ML_DEMO_SCHEMA"
}
 ).create()
session.file.put(
   'sentiment-analysis.joblib',
   stage_location = f'@ML_DEMO_DB.ML_DEMO_SCHEMA.my_pretrained_models_stage',
   overwrite=True,
   auto_compress=False
)

е. Используя библиотеку кэша, создайте функцию, которая загружает сериализованную модель из файла. Почему? модели могут быть огромными и загружаться определенное время. Если мы используем функцию, которая кэширует результаты, выходные данные нашей функции load_model будут храниться в памяти. Поэтому всякий раз, когда мы хотим загрузить одну и ту же модель, функция будет извлекать результат из памяти вместо фактической загрузки модели из хранилища.

@cachetools.cached(cache={})
def read_model():
   import_dir = sys._xoptions.get("snowflake_import_directory")
   if import_dir:
       # Load the model
       return joblib.load(f'{import_dir}/sentiment-analysis.joblib')

ф. Зарегистрируйте функцию, которая выполняет вывод в Snowflake, используя библиотеку Snowpark. Регистрация описана в параграфе «Снежный парк» выше.

Мы обязательно импортируем библиотеку, которую используем в наших функциях, и нашу сериализованную модель со сцены.

@pandas_udf(  
       name='ML_DEMO_DB.ML_DEMO_SCHEMA.get_sentiment',
       session=session,
       is_permanent=True,
       replace=True,
       imports=[
           f'@ML_DEMO_DB.ML_DEMO_SCHEMA.my_pretrained_models_stage/sentiment-analysis.joblib'
       ],
       input_types=[PandasSeriesType(StringType())],
       return_type=PandasSeriesType(StringType()),
       stage_location='@ML_DEMO_DB.ML_DEMO_SCHEMA.my_pretrained_models_stage',
       packages=['cachetools==4.2.2', 'transformers==4.14.1']
   )

def get_setiment(sentences):   
   # Load the sentiment analysis model from stage
   # using the caching mechanism
   sentiment_analysis_model = read_model()
    # Apply the model
   predictions = []
   for sentence in sentences:
       result = sentiment_analysis_model(sentence)
       predictions.append(result)
   return pd.Series(predictions)

5. Запустите скрипт Python

6. Откройте лист снежинки и запустите функцию с данными, которые мы предварительно загрузили. Вуаля!

create table hotel_reviews (review varchar) ;
  insert into hotel_reviews values  ('I would not recommend this hotel to anyone. The room phone is broken so if you need anything you hv to go to reception. Lots of mosquitoes and they dun provide any repellent or spray. Bad service during check in and overall very dissapointed with the hotel'),
       ('I booked for a weekend.really i was impressed by the cleanliness and the organisation .... The services were very good.the food was delicious and varied presented in an Amazing and fabulous way....even the hôtel staff were cheerful and kind.. That is why i think to Book another Time with my friends'),
       ('The location Large swimming pool Main dishes are good for dinner
Old facilities Lack of maintenance (elevator, bathrooms, balconies sliding doors.) Lack of choice for breakfast Low desserts quality'),
       ('beach, pool and the games (pool, airhockey etc) were nice to have available. the room was spacious and nice
gosh, I did not expect to find an "all inclusive hotel"... with noisy music and al that "fun" when booking into a Golden Tulip (but apparently that was my misperception..)')
   ;  

select review as PARAGRAPH, GET_SENTIMENT(review) as RESULT from hotel_reviews;

Как и обещал, вот ссылка на полный скрипт Python.

Оооо… это фантастика, мне нравится видеть, что я могу вызывать функцию вывода из Snowflake для данных Snowflake. Это открывает множество приложений для исторических данных, таких как перевод, сравнение предложений на предмет того, имеют ли они одинаковое значение, обобщение текста, классификация текста.

Давайте посмотрим еще на один из них.

Вариант использования обобщения текста:

Предположим, в вашей базе данных хранятся тысячи текстовых страниц, и вы хотите автоматически создавать сводку для целей SEO или индексации.

Совет: чтобы избежать затруднений при поиске лучшей модели для вашего варианта использования, посетите Страницу моделей Huggingface и щелкните тег, соответствующий вашему варианту использования.

На новой странице, отфильтрованной по тегу «Сводка», выберите популярную модель и проверьте ее описание. Некоторые страницы также дают вам возможность опробовать вывод модели онлайн:

Хотя этого недостаточно, чтобы доказать надежность модели, здесь, например, модель facebook/bart-large-cnn была самой популярной и имела хороший рабочий пример, но она не очень хорошо работала с моими собственными текстами.

Итак, я нашел модель philschmid/bart-large-cnn-samsum, которая выглядела особенно многообещающе. Давайте начнем с шагов, которые помогут нашему выводу работать в учетной записи Snowflake.

Во-первых, если вы не запускали предыдущий пример или хотите снова пройти сквозной процесс, повторите шаги с 1 по 3 из раздела «Процесс реализации» выше.

Затем перейдите к шагу 4, реализуемому с нашими новыми значениями вариантов использования.

from transformers import pipeline
summarize = pipeline('summarization', model='philschmid/bart-large-cnn-samsum')

Теперь давайте сбросим нашу модель в локальную папку, а затем загрузим ее на сцену Snowflake.

# save the model to a local folder
joblib.dump(summarize, 'summarization.joblib')

# upload our model to a snwoflake stage
session = Session.builder.configs({
  "account": "your_snowflake_account_locator",
  "user": "your_username",
  "password": "your_password", # you'll work on improving the security of this script
  "role": "SYSADMIN",          # you would apply the least privilege principle to chose the role
  "warehouse": "SNOWPARK_DEMO",
  "database": "ML_DEMO_DB",
  "schema": "ML_DEMO_SCHEMA"
}
 ).create()
session.file.put(
   'summarization.joblib',
   stage_location = f'@ML_DEMO_DB.ML_DEMO_SCHEMA.my_pretrained_models_stage',
   overwrite=True,
   auto_compress=False
)

Следующим шагом является регистрация UDF (пользовательской функции Snowflake) с помощью декоратора pandas_udf и передачи ему модели, которую мы бы загрузили на сцену.

Помните, что мы также используем библиотеку cachetools, чтобы ускорить и упростить загрузку модели с помощью функции.

@cachetools.cached(cache={})
def read_model():
   import_dir = sys._xoptions.get("snowflake_import_directory")
   if import_dir:
       # Load the model
       return joblib.load(f'{import_dir}/summarization.joblib')

@pandas_udf(  
       name='ML_DEMO_DB.ML_DEMO_SCHEMA.get_text_summary',
       session=session,
       is_permanent=True,
       replace=True,
       imports=[
           f'@ML_DEMO_DB.ML_DEMO_SCHEMA.my_pretrained_models_stage/summarization.joblib'
       ],
       input_types=[PandasSeriesType(StringType())],
       return_type=PandasSeriesType(StringType()),
       stage_location='@ML_DEMO_DB.ML_DEMO_SCHEMA.my_pretrained_models_stage',
       packages=['cachetools==4.2.2', 'transformers==4.14.1']
   )

Наш скрипт Python готов; давайте попробуем.

[наш скрипт запущен, это может занять пару минут]

Теперь наша функция get_summary должна быть готова к использованию. Прежде чем мы проверим это, давайте занесем некоторые данные в таблицу.

Нам просто нужны некоторые данные для игры. В этом примере у нас будет только одна строка данных из-за длины текста, но несколько строк также подойдут.

Полный скрипт регистрации функции суммирования текста можно найти здесь.

CREATE TABLE TEXT_TO_SUMMARIZE (long_text varchar) ;
INSERT INTO TEXT_TO_SUMMARIZE VALUES ('The history of artificial intelligence (AI) began in antiquity, with myths, stories and rumors of artificial beings endowed with intelligence or consciousness by master craftsmen. The seeds of modern AI were planted by philosophers who attempted to describe the process of human thinking as the mechanical manipulation of symbols. This work culminated in the invention of the programmable digital computer in the 1940s, a machine based on the abstract essence of mathematical reasoning. This device and the ideas behind it inspired a handful of scientists to begin seriously discussing the possibility of building an electronic brain. 
The field of AI research was founded at a workshop held on the campus of Dartmouth College, USA during the summer of 1956.[1] Those who attended would become the leaders of AI research for decades. Many of them predicted that a machine as intelligent as a human being would exist in no more than a generation, and they were given millions of dollars to make this vision come true.[2]
Eventually, it became obvious that commercial developers and researchers had grossly underestimated the difficulty of the project.[3] In 1974, in response to the criticism from James Lighthill and ongoing pressure from congress, the U.S. and British Governments stopped funding undirected research into artificial intelligence, and the difficult years that followed would later be known as an "AI winter". Seven years later, a visionary initiative by the Japanese Government inspired governments and industry to provide AI with billions of dollars, but by the late 1980s the investors became disillusioned and withdrew funding again.
Investment and interest in AI boomed in the first decades of the 21st century when machine learning was successfully applied to many problems in academia and industry due to new methods, the application of powerful computer hardware, and the collection of immense data sets.');

Пришло время запустить нашу функцию вывода.

И вот все резюме, если вы хотите увидеть, насколько оно хорошо.

[{'summary_text': 'The history of artificial intelligence (AI) began in antiquity with myths, stories and rumors of artificial beings endowed with intelligence or consciousness by master craftsmen. The field of AI research was founded at a workshop held on the campus of Dartmouth College, USA during the summer of 1956. In 1974, in response to the criticism from James Lighthill, the U.S. and British governments stopped funding undirected research into artificial intelligence. Seven years later, a visionary initiative by the Japanese Government inspired governments and industry to provide AI with billions of dollars, but by the late 1980s the investors became disillusioned and withdrew funding.'}]

Я всегда удивляюсь этому. Функция возвращает что-то в течение 45 секунд, поэтому еще предстоит поработать над повышением производительности нашей функции вывода, но мы уже можем использовать предварительно обученные модели, готовые к передаче в Snowflake.

Во второй части мы увидим еще пару вариантов использования, но на этот раз мы немного настроим, чтобы превратить неэффективные предварительно обученные модели в полезные.

Спасибо, что прочитали, надеюсь, вы сегодня чему-то научились вместе со мной. Я Мехди Сиди Бумедин, старший инженер по данным в Infostrux, не стесняйтесь подключаться к LinkedIn. Также вы найдете еще больше интересных статей, подписавшись на Инженерный блог Infostrux. Оставайтесь с нами, чтобы увидеть часть II.