TO BE COMPLETED

Author

Lino Galiana

Published

2023-12-20

Ce chapitre présente la deuxième application d’une journée de cours que j’ai donné à l’Université Dauphine dans le cadre des PSL Data Week.

L’objectif de ce chapitre est d’amener à développer une API du type de celle-ci.

Dérouler les slides associées ci-dessous ou cliquer ici pour les afficher en plein écran.

Le chapitre précédent constituait une introduction à la création de pipelines de machine learning. Ce chapitre va aller plus loin en montrant la démarche pour le rendre disponible à plus grande échelle par le biais d’une API pouvant être consommée avec de nouvelles données. L’objectif de celle-ci est de ne pas contraindre les réutilisateurs d’un modèle à disposer d’un environnement technique complexe pour pouvoir utiliser le même modèle que celui entraîné précédemment.

Exemple de réutilisation d’un modèle sous forme d’API

Un exemple d’API obtenue à l’issue de ce chapitre est mis à disposition sur https://dvf-simple-api.lab.sspcloud.fr/. La documentation de l’API est disponible ici.

Cette API est utilisable dans plusieurs langages.

En Python, par exemple, cela donnera:

import requests

pieces_principales = 6
surface = 50
url = f"https://dvf-simple-api.lab.sspcloud.fr/predict?month=4&nombre_lots=1&code_type_local=2&nombre_pieces_principales={pieces_principales}&surface={surface}"
requests.get(url).json()
728358.5461884077

Néanmoins, l’un des intérêts de proposer une API est que les utilisateurs du modèle ne sont pas obligés d’être des pythonistes. Cela accroît grandement la cible des ré-utilisateurs potentiels.

Cette approche ouvre notamment la possibilité de faire des applications interactives qui utilisent, en arrière plan, notre modèle entraîné avec Python.

Voici un exemple, minimaliste, d’une réutilisation de notre modèle avec deux sélecteurs Javascript qui mettent à jour le prix estimé du bien.

Etape 1: créer une application en local

Mettre en place une API consiste à gravir une marche dans l’échelle de la reproductibilité par rapport à fournir un notebook. Ces derniers ne sont pas les outils les plus adaptés pour partager autre chose que du code, à faire tourner de son côté.

Il est donc naturel de sortir des notebooks lorsqu’on commence à aller vers ce niveau de mise à disposition. Par le biais de scripts Python lancés en ligne de commande, construits en exportant le code du chapitre précédent de nos notebooks, on pourra créer une base de départ propre.

Il est plus naturel de privilégier une interface de développement généraliste comme VSCode à Jupyter lorsqu’on franchit ce rubicon. L’exercice suivant permettra donc de créer cette première application minimale, à exécuter en ligne de commande.

Etape 2: créer une API en local

Le script précédent constitue déjà un progrès dans la reproductibilité. Il rend plus facile le réentraînement d’un modèle sur le même jeu de données. Néanmoins, il reste tributaire du fait que la personne désirant utiliser du modèle utilise Python et sache réentrainer le modèle dans les mêmes conditions que vous.

Avec FastAPI, nous allons très facilement pouvoir transformer cette application Python en une API.

Aller plus loin: mettre à disposition cette API de manière pérenne

L’étape précédente permettait de créer un point d’accès à votre modèle depuis n’importe quel type de client. A chaque requête de l’API, le script api.py était exécuté et renvoyait son output.

Ceci est déjà un saut de géant dans l’échelle de la reproductibilité. Néanmoins, cela reste artisanal: si votre serveur local connait un problème (par exemple, vous killez l’application), les clients ne recevront plus de réponse, sans comprendre pourquoi.

Il est donc plus fiable de mettre en production sur des serveurs dédiés, qui tournent 24h/24 et qui peuvent également se répartir la charge de travail s’il y a beaucoup de demandes instantanées.

Ceci dépasse néanmoins le cadre de ce cours et sera l’objet d’un cours dédié en 3e année de l’ENSAE: “Mise en production de projets data science donné par Romain Avouac et moi.

Informations additionnelles

environment files have been tested on.

Latest built version: 2023-12-20

Python version used:

'3.9.18 | packaged by conda-forge | (main, Aug 30 2023, 03:49:32) \n[GCC 12.3.0]'
Package Version
absl-py 2.0.0
affine 2.4.0
aiobotocore 2.5.4
aiohttp 3.8.5
aioitertools 0.11.0
aiosignal 1.3.1
annotated-types 0.5.0
ansi2html 1.8.0
anyio 4.0.0
appdirs 1.4.4
argon2-cffi 23.1.0
argon2-cffi-bindings 21.2.0
arrow 1.2.3
astroid 2.12.10
asttokens 2.0.8
astunparse 1.6.3
async-lru 2.0.4
async-timeout 4.0.3
attrs 23.1.0
Babel 2.12.1
backcall 0.2.0
backports.functools-lru-cache 1.6.4
beautifulsoup4 4.12.2
bleach 6.0.0
blinker 1.6.2
blis 0.7.11
bokeh 3.2.2
boto3 1.24.93
botocore 1.31.17
branca 0.6.0
Brotli 1.1.0
brotlipy 0.7.0
cached-property 1.5.2
cachetools 5.3.1
cartiflette 0.0.1
Cartopy 0.22.0
catalogue 2.0.10
certifi 2022.9.24
cffi 1.15.1
charset-normalizer 2.1.1
chromedriver-autoinstaller 0.6.3
click 8.1.7
click-plugins 1.1.1
cligj 0.7.2
cloudpickle 2.2.1
cmake 3.27.5
colorama 0.4.5
conda 22.9.0
conda-package-handling 1.9.0
confection 0.1.3
contextily 1.3.0
contourpy 1.1.1
cryptography 41.0.4
cycler 0.11.0
cymem 2.0.8
cytoolz 0.12.2
dash 2.13.0
dash-core-components 2.0.0
dash-html-components 2.0.0
dash-table 5.0.0
dask 2023.9.2
debugpy 1.6.3
decorator 5.1.1
defusedxml 0.7.1
descartes 1.1.0
dill 0.3.5.1
distributed 2023.9.2
duckdb 0.9.2
elastic-transport 8.4.0
elasticsearch 8.10.0
en-core-web-sm 3.6.0
entrypoints 0.4
et-xmlfile 1.1.0
exceptiongroup 1.1.3
executing 1.1.1
fastjsonschema 2.16.2
fasttext 0.9.2
filelock 3.12.4
Fiona 1.9.4
Flask 2.2.5
flatbuffers 23.5.26
folium 0.14.0
fontawesomefree 6.4.2
fonttools 4.42.1
fqdn 1.5.1
frozenlist 1.4.0
fsspec 2023.9.2
funcy 2.0
gast 0.4.0
GDAL 3.7.2
gensim 4.3.2
geographiclib 1.52
geopandas 0.12.2
geoplot 0.5.1
geopy 2.4.0
gmpy2 2.1.2
google-auth 2.23.0
google-auth-oauthlib 0.4.6
google-pasta 0.2.0
graphviz 0.20.1
greenlet 2.0.2
grpcio 1.51.1
h11 0.14.0
h5py 3.9.0
huggingface-hub 0.17.2
hvac 0.11.2
idna 3.3
imageio 2.31.4
importlib-metadata 6.8.0
importlib-resources 5.10.0
inflate64 0.3.1
ipykernel 6.16.0
ipython 8.5.0
ipython-genutils 0.2.0
ipywidgets 8.0.2
isoduration 20.11.0
isort 5.10.1
itsdangerous 2.1.2
jedi 0.18.1
Jinja2 3.1.2
jmespath 1.0.1
joblib 1.3.2
json5 0.9.14
jsonpointer 2.4
jsonschema 4.19.1
jsonschema-specifications 2023.7.1
jupyter 1.0.0
jupyter-cache 0.6.1
jupyter_client 8.3.1
jupyter-console 6.6.3
jupyter_core 5.3.1
jupyter-events 0.7.0
jupyter-lsp 2.2.0
jupyter_server 2.7.3
jupyter_server_terminals 0.4.4
jupyterlab 4.0.6
jupyterlab-pygments 0.2.2
jupyterlab_server 2.25.0
jupyterlab-widgets 3.0.3
jupytext 1.15.2
kaleido 0.2.1
keras 2.11.0
Keras-Preprocessing 1.1.2
kiwisolver 1.4.5
langcodes 3.3.0
lazy_loader 0.3
lazy-object-proxy 1.7.1
Levenshtein 0.21.1
libmambapy 1.5.1
lit 16.0.6
locket 1.0.0
lxml 4.9.3
lz4 4.3.2
mamba 1.5.1
mapclassify 2.5.0
Markdown 3.4.4
markdown-it-py 3.0.0
MarkupSafe 2.1.3
matplotlib 3.8.0
matplotlib-inline 0.1.6
mccabe 0.7.0
mdit-py-plugins 0.4.0
mdurl 0.1.2
mercantile 1.2.1
mistune 3.0.1
mizani 0.9.3
mpmath 1.3.0
msgpack 1.0.6
multidict 6.0.4
multivolumefile 0.2.3
munch 4.0.0
munkres 1.1.4
murmurhash 1.0.10
nbclient 0.7.0
nbconvert 7.8.0
nbformat 5.7.0
nest-asyncio 1.5.6
networkx 3.1
nltk 3.8.1
notebook 7.0.4
notebook_shim 0.2.3
numexpr 2.8.6
numpy 1.26.0
nvidia-cublas-cu11 11.10.3.66
nvidia-cuda-cupti-cu11 11.7.101
nvidia-cuda-nvrtc-cu11 11.7.99
nvidia-cuda-runtime-cu11 11.7.99
nvidia-cudnn-cu11 8.5.0.96
nvidia-cufft-cu11 10.9.0.58
nvidia-curand-cu11 10.2.10.91
nvidia-cusolver-cu11 11.4.0.1
nvidia-cusparse-cu11 11.7.4.91
nvidia-nccl-cu11 2.14.3
nvidia-nvtx-cu11 11.7.91
oauthlib 3.2.2
openpyxl 3.1.2
opt-einsum 3.3.0
outcome 1.2.0
overrides 7.4.0
OWSLib 0.28.1
packaging 23.2
pandas 2.1.1
pandocfilters 1.5.0
parso 0.8.3
partd 1.4.0
pathy 0.10.2
patsy 0.5.3
pexpect 4.8.0
pickleshare 0.7.5
Pillow 10.0.0
pip 23.2.1
pkgutil_resolve_name 1.3.10
platformdirs 2.5.2
plotly 5.17.0
plotnine 0.12.3
preshed 3.0.9
prometheus-client 0.17.1
prompt-toolkit 3.0.31
protobuf 4.21.12
psutil 5.9.3
ptyprocess 0.7.0
pure-eval 0.2.2
py7zr 0.20.6
pyarrow 13.0.0
pyasn1 0.5.0
pyasn1-modules 0.3.0
pybcj 1.0.1
pybind11 2.11.1
pycosat 0.6.3
pycparser 2.21
pycryptodomex 3.19.0
pydantic 2.3.0
pydantic_core 2.6.3
pygeos 0.14
Pygments 2.13.0
PyJWT 2.8.0
pyLDAvis 3.4.1
pylint 2.15.3
pynsee 0.1.4
pyOpenSSL 23.2.0
pyparsing 3.0.9
pyppmd 1.0.0
pyproj 3.6.1
pyrsistent 0.18.1
pyshp 2.3.1
PySocks 1.7.1
python-dateutil 2.8.2
python-dotenv 1.0.0
python-json-logger 2.0.7
python-Levenshtein 0.21.1
pytz 2022.5
pyu2f 0.1.5
pywaffle 1.1.0
PyWavelets 1.4.1
PyYAML 6.0.1
pyzmq 24.0.1
pyzstd 0.15.9
qtconsole 5.4.4
QtPy 2.4.0
rapidfuzz 3.3.1
rasterio 1.3.8
referencing 0.30.2
regex 2023.8.8
requests 2.31.0
requests-oauthlib 1.3.1
retrying 1.3.4
rfc3339-validator 0.1.4
rfc3986-validator 0.1.1
rpds-py 0.10.3
rsa 4.9
Rtree 1.0.1
ruamel-yaml-conda 0.15.80
s3fs 2023.9.2
s3transfer 0.6.0
safetensors 0.3.3
scikit-image 0.21.0
scikit-learn 1.3.1
scipy 1.11.2
seaborn 0.12.2
selenium 4.12.0
Send2Trash 1.8.2
sentence-transformers 2.2.2
sentencepiece 0.1.99
setuptools 65.5.0
shapely 2.0.1
six 1.16.0
smart-open 6.4.0
sniffio 1.3.0
snuggs 1.4.7
sortedcontainers 2.4.0
soupsieve 2.5
spacy 3.6.1
spacy-legacy 3.0.12
spacy-loggers 1.0.5
SQLAlchemy 2.0.21
srsly 2.4.8
stack-data 0.5.1
statsmodels 0.14.0
sympy 1.12
tabulate 0.9.0
tblib 2.0.0
tenacity 8.2.3
tensorboard 2.11.2
tensorboard-data-server 0.6.1
tensorboard-plugin-wit 1.8.1
tensorflow 2.11.1
tensorflow-estimator 2.11.0
termcolor 2.3.0
terminado 0.17.1
texttable 1.6.7
thinc 8.1.12
threadpoolctl 3.2.0
tifffile 2023.9.18
tinycss2 1.2.1
tokenizers 0.13.3
toml 0.10.2
tomli 2.0.1
tomlkit 0.11.5
toolz 0.12.0
topojson 1.5
torch 2.0.1
torchvision 0.15.2
tornado 6.2
tqdm 4.66.1
traitlets 5.10.0
transformers 4.33.2
trio 0.22.2
trio-websocket 0.10.4
triton 2.0.0
typer 0.9.0
typing_extensions 4.8.0
tzdata 2023.3
unicodedata2 15.0.0
Unidecode 1.3.6
uri-template 1.3.0
urllib3 1.26.11
wasabi 1.1.2
wcwidth 0.2.5
webcolors 1.13
webdriver-manager 4.0.1
webencodings 0.5.1
websocket-client 1.6.3
Werkzeug 2.2.3
wheel 0.37.1
widgetsnbextension 4.0.3
wordcloud 1.9.2
wrapt 1.14.1
wsproto 1.2.0
xlrd 2.0.1
xyzservices 2023.7.0
yarl 1.9.2
yellowbrick 1.5
zict 3.0.0
zipp 3.9.0

View file history

SHA Date Author Description
005d89b 2023-12-20 17:23:04 Lino Galiana Finalise l’affichage des statistiques Git (#478)
3fba612 2023-12-17 18:16:42 Lino Galiana Remove some badges from python (#476)
1f23de2 2023-12-01 17:25:36 Lino Galiana Stockage des images sur S3 (#466)
e4642ee 2023-11-27 17:02:05 Lino Galiana Deploy ML model as API (#460)
Back to top

Citation

BibTeX citation:
@book{galiana2023,
  author = {Galiana, Lino},
  title = {Python Pour La Data Science},
  date = {2023},
  url = {https://pythonds.linogaliana.fr/},
  doi = {10.5281/zenodo.8229676},
  langid = {en}
}
For attribution, please cite this work as:
Galiana, Lino. 2023. Python Pour La Data Science. https://doi.org/10.5281/zenodo.8229676.