Το LLaMA, το OpenLLaMA και το XGen είναι πρωτοποριακά παραγωγικά μοντέλα τεχνητής νοημοσύνης. Αυτά τα μοντέλα δίνουν ακόμη καλύτερα αποτελέσματα όταν προσαρμόζονται στα δικά σας δεδομένα. Σε αυτό το άρθρο ας δούμε πώς να τελειοποιήσουμε αυτά τα μοντέλα τόσο σε GPU όσο και σε TPU, χρησιμοποιώντας JAX και τη βιβλιοθήκη EasyLM.
Το μοντέλο LLaMA κυκλοφόρησε από τη Meta τον Φεβρουάριο του 2023. Αυτό το παραγωγικό μοντέλο τεχνητής νοημοσύνης είναι ένα μοντέλο ανοικτού κώδικα που προτείνεται σε διάφορα μεγέθη: 7B παραμέτρων, 13B παραμέτρων, 33B παραμέτρων και 65B παραμέτρων.
Τον Ιούνιο του 2021, όταν κυκλοφόρησε το GPT-J, ο κόσμος άρχισε να συνειδητοποιεί ότι τα γεννητικά μοντέλα τεχνητής νοημοσύνης ανοιχτού κώδικα μπορούσαν να ανταγωνιστούν σοβαρά το OpenAI GPT-3. Τώρα με το LLaMA ο πήχης έχει σαφώς ανέβει ξανά και αυτό το μοντέλο φαίνεται να είναι μια πολύ καλή εναλλακτική λύση ανοιχτού κώδικα για το OpenAI ChatGPT και το GPT-4.
Ωστόσο, η άδεια χρήσης του LLaMA δεν είναι φιλική προς τις επιχειρήσεις: αυτό το μοντέλο δεν μπορεί να χρησιμοποιηθεί για εμπορικούς σκοπούς... Αλλά τα καλά νέα είναι ότι υπάρχουν τώρα άλλα μοντέλα.
Το OpenLLaMA, που κυκλοφόρησε τον Ιούνιο του 2023, είναι μια εναλλακτική έκδοση του LLaMA, που αναπτύχθηκε από την ερευνητική ομάδα τεχνητής νοημοσύνης του Berkeley, η οποία δίνει πολύ καλά αποτελέσματα και μπορεί να χρησιμοποιηθεί για επιχειρήσεις. Κατά τη στιγμή που γράφονται αυτές οι γραμμές, είναι διαθέσιμες 2 εκδόσεις: 7B parameters και 13B parameters.
Το XGen, που κυκλοφόρησε από την Salesforce τον Ιούνιο του 2023, είναι ένα άλλο πολύ ισχυρό θεμελιώδες μοντέλο που μπορεί να χρησιμοποιηθεί σε εμπορικές εφαρμογές. Μόνο μια έκδοση παραμέτρων 7B είναι διαθέσιμη από τη στιγμή που γράφονται αυτές οι γραμμές. Αξίζει να σημειωθεί ότι αυτό το μοντέλο υποστηρίζει ένα περιεχόμενο 8k tokens, ενώ τα LLaMA και OpenLLaMA υποστηρίζουν μόνο ένα περιεχόμενο 2k tokens.
Τα παραπάνω μοντέλα είναι θεμελιώδη μοντέλα, πράγμα που σημαίνει ότι έχουν εκπαιδευτεί με μη εποπτευόμενο τρόπο σε ένα μεγάλο σώμα κειμένων.
Αυτά τα θεμελιώδη μοντέλα τεχνητής νοημοσύνης αποτελούν συνήθως μια καλή βάση, αλλά πρέπει να ρυθμιστούν ώστε να κατανοούν σωστά αυτό που θέλετε και να επιστρέφουν καλά αποτελέσματα. Ο ευκολότερος τρόπος για να επιτευχθεί αυτό είναι η χρήση μάθησης λίγων βολών (γνωστή και ως "μηχανική προτροπής"). Μη διστάσετε να διαβάσετε τον ειδικό οδηγό εκμάθησης για λίγα πλάνα εδώ.
Η εκμάθηση με λίγα βήματα είναι βολική, καθώς μπορεί να εκτελεστεί εν κινήσει χωρίς να χρειάζεται να δημιουργηθεί μια νέα έκδοση του γεννητικού μοντέλου ΤΝ, αλλά μερικές φορές δεν είναι αρκετή.
Για να έχετε αποτελέσματα τελευταίας τεχνολογίας, θα πρέπει να ρυθμίσετε ένα μοντέλο τεχνητής νοημοσύνης για τη δική σας περίπτωση χρήσης. Λεπτομερής ρύθμιση σημαίνει ότι θα τροποποιήσετε ορισμένες παραμέτρους του μοντέλου με βάση τα δικά σας δεδομένα και στη συνέχεια θα λάβετε τη δική σας έκδοση του μοντέλου.
Η λεπτομερής ρύθμιση είναι πολύ φθηνότερη από την εκπαίδευση ενός γεννητικού μοντέλου ΤΝ από το μηδέν, αλλά εξακολουθεί να απαιτεί υπολογιστική ισχύ, οπότε χρειάζεστε προηγμένο υλικό για να ρυθμίσετε το δικό σας μοντέλο. Ορισμένες πρόσφατες εναλλακτικές τεχνικές λεπτομερούς ρύθμισης απαιτούν λιγότερη υπολογιστική ισχύ (βλέπε p-tuning, prompt tuning, soft tuning, parameter efficient fine-tuning, adapters, LoRA, QLoRA...) αλλά μέχρι στιγμής δεν έχουμε καταφέρει να επιτύχουμε το ίδιο επίπεδο ποιότητας με αυτές τις τεχνικές, οπότε δεν θα τις αναφέρουμε σε αυτό το σεμινάριο.
Σε αυτό το σεμινάριο θα επικεντρωθούμε στη λεπτομερή ρύθμιση του LLaMA με τη βιβλιοθήκη EasyLM, που κυκλοφόρησε από την ομάδα Berkeley AI Research: https://github.com/young-geng/EasyLM. This library is based on JAX which makes the fine-tuning process fast and compatible with both GPUs and Google TPUs.
Μπορείτε επίσης να ρυθμίσετε το OpenLLaMA ή το XGen χρησιμοποιώντας την ίδια τεχνική.
Εμείς ρυθμίζουμε το LLaMA 7B σε μια Google TPU V3-8 εδώ, αλλά μπορείτε να κάνετε το ίδιο και σε μια GPU A100 (απλά διαβάστε προσεκτικά το κομμάτι "Εγκατάσταση" στην τεκμηρίωση του EasyLM που είναι ελαφρώς διαφορετικό). Φυσικά μπορείτε επίσης να κάνετε fine-tune μεγαλύτερες εκδόσεις του LLaMA (13B, 33B, 65B...), αλλά θα χρειαστείτε πολύ περισσότερα από μια TPU V3-8 ή μια απλή GPU A100.
Ξεκινάμε!
Πρώτον, δημιουργήστε ένα σύνολο δεδομένων δημιουργίας κειμένου για την περίπτωση χρήσης σας, σε μορφή JSONL, χρησιμοποιώντας το "text" ως κλειδί για κάθε παράδειγμα. Ακολουθεί ένα απλό σύνολο δεδομένων ανάλυσης συναισθήματος:
{"text":"[Content]: I love NLP Cloud, this company is awesome!\n[Sentiment]: Positive"}
{"text":"[Content]: Training LLMs is a complex but rewarding process.\n[Sentiment]: Neutral"}
{"text":"[Content]: My fine-tuning keeps crashing because of an OOM error! It just does not work at all!\n[Sentiment]: Negative"}
Παρακαλώ σημειώστε μερικά σημαντικά πράγματα. Πρώτον, αυτό το σύνολο δεδομένων περιέχει μόνο 3 παραδείγματα για λόγους απλότητας, αλλά στην πραγματική ζωή θα χρειαστείτε πολύ περισσότερα παραδείγματα. Τα 300 παραδείγματα είναι συνήθως μια καλή αρχή. Δεύτερον, όταν θα χρησιμοποιήσετε το λεπτομερώς ρυθμισμένο μοντέλο σας για εξαγωγή συμπερασμάτων, θα πρέπει να ακολουθήσετε αυστηρά την ίδια μορφοποίηση, χρησιμοποιώντας τα προθέματα "[Content]:" και "[Sentiment]:". Τέλος, το σύμβολο "</s>" είναι σημαντικό επειδή σημαίνει ότι το μοντέλο πρέπει να σταματήσει να παράγει εδώ. Μπορείτε να βρείτε περισσότερα παραδείγματα συνόλων δεδομένων στην τεκμηρίωση του NLP Cloud: μάθετε περισσότερα εδώ.
Δημιουργήστε ένα VM TPU V3-8 στο Google Cloud με την έκδοση λογισμικού V2 Alpha:
Συνδεθείτε με SSH στο VM και εγκαταστήστε το EasyLM:
git clone https://github.com/young-geng/EasyLM
cd EasyLM
bash ./scripts/tpu_vm_setup.sh
Μπορείτε τώρα να κατεβάσετε και να μετατρέψετε τα βάρη LLaMA. Η πρώτη επιλογή είναι να ζητήσετε από τη Meta τα επίσημα βάρη: https://ai.facebook.com/blog/large-language-model-llama-meta-ai/. Στη συνέχεια, μετατρέψτε τα βάρη σε EasyLM με αυτό το σενάριο: https://github.com/young-geng/EasyLM/blob/main/EasyLM/models/llama/convert_torch_to_easylm.py. Η δεύτερη επιλογή είναι να χρησιμοποιήσετε τα βάρη LLaMA στο HuggingFace: https://huggingface.co/decapoda-research/llama-7b-hf. Στη συνέχεια, μετατρέψτε τα βάρη σε EasyLM με αυτό το σενάριο: https://github.com/young-geng/EasyLM/blob/main/EasyLM/models/llama/convert_hf_to_easylm.py.
Ανεβάστε το σύνολο δεδομένων σας στο VM, μετρήστε πόσα tokens περιέχει, χρησιμοποιώντας τον HF LLaMA tokenizer:
pip install -U transformers
python -c "from transformers import LlamaTokenizer; tokenizer = LlamaTokenizer.from_pretrained('decapoda-research/llama-7b-hf'); f = open('/path/to/your/dataset', 'r'); print(len(tokenizer.encode(f.read())))"
Εάν εκπαιδεύετε το μοντέλο σας για ένα πλαίσιο 1024 tokens, θα πρέπει να διαιρέσετε τον επιστρεφόμενο αριθμό tokens με το 1024.
Εάν εκπαιδεύετε το μοντέλο σας για ένα πλαίσιο 2048 tokens, θα πρέπει να διαιρέσετε τον επιστρεφόμενο αριθμό tokens με το 2048.
Αυτός ο αριθμός θα είναι ο αριθμός των βημάτων ανά εποχή. Έτσι, για παράδειγμα, αν θέλετε να εκπαιδεύσετε για 5 εποχές (που είναι συνήθως μια καλή ρύθμιση), θα πρέπει να πολλαπλασιάσετε αυτόν τον αριθμό με το 5 και να βάλετε την τιμή που προκύπτει στο --total_steps παρακάτω.
Ακολουθεί ένα συγκεκριμένο παράδειγμα: αν το σύνολο δεδομένων σας περιέχει 100.000 tokens και θέλετε ένα πλαίσιο 1024 tokens και 5 εποχές, ο συνολικός αριθμός των βημάτων σας θα είναι (100.000/1024)*5 = 488.
Ανάλογα με το μήκος του πλαισίου σας, ορίστε το --train_dataset.json_dataset.seq_length ως 1024 ή 2048 παρακάτω. Σημειώστε ότι η λεπτομερής ρύθμιση ενός μοντέλου για ένα πλαίσιο 2048 tokens απαιτεί περισσότερη μνήμη, οπότε αν αυτό δεν είναι απολύτως απαραίτητο, σας συνιστούμε να παραμείνετε σε ένα πλαίσιο 1024 tokens.
Τώρα μπορείτε να ξεκινήσετε τη διαδικασία τελειοποίησης:
nohup python -u EasyLM/EasyLM/models/llama/llama_train.py \
--total_steps=your number of steps \
--save_model_freq=usually same as your number of steps \
--optimizer.adamw_optimizer.lr_warmup_steps=usually 10% of total steps \
--train_dataset.json_dataset.path='/path/to/your/dataset' \
--train_dataset.json_dataset.seq_length=1024 or 2048 \
--load_checkpoint='params::/path/to/converted/model' \
--tokenizer.vocab_file='/path/to/tokenizer' \
--logger.output_dir=/path/to/output \
--mesh_dim='1,4,2' \
--load_llama_config='7b' \
--train_dataset.type='json' \
--train_dataset.text_processor.fields='text' \
--optimizer.type='adamw' \
--optimizer.accumulate_gradient_steps=1 \
--optimizer.adamw_optimizer.lr=0.002 \
--optimizer.adamw_optimizer.end_lr=0.002 \
--optimizer.adamw_optimizer.lr_decay_steps=100000000 \
--optimizer.adamw_optimizer.weight_decay=0.001 \
--optimizer.adamw_optimizer.multiply_by_parameter_scale=True \
--optimizer.adamw_optimizer.bf16_momentum=True &
Ορισμένες εξηγήσεις:
--save_model_freq: πόσο συχνά θέλετε να αποθηκεύετε το μοντέλο σας κατά τη διάρκεια της διαδικασίας. Αν κάνετε μόνο λεπτομερή ρύθμιση σε ένα μικρό σύνολο δεδομένων, μπορείτε να αποθηκεύετε μόνο στο τέλος της διαδικασίας, και σε αυτή την περίπτωση αυτή η τιμή θα είναι ίση με --total_steps.
--optimizer.adamw_optimizer.lr_warmup_steps: 10% των συνολικών βημάτων είναι συνήθως μια καλή τιμή.
--tokenizer.vocab_file: η διαδρομή προς το αρχείο tokenizer.model. Για παράδειγμα, αν χρησιμοποιείτε το αποθετήριο decapoda στο HuggingFace, εδώ είναι ο σύνδεσμος στον tokenizer: https://huggingface.co/decapoda-research/llama-7b-hf/resolve/main/tokenizer.model
--logger.output_dir: διαδρομή προς το τελικό μοντέλο και τα αρχεία καταγραφής
Οι άλλες παράμετροι μπορούν να παραμείνουν ανέγγιχτες.
Μόλις ολοκληρωθεί η διαδικασία τελειοποίησης, μπορείτε να ανακτήσετε το μοντέλο σας από τη διαδρομή που καθορίσατε στο --logger.output_dir.
Έχετε πλέον το δικό σας ρυθμισμένο μοντέλο και θέλετε φυσικά να το χρησιμοποιήσετε!
Μια πρώτη στρατηγική είναι η χρήση της βιβλιοθήκης EasyLM για την εξαγωγή συμπερασμάτων. Σε αυτή την περίπτωση μπορείτε να εκκινήσετε το διακομιστή εξαγωγής συμπερασμάτων ως εξής:
python EasyLM/EasyLM/models/llama/llama_serve.py \
--mesh_dim='1,1,-1' \
--load_llama_config='7b' \
--load_checkpoint='params::/path/to/your/model' \
--tokenizer.vocab_file='/path/to/tokenizer'
Στη συνέχεια, απλά στείλτε τα αιτήματά σας με το cURL όπως παρακάτω:
curl "http://0.0.0.0:5007/generate" \
-H "Content-Type: application/json" \
-X POST -d '{"prefix_text":["[Content]: EasyLM works really well!\n[Sentiment]:"]}'
Μια δεύτερη στρατηγική είναι να εξάγετε το μοντέλο σας σε μορφή HuggingFace για να εκτελέσετε συμπερασμό με άλλο πλαίσιο. Ακολουθεί ο τρόπος με τον οποίο μπορείτε να το εξάγετε:
python EasyLM/EasyLM/models/llama/convert_easylm_to_hf.py \
--load_checkpoint='params::/path/to/output/model/streaming_params' \
--tokenizer_path='/path/to/tokenizer' \
--model_size='7b' \
--output_dir='/path/to/converted/model'
Το 2023 υπήρξε ένα μεγάλο ορόσημο για τα γεννητικά μοντέλα τεχνητής νοημοσύνης ανοιχτού κώδικα. Από τη στιγμή που γράφονται αυτές οι γραμμές, ο καθένας μπορεί να χρησιμοποιήσει σπουδαία μοντέλα όπως τα LLaMA, OpenLLaMA, XGen, Orca, Falcon...
Η λεπτομερής ρύθμιση αυτών των μοντέλων είναι ο καλύτερος τρόπος για να επιτύχετε αποτελέσματα αιχμής, προσαρμοσμένα στη δική σας περίπτωση χρήσης, τα οποία μπορούν να ξεπεράσουν σημαντικά τα καλύτερα ιδιόκτητα μοντέλα τεχνητής νοημοσύνης, όπως τα ChatGPT (GPT-3.5), GPT-4, Claude...
Σε αυτόν τον οδηγό σας έδειξα πώς να τελειοποιήσετε το LLaMA, το OpenLLaMA και το XGen. Αν έχετε ερωτήσεις, μη διστάσετε να επικοινωνήσετε μαζί μου, και αν θέλετε να τελειοποιήσετε και να αναπτύξετε εύκολα προηγμένα παραγωγικά μοντέλα AI χωρίς τεχνική πολυπλοκότητα, have a look at the NLP Cloud dedicated documentation!
Mark
Μηχανικός μηχανικής μάθησης στο NLP Cloud