Un LLM hébergé à Paris chez Scaleway : carnet de bord, pénurie de GPU comprise
Servir un modèle open-weight sur un GPU Scaleway se monte en quelques jours. Mais la mémoire ne se résume pas aux poids, un réglage par défaut de vLLM peut empêcher le démarrage, et un GPU éteint peut ne pas revenir. Mesures et limites d’un pilote.

Lundi 9 novembre, vers 8 h 50, heure de Paris. Une requête arrive, notre veilleur demande à Scaleway d’allumer la L40S qui sert notre modèle. Réponse de l’API : out_of_stock. Le catalogue indique shortage pour toutes les L40S, H100 et B300, dans toutes les zones. Il reste des L4, marquées scarce.
Ce matin-là, nous devions présenter le projet à nos associés. Nous l’avons présenté quand même, sur deux L4, à un tarif voisin, après avoir modifié une variable. Ce carnet de bord raconte la mise en place d’un modèle de langage open-weight chez Scaleway, à Paris : le choix du GPU, les réglages de vLLM qui comptent, l’infrastructure, et ce que « éteindre une machine » veut dire dans un cloud sous tension.
Le cahier des charges : un modèle ouvert pour nos agents de code, hébergé en France, sur une machine dont nous maîtrisons la configuration, sans écrire les prompts dans les journaux, et sans payer un GPU qui dort. Le test de non-conservation et le veilleur qui éteint le GPU ont chacun leur article dans cette série.
Scaleway coche les cases qui comptent pour ce pilote :
- une zone de disponibilité à Paris (
fr-par-2, régionfr-par) avec des L4 et des L40S[1] ; - un calcul GPU facturé à la minute ; une fois la machine éteinte, il ne reste que ses volumes et son adresse IPv4[2] ;
- une API complète pour allumer, éteindre, et interroger la disponibilité de chaque type de machine[3] ;
- une société française[4], soumise au droit européen.
Nous avons privilégié des machines virtuelles dont nous configurons chaque service, plutôt qu’une offre d’inférence managée ou serverless : nous voulions pouvoir inspecter nous-mêmes les journaux de toute la chaîne. Ce choix ne signifie pas que les offres managées conservent les prompts, ni qu’un hébergeur français exclut tout accès légal ou technique.
Dimensionnement · Qwen3.8-27B en FP8
Les poids se calculent ; ce qui reste pour les conversations se mesure
- Poids du modèle (~27 Go, calculés)
- Reste : cache de contexte, états du modèle, moteur
| GPU | Mémoire | Poids (calculés) | Reste | Cache mesuré |
|---|---|---|---|---|
| L40S | 48 Go | ~27 Go | ~21 Go | 310 000 tokens |
| 2 × L4 | 2 × 24 Go | ~27 Go, répartis | ~21 Go, répartis | 227 000 tokens |
| H100 | 80 Go | ~27 Go | ~53 Go | non testée |
Un GPU doit accueillir les poids du modèle, le cache des couches d’attention (le cache KV, qui grossit avec chaque conversation), les états récurrents si le modèle est hybride, et les allocations du moteur d’inférence lui-même.
Le premier ordre de grandeur se calcule : nombre de paramètres × octets par paramètre. Nous servons le checkpoint FP8 de Qwen3.8-27B (licence Apache 2.0)[5] : un octet par paramètre, environ 27 Go pour les poids seuls. L’effet du FP8 sur la qualité, lui, s’évalue sur les tâches visées. Pour le reste, seul le chargement réel, avec les réglages retenus, dit quel budget il reste pour les requêtes.
| GPU | Mémoire et bande passante | Cache mesuré, tarif HT |
|---|---|---|
| L40S | 48 Go, ~0,86 To/s[6] | 310 000 tokens, 1,47 €/h[1] |
| 2 × L4 | 2 × 24 Go, 2 × ~0,3 To/s[7] | 227 000 tokens, ~1,58 €/h[1] |
| H100 | 80 Go, ~2 à 3,35 To/s[8][9] | non testée, ~2,87 €/h en PCIe[1][9] |
Sur les L4, les deux mémoires restent distinctes et les cartes échangent en PCIe[7][9] ; la bande passante d’une H100 dépend de sa variante (PCIe ou SXM)[9].
Un piège de lecture : ces 310 000 tokens sont une capacité totale, partagée par toutes les conversations en cours. Notre contexte maximal est de 131 072 tokens ; trois sessions qui le rempliraient demanderaient 393 216 tokens, plus que la L40S n’en offre. Des préfixes identiques peuvent réduire l’occupation ; sinon, trois contextes pleins ne tiennent pas en même temps, et le moteur doit différer ou préempter des requêtes, au prix d’une latence accrue[10]. Le nombre d’utilisateurs seul ne dimensionne donc rien : il faut la taille des contextes et la concurrence réelles.
À faible concurrence, la bande passante mémoire limite fortement la génération d’un modèle dense[11]. Le traitement par lots et le décodage spéculatif changent toutefois la donne : la bande passante seule ne prédit pas le débit.
vLLM est le moteur d’inférence open source qui charge le modèle sur le GPU et expose une API compatible OpenAI[12]. Configuration utilisée avec vLLM 0.33.0 et Qwen/Qwen3.8-27B-FP8 :
vllm_args = [
"--max-model-len", "131072", # contexte maximal par requête
"--max-num-seqs", "16", # 256 par défaut : le moteur ne démarrait pas
"--kv-cache-dtype", "fp8", # valeurs du cache KV sur 8 bits
"--language-model-only",
"--enable-auto-tool-choice", # appels d'outils, pour les agents
"--tool-call-parser", "qwen3_coder",
"--reasoning-parser", "qwen3",
"--enable-prefix-caching", # réutilise les débuts de conversation identiques
"--speculative-config", "{\"method\":\"mtp\",\"num_speculative_tokens\":3}",
]
# --disable-log-requests et --disable-log-outputs sont toujours ajoutés en dernier.
Trois réglages méritent qu’on s’y arrête.
Le décodage spéculatif : un rapport de 2,4 entre nos relevés. Sur la L40S, nous avons relevé 25,5 tokens par seconde sans, et environ 61 avec. Le modèle embarque des têtes de prédiction multi-tokens (MTP)[5] qui proposent, avec notre réglage, jusqu’à trois tokens d’avance, ensuite vérifiés par le modèle. Le gain dépend de la part des propositions acceptées[13]. Que le code sorte plus vite que la prose pourrait venir d’une meilleure acceptation ; nous n’avons pas mesuré ce taux pour le confirmer.
Le cache de préfixe, indispensable pour un agent. Dans notre configuration, opencode envoie environ 20 000 tokens d’instructions et de définitions d’outils : 20 à 30 secondes d’attente au premier tour. Le cache évite ensuite de recalculer la partie identique, tant qu’elle reste en mémoire[14]. Il ne supprime ni le traitement des nouveaux tokens, ni l’attente après une éviction ou un redémarrage[14][15].
--max-num-seqs : 256 par défaut[16], et un moteur qui ne démarrait pas. Au premier démarrage, vLLM redémarrait en boucle. Qwen3.8 est un modèle hybride[5] : une partie de ses couches maintient des états récurrents par séquence (le « cache Mamba », dans le vocabulaire de vLLM[17]). Réserver ces états pour 256 séquences simultanées dépassait la mémoire disponible. Limité à 16, le moteur démarre. Ce réglage ne garantit pas seize longues requêtes simultanées ; il a coûté une dizaine de minutes de GPU à comprendre.
Côté système, l’image GPU de Scaleway (ubuntu_noble_gpu_os_13_nvidia) fournit le pilote NVIDIA, Docker et le toolkit conteneur[18] : vLLM tourne dans son image officielle, sans rien compiler. Les poids et le cache de compilation vivent sur un volume séparé de 50 Go : un redémarrage ne retélécharge rien, et le modèle est prêt deux minutes et demie après l’allumage d’une L40S.
Lundi 9 novembre 2026 · heure de Paris
Une matinée de pénurie, minute par minute
- vers 8 h 50Allumage de la L40S refusé : out_of_stock. Le catalogue indique shortage pour les L40S, H100 et B300, dans toutes les zones. ✕ refusé
- 9 h 05Décision : passer sur deux GPU L4, à un tarif voisin, en changeant une variable. Premier démarrage accepté, modèle prêt en 4 min 54. ✓ accordé
- vers 10 h 07Test de la commande « éteindre » : la machine est rendue à Scaleway.
- vers 10 h 10Les indicateurs signalent une pénurie pour tous les types recherchés, L4 comprises. ✕ pénurie
- 10 h 12Rallumage accepté, alors que les L4 sont toujours indiquées en shortage. ✓ accordé
Notre économie repose sur l’extinction du GPU après dix minutes d’inactivité. Ce lundi-là, nous avons mesuré ce qu’elle implique : chez Scaleway, une instance éteinte rend sa machine physique[2]. Chaque rallumage doit en trouver une libre, comme une nouvelle réservation.
La seule façon de conserver sa machine est le mode standby, qui facture le calcul comme si elle était allumée[2] : environ 1 070 € par mois pour une L40S[1]. Autant ne jamais éteindre.
L’API de disponibilité donne un état instantané par type de machine (available, scarce, shortage)[3], sans historique, et un site de suivi tiers affichait une L40S « en stock » quelques minutes avant que l’API nous la refuse. Plus tard dans la matinée, en testant la commande « éteindre », nous avons rendu nos deux L4 ; à 10 h 12, notre rallumage a été accepté alors qu’elles étaient encore indiquées en shortage. Nous n’avons pas mesuré la durée des pénuries : le catalogue donne un signal, pas une réservation. Seule une tentative d’allumage tranche.
Ce que nous avons mis en place :
- une erreur explicite. La première version du veilleur répondait un 502 vide quand Scaleway refusait l’allumage. Il répond désormais
503 gpu_unavailable, avecRetry-After: 300: le client reçoit une erreur explicite et un délai conseillé avant de réessayer ; la reprise automatique dépend du client ; - un repli en une variable. Le nombre de GPU se lit dans le nom du type (
L4-2-24G: deux cartes) et fixe automatiquement le parallélisme du modèle (--tensor-parallel-size 2). Revenir à la L40S : une ligne, untofu apply, machine éteinte. C’est une adaptation manuelle, pas une bascule automatique ni une garantie de stock. Depuis le 10 novembre, le veilleur fait ce repli seul : si la L40S est refusée, il passe la machine éteinte sur deux L4 et retente, puis repart de la L40S à l’allumage suivant.
Relevés avec un utilisateur, à travers l’API publique :
| L40S | 2 × L4 | |
|---|---|---|
| Allumage jusqu’au modèle prêt | 2 min 29 | 4 min 54 (premier allumage) |
| Génération de code | ~61 tokens/s | ~44 tokens/s |
| Génération de texte | non mesuré | ~25 tokens/s |
| Lecture d’un prompt de 14 000 / 53 000 tokens | non mesuré | 13 s / 55 s |
| Cache de contexte | 310 000 tokens | 227 000 tokens |
Le parallélisme tensoriel répartit le modèle sur deux mémoires de 24 Go et impose des échanges entre les cartes, en PCIe sur les L4[7]. En génération de code, nous avons relevé environ 44 tokens par seconde, contre 61 sur L40S : 28 % de débit en moins. Nous n’avons isolé ni le coût des communications, ni comparé les deux configurations en prose. À l’usage, pour un agent de code, c’est surtout le premier tour d’une grosse session qui se fait attendre.
Tout est décrit en OpenTofu, avec un état partagé sur un bucket Object Storage versionné de Scaleway :
- une VM GPU sans port ouvert sur Internet, hormis SSH depuis nos adresses ; le moteur n’écoute que sur son IP privée ;
- un réseau privé qui la relie au veilleur, seul point d’entrée public, en HTTPS ;
- un volume de 50 Go pour les poids, protégé contre la destruction ;
- un enregistrement DNS chez Cloudflare, sans proxy : sinon, Cloudflare déchiffrerait le trafic[19][20] ;
- ni load balancer, ni base managée, ni passerelle publique : environ 24 € HT par mois de coût fixe.
L’intégration continue vérifie le format et la validité du code OpenTofu, les scripts shell et les tests du veilleur, qui tournent contre un faux Scaleway et un faux vLLM. Aucun identifiant cloud n’est fourni au workflow, le backend d’état est désactivé, et aucune commande de déploiement n’est exécutée.
Ce que nous changerions pour un client :
- un test de charge avant de choisir le GPU, avec les longueurs de contexte, la concurrence et la latence attendues. Le nombre d’utilisateurs seul ne départage pas une L40S d’une H100 ;
- une politique de disponibilité explicite : capacité réservée, avec engagement contractuel, si le redémarrage doit être garanti ; éventuellement un petit modèle toujours allumé pour un service dégradé, après validation de sa qualité. Notre pilote n’a pas de redondance ;
- des droits minimaux, en place dans notre pilote depuis le 9 novembre : la clé qui allume et éteint le GPU est limitée aux seules instances du projet, et la commande d’extinction est réservée aux administrateurs ;
- un accord de sous-traitance (DPA) avec l’hébergeur, et l’export de son journal d’audit ;
- un jeu d’évaluation maison, pour vérifier qu’un nouveau modèle fait mieux que l’ancien sur vos tâches à vous.
Ce pilote a permis de servir notre modèle à Paris en quelques jours. Il n’établit pas un engagement de disponibilité : éteindre réduit la facture, mais expose le prochain allumage au stock disponible. C’est une contrainte de conception, pas un incident ; elle se décide avant le premier client.
Sources
Scaleway — GPU Instances Tarifs
scaleway.com · non daté · consulté le · Page vivante. Catalogue de la page : L40S-1-48G proposée en fr-par-2 et pl-waw-2, à 1,46988 € HT de l’heure (0,024498 € la minute, environ 1 073 € pour 730 heures) ; L4-2-24G proposée en fr-par-1, fr-par-2 et pl-waw-2, à 1,575 € HT de l’heure. Prix en vigueur depuis le 1er juin 2026. H100-1-80G (H100 PCIe) en fr-par-2 et pl-waw-2 : 0,047775 € HT la minute, soit 2,8665 € HT de l’heure (catalogue public Scaleway, relu le 10 novembre 2026).
Scaleway Documentation — Instances FAQ
scaleway.com · non daté · consulté le · Page vivante, relue par Scaleway le 19 décembre 2025. Sections « How are Instances billed? » (Instances GPU facturées à la minute ; IP publiques et volumes facturés même instance éteinte) et « Which options are available to power off my Instance? » (l’extinction rend le nœud physique ; le mode standby est facturé comme une instance allumée).
Scaleway (GitHub) — scaleway-sdk-go : api/instance/v1/instance_sdk.go
github.com · publié le · consulté le · SDK Go officiel de l’API Instance, révision du 25 février 2026 : actions poweron et poweroff, disponibilité des types d’instances par zone (états available, scarce, shortage).
Scaleway — Mentions légales
scaleway.com · non daté · consulté le · Scaleway SAS, immatriculée au RCS de Paris, siège social à Paris.
Qwen, sur Hugging Face — Qwen/Qwen3.8-27B-FP8
huggingface.co · non daté · consulté le · Fiche du modèle : licence Apache 2.0, quantification FP8 par blocs de 128, architecture hybride (couches Gated DeltaNet à attention linéaire et couches d’attention), prédiction multi-tokens (MTP).
NVIDIA — L40S GPU for AI and Graphics Performance
nvidia.com · non daté · consulté le · Fiche technique : 48 Go de GDDR6, 864 Go/s, PCIe Gen4 x16, pas de NVLink.
NVIDIA — L4 Tensor Core GPU for AI & Graphics
nvidia.com · non daté · consulté le · Fiche technique : 24 Go, 300 Go/s, interconnexion PCIe Gen4 x16.
NVIDIA — H100 GPU
nvidia.com · non daté · consulté le · Fiche technique de la H100 SXM : 80 Go, 3,35 To/s. La variante PCIe de 80 Go n’y figure plus : voir [9].
Scaleway Documentation — Choosing the right GPU Instance type
scaleway.com · non daté · consulté le · Page vivante, relue par Scaleway le 28 octobre 2025. Tableau comparatif : H100 PCIe 80 Go HBM2E à 2 To/s, H100 SXM 80 Go HBM3 à 3,35 To/s, L4 en PCIe Gen4, L40S de 48 Go à 864 Go/s.
vLLM — Optimization and Tuning
docs.vllm.ai · non daté · consulté le · Documentation de la version 0.33.0, section « Preemption ».
vLLM — Speculative Decoding
docs.vllm.ai · non daté · consulté le · Documentation de la version 0.33.0 : le décodage spéculatif réduit la latence entre tokens à faible charge, quand la génération est limitée par la mémoire ; méthode MTP pour les modèles qui l’embarquent.
vLLM (GitHub) — vllm-project/vllm
github.com · non daté · consulté le · Dépôt du projet, licence Apache 2.0 : moteur d’inférence et de service de LLM, serveur d’API compatible OpenAI.
Yaniv Leviathan, Matan Kalman, Yossi Matias (arXiv) — Fast Inference from Transformers via Speculative Decoding
arxiv.org · publié le · consulté le · Article fondateur du décodage spéculatif. Section 3 : le nombre attendu de tokens produits par passe dépend du taux d’acceptation des propositions.
vLLM — Automatic Prefix Caching
docs.vllm.ai · non daté · consulté le · Documentation de la version 0.33.0 : réutilisation du cache KV d’un préfixe commun ; seule la lecture du prompt est accélérée, pas la génération.
vLLM, documents de conception — Automatic Prefix Caching
docs.vllm.ai · non daté · consulté le · Documentation de la version 0.33.0, section « Eviction (LRU) ».
vLLM (GitHub) — vllm/engine/arg_utils.py, version 0.33.0
github.com · publié le · consulté le · Code source, fonction get_batch_defaults : max_num_seqs vaut 256 par défaut pour le serveur d’API sur un GPU de moins de 70 Gio, comme la L40S ou la L4 ; 1 024 sur une H100.
vLLM — Engine Arguments
docs.vllm.ai · non daté · consulté le · Documentation de la version 0.33.0 : options --mamba-cache-dtype et suivantes, qui désignent le « Mamba cache » (états conv et ssm).
Scaleway Documentation — Scaleway Instance OS images and InstantApps
scaleway.com · non daté · consulté le · Page vivante, relue par Scaleway le 1er juillet 2025 : GPU OS 13, image Ubuntu 24.04 (Noble) livrée avec le pilote NVIDIA, Docker et le NVIDIA Container Toolkit.
Cloudflare SSL/TLS docs — Encryption modes
developers.cloudflare.com · non daté · consulté le · Page mise à jour le 16 avril 2026 : pour un nom proxifié, deux connexions distinctes, du visiteur à Cloudflare puis de Cloudflare au serveur d’origine.
Cloudflare Data Localization Suite docs — Regional Services
developers.cloudflare.com · non daté · consulté le · Page mise à jour le 23 juillet 2026 : le trafic est déchiffré dans les centres de Cloudflare ; l’option Regional Services limite ce déchiffrement à une région.

