Modèle / jeu de données
predibase/lorax avatar
predibase/lorax

LoRAX : servir des milliers d'adaptateurs LoRA sur un seul GPU

Multi-LoRA inference server that scales to 1000s of fine-tuned LLMs

3 831 étoiles324 forksPythonApache-2.0

En bref

De quoi s’agit-il ?
LoRAX empile plusieurs adaptateurs LoRA dans un même batch d'inférence et les échange entre CPU et GPU à la volée. L'idée est solide, mais elle suppose un GPU Ampere, des pilotes CUDA 11.8 et une base Mistral ou Llama déjà maîtrisée.
À qui s’adresse-t-il ?
LoRAX convient aux équipes qui ont déjà un parc d'adaptateurs PEFT ou Ludwig et un GPU Ampere sous Linux, avec des pilotes CUDA 11.8. Il ne convient pas à qui sert un seul modèle sans adaptateur, ni à qui veut faire tourner l'inférence sur CPU ou sur un GPU antérieur à Ampere.
Puis-je l’utiliser commercialement ?
Oui. Apache-2.0 est une licence permissive : vous pouvez utiliser, modifier et vendre un logiciel qui en dépend, à condition de conserver les mentions de droit d’auteur et de licence.
Est-il encore maintenu ?
Oui. Les derniers commits datent d’il y a 110 jours.
En quel langage est-il écrit ?
Principalement Python, d’après les statistiques de langage de GitHub.

Ces réponses reposent sur les données GitHub du projet (dernière synchronisation le 15 septembre 2026) et sur notre analyse. Elles ne constituent pas un avis juridique.

ANALYSE OPEN SOURCE APPROFONDIE

Le problème que LoRAX attaque vraiment

Le fine-tuning par LoRA produit beaucoup de petits modèles. Une équipe qui ajuste un modèle par client, par tâche ou par langue se retrouve vite avec des dizaines ou des centaines d'adaptateurs, chacun ne pesant que quelques centaines de mégaoctets, mais chacun ayant besoin du même modèle de base pour fonctionner. Servir ces adaptateurs un par un, c'est charger à chaque fois le modèle de base complet, ce qui revient à payer le prix d'un GPU par adaptateur actif. LoRAX prend le problème dans l'autre sens : le modèle de base reste résident en mémoire, et l'adaptateur devient un paramètre de la requête. Le README résume la cible en une phrase : servir des milliers de modèles ajustés sur un seul GPU. Le public visé est donc celui qui exploite une plateforme d'inférence multi-tenant, pas le développeur qui fait tourner un unique modèle sur son poste. Le projet est distribué sous Apache 2.0, ce qui autorise l'usage commercial sans redevance, mais ce point est abordé plus loin.

Deux objets au lieu d'un : modèle de base et adaptateur

La documentation découpe le service en deux composants. D'un côté le modèle de base, préentraîné, partagé par tous les adaptateurs et chargé une fois. De l'autre l'adaptateur, qui porte les poids spécifiques à une tâche et se charge dynamiquement à chaque requête. Cette séparation a une conséquence pratique : le nom du modèle de base se fixe au démarrage du serveur, alors que l'adaptateur se choisit à l'appel. La base peut être chargée en fp16 ou quantifiée via bitsandbytes, GPT-Q ou AWQ, ce qui change la quantité de mémoire vive GPU disponible pour le reste. Les adaptateurs, eux, proviennent de bibliothèques PEFT ou Ludwig, et la documentation précise que n'importe quelle couche linéaire du modèle peut être adaptée. Le point important est que l'adaptateur ne se fusionne pas dans les poids de base : il reste un objet distinct, ce qui rend possible le chargement et le déchargement à la volée.

Le batching hétérogène et l'échange d'adaptateurs

C'est ici que se joue la différence avec un serveur d'inférence classique. Un serveur mono-modèle regroupe les requêtes en lots pour saturer le GPU. LoRAX fait la même chose, mais accepte dans un même lot des requêtes qui ciblent des adaptateurs différents. Le README parle de heterogeneous continuous batching, et annonce que la latence et le débit restent à peu près constants quand le nombre d'adaptateurs concurrents augmente. La mécanique sous-jacente est décrite sous le nom d'Adapter Exchange Scheduling : les adaptateurs sont préchargés et déchargés de façon asynchrone entre la mémoire GPU et la mémoire CPU, et l'ordonnanceur décide quelles requêtes regrouper pour maximiser le débit global. Autrement dit, LoRAX parie que la mémoire CPU peut servir de zone de transit pour les adaptateurs inactifs. Ce pari a une limite évidente : si la mémoire CPU manque, l'échange devient un goulot d'étranglement. Le projet s'appuie aussi sur des noyaux CUDA précompilés cités dans le README (flash-attention, paged attention, SGMV), et la version 0.12.0 des notes de version mentionne un cache de préfixes multi-LoRA ainsi qu'un cache KV en fp8. Ces deux ajouts visent le même objectif : éviter de recalculer ce qui a déjà été calculé pour un adaptateur donné.

Mise en route par l'image Docker

Le README recommande explicitement l'image préconstruite, pour éviter de compiler les noyaux CUDA et les autres dépendances. Les prérequis matériels sont stricts : GPU Nvidia de génération Ampere ou supérieure, pilotes compatibles CUDA 11.8 et au-delà, système Linux, Docker. Avant de lancer le conteneur, la documentation demande d'installer nvidia-container-toolkit puis d'exécuter sudo systemctl daemon-reload et sudo systemctl restart docker. Le lancement lui-même tient en une commande, avec le modèle Mistral 7B Instruct comme exemple : docker run --gpus all --shm-size 1g -p 8080:80 -v $volume:/data ghcr.io/predibase/lorax:main --model-id $model. Deux détails méritent attention. Le port exposé est 80 à l'intérieur du conteneur, mappé sur 8080 côté hôte. Et l'option --shm-size 1g n'est pas décorative : elle conditionne la mémoire partagée disponible pour le processus d'inférence. Une fois le serveur en écoute, l'appel se fait sur /generate en POST, avec un corps JSON contenant inputs et parameters. Pour cibler un adaptateur, on ajoute la clé adapter_id dans parameters, par exemple vineetsharma/qlora-adapter-Mistral-7B-Instruct-v0.1-gsm8k. Sans cette clé, la requête part sur le modèle de base. Côté Python, le paquet lorax-client expose une classe Client dont la méthode generate accepte le même argument adapter_id.

Ce que LoRAX ne fait pas, et quand il est le mauvais outil

Le premier point de friction est matériel. Un GPU antérieur à Ampere n'est pas supporté, et il n'existe pas de chemin CPU documenté dans le matériel fourni. Une équipe qui veut faire tourner un petit modèle sur un serveur sans GPU doit chercher ailleurs, quelle que soit la qualité du reste. Le deuxième point concerne le cas mono-modèle. Si vous servez un seul modèle ajusté, sans jamais changer d'adaptateur, toute la machinerie d'échange et de batching hétérogène ne vous apporte rien : vous payez la complexité d'un ordonnanceur multi-adaptateurs pour un seul locataire. Un serveur d'inférence plus simple suffit. Le troisième point touche au format. LoRAX charge des adaptateurs PEFT ou Ludwig, et la documentation indique que l'adaptateur peut venir de HuggingFace, de Predibase ou d'un système de fichiers local. Un adaptateur entraîné hors de ces bibliothèques, ou avec une structure de couches non reconnue, ne se chargera pas. Enfin, la documentation publique ne détaille pas dans le matériel fourni le comportement du serveur quand un adaptateur demandé est introuvable ou mal formé : on ne peut pas affirmer ici si la requête échoue proprement ou si elle retombe sur le modèle de base. C'est un point à vérifier dans votre environnement avant de mettre le service en production.

Face à un serveur d'inférence LoRA classique

L'alternative la plus directe est un serveur d'inférence qui charge un adaptateur LoRA fusionné dans les poids du modèle de base. L'approche est plus simple et souvent plus rapide pour un adaptateur unique, parce qu'il n'y a ni échange mémoire, ni gestion de plusieurs adaptateurs concurrents dans le même lot. La différence de conception est nette : dans un serveur à adaptateur fusionné, changer d'adaptateur signifie recharger un modèle, donc interrompre le service ou faire tourner plusieurs instances. LoRAX déplace ce coût vers une gestion de cache mémoire entre CPU et GPU, ce qui permet de garder une seule instance pour N adaptateurs. Le compromis est asymétrique. Si votre trafic se répartit sur beaucoup d'adaptateurs avec un volume modeste par adaptateur, l'approche LoRAX est la seule qui tienne économiquement. Si votre trafic se concentre sur un ou deux adaptateurs à fort volume, la fusion reste plus prévisible et supprime une couche de complexité opérationnelle. Le choix se fait donc sur la distribution du trafic, pas sur une supériorité générale de l'une des deux méthodes.

Coût de maintenance et implications de licence

Le rythme de publication donne une indication sur la charge de suivi. Les notes de version fournies montrent lorax-0.4.0 en janvier 2025, v0.12.1 en novembre 2024 et v0.12.0 en novembre 2024, avec des changements substantiels à chaque fois : cache de préfixes multi-LoRA, cache KV en fp8, support Mllama, appel de fonctions. Autrement dit, les versions ne sont pas de simples correctifs, et une mise à jour peut toucher des chemins d'exécution sensibles. La documentation mentionne aussi des éléments d'exploitation à maintenir : images Docker préconstruites, charts Helm pour Kubernetes, métriques Prometheus et traçage distribué via Open Telemetry. Chacun de ces composants ajoute une surface à surveiller lors d'une montée de version. Sur le plan juridique, le projet est publié sous Apache 2.0, ce qui autorise l'usage commercial et la modification, avec les obligations habituelles de conservation des mentions de licence et d'avis. Cette licence couvre le code de LoRAX, pas les modèles de base ni les adaptateurs que vous chargez : un modèle Llama ou Mistral conserve ses propres conditions d'utilisation, qui peuvent restreindre l'usage commercial indépendamment de la licence du serveur. Ce point doit être vérifié modèle par modèle, et il ne relève pas d'un avis juridique de ma part.

Conclusion éditoriale

LoRAX convient aux équipes qui ont déjà un parc d'adaptateurs PEFT ou Ludwig et un GPU Ampere sous Linux, avec des pilotes CUDA 11.8. Il ne convient pas à qui sert un seul modèle sans adaptateur, ni à qui veut faire tourner l'inférence sur CPU ou sur un GPU antérieur à Ampere. Avant de vous engager, vérifiez deux choses concrètes : que votre base figure dans la liste des architectures prises en charge par la documentation, et que le format de vos adaptateurs est bien celui attendu par le champ adapter_id du point d'entrée /generate.

Sources officielles

  1. License: Apache-2.0
  2. predibase/lorax on GitHub
  3. Project website
  4. README
  5. Releases
Notes de la communauté

Notes de la communauté