Introduction
En 2026, Gradio reste l'outil incontournable pour prototyper et déployer des interfaces web interactives pour l'IA et le machine learning, sans écrire de frontend complexe. Contrairement aux frameworks lourds comme Streamlit ou Dash, Gradio excelle dans la personnalisation avancée : gestion d'état persistante, composants custom via HTML/JS, authentification intégrée, files d'attente pour la scalabilité, et déploiement natif sur Hugging Face Spaces.
Ce tutoriel advanced s'adresse aux ingénieurs ML expérimentés. Nous partirons des fondations pour plonger dans des cas réels : une app de génération de texte avec state pour chatbots, composants custom pour visualisations dynamiques, sécurité via OAuth, optimisation concurrency avec queues, et CI/CD pour production. Chaque étape inclut du code complet, fonctionnel et copier-collable. À la fin, vous déployez une app scalable comme un pro. Pourquoi c'est crucial ? Les interfaces IA représentent 70% des démos ML en prod – maîtrisez Gradio pour booster votre workflow (128 mots).
Prérequis
- Python 3.11+ installé
- pip et venv pour isolation
- Compte Hugging Face (gratuit)
- Connaissances en Transformers Hugging Face
- Git pour Spaces
- Accès terminal et éditeur (VS Code recommandé)
Installation et setup initial
python -m venv gradio-env
source gradio-env/bin/activate # Linux/Mac
# ou gradio-env\Scripts\activate # Windows
pip install gradio==5.4.0 transformers torch accelerate
pip install gradio-auth # Pour auth avancée
gradiolaunch --help # Vérifier installationCe script crée un environnement virtuel isolé, installe Gradio 5.x (version stable 2026), Transformers pour modèles HF, et Torch pour inférence. Évitez les conflits en n'utilisant pas de global pip. gradiolaunch teste l'install sans code.
Première app avec modèle Hugging Face
Avant l'avancé, solidifions les bases avec une app de classification de sentiment. Nous utilisons pipeline pour charger un modèle BERT lightweight. Imaginez Gradio comme un 'duct tape' magique : votre fonction Python devient instantanément une UI avec sliders, texts, images.
App basique sentiment analysis
import gradio as gr
from transformers import pipeline
classifier = pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-2-english")
def analyze_sentiment(text):
result = classifier(text)[0]
return f"{result['label']}: {result['score']:.2%}"
with gr.Blocks(title="Sentiment Analysis") as demo:
gr.Markdown("# Analyseur de Sentiment IA")
input_text = gr.Textbox(label="Votre texte", placeholder="J'adore ce film!")
output = gr.Textbox(label="Résultat")
analyze_btn = gr.Button("Analyser")
analyze_btn.click(analyze_sentiment, inputs=input_text, outputs=output)
if __name__ == "__main__":
demo.launch(share=True, server_name="0.0.0.0")Ce code charge DistilBERT pour inférence rapide et crée une interface Blocks avec Markdown, Textbox et Button. click lie l'événement à la fonction. share=True génère un lien public temporaire ; server_name permet accès réseau. Lancez avec python sentiment_app.py.
Gestion d'état pour chatbots persistants
Pour des apps stateful comme les chatbots, Gradio gère l'état via gr.State. Analogie : comme un compteur de session React, mais sans JS. Stockez historique, contexte modèle – idéal pour LLM comme Mistral.
Chatbot avec state et historique
import gradio as gr
from transformers import pipeline
generator = pipeline("text-generation", model="mistralai/Mistral-7B-Instruct-v0.1")
chat_history = gr.State([])
def respond(message, history):
history.append({"role": "user", "content": message})
prompt = "\n".join([f"{msg['role']}: {msg['content']}" for msg in history])
response = generator(prompt, max_new_tokens=50, do_sample=True)[0]['generated_text']
new_history = history + [{"role": "assistant", "content": response}]
return new_history, new_history
with gr.Blocks() as demo:
gr.Markdown("# Chatbot IA Stateful")
chatbot = gr.Chatbot(height=400)
msg = gr.Textbox(placeholder="Posez votre question...")
clear = gr.Button("Clear")
msg.submit(respond, [msg, chat_history], [chatbot, chat_history])
clear.click(lambda: ([], []), None, [chatbot, chat_history])
if __name__ == "__main__":
demo.launch()L'état chat_history persiste entre appels, simulant une conversation. respond formate le prompt multi-turn et génère. Chatbot rend l'historique UI. Attention : pour prod, limitez max_new_tokens pour éviter OOM.
Composants custom pour visualisations dynamiques
Gradio permet des composants HTML/JS custom pour graphs Plotly ou D3. C'est comme embedder un iframe magique : injectez du JS réactif sans bundler.
Composant custom Plotly intégré
import gradio as gr
import plotly.graph_objects as go
import numpy as np
def create_plot(x_data, y_data):
fig = go.Figure(data=go.Scatter(x=x_data, y=y_data, mode='lines'))
fig.update_layout(title="Graphique Dynamique")
return fig.to_html(full_html=False)
with gr.Blocks() as demo:
gr.Markdown("# Visualisation Custom Plotly")
with gr.Row():
x_slider = gr.Slider(0, 10, value=5, label="Valeur X")
y_slider = gr.Slider(0, 10, value=5, label="Valeur Y")
plot_output = gr.HTML(label="Graphique")
gr.Button("Générer").click(
create_plot,
inputs=[x_slider, y_slider],
outputs=plot_output
)
if __name__ == "__main__":
demo.launch()On génère du HTML Plotly via to_html() pour un composant gr.HTML. Sliders déclenchent updates réactifs. Piège : full_html=False évite conflits CSS Gradio ; testez en local avant custom JS.
Authentification et sécurité
Protégez vos apps avec auth ou OAuth HF. Pour advanced, combinez avec gradio-auth pour users/password persistants.
App protégée par authentification
import gradio as gr
from gradio_auth import GradioAuth
# Générer users (en prod, utilisez DB)
auth = GradioAuth(users=[("user1", "pass123"), ("admin", "secret")])
# Votre app sensible
secret_data = pipeline("summarization", model="facebook/bart-large-cnn")
def summarize(text):
return secret_data(text, max_length=50, min_length=10)[0]['summary_text']
with gr.Blocks(auth=auth) as demo:
gr.Markdown("# App Sécurisée")
input_txt = gr.Textbox(label="Texte à résumer")
output = gr.Textbox(label="Résumé")
gr.Button("Résumer").click(summarize, input_txt, output)
if __name__ == "__main__":
demo.launch()GradioAuth gère login basique ; passez auth=auth à Blocks. En prod, stockez creds en env vars ou Redis. Évitez hardcode passwords – ce code est pour démo.
Queues pour scalabilité et concurrency
Activez queue=True pour gérer pics de trafic GPU. Analogie : file d'attente supermarché – priorise et limite overload.
App avec queue et concurrency
import gradio as gr
from transformers import pipeline
pipe = pipeline("image-to-text", model="Salesforce/blip-image-captioning-base")
def caption_image(img):
return pipe(img)[0]['generated_text']
with gr.Blocks(queue=True, max_threads=4) as demo:
gr.Markdown("# Captioning avec Queue")
img_input = gr.Image(type="pil")
caption_output = gr.Textbox()
gr.Button("Captionner").click(caption_image, img_input, caption_output)
if __name__ == "__main__":
demo.launch(server_port=7861, share=True)queue=True active WebSocket pour status en temps réel ; max_threads=4 limite CPU. Idéal pour vision models lents. Surveillez logs pour bottlenecks GPU.
Déploiement sur Hugging Face Spaces
HF Spaces = déploiement gratuit zero-config. Push Git repo avec app.py et requirements.txt.
Fichiers pour HF Spaces
import gradio as gr
# App complète combinant tout
def advanced_demo(text):
return f"Gradio avancé déployé ! Input: {text}"
with gr.Blocks() as demo:
gr.Interface(fn=advanced_demo, inputs="textbox", outputs="text")
if __name__ == "__main__":
demo.launch()Ce app.py minimal est requis pour Spaces. Créez aussi requirements.txt avec gradio transformers. Git push vers repo HF – auto-build. Scale auto avec GPU gratuit.
requirements.txt pour déploiement
gradio==5.4.0
transformers==4.45.0
torch==2.4.0
accelerate==1.0.0
plotly==5.24.0
gradio-auth==0.1.0
numpy==2.1.0Liste exhaustive des deps pinned pour reproductibilité. HF Spaces installe via pip. Ajoutez accelerate pour multi-GPU.
Bonnes pratiques
- Toujours utiliser Blocks au lieu d'Interface pour layouts complexes et state.
- Pinnez versions dans requirements.txt pour éviter breaking changes.
- Activez queues dès >10 users/sec ; monitorez avec
demo.queue().stats(). - Sécurisez avec secrets HF pour API keys (HUGGINGFACE_TOKEN).
- Testez offline avec
prevent_thread_lock=Truepour debug rapide.
Erreurs courantes à éviter
- Oubli state reset : Conversations explosent mémoire – ajoutez clear button.
- Modèles non cachés : Rechargez à chaque appel – utilisez global
pipeline. - Queue sans max_threads : Serveur freeze sous load – limitez à hardware.
- Share=True en prod : Liens temporaires expirent ; utilisez Spaces/Docker.
Pour aller plus loin
Plongez dans les docs officielles Gradio. Explorez composants communautaires sur HF Spaces Gallery. Pour scaler en prod, intégrez FastAPI + Gradio. Découvrez nos formations Learni sur Python IA pour masterclass ML deployment.