Train votre propre LLM: une plongée profonde avec Ruby

DEV - 11/04
Auteur: Davide Santangelo www.davidesantangelo.com Le paysage de l'intelligence artificielle (AI) est ...

Auteur: Davide Santangelo www.davidesantangelo.com

Le paysage de l'intelligence artificielle (IA) est de plus en plus dominé par les modèles de grande langue (LLM), des systèmes puissants capables de comprendre et de générer du texte humain. Alors que Python a traditionnellement été le langage dominant dans la sphère d'apprentissage automatique (ML) [1], la polyvalence et la nature centrée sur les développeurs de Ruby, en particulier dans le cadre Ruby on Rails [3], soulèvent des possibilités intrigantes. Peut-on entraîner son propre LLM en utilisant Ruby? Ce rapport fournit une plongée profonde de niveau d'experts dans le processus, explorant les étapes nécessaires, les capacités et les limites de l'écosystème Ruby, et les considérations pratiques impliquées dans l'entreprise d'un tel projet.

1. Introduction: Ruby à l'ère des LLMS

Ruby, réputé pour sa syntaxe élégante et se concentre sur le bonheur des développeurs [3], a sculpté un créneau solide dans le développement Web, alimentant les principales plateformes comme Shopify, Github et Airbnb [3]. Ruby on Rails, son cadre phare, met l'accent sur la «convention sur la configuration», permettant un développement rapide et un prototypage, ce qui le rend idéal pour les startups et la construction de produits minimaux viables (MVP) [1]. Le cadre offre des capacités backend robustes, la gestion de la logique métier, des bases de données (comme PostgreSQL, MySQL et SQLite améliorée dans Rails 8), l'authentification des utilisateurs et les interactions frontales de plus en plus sophistiquées via des outils comme Hotwire [1].

Cependant, le domaine de la ML, en particulier la tâche intensive en calcul de la formation des LLMS, présente différents défis. La domination de Python découle de son riche écosystème de bibliothèques matures et hautement optimisées comme Tensorflow, Pytorch et Scikit-Learn [1]. Alors que Ruby possède des forces dans le traitement de texte et l'intégration Web [5], son écosystème ML natif est moins étendu. Les bibliothèques existent, mais s'appuient souvent sur des liaisons aux bibliothèques C / C ++ sous-jacentes ou nécessitent une intégration avec des outils Python [2].

Cette dépendance à l'égard des bibliothèques externes ou des stratégies d'intégration constitue un thème central lorsque l'on considère la formation LLM avec Ruby. Bien que le rubis pur puisse convenir aux modèles éducatifs N-gram [10] ou des tâches plus petites, la construction d'un LLM de pointe nécessite de tirer parti des outils qui comblent l'écart vers des environnements informatiques hautes performances, provenant souvent des écosystèmes C ++ ou Python. Cela introduit des complexités liées aux dépendances et aux frais généraux potentiels de performance par rapport à une approche purement basée sur Python, mais débloque également des capacités importantes autrement indisponibles dans Ruby seul.

Ce rapport naviguera dans le cycle de vie de la formation LLM, examinant chaque phase à travers l'objectif d'un développeur Ruby, mettant en évidence les outils disponibles, les barrages routiers potentiels et les stratégies pragmatiques.

2. Définir la scène: Bibliothèques d'environnement et de base

Avant de se lancer dans la formation LLM, l'établissement d'un environnement de développement robuste et la compréhension des bibliothèques Ruby de base disponibles pour le calcul numérique et l'apprentissage automatique est crucial.

2.1. Des joyaux rubis essentiels pour les tâches ML

Bien qu'il ne soit pas aussi expansif que celui de Python, l'écosystème ML de Ruby propose plusieurs joyaux clés:

  • Numo :: Narray: La pierre angulaire du calcul numérique dans Ruby, analogue à Numpy de Python [8]. Il fournit des réseaux de dimension N et des opérations mathématiques efficaces, formant les bases de nombreuses autres bibliothèques de rubis scientifiques [11]. Il est activement entretenu et propose des interfaces à des bibliothèques comme GSL (GNU Scientific Library) et LAPACK / BLAS pour l'algèbre linéaire via NuMo :: Linalg [8]. Des exemples et une documentation, y compris une version rubis de "100 exercices Numpy", aident les utilisateurs à démarrer [14].
  • Rumale: une boîte à outils ML complète fournissant des algorithmes avec des interfaces similaires à Scikit-Learn de Python [8]. Il a atteint la version 1.0.0 au début de 2025, indiquant la maturité et le développement actif [8]. Rumale prend en charge une large gamme d'algorithmes, notamment SVM, la régression logistique, les forêts aléatoires, les k-means, le GMM, le DBSCAN et même les perceptrons multicouches (MLP) [8]. Il s'appuie sur Numo :: Narray pour ses calculs sous-jacents [15].
  • Torch.rb: liaisons rubis pour libtorch, le backend C ++ de pytorch [8]. Ce joyau est crucial pour les tâches d'apprentissage en profondeur, permettant aux développeurs de rubis de définir et de former des réseaux de neurones en utilisant le graphique de calcul de Pytorch et les capacités Autograd, tirant potentiellement l'accélération du GPU si Libtorch est compilé avec le support CUDA [17]. Il nécessite l'installation de libtorch séparément et implique une étape de compilation pour l'extension C ++ du GEM [17]. L'API vise à être en rubis (par exemple,ajouter!au lieu deajouter_) [18]. Des joyaux connexes comme TorchVision, TorchText et Torchaudio étendent ses capacités [17].
  • TensorFlow-Ruby: Rubis Bindings pour TensorFlow, en utilisant son API C [8]. Il permet de définir des constantes, des variables, des opérations mathématiques et potentiellement de construire / exécuter des graphiques de calcul, d'imiter l'API Python et de prendre en charge l'exécution impatiente par défaut [22]. Comme Torch.rb, il nécessite une installation de bibliothèque Tensorflow C séparée et permet l'utilisation du GPU si la bibliothèque est construite en conséquence [22]. Il prend en charge des fonctionnalités telles que le calcul du gradient (Autodiff) et les optimisateurs de base comme la descente de gradient [22].
  • Bibliothèques NLP: Pour le traitement de texte, Ruby propose des gemmes comme le segmentateur pragmatique pour la détection des limites de la phrase [27], divers tokenisers [27], les tigers [27] et les bibliothèques pour des tâches spécifiques comme la reconnaissance des entités nommées [29] ou l'interaction avec les API NLP [5]. Le gemme de texte fournit une collection d'algorithmes de texte [28].
  • LLM Interface Gems: Gems comme Rubyllm, Aoororachain, BoxCars et Langchain.rb fournissent des interfaces de niveau supérieur pour interagir avec les LLM (les deux API propriétaires comme les modèles OpenAI et open-source), se concentrant souvent sur les applications de construction en utilisant des LLM plutôt que pour les entraîner à partir de zéro [8].Ruby-openaiest un wrapper direct pour l'API OpenAI [9].

Tableau 2.1: Bibliothèques Ruby Clé pour les tâches liées à la LLM

BibliothèqueFonction primaireCaractéristiques / notes clésPython équivalent (conceptuel)Extraits
Numo :: narrayCalcul numériqueArrays N dimensionnels, opérations mathématiques, base pour d'autres bibliothèquesNombant[8]
RumeApprentissage automatiqueL'interface de type Scikit-Learn, divers algorithmes (SVM, arbres, clustering, MLP), utilise Numo :: Narray, v1.0.0 en 2025Scikit-apprend[8]
Torch.rbApprentissage en profondeurLiaisons à libtorch (backend pytorch c ++), support GPU (via libtorch), modules nn autograd, nnPytorch[8]
Tensorflow-RoubyApprentissage en profondeurLiaisons à l'API Tensorflow C, support GPU (via TF), exécution impatiente, construction de graphiques, autogradTensorflow[8]
Gemmes PNLTraitement du langage naturelTokenisation, entièrement des services publics de traitement de texte (segmenter pragmatique, rubis-tige, etc.)NLTK, spacy, tokenizers HF[7], [28]
Gemmes de l'interface LLMInteragir avec les LLM / API pré-forméesRubyllm, Langchain.rb, BoxCars, Ruby-openai. Construire des applications à l'aide de LLMS.Langchain (Python), Openai SDK[8]
PycallInteropérabilité pythonAppelez Python Code / Libraries directement à partir de Ruby(Bibliothèque de ponts)[8], [34]
Transformers-RubyUtilisation de modèles de transformateurAPI de pipeline de type transformateurs de face étreintes, construit sur Torch.rb, pour les modèles pré-construits d'inférence / réglage finTransformeurs de face étreintes[35]

2.2. Interopérabilité python: pycall et alternatives

Étant donné la domination de Python, l'interaction avec les bibliothèques Python de Ruby est souvent nécessaire.

  • Pycall: ce gemme permet à Ruby Code d'importer et d'appeler directement les modules et fonctions Python [33]. Il gère les conversions de type de base (numériques, chaînes, booléens, listes / hachages) [37]. Pycall est essentiel pour accéder aux bibliothèques indisponibles dans Ruby, telles que les transformateurs ou ensembles de données de Hugging Face, ou des outils spécialisés comme Scikit-Learn [8]. La configuration consiste à installer la gemme et à garantir le bon environnement python (avec les bibliothèques nécessaires comme Numpy, Scikit-Learn, etc.) est accessible [33]. On peut spécifier la version python via des variables d'environnement ouPycall.init[33]. Notez que Pycall peut ne pas soutenir officiellement une utilisation multi-thread en raison de complexités avec la gestion du verrouillage mondial de Python (GIL) [38].
  • Alternatives aux appels directs: Au lieu de Pycall, on peut utiliser des mécanismes de communication inter-processus (IPC):
    • Belling Out: exécuter des scripts Python comme processus séparés à l'aide de backtticks de Ruby (),système, ouOpen3module [42].Open3` fournit plus de contrôle sur STDIN, STDOUT et STDERR [42]. L'échange de données se produit généralement via la sortie standard (nécessitant l'analyse de Ruby, utilisant souvent des formats comme JSON) ou des fichiers temporaires [46]. Ceci est plus simple pour les tâches ponctuelles mais moins efficaces pour une interaction fréquente.
    • Files d'attente de messages: des systèmes comme RabbitMQ ou Redis peuvent agir comme intermédiaires. Les processus Ruby peuvent enterrer des tâches ou des données, et les travailleurs de Python peuvent les ramasser, les traiter et potentiellement renvoyer les résultats via une autre file d'attente [48]. Cela découple efficacement les processus.
    • API (REST / GRPC): Le composant Python ML peut être exposé sous forme de microservice avec une API REST ou GRPC. L'application Ruby interagit ensuite avec ce service via des appels réseau [2]. Il s'agit d'un modèle commun pour intégrer les modèles ML dans les applications Rails [2].
    • RPC (Call de procédure distante): Des cadres comme Apache Thrift permettent de définir des services et des structures de données qui peuvent être utilisés dans différentes langues, permettant à Ruby d'appeler des fonctions dans un processus Python plus formellement que le simple IPC [52]. XMLRPC est une autre option, bien que potentiellement avec des frais généraux plus élevés [52].

Le choix de la bonne méthode d'intégration dépend de la fréquence d'interaction, de la complexité de l'échange de données et des exigences de performance. Pour une intégration profonde nécessaire pendant la formation (par exemple, l'accès à des fonctions de bibliothèque spécifiques à plusieurs reprises), Pycall pourrait être nécessaire malgré ses complexités. Pour déployer un modèle formé ou orchestrer des étapes de pipeline distinctes, des API ou des files d'attente de messages offrent souvent un meilleur découplage et évolutivité [2].

2.3. Le contexte de l'écosystème Ruby

Il est important de définir des attentes réalistes. Alors que les gemmes comme Torch.rb et Tensorflow-Ruby offrent des capacités puissantes, ce sont essentiellement des emballages dans des bibliothèques externes complexes. Cela s...
[Courte citation de 8% de l'article original]

Loading...