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 accTitle: Distribution des traitements d'upscale entre les deux GPU accDescr: Les chapitres prioritaires utilisent la RTX 5070 lorsqu'un créneau distant est disponible. Sinon, ou en cas d'échec, le GPU Radeon du serveur prend le relais avant la publication dans Komga. Detect["1. Détection et mise en file
selon la priorité de lecture"] --> Choice{"2. Créneau RTX 5070
disponible et sain ?"} Choice -->|Oui| RTX["PC fixe
Real-CUGAN sur RTX 5070"] Choice -->|Non ou échec| Radeon["Serveur
Real-CUGAN sur GPU Radeon"] RTX --> Finish["3. WebP 2K contrôlé
remplacement atomique et rescan Komga"] Radeon --> 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é.