<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>GPU on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/gpu/</link><description>Recent content in GPU on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Tue, 23 Dec 2025 08:00:00 +0200</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/gpu/index.xml" rel="self" type="application/rss+xml"/><item><title>Installation d'un Alpine Linux en mode 'headless' sur Raspberry Pi</title><link>https://blog.zwindler.fr/2025/12/23/alpine-linux-raspberry-pi-headless/</link><pubDate>Tue, 23 Dec 2025 08:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2025/12/23/alpine-linux-raspberry-pi-headless/</guid><description>&lt;img src="https://blog.zwindler.fr/2025/12/rpizero.webp" alt="Featured image of post Installation d'un Alpine Linux en mode 'headless' sur Raspberry Pi" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Pour un article qui sortira peut-être sur papier (je croise les doigts), j&amp;rsquo;avais besoin de tester différents types d&amp;rsquo;OS à installer sur un Raspberry Pi Zero 2 W.&lt;/p&gt;
&lt;p&gt;Comme je ne connaissais ni Alpine, ni les spécificités du Pi Zero 2 W, je suis tombé sur pas mal de trucs que je ne connaissais pas.&lt;/p&gt;
&lt;p&gt;Même si au final, l&amp;rsquo;article papier ne traite pas d&amp;rsquo;installation d&amp;rsquo;Alpine Linux (ni même ne l&amp;rsquo;utilise), je me suis dit que c&amp;rsquo;était dommage de ne pas publier cette expérience Alpine + RPi Zero, donc la voici.&lt;/p&gt;
&lt;h2 id="pourquoi-alpine-linux-"&gt;Pourquoi Alpine Linux ?
&lt;/h2&gt;&lt;p&gt;Principalement pour sa légèreté et sa faible consommation de ressources. Sur un nano-ordinateur avec seulement 512 Mo de RAM, chaque mégaoctet compte. Alpine Linux est connu pour être minimaliste et aussi un peu controversé (notamment dans le monde Docker) pour le remplacement de la glibc par musl (ce qui provoque parfois des surprises).&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;objectif de cet article est d&amp;rsquo;avoir une installation headless (sans écran ni clavier) accessible en SSH via WiFi, avec une RAM optimisée au maximum.&lt;/p&gt;
&lt;p&gt;On va voir plein de détails techniques intéressants, notamment sur la gestion de la RAM du GPU et la configuration du swap avec zswap !&lt;/p&gt;
&lt;h2 id="téléchargement-de-limage-alpine-linux-pour-raspberry-pi"&gt;Téléchargement de l&amp;rsquo;image Alpine Linux pour Raspberry Pi
&lt;/h2&gt;&lt;p&gt;La première chose à faire est de télécharger l&amp;rsquo;image, avant de pouvoir la copier sur une carte microSD qui sera insérée dans le rpi avant boot.&lt;/p&gt;
&lt;p&gt;Coup de bol, Alpine Linux propose des images spécifiques pour Raspberry Pi, on ne va pas avoir besoin d&amp;rsquo;ajouter à la main le firmware des RPi.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/12/alpine-pi.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On va récupérer la dernière version disponible depuis le &lt;a class="link" href="https://www.alpinelinux.org/downloads/" target="_blank" rel="noopener"
&gt;site officiel&lt;/a&gt;. Exemple :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://dl-cdn.alpinelinux.org/alpine/v3.23/releases/aarch64/alpine-rpi-3.23.2-aarch64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cette image est spécialement compilée pour l&amp;rsquo;architecture ARM64 (aarch64) des Raspberry Pi récents (donc mon RPi Zero 2 W).&lt;/p&gt;
&lt;h2 id="configuration-headless-avec-le-fichier-overlay"&gt;Configuration headless avec le fichier overlay
&lt;/h2&gt;&lt;p&gt;Une fois l&amp;rsquo;image flashée sur votre carte microSD (avec Raspberry Pi Imager par exemple), on va préparer le système pour un accès headless.&lt;/p&gt;
&lt;p&gt;Alpine Linux supporte ce qu&amp;rsquo;on appelle des &amp;ldquo;overlay files&amp;rdquo; qui permettent de préconfigurer le système avant le premier boot. C&amp;rsquo;est documenté dans la &lt;a class="link" href="https://wiki.alpinelinux.org/wiki/Installation_on_a_headless_host#Headless_bootstrap_overlay_file" target="_blank" rel="noopener"
&gt;documentation officielle sur l&amp;rsquo;installation headless&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Montez le contenu de votre carte microSD sur votre machine et déposez le fichier overlay à la racine de cette carte microSD :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://github.com/macmpi/alpine-linux-headless-bootstrap/raw/469ee440e7d394cca0976c78f357e7a0e1c82cc4/headless.apkovl.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note : c&amp;rsquo;est assez &lt;strong&gt;flippant&lt;/strong&gt; de monter un fichier aussi sensible provenant d&amp;rsquo;un repo github tiers (github.com/macmpi), mais Alpine Linux se veut rassurant en nous disant :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: The author of above repo macmpi also maintains a number of packages for Alpine Linux.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Je suis pas beaucoup plus rassuré&amp;hellip; mais bon, c&amp;rsquo;est &amp;ldquo;officiel&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Ce fichier &lt;code&gt;headless.apkovl.tar.gz&lt;/code&gt; configure Alpine pour :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Booter en mode DHCP&lt;/li&gt;
&lt;li&gt;Activer SSH automatiquement&lt;/li&gt;
&lt;li&gt;Permettre la connexion root sans mot de passe (attention à ne pas laisser ça comme ça trop longtemps !)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour que le Raspberry Pi se connecte automatiquement à votre réseau WiFi, créez un fichier &lt;code&gt;wpa_supplicant.conf&lt;/code&gt; à la racine de la microSD :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; wpa_supplicant.conf &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;country=FR
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;network={
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; key_mgmt=WPA-PSK
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; ssid=&amp;#34;mySSID&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; psk=&amp;#34;myPassPhrase&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/12/alpine-root-headless.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Remplacez évidemment &lt;code&gt;mySSID&lt;/code&gt; et &lt;code&gt;myPassPhrase&lt;/code&gt; par vos informations WiFi.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; : Le projet alpine-linux-headless-bootstrap propose d&amp;rsquo;autres options de configuration très utiles, comme la définition d&amp;rsquo;un mot de passe root, d&amp;rsquo;une adresse IP fixe, etc. Plus d&amp;rsquo;infos dans &lt;a class="link" href="https://github.com/macmpi/alpine-linux-headless-bootstrap/?tab=readme-ov-file#extra-configuration" target="_blank" rel="noopener"
&gt;leur README&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="premier-boot-et-installation-permanente"&gt;Premier boot et installation permanente
&lt;/h2&gt;&lt;p&gt;Une fois le premier boot effectué, connectez-vous en SSH :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh root@&amp;lt;ip_du_raspberry&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/12/alpine-headless-boot.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attention&lt;/strong&gt; : Par défaut, le mot de passe root est vide ! Mais on n&amp;rsquo;a pas besoin de changer ça si on réalise &lt;strong&gt;immédiatement&lt;/strong&gt; l&amp;rsquo;installation qui suit.&lt;/p&gt;
&lt;p&gt;À ce stade, Alpine tourne entièrement en RAM (image &amp;ldquo;live&amp;rdquo;). Pour l&amp;rsquo;installer définitivement, nous allons utiliser l&amp;rsquo;utilitaire &lt;code&gt;setup-alpine&lt;/code&gt; dont les options sont décrites dans &lt;a class="link" href="https://wiki.alpinelinux.org/wiki/Installation#Base_configuration" target="_blank" rel="noopener"
&gt;wiki.alpinelinux.org/wiki/Installation&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;setup-alpine
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Voici un petit extrait des informations demandées (somme tout assez classiques pour une install d&amp;rsquo;OS) :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/12/alpine-setup-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/12/alpine-setup-2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Suivez les instructions, puis rebootez :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="optimisation-de-la-ram-gpu"&gt;Optimisation de la RAM GPU
&lt;/h2&gt;&lt;p&gt;Par défaut sur un Raspberry Pi, une (grande) partie de la RAM est allouée au GPU pour le traitement graphique. Sur un serveur headless, ça ne sert strictement à rien.&lt;/p&gt;
&lt;p&gt;Vérifions d&amp;rsquo;abord la RAM disponible avant optimisation :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;free -m
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: &lt;span class="m"&gt;417&lt;/span&gt; &lt;span class="m"&gt;37&lt;/span&gt; &lt;span class="m"&gt;325&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;55&lt;/span&gt; &lt;span class="m"&gt;369&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Seulement 417 Mo disponibles sur les 512 Mo théoriques. Voyons comment récupérer ces précieux mégaoctets.&lt;/p&gt;
&lt;p&gt;Idéalement, on va vouloir mettre l&amp;rsquo;option &lt;code&gt;gpu_mem=16&lt;/code&gt; dans &lt;code&gt;/boot/config.txt&lt;/code&gt; pour n&amp;rsquo;allouer que 16 Mo au GPU (on ne peut pas mettre moins, et il faut des multiples de 16).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mais attention&lt;/strong&gt;, il y a un piège !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/12/nouvelle_regle.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Lorsque vous réglez &lt;code&gt;gpu_mem&lt;/code&gt; à 16 Mo, le bootloader du Raspberry Pi tente de charger des fichiers de firmware allégés :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;start_cd.elf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fixup_cd.dat&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sauf que ces fichiers ne sont pas présents sur votre partition de boot. Si on met juste &lt;code&gt;gpu_mem=16&lt;/code&gt; dans &lt;code&gt;/boot/config.txt&lt;/code&gt; et qu&amp;rsquo;on reboot, le Pi refusera de démarrer (LED ACT clignotant généralement 4 fois).&lt;/p&gt;
&lt;h3 id="solutions-pour-minimiser-la-ram-gpu"&gt;Solutions pour minimiser la RAM GPU
&lt;/h3&gt;&lt;p&gt;Vous avez deux options :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option 1&lt;/strong&gt; : Mettre &lt;code&gt;gpu_mem=32&lt;/code&gt; dans &lt;code&gt;/boot/config.txt&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est la solution de facilité (qui a dit fainéant ?), il n&amp;rsquo;y a rien à faire. Vous récupérez quand même 32 Mo de RAM.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option 2&lt;/strong&gt; : Télécharger les fichiers de firmware allégés (celle que je préfère)&lt;/p&gt;
&lt;p&gt;On n&amp;rsquo;est pas à quelques Mo près sur la carte microSD, ce qui n&amp;rsquo;est pas le cas de la RAM, où chaque Mo compte.&lt;/p&gt;
&lt;p&gt;Si vous voulez vraiment descendre à 16 Mo, récupérez les fichiers manquants :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /boot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/start_cd.elf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/fixup_cd.dat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis modifiez &lt;code&gt;/boot/config.txt&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[...]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;gpu_mem&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;start_file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;start_cd.elf &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;fixup_file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;fixup_cd.dat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Après reboot, vérifiez le gain :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;free -m
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: &lt;span class="m"&gt;465&lt;/span&gt; &lt;span class="m"&gt;37&lt;/span&gt; &lt;span class="m"&gt;393&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;35&lt;/span&gt; &lt;span class="m"&gt;416&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On passe de 417 Mo à 465 Mo disponibles ! Soit presque 50 Mo de récupérés, ce qui représente environ 10% de RAM supplémentaire. Sur un système aussi contraint, c&amp;rsquo;est significatif.&lt;/p&gt;
&lt;h2 id="configuration-du-swap-avec-zswap"&gt;Configuration du swap avec zswap
&lt;/h2&gt;&lt;p&gt;Sur un système avec seulement 512 Mo de RAM, il est plus que judicieux de configurer du swap. Or, Alpine Linux n&amp;rsquo;en configure pas par défaut. Je vais ici en configurer un avec &lt;a class="link" href="https://docs.kernel.org/admin-guide/mm/zswap.html" target="_blank" rel="noopener"
&gt;zswap&lt;/a&gt;, qui compresse les pages de mémoire avant de les écrire sur le disque (ce qui limite la taille des accès à la carte microSD au passage).&lt;/p&gt;
&lt;h3 id="création-du-swapfile"&gt;Création du swapfile
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Créer un swapfile de 2 Go&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fallocate -l 2G /swapfile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;600&lt;/span&gt; /swapfile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkswap /swapfile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;swapon /swapfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="configuration-persistante"&gt;Configuration persistante
&lt;/h3&gt;&lt;p&gt;Pour rendre le swapfile et zswap persistants au reboot, créez &lt;code&gt;/etc/fstab&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/swapfile none swap sw 0 0&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/fstab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Créez un script de démarrage pour Alpine :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/local.d/swap.start &lt;span class="s"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;swapon /swapfile
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x /etc/local.d/swap.start
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rc-update add &lt;span class="nb"&gt;local&lt;/span&gt; default
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Enfin, éditez &lt;code&gt;/boot/cmdline.txt&lt;/code&gt; et ajoutez à la fin (sur une seule ligne) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;zswap.enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=20 zswap.accept_threshold_percent=85 zswap.shrinker_enabled=Y
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Quelques explications sur ces paramètres :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;compressor=lz4&lt;/code&gt; : utilise lz4, rapide et efficace pour la compression&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max_pool_percent=20&lt;/code&gt; : zswap n&amp;rsquo;utilisera pas plus de 20% de la RAM (~93 Mo) comme cache de compression avant d&amp;rsquo;écrire sur le swapfile disque&lt;/li&gt;
&lt;li&gt;&lt;code&gt;accept_threshold_percent=85&lt;/code&gt; : n&amp;rsquo;accepte de compresser que si le taux de compression attendu est d&amp;rsquo;au moins 85%&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shrinker_enabled=Y&lt;/code&gt; : permet de libérer automatiquement la mémoire compressée si nécessaire&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le principe : zswap agit comme un cache rapide en RAM (compressé) devant le swapfile de 2 Go sur disque. Les pages sont d&amp;rsquo;abord compressées dans zswap, puis évacuées vers le disque si nécessaire.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Pas vraiment de conclusion à cet article, en réalité.&lt;/p&gt;
&lt;p&gt;Je me suis pris pas mal de &amp;ldquo;murs&amp;rdquo;, ne sachant pas utiliser Alpine (au delà des usages que j&amp;rsquo;en avais fait avec Docker), et j&amp;rsquo;ai découvert quelques subtilités liées au firmware du Raspberry Pi Zero avec lequel je fais joujou depuis quelques semaines maintenant.&lt;/p&gt;
&lt;p&gt;D&amp;rsquo;où cet article ;-)&lt;/p&gt;
&lt;p&gt;Bon hack !&lt;/p&gt;</description></item><item><title>Générer ses images Stable Diffusion sur Ubuntu 22.04</title><link>https://blog.zwindler.fr/2023/01/04/generer-ses-images-stable-diffusion-sur-ubuntu-22.04/</link><pubDate>Tue, 03 Jan 2023 07:15:00 +0000</pubDate><guid>https://blog.zwindler.fr/2023/01/04/generer-ses-images-stable-diffusion-sur-ubuntu-22.04/</guid><description>&lt;img src="https://blog.zwindler.fr/2023/01/stablediffusion.webp" alt="Featured image of post Générer ses images Stable Diffusion sur Ubuntu 22.04" /&gt;&lt;h2 id="lia-et-le-retour-de-la-vengeance"&gt;L&amp;rsquo;IA et le retour de la vengeance
&lt;/h2&gt;&lt;p&gt;Ce n&amp;rsquo;est pas la première fois que je parle de machine learning sur le blog. La première fois, j&amp;rsquo;avais testé pour le fun de selfhost &lt;a class="link" href="https://blog.zwindler.fr/2020/01/13/lancer-aidungeon-2-sur-ubuntu-18-04/" &gt;AIDungeon 2, un jeu de rôle où l&amp;rsquo;histoire est générée par l&amp;rsquo;&amp;ldquo;&amp;ldquo;&amp;ldquo;IA&amp;rdquo;&amp;rdquo;&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A l&amp;rsquo;époque, j&amp;rsquo;essayais de jouer à AIDungeon sur l&amp;rsquo;application web disponible en ligne mais le site était très souvent down, car, à cause de l&amp;rsquo;engouement pour le jeu et son côté hyper ludique / technophile, l&amp;rsquo;auteur avait reçu une facture cloud de quelques dizaines de milliers de dollars (et c&amp;rsquo;était pas trop prévu).&lt;/p&gt;
&lt;p&gt;Heureusement, le jeu étant (à l&amp;rsquo;époque) complètement open source, j&amp;rsquo;avais eu l&amp;rsquo;idée de faire un guide pour le lancer soi-même (enfin, fallait quand même un GPU avec 8 Go de VRAM)&amp;hellip;&lt;/p&gt;
&lt;p&gt;Et depuis l&amp;rsquo;an dernier, l&amp;rsquo;IA revient sur le devant de la scène.&lt;/p&gt;
&lt;p&gt;Non, je ne vais pas parler de ChatGPT mais de DALL-E 2. Il faut bien le reconnaitre, a bluffé plus d&amp;rsquo;une personne. Et Dall-e n&amp;rsquo;étant pas open source, il n&amp;rsquo;a pas fallu bien longtemps pour que des alternatives open source voient le jour (avec des résultats souvent moins impressionnant mais quand même).&lt;/p&gt;
&lt;p&gt;Sauf que&amp;hellip; rebelote, les serveurs en ligne sont leeeeeents. Ca serait cool si on pouvait lancer ça en local.&lt;/p&gt;
&lt;p&gt;Ca tombe bien, j&amp;rsquo;ai une machine avec Ubuntu 22.04 et une carte graphique NVidia RTX 3080 hors de prix sous mon bureau 😏😏😏.&lt;/p&gt;
&lt;p&gt;Note: vous avez besoin d&amp;rsquo;une machine avec un GPU avec au minimum 4 Go de VRAM (sinon ça sera en mode CPU et ça sera extrêmement lent), de minimum 20 Go d&amp;rsquo;espace disque pour le modèle et les dépendances et d&amp;rsquo;un compte sur HuggingFace.com pour récupérer le modèle Stable Diffusion.&lt;/p&gt;
&lt;h2 id="installer-les-mises-à-jour-et-les-prérequis"&gt;Installer les mises à jour et les prérequis
&lt;/h2&gt;&lt;p&gt;La première chose à faire dans tout bon guide est évidemment de tout mettre à jour.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Normalement sur Ubuntu 22.04 vous devriez avoir Python 3 installé par défaut, il nous faut la version 3.9 ou 3.10 avec les venvs.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install python3.10 python3.10-venv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si on veut profiter de notre GPU, il va falloir passer par les pilotes officiels nvidia (et pas &amp;ldquo;nouveau&amp;rdquo;).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install --no-install-recommends nvidia-driver-525 xserver-xorg-video-nvidia-525
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et surtout, il faudra absolument rebooter ensuite (sinon le GPU ne sera pas détecté).&lt;/p&gt;
&lt;h2 id="galères-dinstallation"&gt;Galères d&amp;rsquo;installation
&lt;/h2&gt;&lt;p&gt;Sur AIDungeon j&amp;rsquo;avais pété un plomb, car les dépendances pour tout ce qui est GPU + machine learning et Python sont très capricieuses&amp;hellip;&lt;/p&gt;
&lt;p&gt;Pour ce qui est de Stable Diffusion, à l&amp;rsquo;époque de la sortie j&amp;rsquo;avais trouvé la documentation pas ouffissime et j&amp;rsquo;avais abandonné assez vite. Jusqu&amp;rsquo;à il y a peu il y avait très peu de guides pour l&amp;rsquo;installer facilement sur sa machine.&lt;/p&gt;
&lt;p&gt;La plupart des guides proposaient de le lancer sur des notebooks en ligne (donc hosté quelque part) et c&amp;rsquo;est pas du tout ce que je voulais.&lt;/p&gt;
&lt;p&gt;Heureusement, je suis tombé sur ce post &lt;a class="link" href="https://code.mendhak.com/run-stable-diffusion-on-ubuntu/" target="_blank" rel="noopener"
&gt;The simplest way to get started with Stable Diffusion on Ubuntu&lt;/a&gt;, qui parle d&amp;rsquo;un dépôt git &lt;a class="link" href="https://github.com/lstein/stable-diffusion.git" target="_blank" rel="noopener"
&gt;github.com/lstein/stable-diffusion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sauf que ce guide proposait d&amp;rsquo;installer toutes les dépendances avec Anaconda et ne marche plus aujourd&amp;rsquo;hui (problèmes de dépendances python, encore&amp;hellip;).&lt;/p&gt;
&lt;p&gt;Heureusement, rebondissant sur le dépôt mentionné juste avant, je me suis rendu compte que le dépôt avait changé de nom et beaucoup évolué depuis l&amp;rsquo;article sur mendhak.com.&lt;/p&gt;
&lt;p&gt;Le dépôt s&amp;rsquo;appelle maintenant &lt;a class="link" href="https://github.com/invoke-ai/InvokeAI" target="_blank" rel="noopener"
&gt;github.com/invoke-ai/InvokeAI&lt;/a&gt; et dispose de scripts d&amp;rsquo;installation assez poussés et multi plateformes.&lt;/p&gt;
&lt;h2 id="récupérer-linstalleur"&gt;Récupérer l&amp;rsquo;installeur
&lt;/h2&gt;&lt;p&gt;On peut faire l&amp;rsquo;installation via les sources soit même (je donne des infos plus loin) mais le plus simple est de suivre le script d&amp;rsquo;installation, &lt;a class="link" href="https://github.com/invoke-ai/InvokeAI/releases/tag/v2.2.4" target="_blank" rel="noopener"
&gt;disponible dans les &amp;ldquo;releases&amp;rdquo; dans Github&lt;/a&gt; :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;wget https://github.com/invoke-ai/InvokeAI/files/10254727/InvokeAI-installer-2.2.4-p5-linux.zip
unzip InvokeAI-installer-2.2.4-p5-linux.zip &amp;amp;&amp;amp; cd InvokeAI-Installer/
./install.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vous serez guidé lors du processus d&amp;rsquo;installation, c&amp;rsquo;est assez simple&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Welcome to InvokeAI. This script will &lt;span class="nb"&gt;help&lt;/span&gt; download the Stable Diffusion weight files and other large models that are needed &lt;span class="k"&gt;for&lt;/span&gt; text to image generation. At any point you may interrupt this program and resume later.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;** INITIALIZING INVOKEAI RUNTIME DIRECTORY **
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Select the default directory &lt;span class="k"&gt;for&lt;/span&gt; image outputs &lt;span class="o"&gt;[&lt;/span&gt;/home/zwindler/invokeai/outputs&lt;span class="o"&gt;]&lt;/span&gt;: /home/zwindler/invokeai/outputs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;...&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A un moment on va vous demander de valider des licences (étape &amp;ldquo;3. Accept the license terms located here&amp;rdquo;). Il faut juste les lire sur le site et appuyer sur entrée pour continuer (j&amp;rsquo;avais pas compris au début&amp;hellip;).&lt;/p&gt;
&lt;p&gt;La dernière étape consiste à générer (&lt;a class="link" href="https://huggingface.co/settings/tokens" target="_blank" rel="noopener"
&gt;ici&lt;/a&gt;) et donner au script un token en &amp;ldquo;read&amp;rdquo; sur votre compte Hugging Face. C&amp;rsquo;est assez simple et ça permet de télécharger automatiquement le dernier modèle de Stable Diffusion.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/01/hugging_face_token.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="lancer-"&gt;Lancer !
&lt;/h2&gt;&lt;p&gt;Une fois installé, on peut lancer le script &lt;code&gt;invokeai/invoke.sh&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;important est que la ligne suivante apparaisse quand vous lancez le script (&amp;ldquo;cuda&amp;rdquo; et pas &amp;ldquo;cpu&amp;rdquo;)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt; Using device_type cuda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ce qui est assez cool avec InvokeAI, c&amp;rsquo;est l&amp;rsquo;ajout d&amp;rsquo;une interface web pour faciliter vos générations, même s&amp;rsquo;il existe toujours un prompt terminal si vous préférez :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Do you want to generate images using the
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. command-line
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. browser-based UI
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. open the developer console
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Please enter 1, 2, or 3: &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/01/invokeAI_launch.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;A partir de là, vous pourrez générer autant de chats mignons que vous voudrez !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/01/invokeAI_webui.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/01/invokeAI_cuda.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Have fun :D&lt;/p&gt;
&lt;h2 id="bonus--installation-manuelle"&gt;Bonus : installation manuelle
&lt;/h2&gt;&lt;p&gt;Lors de ma première installation, j&amp;rsquo;avais oublié qu&amp;rsquo;il fallait absolument les drivers officiels nvidia pour faire du cuda sous Ubuntu (alors que j&amp;rsquo;avais eu le même problème pour AIdungeon 🤦). Le script se lançait en mode &amp;ldquo;CPU&amp;rdquo; et la génération de la moindre image prenait 5 minutes&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;* Initialization done! Awaiting your command (-h for help, &amp;#39;q&amp;#39; to quit)
invoke&amp;gt; a cat
Generating: 0%| | 0/1 [00:00&amp;lt;?, ?it/s]&amp;gt;&amp;gt; Ksampler using model noise schedule (steps &amp;gt;= 30)
&amp;gt;&amp;gt; Sampling with k_lms starting at step 0 of 50 (50 new sampling steps)
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [05:41&amp;lt;00:00, 6.82s/it]
Generating: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [05:49&amp;lt;00:00, 349.51s/it]
&amp;gt;&amp;gt; Usage stats:
&amp;gt;&amp;gt; 1 image(s) generated in 349.99s
Outputs:
[1] /home/zwindler/invokeai/outputs/000001.3257807215.png: a cat -s 50 -S 3257807215 -W 512 -H 512 -C 7.5 -A k_lms
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;J&amp;rsquo;ai donc tâtonné et essayé d&amp;rsquo;installer l&amp;rsquo;outil &amp;ldquo;à la main&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Si vous ne voulez pas utiliser l&amp;rsquo;installeur pour une raison ou pour une autre, vous pouvez donc aussi utiliser &lt;a class="link" href="https://invoke-ai.github.io/InvokeAI/installation/manual/" target="_blank" rel="noopener"
&gt;cette page de documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai essayé, ça marche (mais c&amp;rsquo;était pas mon problème).&lt;/p&gt;
&lt;h2 id="bonus--vérifier-que-votre-gpu-est-bien-détecté"&gt;Bonus : Vérifier que votre GPU est bien détecté
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;Python 3.10.6 (main, Nov 14 2022, 16:10:14) [GCC 11.3.0] on linux
Type &amp;#34;help&amp;#34;, &amp;#34;copyright&amp;#34;, &amp;#34;credits&amp;#34; or &amp;#34;license&amp;#34; for more information.
&amp;gt;&amp;gt;&amp;gt; import torch
&amp;gt;&amp;gt;&amp;gt; torch.cuda.is_available()
True
&amp;gt;&amp;gt;&amp;gt; torch.cuda.device_count()
1
&amp;gt;&amp;gt;&amp;gt; torch.cuda.get_device_capability()
(8, 6)
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Kubecon Europe 2021 – Récap’ du vendredi</title><link>https://blog.zwindler.fr/2021/05/12/kubecon-europe-2021-recap-du-vendredi/</link><pubDate>Wed, 12 May 2021 07:00:00 +0000</pubDate><guid>https://blog.zwindler.fr/2021/05/12/kubecon-europe-2021-recap-du-vendredi/</guid><description>&lt;img src="https://blog.zwindler.fr/2021/05/kasten-1.webp" alt="Featured image of post Kubecon Europe 2021 – Récap’ du vendredi" /&gt;&lt;h2 id="dernier-jour-de-kubecon-"&gt;&lt;strong&gt;Dernier jour de Kubecon !&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;C’est déjà la fin de la Kubecon :-(.&lt;/p&gt;
&lt;p&gt;Bon, en vrai, faire une conférence en ligne sur 3 jours était hyper intense et je suis rincé et je suis aussi un peu content que la conférence ait une fin ;-p.&lt;/p&gt;
&lt;p&gt;J’ai énormément appris de choses et je ne me suis pas trop trompé dans les talks que j’ai sélectionné. Visiblement, le board qui choisi les talks est bien rôdé maintenant et je pense que la très grande majorité des conférences étaient de grande qualité.&lt;/p&gt;
&lt;p&gt;Si vous avez lu le résumé des jours précédents, vous aurez remarqué que j’ai fait un gros focus sur la partie réseau et sécurité de l’écosystème autour de Kubernetes. Et c’est bien normal puisque c’est une bonne partie du travail qui m’attend dans les prochains mois&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.zwindler.fr/2021/05/05/kubecon-europe-2021-recap-du-mercredi/" &gt;/2021/05/05/kubecon-europe-2021-recap-du-mercredi/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.zwindler.fr/2021/05/06/kubecon-europe-2021-recap-du-jeudi/" &gt;/2021/05/06/kubecon-europe-2021-recap-du-jeudi/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="keynotes"&gt;Keynotes
&lt;/h2&gt;&lt;p&gt;J’ai eu un peu de mal à suivre les keynotes ainsi que certaines conférences de cette journée pour une raison que je détaillerai dans un dernier article, avec mes conclusions. Voilà quand même ce que j’ai noté :&lt;/p&gt;
&lt;p&gt;J’ai raté la keynote sur WASM, celle sur l’innovation dans l’open source (Success Through Failure), donnée par Thomas Di Giacomo, Chief Technology &amp;amp; Product Officer chez SUSE, ainsi que celle sur COVID Tracker.&lt;/p&gt;
&lt;p&gt;La keynote suivante était une keynote sponsorisée par Vijoy Pandey, un VP chez Cisco, qui était assez basique sur l’intérêt des services mesh. Le talk aurait pu être résumé en une seule slide (la seule intéressante) qui disait que les services mesh servent à 4 choses : Discover, Consume, Connect, Observe.&lt;/p&gt;
&lt;p&gt;Un keynote vraiment sympa (de mon point de vue) était la keynote de Daniel Mangum. Il a présenté l’architecture RISC-V (propriétaire) puis un projet open source pour l’Instruction Set Architecture, qui a permis le portage de nombreux projets open source sur RISC-V. A force de portages, d’abord go, puis des projets en go, puis docker et enfin Kubernetes ont été portés sur RISC-V (ce qui est aussi fun qu’inutile).&lt;/p&gt;
&lt;p&gt;On a également eu un chouette talk sur la community culture pour le projet Kubernetes par Aeva Black (Microsoft) et Bob Killen (Google).&lt;/p&gt;
&lt;p&gt;Globalement, j’en ai retenu que les communautés sur des projets si vastes (des milliers de contributeurs, dont des entreprises multinationales) étaient mouvantes et qu’il fallait mettre en place des processus parfois complexes de manière à garder de la cohérence mais surtout de la confiance dans le travail des uns et des autres.&lt;/p&gt;
&lt;p&gt;J’ai aussi beaucoup aimé ce diagramme:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/05/dunbar.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="gateway-api-a-new-set-of-kubernetes-apis-for-advanced-traffic-routing"&gt;Gateway API: A New Set of Kubernetes APIs for Advanced Traffic Routing
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://kccnceu2021.sched.com/event/iE39/gateway-api-a-new-set-of-kubernetes-apis-for-advanced-traffic-routing-harry-bagdi-kong-inc-rob-scott-google" target="_blank" rel="noopener"
&gt;Page de la session&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://static.sched.com/hosted_files/kccnceu2021/19/%5BSIG-NETWORK%5D%20Gateway%20API_%20A%20New%20Set%20of%20Kubernetes%20APIs%20for%20Advanced%20Traffic%20Routing.pdf" target="_blank" rel="noopener"
&gt;Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cette session avait vocation à présenter la Gateway API, une nouvelle API permettant d’étendre les capacités en termes de routage des requêtes HTTP par rapport à ce qu’on peut faire actuellement avec les Services (trop focus sur les Loadbalancers tiers) ou les Ingress (trop limités).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/05/api-model.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a class="link" href="https://gateway-api.sigs.k8s.io/" target="_blank" rel="noopener"
&gt;gateway-api.sigs.k8s.io/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Au delà de l’ajout indéniable de features comme le traffic splitting, les header matching, &amp;hellip; out of the box, l’avantage de la Gateway API est qu’elle ajoute des couches d’abstractions, notamment au niveau implémentation.&lt;/p&gt;
&lt;p&gt;Cela permet notamment (dans un contexte multi cloud par exemple) d’avoir des contrôleurs différents dans des clusters distincts, et ainsi fournir une expérience unifiée pour les développeurs d’un cluster à l’autre, ou alors de faciliter la migration d’un service mesh à un autre.&lt;/p&gt;
&lt;p&gt;Aujourd’hui, les composants/logiciels suivants implémentent la Gateway API : Contour, kong, solo, gke, traefik, istio.&lt;/p&gt;
&lt;h2 id="kubernetes-advanced-networking-testing-with-kind"&gt;Kubernetes Advanced Networking Testing with KIND
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://kccnceu2021.sched.com/event/iE3g/kubernetes-advanced-networking-testing-with-kind-antonio-ojea-redhat?iframe=no" target="_blank" rel="noopener"
&gt;Page de la session&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://static.sched.com/hosted_files/kccnceu2021/df/Kubernetes%20_Advanced_Networking_Testing%20_with_KIND_Antonio_Ojea_Kubecon_2021.pdf" target="_blank" rel="noopener"
&gt;Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce talk était plus une grande démo de KIND (Kubernetes in Docker) qu’autre chose.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/05/kind_logo.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Le speaker a montré qu’il était possible d’émuler sans trop de bidouilles plusieurs clusters Kubernetes sur un même laptop avec KIND.&lt;/p&gt;
&lt;p&gt;Meh.&lt;/p&gt;
&lt;h2 id="a-deep-dive-on-supporting-multi-instance-gpus-in-containers-and-kubernetes"&gt;A Deep Dive on Supporting Multi-Instance GPUs in Containers and Kubernetes
&lt;/h2&gt;&lt;p&gt;Même si j’en ai effectivement « un peu » besoin puisque j’ai des workloads GPU à administrer, ce talk était plus un talk plaisir qu’autre chose ;)&lt;/p&gt;
&lt;p&gt;Dans ce talk, ça a parlé de GROS GPU, &lt;a class="link" href="https://www.nvidia.com/en-us/data-center/a100/" target="_blank" rel="noopener"
&gt;notamment les A100&lt;/a&gt;, et des outils que NVidia met à disposition pour les splitter en plusieurs GPU virtuels. Ca a parlé de MIG (Multi Instance GPU), de GPU Instance, de compute instance et de memory slices.&lt;/p&gt;
&lt;p&gt;Comme c’est littéralement une des premières choses que j’ai essayé de faire lorsque j’ai commencé à travailler il y a 12 ans (même si c’était pas pour Kubernetes à l’époque, bien sûr), j’ai vraiment adoré ce talk même si je n’ai pas appris grand chose.&lt;/p&gt;
&lt;p&gt;Ce qu’il faut retenir, c’est que « oui », c’est possible de splitter des GPU dans Kubernetes, mais que ce n’est pas trivial et qu’il y a plein de limitations (en tout cas pour l’instant) qui rende le splitting pas flexible pour un sou.&lt;/p&gt;
&lt;p&gt;Si ça vous intéresse, je vous invite à lire &lt;a class="link" href="https://static.sched.com/hosted_files/kccnceu2021/e9/KubeconEU-2021-MIG-Deep-Dive-Containers-Kubernetes.pdf" target="_blank" rel="noopener"
&gt;les slides&lt;/a&gt; qui décrivent pas mal les problématiques que vous pourriez rencontrer.&lt;/p&gt;
&lt;h2 id="discontiguous-cidrs-for-dynamic-cluster-scaling"&gt;Discontiguous CIDRs for Dynamic Cluster Scaling
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://kccnceu2021.sched.com/event/iE3F/discontiguous-cidrs-for-dynamic-cluster-scaling-rahul-joshi-sudeep-modi-google" target="_blank" rel="noopener"
&gt;Page de la session&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://static.sched.com/hosted_files/kccnceu2021/49/Discontiguous_CIDRs_For_Dynamic_Cluster_Scaling_RahulJoshi_SudeepModi_50721_v1.pdf" target="_blank" rel="noopener"
&gt;Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Comme j’avais déjà eu par le passé des problématiques de CIDR trop petit dans un cluster Kubernetes, j’ai voulu voir ce talk donné par deux ingénieurs de chez Google cloud, par curiosité.&lt;/p&gt;
&lt;p&gt;Même si j’ai appris quelques trucs sur les raisons de pourquoi on doit trasher un cluster si le clusterCIDR qu’on a choisi est trop petit, je n’ai pas été super emballé par la façon dont c’était présenté (« on vous montre ce qu’on veut proposer comme solution à ce problème pour le projet Kubernetes ») qui faisait plus promo de leur implémentation de solution qu’un réel talk pour expliquer.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/05/podCIDR.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;C’était quand même intéressant, en faisant abstraction de l’aspect « campagne électorale », puisqu’on a deep dive sur la façon dont les CIDR sont affectés et les composants qui utilisent le cluster CIDR (nodeIPAM controller &amp;amp; kube-proxy).&lt;/p&gt;
&lt;h2 id="les-talks-que-jaurai-aimé-voir"&gt;Les talks que j’aurai aimé voir
&lt;/h2&gt;&lt;p&gt;Après m’être un peu cassé les dents sur un problème de liveness probe pétée avec Rook, j’aurais bien aimé pouvoir voir le talk &lt;a class="link" href="https://kccnceu2021.sched.com/event/iE6R/rook-intro-and-ceph-deep-dive-blaine-gardner-red-hat-satoru-takeuchi-cybozu-inc" target="_blank" rel="noopener"
&gt;Rook: Intro and Ceph Deep Dive&lt;/a&gt; de Satoru Takeuchi et Blaine Gardner, deux mainteneurs de Rook, en particulier sur la partie Ceph.&lt;/p&gt;
&lt;p&gt;Les &lt;a class="link" href="https://static.sched.com/hosted_files/kccnceu2021/82/Slides.pdf" target="_blank" rel="noopener"
&gt;slides sont disponibles ici.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;J’aurais aimé aussi voir &lt;a class="link" href="https://kccnceu2021.sched.com/event/iE66" target="_blank" rel="noopener"
&gt;Multi-tenancy vs. Multi-cluster: When Should you Use What?&lt;/a&gt; mais un collègue est allé le voir alors je suis sûr qu’il me fera un retour ;)&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Malgré quelques points négatifs (j’y reviendrais dans un dernier article la semaine prochaine), faire une Kubecon en ligne n’était pas un exercice vain.&lt;/p&gt;
&lt;p&gt;Je repars avec beaucoup d’idées, beaucoup de motivation. C’était donc compliqué car intense, mais utile.&lt;/p&gt;
&lt;p&gt;Les intervenants et leurs talks (je mets de côté les keynotes) étaient de grande qualité et il n’y a pas eu de créneaux « creux » où je n’avais rien envie d’aller voir (c’était même plutôt le contraire).&lt;/p&gt;
&lt;p&gt;J’ai hâte de refaire des conférences IRL (voire en tant que speaker qui sait ?).&lt;/p&gt;
&lt;p&gt;En attendant, have fun ;-)&lt;/p&gt;</description></item><item><title>Lancer AIDungeon 2 sur Ubuntu 18.04</title><link>https://blog.zwindler.fr/2020/01/13/lancer-aidungeon-2-sur-ubuntu-18-04/</link><pubDate>Mon, 13 Jan 2020 07:15:00 +0000</pubDate><guid>https://blog.zwindler.fr/2020/01/13/lancer-aidungeon-2-sur-ubuntu-18-04/</guid><description>&lt;img src="https://blog.zwindler.fr/2020/01/aidungeon_screen.webp" alt="Featured image of post Lancer AIDungeon 2 sur Ubuntu 18.04" /&gt;&lt;h2 id="aidungeon-2"&gt;AIDungeon 2
&lt;/h2&gt;&lt;p&gt;Il y a quelques semaines, je suis tombé sur AIDungeon 2, un jeu hilarant qui mixe jeu d’aventure textuel, machine learning et de gros (GROS) GPUs NVidia.&lt;/p&gt;
&lt;p&gt;Note: English speakers, I’ve released &lt;a class="link" href="https://blog.zwindler.fr/2020/01/08/run-aidungeon-2-on-ubuntu-18-04/" &gt;an english version of this tutorial here&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AIDungeon2 is a first of its kind AI generated text adventure. Using a 1.5B parameter machine learning model called GPT-2 AIDungeon2 generates the story and results of your actions as you play in this virtual world. Unlike virtually every other game in existence, you are not limited by the imagination of the developer in what you can do. Any thing you can express in language can be your action and the AI dungeon master will decide how the world responds to your actions.
&lt;a class="link" href="https://www.aidungeon.io/" target="_blank" rel="noopener"
&gt;https://www.aidungeon.io/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si vous n’en avez pas encore entendu parler, il s’agit d’un projet de machine learning créé par Nick Walton. Il est basé sur &lt;a class="link" href="https://openai.com/blog/better-language-models/" target="_blank" rel="noopener"
&gt;le model GPT-2 d’OpenAI&lt;/a&gt; que vous avez peut être déjà croisé dans d’autre projets fun comme celui qui permet, à partir de quelques lignes de texte, d’écrire une suite : &lt;a class="link" href="https://talktotransformer.com/" target="_blank" rel="noopener"
&gt;TalkTotransformer by Adam D King&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="et-ça-fait-quoi-"&gt;Et ça fait quoi ?
&lt;/h2&gt;&lt;p&gt;C’est là où le fun commence. Comme TalkToTransformer, à partir d’un texte de départ semi aléatoire, le modèle de machine learning commence à construire une nouvelle histoire, différente à chaque fois. Et ce sont vos actions et votre imagination qui vont diriger l’histoire dans un sens ou dans l’autre.&lt;/p&gt;
&lt;p&gt;Je ne vais pas mentir, c’est encore loin d’être parfait. Le modèle a la fâcheuse tendance à tourner en rond, ou alors à oublier ce que les personnages viennent de faire, juste une ligne plus haut. Et ça peut un peu gâcher l’histoire.&lt;/p&gt;
&lt;p&gt;Mais&amp;hellip; si on met de côté ces petits soucis de jeunesse, ce qui est vraiment incroyable, ce sont les possibilités qui semblent vraiment illimités. C’est vraiment très impressionnant.&lt;/p&gt;
&lt;p&gt;Au final, ce n’est pas tellement surprenant. La seule limite du modèle, c’est le savoir et le style d’écriture d’OpenAI, qui se base sur 40 Go de texte provenant d’Internet. C’est colossal !&lt;/p&gt;
&lt;p&gt;Si jamais vous avez besoin d’exemples concrets, je vous invite à aller faire un tour sur le Twitter de Nick Walton ou alors sur le &lt;a class="link" href="https://www.reddit.com/r/AIDungeon/" target="_blank" rel="noopener"
&gt;subreddit dédié à AIDungeon&lt;/a&gt;. Vous y trouverez tout type d’aventures hilarantes compilées par les joueurs.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/01/story.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In this example, my inputs are the 2 lines preceded by the « &amp;gt; » symbol, the machine did the rest&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="ok-cest-cool--quel-est-le-problème-"&gt;Ok c’est cool ! Quel est le problème ?
&lt;/h2&gt;&lt;p&gt;En fait, j’en ai déjà parlé.&lt;/p&gt;
&lt;p&gt;Le jeu, qui n’est ni plus ni moins qu’un prompt et du texte qui s’affiche, est très probablement le jeu le plus gourmand en GPU que vous avez rencontré. Quelle délicieuse ironie ;).&lt;/p&gt;
&lt;p&gt;En réalité, le jeu nécessite actuellement près de 9 Go de VRAM GPU et un très grand nombre de coeurs CUDA pour fonctionner. Cela écarte d’office toutes les cartes AMD, ainsi que presque toutes les cartes graphiques NVidia (hormis les plus chère, à + de 1000€).&lt;/p&gt;
&lt;p&gt;Dommage.&lt;/p&gt;
&lt;h2 id="la-communauté"&gt;La communauté
&lt;/h2&gt;&lt;p&gt;Heureusement, l’enthousiasme de la communauté pour ce jeu a motivé Nick Walton et son frère à trouver des solutions. Pendant le mois de décembre, ils ont tout plaqué (dont des exams) pour proposer une infrastructure sous AWS, ainsi qu’une application iOS, Android, et une application web pour que tout le monde puisse en profiter.&lt;/p&gt;
&lt;p&gt;Seulement, vous vous en douter, faire tourner une infra aussi gourmande à un coût. Selon les dires de Nick, les instances AWS avec des cartes Tegra leur coûtent autour de 65000 dollars par mois. Malgré le Patreon qu’ils ont ouvert et qui a permis de récolté 15000$, on est loin du compte.&lt;/p&gt;
&lt;p&gt;Il est probable qu’à terme, le jeu ne soit plus gratuit. Du coup, si le jeu vous plait, &lt;a class="link" href="https://www.patreon.com/AIDungeon" target="_blank" rel="noopener"
&gt;je vous invite à aller voir leur Patreon !&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="et-maintenant-"&gt;Et maintenant ?
&lt;/h2&gt;&lt;p&gt;La troisième raison (au delà de la prouesse technique et du côté fun) pour laquelle je me suis intéressé au projet est que Nick l’a open sourcé, dès le début.&lt;/p&gt;
&lt;p&gt;On peut donc imaginer, si on a suffisamment de puissance sur sa machine, pouvoir le lancer soit même (et ça c’est cool).&lt;/p&gt;
&lt;p&gt;Les sources sont disponibles &lt;a class="link" href="https://github.com/AIDungeon/AIDungeon" target="_blank" rel="noopener"
&gt;sur le compte Github AIDungeons&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mais à partir de là, je me suis dis que ça pourrait être sympa de lancer AIDungeon 2 sur une instance GPU d’un cloud provider lambda.&lt;/p&gt;
&lt;p&gt;Donc j’ai décidé d’essayer ;-p.&lt;/p&gt;
&lt;p&gt;Pour mon test, j’ai donc choisi de commander une instance virtuelle NC6 (6 vcpus, 56 GiB memory, Tegra K80) de chez Microsoft Azure avec un compte de test gratuit. Mais c’est évidemment applicable à n’importe quelle machine, physique ou chez un autre provider, que vous auriez à votre disposition. Il faut juste qu’elle soit équipée d’une GTX 1080 Ti, GTX 2080 Ti, GTX 2080ti super ou équivalent pro.&lt;/p&gt;
&lt;p&gt;Ce type de machine coute, selon les datacenters (mais ça nous importe peu ici) environ 43 centime d’euro de l’heure. On peut même descendre à 0,21€ en utilisant des VMs préemptibles. Du coup, même sans avoir un compte d’essai, ça ne reviendra pas très cher si vous ne faites que l’essayer.&lt;/p&gt;
&lt;p&gt;Sur ma NC6, j’ai déployé un basique Ubuntu 18.04 et c’est là que le tutoriel commence !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/01/aidungeon.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Note: En suivant à la lettre le tuto et en partant d’une Ubuntu 18.04 fraichement installée, vous devriez en avoir tout de même pour 30 à 45 minutes d’installation de packages et de prérequis.&lt;/p&gt;
&lt;h2 id="installer-les-mises-à-jour-et-les-prérequis"&gt;Installer les mises à jour et les prérequis
&lt;/h2&gt;&lt;p&gt;La première chose à faire est évidemment de tout mettre à jour.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt-get update
sudo apt-get upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois que c’est fait, on passe aux packages systèmes dont on a besoin pour la suite :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt-get install git aria2 unzip python3-pip
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="lenfer-des-dépendances"&gt;L’enfer des dépendances
&lt;/h2&gt;&lt;p&gt;Et c’est la que le vrai fun commence (ou pas). Cette partie justifie quasiment à elle seule le tuto. AIDungeon utilise TensorFlow (la lib de machine learning) et les drivers NVidia et CUDA pour fonctionner correctement. Cependant, la blague, c’est que toutes les versions de chaque composants ne fonctionneront pas ensemble.&lt;/p&gt;
&lt;p&gt;Pour démarrer AIDungeons, vous aller devoir explicitement installer tensorflow 1.15 (pas plus, pas moins). Et bien sûr tensorflow==1.15 nécessite spécifiquement cuda10.0 (pas cuda10.1 ni cuda10.2) et Python de la version 3.4 à la version 3.7!&lt;/p&gt;
&lt;p&gt;Horreur&amp;hellip;&lt;/p&gt;
&lt;h2 id="installer-les-drivers-nvidia-cuda-et-les-modules-de-machine-learning"&gt;Installer les drivers NVidia, Cuda et les modules de machine learning
&lt;/h2&gt;&lt;p&gt;Ajoutez les dépôts pour cuda10.0:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo apt-get update
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt-get update
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Maintenant, installer les drivers nvidia-driver, puis rebooter (c’est important) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt-get install --no-install-recommends nvidia-driver-440 xserver-xorg-video-nvidia-440
sudo reboot
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Après reboot, installer les libs pour cuda10.0&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt-get install --no-install-recommends \
cuda-10-0 cuda-runtime-10-0 cuda-demo-suite-10-0 cuda-drivers \
libcudnn7=7.6.2.24-1+cuda10.0 libcudnn7-dev=7.6.2.24-1+cuda10.0
sudo apt-get install -y --no-install-recommends libnvinfer5=5.1.5-1+cuda10.0 \
libnvinfer-dev=5.1.5-1+cuda10.0
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="récupérer-les-sources"&gt;Récupérer les sources
&lt;/h2&gt;&lt;p&gt;Téléchargez les sources depuis Github :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;git clone https://github.com/AIDungeon/AIDungeon/
cd AIDungeon/
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="installer-python3-les-dépendances-via-pip3"&gt;Installer python3, les dépendances via pip3
&lt;/h2&gt;&lt;p&gt;Et non, ce n’est toujours pas terminé. Maintenant qu’on a récupéré les sources, il est nécessaire d’installer tous les modules Python3 nécessaire à l’exécution du jeu.&lt;/p&gt;
&lt;p&gt;Par défaut, Ubuntu 18.04 utilise toujours Python dans sa version 2 comme interpréteur Python par défaut. Or, vous le savez tous, Python 2 vient de tirer sa révérence ce 1er janvier.&lt;/p&gt;
&lt;p&gt;De plus, pip, le package manager de Python, installé est une vieille version. Elle ne propose tensorflow que jusqu’à la 1.14 (voir l’annexe). La misère.&lt;/p&gt;
&lt;p&gt;Et comme si ce n’était pas suffisant, ceux qui ont déjà essayé de mettre à jour pip depuis la version disponible dans le gestionnaire de paquet d’Ubuntu savent que c’est un bon moyen de tout casser.&lt;/p&gt;
&lt;p&gt;On se retrouve très souvent avec l’erreur &lt;code&gt;pip ImportError: cannot import name ’main’ after update&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Pour passer outre cette difficulté, le plus simple est d’utiliser le script &lt;a class="link" href="https://pip.pypa.io/en/stable/installing/#upgrading-pip" target="_blank" rel="noopener"
&gt;upgrading pip&lt;/a&gt; disponible sur la page officielle de pip.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python3 get-pip.py
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="installer-aidungeon-enfin-"&gt;Installer AIDungeon, enfin !
&lt;/h2&gt;&lt;p&gt;Entre le moment où j’ai écris le draft de l’article il y a quelques semaines et aujourd’hui, le script d’installation a été amélioré et fonctionne mieux (il manquait une dépendance entre autre). Du coup, cette partie devrait se limiter à simplement exécuter 2 scripts. Cependant, au cas où, j’ai laissé les commandes que MOI j’ai du utiliser pour débloquer la situation.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo ./install.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si ça ne fonctionne pas, vous pouvez installer les packages python comme ceci :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;python3 -m pip install -r requirements.txt --user
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le script qui suit va télécharger le modèle de machine learning via un client torrent (au début, Nick s’est pris une facture bien salée à cause des coûts de téléchargement du modèle).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;./download_model.sh
[...]
Status Legend:
(OK):download completed.
Download Complete!
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="lancer-aidungeon-2"&gt;Lancer AIDungeon 2
&lt;/h2&gt;&lt;p&gt;Bravo ! Vous pouvez enfin profiter du jeu&lt;/p&gt;
&lt;p&gt;Si vous avez utilisé le script officiel (qui utilisez des venv Python), lancez les commandes suivantes :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;source ./venv/bin/activate
./play.py
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sinon, vous pouvez vous passer de la partie &lt;em&gt;venvs&lt;/em&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd ~/AIDungeon/
python3 play.py
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/01/initializing.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;L’initialisation du jeu prennait quelques minutes mais c’est normal. A priori ce temps a été grandement réduit (on est passé de 5-10 minutes, c’était vraiment long, à 1 ou 2 max).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/01/aidungeon_screen.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="bonus-commandes-utiles-pour-surveiller-lusage-du-gpu"&gt;Bonus: Commandes utiles pour surveiller l’usage du GPU
&lt;/h2&gt;&lt;p&gt;Vous pouvez installer l’utilitaire gpustat pour vérifier que le GPU est bien utilisé par l’application&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pip3 install gpustat --user
gpustat
gpustat -cp
aidungeon2 Mon Dec 9 13:22:24 2019 430.50
[0] Tesla K80 | 69&amp;#39;C, 17 % | 0 / 11441 MB |
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans un genre plus simple, moins sexy, vous pouvez aussi tout simplement utiliser l’outil intégré avec le driver NVidia (mais c’est moche).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;nvidia-smi --loop=1
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="bonus-vérifier-que-tensorflow-trouve-bien-le-gpu"&gt;Bonus: Vérifier que tensorflow trouve bien le GPU
&lt;/h2&gt;&lt;p&gt;Un des problèmes que j’ai eu au début était que je n’avais pas les bonnes libs. Les commandes qui suivent permettent de vérifier que tout fonctionne correctement côté tensorflow, et le cas échéant, vous afficher le message d’erreur :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;python3
from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf
print(&amp;#34;Num GPUs Available: &amp;#34;, len(tf.config.experimental.list_physical_devices(&amp;#39;GPU&amp;#39;)))
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Exemple d’une install qui marche&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;2019-12-10 16:25:39.714605: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcuda.so.1
2019-12-10 16:25:39.743758: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties:
name: Tesla K80 major: 3 minor: 7 memoryClockRate(GHz): 0.8235
pciBusID: 81c7:00:00.0
2019-12-10 16:25:39.744001: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.0
[...]
2019-12-10 16:25:39.754396: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1746] Adding visible gpu devices: 0
Num GPUs Available: 1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Exemple d’une install qui ne marche pas :-(&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[...]
Num GPUs Available: 0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note : si vous n’avez pas de GPU (ou que les libs ou drivers sont mal installés) vous pourrez quand meme jouer au jeu, mais il sera extrêmement lent (1-2 minutes entre chaque réponse de votre part et le temps que le texte suivant s’affiche).&lt;/p&gt;
&lt;h2 id="bonus-erreurs-gsutil-et-tensorflow"&gt;Bonus: Erreurs gsutil et tensorflow
&lt;/h2&gt;&lt;p&gt;Si vous avez oublié de mettre à jour pip, vous aurez cette erreur :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Collecting tensorflow==1.15 (from -r requirements.txt (line 6))
Could not find a version that satisfies the requirement tensorflow==1.15 (from -r requirements.txt (line 6)) (from versions: 0.12.1, 1.0.0, 1.0.1, 1.1.0rc0, 1.1.0rc1, 1.1.0rc2, 1.1.0, 1.2.0rc0, 1.2.0rc1, 1.2.0rc2, 1.2.0, 1.2.1, 1.3.0rc0, 1.3.0rc1, 1.3.0rc2, 1.3.0, 1.4.0rc0, 1.4.0rc1, 1.4.0, 1.4.1, 1.5.0rc0, 1.5.0rc1, 1.5.0, 1.5.1, 1.6.0rc0, 1.6.0rc1, 1.6.0, 1.7.0rc0, 1.7.0rc1, 1.7.0, 1.7.1, 1.8.0rc0, 1.8.0rc1, 1.8.0, 1.9.0rc0, 1.9.0rc1, 1.9.0rc2, 1.9.0, 1.10.0rc0, 1.10.0rc1, 1.10.0, 1.10.1, 1.11.0rc0, 1.11.0rc1, 1.11.0rc2, 1.11.0, 1.12.0rc0, 1.12.0rc1, 1.12.0rc2, 1.12.0, 1.12.2, 1.12.3, 1.13.0rc0, 1.13.0rc1, 1.13.0rc2, 1.13.1, 1.13.2, 1.14.0rc0, 1.14.0rc1, 1.14.0, 2.0.0a0, 2.0.0b0, 2.0.0b1)
No matching distribution found for tensorflow==1.15 (from -r requirements.txt (line 6))
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cette erreur ne devrait plus apparaitre maintenant, mais si vous n’avez pas le module gsutil, voici la stacktrace que vous aurez en quittant le jeu (sans conséquence) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt; ^C
Traceback (most recent call last):
File &amp;#34;play.py&amp;#34;, line 211, in &amp;lt;module&amp;gt;
play_aidungeon_2()
File &amp;#34;play.py&amp;#34;, line 97, in play_aidungeon_2
action = input(&amp;#34;&amp;gt; &amp;#34;)
KeyboardInterrupt
Exception ignored in: &amp;lt;bound method Story.__del__ of &amp;lt;story.story_manager.Story object at 0x7f797f4af0f0&amp;gt;&amp;gt;
Traceback (most recent call last):
File &amp;#34;/home/zwindler/AIDungeon/story/story_manager.py&amp;#34;, line 35, in __del__
self.save_to_storage()
File &amp;#34;/home/zwindler/AIDungeon/story/story_manager.py&amp;#34;, line 131, in save_to_storage
p = Popen([&amp;#39;gsutil&amp;#39;, &amp;#39;cp&amp;#39;, file_name, &amp;#39;gs://aidungeonstories&amp;#39;], stdout=FNULL, stderr=subprocess.STDOUT)
File &amp;#34;/usr/lib/python3.6/subprocess.py&amp;#34;, line 729, in __init__
restore_signals, start_new_session)
File &amp;#34;/usr/lib/python3.6/subprocess.py&amp;#34;, line 1364, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: &amp;#39;gsutil&amp;#39;: &amp;#39;gsutil&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.tensorflow.org/install/gpu" target="_blank" rel="noopener"
&gt;Tensorflow installation guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/tensorflow/tensorflow/issues/26182" target="_blank" rel="noopener"
&gt;Tensorflow install issues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.tensorflow.org/guide/gpu" target="_blank" rel="noopener"
&gt;Tensorflow GPU guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>