כוונן ופרוס מודל סיכום באמצעות מיכלי Hugging Face Amazon SageMaker שמביאים סקריפט משלך

לאחרונה היו התקדמות רבות בתחום ה-NLP. מודלים שהוכשרו מראש ושירותי NLP מנוהלים במלואם הפכו את הגישה והאימוץ של NLP לדמוקרטיה. אמזון להתבונן הוא שירות מנוהל במלואו שיכול לבצע משימות NLP כמו זיהוי ישויות מותאם אישית, מודלים של נושאים, ניתוח סנטימנטים ועוד כדי לחלץ תובנות מנתונים ללא צורך בניסיון קודם ב-ML.

בשנה שעברה הודיעה AWS על א שׁוּתָפוּת עם פנים מחבקות כדי לעזור להביא מודלים של עיבוד שפה טבעית (NLP) לייצור מהר יותר. Hugging Face היא קהילת AI בקוד פתוח, המתמקדת ב-NLP. הספרייה המבוססת על פייתון (רוֹבּוֹטרִיקִים) מספק כלים לשימוש בקלות בארכיטקטורות רובוטריקים פופולריות מתקדמות כמו BERT, RoBERTa ו-GPT. אתה יכול ליישם מודלים אלה על מגוון משימות NLP, כגון סיווג טקסט, חילוץ מידע ומענה לשאלות, בין אחרים.

אמזון SageMaker הוא שירות מנוהל במלואו המספק למפתחים ולמדעני נתונים את היכולת לבנות, לאמן ולפרוס מודלים של למידת מכונה (ML) במהירות. SageMaker מסיר את ההרמה הכבדה מכל שלב בתהליך ה-ML, מה שמקל על פיתוח דגמים באיכות גבוהה. ה-SDK של SageMaker Python מספק ממשקי API ומכולות בקוד פתוח לאימון ופריסה של מודלים ב- SageMaker, תוך שימוש בכמה מסגרות שונות של ML ולמידה עמוקה.

האינטגרציה של Hugging Face עם SageMaker מאפשרת לך לבנות מודלים של Hugging Face בקנה מידה על מקרי שימוש ספציפיים לדומיין שלך.

בפוסט זה, אנו מדריכים אותך דרך דוגמה כיצד לבנות ולפרוס סיכום טקסט מותאם אישית של חיבוק ב- SageMaker. אנו משתמשים ב-Pegasus [1] למטרה זו, המודל הראשון המבוסס על רובוטריקים שהוכשר מראש במיוחד על מטרה המותאמת לסיכום טקסט מופשט. BERT מאומן מראש על מיסוך מילים אקראיות במשפט; לעומת זאת, במהלך האימון המקדים של פגסוס, משפטים מוסווים ממסמך קלט. לאחר מכן, המודל יוצר את המשפטים החסרים כרצף פלט יחיד תוך שימוש בכל המשפטים הבלתי מוסווים כהקשר, ויוצר כתוצאה מכך תקציר ניהולי של המסמך.

הודות לגמישות של ספריית HuggingFace, תוכלו להתאים בקלות את הקוד המוצג בפוסט זה לסוגים אחרים של דגמי שנאים, כמו t5, BART ועוד.

טען את מערך הנתונים שלך כדי לכוונן עדין דגם של Hugging Face

כדי לטעון מערך נתונים מותאם אישית מקובץ CSV, אנו משתמשים ב- load_dataset שיטה מחבילת רובוטריקים. אנו יכולים להחיל טוקניזציה על מערך הנתונים הנטען באמצעות ה- 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 משתפים פעולה בכדי לפשט ולהאיץ אימוץ מודלים לעיבוד שפה טבעית, אימון דוגמנית חיבוק ב- SageMaker מעולם לא היה קל יותר. אנחנו יכולים לעשות זאת על ידי שימוש באומדן החיבוקים מה- SageMaker SDK.

קטע הקוד הבא מכוונן את Pegasus במערך הנתונים שלנו. אתה יכול גם למצוא הרבה מחברות לדוגמה שמדריכים אותך דרך כוונון עדין של סוגים שונים של דגמים, הזמינים ישירות במאגר השנאים GitHub. כדי לאפשר הדרכה מבוזרת, אנו יכולים להשתמש ב- ספריית מקביליות נתונים ב- SageMaker, שהוכלל ב- HuggingFace Trainer API. כדי לאפשר מקביליות נתונים, עלינו להגדיר את distribution פרמטר באומדן החיבוק שלנו.

# 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 מופעלת, גודל האצווה הכולל הוא הסכום של כל אצווה שמופצת על פני כל מכשיר/GPU. אם אנו משתמשים ב-ml.g4dn.16xlarge עם אימון מבוזר במקום במופע ml.g4dn.xlarge, יש לנו פי שמונה (8 GPUs) זיכרון כמו למופע ml.g4dn.xlarge (1 GPU). גודל האצווה למכשיר נשאר זהה, אבל שמונה מכשירים מתאמנים במקביל.

כרגיל עם SageMaker, אנו יוצרים א train.py סקריפט לשימוש עם מצב סקריפט ולהעביר היפרפרמטרים לאימון. קטע הקוד הבא של Pegasus טוען את הדגם ומאמן אותו באמצעות הרובוטריקים 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. אתה יכול לפרוס ישירות את המודל שהוכשר קודם לכן על ידי הגדרת משתנה הסביבה "HF_TASK":"summarization" (להנחיות, ראה דגמי פגסוס), בחירה לפרוס, ולאחר מכן בחירה אמזון 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 ב שירות אחסון פשוט של אמזון (אמזון S3). הוא משמש לטעינת הדגם המאומן והאסימון המשויך.
  • input_fn () - פורמט את הנתונים שהתקבלו מבקשה שנעשתה לנקודת הקצה.
  • לחזות_בן () – קורא לפלט של model_fn() (הדגם והאסימון) להפיק הסקה על הפלט של input_fn() (הנתונים המעוצבים).

לחלופין, אתה יכול ליצור output_fn() פונקציה עבור עיצוב מסקנות, באמצעות הפלט של predict_fn(), מה שלא הדגמנו בפוסט הזה.

לאחר מכן נוכל לפרוס את המודל המיומן של Hugging Face עם סקריפט ההסקה המשויך לו ל- SageMaker באמצעות מחבק פנים SageMaker Model מעמד:

# 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 ביקורות. כוונון עדין של מודל Pegasus על ערכת אימונים המכילה 70% מהכתבות הללו במשך חמש תקופות ארך כ-3.5 שעות במופע ml.p3.16xlarge.

לאחר מכן נוכל לפרוס את המודל ולבדוק אותו עם כמה נתונים לדוגמה ממערך הבדיקות. להלן סקירה לדוגמה המתארת ​​סוודר:

# 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 מאורך הביקורת המקורית) כדי להתמקד בתכונה החשובה ביותר של הסוודר.

סיכום

אתה יכול לכוונן סיכום טקסט במערך הנתונים המותאם אישית שלך ולפרוס אותו לייצור ב- SageMaker עם דוגמה פשוטה זו הזמינה ב GitHub. נוסף מחברות לדוגמה להכשיר ולפרוס דגמי Hugging Face ב- SageMaker זמינים גם כן.

כמו תמיד, AWS מקבלת בברכה משוב. נא לשלוח הערות או שאלות.

הפניות

[1] PEGASUS: אימון מקדים עם משפטים מחולצים לסיכום מופשט


על המחברים

כוונן ופרוס מודל סיכום באמצעות מיכלי Hugging Face Amazon SageMaker המביאים סקריפט משלך PlatoBlockchain Data Intelligence. חיפוש אנכי. איי. ויקטור מאלשביץ' הוא מהנדס למידת מכונה עם שירותים מקצועיים של AWS, נלהב מעיבוד שפה טבעית ו-MLOps. הוא עובד עם לקוחות כדי לפתח ולהעלות מודלים מאתגרים של למידה עמוקה לייצור ב-AWS. בזמנו הפנוי הוא נהנה לחלוק כוס יין אדום וקצת גבינה עם חברים.

כוונן ופרוס מודל סיכום באמצעות מיכלי Hugging Face Amazon SageMaker המביאים סקריפט משלך PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.אמנה נג'מי הוא מדען נתונים עם שירותים מקצועיים של AWS. היא נלהבת לעזור ללקוחות לחדש עם טכנולוגיות ביג דאטה ובינה מלאכותית כדי להפיק ערך עסקי ותובנות מהנתונים. בזמנה הפנוי היא נהנית לעסוק בגינון ולטייל במקומות חדשים.

בול זמן:

עוד מ למידת מכונות AWS