Skip to content

Commit

Permalink
supprime une appli
Browse files Browse the repository at this point in the history
  • Loading branch information
linogaliana committed Mar 15, 2024
1 parent bf85d56 commit 0f2a4d2
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 88 deletions.
26 changes: 1 addition & 25 deletions chapters/application.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -931,30 +931,6 @@ exécuter le code nécessaire à répondre à toute action d'un utilisateur de l
:::


## Étape préliminaire: création d'un _pipeline_ `scikit`

La mise en
production nécessite d'être exigeant sur la mise en oeuvre opérationnelle
de notre _pipeline_. Nous avons néanmoins un _pipeline_ un peu bancal
car il requiert d'être vigilant dans la manière d'enchaîner les
étapes de _preprocessing_, d'entraînement et d'évaluation.

Quand on utilise `scikit`, la bonne pratique est d'utiliser
les [_pipelines_](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html)
qui sécurisent les étapes de _feature engineering_ nécessaires avant la mise en oeuvre d'un modèle, qu'il
que
ce soit pour l'entraînement ou pour appliquer les mêmes opérations avec les mêmes paramètres sur
sur un nouveau jeu de données avant de faire un _predict_.

On va donc devoir refactoriser notre application pour utiliser un _pipeline_ `scikit`.
Les raisons sont expliquées plus en détail [ici](https://scikit-learn.org/stable/common_pitfalls.html).
Cela aura
également l'avantage de rendre les étapes de notre _pipeline_ plus lisibles lorsqu'on passera à
l'étape d'industrialisation avec `MLFLow`.

{{< include "./applications/_appli16.qmd" >}}


## Étape 1: développer une API en local

Le premier livrable devenu classique dans un projet
Expand All @@ -968,7 +944,7 @@ de rapidement transformer notre application `Python` en une API fonctionnelle.
## Si vous prenez ce projet fil rouge en cours de route

```{.bash filename="terminal"}
git checkout appli16
git checkout appli15
```

![](/checkpoint.jpg){width=80% fig-align="center"}
Expand Down
61 changes: 0 additions & 61 deletions chapters/applications/_appli16.qmd

This file was deleted.

6 changes: 4 additions & 2 deletions chapters/applications/_appli17.qmd
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
::: {.callout-tip}

## Application 17: Mise à disposition sous forme d'API locale
## Application 16: Mise à disposition sous forme d'API locale

- Installer `fastAPI` et `uvicorn` puis les ajouter au `requirements.txt`
- Renommer le fichier `main.py` en `train.py`. Dans ce script, ajouter une
Expand Down Expand Up @@ -32,7 +32,9 @@ fichier sans vous référer à l'exemple
<summary>
Fichier `api.py`
</summary>
Récupérer le contenu sur [cette page](https://raw.githubusercontent.com/ensae-reproductibilite/application-correction/appli17/api.py)

```{.python include="./applications/code/appli17_api_main.py" filename="src/models/train_evaluation.py"}
```
</details>

- Déployer en local l'API avec la commande
Expand Down
32 changes: 32 additions & 0 deletions chapters/applications/_appli8.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,40 @@ en modifiant `$BUCKET_PERSONNEL`. Les URL de téléchargement seront de la forme
- Ajouter le dossier `data/` au `.gitignore`
- Supprimer le dossier `data` de votre projet et faites `git rm --cached -r data`
- Vérifier le bon fonctionnement de votre application.

Maintenant qu'on a arrangé la structure de notre projet, c'est l'occasion
de supprimer le code qui n'est plus nécessaire au bon fonctionnement de notre
projet (cela réduit la charge de maintenance[^pourapres]).

Pour vous aider, vous pouvez
utiliser [`vulture`](https://pypi.org/project/vulture/) de manière itérative
pour vous assister dans le nettoyage de votre code.

```{.bash filename="terminal"}
vulture main.py src/
```

<details>
<summary>
Exemple de sortie
</summary>

```{.bash filename="terminal"}
vulture main.py src/
```

```{.python}
main.py:21: unused variable 'jeton_api' (60% confidence)
main.py:36: unused variable 'ticket_count' (60% confidence)
main.py:37: unused variable 'name_count' (60% confidence)
```

</details>

:::

[^pourapres]: Lorsqu'on développe du code qui finalement ne s'avère plus nécessaire, on a souvent un cas de conscience à le supprimer et on préfère le mettre de côté. Au final, ce syndrôme de Diogène est mauvais pour la pérennité du projet : on se retrouve à devoir maintenir une base de code qui n'est, en pratique, pas utilisée. Ce n'est pas un problème de supprimer un code ; si finalement celui-ci s'avère utile, on peut le retrouver grâce à l'historique `Git` et les outils de recherche sur `Github`. Le _package_ `vulture` est très pratique pour diagnostiquer les morceaux de code inutiles dans un projet.

::: {.callout-caution collapse="true"}
## Checkpoint

Expand Down
51 changes: 51 additions & 0 deletions chapters/applications/code/appli17_api_main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
"""A simple API to expose our trained RandomForest model for Tutanic survival."""
from fastapi import FastAPI
from joblib import load

import pandas as pd

model = load('model.joblib')

app = FastAPI(
title="Prédiction de survie sur le Titanic",
description=
"Application de prédiction de survie sur le Titanic 🚢 <br>Une version par API pour faciliter la réutilisation du modèle 🚀" +\
"<br><br><img src=\"https://media.vogue.fr/photos/5faac06d39c5194ff9752ec9/1:1/w_2404,h_2404,c_limit/076_CHL_126884.jpg\" width=\"200\">"
)


@app.get("/", tags=["Welcome"])
def show_welcome_page():
"""
Show welcome page with model name and version.
"""

return {
"Message": "API de prédiction de survie sur le Titanic",
"Model_name": 'Titanic ML',
"Model_version": "0.1",
}


@app.get("/predict", tags=["Predict"])
async def predict(
sex: str = "female",
age: float = 29.0,
fare: float = 16.5,
embarked: str = "S"
) -> str:
"""
"""

df = pd.DataFrame(
{
"Sex": [sex],
"Age": [age],
"Fare": [fare],
"Embarked": [embarked],
}
)

prediction = "Survived 🎉" if int(model.predict(df)) == 1 else "Dead ⚰️"

return prediction

0 comments on commit 0f2a4d2

Please sign in to comment.