Category Archives: Hacks

Faire tourner une intelligence artificielle sur un ordinateur personnel

Les intelligences artificielles (IA) conversationnelles étant à la mode depuis l’émergence de ChatGPT cet automne, j’ai voulu en avoir le cœur net et évaluer les ressources qu’elles requièrent.

En effet, les affirmations ne manquent pas sur les ressources énormes nécessaires : cartes graphiques haut de gamme comme l’A100 de Nvidia (20 000 dollars), nombre de serveurs, nombre de paramètres, etc. Ces ressources les réserveraient à des grosses sociétés aux poches profondes. Est-ce vrai ?

Ce week-end j’ai donc réalisé mon premier dialogue avec une IA tournant chez moi, en utilisant notamment des dérivés de LLaMa, le moteur diffusé partiellement en logiciel libre par l’équipe de l’IA de Facebook. Cette équipe est dirigée par le français Yann Le Cun, un des pères du domaine.

Pourquoi ?

ChatGPT à sa sortie publique a provoqué un choc dans le milieu de l’intelligence artificielle et des LLM (modèles de langage), et au delà. La technologie est récente et les spécialistes du domaine connaissaient son potentiel, mais personne n’avait réussi à en proposer une mise en œuvre pertinente pour le grand public. OpenAI a donc, d’une certaine manière, « vexé » la profession en recevant toute l’attention. OpenAI, qui initialement avait été fondé pour diffuser ce travail en logiciel libre, a changé brutalement son fusil d’épaule sous prétexte de la puissance du procédé qu’il ne faudrait “pas mettre entre toutes les mains”. Les avertissements (et les peurs, souvent exagérées) sur les conséquences du déploiement de ces technologies sont à l’avenant.

En réaction sont apparus des efforts de mise à disposition au plus grand nombre, pour au contraire profiter à tous et éviter un accaparement de la technologie par OpenAI. En effet, OpenAI est loin d’être le seul acteur dans ce domaine, ni le premier. Hors Facebook (Meta), on peut notamment citer Hugging Face (page Wikipedia) fondée par des français.

Qu’est ce que c’est ?

Il existe 2 éléments principaux pour faire fonctionner une intelligence artificielle à apprentissage profond, qui est la technologie utilisée pour ces agents conversationnels :

  • le moteur, dont bon nombre existent en logiciel libre, mais qui ne savent rien faire par eux-mêmes ;
  • le paramétrage du moteur, résultat d’un long apprentissage sur un ensemble de textes, images ou autres, et qui recèle l’essentiel de l’« intelligence » du système.

Je n’ai pas installé le moteur initial de LLaMa mais une réimplémentation optimisée pour fonctionner avec moins de ressources, llama.cpp, fournie avec toutes les instructions d’installation sous Linux.

llama.cpp est un moteur “générique” et permet de faire tourner plusieurs modèles, comme le décrit sa page d’accueil : le modèle LLaMa original, mais aussi Alpaca, GPT4all, vigogne (un modèle français), etc.

Quels modèles ?

Le modèle LLaMa, de même nom que le moteur, a été distribué par Facebook suite au buzz provoqué par le lancement de ChatGPT.

De nombreux modèles sont dérivés du modèle Facebook (qu’il faut donc récupérer en montrant patte blanche, comme expliqué ici). D’autres sont distribués de manière indépendante, certains avec un moteur dédié, mais tous peuvent tourner avec le moteur llama.cpp, éventuellement suite à conversion de leur format.

J’ai ainsi essayé :

  • LLaMa dans 3 de ses versions : 7B, 13B et 30B. La version 65B est un peu trop grosse pour ma machine ;
  • Alpaca, plus compact que LLaMa à performances comparables ;
  • vigogne, un modèle français dérivé du modèle LLaMa. Vigogne est “réglé finement” (fine-tuned) avec des instructions en français. Le “fine tuning” consiste à compléter un gros modèle déjà calculé (processus très long) avec des instructions de spécialisation particulières qui l’ajustent à la marge. On obtient alors un nouveau modèle. Vigogne a ainsi repris les modèles d’apprentissage d’Alpaca, en les traduisant en français, pour obtenir un modèle plus à l’aise en langue française ;
  • gpt4all , un autre modèle dérivé de LLaMa, mais qui a reçu en complément d’apprentissage 800 000 questions-réponses en partie traitées avec GPT-3.5, le modèle d’OpenAI.

Je n’ai pas encore essayé :

Le domaine avance très vite et de nouveaux modèles ou mises à jour apparaissent en permanence.

Quelles ressources ?

Bien entendu, plus un modèle est gros, plus il est censé être “pertinent” et s’exprimer de manière naturelle, et plus il va occuper de ressources (disque, mémoire et processeur). Cependant, d’autres facteurs interviennent :

  • la qualité de l’apprentissage : à taille égale, certains modèles sont plus efficaces que d’autres ;
  • la taille du modèle : plus il est gros, plus il a compilé de « connaissances » et sera pertinent ;
  • la taille unitaire des paramètres : certains modèles ont 16 bits par paramètre, ce qui est assez lourd. Il est possible de réduire cette taille à 4 bits par paramètre, au prix d’une légère dégradation de pertinence ;
  • l’architecture du réseau neuronal choisi : nombre et taille des couches de neurones, interconnexions entre couches.

Si le procédé des réseaux neuronaux est d’ordre général, en revanche les formats de fichiers stockant les modèles diffèrent et évoluent. Un même modèle peut donc fonctionner sur différents moteurs, mais il peut être nécessaire de convertir les fichiers.

Les procédés de conversion pour llama.cpp sont expliqués dans la documentation du logiciel et concernent plusieurs modèles. La conversion des modèles LLaMa nécessite la bibliothèque pytorch, que je n’ai pas réussi à faire fonctionner sous FreeBSD, le système d’exploitation que j’utilise. J’ai donc installé un Linux, distribution Debian 11, dédié à cet usage. Vigogne et GPT4All ont également besoin de conversion de fichiers.

Les tailles des modèles que j’ai récupérés sont les suivantes :

  • LLaMa 7B : environ 13 Go en version originale 16 bits, 4 Go en version 4 bits.
  • LLaMa 13B : environ 26 Go en 16 bits, 8 Go en 4 bits.
  • LLaMa 30B : 65 Go en 16 bits, 20 Go en 4 bits.
  • LLaMa 65B : 130 Go en 16 bits, conversion encore en cours chez moi après plusieurs jours…
  • Alpaca : 4 Go, modèle en 4 bits
  • vigogne 7B : 13 Go en 16 bits (dérivé de LLaMa), 4 Go en 4 bits.
  • gpt4all : 4 Go en 4 bits (plusieurs modèles, “filtrés” ou non)

L’ordinateur sur lequel j’ai réalisé ces traitements est un PC sous FreeBSD, 32 Go de mémoire, 8 To de disque, et un processeur AMD Ryzen 5-5600G avec circuit graphique (GPU) intégré, qui hébergeait une machine virtuelle Debian 11 à qui étaient alloués 8 à 28 Go de mémoire pour convertir et faire tourner les modèles.

La conversion des modèles a nécessité de 8 à 20 Go de RAM. Le processus de conversion utilisait au pire 16,5 Go de mémoire pour le modèle le plus gros, LLaMa 65B.

Il est ensuite possible de lancer le modèle, soit avec son logiciel d’origine, soit avec llama.cpp. J’ai commencé avec le modèle LLaMa 7B, qui se contente pour fonctionner de 6 Go de mémoire. Voici une démonstration dans une vidéo non accélérée :

J’ai ensuite essayé le modèle LLaMa avec 13 milliards de paramètres (13B), qui répond de manière plus pertinente mais mélange parfois tout, avec des morceaux inattendus en LaTeX (un langage de traitement de texte). J’ai aussi eu des extraits de réponses en langage Python.

Puis j’ai tenté la même chose avec Alpaca (modèle diffusé par l’université de Stanford, dérivé à la fois de LLaMa et de certains fichiers d’apprentissage de OpenAI). Alpaca, peut-être grâce à son modèle stocké en 4 bits, a besoin de beaucoup moins de mémoire pour des résultats plus pertinents. Ici j’ai utilisé directement le logiciel chat fourni avec le modèle, qui chez moi tourne beaucoup plus rapidement qu’avec llama.cpp :

Verdict sur les ressources

Je voulais voir s’il était possible de faire tourner ce type de logiciel sur un PC relativement basique. La réponse est donc positive. Il est inutile d’avoir une carte graphique (GPU) surgonflée ou des quantités astronomiques de RAM, grâce au travail d’optimisation incroyable fait par les développeurs et publié en source.

Ça marche aussi sous FreeBSD

Je n’ai pas réussi à me passer de Linux pour la conversion des modèles, mais les utiliser est plus facile. Alpaca se compile et tourne très facilement sous FreeBSD :

$ git clone https://github.com/antimatter15/alpaca.cpp
$ cd alpaca.cpp
$ gmake
$ ./chat

Il faut aussi télécharger le fichier .bin du modèle (cf instructions d’Alpaca). Ce qui permet de se faire bullshiter ensuite comme par tout bon LLM :

llama.cpp tourne également sans problème sous FreeBSD, mais bien plus lentement car les extensions AVX/AVX2/F16C/SSE3 ne sont pas activées. Il s’agit d’un problème mineur probablement puisque alpaca.cpp les utilise. On note que, comme tout bon modèle de langage, LLaMa n’hésite pas à broder en m’affirmant des choses totalement hors de sa portée :

Quels résultats avec ces modèles ?

Tous les modèles présentés ici dérivent plus ou moins directement de LLaMa. Le but est de s’approcher au plus près de GPT-3.5, le modèle phare vendu par OpenAI, et avec le moins de ressources possibles.

Le résultat est subjectif et dépend des usages, mais GPT-3.5 semble détenir encore une avance assez nette en pertinence, longueur des réponses et qualité des textes générés, grâce à sa grande taille et à celle du corpus qui a servi à l’entraîner.

Cependant, les modèles existants peuvent déjà être très utiles en analyse de texte en langue naturelle, en aide à la rédaction de texte ou de code, créativité, etc.

Les progrès sont également très rapides : il y a quelques semaines à peine, les faire fonctionner sur un simple PC était beaucoup plus difficile. Il ne fait aucun doute que d’ici la fin 2023, d’autres avancées notables seront réalisées.

Annexes

Copie d’écran du processus de conversion d’un des modèles LLaMa :

Processus (beaucoup plus rapide) de transformation du modèle 16 bits en modèle 4 bits :

Pourquoi j’ai piraté ma propre imprimante et ses cartouches officielles

Tout a commencé en septembre 2017 par un banal achat d’imprimante laser couleur. Il nous fallait une imprimante utilisable facilement ailleurs que sous Windows, idéalement en réseau pour éviter des allées et venues entre ordinateurs, et recto-verso. De préférence, connaissant les formats Postscript ou PDF pour éviter d’avoir à réaliser des conversions. La plupart de ces fonctions sont réalisables par logiciel pour compenser leur absence, mais c’est toujours plus compliqué à mettre en œuvre.

Par ailleurs, nous souhaitions une imprimante laser au lieu d’une jet d’encre. Ces dernières ne sont pas particulièrement moins chères, et sont moins fiables (l’encre sèche avec le temps), alors que nous imprimons assez peu. Je pensais aussi échapper aux restrictions d’usage qui touchent les cartouches jet d’encre et permettent de les vendre à prix fort, pensant naïvement que les cartouches de toner en étaient exemptes.

Bref, nous trouvons rapidement un modèle qui coche toutes les cases à un prix intéressant, un peu moins de 110 €. Appelons-la modèle 310.

C’est une imprimante très ressemblante mais d’un modèle différent que nous recevons. Appelons-la 317. La 317 est identique à la 310, à un petit détail près : elle a l’option wifi, qui ne nous intéresse pas du tout. Mais ça ne semble pas gênant de l’avoir.

L’imprimante est munie de 4 cartouches d’encre d’origine : noir, magenta, cyan, jaune. Elles sont censées permettre l’impression d’environ 1500 pages, contrairement aux cartouches vendues ensuite, prévues pour 3000 pages. Leur format étant identique, les cartouches d’origine ne sont donc pas remplies complètement. Le coût par page de l’imprimante neuve avec cartouches est ainsi relativement comparable au coût par page des 4 cartouches de remplacement. Le constructeur souhaite probablement s’assurer qu’on ne commandera pas une imprimante neuve complète lorsque vient le moment de changer les cartouches d’origine.

Passent alors quelques mois d’utilisation sans histoire, jusqu’à la fin 2018, principalement en noir et blanc. Nous approchons de l’épuisement de la cartouche magenta, gentiment signalé à l’avance par l’imprimante.

Nous commandons donc des cartouches de remplacement du constructeur, profitant d’une offre groupée à prix « d’ami » incluant les 4 couleurs. Nous les stockons en attente d’utilisation, le temps que la cartouche magenta d’origine arrive effectivement à bout, ce qui prendra 4 ou 5 mois.

« Et là, c’est le drame. »

L’imprimante ne reconnaît pas la cartouche magenta de remplacement, produisant une erreur cryptique et refusant catégoriquement d’imprimer, même en noir et blanc.

Tout naturellement nous appelons donc l’assistance de la marque en France, qui investigue pour m’expliquer, en substance, que tout cela est de ma faute : mon modèle est le 317, or j’ai commandé des cartouches pour le modèle 310. Il est donc tout à fait « normal » que cela ne fonctionne pas. J’aurais dû faire attention. Je peux m’adresser au vendeur des cartouches pour demander un échange.

De son côté, le vendeur des cartouches — nous avions, autre erreur, privilégié un commerçant du sud de la France pour éviter d’engraisser une grande plateforme de vente en ligne — explique qu’au titre de ses conditions de vente il ne peut réaliser d’échange, même de cartouches neuves non déballées, car notre commande date de plus de 3 mois (puisque nous nous y étions pris à l’avance).

Nous voilà donc avec une imprimante totalement inutilisable à moins de payer à nouveau au moins une cartouche magenta (environ 150-170 €), et 450 € de cartouches inutilisables, potentiellement revendables sur e-bay avec les complications associées, une perte de valeur pour nous, et un risque pour l’acheteur.

Pour la petite histoire, la présence d’une cartouche vide empêche également toute mise à jour logicielle de l’imprimante.

En faisant quelques recherches en ligne, je découvre que des commerçants chinois revendent des circuits (chips) de remplacement pour les cartouches, classés par couleur d’encre, modèle d’imprimante, nombre de pages le cas échéant, et zone géographique.

Ici un petit aparté sur la notion de zone géographique pour imprimante. D’après l’assistance du fabricant, il s’agit de fournir du toner optimisé pour la région où il est utilisé, afin d’être adapté aux conditions climatiques locales (hygrométrie, température).

On pourra juger de cette promesse en constatant sur cette image que la Russie et toute l’Afrique sont dans la même zone, ainsi que l’Espagne et le Groenland, ou encore le sud des États-Unis et le grand nord du Canada. En revanche, cette politique commerciale permet d’appliquer des tarifs et circuits de distribution différenciés par continent.

J’ai donc commandé sur Aliexpress, en Chine, les circuits de remplacement “zone Europe”, pour chacune des 4 couleurs, pour le modèle d’imprimante 317.

Ces circuits sont normalement prévus pour recharger des cartouches avec du toner “compatible” (bien moins cher). Je dois être l’un des rares à m’en être servi sur des cartouches constructeur neuves. La somme est modique (15 € par circuit), le risque financier est donc minime même si l’opération échoue, et la manipulation est simple : 2 vis à ôter, le chip à remplacer, on revisse et c’est reparti.

Cet hiver j’avais remplacé le chip de la cartouche magenta, ce qui m’a permis d’utiliser à nouveau l’imprimante après presque 1 an de panne sans trop savoir comment s’en sortir. Je viens de remplacer le chip et la cartouche noire. On note sur l’emballage (photo ci-dessous) la mention du nombre de pages (3K), de la couleur (BK = black, noir), et de la zone géographique (EUR).

Addendum technique : les circuits ci-dessus sont interfacés avec l’imprimante par le protocole I2C, très courant dans le petit matériel électronique. Il est possible, dans une certaine mesure, de les reprogrammer par ce protocole pour changer les paramètres (autre couleur, autre imprimante, autre zone géographique, remise à zéro du compteur), et on trouve sur le web des instructions d’électroniciens à cet effet. C’est de ce type d’instructions que se servent les vendeurs de chips “pirates”. Dans certains cas, il est impossible de reprogrammer un circuit qui est arrivé au bout du nombre de pages. J’ai essayé ces procédés avec un Raspberry — car celui-ci comporte une interface I2C — sur les circuits “constructeur”, mais sans succès. J’aurai peut-être plus de résultats avec les circuits commandés en Chine.

Les imprimantes considérées ici sont les Lexmark CS310dn (sans wifi) et CS317dn (avec wifi), mais il existe énormément d’autres marques connues qui pratiquent le même genre de procédé : HP, Epson, Ricoh, Samsung, etc. L’objet de ce texte était surtout de montrer les complications que cela implique pour des usages légitimes, ces restrictions n’étant bien entendu jamais explicitées lors de l’acquisition.

La mesure automatisée de consommation électrique

Suite à mon billet précédent sur la question, et quelques retours de Stéphane Bortzmeyer, Philippe Bourcier et Laurent Penou, que je remercie ; suite aussi à un article tout récent de Pour la Science, j’ai décidé de commander un peu de matériel électronique pour pouvoir mieux mesurer la consommation des équipements réseau domestiques.

Voici le graphique extrait de Pour la Science titré « le vrai coût énergétique du numérique » (réservé abonnés) [ bizarrement, le graphique semble avoir disparu de l’article depuis que je l’ai consulté initialement ], par Anne-Cécile Orgerie.

C’est ce style de graphe que je souhaiterais réaliser.

Pour cela, il faut un système permettant un relevé automatique périodique des consommations.

J’ai donc commandé :

  • une prise DELOCK 11827, essayée par Jan-Piet Mens ici.

Ces prises permettent une commande de l’appareil branché, mais aussi une consultation de sa consommation relevable par navigateur web ou programmation, à travers une connexion wifi.

  • un boîtier PZEM-004T. Le PZEM-004T est un circuit wattmètre intégré qui se branche entre le secteur et l’équipement à mesurer. Il se vend parfois nu, parfois dans un boîtier plastique. Il peut être relevé par port série (sur niveaux TTL), ou avec un câble USB réalisant l’adaptation. Le modèle représenté ici est limité à 10 ampères, mais il existe également une version 100 ampères que je n’ai pas commandée pour l’instant, et qui dispose d’une pince de courant pratique pour mesurer de fortes intensités sans couper le câble.
  • un relais 1PM « Shelly Plug ». Ce boîtier, normalement conçu pour être intégré dans un interrupteur mural ou une prise pour les rendre commandables à distance par navigateur web ou téléphone mobile, à travers votre wifi, inclut également un wattmètre relevable. Il y a en ce moment des promotions chez Shelly, petite société bulgare, et le paquet de 2 Shelly 1PM est à un prix particulièrement intéressant.
  • une « Shelly Plug S », à peu près la même chose que le Shelly 1PM ci-dessus, mais sous forme de prise électrique, prête à utiliser, et similaire à la DELOCK 11827 présentée en haut. Il existe un autre modèle de puissance supérieure, et toute une gamme pour commander vos appareils électriques à distance.
  • un module wattmètre I2C pour basse tension, courant continu, relevable par I2C. Il est donc plus compliqué à utiliser, il faut lui adjoindre un équipement supplémentaire disposant de l’I2C : un Raspberry, par exemple, ou un processeur destiné à l’électronique embarquée comme un STM32 ou un ESP32 qui disposent des interfaces nécessaires. Il doit être calibré avant usage, mais il dispose d’une bonne résolution (20 mW). En le complétant avec quelques prises adaptées, on peut par exemple lui faire mesurer la consommation d’un appareil USB, d’un appareil sur batterie, ou peut-être sur adaptateur secteur — si la tension mesurée est suffisamment lissée, ce qui n’est pas forcément gagné dans ce dernier cas –.

Voilà. Restera à installer tout ça et à en tirer des informations pertinentes.

PS : Stéphane Bortzmeyer a lui aussi parlé des mesures qu’il a faites sur son réseau (électrique) domestique, des appareils utilisés, et des résultats obtenus. https://www.bortzmeyer.org/mesure-conso-energie.html

Petit jeu de fraîcheur avec les moteurs Qwant et Bing

Vous connaissez sans doute le moteur de recherche français Qwant. Ce moteur a défrayé la chronique à plusieurs reprises ces dernières années, et à plusieurs titres.

L’un des critiques principales était sa dépendance au moteur états-unien Bing de Microsoft.

En effet, créer un index significatif du web est une entreprise difficile et coûteuse en temps comme en ressources. Qwant avait donc choisi plus ou moins officiellement de s’appuyer sur les résultats de Bing, pendant qu’il constituait son propre logiciel et son propre index, tout en vendant des publicités sur les pages de résultats pour s’assurer un début de revenu.

Rapidement sont apparues des critiques sur la vitesse d’indexation des sites, certaines pages n’étant manifestement rafraîchies que rarement.

J’ai voulu en avoir le cœur net en créant une page sur un site que je gère, nic.eu.org. La page est ici et affiche la date et heure du jour à Paris, avec une chaîne unique permettant de la retrouver facilement dans les moteurs. Elle est référencée par un lien caché sur la page d’accueil du même site.

Le résultat est plutôt bon en termes de fraîcheur. Ainsi, ce matin 11 mars 2020, on peut voir sur Qwant que la page indexée a été parcourue le 9 mars à 0h51 :

Cependant, les choses se gâtent en ce qui concerne l’indépendance vis-à-vis de Bing. En effet, la page retournée par Qwant est en fait celle indexée par Bing, comme le montre une recherche sur Bing qui donne une date identique.

On obtient le même résultat par une recherche sur Duckduckgo, autre moteur utilisant Bing :

Dans les journaux de connexion du serveur web, il est facile de voir qu’en effet, à cette date, c’est bien l’indexeur de Bing qui est passé sur la page, suivi peu après par celui de MSN :

40.77.167.206 - - [09/Mar/2020:00:51:23 +0100] "GET /d.html HTTP/1.1" 200 63 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" nic.eu.org

40.77.167.221 - - [09/Mar/2020:00:53:09 +0100] "GET /d.html HTTP/1.1" 200 63 "-" "msnbot/2.0b (+http://search.msn.com/msnbot.htm)" nic.eu.org

À ce jour, l’indexeur de Qwant n’a pas visité cette même page. Il passe régulièrement sur le site, mais se contente en général de visiter la page d’accueil et l’icone du site :

194.187.171.130 - - [11/Mar/2020:10:28:48 +0100] "GET /favicon.ico HTTP/1.1" 404 196 "-" "Qwantify/1.0" nic.eu.org

194.187.171.142 - - [11/Mar/2020:10:28:48 +0100] "GET / HTTP/1.1" 200 1572 "-" "Qwantify/1.0" nic.eu.org

Publier un livre Kindle avec un outil libre : LibreOffice

Voici une petite recette que j’ai concoctée un peu par hasard, par essais-erreurs, avant d’arriver par hasard à une solution satisfaisante alors que je n’y croyais plus trop. Comme elle peut servir à d’autres, la voici.

Le problème : éditer en version Kindle un livre déjà constitué au format LibreOffice.

Par “déjà constitué”, j’entends simplement :

– composé de manière homogène avec des styles (paragraphes, chapitres, notes de bas de page…)

– disposant d’une table des matières

En général, si le tout a été accompli jusqu’à l’édition d’un PDF imprimable qui ressemble à ce que l’on a coutume d’appeler un livre (pages paires, impaires, début des chapitres sur page impaire, couverture et 4e de couverture…) , le boulot est déjà fait, et largement au delà du strict nécessaire.

Au départ j’ai voulu passer par le format ePub, qui a l’avantage d’être ouvert, et l’extension writer2epub de LibreOffice, mais le résultat souffrait de quelques bugs de formatage. Il aurait sans doute été possible de les corriger à la main, avec l’inconvénient d’avoir à les recorriger à la main à chaque nouvelle correction du contenu dans l’original.

Finalement, il a suffi dans LibreOffice :

– d’enlever la couverture afin d’avoir un fichier ne contenant que l’intérieur du livre, ce que demandent de toute façon les imprimeurs ;

– d’exporter le fichier résultant au format .docx, puis de l’importer chez Amazon. Amazon ne connaît malheureusement pas le format .odt natif de LibreOffice.

La conversion en format Kindle est réalisée par Amazon à la volée et ne prend que quelques minutes.

Ensuite que l’auteur (ce n’est pas moi) remplisse un dossier administratif (compte bancaire pour recevoir les droits, déclaration fiscale US…).

Puis il suffit d’attendre la validation par Amazon, annoncée “jusqu’à 48 heures”, mais qui n’a pris là que quelques heures, avant d’apparaître dans la boutique.

Et voilà, si vous voulez voir le résultat, le livre se trouve en vente ici dans la boutique Amazon 🙂

Commentaires bienvenus (oui, il faudrait peut-être ajouter une couverture…)

Routage ferroviaire pour raildar.fr avec Openstreetmap et OSRM

Pour fêter la nouvelle année, que je vous souhaite à toutes et tous joyeuse et heureuse, voici une petite application web que j’ai écrite récemment pour aider au débogage des trajets de raildar.fr, qui permet d’identifier plus rapidement les problèmes à corriger dans openstreetmap.org. Voir plus bas pour des précisions de fond.

Ça se révèle assez ludique (pour les amateurs de trains).

Voici l’URL temporaire “de travail” chez moi avec un exemple de trajet Londres-Amsterdam :

https://signal.eu.org/osm/?fromto=51.534377,-0.128574,52.379018,4.899988

Pour demander un trajet, on déplace simplement les deux marqueurs et le logiciel de routage se débrouille, et affiche la distance résultante.

En voici une copie d’écran (cliquer pour agrandir) :

LondresAmsterdam

Attention, ne bourrinez pas trop sur le serveur, le calcul des routes prend quelques secondes et utilise l’instance OSRM de raildar.fr.

L’application est aussi déployée sur les serveurs de @Turblog (Bruno Spiquel) dans une version un peu moins à jour.

Quelques précisions pour ceux qui ne connaissent pas : raildar.fr utilise les données SNCF de retard, ainsi que la base cartographique openstreetmap.org. openstreetmap.org est en quelque sorte le Wikipédia de la cartographie. Chacun peut y apporter des corrections. En complément, OSRM (Open Source Routing Machine) extrait les différents graphes (routiers, ferroviaires, etc) afin de calculer des trajets de toutes sortes dans le graphe.

Mon application est éhontément dérivée du code initial de raildar.fr (écrit par , basé sur leaflet et jQuery) auquel j’ai ajouté le décodage de la sortie OSRM.

 

Quand la fibre Free se fait attendre, même à Paris

(précision sur le titre : le “même à Paris” est une allusion à la densité de la ville, où donc la rentabilité par rapport à l’investissement, prétexte souvent soulevé par les opérateurs, est le moins susceptible de poser un problème)

À l’heure où beaucoup monde se plaint de ne pouvoir obtenir la fibre (à part une poignée de privilégiés qui l’ont déjà, sans compter les très rares qui pourraient l’avoir mais n’en veulent pas), une étude OCDE signalée par Numerama confirme le colossal retard français en la matière.

Récemment, Orange a annoncé triomphalement activer 4000 prises par semaine.

La situation dans mon immeuble :

  • immeuble construit en 2008
  • convention Free signée début 2011
  • repérage puis pose par Free de la desserte horizontale (égouts -> immeuble) en octobre/novembre 2011
  • depuis… rien !

On appelle “desserte horizontale” le raccordement par la rue, les égouts, etc, d’un immeuble au réseau d’un opérateur.

La “desserte verticale” est le câblage interne de l’immeuble, reliant l’arrivée horizontale aux logements à desservir.

Lorsque les deux sont réunis, on parle d’accès FTTH (fiber to the home, fibre jusqu’à l’habitation).

Voici donc une photo, prise le 13 novembre 2011, de l’arrivée de la fibre Free dans le sous-sol de mon immeuble, via les égouts de Paris. La fibre est munie d’une jolie étiquette verte “FREE INFRASTRUCTURE” avec une référence et un numéro de téléphone qui tombe sur un répondeur, renvoyant l’appelant vers d’autres numéros “spéciaux syndics d’immeuble” qui ne permettent jamais d’obtenir quelqu’un. On voit que la fibre est sagement enroulée, inutile, en attente d’être branchée sur un réseau vertical qui n’est toujours pas là, près d’un an après.

Dans mon immeuble, les questions logiques des résidents : “On a bien voté la convention fibre pour Free en assemblée générale annuelle ? Ça en est où ? Faut-il qu’on demande à un autre opérateur ?”

Notre immeuble est très loin de représenter un cas isolé, j’ai entendu parler d’exemples similaires à Paris et à Lyon. Les opérateurs se sont fait la course pour mettre un pied le plus rapidement possible dans les immeubles, mais se font tirer l’oreille pour terminer les travaux, prétextant une faible demande des abonnés..

Parallèlement, pour masquer le retard français, les pouvoirs publics utilisent les statistiques faussement flatteuses de Numéricâble, un réseau câblé de télévision vieux, à quelques rénovations près, de 30 ans, en fibre (moderne à l’époque) prolongée dans les immeubles par du câble coaxial tout à fait classique et aux performances bien moindres que la fibre optique de bout-en-bout.

Quant aux opérateurs, par souci d’économie, ils misent sur la technologie VDSL2 pour donner une “2ème vie” [sic] au réseau cuivre du téléphone classique. On ignorait que celui-ci était mort une première fois.

Mise à jour : je ne regrette pas d’avoir écrit et diffusé ceci sur twitter, j’ai pu avoir des retours sur la procédure à suivre pour avancer. Free semble avoir résilié la convention d’immeuble.

Il nous appartient donc de choisir un nouvel opérateur d’immeuble  lors de la prochaine assemblée générale ; cet opérateur pourra effectuer la pose du câblage vertical et utiliser la fibre posée par Free.

Mise à jour 2 : il s’avère que les deux seuls opérateurs installant du FTTH en France en tant qu’opérateur d’immeuble actuellement sont SFR et FT/Orange. Merci beaucoup aux personnes qui m’ont donné des contacts (SFR très réactif…).

L’ARC (association conseillant les syndics de copropriété) arrive aux mêmes constatations, mais conseille carrément de rester en ADSL, ce qui est absurde et désolant. L’ARC soulève des arguments spécieux à mon sens contre les conventions des opérateurs (en fait reprises d’un modèle ARCEP) : durée de 25 ans (compréhensible, cela limite les interventions perpétuelles en AG, mais elles peuvent être résiliées avec préavis de 18 mois) et non-propriété du câblage à l’issue de la convention (compréhensible également : je vois mal les copropriétés se charger de la maintenance/entretien/évolution technique ou avoir un prestataire supplémentaire à trouver pour cela).

Voir :

Lossless import of MPEG-TS or HDV video files to iMovie

Here’s a little trick I learned and wanted to share. As it’s not complete, comments and additional hints are welcome!

The problem

I have a Canon HDV camcorder with many hours of HDV video. HDV is mpeg2-compressed video with a bitrate of about 25 Mbps.

I also have a MacOS X computer where I can run iMovie, Apple’s consumer-grade video editing application.

The camcorder video can be easily imported to FreeBSD using the built-in fwcontrol tool. It generates MPEG-TS files (mostly like IP TV channels) which read nicely in vlc, mplayer and other video tools. It’s easy and reliable.

The video can also be imported directly from the camcorder to iMovie, but it is painful and not adapted to easy archiving of the rushes. The import process is slow and buggy and you often have to rewind the tape and restart it.

I wanted to get the best of both worlds — fwcontrol’s easy import followed with iMovie editing.

But iMovie doesn’t know how to directly import MPEG-TS files. It can only import video from .mov (Quicktime) or .mp4 (MPEG4) containers. It’s difficult to know which video codecs are supported by iMovie but it seems to accept MPEG2, which means it can losslessly import HDV files, it’s just a matter of converting their container format from MPEG-TS to Quicktime.. It saves us from the slow, error-prone, lossy and painful process of transcoding.

So how do you do that?

The (mostly complete) solution

Here’s the incantation that mostly works for me. input.mpg is my MPEG-TS file; it can come from a fwcontrol import or from a IPTV capture (Freebox file for example); output.mov is the resulting Quicktime-container file:

ffmpeg -i input.mpg -acodec copy -vcodec copy output.mov

On my server (a double-core Intel Atom D525 processor with SATA disks, ie not a very fast machine) it converts at about 80-100 frames per second (3x to 4x real time), which is very fair (IO bound probably) and 12 to 20 times faster than transcoding the video.

From an IPTV capture you may have to explicitly transcode audio to AAC using -acodec libvo_aacenc instead.

Your second-best bet if the above doesn’t work is to let ffmpeg make a (much slower) almost-lossless transcoding to MPEG4, using option -sameq, yielding a bigger file (was almost twice as big as the original in my trials):

ffmpeg -i input.mpg -acodec copy -sameq output.mov

It works, but…

Why do I say it mostly works? Because there are two remaining gotchas:

  1. the original video timestamps (date and time of the video) are lost and set to the date and time of the conversion process — it’s constant and doesn’t even increment throughout the file duration. It is probably a ffmpeg bug. I tweaked the import with -copyts option but this apparently handles the time index from the camcorder (duration from the beginning of the tape). This may (or may not) be related to the following error message from ffmpeg: [NULL @ 0x806c1d920] start time is not set in av_estimate_timings_from_pts
  2. iMovie doesn’t seem to grok huge files. It works for a couple hundred megabytes, but not for a couple gigabytes. So you may have to split files take by take, and I don’t know how to do that easily, especially given the above regarding broken timestamps.

Thanks to Benjamin Sonntag for the excellent idea of using ffmpeg for this 😉

Comments and especially clues/solutions more than welcome 😉

Petite expérience de DNS et de Twitter avec wikileaks

On a tout à fait le droit de ne pas partager à 100 % les idées et les procédés de Wikileaks, actuellement sur le devant de l’actualité, et certaines de ces critiques sont légitimes. Mais, a contrario, certains des procédés utilisés pour les faire taire ont un petit parfum qui, à titre personnel, me dérange.

L’expérience du jour : wikileaks.org ayant vu son DNS coupé par son hébergeur (problèmes d’attaques, officiellement), les discussions de ce matin sur Twitter consistaient à s’échanger “à la main” les adresses IP des miroirs… pas très pratique. Cette coupure de DNS fait suite à un déplacement du site de chez Amazon, aux USA, vers OVH, un hébergeur français.

Et puis j’ai fait une proposition toute bête qui a bien décollé et j’ai créé wikileaks.eu.org pour accomplir ma part, merci à tous ceux qui ont suivi et qui ont été ajoutés dans cete liste plus générale (section “miroirs DNS”).

Jean-Michel Planche ayant pris la peine de faire un résumé du contexte, je ne vais pas le paraphraser, allez voir son billet.

Voir aussi la lettre de mission d’Éric Besson (à Pascal Faure du CGIET) divulguée par LePost, qui vaut franchement le déplacement. Pour résumer, Éric Besson cherche un moyen d’expulser le site de France.

Un autre billet général chez Authueil sur la censure en général et celle de Wikileaks en particulier résume bien la question.

Et un article d’Écrans (Libération) résume bien la situation à l’exception d’une erreur : FDN n’héberge pas un miroir de Wikileaks, wikileaks.fdn.fr est juste un renvoi DNS suivant la méthode exposée ci-dessus.

Désolé pour ce billet un peu décousu mis à jour au fur et à mesure…

Mise à jour 18h45 : c’est maintenant le nom wikileaks.ch actif depuis ce matin qui est en carafe…

Mise à jour 4 décembre 2h35 : une liste plus complète chez Bluetouff.

TCP-Estimated round-trip test

In an attempt to evaluate different methods for measuring the performance of a TCP/IP connection, I’ve bumped into FreeBSD‘s getsockopt(TCP_INFO) system call, cloned from a similar call invented by Linux, which kindly returns interesting data about the current TCP connection.

I was mainly interested about round-trip time (RTT, called tcpi_rtt) and its standard deviation, mistakenly called tcpi_rttvar even though it’s not a variance.

I’ve written a small proof-of-concept tool accessible at http://eu.org:4500/ to display operating system information retrieved from the current HTTP access. The page currently runs on a FreeBSD 9-CURRENT machine; feel free to try it out, it works either in IPv4 or IPv6. Here’s a sample as of today:

This experimental page displays raw system TCP estimates, in microseconds.

Address: 2a01:e35:8b50:2c40::4
Estimated round-trip time: 15437
Estimated standard deviation: 27937

Note that the measures are very rough. First, the real resolution is about 1 millisecond (one kernel tick), not 1 microsecond. Then, several RTT samples are smoothed into the provided values, with a bigger weight for more recent samples. I left the actual values obtained from the kernel, for clarity, even though giving them up to a 1 microsecond resolution is somewhat misleading.

Then, of course, the results also depend on the number of samples, which tends to be low: the above page waits for the client HTTP headers to be fully received, then emits its own headers in reply, then waits for one second to give some time for the TCP ack(s) to come back, then displays the then-current estimations.

The results are probably sufficient for TCP’s internal needs, but they may differ wildly from real RTT values. Plus, the real RTT value depends on packet size, which TCP doesn’t seem to take into account. The above example is taken from my local network and displays over 15 ms for the RTT, whereas the real RTT is well below 1 ms (0.23 min, 0.4 average with 0.01 standard deviation, according to ping). The results are not always wildly up, I’ve noticed the opposite effect from a remote mobile phone displaying ~100 ms whereas the ping time was more like ~200 ms…

Feel free to use it and add comments below.