📚 Cheatsheet Phase 2

Modèles Open Source & Inférence Locale

Formation IA Générative Open Source 2026

1. Panorama des Modèles Open Source 2026

Modèle Taille Licence Points Forts Contexte
Llama 4.1 8B, 70B, 405B Llama Community Performance générale, multimodal 128K tokens
DeepSeek V3 7B, 16B, 236B MIT Code, maths, raisonnement 64K tokens
Mistral 3 7B, 123B Apache 2.0 Efficacité, fine-tuning 32K tokens
Qwen 3 0.5B, 7B, 72B Apache 2.0 Multilingue, vision, audio 128K tokens
Gemma 3 2B, 9B, 27B Gemma Terms Edge devices, efficacité 8K tokens
Phi-4 14B MIT Raisonnement, STEM 16K tokens

2. Licences Open Source - Comparatif

Licence Usage Commercial Modification Distribution Restrictions
Apache 2.0 ✓ Libre ✓ Permise ✓ Libre Attribution requise, brevets
MIT ✓ Libre ✓ Permise ✓ Libre Attribution requise uniquement
Llama Community ⚠️ Conditionnel ✓ Permise ⚠️ Limitée Limite 700M utilisateurs MAU
RAIL (Responsible AI) ⚠️ Restreint ✓ Permise ⚠️ Conditions Interdiction usages nuisibles

Points Clés

  • Apache 2.0 / MIT : Plus permissives, idéales pour production
  • Llama Community : Attention seuil 700M utilisateurs actifs mensuels
  • RAIL : Clause éthique, vérifier use cases autorisés
  • Toujours lire les termes complets avant déploiement commercial

3. Hugging Face Hub - Téléchargement de Modèles

Installation

pip install huggingface_hub

Recherche de Modèles

from huggingface_hub import HfApi, list_models

# Lister les modèles
api = HfApi()
models = list_models(
    filter="text-generation",
    sort="downloads",
    direction=-1,
    limit=10
)

for model in models:
    print(f"{model.id} - {model.downloads} téléchargements")

Téléchargement Complet

from huggingface_hub import snapshot_download

# Télécharger un modèle complet
model_path = snapshot_download(
    repo_id="mistralai/Mistral-7B-Instruct-v0.3",
    cache_dir="./models",
    local_dir="./models/mistral-7b",
    local_dir_use_symlinks=False
)

Téléchargement Fichier Spécifique

from huggingface_hub import hf_hub_download

# Télécharger un fichier spécifique (ex: GGUF)
file_path = hf_hub_download(
    repo_id="TheBloke/Mistral-7B-Instruct-v0.3-GGUF",
    filename="mistral-7b-instruct-v0.3.Q4_K_M.gguf",
    cache_dir="./models"
)

Authentification

# Via CLI
huggingface-cli login

# Via code
from huggingface_hub import login
login(token="hf_xxxxxxxxxxxxx")

# Variables d'environnement
export HF_TOKEN="hf_xxxxxxxxxxxxx"

Model Card

README.md contient specs, benchmarks, exemples d'usage

Files & Versions

Branches pour versions, tags pour releases stables

Community

Discussions pour support, issues, fine-tunes partagés

4. Transformers Pipeline - API Simplifiée

Installation

pip install transformers torch accelerate

Text Generation

from transformers import pipeline

generator = pipeline(
    "text-generation",
    model="mistralai/Mistral-7B-Instruct-v0.3",
    device_map="auto"
)

result = generator(
    "Explique l'IA en 3 phrases:",
    max_new_tokens=100,
    temperature=0.7,
    do_sample=True
)
print(result[0]['generated_text'])

Sentiment Analysis

sentiment = pipeline(
    "sentiment-analysis",
    model="nlptown/bert-base-multilingual-uncased-sentiment"
)

result = sentiment("Ce produit est excellent !")
# [{'label': '5 stars', 'score': 0.89}]

Named Entity Recognition (NER)

ner = pipeline(
    "ner",
    model="Jean-Baptiste/camembert-ner",
    aggregation_strategy="simple"
)

text = "Emmanuel Macron visite Paris demain."
entities = ner(text)
# [{'entity_group': 'PER', 'word': 'Emmanuel Macron', ...}]

Translation

translator = pipeline(
    "translation",
    model="Helsinki-NLP/opus-mt-fr-en"
)

result = translator("Bonjour le monde")
# [{'translation_text': 'Hello world'}]

Summarization

summarizer = pipeline(
    "summarization",
    model="facebook/bart-large-cnn"
)

long_text = "..."
summary = summarizer(
    long_text,
    max_length=130,
    min_length=30,
    do_sample=False
)

Question Answering

qa = pipeline(
    "question-answering",
    model="deepset/roberta-base-squad2"
)

result = qa(
    question="Qui a inventé Python ?",
    context="Python a été créé par Guido van Rossum en 1991."
)
# {'answer': 'Guido van Rossum', 'score': 0.97}

5. AutoModel & Tokenizer - Contrôle Avancé

Chargement Modèle et Tokenizer

from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    GenerationConfig
)
import torch

model_name = "mistralai/Mistral-7B-Instruct-v0.3"

tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.bfloat16,
    device_map="auto",
    trust_remote_code=True
)

Génération de Texte

prompt = "Explique la théorie de la relativité:"

inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

outputs = model.generate(
    **inputs,
    max_new_tokens=200,
    temperature=0.7,
    top_p=0.9,
    top_k=50,
    repetition_penalty=1.1,
    do_sample=True,
    pad_token_id=tokenizer.eos_token_id
)

response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(response)

Configuration de Génération

generation_config = GenerationConfig(
    max_new_tokens=500,
    temperature=0.8,
    top_p=0.95,
    top_k=50,
    repetition_penalty=1.15,
    do_sample=True,
    num_beams=1,
    early_stopping=False
)

# Utilisation
outputs = model.generate(
    **inputs,
    generation_config=generation_config
)

Batch Processing

prompts = [
    "Question 1: ...",
    "Question 2: ...",
    "Question 3: ..."
]

# Padding pour batch
tokenizer.pad_token = tokenizer.eos_token
inputs = tokenizer(
    prompts,
    return_tensors="pt",
    padding=True,
    truncation=True,
    max_length=512
).to(model.device)

outputs = model.generate(**inputs, max_new_tokens=100)
responses = tokenizer.batch_decode(outputs, skip_special_tokens=True)

Optimisation Mémoire

# 8-bit quantization
from transformers import BitsAndBytesConfig

bnb_config = BitsAndBytesConfig(
    load_in_8bit=True,
    llm_int8_threshold=6.0
)

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=bnb_config,
    device_map="auto"
)

# 4-bit quantization (encore plus compact)
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.bfloat16,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_use_double_quant=True
)

6. Datasets Library - Manipulation de Données

Installation

pip install datasets

Chargement Dataset

from datasets import load_dataset

# Dataset public
dataset = load_dataset("squad")
print(dataset)
# DatasetDict({
#     train: Dataset({features: ['id', 'title', 'context', 'question', 'answers']})
#     validation: Dataset(...)
# })

# Sous-ensemble de données
dataset = load_dataset("squad", split="train[:1000]")

# Streaming pour gros datasets
dataset = load_dataset("squad", streaming=True)

Manipulation de Données

# Map - Appliquer une fonction
def preprocess(example):
    example['text_length'] = len(example['text'])
    return example

dataset = dataset.map(preprocess)

# Filter - Filtrer les exemples
dataset = dataset.filter(lambda x: x['text_length'] > 100)

# Select - Sélectionner colonnes
dataset = dataset.select_columns(['text', 'label'])

# Shuffle - Mélanger
dataset = dataset.shuffle(seed=42)

Train/Test Split

from datasets import DatasetDict

# Split simple
split_dataset = dataset.train_test_split(test_size=0.2, seed=42)
train_data = split_dataset['train']
test_data = split_dataset['test']

# Split train/val/test
train_test = dataset.train_test_split(test_size=0.3, seed=42)
test_val = train_test['test'].train_test_split(test_size=0.5, seed=42)

final_dataset = DatasetDict({
    'train': train_test['train'],
    'validation': test_val['train'],
    'test': test_val['test']
})

Sauvegarde et Chargement

# Sauvegarder
dataset.save_to_disk("./my_dataset")

# Charger
from datasets import load_from_disk
dataset = load_from_disk("./my_dataset")

# Export CSV/JSON
dataset.to_csv("output.csv")
dataset.to_json("output.json")

Dataset Custom

from datasets import Dataset

data = {
    'text': ['exemple 1', 'exemple 2', 'exemple 3'],
    'label': [0, 1, 0]
}

dataset = Dataset.from_dict(data)

# Depuis Pandas
import pandas as pd
df = pd.read_csv("data.csv")
dataset = Dataset.from_pandas(df)

Tokenization Batch

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

def tokenize_function(examples):
    return tokenizer(
        examples["text"],
        padding="max_length",
        truncation=True,
        max_length=512
    )

tokenized_dataset = dataset.map(
    tokenize_function,
    batched=True,
    batch_size=1000
)

7. Ollama - Commands & API

Installation

# Linux / macOS
curl -fsSL https://ollama.com/install.sh | sh

# Windows
# Télécharger depuis https://ollama.com/download

# Vérifier
ollama --version

Commandes Essentielles

# Télécharger un modèle
ollama pull llama3.1:8b

# Lister les modèles installés
ollama list

# Lancer une conversation
ollama run llama3.1:8b

# Supprimer un modèle
ollama rm llama3.1:8b

# Afficher informations modèle
ollama show llama3.1:8b

# Copier un modèle
ollama cp llama3.1:8b my-llama

API REST

# Lancer le serveur (automatique avec run)
ollama serve

# Generate endpoint
curl http://localhost:11434/api/generate -d '{
  "model": "llama3.1:8b",
  "prompt": "Pourquoi le ciel est bleu ?",
  "stream": false
}'

# Chat endpoint
curl http://localhost:11434/api/chat -d '{
  "model": "llama3.1:8b",
  "messages": [
    {"role": "user", "content": "Bonjour !"}
  ]
}'

Python Client

import requests
import json

def ollama_generate(prompt, model="llama3.1:8b"):
    url = "http://localhost:11434/api/generate"
    data = {
        "model": model,
        "prompt": prompt,
        "stream": False,
        "options": {
            "temperature": 0.7,
            "top_p": 0.9
        }
    }

    response = requests.post(url, json=data)
    return response.json()["response"]

result = ollama_generate("Explique Python en 2 phrases")

Modelfile - Créer un Modèle Custom

# Créer fichier 'Modelfile'
FROM llama3.1:8b

PARAMETER temperature 0.8
PARAMETER top_p 0.9
PARAMETER top_k 40
PARAMETER num_ctx 4096

SYSTEM """
Tu es un assistant spécialisé en Python.
Réponds toujours avec des exemples de code.
"""

# Créer le modèle
ollama create python-expert -f Modelfile

# Utiliser
ollama run python-expert

Modèles Populaires

llama3.1:8b

Généraliste, 4.7GB

mistral:7b

Efficace, 4.1GB

deepseek-coder:6.7b

Code, 3.8GB

phi3:mini

Compact, 2.3GB

8. LM Studio - Interface Graphique

Présentation

LM Studio est une application desktop pour exécuter des LLMs localement avec une interface graphique intuitive.

Site: https://lmstudio.ai

Formats supportés: GGUF, GGML

Télécharger des Modèles

  1. Ouvrir LM Studio
  2. Cliquer sur l'onglet Search
  3. Rechercher un modèle (ex: "Mistral 7B")
  4. Choisir une quantization (Q4_K_M recommandé)
  5. Cliquer sur Download

Mode Chat

Server Mode - API OpenAI Compatible

# Dans LM Studio: Developer > Local Server > Start Server
# Par défaut: http://localhost:1234

# Test avec curl
curl http://localhost:1234/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "local-model",
    "messages": [
      {"role": "user", "content": "Bonjour !"}
    ],
    "temperature": 0.7
  }'

Python avec OpenAI SDK

from openai import OpenAI

# Pointer vers LM Studio
client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio")

response = client.chat.completions.create(
    model="local-model",
    messages=[
        {"role": "system", "content": "Tu es un assistant utile."},
        {"role": "user", "content": "Explique le machine learning"}
    ],
    temperature=0.7,
)

print(response.choices[0].message.content)

Configuration Avancée

Paramètre Description Recommandation
GPU Offload Layers sur GPU Max possible pour votre VRAM
Context Length Taille fenêtre contexte 2048-4096 pour début
Batch Size Tokens par batch 512 (ajuster selon RAM)
Thread Count CPU threads 4-8 threads

Quantizations GGUF

Q2_K

Très compacte, qualité réduite

Q4_K_M

⭐ Recommandé - Bon équilibre

Q5_K_M

Meilleure qualité, +VRAM

Q8_0

Quasi full precision

9. llama.cpp - Inference Native

Installation

# Clone repository
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp

# Build (Linux/Mac)
make

# Build avec CUDA (NVIDIA GPU)
make LLAMA_CUBLAS=1

# Build avec Metal (Apple Silicon)
make LLAMA_METAL=1

# Build Windows (MinGW)
mingw32-make.exe

Conversion de Modèles

# Convertir modèle Hugging Face en GGUF
python convert.py /path/to/model --outfile model.gguf

# Quantizer le modèle
./quantize model.gguf model-q4_k_m.gguf q4_k_m

Niveaux de Quantization GGUF

Format Bits/Weight Taille (7B) Qualité Usage
F16 16 bits ~14 GB Excellente Référence, fine-tuning
Q8_0 8 bits ~7.5 GB Très bonne Production haute qualité
Q6_K 6 bits ~5.5 GB Bonne Équilibre qualité/taille
Q5_K_M 5 bits ~4.8 GB Bonne Recommandé général
Q4_K_M 4 bits ~4.1 GB Correcte ⭐ Meilleur compromis
Q3_K_M 3 bits ~3.3 GB Acceptable RAM limitée
Q2_K 2 bits ~2.7 GB Faible Edge devices

Inference Simple

# Lancer inference
./main -m models/mistral-7b-q4_k_m.gguf \
       -p "Explique la photosynthèse:" \
       -n 256 \
       -t 8 \
       --temp 0.7 \
       --top-p 0.9

Paramètres Importants

./main -m model.gguf \
  -p "prompt"              # Prompt d'entrée
  -n 512                   # Nombre max tokens générés
  -t 8                     # Threads CPU
  -c 2048                  # Context size
  --temp 0.7               # Temperature
  --top-p 0.9              # Nucleus sampling
  --top-k 40               # Top-k sampling
  --repeat-penalty 1.1     # Pénalité répétition
  -ngl 32                  # GPU layers (avec CUDA)
  -b 512                   # Batch size
  --mlock                  # Lock en RAM
  -f prompt.txt            # Charger prompt depuis fichier

Mode Serveur

# Lancer serveur HTTP
./server -m models/mistral-7b-q4_k_m.gguf \
         -c 2048 \
         -ngl 32 \
         --port 8080

# Requête depuis client
curl http://localhost:8080/completion \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Bonjour",
    "n_predict": 128
  }'

10. vLLM - Serveur Haute Performance

Présentation

vLLM est un serveur d'inférence optimisé avec PagedAttention pour throughput maximal.

Avantages: 24x plus rapide que HF Transformers, batching continu, streaming

Installation

pip install vllm

# Avec CUDA 11.8
pip install vllm --extra-index-url https://download.pytorch.org/whl/cu118

# Avec CUDA 12.1
pip install vllm --extra-index-url https://download.pytorch.org/whl/cu121

Lancer Serveur

# Lancer serveur API OpenAI-compatible
python -m vllm.entrypoints.openai.api_server \
    --model mistralai/Mistral-7B-Instruct-v0.3 \
    --host 0.0.0.0 \
    --port 8000 \
    --dtype bfloat16 \
    --max-model-len 4096 \
    --tensor-parallel-size 1

Python API

from vllm import LLM, SamplingParams

# Charger modèle
llm = LLM(
    model="mistralai/Mistral-7B-Instruct-v0.3",
    dtype="bfloat16",
    max_model_len=4096,
    gpu_memory_utilization=0.9
)

# Configuration sampling
sampling_params = SamplingParams(
    temperature=0.7,
    top_p=0.9,
    top_k=50,
    max_tokens=256
)

# Génération
prompts = [
    "Explique Python:",
    "Qu'est-ce que vLLM ?"
]

outputs = llm.generate(prompts, sampling_params)

for output in outputs:
    print(output.outputs[0].text)

Client OpenAI

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="EMPTY"
)

response = client.chat.completions.create(
    model="mistralai/Mistral-7B-Instruct-v0.3",
    messages=[
        {"role": "user", "content": "Bonjour !"}
    ],
    temperature=0.7,
    max_tokens=200
)

print(response.choices[0].message.content)

PagedAttention - Concept Clé

PagedAttention divise la mémoire KV cache en blocs, permettant:

  • Partage de mémoire entre séquences (prefix caching)
  • Allocation dynamique sans fragmentation
  • Augmentation throughput de 2-24x
  • Support batch size variable

Benchmarking

# Benchmark throughput
python benchmarks/benchmark_throughput.py \
    --model mistralai/Mistral-7B-Instruct-v0.3 \
    --num-prompts 1000 \
    --input-len 128 \
    --output-len 256

# Benchmark latency
python benchmarks/benchmark_latency.py \
    --model mistralai/Mistral-7B-Instruct-v0.3 \
    --input-len 128 \
    --output-len 256

Paramètres Avancés

Paramètre Description Défaut
--tensor-parallel-size Nombre de GPUs 1
--gpu-memory-utilization % VRAM utilisé 0.9
--max-num-seqs Batch size max 256
--enable-prefix-caching Cache prompts communs False

11. Paramètres de Génération - Guide Complet

Temperature

temperature ∈ [0.0, 2.0]
Valeur Effet Usage
0.0 - 0.3 Déterministe, répétitif Code, analyse, classification
0.4 - 0.7 ⭐ Équilibré Assistant, Q&A, usage général
0.8 - 1.2 Créatif, varié Brainstorming, écriture créative
1.3 - 2.0 Très créatif, chaotique Expérimentation, fiction

Top-p (Nucleus Sampling)

top_p ∈ [0.0, 1.0]

Sélectionne les tokens dont la probabilité cumulée atteint top_p

  • 0.9 : Recommandé général (90% meilleurs tokens)
  • 0.95 : Plus de diversité
  • 1.0 : Tous les tokens (désactivé)
  • 0.7-0.8 : Plus conservateur

Top-k

top_k ∈ [1, vocab_size]

Limite aux k tokens les plus probables

Repetition Penalty

repetition_penalty ∈ [1.0, 2.0]
Valeur Effet
1.0 Aucune pénalité
1.1 ⭐ Légère pénalité (recommandé)
1.2-1.3 Pénalité modérée
1.5+ Forte pénalité (peut casser cohérence)

Stop Tokens

# Arrêter génération sur patterns spécifiques
stop_tokens = [
    "\n\n",           # Double newline
    "###",            # Marqueur section
    "User:",          # Début nouveau tour
    "",           # EOS token
    "[END]"           # Marqueur custom
]

outputs = model.generate(
    **inputs,
    max_new_tokens=500,
    eos_token_id=tokenizer.eos_token_id,
    pad_token_id=tokenizer.pad_token_id,
    stop_strings=stop_tokens
)

Exemple Configurations

Code Generation

temp=0.2, top_p=0.95, top_k=50

Q&A Assistant

temp=0.7, top_p=0.9, rep_pen=1.1

Creative Writing

temp=1.0, top_p=0.95, rep_pen=1.2

Classification

temp=0.1, top_p=1.0, max_tokens=5

12. Guide de Quantization

Comparatif Formats

Format Bits VRAM 7B VRAM 13B Qualité Framework
FP32 32 28 GB 52 GB 100% PyTorch
FP16 16 14 GB 26 GB 99% PyTorch, HF
BF16 16 14 GB 26 GB 99% PyTorch
INT8 8 7 GB 13 GB 95% bitsandbytes
INT4 4 3.5 GB 6.5 GB 85-90% bitsandbytes
GPTQ 2-8 2-7 GB 4-13 GB 80-95% AutoGPTQ
AWQ 4 3.5 GB 6.5 GB 90% AutoAWQ
GGUF Q4_K_M ~4 4.1 GB 7.3 GB 85% llama.cpp

bitsandbytes - INT8 & INT4

from transformers import AutoModelForCausalLM, BitsAndBytesConfig

# Configuration 8-bit
bnb_config_8bit = BitsAndBytesConfig(
    load_in_8bit=True,
    llm_int8_threshold=6.0,
    llm_int8_has_fp16_weight=False
)

# Configuration 4-bit (NF4)
bnb_config_4bit = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.bfloat16,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_use_double_quant=True
)

model = AutoModelForCausalLM.from_pretrained(
    "mistralai/Mistral-7B-Instruct-v0.3",
    quantization_config=bnb_config_4bit,
    device_map="auto"
)

GPTQ - Quantization Aggressive

from transformers import AutoModelForCausalLM

# Charger modèle GPTQ pré-quantizé
model = AutoModelForCausalLM.from_pretrained(
    "TheBloke/Mistral-7B-Instruct-v0.3-GPTQ",
    device_map="auto",
    trust_remote_code=False,
    revision="gptq-4bit-32g-actorder_True"
)

AWQ - Activation-aware Quantization

from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer

# Charger modèle AWQ
model = AutoAWQForCausalLM.from_quantized(
    "TheBloke/Mistral-7B-Instruct-v0.3-AWQ",
    fuse_layers=True,
    trust_remote_code=False,
    safetensors=True
)

tokenizer = AutoTokenizer.from_pretrained(
    "TheBloke/Mistral-7B-Instruct-v0.3-AWQ"
)

Recommandations par GPU

VRAM Modèle 7B Modèle 13B Modèle 70B
6 GB GGUF Q4_K_M GGUF Q2_K
8 GB INT4, AWQ, Q5_K_M GGUF Q4_K_M
12 GB INT8, FP16 INT4, AWQ GGUF Q2_K
24 GB FP16 INT8, FP16 GGUF Q4_K_M
48 GB+ FP32 FP16 INT4, AWQ

13. Calculateur VRAM

Formule de Base

VRAM (GB) = (Params × Bytes_per_param) + Overhead
Bytes_per_param = Precision / 8

Exemples de Calcul

Llama 7B en FP16:

7B params × 2 bytes (FP16) = 14 GB

+ 2 GB overhead (KV cache, activations) = 16 GB VRAM

Llama 7B en INT4:

7B params × 0.5 bytes (4-bit) = 3.5 GB

+ 1 GB overhead = 4.5 GB VRAM

Table de Référence VRAM

Modèle FP32 FP16 INT8 INT4 GGUF Q4
3B 12 GB 6 GB 3 GB 2 GB 2.3 GB
7B 28 GB 14 GB 7 GB 4 GB 4.1 GB
13B 52 GB 26 GB 13 GB 7 GB 7.3 GB
30B 120 GB 60 GB 30 GB 16 GB 17 GB
70B 280 GB 140 GB 70 GB 36 GB 39 GB

Facteurs d'Overhead

KV Cache Calculation

KV_Cache (GB) = 2 × Layers × Hidden_dim × Context_len × Batch_size × Bytes / 10^9
# Exemple: Llama 7B, context 2048, batch 1, FP16
# 32 layers × 4096 hidden × 2048 context × 1 batch × 2 bytes
# = 536,870,912 bytes ≈ 0.5 GB

Optimisations Mémoire

Gradient Checkpointing

Réduit mémoire activations de 50-70%

Flash Attention

Réduit mémoire attention de 10-20x

CPU Offloading

Swap layers en RAM (plus lent)

Quantization

Réduit taille modèle 2-8x

14. Modèles Spécialisés en Code

Top Modèles 2026

Modèle Taille HumanEval MBPP Langages
DeepSeek-Coder V2 1.3B, 6.7B, 16B 79.3% 75.2% 80+ languages
StarCoder 2 3B, 7B, 15B 72.6% 68.4% 600+ languages
CodeLlama 7B, 13B, 34B 67.8% 63.1% Python, C++, Java, etc.
WizardCoder 7B, 13B, 34B 73.2% 70.5% Multi-language
Qwen-Coder 1.5B, 7B 70.1% 66.8% 92 languages

DeepSeek-Coder - Exemple

from transformers import AutoTokenizer, AutoModelForCausalLM

model_name = "deepseek-ai/deepseek-coder-6.7b-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.bfloat16,
    device_map="auto"
)

prompt = """### Instruction:
Write a Python function to calculate fibonacci numbers.

### Response:
"""

inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=256)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

StarCoder 2 - Code Completion

from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained(
    "bigcode/starcoder2-7b",
    device_map="auto",
    torch_dtype=torch.bfloat16
)
tokenizer = AutoTokenizer.from_pretrained("bigcode/starcoder2-7b")

# Fill-in-the-middle
code = """def calculate_area(radius):
    
    return area
"""

inputs = tokenizer.encode(code, return_tensors="pt").to(model.device)
outputs = model.generate(inputs, max_new_tokens=50)
print(tokenizer.decode(outputs[0]))

Benchmarks Explication

HumanEval

164 problèmes Python avec tests unitaires. Mesure capacité à générer code correct.

MBPP (Mostly Basic Python Problems)

974 problèmes Python niveau débutant/intermédiaire. Tests fonctionnels.

MultiPL-E

HumanEval traduit en 18+ langages (Java, C++, JavaScript, etc.)

Use Cases Spécialisés

Code Completion

StarCoder 2 (FIM mode)

Code Explanation

DeepSeek-Coder Instruct

Bug Fixing

WizardCoder

Code Translation

CodeLlama 34B

15. Chat Templates - Formats de Conversation

ChatML Format (OpenAI, Mistral)

<|im_start|>system
Tu es un assistant utile et précis.<|im_end|>
<|im_start|>user
Quelle est la capitale de France ?<|im_end|>
<|im_start|>assistant
La capitale de la France est Paris.<|im_end|>

Llama Format

[INST] <>
Tu es un assistant utile et précis.
<>

Quelle est la capitale de France ? [/INST]
La capitale de la France est Paris.
[INST] Quelle est sa population ? [/INST]

Mistral Format

[INST] Tu es un assistant utile.

Quelle est la capitale de France ? [/INST]
La capitale de la France est Paris.
[INST] Et sa population ? [/INST]

Application Automatique avec Tokenizer

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-Instruct-v0.3")

messages = [
    {"role": "system", "content": "Tu es un assistant utile."},
    {"role": "user", "content": "Explique la photosynthèse"},
    {"role": "assistant", "content": "La photosynthèse est..."},
    {"role": "user", "content": "Merci, et pour les animaux ?"}
]

# Appliquer template automatiquement
formatted = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)

print(formatted)

Template Custom

# Définir template Jinja2
custom_template = """{% for message in messages %}
{% if message['role'] == 'system' %}
### System: {{ message['content'] }}
{% elif message['role'] == 'user' %}
### Human: {{ message['content'] }}
{% elif message['role'] == 'assistant' %}
### Assistant: {{ message['content'] }}
{% endif %}
{% endfor %}
### Assistant:"""

tokenizer.chat_template = custom_template

formatted = tokenizer.apply_chat_template(messages, tokenize=False)

Génération avec Chat Template

from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "mistralai/Mistral-7B-Instruct-v0.3"
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto")
tokenizer = AutoTokenizer.from_pretrained(model_name)

messages = [
    {"role": "system", "content": "Tu es un expert Python."},
    {"role": "user", "content": "Comment lire un fichier CSV ?"}
]

inputs = tokenizer.apply_chat_template(
    messages,
    return_tensors="pt",
    add_generation_prompt=True
).to(model.device)

outputs = model.generate(inputs, max_new_tokens=300)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(response)

Comparaison Formats

Format Modèles Complexité Multi-turn
ChatML GPT-4, Mistral, Qwen Simple
Llama Llama 2/3/4 Moyenne
Alpaca Fine-tunes Alpaca Simple Limité
Vicuna Vicuna models Simple

16. Sentence Transformers - Embeddings

Installation

pip install sentence-transformers

Usage de Base

from sentence_transformers import SentenceTransformer, util

# Charger modèle
model = SentenceTransformer('all-MiniLM-L6-v2')

# Encoder des phrases
sentences = [
    "Le chat dort sur le canapé",
    "Un félin repose sur le sofa",
    "Le chien court dans le jardin"
]

embeddings = model.encode(sentences, convert_to_tensor=True)
print(embeddings.shape)  # (3, 384)

Similarité Cosine

from sentence_transformers import util

# Calculer similarités
cosine_scores = util.cos_sim(embeddings, embeddings)

print(f"Similarité phrase 0-1: {cosine_scores[0][1]:.4f}")
print(f"Similarité phrase 0-2: {cosine_scores[0][2]:.4f}")

Recherche Sémantique

from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer('all-mpnet-base-v2')

# Corpus de documents
corpus = [
    "Python est un langage de programmation",
    "JavaScript permet de créer des sites web",
    "L'IA transforme le monde",
    "Le machine learning est une branche de l'IA"
]

# Query
query = "Qu'est-ce que l'intelligence artificielle ?"

# Embeddings
corpus_embeddings = model.encode(corpus, convert_to_tensor=True)
query_embedding = model.encode(query, convert_to_tensor=True)

# Recherche
hits = util.semantic_search(query_embedding, corpus_embeddings, top_k=3)

print("Résultats:")
for hit in hits[0]:
    print(f"Score: {hit['score']:.4f} - {corpus[hit['corpus_id']]}")

Top Modèles Multilingues

Modèle Dimensions Langues Performance
all-MiniLM-L6-v2 384 Anglais Rapide, léger
all-mpnet-base-v2 768 Anglais ⭐ Meilleur qualité
paraphrase-multilingual-mpnet 768 50+ langues Multilingue
distiluse-base-multilingual 512 50+ langues Rapide multilingue

Clustering

from sentence_transformers import SentenceTransformer
from sklearn.cluster import KMeans

model = SentenceTransformer('all-MiniLM-L6-v2')

sentences = [...]  # Vos phrases
embeddings = model.encode(sentences)

# Clustering
num_clusters = 5
clustering_model = KMeans(n_clusters=num_clusters)
clustering_model.fit(embeddings)
cluster_assignment = clustering_model.labels_

print(cluster_assignment)

Use Cases

RAG Systems

Encoder documents pour retrieval

Duplicate Detection

Trouver contenus similaires

Semantic Search

Recherche par sens, pas mots-clés

Recommandation

Suggérer contenus similaires

17. Modèles Vision (VLM - Vision Language Models)

Modèles Populaires

Modèle Taille Résolution Points Forts
LLaVA 1.6 7B, 13B, 34B 336x336 - 672x672 Open source complet, performant
Moondream 2 1.8B 384x384 Ultra compact, edge devices
CogVLM 17B 490x490 Haute résolution, OCR
Qwen-VL 7B, 72B 448x448 Multilingue, bounding boxes

LLaVA - Exemple

from transformers import LlavaForConditionalGeneration, AutoProcessor
from PIL import Image

model = LlavaForConditionalGeneration.from_pretrained(
    "llava-hf/llava-1.5-7b-hf",
    torch_dtype=torch.float16,
    device_map="auto"
)

processor = AutoProcessor.from_pretrained("llava-hf/llava-1.5-7b-hf")

# Charger image
image = Image.open("photo.jpg")

# Préparer prompt
prompt = "USER: \nQue vois-tu dans cette image ?\nASSISTANT:"

inputs = processor(text=prompt, images=image, return_tensors="pt").to(model.device)

# Génération
outputs = model.generate(**inputs, max_new_tokens=200)
response = processor.decode(outputs[0], skip_special_tokens=True)
print(response)

Moondream 2 - Vision Compact

from transformers import AutoModelForCausalLM, AutoTokenizer
from PIL import Image

model_id = "vikhyatk/moondream2"
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    trust_remote_code=True,
    torch_dtype=torch.float16
).to("cuda")

tokenizer = AutoTokenizer.from_pretrained(model_id)

image = Image.open("image.jpg")

# Encoder image
enc_image = model.encode_image(image)

# Question
response = model.answer_question(
    enc_image,
    "Décris cette image en détail",
    tokenizer
)

print(response)

Ollama avec LLaVA

# Télécharger modèle
ollama pull llava:7b

# Utiliser avec image
ollama run llava:7b "Décris cette image" --image photo.jpg

# API REST
curl http://localhost:11434/api/generate -d '{
  "model": "llava:7b",
  "prompt": "Que vois-tu ?",
  "images": ["'$(base64 -w0 photo.jpg)'"]
}'

Use Cases Vision

Image Captioning

Générer descriptions d'images

Visual QA

Répondre questions sur images

OCR & Document

Extraire texte, analyser docs

Visual Reasoning

Raisonnement sur contenu visuel

Format Image Input

# PIL Image
from PIL import Image
image = Image.open("photo.jpg")

# URL
from PIL import Image
import requests
from io import BytesIO

url = "https://example.com/image.jpg"
response = requests.get(url)
image = Image.open(BytesIO(response.content))

# Base64
import base64
from io import BytesIO

with open("photo.jpg", "rb") as f:
    img_base64 = base64.b64encode(f.read()).decode()

image_bytes = base64.b64decode(img_base64)
image = Image.open(BytesIO(image_bytes))

18. Modèles Audio - Transcription & TTS

Whisper - Speech-to-Text

from transformers import pipeline

# Pipeline Whisper
transcriber = pipeline(
    "automatic-speech-recognition",
    model="openai/whisper-large-v3",
    device="cuda"
)

# Transcrire fichier
result = transcriber("audio.mp3")
print(result["text"])

# Avec timestamps
result = transcriber(
    "audio.mp3",
    return_timestamps=True
)

for chunk in result["chunks"]:
    print(f"[{chunk['timestamp'][0]:.2f}s - {chunk['timestamp'][1]:.2f}s] {chunk['text']}")

Whisper - Multilingue

# Forcer langue
result = transcriber(
    "audio.mp3",
    generate_kwargs={
        "language": "french",
        "task": "transcribe"
    }
)

# Traduction vers anglais
result = transcriber(
    "audio.mp3",
    generate_kwargs={
        "task": "translate"  # Traduit vers anglais
    }
)

Modèles Whisper

Modèle Taille VRAM WER (en) Speed
whisper-tiny 39M 1 GB ~10% Très rapide
whisper-base 74M 1 GB ~7% Rapide
whisper-small 244M 2 GB ~5% Moyen
whisper-medium 769M 5 GB ~3.5% Lent
whisper-large-v3 1550M 10 GB ~2.5% Très lent

Bark - Text-to-Speech

from transformers import AutoProcessor, BarkModel
import scipy

# Charger modèle
processor = AutoProcessor.from_pretrained("suno/bark")
model = BarkModel.from_pretrained("suno/bark", torch_dtype=torch.float16).to("cuda")

# Générer audio
text = "Bonjour, je suis un modèle de synthèse vocale open source."

inputs = processor(text, voice_preset="v2/fr_speaker_6")
audio_array = model.generate(**inputs.to("cuda"))

# Sauvegarder
sample_rate = model.generation_config.sample_rate
scipy.io.wavfile.write("output.wav", rate=sample_rate, data=audio_array[0].cpu().numpy())

Bark - Voix et Effets

# Voix différentes
voice_presets = [
    "v2/en_speaker_6",  # Anglais
    "v2/fr_speaker_6",  # Français
    "v2/de_speaker_6",  # Allemand
    "v2/es_speaker_6",  # Espagnol
]

# Effets sonores (entre crochets)
text_with_effects = "Le chien aboie [dog barking] et ensuite [laughs]"

# Musique (entre notes)
text_with_music = "♪ La la la la ♪"

Coqui TTS - Alternative

from TTS.api import TTS

# Lister modèles disponibles
print(TTS().list_models())

# Charger modèle
tts = TTS("tts_models/fr/mai/tacotron2-DDC")

# Générer audio
tts.tts_to_file(
    text="Bonjour le monde !",
    file_path="output.wav"
)

# Clonage de voix
tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2")
tts.tts_to_file(
    text="Ceci est un test de clonage vocal.",
    speaker_wav="reference_voice.wav",
    language="fr",
    file_path="cloned_output.wav"
)

Use Cases Audio

Transcription

Meetings, podcasts, interviews

Sous-titres

Génération auto de subtitles

Voice Assistants

STT + LLM + TTS pipeline

Accessibility

Screen readers, audiobooks

19. Modèles de Diffusion - Génération d'Images

Installation

pip install diffusers transformers accelerate safetensors

Stable Diffusion - Base

from diffusers import StableDiffusionPipeline
import torch

model_id = "stabilityai/stable-diffusion-2-1"

pipe = StableDiffusionPipeline.from_pretrained(
    model_id,
    torch_dtype=torch.float16,
    safety_checker=None
).to("cuda")

# Générer image
prompt = "A beautiful landscape with mountains and a lake, sunset, photorealistic"

image = pipe(
    prompt,
    num_inference_steps=50,
    guidance_scale=7.5,
    height=512,
    width=512
).images[0]

image.save("output.png")

SDXL (Stable Diffusion XL)

from diffusers import StableDiffusionXLPipeline

pipe = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
    variant="fp16"
).to("cuda")

# SDXL génère 1024x1024 par défaut
image = pipe(
    prompt="Astronaut riding a horse on Mars, 8k, highly detailed",
    num_inference_steps=30,
    guidance_scale=7.0
).images[0]

image.save("sdxl_output.png")

FLUX - Nouveau Modèle 2026

from diffusers import FluxPipeline

pipe = FluxPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    torch_dtype=torch.bfloat16
).to("cuda")

image = pipe(
    prompt="A cat wearing a space suit, digital art",
    num_inference_steps=28,
    guidance_scale=3.5,
    height=1024,
    width=1024
).images[0]

image.save("flux_output.png")

Paramètres Importants

Paramètre Valeurs Effet
num_inference_steps 20-100 Plus = meilleure qualité, plus lent
guidance_scale 7.0-15.0 Adhérence au prompt (7.5 recommandé)
negative_prompt string Éléments à éviter
seed int Reproductibilité

Negative Prompts

negative_prompt = "ugly, blurry, low quality, distorted, deformed, bad anatomy"

image = pipe(
    prompt="Beautiful portrait of a woman",
    negative_prompt=negative_prompt,
    num_inference_steps=50,
    guidance_scale=7.5
).images[0]

Samplers (Schedulers)

from diffusers import (
    DDIMScheduler,
    EulerDiscreteScheduler,
    DPMSolverMultistepScheduler
)

# Changer scheduler
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)

# DPM++ 2M Karras (rapide et qualité)
pipe.scheduler = DPMSolverMultistepScheduler.from_config(
    pipe.scheduler.config,
    use_karras_sigmas=True
)

Schedulers Populaires

DDIM

Standard, prévisible

Euler

Rapide, bonne qualité

DPM++ 2M Karras

⭐ Meilleur compromis

UniPC

Ultra rapide (5-10 steps)

ControlNet - Contrôle Précis

from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
from PIL import Image

# Charger ControlNet (ex: Canny edge)
controlnet = ControlNetModel.from_pretrained(
    "lllyasviel/control_v11p_sd15_canny",
    torch_dtype=torch.float16
)

pipe = StableDiffusionControlNetPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    controlnet=controlnet,
    torch_dtype=torch.float16
).to("cuda")

# Image de contrôle (edges, pose, depth, etc.)
control_image = Image.open("canny_edge.png")

image = pipe(
    prompt="A beautiful house",
    image=control_image,
    num_inference_steps=30
).images[0]

20. Comparatif des Serveurs d'Inférence

Feature Matrix

Feature Ollama vLLM TGI llama.cpp LocalAI
Installation Très facile Moyenne Moyenne Compilation Docker
Performance Bonne Excellente Excellente Bonne Moyenne
Formats GGUF HF, AWQ, GPTQ HF, AWQ, GPTQ GGUF GGUF, GGML
API OpenAI ✓ (server)
Batch Processing Limité ✓ Optimal Basique Basique
Streaming
Multi-GPU ✓ Tensor Parallel Limité
CPU Support Expérimental Limité ✓ Excellent

Ollama

Points Forts:

  • Installation en 1 commande
  • Gestion automatique des modèles
  • Parfait pour développement local
  • Interface simple

Limitations:

  • Performance moyenne sur batch
  • Pas de multi-GPU
  • Formats GGUF uniquement

vLLM

Points Forts:

  • Performance maximale (PagedAttention)
  • Throughput 24x supérieur
  • Excellent pour production haute charge
  • Multi-GPU natif

Limitations:

  • Complexité setup
  • GPU NVIDIA requis
  • Consommation VRAM élevée

Text Generation Inference (TGI)

Points Forts:

  • Production-ready (Hugging Face)
  • Support quantization avancée
  • Monitoring intégré
  • Optimisations Flash Attention

Limitations:

  • Moins flexible que vLLM
  • Documentation technique

llama.cpp

Points Forts:

  • Excellent support CPU
  • Formats GGUF optimisés
  • Léger et portable
  • Apple Silicon support

Limitations:

  • Compilation manuelle
  • Performance GPU moyenne
  • Pas d'API REST native (serveur séparé)

LocalAI

Points Forts:

  • Multi-modal (texte, image, audio)
  • API OpenAI drop-in replacement
  • Docker simple
  • Interfaces Web intégrées

Limitations:

  • Performance inférieure spécialisés
  • Configuration complexe multi-modèles

Recommandations par Use Case

Use Case Serveur Recommandé Raison
Développement Local Ollama Simplicité, rapidité setup
Production Haute Charge vLLM Performance maximale, batching
CPU uniquement llama.cpp Optimisations CPU natives
Prototyping Rapide LocalAI Multi-modal, Docker
Enterprise TGI Support HF, monitoring