Το να έχεις ένα μοντέλο ΤΝ (LLM) να τρέχει τοπικά στον υπολογιστή σου έχει αρκετά πλεονεκτήματα. Δεν εξαρτάσαι από τους περιορισμούς των online υπηρεσιών, δεν περιμένεις από κάποιο cloud να αποφασίσει τι επιτρέπεται να κάνεις και, κυρίως, μπορείς να το προσαρμόσεις στις δικές σου ανάγκες.

Στην πράξη όμως τα πράγματα δεν είναι τόσο απλά.
Για σοβαρή εκπαίδευση χρειάζεσαι δυνατό hardware, πολλή RAM και, δυστυχώς, μια αρκετά δυνατή NVIDIA κάρτα γραφικών. Με πιο αδύναμο εξοπλισμό γίνεται, αλλά οι υποχωρήσεις που πρέπει να κάνεις μεγαλώνουν αρκετά.
Επειδή στη δουλειά αποκτήσαμε ένα πανάκριβο μηχάνημα-κτήνος, το οποίο είναι φτιαγμένο ακριβώς για τέτοιες δουλειές, μου δόθηκε η ευκαιρία να ασχοληθώ αρκετά με το θέμα.
Αυτή τη στιγμή εκπαιδεύονται δύο μοντέλα για χρήση σε διοικητικές/νομικές και τεχνικές/μηχανικές εργασίες. Εκμεταλλευόμενος το ίδιο σύστημα, δουλεύω παράλληλα και πάνω σε ένα τρίτο, το οποίο είναι προσανατολισμένο αποκλειστικά σε κώδικα, Linux και scripting.
Για βάση χρησιμοποίησα το Qwen2.5-Coder 14B, αντί να επιχειρήσω να ξεκινήσω από ένα μοντέλο χωρίς προηγούμενη εκπαίδευση. Η επιλογή έγινε κυρίως επειδή ήθελα ένα μοντέλο που να έχει ήδη καλή σχέση με τον προγραμματισμό και να μπορώ στη συνέχεια να το φέρω στα μέτρα μου.
Ο στόχος είναι να γράφει κώδικα, να εξηγεί υπάρχοντα προγράμματα, να εντοπίζει bugs, να κάνει refactoring και να δημιουργεί tests. Παράλληλα, θέλω να μπορεί να χειρίζεται Python, C#, Java, C++, Rust, Go, JavaScript, TypeScript και άλλες γλώσσες.
Και εδώ αρχίζουν τα δύσκολα.
Τα repositories δεν ήταν αρκετά
Η πρώτη μου σκέψη ήταν μάλλον η προφανής: να του δώσω όσο περισσότερο κώδικα μπορούσα.
Άρχισα λοιπόν να μαζεύω code corpus από GitHub, GitLab, Bitbucket, Stack Overflow και διάφορα open-source projects. Μαζί με αυτά μπήκαν στο παιχνίδι documentation, README, API docs, manuals, tutorials, forums και γενικά οτιδήποτε μπορούσε να του δώσει χρήσιμες πληροφορίες για προγραμματισμό.
Ακούγεται λογικό, έτσι;
Μόνο που στην πορεία διαπίστωσα ότι ένα repository δεν σου λέει απαραίτητα γιατί γράφτηκε ένας συγκεκριμένος κώδικας.
Βλέπεις τον κώδικα αλλά δεν βλέπεις πάντα την αρχική απαίτηση. Δεν ξέρεις απαραίτητα ποιο πρόβλημα προσπαθούσε να λύσει ο προγραμματιστής, ποιο ήταν το bug, γιατί επιλέχθηκε μια συγκεκριμένη λύση ή τι απέτυχε πριν φτάσουμε στην τελική έκδοση.
Άρα χρειαζόμουν κάτι διαφορετικό: σύνολα δεδομένων εκπαίδευσης (instruction datasets).
Και κάπου εκεί άρχισα να πελαγώνω.
Μετά από περίπου 30-40 ημέρες χειροκίνητης συλλογής και επεξεργασίας δεδομένων, κατάλαβα ότι αυτός ο τρόπος ήταν υπερβολικά αργός και κουραστικός. Είχα βρει λοιπόν ένα πρόβλημα που δεν μπορούσα να λύσω απλώς προσθέτοντας περισσότερο κώδικα.
Η λύση, ειρωνικά, βρισκόταν μπροστά μου.
Knowledge Distillation
Η ιδέα του knowledge distillation, σε απλά ελληνικά, είναι να χρησιμοποιήσεις ένα ισχυρότερο μοντέλο σαν δάσκαλο για να βελτιώσεις ένα μικρότερο.
Στη δική μου περίπτωση αυτό σήμαινε ότι αντί να προσπαθώ μόνος μου να δημιουργήσω εκατομμύρια παραδείγματα, έβαλα τα διαθέσιμα ισχυρά μοντέλα να αναλάβουν μεγάλο μέρος αυτής της δουλειάς.
Με τα Claude, Gemini και ChatGPT διαθέσιμα μέσω των αντίστοιχων pro εκδόσεων, η διαδικασία έγινε πολύ πιο γρήγορη. Έφτιαξα τη διαδικασία γύρω από custom Python scripts, ώστε τα δεδομένα να περνούν από το ένα στάδιο στο άλλο και να καταλήγουν στο local μοντέλο. Δηλαδή, με αυτό το script συνομιλεί το LLM μέντορας απευθειας με το τοπικό μας μοντέλο. Κυκλοφορούν πολλά εκεί έξω, έτοιμα για αυτή τη δουλειά.
Δεν θα μπω σε όλες τις λεπτομέρειες της υλοποίησης, επειδή το άρθρο θα γίνει βιβλίο. Η βασική ιδέα όμως είναι αρκετά απλή.
Για παράδειγμα, μπορώ να ζητήσω από το μοντέλο-δάσκαλο:
Δημιούργησε 10.000 προβλήματα Python διαφορετικής δυσκολίας.
Από εκεί και πέρα δεν παίρνω μόνο μια ερώτηση και μια απάντηση.
Παράγονται λύσεις, εναλλακτικές προσεγγίσεις, επεξηγήσεις, tests, πιθανά λάθη, edge cases, διορθώσεις και προτάσεις βελτιστοποίησης.
Το μοντέλο λειτουργεί ουσιαστικά σαν δάσκαλος.
Στη συνέχεια ο μαθητής, δηλαδή το local qwen (το βαφτίσαμε «Μητσάρα»), προσπαθεί να λύσει τα ίδια προβλήματα. Οι απαντήσεις του αξιολογούνται και από το σύνολο των δεδομένων κρατιούνται εκείνα που θεωρούνται κατάλληλα για την επόμενη φάση του fine-tuning.
Μέχρι στιγμής έχουν περάσει από τη διαδικασία σχεδόν 900.000 enterprise παραδείγματα και συνεχίζουμε. Ο τελικός στόχος είναι αρκετά μεγαλύτερος, καθώς μιλάμε για εκατομμύρια παραδείγματα.
Με αυτόν τον τρόπο μπορώ να δημιουργώ synthetic datasets σε πολύ μεγαλύτερη κλίμακα από αυτή που θα μπορούσα να πετύχω χειροκίνητα.
Τι μπορεί να παραχθεί με αυτόν τον τρόπο
Ενδεικτικά:
- prompts διαφορετικής δυσκολίας
- προβλήματα προγραμματισμού
- λύσεις και εναλλακτικές λύσεις
- bug-fix παραδείγματα
- unit tests
- code reviews
- refactoring examples
- edge cases
- τεχνικές επεξηγήσεις
- synthetic datasets
- αξιολόγηση και φιλτράρισμα απαντήσεων
- μετατροπή υπαρχόντων repositories σε δεδομένα κατάλληλα για fine-tuning
Και αυτό ήταν το σημείο όπου το πράγμα άρχισε πραγματικά να αποκτά ενδιαφέρον.
Δεν αρκεί μόνο το fine-tuning
Σύντομα έγινε φανερό ότι όσο καλό και αν είναι το fine-tuning, δεν μπορεί να λύσει όλα τα προβλήματα.
Ένα μοντέλο μπορεί να έχει μάθει πάρα πολλά, αλλά αυτό δεν σημαίνει ότι γνωρίζει το συγκεκριμένο repository που έχεις μπροστά σου σήμερα.
Έτσι περάσαμε σε μια αρχιτεκτονική RAG.
User
│
▼
Local Qwen Coder
│
┌───────┴────────┐
│ │
Repository Documentation
│ │
└───────┬────────┘
▼
Vector Database
│
▼
Retrieved Files
│
▼
Τελική απάντηση
Η λογική είναι απλή: το μοντέλο δεν χρειάζεται να θυμάται τα πάντα.
Όταν του ζητάς να δουλέψει πάνω σε ένα project, μπορεί να αναζητήσει τα σχετικά αρχεία, documentation και ιστορικό αλλαγών και να τα χρησιμοποιήσει για να δημιουργήσει την απάντησή του.
Αυτό είναι το RAG (Retrieval-Augmented Generation).
Στην πράξη, ο συνδυασμός fine-tuning με RAG αποδείχτηκε πολύ πιο χρήσιμος από την προσπάθεια να βάλουμε τα πάντα μέσα στα weights του μοντέλου.
Για το fine-tuning χρησιμοποιήθηκαν τεχνικές όπως LoRA/QLoRA, ώστε να μη χρειάζεται κάθε φορά να κάνουμε πλήρη επανεκπαίδευση.
Το hardware και το GPU cloud
Όσο κτήνος κι αν είναι ένα τοπικό μηχάνημα, κάποια στιγμή θα βρεις τα όριά του.
Ειδικά σε μεγάλες φάσεις εκπαίδευσης, το διαθέσιμο GPU time τελειώνει γρήγορα. Εκεί μπήκε στη συζήτηση το GPU Rental.
Στη δουλειά, μέσω Πληροφορικής και Λογιστηρίου, χρησιμοποιούμε NVIDIA H200 μέσω RunPod, με κόστος περίπου €4,50 την ώρα και χρέωση ανά δευτερόλεπτο.
Για κάποιον που θέλει να κάνει πειράματα από το σπίτι, αυτό μπορεί να είναι αρκετά ακριβό. Υπάρχουν όμως και άλλες επιλογές.
Το Vast.ai, για παράδειγμα, μπορεί να βγει αρκετά φθηνότερα, αν είσαι διατεθειμένος να ψάξεις λίγο τους διαθέσιμους providers.
Υπάρχει επίσης το SaladCloud, ένα distributed δίκτυο GPUs, όπου μπορείς να βρεις ακόμη και RTX 5090 σε πολύ χαμηλότερες τιμές, ανάλογα πάντα με τη διαθεσιμότητα και το είδος του instance.
Για να υπάρχει μια εικόνα του κόστους, ας πάρουμε ενδεικτικά μια RTX 4090 στα €0,70/ώρα:
- 10 ώρες: €7,00
- 100 ώρες: €70,00
- 24/7 για έναν μήνα: περίπου €504,00
Πλατφόρμες όπως AWS, GCP και Azure δεν ήταν η πρώτη μου επιλογή. Για τη συγκεκριμένη χρήση τις θεωρώ υπερβολικά περίπλοκες και ακριβές. Και δεν μου είναι συμπαθείς επίσης.
Αν θέλεις να ξεκινήσεις τώρα
Αν κάποιος θέλει σήμερα να αρχίσει να ασχολείται με local LLMs και fine-tuning, δεν χρειάζεται να ξεκινήσει με το μηχάνημα-τέρας που χρησιμοποιούμε εμείς.
Ένα λογικό software stack θα ήταν:
- Ubuntu 24.04 LTS
- Python
uv ή Conda
- PyTorch
- CUDA
- HuggingFace
- Unsloth
- LlamaFactory
- Ollama
- Open WebUI
Τι γίνεται σήμερα με το μοντέλο
Tο μοντέλο συνεχίζει να εκπαιδεύεται, με ιδιαίτερη έμφαση πλέον στα ελληνικά, όπου τα κενά είναι αρκετά μεγαλύτερα. Πλέον, έχει φτάσει στο 92% γνώσης της γλώσσας.
Η αρχική ιδέα ήταν να μπορούμε κάποια στιγμή να το διαθέσουμε ελεύθερα και δωρεάν στην κοινότητα. Εκεί όμως προέκυψε ένα μάλλον σοβαρό νομικό ζήτημα.
Τα εμπορικά APIs που χρησιμοποιήθηκαν (και που πληρωθήκαν αδρά) για τη δημιουργία των synthetic datasets έχουν συγκεκριμένους όρους χρήσης. Το Νομικό Τμήμα θεωρεί ότι αυτοί οι όροι δεν μας επιτρέπουν να διαθέσουμε δημόσια ή εμπορικά ένα ανταγωνιστικό μοντέλο που έχει εκπαιδευτεί με τέτοιο υλικό.
Ειρωνικό ότι προκειμένου να δημιουργηθεί ένα privacy τοπικό llm χρησιμοποιήθηκαν μοντέλα ακριβώς αντίθετα αυτής της φιλοσοφίας.
Άρα, προς το παρόν, το project παραμένει εσωτερικό.
Ούτε screenshots μπορώ να δημοσιεύσω αυτή τη στιγμή, αλλά όταν υπάρξει η δυνατότητα θα επανέλθω με πραγματικές μετρήσεις και παραδείγματα από την απόδοση των μοντέλων.
Πάντως, μέχρι εδώ, η εμπειρία ήταν αρκετά θετική.
Με πολύ ρεύμα, αρκετό hardware, αμέτρητα datasets, αρκετά bugs και μπόλικο ξενύχτι, τα μοντέλα κάνουν πλέον πραγματικά καλή δουλειά.
Οπότε, ναι.
Τελικά μάλλον άξιζε ο κόπος.
Μάλιστα, το χρησιμοποιώ ως βοηθό κι εδώ, στο οsarena, σε αρκετές δημοσιεύσεις μου.
Φυσικά, αυτό δεν το έκανα μόνος, δεν είχα καν τις γνώσεις πιο πριν αλλά αντίθετα, υπάρχει μαι μικρή και εξαιρετικά ικανή ομάδα από πίσω με πολλή όρεξη και μεράκι.
Δεν τελειώνει εδώ όμως. Σύντομα θα επανέλθω με πιο ρεαλιστικές λύσεις ώστε να μπορεί κάποιος να έχει ένα τοπικό μοντέλο χωρίς να χρειάζεται το Cern να το εκπαιδεύσει και χωρίς να πληρώσει μια περιουσία.