Налаштуйте та розгорніть модель підсумовування за допомогою контейнерів Hugging Face Amazon SageMaker із власним сценарієм

Останнім часом у сфері НЛП було досягнуто багато досягнень. Попередньо навчені моделі та повністю керовані послуги НЛП демократизували доступ і впровадження НЛП. «Амазонка» це повністю керована служба, яка може виконувати завдання NLP, такі як розпізнавання особливих об’єктів, моделювання тем, аналіз настроїв тощо, щоб витягувати ідеї з даних без попереднього досвіду ML.

Минулого року AWS оголосила про партнерство з Обіймати обличчя щоб допомогти швидше запровадити моделі обробки природної мови (NLP). Hugging Face — це спільнота штучного інтелекту з відкритим кодом, зосереджена на НЛП. Їх бібліотека на основі Python (трансформери) надає інструменти для легкого використання популярних найсучасніших архітектур Transformer, таких як BERT, RoBERTa та GPT. Ви можете застосувати ці моделі до різноманітних завдань НЛП, таких як класифікація тексту, вилучення інформації та відповіді на питання, серед інші.

Amazon SageMaker – це повністю керований сервіс, який надає розробникам і дослідникам даних можливість швидко створювати, навчати та розгортати моделі машинного навчання (ML). SageMaker усуває важку роботу з кожного етапу процесу машинного навчання, полегшуючи розробку високоякісних моделей. SageMaker Python SDK надає API та контейнери з відкритим вихідним кодом для навчання та розгортання моделей на SageMaker, використовуючи кілька різних фреймворків машинного навчання та глибокого навчання.

Інтеграція Hugging Face із SageMaker дозволяє створювати масштабні моделі Hugging Face у власних випадках використання для конкретного домену.

У цій публікації ми ознайомимо вас із прикладом того, як створити та розгорнути спеціальний текстовий підсумовувач Hugging Face на SageMaker. Для цієї мети ми використовуємо Pegasus [1], першу модель на основі Transformer, спеціально попередньо навчену меті, призначеній для абстрактного підсумовування тексту. BERT попередньо навчений маскувати випадкові слова в реченні; навпаки, під час попереднього навчання Pegasus речення маскуються від вхідного документа. Потім модель генерує відсутні речення як єдину вихідну послідовність, використовуючи всі незамасковані речення як контекст, створюючи в результаті короткий виклад документа.

Завдяки гнучкості бібліотеки HuggingFace ви можете легко адаптувати код, показаний у цій публікації, для інших типів моделей трансформаторів, таких як t5, BART тощо.

Завантажте власний набір даних, щоб точно налаштувати модель обличчя, що обіймається

Щоб завантажити спеціальний набір даних із файлу CSV, ми використовуємо load_dataset метод із пакету Transformers. Ми можемо застосувати токенізацію до завантаженого набору даних за допомогою datasets.Dataset.map функція. map функція повторює завантажений набір даних і застосовує функцію tokenize до кожного прикладу. Токенізований набір даних можна передати інструктору для точного налаштування моделі. Перегляньте наступний код:

# Python
def tokenize(batch):
    tokenized_input = tokenizer(batch[args.input_column], padding='max_length', truncation=True, max_length=args.max_source)
    tokenized_target = tokenizer(batch[args.target_column], padding='max_length', truncation=True, max_length=args.max_target)
    tokenized_input['target'] = tokenized_target['input_ids']

    return tokenized_input
    

def load_and_tokenize_dataset(data_dir):
    for file in os.listdir(data_dir):
        dataset = load_dataset("csv", data_files=os.path.join(data_dir, file), split='train')
    tokenized_dataset = dataset.map(lambda batch: tokenize(batch), batched=True, batch_size=512)
    tokenized_dataset.set_format('numpy', columns=['input_ids', 'attention_mask', 'labels'])
    
    return tokenized_dataset

Створіть свій навчальний сценарій для оцінювача Hugging Face SageMaker

Як пояснюється в дописі AWS і Hugging Face співпрацюють, щоб спростити та прискорити впровадження моделей обробки природної мови, навчання моделі Hugging Face на SageMaker ніколи не було таким простим. Ми можемо зробити це, використовуючи інструмент оцінки Hugging Face від SageMaker SDK.

Наступний фрагмент коду точно налаштовує Pegasus на наш набір даних. Ви також можете знайти багато зразки зошитів які допоможуть вам налаштувати різні типи моделей, доступні безпосередньо в репозиторії transformers GitHub. Щоб увімкнути розподілене навчання, ми можемо використовувати Бібліотека паралелізму даних у SageMaker, який вбудовано в API Trainer HuggingFace. Щоб увімкнути паралелізм даних, нам потрібно визначити distribution у нашому інструменті оцінки Hugging Face.

# Python
from sagemaker.huggingface import HuggingFace
# configuration for running training on smdistributed Data Parallel
distribution = {'smdistributed':{'dataparallel':{ 'enabled': True }}}
huggingface_estimator = HuggingFace(entry_point='train.py',
                                    source_dir='code',
                                    base_job_name='huggingface-pegasus',
                                    instance_type= 'ml.g4dn.16xlarge',
                                    instance_count=1,
                                    transformers_version='4.6',
                                    pytorch_version='1.7',
                                    py_version='py36',
                                    output_path=output_path,
                                    role=role,
                                    hyperparameters = {
                                        'model_name': 'google/pegasus-xsum',
                                        'epoch': 10,
                                        'per_device_train_batch_size': 2
                                    },
                                    distribution=distribution)
huggingface_estimator.fit({'train': training_input_path, 'validation': validation_input_path, 'test': test_input_path})

Максимальний розмір навчальної партії, який ви можете налаштувати, залежить від розміру моделі та пам’яті GPU використовуваного екземпляра. Якщо ввімкнено розподілене навчання SageMaker, загальний розмір пакету є сумою кожного пакета, який розподіляється між кожним пристроєм/графічним процесором. Якщо ми використовуємо ml.g4dn.16xlarge із розподіленим навчанням замість екземпляра ml.g4dn.xlarge, ми матимемо у вісім разів (8 GPU) більше пам’яті, ніж екземпляр ml.g4dn.xlarge (1 GPU). Розмір партії на пристрій залишається незмінним, але вісім пристроїв навчаються паралельно.

Як зазвичай у SageMaker, ми створюємо a train.py сценарій для використання в режимі сценаріїв і передача гіперпараметрів для навчання. Наступний фрагмент коду для Pegasus завантажує модель і навчає її за допомогою Transformers Trainer клас:

# Python
from transformers import (
    AutoModelForSeq2SeqLM,
    AutoTokenizer,
    Seq2SeqTrainer,
    Seq2seqTrainingArguments
)

model = AutoModelForSeq2SeqLM.from_pretrained(model_name).to(device)
    
training_args = Seq2seqTrainingArguments(
    output_dir=args.model_dir,
    num_train_epochs=args.epoch,
    per_device_train_batch_size=args.train_batch_size,
    per_device_eval_batch_size=args.eval_batch_size,
    warmup_steps=args.warmup_steps,
    weight_decay=args.weight_decay,
    logging_dir=f"{args.output_data_dir}/logs",
    logging_strategy='epoch',
    evaluation_strategy='epoch',
    saving_strategy='epoch',
    adafactor=True,
    do_train=True,
    do_eval=True,
    do_predict=True,
    save_total_limit = 3,
    load_best_model_at_end=True,
    metric_for_best_model='eval_loss'
    # With the goal to deploy the best checkpoint to production
    # it is important to set load_best_model_at_end=True,
    # this makes sure that the last model is saved at the root
    # of the model_dir” directory
)
    
trainer = Seq2SeqTrainer(
    model=model,
    args=training_args,
    train_dataset=dataset['train'],
    eval_dataset=dataset['validation']
)

trainer.train()
trainer.save_model()

# Get rid of unused checkpoints inside the container to limit the model.tar.gz size
os.system(f"rm -rf {args.model_dir}/checkpoint-*/")

Повний код доступний на GitHub.

Розгорніть навчену модель Hugging Face у SageMaker

Наші друзі з Hugging Face зробили висновок про моделі SageMaker for Transformers простіше, ніж будь-коли, завдяки SageMaker Hugging Face Inference Toolkit. Ви можете безпосередньо розгорнути попередньо навчену модель, просто налаштувавши змінну середовища "HF_TASK":"summarization" (інструкції див Моделі Пегаса), вибираючи Розгортання, а потім вибираючи Amazon SageMaker, без необхідності писати сценарій висновку.

Однак, якщо вам потрібен певний спосіб генерації або постобробки передбачень, наприклад, генерування кількох підсумкових пропозицій на основі списку різних параметрів генерації тексту, написання власного сценарію висновку може бути корисним і відносно простим:

# Python
# inference.py script

import os
import json
import torch
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

def model_fn(model_dir):
    # Create the model and tokenizer and load weights
    # from the previous training Job, passed here through "model_dir"
    # that is reflected in HuggingFaceModel "model_data"
    tokenizer = AutoTokenizer.from_pretrained(model_dir)
    model = AutoModelForSeq2SeqLM.from_pretrained(model_dir).to(device).eval()
    
    model_dict = {'model':model, 'tokenizer':tokenizer}
    
    return model_dict
        

def predict_fn(input_data, model_dict):
    # Return predictions/generated summaries
    # using the loaded model and tokenizer on input_data
    text = input_data.pop('inputs')
    parameters_list = input_data.pop('parameters_list', None)
    
    tokenizer = model_dict['tokenizer']
    model = model_dict['model']

    # Parameters may or may not be passed    
    input_ids = tokenizer(text, truncation=True, padding='longest', return_tensors="pt").input_ids.to(device)
    
    if parameters_list:
        predictions = []
        for parameters in parameters_list:
            output = model.generate(input_ids, **parameters)
            predictions.append(tokenizer.batch_decode(output, skip_special_tokens=True))
    else:
        output = model.generate(input_ids)
        predictions = tokenizer.batch_decode(output, skip_special_tokens=True)
    
    return predictions
    
    
def input_fn(request_body, request_content_type):
    # Transform the input request to a dictionary
    request = json.loads(request_body)
    return request

Як показано в попередньому коді, такий сценарій висновку для HuggingFace на SageMaker потребує лише таких функцій шаблону:

  • model_fn () – Читає вміст того, що було збережено наприкінці навчального завдання всередині SM_MODEL_DIR, або з існуючого каталогу ваг моделі, збереженого як файл tar.gz у Служба простого зберігання Amazon (Amazon S3). Він використовується для завантаження навченої моделі та пов’язаного токенізера.
  • input_fn () – Форматує дані, отримані від запиту, зробленого до кінцевої точки.
  • predict_fn () – викликає вихід model_fn() (модель і токенізер), щоб виконати висновок на виході input_fn() (відформатовані дані).

За бажанням ви можете створити output_fn() функція для форматування висновку, використовуючи вихідні дані predict_fn(), яку ми не демонстрували в цій публікації.

Потім ми можемо розгорнути навчену модель Hugging Face із пов’язаним сценарієм висновку в SageMaker за допомогою Модель SageMaker, що обіймається клас:

# Python
from sagemaker.huggingface import HuggingFaceModel

model = HuggingFaceModel(model_data=huggingface_estimator.model_data,
                     role=role,
                     framework_version='1.7',
                     py_version='py36',
                     entry_point='inference.py',
                     source_dir='code')
                     
predictor = model.deploy(initial_instance_count=1,
                         instance_type='ml.g4dn.xlarge'
                         )

Тестуйте розгорнуту модель

Для цієї демонстрації ми навчили модель на Набір даних оглядів жіночого одягу електронної комерції, який містить огляди статей про одяг (які ми розглядаємо як вхідний текст) і пов’язані з ними заголовки (які ми розглядаємо як резюме). Після видалення статей із відсутніми назвами набір даних містить 19,675 70 відгуків. Точне налаштування моделі Pegasus на навчальному наборі, що містить 3.5% цих статей для п’яти епох, зайняло приблизно 3.16 години на екземплярі ml.pXNUMXxlarge.

Потім ми можемо розгорнути модель і перевірити її за допомогою прикладів даних із тестового набору. Нижче наведено приклад огляду з описом светра:

# Python
Review Text
"I ordered this sweater in green in petite large. The color and knit is beautiful and the shoulders and body fit comfortably; however, the sleeves were very long for a petite. I roll them, and it looks okay but would have rather had a normal petite length sleeve."

Original Title
"Long sleeves"

Rating
3

Завдяки нашому спеціальному сценарію висновку, розміщеному в кінцевій точці SageMaker, ми можемо створити кілька підсумків для цього огляду з різними параметрами генерації тексту. Наприклад, ми можемо попросити кінцеву точку створити діапазон від дуже коротких до помірно довгих підсумків із зазначенням різних штрафів за довжину (чим менший штраф за довжину, тим коротший згенерований підсумок). Нижче наведено деякі приклади введення параметрів і наступні підсумкові підсумки, створені машиною:

# Python
inputs = {
    "inputs":[
"I ordered this sweater in green in petite large. The color and knit is   beautiful and the shoulders and body fit comfortably; however, the sleeves were very long for a petite. I roll them, and it looks okay but would have rather had a normal petite length sleeve."
    ],

    "parameters_list":[
        {
            "length_penalty":2
        },
	{
            "length_penalty":1
        },
	{
            "length_penalty":0.6
        },
        {
            "length_penalty":0.4
        }
    ]

result = predictor.predict(inputs)
print(result)

[
    ["Beautiful color and knit but sleeves are very long for a petite"],
    ["Beautiful sweater, but sleeves are too long for a petite"],
    ["Cute, but sleeves are long"],
    ["Very long sleeves"]
]

Якому резюме ви віддаєте перевагу? Перший створений заголовок фіксує всі важливі факти про рецензію з чвертю кількості слів. На відміну від цього, останній використовує лише три слова (менше 1/10 довжини оригінального огляду), щоб зосередити увагу на найважливішій особливості светра.

Висновок

За допомогою цього простого прикладу, доступного на веб-сторінці GitHub. Додатковий зразки зошитів для навчання та розгортання моделей Hugging Face на SageMaker також доступні.

Як завжди, AWS раді відгукам. Надішліть будь-які коментарі чи запитання.

посилання

[1] PEGASUS: Попереднє навчання з вилученими прогалинами для абстрактного резюмування


Про авторів

Тонко налаштуйте та розгорніть модель підсумовування за допомогою контейнерів Hugging Face Amazon SageMaker, які забезпечують ваш власний сценарій PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai. Віктор Малесевич є інженером машинного навчання в AWS Professional Services, захоплюється обробкою природної мови та MLOps. Він працює з клієнтами над розробкою та впровадженням складних моделей глибокого навчання в AWS. У вільний час він любить випити з друзями келих червоного вина та трохи сиру.

Тонко налаштуйте та розгорніть модель підсумовування за допомогою контейнерів Hugging Face Amazon SageMaker, які забезпечують ваш власний сценарій PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.Аамна Наджмі є спеціалістом із обробки даних у AWS Professional Services. Вона захоплено допомагає клієнтам впроваджувати інновації з технологіями великих даних і штучного інтелекту, щоб отримувати цінність для бізнесу та розуміння даних. У вільний час вона любить займатися садівництвом і подорожувати в нові місця.

Часова мітка:

Більше від AWS Машинне навчання