Συνδεθείτε μαζί μας

Το πλαίσιο συμπερασμάτων της Microsoft φέρνει μοντέλα μεγάλων γλωσσών 1-bit σε τοπικές συσκευές

Τεχνητή νοημοσύνη

Το πλαίσιο συμπερασμάτων της Microsoft φέρνει μοντέλα μεγάλων γλωσσών 1-bit σε τοπικές συσκευές

mm
Κατανόηση των LLM 1-bit και του πλαισίου BitNet.cpp της Microsoft

Τον Οκτώβριο 17, 2024, Η Microsoft ανακοίνωσε το BitNet.cpp, ένα πλαίσιο συμπερασμάτων σχεδιασμένο για την εκτέλεση μοντέλων 1-bit κβαντισμένων μεγάλων γλωσσών (LLM). Το BitNet.cpp είναι μια σημαντική πρόοδος στο Gen AI, που επιτρέπει την αποτελεσματική ανάπτυξη LLM 1-bit σε τυπικές CPU, χωρίς να απαιτούνται ακριβές GPU. Αυτή η εξέλιξη εκδημοκρατίζει την πρόσβαση σε LLM, καθιστώντας τα διαθέσιμα σε ένα ευρύ φάσμα συσκευών και δίνοντας νέες δυνατότητες σε εφαρμογές τεχνητής νοημοσύνης στη συσκευή.

Κατανόηση μοντέλων μεγάλων γλωσσών 1 bit

Τα μοντέλα μεγάλων γλωσσών (LLM) απαιτούν παραδοσιακά σημαντικούς υπολογιστικούς πόρους λόγω της χρήσης αριθμών κινητής υποδιαστολής υψηλής ακρίβειας (συνήθως FP16 ή BF16) για βάρη μοντέλων. Αυτή η αναγκαιότητα έχει κάνει την ανάπτυξη LLM δαπανηρή και ενεργοβόρα.

Στον πυρήνα τους, τα LLM 1 bit χρησιμοποιούν τεχνικές ακραίας κβαντοποίησης για να αναπαραστήσουν βάρη μοντέλων χρησιμοποιώντας μόνο τρεις πιθανές τιμές: -1, 0 και 1, εξ ου και ο όρος "1.58-bit" (καθώς απαιτεί λίγο περισσότερα από ένα bit για την κωδικοποίηση τριών πολιτείες).

Τριαδικό σύστημα βάρους

Η ιδέα

Η κβαντοποίηση 1 bit στο BitNet.cpp είναι ένα τριαδικό σύστημα βάρους. Το BitNet λειτουργεί με μόνο τρεις πιθανές τιμές για κάθε παράμετρο:

  • -1 (αρνητικός)
  • 0 (ουδέτερος)
  • 1 (θετικός)

Αυτό έχει ως αποτέλεσμα μια απαίτηση αποθήκευσης περίπου 1.58 bit ανά παράμετρο, εξ ου και το όνομα BitNet b1.58. Αυτή η δραστική μείωση στο πλάτος των bit παραμέτρων οδηγεί σε εντυπωσιακή μείωση της χρήσης μνήμης και της υπολογιστικής πολυπλοκότητας, καθώς οι περισσότεροι πολλαπλασιασμοί κινητής υποδιαστολής αντικαθίστανται με απλές προσθέσεις και αφαιρέσεις.

Μαθηματικό Θεμέλιο

Η κβαντοποίηση 1 bit περιλαμβάνει τη μετατροπή βαρών και ενεργοποιήσεων στην τριμερή τους αναπαράσταση μέσω των παρακάτω βημάτων:

1. Δυαδοποίηση βάρους

Η δυαδοποίηση των βαρών περιλαμβάνει τη συγκέντρωση τους γύρω από τον μέσο όρο (α), με αποτέλεσμα μια τριμερή εκπροσώπηση. Ο μετασχηματισμός εκφράζεται μαθηματικά ως:

Wf=Σημάδι(W-α)

Που:

  • W είναι η αρχική μήτρα βάρους.
  • α είναι ο μέσος όρος των βαρών.
  • Σημάδι(x) Επιστροφές +1 if x > 0 και -1 σε διαφορετική περίπτωση.

2. Ενεργοποίηση Κβαντοποίηση

Οι κβαντιστικές ενεργοποιήσεις διασφαλίζουν ότι οι είσοδοι περιορίζονται σε ένα καθορισμένο πλάτος bit:

Που:

  • Qb = 2(b−1)2^{(b-1)} είναι το μέγιστο επίπεδο κβαντισμού για b- πλάτος bit.
  • γ είναι η μέγιστη απόλυτη τιμή του x (σημειώνεται ως ∣∣x∣∣∞).
  • ε είναι ένας μικρός αριθμός για την αποφυγή υπερχείλισης κατά τους υπολογισμούς.

3. Λειτουργία BitLinear

Το επίπεδο BitLinear αντικαθιστά τους παραδοσιακούς πολλαπλασιασμούς πινάκων με μια απλοποιημένη πράξη:

y=Wf×x^e×(Qbβγ)

Που:

  • β είναι ένας παράγοντας κλιμάκωσης που χρησιμοποιείται για την ελαχιστοποίηση των σφαλμάτων προσέγγισης.
  • γ κλιμακώνει τις ενεργοποιήσεις.
  • Q_b είναι ο παράγοντας κβαντοποίησης.

Αυτός ο μετασχηματισμός επιτρέπει αποτελεσματικούς υπολογισμούς διατηρώντας παράλληλα την απόδοση του μοντέλου.

Επιπτώσεις απόδοσης

Αποδοτικότητα μνήμης

Το σύστημα τριαδικού βάρους μειώνει σημαντικά τις απαιτήσεις μνήμης:

  • Παραδοσιακά LLM: 16 bit ανά βάρος
  • BitNet.cpp: 1.58 bit ανά βάρος

Αυτή η μείωση μεταφράζεται σε εξοικονόμηση μνήμης περίπου 90% σε σύγκριση με τα παραδοσιακά μοντέλα 16-bit, επιτρέποντας στα μεγαλύτερα μοντέλα να ταιριάζουν στους ίδιους περιορισμούς υλικού.

Ενεργειακής απόδοσης

Ταχύτητα συμπερασμάτων, ενεργειακή απόδοση (Apple M2)

 

Ταχύτητα συμπερασμάτων: Ταχύτερη και στις δύο CPU

Ταχύτητα συμπερασμάτων, ενεργειακή απόδοση (i7-13700H)

1. Ταχύτητα συμπερασμάτων: Ταχύτερη και στις δύο CPU

Ταχύτητα συμπερασμάτων αναπαρίσταται ως ο αριθμός των tokens που υποβάλλονται σε επεξεργασία ανά δευτερόλεπτο. Ακολουθεί μια ανάλυση των παρατηρήσεων:

  • Στο Apple M2 Ultra: Το BitNet.cpp επιτυγχάνει έως 5.07x επιτάχυνση για μεγαλύτερα μοντέλα (30Β) σε σύγκριση με το Llama.cpp, με μέγιστη ταχύτητα ίση με 593.43 μάρκες ανά δευτερόλεπτο για ένα μοντέλο 125M, το οποίο είναι α 1.37x επιτάχυνση. Για μεγαλύτερα μοντέλα όπως το 3.8B και το 7B, το BitNet.cpp διατηρεί ταχύτητα πάνω από 84.77 tokens ανά δευτερόλεπτο, δείχνοντας την αποτελεσματικότητά του σε όλες τις κλίμακες.
  • Σε Intel i7-13700H: Το BitNet.cpp επιτυγχάνει ακόμη πιο εντυπωσιακές βελτιώσεις ταχύτητας. Στο μέγεθος μοντέλου 7Β, το BitNet.cpp παρέχει ένα απίστευτη ταχύτητα 5.68x σε σύγκριση με το Llama.cpp. Για μικρότερα μοντέλα όπως το 125M, επεξεργάζεται 389.08 μάρκες ανά δευτερόλεπτο, Η οποία είναι 2.37x πιο γρήγορα από το Llama.cpp.

2. Energy Efficiency: A Game-Changer για Edge Devices

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

  • Στο Apple M2 Ultra: Η εξοικονόμηση ενέργειας του BitNet.cpp είναι σημαντική. Για το μοντέλο 700M καταναλώνει 55.4% λιγότερη ενέργεια ανά διακριτικό σε σύγκριση με το Llama.cpp, με πτώση από από 0.314 έως 0.140. Αυτή η τάση συνεχίζεται για μεγαλύτερα μοντέλα, με το μοντέλο 70B να δείχνει α 70.0% μείωση στην κατανάλωση ενέργειας.
  • Σε Intel i7-13700H: Το BitNet.cpp παραδίδει Εξοικονόμηση ενέργειας 71.9% για το μοντέλο 700M, με την κατανάλωση να πέφτει από 1.367 προς την 0.384. Αν και τα ενεργειακά δεδομένα για το μοντέλο 70B στο Llama.cpp δεν είναι διαθέσιμα, το BitNet.cpp παραμένει αποδοτικό, με την κατανάλωση ενέργειας σε 17.33 για το μοντέλο 70B.

3. Διασχίζοντας το σημείο αναφοράς ταχύτητας ανάγνωσης από τον άνθρωπο

Μία από τις πιο ενδιαφέρουσες πληροφορίες από αυτά τα γραφήματα είναι η αναφορά σε ανθρώπινη ταχύτητα ανάγνωσης, σημειώνεται στο 5-7 μάρκες ανά δευτερόλεπτο. Αυτή η κόκκινη γραμμή δείχνει ότι και οι δύο υλοποιήσεις, ειδικά το BitNet.cpp, μπορούν άνετα να ξεπεράσουν τις ανθρώπινες ταχύτητες ανάγνωσης ακόμη και για τα μεγαλύτερα μοντέλα:

  • On Apple M2Ultra, το BitNet.cpp ξεπερνά την ανθρώπινη ταχύτητα ανάγνωσης για όλα τα μεγέθη μοντέλων, με τη χαμηλότερη ταχύτητα 8.67 μάρκες ανά δευτερόλεπτο για ένα μοντέλο 70Β.
  • On Intel i7-13700H, το μοντέλο 100B εξακολουθεί να πετυχαίνει 1.70 μάρκες ανά δευτερόλεπτο, αγγίζοντας σχεδόν το χαμηλότερο εύρος της ανθρώπινης ταχύτητας ανάγνωσης, ενώ όλα τα μικρότερα μοντέλα ξεπερνούν αυτό το σημείο αναφοράς.

Εκπαιδευτικά ζητήματα

Εκτιμητής ευθείας γραμμής (STE)

Δεδομένου ότι η κβαντοποίηση 1 bit εισάγει μη διαφοροποιήσιμες συναρτήσεις, η εκπαίδευση περιλαμβάνει μια εξειδικευμένη τεχνική γνωστή ως Εκτιμητής ευθείας γραμμής (STE). Σε αυτή την προσέγγιση, οι διαβαθμίσεις ρέουν αναλλοίωτες μέσω μη διαφοροποιήσιμων σημείων. Ακολουθεί μια απλοποιημένη υλοποίηση στην Python:

class StraightThroughEstimator(Function):
    @staticmethod
    def forward(ctx, input):
        return input.sign()

    @staticmethod
    def backward(ctx, grad_output):
        return grad_output

Προπόνηση Μικτής Ακρίβειας

Για να διατηρήσετε τη σταθερότητα κατά τη διάρκεια της προπόνησης, μικτή ακρίβεια απασχολείται:

  • Βάρη και ενεργοποιήσεις: Κβαντισμένη σε ακρίβεια 1 bit.
  • Διαβαθμίσεις και καταστάσεις βελτιστοποίησης: Αποθηκεύεται σε μεγαλύτερη ακρίβεια.
  • Λανθάνοντα Βάρη: Διατηρείται σε υψηλή ακρίβεια για διευκόλυνση ακριβών ενημερώσεων κατά τη διάρκεια της προπόνησης.

Στρατηγική μεγάλου ποσοστού μάθησης

Μια μοναδική πρόκληση με τα μοντέλα 1 bit είναι ότι οι μικρές ενημερώσεις ενδέχεται να μην επηρεάσουν τα δυαδικά βάρη. Για να μετριαστεί αυτό, ο ρυθμός εκμάθησης αυξάνεται, εξασφαλίζοντας ταχύτερη σύγκλιση και καλύτερη βελτιστοποίηση σε σύγκριση με τις παραδοσιακές προσεγγίσεις.

Ομαδική κβαντοποίηση και κανονικοποίηση

Το BitNet.cpp παρουσιάζει Ομαδική κβαντοποίηση και κανονικοποίηση για την ενίσχυση του παραλληλισμού του μοντέλου. Αντί να υπολογίζει τις παραμέτρους για ολόκληρο τον πίνακα βάρους, το BitNet διαιρεί τα βάρη και τις ενεργοποιήσεις σε πολλαπλές ομάδες (G).

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

Σημειώσεις υλοποίησης και βελτιστοποιήσεις

Βελτιστοποίηση CPU

Το BitNet.cpp αξιοποιεί αρκετές βελτιστοποιήσεις χαμηλού επιπέδου για την επίτευξη κορυφαίας απόδοσης CPU:

  • Διανυσματικές Λειτουργίες: Χρησιμοποιεί οδηγίες SIMD για την αποτελεσματική εκτέλεση χειρισμών bit.
  • Πρόσβαση στη μνήμη φιλική προς την προσωρινή μνήμη: Δομίζει δεδομένα για την ελαχιστοποίηση των αστοχιών της προσωρινής μνήμης.
  • Παράλληλη επεξεργασία: Κατανέμει αποτελεσματικά το φόρτο εργασίας σε πολλούς πυρήνες CPU.

Ακολουθεί ένα παράδειγμα βασικής συνάρτησης που εφαρμόζει κβαντισμό και συμπέρασμα στο BitNet:

 
def bitlinear_forward(input, weight, scale):
    # Quantize the input using absmax quantization
    input_q = quantize(input)
    
    # Perform binary matrix multiplication
    output = binary_matmul(input_q, weight)
    
    # Scale the output to match the original precision
    return output * scale

def quantize(x):
    # Perform absmax quantization
    scale = torch.max(torch.abs(x))
    return torch.clamp(x / scale, -1, 1) * scale

Υποστηριζόμενα μοντέλα

Η τρέχουσα έκδοση του BitNet.cpp υποστηρίζει τα ακόλουθα Διαθέσιμα LLM 1 bit στο Hugging Face:

  • bitnet_b1_58-large (0.7B παράμετροι)
  • bitnet_b1_58-3B (3.3B παράμετροι)
  • Λάμα3-8Β-1.58-100Β-μάρκες (8.0B παράμετροι)

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

Οδηγός Εγκατάστασης

Για να ξεκινήσετε με το BitNet.cpp, ακολουθήστε τα παρακάτω βήματα:

Προϋποθέσεις

  1. Python > = 3.9
  2. CMake > = 3.22
  3. Κλαγγή > = 18
  4. Conda (συνιστάται)

Για Windows χρήστες, το Visual Studio θα πρέπει να εγκατασταθεί με τα ακόλουθα στοιχεία ενεργοποιημένα:

  • Ανάπτυξη επιφάνειας εργασίας με C++
  • C++-CMake Tools για Windows
  • Git για Windows
  • C++-Clang Compiler για Windows
  • Υποστήριξη MS-Build για LLVM Toolset (Clang)

Για Debian / Ubuntu χρήστες, είναι διαθέσιμο ένα σενάριο αυτόματης εγκατάστασης:

bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"

Βήμα-Βήμα Εγκατάσταση

  1. Κλωνοποιήστε το Αποθετήριο:
    git clone --recursive https://github.com/microsoft/BitNet.git

    cd BitNet
  2. Εγκαταστήστε τις εξαρτήσεις:
    # Create a new Conda environment (recommended)
    conda create -n bitnet-cpp python=3.9
    conda activate bitnet-cpp


    pip install -r requirements.txt
  3. Κατασκευάστε και προετοιμάστε το έργο: Μπορείτε να κατεβάσετε ένα μοντέλο απευθείας από το Hugging Face και να το μετατρέψετε σε κβαντισμένη μορφή:
    python setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s

    Εναλλακτικά, πραγματοποιήστε μη αυτόματη λήψη και μετατροπή του μοντέλου:

    huggingface-cli download HF1BitLLM/Llama3-8B-1.58-100B-tokens --local-dir models/Llama3-8B-1.58-100B-tokens

    python setup_env.py -md models/Llama3-8B-1.58-100B-tokens -q i2_s

Εκτέλεση συμπερασμάτων με το BitNet.cpp

Για να εκτελέσετε συμπέρασμα χρησιμοποιώντας το πλαίσιο, χρησιμοποιήστε την ακόλουθη εντολή:

python run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "Sandra journeyed to the kitchen. Where is Sandra?" -n 6 -temp 0.7

Επεξήγηση:

  • -m καθορίζει τη διαδρομή αρχείου μοντέλου.
  • -p ορίζει το κείμενο προτροπής.
  • -n ορίζει τον αριθμό των tokens προς πρόβλεψη.
  • -temp προσαρμόζει την τυχαιότητα δειγματοληψίας (θερμοκρασία) κατά την εξαγωγή συμπερασμάτων.

Παράδειγμα εξόδου

Sandra journeyed to the kitchen. Where is Sandra?

Answer: Sandra is in the kitchen.

Τεχνικά στοιχεία του BitNet.cpp

BitLinear Layer

Το BitNet.cpp υλοποιεί μια τροποποιημένη αρχιτεκτονική Transformer, αντικαθιστώντας τους τυπικούς πολλαπλασιασμούς μήτρας με BitLinear επιχειρήσεις. Αυτή η προσέγγιση συγκεντρώνει τα βάρη στο μηδέν πριν από την κβαντοποίηση και τα κλιμακώνει για να μειώσει τα σφάλματα προσέγγισης. Η συνάρτηση μετασχηματισμού κλειδιού μοιάζει με αυτό:

# Binarization function for 1-bit weights
def binarize_weights(W):
    alpha = W.mean()
    W_binarized = np.sign(W - alpha)
    return W_binarized

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

Επιπτώσεις στη βιομηχανία

Το BitNet.cpp θα μπορούσε να έχει εκτεταμένες επιπτώσεις για την ανάπτυξη των LLM:

  • Προσβασιμότητα: Επιτρέπει στα LLM να εκτελούνται σε τυπικές συσκευές, εκδημοκρατίζοντας την πρόσβαση σε ισχυρό AI.
  • Κόστους-Αποτελεσματικότητας: Μειώνει την ανάγκη για ακριβές GPU, μειώνοντας το εμπόδιο για υιοθέτηση.
  • Ενεργειακής απόδοσης: Εξοικονομεί ενέργεια αξιοποιώντας τυπικά συμπεράσματα που βασίζονται σε CPU.
  • Καινοτομία: Ανοίγει νέες δυνατότητες για τεχνητή νοημοσύνη στη συσκευή, όπως μετάφραση γλώσσας σε πραγματικό χρόνο, βοηθοί φωνής και εφαρμογές εστιασμένες στο απόρρητο χωρίς εξαρτήσεις στο cloud.

Προκλήσεις και Μελλοντικές Κατευθύνσεις

Ενώ τα LLM 1-bit υπόσχονται, παραμένουν αρκετές προκλήσεις. Αυτά περιλαμβάνουν την ανάπτυξη ισχυρών μοντέλων 1 bit για διάφορες εργασίες, τη βελτιστοποίηση του υλικού για υπολογισμούς 1 bit και την ενθάρρυνση των προγραμματιστών να υιοθετήσουν αυτό το νέο παράδειγμα. Επιπλέον, η εξερεύνηση της κβαντοποίησης 1 bit για εργασίες όρασης υπολογιστή ή ήχου αντιπροσωπεύει μια συναρπαστική μελλοντική κατεύθυνση.

Συμπέρασμα

Η κυκλοφορία του BitNet.cpp από τη Microsoft είναι μια σημαντική πρόοδος. Επιτρέποντας αποτελεσματική εξαγωγή συμπερασμάτων 1 bit σε τυπικές CPU, το BitNet.cpp δημιουργεί την προσβασιμότητα και τη βιωσιμότητα του AI. Αυτό το πλαίσιο θέτει τις βάσεις για πιο φορητά και οικονομικά αποδοτικά LLM, προωθώντας ό,τι είναι δυνατό με την τεχνητή νοημοσύνη στη συσκευή.

Έχω περάσει τα τελευταία πέντε χρόνια βυθίζοντας τον εαυτό μου στον συναρπαστικό κόσμο της Μηχανικής Μάθησης και της Βαθιάς Μάθησης. Το πάθος και η εξειδίκευσή μου με οδήγησαν να συνεισφέρω σε περισσότερα από 50 διαφορετικά έργα μηχανικής λογισμικού, με ιδιαίτερη έμφαση στην AI/ML. Η συνεχής περιέργειά μου με έχει τραβήξει επίσης προς την Επεξεργασία Φυσικής Γλώσσας, έναν τομέα που ανυπομονώ να εξερευνήσω περαιτέρω.