Βελτιώστε και αναπτύξτε ένα μοντέλο σύνοψης χρησιμοποιώντας τα κοντέινερ Hugging Face Amazon SageMaker φέρνοντας το δικό σας σενάριο

Υπήρξαν πολλές πρόσφατες εξελίξεις στον τομέα NLP. Τα προεκπαιδευμένα μοντέλα και οι πλήρως διαχειριζόμενες υπηρεσίες NLP έχουν εκδημοκρατίσει την πρόσβαση και την υιοθέτηση του NLP. Κατανοήστε το Amazon είναι μια πλήρως διαχειριζόμενη υπηρεσία που μπορεί να εκτελέσει εργασίες NLP, όπως αναγνώριση προσαρμοσμένων οντοτήτων, μοντελοποίηση θεμάτων, ανάλυση συναισθήματος και πολλά άλλα για την εξαγωγή πληροφοριών από δεδομένα χωρίς την ανάγκη προηγούμενης εμπειρίας ML.

Πέρυσι, η AWS ανακοίνωσε α εταιρική σχέση με Αγκαλιάζοντας το πρόσωπο για να βοηθήσει στην ταχύτερη παραγωγή μοντέλων επεξεργασίας φυσικής γλώσσας (NLP). Το Hugging Face είναι μια κοινότητα τεχνητής νοημοσύνης ανοιχτού κώδικα, που επικεντρώνεται στο NLP. Η βιβλιοθήκη τους που βασίζεται σε Python (transformers) παρέχει εργαλεία για εύκολη χρήση δημοφιλών αρχιτεκτονικών Transformer τελευταίας τεχνολογίας όπως BERT, RoBERTa και GPT. Μπορείτε να εφαρμόσετε αυτά τα μοντέλα σε μια ποικιλία εργασιών NLP, όπως ταξινόμηση κειμένου, εξαγωγή πληροφοριών και απάντηση ερωτήσεων, μεταξύ των άλλοι.

Amazon Sage Maker είναι μια πλήρως διαχειριζόμενη υπηρεσία που παρέχει στους προγραμματιστές και στους επιστήμονες δεδομένων τη δυνατότητα να δημιουργούν, να εκπαιδεύουν και να αναπτύσσουν γρήγορα μοντέλα μηχανικής μάθησης (ML). Το SageMaker αφαιρεί τη βαριά ανύψωση από κάθε βήμα της διαδικασίας ML, διευκολύνοντας την ανάπτυξη μοντέλων υψηλής ποιότητας. Το SageMaker Python SDK παρέχει API και κοντέινερ ανοιχτού κώδικα για την εκπαίδευση και την ανάπτυξη μοντέλων στο SageMaker, χρησιμοποιώντας πολλά διαφορετικά πλαίσια ML και βαθιάς μάθησης.

Η ενσωμάτωση Hugging Face με το SageMaker σάς επιτρέπει να δημιουργείτε μοντέλα Hugging Face σε κλίμακα στις δικές σας περιπτώσεις χρήσης για συγκεκριμένο τομέα.

Σε αυτήν την ανάρτηση, σας παρουσιάζουμε ένα παράδειγμα για το πώς να δημιουργήσετε και να αναπτύξετε μια προσαρμοσμένη σύνοψη κειμένου Hugging Face στο SageMaker. Χρησιμοποιούμε το Pegasus [1] για το σκοπό αυτό, το πρώτο μοντέλο που βασίζεται σε Transformer ειδικά προεκπαιδευμένο σε έναν στόχο προσαρμοσμένο για αφηρημένη σύνοψη κειμένου. Ο BERT είναι προεκπαιδευμένος στην απόκρυψη τυχαίων λέξεων σε μια πρόταση. Αντίθετα, κατά την προ-εκπαίδευση του Πήγασου, οι προτάσεις καλύπτονται από ένα έγγραφο εισαγωγής. Στη συνέχεια, το μοντέλο δημιουργεί τις προτάσεις που λείπουν ως μια ενιαία ακολουθία εξόδου χρησιμοποιώντας όλες τις αποκαλυμμένες προτάσεις ως πλαίσιο, δημιουργώντας ως αποτέλεσμα μια εκτελεστική περίληψη του εγγράφου.

Χάρη στην ευελιξία της βιβλιοθήκης HuggingFace, μπορείτε εύκολα να προσαρμόσετε τον κώδικα που εμφανίζεται σε αυτήν την ανάρτηση για άλλους τύπους μοντέλων μετασχηματιστών, όπως t5, BART και άλλα.

Φορτώστε το δικό σας σύνολο δεδομένων για να ρυθμίσετε με ακρίβεια ένα μοντέλο Hugging Face

Για να φορτώσουμε ένα προσαρμοσμένο σύνολο δεδομένων από ένα αρχείο CSV, χρησιμοποιούμε το load_dataset μέθοδο από το πακέτο Transformers. Μπορούμε να εφαρμόσουμε tokenization στο φορτωμένο σύνολο δεδομένων χρησιμοποιώντας το 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 στο σύνολο δεδομένων μας. Μπορείτε επίσης να βρείτε πολλά δείγματα τετραδίων που σας καθοδηγούν στη λεπτομερή ρύθμιση διαφορετικών τύπων μοντέλων, που διατίθενται απευθείας στο αποθετήριο μετασχηματιστών GitHub. Για να ενεργοποιήσουμε την κατανεμημένη εκπαίδευση, μπορούμε να χρησιμοποιήσουμε το Βιβλιοθήκη Παραλληλισμού Δεδομένων στο SageMaker, το οποίο έχει ενσωματωθεί στο HuggingFace Trainer API. Για να ενεργοποιήσουμε τον παραλληλισμό δεδομένων, πρέπει να ορίσουμε το 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, το συνολικό μέγεθος παρτίδας είναι το άθροισμα κάθε παρτίδας που κατανέμεται σε κάθε συσκευή/GPU. Αν χρησιμοποιήσουμε ένα παράδειγμα ml.g4dn.16xlarge με κατανεμημένη εκπαίδευση αντί για ένα παράδειγμα ml.g4dn.xlarge, έχουμε οκτώ φορές (8 GPU) περισσότερη μνήμη από μια παρουσία ml.g4dn.xlarge (1 GPU). Το μέγεθος παρτίδας ανά συσκευή παραμένει το ίδιο, αλλά οκτώ συσκευές εκπαιδεύονται παράλληλα.

Ως συνήθως με το SageMaker, δημιουργούμε ένα train.py σενάριο για χρήση με τη λειτουργία Script Mode και μετάδοση υπερπαραμέτρων για εκπαίδευση. Το παρακάτω απόσπασμα κώδικα για το 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" (για οδηγίες, βλ Μοντέλα Pegasus), επιλέγοντας Ανάπτυξη, και μετά επιλέγοντας Amazon Sage Maker, χωρίς να χρειάζεται να γράψετε ένα σενάριο συμπερασμάτων.

Ωστόσο, εάν χρειάζεστε κάποιο συγκεκριμένο τρόπο δημιουργίας ή μεταδιεργασίας προβλέψεων, για παράδειγμα τη δημιουργία πολλών συνοπτικών προτάσεων με βάση μια λίστα διαφορετικών παραμέτρων δημιουργίας κειμένου, η σύνταξη του δικού σας σεναρίου συμπερασμάτων μπορεί να είναι χρήσιμη και σχετικά απλή:

# 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 χρειάζεται μόνο τις ακόλουθες λειτουργίες προτύπου:

  • μοντέλο_fn () – Διαβάζει το περιεχόμενο του τι αποθηκεύτηκε στο τέλος της εκπαιδευτικής εργασίας μέσα SM_MODEL_DIR, ή από έναν υπάρχοντα κατάλογο βαρών μοντέλου που έχει αποθηκευτεί ως αρχείο tar.gz Απλή υπηρεσία αποθήκευσης Amazon (Amazon S3). Χρησιμοποιείται για τη φόρτωση του εκπαιδευμένου μοντέλου και του σχετικού tokenizer.
  • είσοδος_fn () – Μορφοποιεί τα δεδομένα που λαμβάνονται από ένα αίτημα που υποβλήθηκε στο τελικό σημείο.
  • προβλέψτε_fn () – Καλεί την έξοδο του model_fn() (το μοντέλο και το tokenizer) για την εκτέλεση συμπερασμάτων σχετικά με την έξοδο του input_fn() (τα μορφοποιημένα δεδομένα).

Προαιρετικά, μπορείτε να δημιουργήσετε ένα output_fn() λειτουργία για μορφοποίηση συμπερασμάτων, χρησιμοποιώντας την έξοδο του predict_fn(), το οποίο δεν δείξαμε σε αυτήν την ανάρτηση.

Στη συνέχεια, μπορούμε να αναπτύξουμε το εκπαιδευμένο μοντέλο Hugging Face με το σχετικό σενάριο συμπερασμάτων στο SageMaker χρησιμοποιώντας το Hugging Face 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'
                         )

Δοκιμάστε το αναπτυγμένο μοντέλο

Για αυτό το demo, εκπαιδεύσαμε το μοντέλο στο Σύνολο δεδομένων κριτικών γυναικείων ενδυμάτων ηλεκτρονικού εμπορίου, το οποίο περιέχει κριτικές άρθρων ένδυσης (τα οποία θεωρούμε ως το κείμενο εισαγωγής) και τους σχετικούς τίτλους τους (που θεωρούμε περιλήψεις). Αφού αφαιρέσουμε άρθρα με τίτλους που λείπουν, το σύνολο δεδομένων περιέχει 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: Pre-training with Extracted Gap-pretences for Abstractive Sumarization


Σχετικά με τους συγγραφείς

Ρυθμίστε και αναπτύξτε ένα μοντέλο σύνοψης χρησιμοποιώντας τα κοντέινερ Hugging Face Amazon SageMaker φέρνοντας το δικό σας σενάριο PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται. Βίκτορ Μαλέσεβιτς είναι Μηχανικός Μηχανικής Μάθησης με Επαγγελματικές Υπηρεσίες AWS, παθιασμένος με την επεξεργασία φυσικής γλώσσας και τα MLOps. Συνεργάζεται με πελάτες για να αναπτύξει και να βάλει προκλητικά μοντέλα βαθιάς μάθησης στην παραγωγή στο AWS. Στον ελεύθερο χρόνο του, απολαμβάνει να μοιράζεται ένα ποτήρι κόκκινο κρασί και λίγο τυρί με φίλους.

Ρυθμίστε και αναπτύξτε ένα μοντέλο σύνοψης χρησιμοποιώντας τα κοντέινερ Hugging Face Amazon SageMaker φέρνοντας το δικό σας σενάριο PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.Aamna Najmi είναι Επιστήμονας Δεδομένων με AWS Professional Services. Είναι παθιασμένη με το να βοηθά τους πελάτες να καινοτομούν με τεχνολογίες Big Data και Τεχνητής Νοημοσύνης για να αξιοποιήσουν την επιχειρηματική αξία και τις πληροφορίες από τα δεδομένα. Στον ελεύθερο χρόνο της, της αρέσει η κηπουρική και τα ταξίδια σε νέα μέρη.

Σφραγίδα ώρας:

Περισσότερα από Μηχανική εκμάθηση AWS