AperçuMatérielDéploiementServicesDonnées
Mon Homelab

Mon homelab - Services

Setup d'IA

Comme je le partageais dans la partie hardware, je possède 4 GPUs différents:

  • RTX 5090: Le monstre
  • RTX 5060 Ti 16Go: Bon rapport VRAM / Prix, peu de bande passante mais consomme peu d'énergie
  • RTX 3090: Le monstre, mais deux générations précédentes
  • RTX 3060 Ti: Il faut bien connecter les écrans quelque part sur le PC de dev

Tout cela représente un total de 80Go de VRAM. (32 + 16 + 24 + 8)

Quel LLM est-ce que j'utilise en local ?

La première question que je me suis posée, c'est: "quelle taille de LLM puis-je faire tourner convenablement avec ces GPU ?" Ce n'est pas une question évidente, les GPUs ont différentes quantités de VRAM et sont dans des ordinateurs différents.

Faire du Tensor Parallelism (TP) semble absolument impraticable. Séparer les matrices de poids d'une seule couche de modèle sur plusieurs GPU demande une très faible latence entre les GPUs, ce qui n'est réalisable que s'ils communiquent directement via pci-e. Or, les deux seuls GPUs qui sont physiquement sur la même carte mère, c'est la 5090 et la 5060 Ti. C'est théoriquement faisable, mais les capacités de la 5090 seront bridées par celles de la 5060Ti.

Il reste donc la possibilité de faire du Pipeline Parallelism (PP) avec la 5090 et la 3090 qui communiquent via le réseau. La différence, c'est qu'au lieu de faire une inférence en utilisant les deux GPUs simultanément, les couches du réseau sont séparées. La 5090 prend les premières couches (les plus grandes), et la 3090 prend les suivantes. Cela fonctionne ! Avec vLLM et Ray, j'ai la possibilité de faire de l'inférence sur des modèles 70B quantisés à un débit convenable.

Malgré cette réussite, j'ai décidé de laisser tomber l'inférence multi-GPU pour le moment, car la 5090 fait très bien tourner un modèle 27B/31B toute seule avec 250k de contexte à ~120 tokens / secondes. Et pour le moment, il n'y a pas vraiment de modèles intéressants dans la tranche des 40-70B qui justifie la perte de débit de réponse.

"Mais pourquoi tu mets pas simplement la 5090 et la 3090 dans le même boitier pour faire du tensor parallelism ?"

J'aimerais bien, ça permettrait d'utiliser les deux GPUs les plus puissants ensemble. Sauf que c'est un enfer thermique de faire tenir deux gros GPUs dans un boitier grand public. (Même mon Lian Li O11 XL...) Si je met la 3090 à côté de ma 5090, elles vont être collées l'une à l'autre et s'empêcher de respirer. Ça me demanderait également d'investir dans un PSU à 1500-1600W pour alimenter convenablement ces deux monstres en énergie.

Là, avec la 5090 et la 5060Ti dans le même boitier, la température des GPUs ne monte pas au delà de 70° lorsqu'elles font toutes les deux de l'inférence... Et ça, c'est génial.


Comment j'ai mis en place le RAG ?

Mettre en place un RAG, c'est crucial pour obtenir des générations de bonne qualité. Les documents fournis peuvent être de différents types, voici ce que j'ai de mon côté:

  • Des documents administratifs personnels: Je peux poser des questions à mon LLM sur... mes factures d'électricité par exemple
  • Des extraits de romans: J'expérimente sur la création narrative par LLM inspirée d'extraits de livres
  • Des ressources de théorie littéraire: Cela m'aide aussi dans mes expérimentations sur la création narrative

Je n'utilise pas de RAG personnalisé pour l'accès à la documentation, car j'utilise Context7 à cet effet.

La pipeline:

Un RAG fonctionne toujours avec les mêmes étapes:

  1. Réunir tous les documents auxquels on souhaite donner accès
  2. Les préformater, et s'assurer qu'ils sont dans un format exploitable pour un LLM.
  3. Mettre en place un système permettant au LLM de retrouver les documents pertinents à sa demande
  4. Fournir les données au LLM

[...]

Comment mettre en place le RAG ?

Faire tourner un bon LLM 27B sur sa propre infra, c'est génial. Cependant, c'est encore mieux quand le LLM réfléchit sur nos propres données.

Pour cela, l'idée est simple: on crée un moteur de recherche, et on permet au LLM de lui poser des questions:

  1. On prend la liste des documents pertinents (ceux auquel notre LLM doit avoir accès)
  2. On crée des embeddings, c'est à dire des représentations vectorielles de nos documents
  3. On stocke ces embeddings dans une base de données vectorielle
  4. Quand le LLM pose une question, on vectorise la question avec le même modèle que celui qui a créé les embeddings et on retrouve les documents dont les embeddings sont les plus proches.

Quel modèle d'embedding choisir ?

Pour du texte, le meilleur modèle d'embeddings open-source disponible à l'heure actuelle est Qwen Embedding 8B. Pour les autres formats (audio, vidéo...) il s'agit de Jina embedding.

Et quelle base de données vectorielle ?

La réponse est plutôt simple pour un homelab auto-hébergé, quelle que soit sa taille => Qdrant, parce que c'est mature, open-source, et honnêtement simple à utiliser. Ces simples arguments sont amplement suffisant pour un homelab, qui quel que soit ses projets n'aura pas à se poser les mêmes questions qu'une entreprise qui doit gérer des millions d'embeddings.

Pour une entreprise qui souhaite mettre en place un système d'embedding capable de répertorier des dizaines de millions de documents, d'autres questions se posent afin de maitriser ses coûts et ses performances. (gestion hardware, choix de l'algorithme de retrieval, sauvegarde et réplication...)

Continuer la partie IA

Mon Gitlab

J'ai peu de choses à dire dessus, c'est un GitLab. Il héberge mon code, et gère ma CI. Je suis bien content de l'héberger moi-même.

Pour le runner, j'utilise un autre container docker hébergé sur la même VM.

Les services média

J'essaie d'héberger un maximum de services multimédias chez moi. Ça vient surtout d'une volonté de contrôler mes données, et minimiser ma dépendance aux grands services. (Netflix, Prime video, Spotify, Deezer, ebooks Amazon...)

Pour le coup, les initiatives open-source sont très matures, j'apprécie beaucoup les solutions suivantes:

Jellyfin: Un équivalent de Netflix / Amazon Prime / Disney + / HBO / ... mais en local, avec nos propres vidéos.

Navidrome: L'équivalent de Jellyfin mais pour la musique, expose une API OpenSubsonic, donc il est possible d'accéder sa musique avec des applications tierces.

Immich: Je ne vois pas de raison pour que mes photos / vidéos personnelles soient dans le Cloud. Il faut bien les gérer et organiser !

Paperless-ngx: Application incroyable, qui héberge tous mes documents administratifs, les trie, et fait de l'OCR. J'ai fait un MCP que j'ai connecté à Qwen (local, donc), qui peut donc m'aider d'une manière personnalisée avec ces infos...