Точная настройка больших языковых моделей: как Vertex AI выводит LLM на новый уровень

1. Введение

Почему важна тонкая настройка

Базовые модели обучаются для общих целей и иногда не справляются с задачами так хорошо, как хотелось бы. Это может быть связано с тем, что задачи, которые вы хотите, чтобы модель выполняла, являются специализированными и их сложно обучить, используя только подсказки. В таких случаях можно использовать настройку модели для улучшения ее производительности в конкретных задачах. Настройка модели также может помочь соответствовать определенным требованиям к выходным данным, когда одних инструкций недостаточно. Большие языковые модели (БЛМ) могут содержать огромный объем информации и выполнять множество задач, но они достигают наилучших результатов только при наличии специализированного обучения. Тонкая настройка может обучить БЛМ, позволяя адаптировать предварительно обученную БЛМ к вашим конкретным потребностям.

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

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

Более подробная информация о настройке модели доступна здесь .

Что вы построите

Пример использования: Генерация заголовков для новостных статей.

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

В этом практическом задании вы выполните следующие действия:

  • Используйте BBC FULLTEXT DATA (предоставленные общедоступным набором данных BigQuery bigquery-public-data.bbc_news.fulltext ).
  • Выполните тонкую настройку модели LLM ( text-bison@002 ) до новой, более точной модели под названием " bbc-news-summary-tuned " и сравните результат с ответом базовой модели. Пример JSONL-файла для этого практического занятия доступен в репозитории . Вы можете загрузить файл в свой Cloud Storage Bucket и выполнить следующие шаги тонкой настройки:
  • Подготовьте данные: начните с набора данных новостных статей и соответствующих им заголовков, например, с набора данных BBC News, использованного в примере кода.
  • Доработайте предварительно обученную модель: выберите базовую модель, например, " text-bison@002 ", и доработайте ее с помощью ваших новостных данных, используя Vertex AI SDK для Python.
  • Оцените результаты: сравните производительность вашей доработанной модели с базовой моделью, чтобы увидеть улучшение качества генерации заголовков.
  • Разверните и используйте свою модель: сделайте свою доработанную модель доступной через конечную точку API и начните автоматически генерировать заголовки для новых статей.

2. Прежде чем начать

  1. В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud.
  2. Убедитесь, что для вашего проекта Google Cloud включена функция выставления счетов. Узнайте, как проверить, включена ли функция выставления счетов для проекта .
  3. Откройте блокнот Colab и войдите в ту же учетную запись, что и ваша текущая активная учетная запись Google Cloud.

3. Доработка большой языковой модели.

В этом практическом занятии используется Vertex AI SDK для Python для тонкой настройки модели. Вы также можете выполнить тонкую настройку, используя другие варианты — HTTP, команду CURL, Java SDK, консоль.

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

4. Шаг 1: Установка и импорт зависимостей

!pip install google-cloud-aiplatform
!pip install --user datasets
!pip install --user google-cloud-pipeline-components

Выполните остальные шаги, как показано в файле .ipynb в репозитории . Убедитесь, что вы заменили PROJECT_ID и BUCKET_NAME на свои учетные данные.

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import warnings
warnings.filterwarnings('ignore')
import vertexai
vertexai.init(project=PROJECT_ID, location=REGION)
import kfp
import sys
import uuid
import json
import pandas as pd
from google.auth import default
from datasets import load_dataset
from google.cloud import aiplatform
from vertexai.preview.language_models import TextGenerationModel, EvaluationTextSummarizationSpec

5. Шаг 2: Подготовка и загрузка обучающих данных

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

json_url = 'https://storage.googleapis.com/YOUR_BUCKET/TRAIN.jsonl'
df = pd.read_json(json_url, lines=True)
print (df)

Результатом этого шага должно стать следующее:

17274866af36a47c.png

6. Шаг 3: Доработка большой языковой модели.

На данном этапе вы можете настроить любую большую языковую модель (в зависимости от наличия поддержки). Однако в этом фрагменте кода мы настраиваем предварительно обученную модель "text-bison@002" с помощью фрейма данных, содержащего обучающие данные, которые мы загрузили на предыдущем шаге.

model_display_name = 'bbc-finetuned-model' # @param {type:"string"}
tuned_model = TextGenerationModel.from_pretrained("text-bison@002")
tuned_model.tune_model(
training_data=df,
train_steps=100,
tuning_job_location="europe-west4",
tuned_model_location="europe-west4",
)

Этот этап займет несколько часов. Вы можете отслеживать ход тонкой настройки, используя ссылку на задание конвейера в результатах.

7. Шаг 4: Прогнозирование с помощью новой, доработанной модели.

После завершения тонкой настройки вы сможете использовать свою новую модель для прогнозирования. Чтобы использовать свою новую настроенную модель для прогнозирования:

response = tuned_model.predict("Summarize this text to generate a title: \n Ever noticed how plane seats appear to be getting smaller and smaller? With increasing numbers of people taking to the skies, some experts are questioning if having such packed out planes is putting passengers at risk. They say that the shrinking space on aeroplanes is not only uncomfortable it it's putting our health and safety in danger. More than squabbling over the arm rest, shrinking space on planes putting our health and safety in danger? This week, a U.S consumer advisory group set up by the Department of Transportation said at a public hearing that while the government is happy to set standards for animals flying on planes, it doesn't stipulate a minimum amount of space for humans.")
print(response.text)

В результате вы должны увидеть следующее:

67061c36b7ba39b7.png

Для сравнения с базовой моделью ( text-bison@002 ) выполните следующие команды:

base_model = TextGenerationModel.from_pretrained("text-bison@002")
response = base_model.predict("Summarize this text to generate a title: \n Ever noticed how plane seats appear to be getting smaller and smaller? With increasing numbers of people taking to the skies, some experts are questioning if having such packed out planes is putting passengers at risk. They say that the shrinking space on aeroplanes is not only uncomfortable it it's putting our health and safety in danger. More than squabbling over the arm rest, shrinking space on planes putting our health and safety in danger? This week, a U.S consumer advisory group set up by the Department of Transportation said at a public hearing that while the government is happy to set standards for animals flying on planes, it doesn't stipulate a minimum amount of space for humans.")
print(response.text)

В результате вы должны увидеть следующее:

22ec58e4261405d6.png

Хотя оба сгенерированных заголовка выглядят уместными, первый (сгенерированный с помощью доработанной модели) больше соответствует стилю заголовков, используемых в рассматриваемом наборе данных.

Загрузите точно настроенную модель.

Возможно, проще загрузить модель, которую вы только что доработали. Но помните, что на шаге 3 она вызывается в рамках самого кода, поэтому доработанная модель по-прежнему хранится в переменной tuned_model. Но что, если вы хотите вызвать модель, которая была доработана ранее?

Для этого можно вызвать метод get_tuned_model() в LLM, указав полный URL-адрес конечной точки развернутой доработанной модели из реестра моделей Vertex AI. Обратите внимание, что в этом случае вместо их идентификаторов вводятся PROJECT_NUMBER и MODEL_NUMBER.

tuned_model_1 = TextGenerationModel.get_tuned_model("projects/<<PROJECT_NUMBER>>/locations/europe-west4/models/<<MODEL_NUMBER>>")
print(tuned_model_1.predict("YOUR_PROMPT"))

8. Шаг 5: Оценка новой, доработанной модели.

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

  1. Загрузите набор данных EVALUATION :
json_url = 'https://storage.googleapis.com/YOUR_BUCKET/EVALUATE.jsonl'
df = pd.read_json(json_url, lines=True)
print (df)
  1. Определите спецификацию оценки для задачи суммаризации текста на основе доработанной модели.
task_spec = EvaluationTextSummarizationSpec(
 task_name = "summarization",
 ground_truth_data=df
)

Этот этап займет несколько минут. Вы можете отслеживать ход выполнения, используя ссылку на задание конвейера в результатах. После завершения вы должны увидеть следующий результат оценки:

387843d6c970e02.png

В результатах оценки метрика rougeLSum определяет значение ROUGE-L для резюме. ROUGE-L — это метрика, основанная на показателе полноты, которая измеряет степень совпадения между резюме и эталонным резюме. Она рассчитывается путем деления самой длинной общей подпоследовательности (LCS) между двумя резюме на длину эталонного резюме.

Значение rougeLSum в предоставленном выражении составляет 0,36600753600753694, что означает, что сводка совпадает с эталонной сводкой на 36,6%.

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

Результаты оценки можно найти в выходном каталоге Cloud Storage, указанном при создании задания оценки. Файл называется evaluation_metrics.json . Для оптимизированных моделей результаты оценки также можно просмотреть в консоли Google Cloud на странице Vertex AI Model Registry .

9. Важные соображения

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

10. Уборка

Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, использованные в этом практическом задании, выполните следующие действия:

  1. В консоли Google Cloud перейдите на страницу «Управление ресурсами» .
  2. В списке проектов выберите проект, который хотите удалить, и нажмите кнопку «Удалить» .
  3. В диалоговом окне введите идентификатор проекта, а затем нажмите «Завершить» , чтобы удалить проект.
  4. В качестве альтернативы вы можете перейти в Реестр моделей , перейти на вкладку развертывания и тестирования моделей, удалить конечную точку и удалить развернутую настроенную модель.

11. Поздравляем!

Поздравляем! Вы успешно использовали Vertex AI для тонкой настройки модели LLM. Тонкая настройка — это мощный метод, позволяющий адаптировать модели LLM к вашей предметной области и задачам. С Vertex AI у вас есть инструменты и ресурсы, необходимые для эффективной и результативной тонкой настройки ваших моделей.

Изучите репозитории GitHub и поэкспериментируйте с примерами кода, чтобы на собственном опыте оценить возможности тонкой настройки и оценки . Подумайте, как точно настроенные модели LLM могут удовлетворить ваши конкретные потребности: от создания целевых маркетинговых текстов до обобщения сложных документов или перевода языков с учетом культурных особенностей. Используйте полный набор инструментов и сервисов Vertex AI для легкого создания, обучения, оценки и развертывания ваших точно настроенных моделей.