Pichonas

Pichonas

Une file de calcul d'inférence dont les règles sont démontrées mathématiquement : chaque tâche reçoit un seul résultat, aucune n'est perdue, et chaque client reste cloisonné.

Le problème

Pichonas est un logiciel de Liant qui répartit des calculs d'intelligence artificielle, appelés calculs d'inférence, entre plusieurs machines. Un client dépose une demande, qui est découpée en tâches ; des machines de calcul, les exécuteurs, viennent chercher ces tâches, les calculent et rendent leur résultat.

Or ces machines ne sont pas fiables. L'une tombe en panne au milieu d'un calcul, une autre perd le réseau, une troisième est simplement lente. Pour ne pas perdre la tâche, le système la confie alors à une autre machine, si bien qu'elle peut être calculée deux fois. Dans une file de tâches ordinaire, le résultat retenu dépend alors de l'ordre d'arrivée : un résultat tardif peut écraser le bon, et rien ne permet au client de savoir lequel fait foi. Pour un service qui facture et livre un résultat par tâche, c'est une erreur silencieuse, même quand chaque machine a correctement fait son travail.

Ce que Pichonas garantit

Les garanties ci-dessous sont des théorèmes : elles sont démontrées mathématiquement sur une description exacte du fonctionnement de Pichonas, et un logiciel de vérification de preuves contrôle chaque démonstration.

Ces démonstrations portent sur le cœur du système. Le reste, c'est-à-dire la communication réseau chiffrée, l'écriture sur disque et la lecture de l'horloge, est testé mais non démontré. La démonstration ne dit pas non plus si un résultat est juste : une machine autorisée qui rend un résultat faux n'est pas détectée. Enfin, le serveur central est aujourd'hui un point unique de défaillance, puisqu'il n'est pas encore répliqué.

Comment c'est construit

Le comportement de Pichonas est d'abord décrit règle par règle dans Rocq, un logiciel qui vérifie des démonstrations mathématiques. Les garanties ci-dessus sont démontrées sur cette description, sans aucune hypothèse admise sans preuve. Le programme qui calcule chaque décision du serveur est ensuite produit automatiquement à partir de cette description, et l'intégration continue vérifie à chaque modification que le code livré est bien celui-là.

Autour de ce cœur, une enveloppe écrite à la main assure la communication, la journalisation sur disque et la lecture de l'heure ; elle est couverte par des tests, pas par des démonstrations. Restent à croire sans démonstration la production automatique du code, la correspondance des nombres entre les deux langages et la fidélité de la description formelle au cahier des charges, dont les écarts sont consignés.

Les clients (locataires, exécuteurs, administration) passent par un frontal TLS qui authentifie leur certificat, puis par un socket Unix vers le serveur Pichonas. Le serveur pose l'heure, injecte les expirations, écrit chaque entrée au journal sur disque, puis la fait calculer par le cœur extrait de la preuve Rocq. Le cœur est prouvé ; le frontal, le transport et le journal sont testés.
Chaîne d'une requête dans Pichonas.

Une demande suit toujours le même chemin :

  1. Le frontal vérifie le certificat de la machine ou du client et transmet son identité au serveur.
  2. Le serveur lit la demande, contrôle l'identité et note l'heure.
  3. Il déclare d'abord expirées les tâches dont le délai est dépassé.
  4. Il écrit la demande dans son journal sur disque.
  5. Le cœur, issu de la démonstration, calcule la décision.
  6. La réponse ne part qu'une fois l'écriture terminée. Après un arrêt, le serveur relit son journal et retrouve exactement le même état.

Démonstration : Pichonas face à Celery et Redis

Pour mesurer ce que ces garanties changent en pratique, nous avons joué les mêmes situations difficiles sur Pichonas et sur Celery avec Redis, une file de tâches très répandue, réglée selon les recommandations de sa documentation pour ne perdre aucune tâche. Chaque situation porte sur 20 tâches. Les machines de calcul y sont supposées non fiables et partagées entre plusieurs clients, ce qui est le cas pour lequel Pichonas est conçu ; Celery, lui, suppose des machines de confiance, et c'est un choix de conception, non un défaut.

SituationCelery + RedisPichonas
Une machine met plus de temps que prévu ; la tâche est confiée à une autre machine20 tâches sur 20 calculées deux fois, et le résultat retenu est celui qui arrive le premier, quelle que soit la machineRésultat de la machine en cours seul retenu (20 sur 20). Si la machine lente signale qu'elle travaille toujours, rien n'est recalculé ; sinon son calcul tardif est refusé
Une machine qui n'est pas chargée de la tâche dépose un faux résultat pendant le calculFaux résultat retenu pour 20 tâches sur 20Faux résultat refusé pour 20 tâches sur 20
Une machine tombe en panne en plein calculTâches reprises après 86 sTâches reprises après 3 à 5 s ; aucune perdue des deux côtés
Le serveur central est arrêté brutalement puis relancéAucun résultat perdu avec la persistance de Redis activée (20 perdus avec sa configuration par défaut)Aucun résultat perdu, aucune tâche recalculée
Une machine ne reçoit pas la réponse à sa demande de travailPas d'équivalentElle la redemande et retrouve la même tâche, sans tentative perdue

Ces chiffres sont des mesures, faites sur une seule machine avec une charge faible et des calculs simulés ; le script qui les produit les rejoue à l'identique. Seuls Celery et Redis ont été mesurés, et non les autres files du marché. Les refus de Pichonas, eux, découlent des théorèmes décrits plus haut : ils ne dépendent pas de la mesure.

En chiffres