Loading...
Cas d'usage·AI & Machine Learning

Des GPU dédiés pour entraîneret servir vos modèles.

De la Tesla T4 à 8 × A100 NVSwitch, facturés à l'heure dans nos régions GPU européennes. Tout le cycle — tokeniser, fine-tuner, servir, passer à l'échelle — documenté ci-dessous avec des hypothèses de dimensionnement explicites.

§ 01·La donnée · concept

Tokenisation : du texte aux entiers

Cas d'usage

Indexer 2 M documents juridiques pour du RAG. Avant de dimensionner la stack de serving, il faut connaître le budget tokens — taille du vocabulaire, moyenne de tokens par document, coût par million traité.

Comment fonctionne BPE

BPE apprend un vocabulaire V en fusionnant itérativement les paires adjacentes les plus fréquentes dans un corpus d'entraînement.

À l'inférence, un tokenizer greedy découpe l'entrée en les plus longs sous-mots de V et renvoie leurs IDs entiers. |V| est fixé à l'entraînement — 100 256 pour cl100k_base, 32 000 pour Mistral.

Points-clés
Context length
Borne les tokens par requête. Vérifiez la limite exacte de la révision modèle déployée.
KV-cache
Mémoire linéaire avec la longueur de sortie — le goulot du decode.
Coût du tokenizer
CPU-bound et déterministe — négligeable face au coût GPU.
text → tokens → ids
cl100k_base · 12 tokens · 43 chars
Le cloud européen, bâti pour la production.
Le
2356
cloud
9624
europé
95199
en
268
,
11
b
293
â
9011
ti
10462
pour
5019
la
1208
production
5788
.
13
§ 01·La donnée · référence

Mesures & code de référence

Tokenisation avec tiktoken
python
import tiktoken
enc = tiktoken.get_encoding("cl100k_base")
text = "Le cloud européen, bâti pour la production."
ids = enc.encode(text)
# [2356, 9624, 95199, 268, 11, 293,
# 9011, 10462, 5019, 1208, 5788, 13]
print(len(ids), "tokens") # 12 tokens
print(len(text), "characters") # 43 characters
print(f"{len(ids)/len(text):.2f} tok/char") # 0.28
Tokens par caractère · cl100k_base
n = 2 000 samples
English
en
0.19
échantillon
Français
fr
0.24
+26 %
Deutsch
de
0.25
composés
中文
zh
1.27
caractères
Python
py
0.26
symboles
§ 02·Boucle d'entraînement · concept

La boucle d'entraînement

Cas d'usage

Fine-tuner Mistral 7B sur 12 000 tickets de support annotés pour construire un classifieur d'intention à faible latence par requête. QLoRA garde les poids de base gelés en 4-bit et n'entraîne qu'un adaptateur low-rank — ~42 M params entraînables sur 7,2 Md.

Quatre phases d'un step
  1. Forward. Les ids d'entrée traversent le transformer pour produire des logits.
  2. Loss. Cross-entropy au niveau token, moyennée sur le batch. L = −(1/BT) Σ log pθ(yt | x)
  3. Backward. Autograd parcourt le graphe pour produire ∂L/∂θ.
  4. Optimizer. θ ← θ − η · m̂t / (√v̂t + ε) — AdamW.
Ce qu'on surveille
Train loss ↓ avec val loss ↓ en parallèle. Un écart qui se creuse = overfit.
Norme du gradient stable sous 5. Un pic = divergence.
MFU : 40–50 % sain, < 20 % = goulot I/O.
1Forward
batch → logits
2Loss
cross-entropy(logits, targets)
3Backward
∂L/∂θ · autograd
4Optimizer
AdamW · θ ← θ − η·∇
§ 02·Boucle d'entraînement · mesures

Run de dimensionnement · Mistral 7B · RTX 4090

Un step d'entraînement · PyTorch
python
for step, batch in enumerate(loader):
input_ids = batch["input_ids"].to(device) # [B, T]
labels = batch["labels"].to(device) # [B, T]
# 1. forward
logits = model(input_ids).logits # [B, T, |V|]
# 2. loss
loss = F.cross_entropy(
logits.view(-1, logits.size(-1)),
labels.view(-1),
ignore_index=-100,
)
# 3. backward
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
# 4. optimizer step
optimizer.step()
scheduler.step()
optimizer.zero_grad(set_to_none=True)
Courbe de loss · 200 steps
train 0.48 · val 0.53
3.52.51.50.5step200trainval
Hyperparamètres & résultat
model
Mistral-7B-v0.1
method
QLoRA · rank 16 · α=32
precision
nf4 (base) + bf16 (adapters)
optimizer
AdamW · β=(0.9, 0.95) · wd=0.1
learning rate
2 × 10⁻⁴ · cosine
batch / seq
8 × 512 tokens · grad accum 4
steps
750 optimizer steps · ~3.1 M tokens
hardware
GPU-PRO · RTX 4090 24 GB
throughput
~1 350 training tok/s · MFU ~38 %
total
38 min · ~0,95 €
§ 03·Passer à l'échelle · concept

Parallélisme multi-GPU

Cas d'usage

Pré-entraîner un encodeur multilingue de 2,7 Md de paramètres sur 40 Md de tokens. Sur 1 × A100 80 GB avec MFU soutenu conservateur : ~92 jours. Sur GPU-SUPERCOMPUTE (8 × A100 80 GB, NVSwitch) : ~14 jours. Le speedup est sous-linéaire parce que les gradients circulent entre GPU à chaque step.

Data-parallel en une phrase

Chaque GPU détient une copie complète des poids, calcule un gradient sur son shard de batch, puis un all-reduce moyenne les gradients entre N devices avant l'optimizer step.

tstep = max(tcompute, tar) + (1 − overlap) · min(…)
tar ≈ 2(N−1)/N · (params · bytes) / bw
parallel_efficiency = speedup / N
Leviers clés
NVSwitch A100 fournit ~600 Go/s par GPU, environ 9× PCIe 5.0 x16.
ZeRO-3 shard les états de l'optimizer — loge du 70 B dans 8 × 80 GB.
Overlap compute et all-reduce pour masquer ~60 % de la communication.
ring all-reduce · 8 × A100
NVSwitch · 600 GB/s
gpu·0A100gpu·1A100gpu·2A100gpu·3A100gpu·4A100gpu·5A100gpu·6A100gpu·7A100

Chaque GPU envoie son shard au suivant ; après N−1 tours, tous ont la somme complète.

§ 03·Passer à l'échelle · mesures

Comparatif interconnect · speedups de dimensionnement

Interconnect · ring all-reduce sur 2,7 Md params (fp16) · N = 8
PCIe 5.0 x16
64 GB/s
148 ms
35 %
46 %
NVLink 3 (A100)
600 GB/s
15.8 ms
72 %
76 %
NVSwitch (A100)
600 GB/s
15.8 ms
76 %
78 %
InfiniBand HDR
200 Gb/s
378 ms
30 %
38 %
Speedups de dimensionnement · A100 80G · encodeur 2,7 Md
model estimate
1 × A100ideal 1.00×·PCIe 1.00×·NVSwitch 1.00×
2 × A100ideal 2.00×·PCIe 1.68×·NVSwitch 1.90×
4 × A100ideal 4.00×·PCIe 2.62×·NVSwitch 3.45×
8 × A100ideal 8.00×·PCIe 3.68×·NVSwitch 6.24×
§ 04·Serving · concept

Inférence : anatomie d'une requête

Cas d'usage

Assistant interne visant < 100 ms de time-to-first-token, puis un streaming à > 60 tok/s. Mistral 7B-Instruct sur GPU-ENTERPRISE (A100 40 GB) avec vLLM, poids fp16, KV-cache fp8 et continuous batching.

Décomposition du TTFT
TTFT = troute + tqueue + tprefill + tdec₀
tprefill ≈ (2PT + 4LT²d) / FLOPS
tdec ≈ weight_read(P) + KV_read(L,T,d)

Le prefill est surtout compute-bound, avec un terme attention qui augmente avec la longueur du prompt. Le decode est généralement borné par la bande passante mémoire, car poids et KV-cache sont relus à chaque token.

Leviers d'ingénierie
Paged attention · KV-cache en blocs de 16 tokens — requêtes concurrentes × 2.
Continuous batching · accepte les requêtes à chaque decode step.
Speculative decoding · +80 % de débit, sorties identiques.
Chronologie · POST /v1/chat/completions
TTFT p50 · 95 ms
+ 0 ms
routing + auth
4 ms
+ 4 ms
tokenize + queue
12 ms
+ 16 ms
prefill (1024 tok)
65 ms
+ 81 ms
first decode
14 ms
§ 04·Serving · mesures

Prefill vs decode · config vLLM

Prefill vs decode · par requête Mistral 7B
A100 40 GB · fp16 + fp8 KV
prefillcompute-bound
FLOPs
O(B · T · P) + O(B · L · T² · d)
memory
O(B · L · T · d)
throughput
1024 tok / 65 ms = 15.8 k tok/s
Sature les FLOPs — passe à l’échelle avec le parallélisme
decodememory-bound
FLOPs
O(B · P)
memory
O(P) + O(B · L · T · d)
throughput
1 tok / 14 ms = 71 tok/s
Sature la bande passante mémoire — le speculative decoding aide
Config de serving · vLLM 0.5.3
yaml
# vmcloud-inference.yaml
model: mistralai/Mistral-7B-Instruct-v0.3
tensor_parallel_size: 1
dtype: float16
kv_cache_dtype: fp8_e4m3
# scheduling
max_num_seqs: 16
max_num_batched_tokens: 8192
enable_chunked_prefill: true
# memory
gpu_memory_utilization: 0.90
swap_space: 4 # GiB CPU offload
# quality
disable_log_stats: false
guided_decoding_backend: outlines
§ 05·Le coût · concept

Économie du token

Cas d'usage

Vous produisez environ 100 M tokens sortie / mois sur un modèle interne sensible à la latence. La question n'est pas de savoir si l'auto-hébergement est toujours moins cher — il ne l'est pas — mais si l'utilisation, la résidence des données et le contrôle des poids justifient un GPU dédié.

Formule de coût
cost / 1Mout = (price/h / 3600) / (tps × util) × 10⁶

Calcul horaire : GPU-PRO à 1,50 €/h, 64 tok/s, 65 % d'utilisation donne 10,02 € / 1M. Calcul dédié mensuel : 830,64 € / 108 M tokens de capacité = 7,70 € / 1M.

Ce qui pèse sur la facture
L'utilisation · 30 % de charge = 2× par token vs 60 %.
Mix API · comparez entrée et sortie séparément ; la sortie domine souvent le coût génératif.
Contrôle · l'auto-hébergement achète résidence UE, poids exportables et capacité déterministe.
GPU VMCloud · serving Mistral 7B · util 65 %
facturation horaire
SKUGPU€/htok/s€/1M out
GPU-STARTERTesla T40.852216.51
GPU-PRORTX 40901.506410.02
GPU-ENTERPRISEA100 40GB4.209618.70
GPU-TITANA100 80GB5.4012418.61
APIs managées · tarifs publics
$ / 1M output · Apr 2026
OpenAI · gpt-5.4-mini$ 2.25
OpenAI · gpt-5.4$ 7.50
Anthropic · Claude Haiku 4.5$ 5.00
Anthropic · Claude Sonnet 4.6$ 15.00
Mistral · Small 4$ 0.60

Tarifs publics fournisseurs en USD, hors taxes, remises engagement, remises batch et change.

GPU-PRO dédié (mensuel) vs APIs managées
sortie seule · hors change/taxes
volumeGPU-PROgpt-5.4-minigpt-5.4Sonnet 4.6lecture
10 M tok/mois€831$23$75$150API
50 M tok/mois€831$113$375$750API
100 M tok/mois€831$225$750$1 500API
300 M tok/mois€831 × 3$675$2 250$4 500API
1 GPU · util 65 %€7.70 / 1M$2.25 / 1M$7.50 / 1M$15.00 / 1Mproche gpt-5.4
1 GPU · util 85 %€5.89 / 1M$2.25 / 1M$7.50 / 1M$15.00 / 1MGPU vs premium

Conclusion : un GPU-PRO dédié ne bat pas les APIs de petits modèles les moins chères au pur prix/token. Il devient rationnel face aux APIs premium quand le GPU reste occupé, et stratégiquement rationnel quand la résidence UE, la capacité fixe, les poids custom ou l'absence d'entraînement côté fournisseur comptent.

§ 06·Questions

Questions techniques fréquentes

Écrit par les ingénieurs qui opèrent les clusters. Révisé chaque trimestre.

Quand choisir fine-tuning vs prompt engineering ?

Prompt engineering en premier — toujours. Le fine-tuning devient intéressant pour un format de sortie strict, un domaine très spécifique (médical, juridique), ou une latence faible avec un petit modèle. Sous 10 k exemples, QLoRA sur un 7B suffit presque toujours.

FP8 ou FP16 pour l'inférence ?

Utilisez les poids FP16/BF16 comme baseline de production. Le FP8 est très utile pour le KV-cache et peut l'être pour les poids sur les stacks compatibles, mais validez la qualité sur votre propre jeu d'évaluation avant production.

Pourquoi TTFT stagne quand la charge monte ?

Le batch dynamique regroupe les prompts : si votre requête arrive juste après un batch qui vient de partir, elle attend. On limite la queue à 20 ms (configurable). Pour des TTFT stables garantis, utilisez des replicas dédiés.

Les poids vous sont-ils accessibles ?

Oui. Les fine-tunes peuvent être écrits sur votre volume VM ou votre bucket S3-compatible, puis exportés avec les outils standard. Gardez un snapshot après chaque epoch pour rollback et reproductibilité.

Vous entraînez-vous sur mes données ?

Non. VMCloud fournit l'infrastructure et n'utilise pas les datasets ou prompts clients pour entraîner ses propres modèles. L'accès humain est limité aux cas support, sécurité ou légaux prévus par les conditions et le DPA publiés.

Prêt à entraîner ?

Huit configurations GPU de la Tesla T4 à 0,85 €/h jusqu'aux 8× A100 80GB avec NVSwitch + InfiniBand. Tarification transparente, poids exportables, données hébergées en Europe.