Modèles Open Source & Inférence Locale
Formation IA Générative 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 |
| 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 |
pip install huggingface_hub
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")
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
)
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"
)
# Via CLI
huggingface-cli login
# Via code
from huggingface_hub import login
login(token="hf_xxxxxxxxxxxxx")
# Variables d'environnement
export HF_TOKEN="hf_xxxxxxxxxxxxx"
README.md contient specs, benchmarks, exemples d'usage
Branches pour versions, tags pour releases stables
Discussions pour support, issues, fine-tunes partagés
pip install transformers torch accelerate
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 = pipeline(
"sentiment-analysis",
model="nlptown/bert-base-multilingual-uncased-sentiment"
)
result = sentiment("Ce produit est excellent !")
# [{'label': '5 stars', 'score': 0.89}]
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', ...}]
translator = pipeline(
"translation",
model="Helsinki-NLP/opus-mt-fr-en"
)
result = translator("Bonjour le monde")
# [{'translation_text': 'Hello world'}]
summarizer = pipeline(
"summarization",
model="facebook/bart-large-cnn"
)
long_text = "..."
summary = summarizer(
long_text,
max_length=130,
min_length=30,
do_sample=False
)
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}
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
)
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)
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
)
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)
# 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
)
pip install datasets
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)
# 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)
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']
})
# 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")
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)
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
)
# Linux / macOS
curl -fsSL https://ollama.com/install.sh | sh
# Windows
# Télécharger depuis https://ollama.com/download
# Vérifier
ollama --version
# 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
# 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 !"}
]
}'
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")
# 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
Généraliste, 4.7GB
Efficace, 4.1GB
Code, 3.8GB
Compact, 2.3GB
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
# 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
}'
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)
| 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 |
Très compacte, qualité réduite
⭐ Recommandé - Bon équilibre
Meilleure qualité, +VRAM
Quasi full precision
# 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
# 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
| 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 |
# 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
./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
# 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
}'
vLLM est un serveur d'inférence optimisé avec PagedAttention pour throughput maximal.
Avantages: 24x plus rapide que HF Transformers, batching continu, streaming
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 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
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)
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 divise la mémoire KV cache en blocs, permettant:
# 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è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 |
| 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 |
Sélectionne les tokens dont la probabilité cumulée atteint top_p
Limite aux k tokens les plus probables
| 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) |
# 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
)
temp=0.2, top_p=0.95, top_k=50
temp=0.7, top_p=0.9, rep_pen=1.1
temp=1.0, top_p=0.95, rep_pen=1.2
temp=0.1, top_p=1.0, max_tokens=5
| 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 |
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"
)
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"
)
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"
)
| 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 |
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
| 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 |
# 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
Réduit mémoire activations de 50-70%
Réduit mémoire attention de 10-20x
Swap layers en RAM (plus lent)
Réduit taille modèle 2-8x
| 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 |
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))
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]))
164 problèmes Python avec tests unitaires. Mesure capacité à générer code correct.
974 problèmes Python niveau débutant/intermédiaire. Tests fonctionnels.
HumanEval traduit en 18+ langages (Java, C++, JavaScript, etc.)
StarCoder 2 (FIM mode)
DeepSeek-Coder Instruct
WizardCoder
CodeLlama 34B
<|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|>
[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]
[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]
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)
# 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)
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)
| 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 | ✓ |
pip install sentence-transformers
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)
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}")
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']]}")
| 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 |
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)
Encoder documents pour retrieval
Trouver contenus similaires
Recherche par sens, pas mots-clés
Suggérer contenus similaires
| 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 |
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)
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)
# 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)'"]
}'
Générer descriptions d'images
Répondre questions sur images
Extraire texte, analyser docs
Raisonnement sur contenu visuel
# 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))
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']}")
# 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è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 |
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())
# 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 ♪"
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"
)
Meetings, podcasts, interviews
Génération auto de subtitles
STT + LLM + TTS pipeline
Screen readers, audiobooks
pip install diffusers transformers accelerate safetensors
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")
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")
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è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_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]
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
)
Standard, prévisible
Rapide, bonne qualité
⭐ Meilleur compromis
Ultra rapide (5-10 steps)
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]
| 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 | ✓ |
Points Forts:
Limitations:
Points Forts:
Limitations:
Points Forts:
Limitations:
Points Forts:
Limitations:
Points Forts:
Limitations:
| 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 |