Upscale IA distribué pour Komga

J’utilise Komga sur mon serveur pour lire mes mangas et webtoons sur tablette et smartphone. Le problème, c’est que pas mal de scans anciens ou webtoons en ligne sont en basse résolution (souvent en 720p avec de gros artefacts de compression JPEG).

J’ai donc voulu mettre en place un système d’upscale IA automatique avec Real-CUGAN pour passer toutes les planches en 2K nettes.

Le souci : faire tourner des modèles d’intelligence artificielle sur le seul processeur (CPU) du serveur prendrait 10 minutes par chapitre et saturerait la machine. Pour résoudre ça, le système tire parti de deux cartes graphiques :

  • En priorité sur mon PC fixe (RTX 5070) : dès que mon PC est allumé, il récupère les chapitres pour les traiter à pleine vitesse en quelques secondes.
  • Sinon, directement sur la carte graphique du serveur : quand mon PC fixe est éteint, le serveur bascule automatiquement sur son propre processeur graphique (GPU AMD Radeon via Vulkan) pour continuer le travail en tâche de fond sans jamais ralentir les autres services.

Comment ça fonctionne (en 3 étapes simples)

flowchart TD Detect["1. Le serveur repère un manga en basse qualité (720p)"] subgraph Calcul ["2. Amélioration par IA (selon disponibilité)"] PC["PC fixe allumé (carte RTX 5070)
Traitement ultra-rapide en quelques secondes"] GPU_Serv["Sinon : Carte graphique du serveur (Radeon)
Traitement autonome en tâche de fond"] end Detect --> PC Detect --> GPU_Serv PC --> Finish["3. Le chapitre haute définition (2K) est rangé dans Komga"] GPU_Serv --> Finish

Comment ça marche concrètement

1. Détection et distribution intelligente

Plutôt que d’essayer de pousser des fichiers depuis le serveur vers mon PC (ce qui poserait des problèmes de pare-feu et d’adresses IP), c’est mon PC qui vient interroger le serveur en mode “Pull” :

  • Une petite API FastAPI côté serveur gère la liste des chapitres en attente.
  • Dès que mon PC fixe est allumé, un script Python récupère un chapitre, le traite en quelques secondes sur la carte graphique RTX et renvoie le résultat optimisé.
  • Si le PC fixe est éteint, le serveur prend le relais et exécute le traitement sur sa propre carte graphique interne via Vulkan.

2. Gestion des webtoons géants

Les planches de webtoons se lisent en faisant défiler l’écran vers le bas et mesurent souvent plus de 10 000 pixels de haut. Traiter une image aussi immense d’un seul coup ferait planter la mémoire de la carte graphique :

  • Le script découpe automatiquement l’image en bandes avec un léger chevauchement.
  • L’IA agrandit chaque bande indépendamment.
  • Les morceaux sont ensuite recollés de façon invisible pour reformer la page complète en haute résolution.

3. Des images deux fois plus nettes mais plus légères

Une fois les images agrandies en 2K, les sauvegarder au format PNG brut occuperait beaucoup trop de place sur le disque dur :

  • Chaque planche est convertie en format WebP optimisé.
  • Résultat : une image deux fois plus nette et agréable à lire sur tablette, mais 60% plus légère que le scan d’origine.

4. Continuité de service (zéro blocage)

Comme mon PC fixe n’est pas allumé 24h/24 :

  • Le script envoie un signal régulier au serveur.
  • Si j’éteins mon PC en plein travail ou que je lance un jeu vidéo, la tâche en cours est immédiatement libérée et confiée à la carte graphique du serveur, garantissant qu’aucun chapitre ne reste bloqué.