Νοημοσύνη δεδομένων Πλάτωνα.
Κάθετη Αναζήτηση & Αι.

Βελτιώστε τον κώδικα Llama στο Amazon SageMaker JumpStart | Υπηρεσίες Ιστού της Amazon

Ημερομηνία:

Σήμερα, είμαστε ενθουσιασμένοι που ανακοινώνουμε τη δυνατότητα να τελειοποιήσουμε τα μοντέλα Code Llama από τη Meta χρησιμοποιώντας Amazon SageMaker JumpStart. Η οικογένεια μοντέλων μεγάλων γλωσσών Code Llama (LLMs) είναι μια συλλογή προεκπαιδευμένων και βελτιστοποιημένων μοντέλων παραγωγής κώδικα που κυμαίνονται σε κλίμακα από 7 δισεκατομμύρια έως 70 δισεκατομμύρια παραμέτρους. Τα καλά συντονισμένα μοντέλα Code Llama παρέχουν καλύτερη ακρίβεια και επεξήγηση σε σχέση με τα βασικά μοντέλα Code Llama, όπως φαίνεται από τις δοκιμές του έναντι HumanEval και σύνολα δεδομένων MBPP. Μπορείτε να ρυθμίσετε και να αναπτύξετε μοντέλα Code Llama με το SageMaker JumpStart χρησιμοποιώντας το Στούντιο Amazon SageMaker UI με μερικά κλικ ή χρησιμοποιώντας το SageMaker Python SDK. Η τελειοποίηση των μοντέλων Llama βασίζεται στα σενάρια που παρέχονται στο λάμα-συνταγές ρεπο GitHub από το Meta χρησιμοποιώντας τεχνικές κβαντοποίησης PyTorch FSDP, PEFT/LoRA και Int8.

Σε αυτήν την ανάρτηση, περιγράφουμε πώς να τελειοποιήσετε τα προεκπαιδευμένα μοντέλα Code Llama μέσω του SageMaker JumpStart μέσω μιας εμπειρίας UI και SDK με ένα κλικ που είναι διαθέσιμη στα ακόλουθα Αποθετήριο GitHub.

Τι είναι το SageMaker JumpStart

Με το SageMaker JumpStart, οι επαγγελματίες μηχανικής μάθησης (ML) μπορούν να επιλέξουν από μια ευρεία γκάμα διαθέσιμων στο κοινό μοντέλων θεμελίων. Οι επαγγελματίες ML μπορούν να αναπτύξουν μοντέλα θεμελίωσης σε αποκλειστική χρήση Amazon Sage Maker στιγμιότυπα από ένα απομονωμένο περιβάλλον δικτύου και προσαρμόστε μοντέλα χρησιμοποιώντας το SageMaker για εκπαίδευση και ανάπτυξη μοντέλων.

Τι είναι το Code Llama

Το Code Llama είναι μια έκδοση του κωδικού Λάμα 2 που δημιουργήθηκε με την περαιτέρω εκπαίδευση του Llama 2 στα σύνολα δεδομένων του για συγκεκριμένο κώδικα και τη δειγματοληψία περισσότερων δεδομένων από το ίδιο σύνολο δεδομένων για μεγαλύτερο χρονικό διάστημα. Το Code Llama διαθέτει βελτιωμένες δυνατότητες κωδικοποίησης. Μπορεί να δημιουργήσει κώδικα και φυσική γλώσσα σχετικά με τον κώδικα, τόσο από κώδικα όσο και από προτροπές φυσικής γλώσσας (για παράδειγμα, "Γράψτε μου μια συνάρτηση που εξάγει την ακολουθία Fibonacci"). Μπορείτε επίσης να το χρησιμοποιήσετε για τη συμπλήρωση κώδικα και τον εντοπισμό σφαλμάτων. Υποστηρίζει πολλές από τις πιο δημοφιλείς γλώσσες προγραμματισμού που χρησιμοποιούνται σήμερα, όπως Python, C++, Java, PHP, Typescript (JavaScript), C#, Bash και άλλα.

Γιατί να τελειοποιήσετε τα μοντέλα Code Llama

Η Meta δημοσίευσε τα σημεία αναφοράς απόδοσης του Code Llama HumanEval και MBPP για κοινές γλώσσες κωδικοποίησης όπως Python, Java και JavaScript. Η απόδοση των μοντέλων Code Llama Python στο HumanEval έδειξε ποικίλες επιδόσεις σε διαφορετικές γλώσσες κωδικοποίησης και εργασίες που κυμαίνονται από 38% στο μοντέλο Python 7B έως 57% σε μοντέλα Python 70B. Επιπλέον, τα βελτιωμένα μοντέλα Code Llama στη γλώσσα προγραμματισμού SQL έχουν δείξει καλύτερα αποτελέσματα, όπως φαίνεται στα σημεία αναφοράς αξιολόγησης SQL. Αυτά τα δημοσιευμένα σημεία αναφοράς υπογραμμίζουν τα πιθανά οφέλη από τη βελτίωση των μοντέλων Code Llama, επιτρέποντας καλύτερη απόδοση, προσαρμογή και προσαρμογή σε συγκεκριμένους τομείς και εργασίες κωδικοποίησης.

Βελτιστοποίηση χωρίς κώδικα μέσω της διεπαφής χρήστη του SageMaker Studio

Για να ξεκινήσετε να βελτιώνετε τα μοντέλα Llama χρησιμοποιώντας το SageMaker Studio, ολοκληρώστε τα παρακάτω βήματα:

  1. Στην κονσόλα SageMaker Studio, επιλέξτε εκκίνηση με άλμα στο παράθυρο πλοήγησης.

Θα βρείτε λίστες με περισσότερα από 350 μοντέλα που κυμαίνονται από ανοιχτού κώδικα και ιδιόκτητα μοντέλα.

  1. Αναζήτηση για μοντέλα Code Llama.

Εάν δεν βλέπετε μοντέλα Code Llama, μπορείτε να ενημερώσετε την έκδοση του SageMaker Studio τερματίζοντας και επανεκκινώντας. Για περισσότερες πληροφορίες σχετικά με τις ενημερώσεις έκδοσης, ανατρέξτε στο Τερματισμός και ενημέρωση εφαρμογών Studio. Μπορείτε επίσης να βρείτε άλλες παραλλαγές μοντέλων επιλέγοντας Εξερευνήστε όλα τα μοντέλα δημιουργίας κώδικα ή αναζητώντας τον κωδικό Λάμα στο πλαίσιο αναζήτησης.

Το SageMaker JumpStart υποστηρίζει επί του παρόντος τη λεπτομέρεια εντολών για μοντέλα Code Llama. Το παρακάτω στιγμιότυπο οθόνης δείχνει τη σελίδα λεπτομέρειας για το μοντέλο Code Llama 2 70B.

  1. Για Τοποθεσία δεδομένων εκπαίδευσης, μπορείτε να υποδείξετε το Απλή υπηρεσία αποθήκευσης Amazon (Amazon S3) κάδος που περιέχει τα σύνολα δεδομένων εκπαίδευσης και επικύρωσης για τελειοποίηση.
  2. Ρυθμίστε τις ρυθμίσεις παραμέτρων ανάπτυξης, τις υπερπαραμέτρους και τις ρυθμίσεις ασφαλείας για τελειοποίηση.
  3. Επιλέξτε Τρένο για να ξεκινήσετε την εργασία λεπτομέρειας σε μια παρουσία του SageMaker ML.

Συζητάμε τη μορφή δεδομένων που χρειάζεστε για να προετοιμάσετε για τη λεπτομερή ρύθμιση των οδηγιών στην επόμενη ενότητα.

  1. Αφού τελειοποιήσετε το μοντέλο, μπορείτε να το αναπτύξετε χρησιμοποιώντας τη σελίδα μοντέλου στο SageMaker JumpStart.

Η επιλογή ανάπτυξης του μικροσυντονισμένου μοντέλου θα εμφανιστεί όταν ολοκληρωθεί η μικροσυντονισμός, όπως φαίνεται στο παρακάτω στιγμιότυπο οθόνης.

Βελτιστοποιήστε μέσω του SageMaker Python SDK

Σε αυτήν την ενότητα, δείχνουμε πώς να τελειοποιήσετε τα μοντέλα Code LIama χρησιμοποιώντας το SageMaker Python SDK σε ένα σύνολο δεδομένων με μορφοποίηση εντολών. Συγκεκριμένα, το μοντέλο έχει ρυθμιστεί με ακρίβεια για ένα σύνολο εργασιών επεξεργασίας φυσικής γλώσσας (NLP) που περιγράφονται χρησιμοποιώντας οδηγίες. Αυτό βοηθά στη βελτίωση της απόδοσης του μοντέλου για μη εμφανείς εργασίες με προτροπές μηδενικής λήψης.

Ολοκληρώστε τα παρακάτω βήματα για να ολοκληρώσετε την εργασία βελτιστοποίησης. Μπορείτε να λάβετε ολόκληρο τον κώδικα μικρορύθμισης από το Αποθετήριο GitHub.

Αρχικά, ας δούμε τη μορφή δεδομένων που απαιτείται για τη λεπτομερή ρύθμιση της εντολής. Τα δεδομένα εκπαίδευσης θα πρέπει να μορφοποιηθούν σε μορφή JSON lines (.jsonl), όπου κάθε γραμμή είναι ένα λεξικό που αντιπροσωπεύει ένα δείγμα δεδομένων. Όλα τα δεδομένα εκπαίδευσης πρέπει να βρίσκονται σε έναν μόνο φάκελο. Ωστόσο, μπορεί να αποθηκευτεί σε πολλά αρχεία .jsonl. Το παρακάτω είναι ένα δείγμα σε μορφή JSON lines:

{
	'system_prompt': 'a chat',
	'question': 'Please focus on the efficiency of this problem and provide code in python:nYou are given two strings `s` and `t` consisting of only lowercase English letters.nnReturn _the minimum number of characters that need to be appended to the end of_ `s` _so that_ `t` _becomes a **subsequence** of_ `s`.nnA **subsequence** is a string that can be derived from another string by deleting some or no characters without changing the order of the remaining characters.nn**Example 1:**nn**Input:** s = "coaching ", t = "coding "n**Output:** 4n**Explanation:** Append the characters "ding " to the end of s so that s = "coachingding ".nNow, t is a subsequence of s ( "**co**aching**ding** ").nIt can be shown that appending any 3 characters to the end of s will never make t a subsequence.nn**Example 2:**nn**Input:** s = "abcde ", t = "a "n**Output:** 0n**Explanation:** t is already a subsequence of s ( "**a**bcde ").nn**Example 3:**nn**Input:** s = "z ", t = "abcde "n**Output:** 5n**Explanation:** Append the characters "abcde " to the end of s so that s = "zabcde ".nNow, t is a subsequence of s ( "z**abcde** ").nIt can be shown that appending any 4 characters to the end of s will never make t a subsequence.nn**Constraints:**nn* `1 <= s.length, t.length <= 105`n* `s` and `t` consist only of lowercase English letters.',
	'response': '### Explanationn The algorithm maintains two pointers, `i` and `j`, to iterate through the given strings `s` and `t`. The pointer `i` iterates through the string `s` and the pointer `j` iterates through the string `t`. While iterating through `s`, if we find a character that matches the current character in `t`, we increment the `j` pointer. This is because the matched character can be a part of the subsequence we are looking for. The iteration stops when either `i` reaches the end of `s` or `j` reaches the end of `t`.nnAt the end, we subtract the index `j` from the length of `t`. This gives us the minimum number of characters that need to be appended to the end of `s` so that `t` becomes a subsequence of `s`.nn### Pseudocode:n```nMIN-ADDITION(s, t)n s_len = LENGTH(s)n t_len = LENGTH(t)n i = 1n j = 1n WHILE i <= s_len AND j <= t_lenn IF s[i] == t[j]n j = j + 1n ENDIFn i = i + 1n ENDWHILEn RETURN t_len - j + 1nENDMIN-ADDITIONn```nn### Coden```pythonndef min_addition(s: str, t: str) -> int:n s_len = len(s)n t_len = len(t)n i, j = 0, 0n while i < s_len and j < t_len:n if s[i] == t[j]:n j += 1n i += 1n return t_len - jn```n'
}

Ο φάκελος εκπαίδευσης μπορεί να περιέχει α template.json αρχείο που περιγράφει τις μορφές εισόδου και εξόδου. Το παρακάτω είναι ένα παράδειγμα προτύπου:

{
    "prompt": "{system_prompt} ### Input: {question}",
    "completion": "{response}"
}

Για να ταιριάζει με το πρότυπο, κάθε δείγμα στα αρχεία γραμμών JSON πρέπει να περιλαμβάνει system_prompt, question, να response χωράφια. Σε αυτήν την επίδειξη, χρησιμοποιούμε το Δεδομένα Dolphin Coder από το Hugging Face.

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

from sagemaker.jumpstart.estimator import JumpStartEstimator

model_id = "meta-textgeneration-llama-codellama-7b" 
model_version = "*"
train_data_location = f"s3://{your_own_bucket_hosting_training_data}/" # training data in s3 bucket

estimator = JumpStartEstimator(
    model_id=model_id,
    model_version=model_version,
    hyperparameters= hyperparameters,
    environment={
        "accept_eula": "false"
    },  # please change `accept_eula` to be `true` to accept EULA.
)

estimator.fit({"training": train_data_location})

Μπορείτε να αναπτύξετε το τελειοποιημένο μοντέλο απευθείας από τον εκτιμητή, όπως φαίνεται στον παρακάτω κώδικα. Για λεπτομέρειες, δείτε το σημειωματάριο στο Αποθετήριο GitHub.

finetuned_predictor = estimator.deploy()

Τεχνικές μικρορύθμισης

Τα μοντέλα γλώσσας όπως το Llama έχουν μέγεθος μεγαλύτερο από 10 GB ή ακόμα και 100 GB. Η τελειοποίηση τέτοιων μεγάλων μοντέλων απαιτεί περιπτώσεις με σημαντικά υψηλή μνήμη CUDA. Επιπλέον, η εκπαίδευση αυτών των μοντέλων μπορεί να είναι πολύ αργή λόγω του μεγέθους του μοντέλου. Επομένως, για αποτελεσματική μικρορύθμιση, χρησιμοποιούμε τις ακόλουθες βελτιστοποιήσεις:

  • Προσαρμογή χαμηλής κατάταξης (LoRA) – Αυτός είναι ένας τύπος παραμέτρου αποδοτικής μικρορύθμισης (PEFT) για αποτελεσματική μικρορύθμιση μεγάλων μοντέλων. Με αυτήν τη μέθοδο, παγώνετε ολόκληρο το μοντέλο και προσθέτετε μόνο ένα μικρό σύνολο ρυθμιζόμενων παραμέτρων ή επιπέδων στο μοντέλο. Για παράδειγμα, αντί να εκπαιδεύσετε και τις 7 δισεκατομμύρια παραμέτρους για το Llama 2 7B, μπορείτε να ρυθμίσετε με ακρίβεια λιγότερο από το 1% των παραμέτρων. Αυτό βοηθά στη σημαντική μείωση της απαίτησης μνήμης επειδή χρειάζεται να αποθηκεύσετε μόνο διαβαθμίσεις, καταστάσεις βελτιστοποίησης και άλλες πληροφορίες που σχετίζονται με την εκπαίδευση μόνο για το 1% των παραμέτρων. Επιπλέον, αυτό βοηθά στη μείωση του χρόνου προπόνησης καθώς και του κόστους. Για περισσότερες λεπτομέρειες σχετικά με αυτήν τη μέθοδο, ανατρέξτε στο LoRA: Προσαρμογή χαμηλού βαθμού μεγάλων γλωσσικών μοντέλων.
  • Κβαντισμός Int8 – Ακόμη και με βελτιστοποιήσεις όπως το LoRA, μοντέλα όπως το Llama 70B εξακολουθούν να είναι πολύ μεγάλα για εκπαίδευση. Για να μειώσετε το αποτύπωμα μνήμης κατά τη διάρκεια της προπόνησης, μπορείτε να χρησιμοποιήσετε την κβαντοποίηση Int8 κατά τη διάρκεια της προπόνησης. Η κβαντοποίηση τυπικά μειώνει την ακρίβεια των τύπων δεδομένων κινητής υποδιαστολής. Αν και αυτό μειώνει τη μνήμη που απαιτείται για την αποθήκευση βαρών μοντέλων, υποβαθμίζει την απόδοση λόγω απώλειας πληροφοριών. Η κβαντοποίηση Int8 χρησιμοποιεί μόνο το ένα τέταρτο της ακρίβειας, αλλά δεν επιφέρει υποβάθμιση της απόδοσης επειδή δεν ρίχνει απλώς τα bits. Στρογγυλοποιεί τα δεδομένα από τον έναν τύπο στον άλλο. Για να μάθετε σχετικά με την κβαντοποίηση Int8, ανατρέξτε στο LLM.int8(): Πολλαπλασιασμός Matrix 8-bit για μετασχηματιστές σε κλίμακα.
  • Πλήρως σπασμένα δεδομένα παράλληλα (FSDP) – Αυτός είναι ένας τύπος αλγόριθμου εκπαίδευσης παράλληλων δεδομένων που κατακερματίζει τις παραμέτρους του μοντέλου σε παράλληλους εργαζόμενους δεδομένων και μπορεί προαιρετικά να μεταφορτώσει μέρος του υπολογισμού της εκπαίδευσης στις CPU. Παρόλο που οι παράμετροι είναι κατανεμημένες σε διαφορετικές GPU, ο υπολογισμός κάθε μικροπαρτίδας είναι τοπικός για τον εργαζόμενο GPU. Κατακερματίζει τις παραμέτρους πιο ομοιόμορφα και επιτυγχάνει βελτιστοποιημένη απόδοση μέσω αλληλοεπικάλυψης επικοινωνίας και υπολογισμού κατά τη διάρκεια της προπόνησης.

Ο παρακάτω πίνακας συνοψίζει τις λεπτομέρειες κάθε μοντέλου με διαφορετικές ρυθμίσεις.

Μοντέλο Προεπιλεγμένη ρύθμιση LORA + FSDP LORA + Χωρίς FSDP Int8 Quantization + LORA + No FSDP
Κωδικός Llama 2 7B LORA + FSDP Ναι Ναι Ναι
Κωδικός Llama 2 13B LORA + FSDP Ναι Ναι Ναι
Κωδικός Llama 2 34B INT8 + LORA + ΟΧΙ FSDP Οχι Οχι Ναι
Κωδικός Llama 2 70B INT8 + LORA + ΟΧΙ FSDP Οχι Οχι Ναι

Η τελειοποίηση των μοντέλων Llama βασίζεται σε σενάρια που παρέχονται από τα ακόλουθα GitHub repo.

Υποστηριζόμενες υπερπαράμετροι για προπόνηση

Η λεπτομέρεια του Code Llama 2 υποστηρίζει έναν αριθμό υπερπαραμέτρων, καθεμία από τις οποίες μπορεί να επηρεάσει την απαίτηση μνήμης, την ταχύτητα προπόνησης και την απόδοση του βελτιωμένου μοντέλου:

  • εποχή – Ο αριθμός των περασμάτων που πραγματοποιεί ο αλγόριθμος μικρορύθμισης μέσω του συνόλου δεδομένων εκπαίδευσης. Πρέπει να είναι ακέραιος αριθμός μεγαλύτερος από 1. Η προεπιλογή είναι 5.
  • βαθμός μάθησης – Ο ρυθμός με τον οποίο ενημερώνονται τα βάρη του μοντέλου μετά την επεξεργασία κάθε παρτίδας παραδειγμάτων εκπαίδευσης. Πρέπει να είναι θετικός float μεγαλύτερος από 0. Η προεπιλογή είναι 1e-4.
  • instruction_tuned – Είτε θα εκπαιδεύσετε-εκπαιδεύσετε το μοντέλο είτε όχι. Πρέπει να είναι True or False. Η προεπιλογή είναι False.
  • ανά_συσκευή_train_batch_size – Το μέγεθος παρτίδας ανά πυρήνα/CPU GPU για εκπαίδευση. Πρέπει να είναι θετικός ακέραιος αριθμός. Η προεπιλογή είναι 4.
  • ανά_συσκευή_eval_batch_size – Το μέγεθος παρτίδας ανά πυρήνα/CPU GPU για αξιολόγηση. Πρέπει να είναι θετικός ακέραιος αριθμός. Η προεπιλογή είναι 1.
  • max_train_samples – Για σκοπούς εντοπισμού σφαλμάτων ή ταχύτερη εκπαίδευση, περικόψτε τον αριθμό των παραδειγμάτων εκπαίδευσης σε αυτήν την τιμή. Η τιμή -1 σημαίνει τη χρήση όλων των δειγμάτων εκπαίδευσης. Πρέπει να είναι θετικός ακέραιος ή -1. Η προεπιλογή είναι -1.
  • max_val_samples – Για σκοπούς εντοπισμού σφαλμάτων ή ταχύτερη εκπαίδευση, περικόψτε τον αριθμό των παραδειγμάτων επικύρωσης σε αυτήν την τιμή. Η τιμή -1 σημαίνει τη χρήση όλων των δειγμάτων επικύρωσης. Πρέπει να είναι θετικός ακέραιος ή -1. Η προεπιλογή είναι -1.
  • max_input_length – Μέγιστο συνολικό μήκος ακολουθίας εισαγωγής μετά τη διαγραφή. Ακολουθίες μεγαλύτερες από αυτό θα περικοπούν. Αν -1, max_input_length έχει οριστεί στο ελάχιστο 1024 και το μέγιστο μήκος μοντέλου που ορίζεται από το tokenizer. Εάν οριστεί σε θετική τιμή, max_input_length ορίζεται στο ελάχιστο της παρεχόμενης τιμής και το model_max_length που ορίζεται από το tokenizer. Πρέπει να είναι θετικός ακέραιος ή -1. Η προεπιλογή είναι -1.
  • αναλογία_διαχωρισμού_επικύρωσης – Εάν υπάρχει κανάλι επικύρωσης none, ο λόγος του διαχωρισμού της αμαξοστοιχίας-επικύρωσης από τα δεδομένα αμαξοστοιχίας πρέπει να είναι μεταξύ 0–1. Η προεπιλογή είναι 0.2.
  • train_data_split_seed – Εάν δεν υπάρχουν δεδομένα επικύρωσης, αυτό διορθώνει τον τυχαίο διαχωρισμό των δεδομένων εκπαίδευσης εισόδου σε δεδομένα εκπαίδευσης και επικύρωσης που χρησιμοποιούνται από τον αλγόριθμο. Πρέπει να είναι ακέραιος. Η προεπιλογή είναι 0.
  • preprocessing_num_workers – Ο αριθμός των διεργασιών που θα χρησιμοποιηθούν για την προεπεξεργασία. Αν None, η κύρια διαδικασία χρησιμοποιείται για την προεπεξεργασία. Η προεπιλογή είναι None.
  • lora_r – Lora R. Πρέπει να είναι θετικός ακέραιος αριθμός. Η προεπιλογή είναι 8.
  • lora_alpha – Λώρα Άλφα. Πρέπει να είναι θετικός ακέραιος αριθμός. Η προεπιλογή είναι 32
  • lora_dropout – Lora Dropout. πρέπει να είναι θετική διακύμανση μεταξύ 0 και 1. Η προεπιλογή είναι 0.05.
  • int8_quantization - Αν True, το μοντέλο είναι φορτωμένο με ακρίβεια 8-bit για εκπαίδευση. Η προεπιλογή για τα 7B και 13B είναι False. Η προεπιλογή για 70Β είναι True.
  • enable_fsdp – Εάν ισχύει, η εκπαίδευση χρησιμοποιεί FSDP. Η προεπιλογή για τα 7B και 13B είναι True. Η προεπιλογή για το 70B είναι False. Σημειώστε ότι int8_quantization δεν υποστηρίζεται με FSDP.

Κατά την επιλογή των υπερπαραμέτρων, λάβετε υπόψη τα ακόλουθα:

  • Ρύθμιση int8_quantization=True μειώνει τις απαιτήσεις μνήμης και οδηγεί σε ταχύτερη προπόνηση.
  • Μείωση per_device_train_batch_size και max_input_length μειώνει την απαίτηση μνήμης και επομένως μπορεί να εκτελεστεί σε μικρότερες περιπτώσεις. Ωστόσο, η ρύθμιση πολύ χαμηλών τιμών μπορεί να αυξήσει τον χρόνο προπόνησης.
  • Εάν δεν χρησιμοποιείτε κβαντισμό Int8 (int8_quantization=False), χρησιμοποιήστε το FSDP (enable_fsdp=True) για ταχύτερη και αποτελεσματική προπόνηση.

Υποστηριζόμενοι τύποι παρουσιών για εκπαίδευση

Ο παρακάτω πίνακας συνοψίζει τους υποστηριζόμενους τύπους παρουσιών για την εκπαίδευση διαφορετικών μοντέλων.

Μοντέλο Προεπιλεγμένος τύπος παρουσίας Υποστηριζόμενοι τύποι παρουσιών
Κωδικός Llama 2 7B ml.g5.12xμεγάλο

ml.g5.12xlarge,

ml.g5.24xlarge,

ml.g5.48xlarge,

ml.p3dn.24xlarge,

ml.g4dn.12xlarge

Κωδικός Llama 2 13B ml.g5.12xμεγάλο

ml.g5.24xlarge,

ml.g5.48xlarge,

ml.p3dn.24xlarge,

ml.g4dn.12xlarge

Κωδικός Llama 2 70B ml.g5.48xμεγάλο

ml.g5.48xμεγάλο

ml.p4d.24xlarge

Όταν επιλέγετε τον τύπο του στιγμιότυπου, λάβετε υπόψη τα εξής:

  • Οι παρουσίες G5 παρέχουν την πιο αποτελεσματική εκπαίδευση μεταξύ των υποστηριζόμενων τύπων παρουσιών. Επομένως, εάν έχετε διαθέσιμες παρουσίες G5, θα πρέπει να τις χρησιμοποιήσετε.
  • Ο χρόνος εκπαίδευσης εξαρτάται σε μεγάλο βαθμό από τον αριθμό των GPU και τη διαθέσιμη μνήμη CUDA. Επομένως, η εκπαίδευση σε περιπτώσεις με τον ίδιο αριθμό GPU (για παράδειγμα, ml.g5.2xlarge και ml.g5.4xlarge) είναι περίπου η ίδια. Επομένως, μπορείτε να χρησιμοποιήσετε το φθηνότερο παράδειγμα για προπόνηση (ml.g5.2xlarge).
  • Όταν χρησιμοποιείτε παρουσίες p3, η εκπαίδευση θα γίνεται με ακρίβεια 32 bit επειδή το bfloat16 δεν υποστηρίζεται σε αυτές τις περιπτώσεις. Επομένως, η εργασία εκπαίδευσης θα καταναλώσει διπλάσια ποσότητα μνήμης CUDA κατά την προπόνηση σε περιπτώσεις p3 σε σύγκριση με περιπτώσεις g5.

Για να μάθετε σχετικά με το κόστος της εκπαίδευσης ανά περίπτωση, ανατρέξτε στο Περιπτώσεις Amazon EC2 G5.

Εκτίμηση

Η αξιολόγηση είναι ένα σημαντικό βήμα για την αξιολόγηση της απόδοσης των τελειοποιημένων μοντέλων. Παρουσιάζουμε τόσο ποιοτικές όσο και ποσοτικές αξιολογήσεις για να δείξουμε βελτίωση των μοντέλων με ακρίβεια σε σχέση με τα μη βελτιωμένα. Στην ποιοτική αξιολόγηση, δείχνουμε ένα παράδειγμα απόκρισης τόσο από βελτιωμένα όσο και από μη βελτιωμένα μοντέλα. Στην ποσοτική αξιολόγηση χρησιμοποιούμε HumanEval, μια δοκιμαστική σουίτα που αναπτύχθηκε από την OpenAI για τη δημιουργία κώδικα Python για τον έλεγχο των δυνατοτήτων παραγωγής σωστών και ακριβών αποτελεσμάτων. Το αποθετήριο HumanEval είναι υπό άδεια MIT. Βελτιστοποιήσαμε τις παραλλαγές Python όλων των μοντέλων Code LIama σε διαφορετικά μεγέθη (Κωδικός LIama Python 7B, 13B, 34B και 70B στο Δεδομένα Dolphin Coder), και παρουσιάστε τα αποτελέσματα της αξιολόγησης στις ακόλουθες ενότητες.

Ποιοτική αξιολόγηση

Με την ανάπτυξη του βελτιωμένου μοντέλου σας, μπορείτε να αρχίσετε να χρησιμοποιείτε το τελικό σημείο για τη δημιουργία κώδικα. Στο παρακάτω παράδειγμα, παρουσιάζουμε απαντήσεις τόσο από βασικές όσο και από λεπτοσυντονισμένες παραλλαγές του Code LIama 34B Python σε ένα δείγμα δοκιμής στο Δεδομένα Dolphin Coder:

alpaca_format = """{system_prompt}

### Input:
{question}

### Response:n"""

system="You are a coding AI"
prompt = """Please explain the reasoning behind the following solution and 
provide code in python: Given a string `s`, return the longest palindromic 
substring in `s`. **Example 1:** **Input:** s = "babad " **Output:** "bab " 
**Explanation:** "aba " is also a valid answer. **Example 2:** 
**Input:** s = "cbbd " **Output:** "bb " 
**Constraints:** * `1 <= s.length <= 1000` * `s` consist of only digits 
and English letters."""

payload = json.dumps({
    "inputText": alpaca_format.format(system_prompt=system, question=prompt),
    "textGenerationConfig": {
    "maxTokenCount": 2048,
    "temperature":0.2
}})

finetuned_response = finetuned_predictor.predict(payload)
finetuned_response["generated_text"]

Το βελτιωμένο μοντέλο Code Llama, εκτός από την παροχή του κώδικα για το προηγούμενο ερώτημα, δημιουργεί μια λεπτομερή εξήγηση της προσέγγισης και έναν ψευδοκώδικα.

Κωδικός Llama 34b Python Non-Fine-Tuned Response:

### Code
def longestPalindrome(s):
    # Fill this in.
    longest = ""
    for i in range(len(s)):
        for j in range(len(s), i, -1):
            if len(longest) >= j-i:
                break
            elif s[i:j] == s[i:j][::-1]:
                longest = s[i:j]
                break
    return longest

print(longestPalindrome("abaxyzzyxf"))
# axyzzyx
###Reference:
- [https://www.geeksforgeeks.org/longest-palindrome-substring-set-1/]
(https://www.geeksforgeeks.org/longest-palindrome-substring-set-1/)

Κωδικός Llama 34B Python Fine-Tuned Response

### Explanation
The algorithm uses dynamic programming to find the longest palindromic substring. 
It initializes a 2D boolean table `dp` with the same dimensions as the input string `s`. 
The `dp[i][j]` value is set to `true` if the substring from index `i` to index `j` is a palindrome.

The algorithm then iterates through the string in a nested loop, starting from the first character to the last. 
It checks if the substring from index `i` to index `j` is a palindrome. 
If it is, it sets the `dp[i][j]` value to `true`. 
If the substring is of length 2 or 3, it sets the `dp[i][j]` value to `true` as well.

After the nested loop, the algorithm iterates through the `dp` table to find the longest palindromic substring. 
It keeps track of the maximum length and the starting and ending indices of the substring.

Finally, the algorithm returns the substring from the starting index to the ending index.

### Code
```python
def longestPalindrome(s: str) -> str:
    n = len(s)
    dp = [[False] * n for _ in range(n)]

    for i in range(n):
        dp[i][i] = True
        if i + 1 < n:
            dp[i][i + 1] = s[i] == s[i + 1]

    max_len = 1
    start = 0
    end = 0

    for i in range(n - 1):
        for j in range(i + 1, n):
            if j - i == 1 or dp[i + 1][j - 1]:
                dp[i][j] = s[i] == s[j]
                if j - i + 1 > max_len:
                    max_len = j - i + 1
                    start = i
                    end = j

    return s[start:end + 1]
```

Βασική αλήθεια

### Explanation 
1. Initialize `start` and `maxLength` for result substring. 
2. Iterate through the given string `s` using the index `i`. 
3. For each index `i`, create two pointers `l` and `r` starting at `i`. 
4. Check if there's a consecutive sequence of identical characters, increment the right pointer `r` until the end of the sequence is reached. 
5. Update the index `i` to the current value of `r`. 
6. Expand the pointers `l` and `r` outwards to find the longest palindromic substring, checking that characters on both sides are equal. 
7. If the current length of the substring is greater than `maxLength`, update `start` and `maxLength`. 
8. Return the longest palindromic substring using the `start` and `maxLength`. 

### Code 
```python 
def longest_palindromic_substring(s: str) → str:
    n = len(s)
    if n == 0:
        return ""
    
    start, max_length = 0, 1
    for i in range(n):
        l, r = i, i
        while r < n - 1 and s[r] == s[r + 1]:
            r += 1
            i = r
        while l > 0 and r < n - 1 and s[l - 1] == s[r + 1]:
            l -= 1
            r += 1
        length = r - l + 1
        if length > max_length:
            start, max_length = l, length
    return s[start:start + max_length]
```

Είναι ενδιαφέρον ότι η τελειοποιημένη έκδοση του Code Llama 34B Python παρέχει μια λύση δυναμικού προγραμματισμού στη μεγαλύτερη παλινδρομική υποσυμβολοσειρά, η οποία είναι διαφορετική από τη λύση που παρέχεται στη βασική αλήθεια από το επιλεγμένο παράδειγμα δοκιμής. Το τελειοποιημένο μοντέλο μας εξηγεί και εξηγεί λεπτομερώς τη λύση που βασίζεται στον δυναμικό προγραμματισμό. Από την άλλη πλευρά, το μη βελτιωμένο μοντέλο έχει παραισθήσεις πιθανές εξόδους αμέσως μετά το print δήλωση (εμφανίζεται στο αριστερό κελί) επειδή η έξοδος axyzzyx δεν είναι το μεγαλύτερο παλίνδρομο στη δεδομένη συμβολοσειρά. Όσον αφορά τη χρονική πολυπλοκότητα, η λύση δυναμικού προγραμματισμού είναι γενικά καλύτερη από την αρχική προσέγγιση. Η λύση δυναμικού προγραμματισμού έχει χρονική πολυπλοκότητα O(n^2), όπου n είναι το μήκος της συμβολοσειράς εισόδου. Αυτό είναι πιο αποτελεσματικό από την αρχική λύση από το μη βελτιστοποιημένο μοντέλο, το οποίο είχε επίσης τετραγωνική χρονική πολυπλοκότητα O(n^2) αλλά με λιγότερο βελτιστοποιημένη προσέγγιση.

Αυτό φαίνεται πολλά υποσχόμενο! Θυμηθείτε, βελτιστοποιήσαμε μόνο την παραλλαγή Code LIama Python με το 10% του Δεδομένα Dolphin Coder. Υπάρχουν πολλά περισσότερα να εξερευνήσετε!

Παρά τις λεπτομερείς οδηγίες στην απόκριση, πρέπει να εξετάσουμε την ορθότητα του κώδικα Python που παρέχεται στη λύση. Στη συνέχεια, χρησιμοποιούμε ένα πλαίσιο αξιολόγησης που ονομάζεται Human Eval να εκτελέσει δοκιμές ολοκλήρωσης στην απόκριση που δημιουργείται από τον Code LIama για να εξετάσει συστηματικά την ποιότητά του.

Ποσοτική αξιολόγηση με την HumanEval

Το HumanEval είναι ένα λουρί αξιολόγησης για την αξιολόγηση των δυνατοτήτων επίλυσης προβλημάτων ενός LLM σε προβλήματα κωδικοποίησης που βασίζονται σε Python, όπως περιγράφεται στην εργασία Αξιολόγηση μοντέλων μεγάλων γλωσσών που εκπαιδεύονται στον κώδικα. Συγκεκριμένα, αποτελείται από 164 πρωτότυπα προβλήματα προγραμματισμού που βασίζονται σε Python που αξιολογούν την ικανότητα ενός γλωσσικού μοντέλου να δημιουργεί κώδικα με βάση τις παρεχόμενες πληροφορίες όπως υπογραφή συνάρτησης, συμβολοσειρά εγγράφων, σώμα και δοκιμές μονάδων.

Για κάθε ερώτηση προγραμματισμού που βασίζεται σε Python, τη στέλνουμε σε ένα μοντέλο Code LIama που έχει αναπτυχθεί σε ένα τελικό σημείο του SageMaker για να λάβουμε k απαντήσεις. Στη συνέχεια, εκτελούμε κάθε μία από τις k απαντήσεις στα τεστ ολοκλήρωσης στο αποθετήριο HumanEval. Εάν οποιαδήποτε απόκριση των αποκρίσεων k περάσει τις δοκιμές ολοκλήρωσης, υπολογίζουμε ότι η περίπτωση δοκιμής είναι επιτυχημένη. διαφορετικά, απέτυχε. Στη συνέχεια επαναλαμβάνουμε τη διαδικασία για να υπολογίσουμε την αναλογία επιτυχών υποθέσεων όπως ονομάστηκε η τελική βαθμολογία αξιολόγησης pass@k. Ακολουθώντας την τυπική πρακτική, ορίσαμε το k ως 1 στην αξιολόγησή μας, για να δημιουργήσουμε μόνο μία απάντηση ανά ερώτηση και να ελέγξουμε εάν περνάει στο τεστ ολοκλήρωσης.

Το παρακάτω είναι ένα δείγμα κώδικα για τη χρήση του αποθετηρίου HumanEval. Μπορείτε να αποκτήσετε πρόσβαση στο σύνολο δεδομένων και να δημιουργήσετε μια μεμονωμένη απάντηση χρησιμοποιώντας ένα τελικό σημείο SageMaker. Για λεπτομέρειες, δείτε το σημειωματάριο στο Αποθετήριο GitHub.

%pip3 install human_eval
import json
from human_eval.evaluation import evaluate_functional_correctness
from human_eval.data import write_jsonl, read_problems
from tqdm import tqdm
problems = read_problems()

num_samples_per_task = 1 # value k: number of responses for each question
samples = [
    dict(task_id=task_id, completion=generate_one_completion(problems[task_id]["prompt"]))
    for task_id in tqdm(problems)
    for _ in range(num_samples_per_task)
]
write_jsonl("samples.jsonl", samples)

evaluate_functional_correctness('./samples.jsonl')

Ο παρακάτω πίνακας δείχνει τις βελτιώσεις των μοντέλων Code LIama Python με λεπτομέρεια σε σχέση με τα μη βελτιωμένα μοντέλα σε διαφορετικά μεγέθη μοντέλων. Για να διασφαλίσουμε την ορθότητα, αναπτύσσουμε επίσης τα μη προσαρμοσμένα μοντέλα Code LIama στα τελικά σημεία του SageMaker και πραγματοποιούμε αξιολογήσεις Human Eval. ο pass@1 οι αριθμοί (η πρώτη σειρά στον παρακάτω πίνακα) ταιριάζουν με τους αναφερόμενους αριθμούς στο Ερευνητική εργασία Code Llama. Οι παράμετροι συμπερασμάτων ορίζονται με συνέπεια ως "parameters": {"max_new_tokens": 384, "temperature": 0.2}.

Όπως μπορούμε να δούμε από τα αποτελέσματα, όλες οι παραλλαγές του Code LIama Python με λεπτομέρεια παρουσιάζουν σημαντική βελτίωση σε σχέση με τα μη βελτιωμένα μοντέλα. Ειδικότερα, το Code LIama Python 70B ξεπερνά κατά 12% περίπου το μοντέλο που δεν έχει ρυθμιστεί με ακρίβεια.

. 7Β Python 13Β Python 34B 34Β Python 70Β Python
Προεκπαιδευμένη απόδοση μοντέλου (pass@1) 38.4 43.3 48.8 53.7 57.3
Βελτιωμένη απόδοση μοντέλου (pass@1) 45.12 45.12 59.1 61.5 69.5

Τώρα μπορείτε να δοκιμάσετε να βελτιώσετε τα μοντέλα Code LIama στο δικό σας σύνολο δεδομένων.

εκκαθάριση

Εάν αποφασίσετε ότι δεν θέλετε πλέον να διατηρείτε το τελικό σημείο του SageMaker σε λειτουργία, μπορείτε να το διαγράψετε χρησιμοποιώντας AWS SDK για Python (Boto3), Διεπαφή γραμμής εντολών AWS (AWS CLI) ή κονσόλα SageMaker. Για περισσότερες πληροφορίες, βλ Διαγραφή τελικών σημείων και πόρων. Επιπλέον, μπορείτε τερματίστε τους πόρους του SageMaker Studio που δεν απαιτούνται πλέον.

Συμπέρασμα

Σε αυτήν την ανάρτηση, συζητήσαμε τη βελτίωση των μοντέλων Code Llama 2 της Meta χρησιμοποιώντας το SageMaker JumpStart. Δείξαμε ότι μπορείτε να χρησιμοποιήσετε την κονσόλα SageMaker JumpStart στο SageMaker Studio ή το SageMaker Python SDK για να τελειοποιήσετε και να αναπτύξετε αυτά τα μοντέλα. Συζητήσαμε επίσης την τεχνική μικρορύθμισης, τους τύπους παρουσιών και τις υποστηριζόμενες υπερπαραμέτρους. Επιπλέον, περιγράψαμε συστάσεις για βελτιστοποιημένη εκπαίδευση με βάση διάφορες δοκιμές που πραγματοποιήσαμε. Όπως μπορούμε να δούμε από αυτά τα αποτελέσματα της λεπτομέρειας τριών μοντέλων σε δύο σύνολα δεδομένων, η τελειοποίηση βελτιώνει τη σύνοψη σε σύγκριση με τα μοντέλα που δεν έχουν συντονιστεί με ακρίβεια. Ως επόμενο βήμα, μπορείτε να δοκιμάσετε να ρυθμίσετε αυτά τα μοντέλα στο δικό σας σύνολο δεδομένων χρησιμοποιώντας τον κώδικα που παρέχεται στο αποθετήριο GitHub για να δοκιμάσετε και να αξιολογήσετε τα αποτελέσματα για τις περιπτώσεις χρήσης σας.


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

Δόκτωρ Σιν Χουάνγκ είναι Senior Applied Scientist για τους ενσωματωμένους αλγόριθμους Amazon SageMaker JumpStart και Amazon SageMaker. Επικεντρώνεται στην ανάπτυξη κλιμακωτών αλγορίθμων μηχανικής μάθησης. Τα ερευνητικά του ενδιαφέροντα είναι στον τομέα της επεξεργασίας φυσικής γλώσσας, της εξηγήσιμης βαθιάς μάθησης σε δεδομένα πινάκων και της ισχυρής ανάλυσης της μη παραμετρικής ομαδοποίησης του χωροχρόνου. Έχει δημοσιεύσει πολλές εργασίες σε συνέδρια ACL, ICDM, KDD και Royal Statistical Society: Series A.

Vishaal Yalamanchali είναι αρχιτέκτονας λύσεων εκκίνησης που συνεργάζεται με εταιρείες παραγωγής τεχνητής νοημοσύνης, ρομποτικής και αυτόνομων οχημάτων σε πρώιμο στάδιο. Ο Vishaal συνεργάζεται με τους πελάτες του για την παροχή λύσεων ML αιχμής και ενδιαφέρεται προσωπικά για την ενισχυτική μάθηση, την αξιολόγηση LLM και τη δημιουργία κώδικα. Πριν από το AWS, ο Vishaal ήταν προπτυχιακός στο UCI, επικεντρωμένος στη βιοπληροφορική και τα ευφυή συστήματα.

Meenakshisundaram Thandavarayan εργάζεται για την AWS ως Ειδικός AI/ML. Έχει πάθος να σχεδιάζει, να δημιουργεί και να προωθεί ανθρωποκεντρικές εμπειρίες δεδομένων και ανάλυσης. Η Meena εστιάζει στην ανάπτυξη βιώσιμων συστημάτων που προσφέρουν μετρήσιμα, ανταγωνιστικά πλεονεκτήματα για στρατηγικούς πελάτες της AWS. Η Meena είναι στοχαστής σύνδεσης και σχεδιασμού και προσπαθεί να οδηγήσει τις επιχειρήσεις σε νέους τρόπους εργασίας μέσω της καινοτομίας, της επώασης και του εκδημοκρατισμού.

Δρ Ashish Khetan είναι Ανώτερος Εφαρμοσμένος Επιστήμονας με ενσωματωμένους αλγόριθμους του Amazon SageMaker και βοηθά στην ανάπτυξη αλγορίθμων μηχανικής μάθησης. Πήρε το διδακτορικό του από το Πανεπιστήμιο του Illinois Urbana-Champaign. Είναι ενεργός ερευνητής στη μηχανική μάθηση και στα στατιστικά συμπεράσματα και έχει δημοσιεύσει πολλές εργασίες σε συνέδρια NeurIPS, ICML, ICLR, JMLR, ACL και EMNLP.

spot_img

Τελευταία Νοημοσύνη

spot_img

Συνομιλία με μας

Γεια σου! Πώς μπορώ να σε βοηθήσω?