docs: README bilingue FR/EN
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
ee09ba686b
commit
eba571a936
2 changed files with 412 additions and 154 deletions
256
README.fr.md
Normal file
256
README.fr.md
Normal file
|
|
@ -0,0 +1,256 @@
|
||||||
|
**Source de vérité** : https://git.gregoiremureau.com/openclassroom-ai/oc-p11-bigdata-fruits
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://git.gregoiremureau.com/openclassroom-ai/oc-p11-bigdata-fruits.git
|
||||||
|
git clone https://git.gregoiremureau.com/openclassroom-ai/oc-p11-bigdata-fruits.git
|
||||||
|
```
|
||||||
|
|
||||||
|
Dataset : voir `fetch-data.sh` (hors git si volumineux).
|
||||||
|
|
||||||
|
# Projet de Traitement Big Data sur le Cloud - Fruits!
|
||||||
|
|
||||||
|
📘 Ce projet est également disponible en [anglais 🇬🇧](./README.md)
|
||||||
|
|
||||||
|
## 📋 Contexte du projet
|
||||||
|
|
||||||
|
Ce projet a été réalisé dans le cadre d'une mission de consulting pour **Fruits!**, une jeune start-up AgriTech qui développe des solutions innovantes pour la récolte des fruits. L'entreprise souhaite préserver la biodiversité des fruits en permettant des traitements spécifiques pour chaque espèce grâce au développement de robots cueilleurs intelligents.
|
||||||
|
|
||||||
|
## 🎯 Objectifs
|
||||||
|
|
||||||
|
Compléter une chaîne de traitement d'extraction de features dans un environnement Big Data sur le cloud AWS :
|
||||||
|
|
||||||
|
1. **Reprise des travaux** : S'approprier le notebook incomplet d'un alternant précédent
|
||||||
|
2. **Complétion de la pipeline** : Implémenter les parties manquantes (broadcast des poids, PCA distribuée)
|
||||||
|
3. **Mise en production** : Déployer la solution sur un cluster AWS EMR conforme au RGPD
|
||||||
|
4. **Optimisation des coûts** : Maintenir les coûts d'exécution sous 10€
|
||||||
|
|
||||||
|
L'objectif à long terme est de mettre en place un moteur de classification des images de fruits pour une application mobile de sensibilisation du grand public.
|
||||||
|
|
||||||
|
## 📊 Données
|
||||||
|
|
||||||
|
Le jeu de données utilisé est **Fruits-360**, disponible sur Kaggle :
|
||||||
|
- **147 691 images** de fruits de différentes variétés
|
||||||
|
- Format : 100x100 pixels, couleur
|
||||||
|
- Jeu de test spécifique : 103 images de fruits multiples
|
||||||
|
- **⚠️ Note importante** : Le jeu de données n'est pas inclus dans ce dépôt en raison de sa taille
|
||||||
|
- **URL** : https://www.kaggle.com/moltean/fruits
|
||||||
|
|
||||||
|
## 📁 Structure du projet
|
||||||
|
|
||||||
|
```
|
||||||
|
├── P11_01_notebook.ipynb
|
||||||
|
├── P11_02_images/
|
||||||
|
│ ├── Results_PCA/ # Résultats PCA au format Parquet
|
||||||
|
│ │ ├── part-00000-*.parquet
|
||||||
|
│ │ ├── part-00001-*.parquet
|
||||||
|
│ │ └── ...
|
||||||
|
│ └── test-multiple-fruits/ # Images de test (103 images)
|
||||||
|
│ ├── apple.jpg
|
||||||
|
│ ├── apples1.jpg
|
||||||
|
│ └── ...
|
||||||
|
└── P11_03_présentation.pdf
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1. `P11_01_notebook.ipynb`
|
||||||
|
|
||||||
|
**Notebook principal de traitement Big Data PySpark**
|
||||||
|
|
||||||
|
Ce notebook contient la chaîne complète de traitement :
|
||||||
|
|
||||||
|
- **Initialisation** : Configuration de la SparkSession et connexion à S3
|
||||||
|
- **Chargement des données** : Lecture des images depuis S3 en format binaire
|
||||||
|
- **Transfer Learning** : Extraction de features via MobileNetV2 pré-entraîné sur ImageNet
|
||||||
|
- Suppression de la couche de classification finale
|
||||||
|
- Extraction de vecteurs de 1280 dimensions
|
||||||
|
- Broadcast des poids du modèle aux workers (ajout critique)
|
||||||
|
- **Réduction de dimensionnalité** : PCA distribuée avec Spark ML
|
||||||
|
- Réduction de 1280 → 70 dimensions
|
||||||
|
- Conservation de 99,94% de la variance
|
||||||
|
- Optimisation du stockage et des performances
|
||||||
|
- **Export des résultats** : Sauvegarde au format Parquet sur S3
|
||||||
|
|
||||||
|
**Optimisations clés implémentées** :
|
||||||
|
- Pandas UDF Scalar Iterator pour traitement par batch
|
||||||
|
- Broadcast des poids du modèle pour éviter les chargements répétitifs
|
||||||
|
- PCA distribuée avec calcul parallélisé sur le cluster
|
||||||
|
|
||||||
|
### 2. `P11_02_images/`
|
||||||
|
|
||||||
|
**Dossier des images et résultats**
|
||||||
|
|
||||||
|
- **Results_PCA/** : Résultats de la réduction de dimensionnalité stockés au format Parquet distribué (20 fichiers)
|
||||||
|
- **test-multiple-fruits/** : 103 images de test variées utilisées pour valider la pipeline
|
||||||
|
|
||||||
|
### 3. `P11_03_présentation.pdf`
|
||||||
|
|
||||||
|
**Présentation des résultats**
|
||||||
|
|
||||||
|
Cette présentation synthétise :
|
||||||
|
- Le contexte et les enjeux du projet
|
||||||
|
- L'architecture cloud mise en place (AWS EMR, S3, EC2)
|
||||||
|
- La configuration du cluster et les optimisations Spark
|
||||||
|
- Le pipeline algorithmique complet
|
||||||
|
- Les résultats techniques obtenus
|
||||||
|
- Les perspectives d'amélioration et de déploiement
|
||||||
|
|
||||||
|
## 🛠️ Technologies utilisées
|
||||||
|
|
||||||
|
### Cloud & Infrastructure
|
||||||
|
- **AWS EMR** : Cluster de calcul distribué (Spark, Hadoop)
|
||||||
|
- **AWS S3** : Stockage des données et résultats
|
||||||
|
- **AWS EC2** : Instances m5.xlarge (1 Master + 2 Workers)
|
||||||
|
- **Région EU-West-3** (Paris) : Conformité RGPD
|
||||||
|
|
||||||
|
### Big Data & Traitement
|
||||||
|
- **PySpark** : Framework de calcul distribué
|
||||||
|
- **Hadoop** : Système de fichiers distribué
|
||||||
|
- **Spark ML** : Bibliothèque de Machine Learning distribuée
|
||||||
|
|
||||||
|
### Machine Learning
|
||||||
|
- **TensorFlow** : Framework de deep learning
|
||||||
|
- **MobileNetV2** : Modèle de transfer learning pré-entraîné sur ImageNet
|
||||||
|
- **PCA** : Algorithme de réduction de dimensionnalité
|
||||||
|
|
||||||
|
### Outils de développement
|
||||||
|
- **JupyterHub** : Environnement de développement sur le cluster
|
||||||
|
- **SSH Tunneling** : Accès sécurisé au cluster
|
||||||
|
- **Python 3** : Langage de programmation
|
||||||
|
|
||||||
|
## 📈 Architecture technique
|
||||||
|
|
||||||
|
### Configuration du Cluster EMR
|
||||||
|
|
||||||
|
**Instances** :
|
||||||
|
- 1 nœud Master (driver Spark) - m5.xlarge
|
||||||
|
- 2 nœuds Workers (executors Spark) - m5.xlarge
|
||||||
|
- Région : eu-west-3 (Paris)
|
||||||
|
|
||||||
|
**Logiciels installés** :
|
||||||
|
- Hadoop 3.2.1
|
||||||
|
- Spark 3.1.2
|
||||||
|
- JupyterHub 1.4.1
|
||||||
|
- TensorFlow 2.4.1
|
||||||
|
|
||||||
|
**Bootstrap** : Installation automatique des packages Python
|
||||||
|
```bash
|
||||||
|
sudo python3 -m pip install numpy pandas pillow pyarrow fsspec s3fs
|
||||||
|
```
|
||||||
|
|
||||||
|
### Accès Sécurisé
|
||||||
|
|
||||||
|
**Tunneling SSH avec Port Forwarding** :
|
||||||
|
```bash
|
||||||
|
ssh -i ./emr-keypair.pem -L 8890:localhost:8890 -L 9443:localhost:9443 hadoop@[IP-EMR]
|
||||||
|
```
|
||||||
|
- Port 9443 : JupyterHub (développement)
|
||||||
|
- Port 8890 : Interface monitoring Spark
|
||||||
|
|
||||||
|
**Avantages** :
|
||||||
|
- Connexion chiffrée de bout en bout
|
||||||
|
- Pas de proxy externe nécessaire
|
||||||
|
- Contrôle précis des accès
|
||||||
|
|
||||||
|
### Pipeline de Traitement
|
||||||
|
|
||||||
|
1. **Chargement des images** : Format binaire depuis S3, extraction des labels depuis les chemins
|
||||||
|
2. **Transfer Learning** : MobileNetV2 → features 1280 dimensions
|
||||||
|
- Broadcast des poids pour distribution efficace
|
||||||
|
- Pandas UDF Scalar Iterator pour traitement par batch
|
||||||
|
3. **PCA Distribuée** : Réduction 1280 → 70 dimensions
|
||||||
|
- Calcul distribué de la matrice de covariance
|
||||||
|
- Extraction des composantes principales
|
||||||
|
- Transformation des features
|
||||||
|
4. **Export** : Sauvegarde au format Parquet sur S3
|
||||||
|
|
||||||
|
## 📝 Méthodologie
|
||||||
|
|
||||||
|
1. **Compréhension** : Analyse du notebook existant et identification des manques
|
||||||
|
2. **Développement local** : Tests et validation sur échantillon réduit
|
||||||
|
3. **Migration cloud** : Déploiement sur cluster EMR
|
||||||
|
4. **Optimisation** : Ajout du broadcast et de la PCA distribuée
|
||||||
|
5. **Validation** : Tests sur 103 images, vérification de la scalabilité
|
||||||
|
|
||||||
|
## 💰 Gestion des coûts
|
||||||
|
|
||||||
|
**Objectif** : < 10€ pour la validation
|
||||||
|
|
||||||
|
**Stratégies d'optimisation** :
|
||||||
|
- Utilisation d'un cluster modeste (1 Master + 2 Workers)
|
||||||
|
- Instances m5.xlarge (compromis performance/coût)
|
||||||
|
- Tests sur échantillon réduit avant passage à l'échelle
|
||||||
|
- Arrêt du cluster après utilisation
|
||||||
|
- Serveur local pour développement et tests
|
||||||
|
|
||||||
|
**Résultat** : Coût de validation < 5€ (moins d'1h de cluster)
|
||||||
|
|
||||||
|
## 🎯 Résultats
|
||||||
|
|
||||||
|
### Techniques
|
||||||
|
|
||||||
|
- ✅ Réduction de dimensionnalité : 1280 → 70 dimensions
|
||||||
|
- ✅ Variance conservée : **99,94%**
|
||||||
|
- ✅ Facteur de compression : **x4,1**
|
||||||
|
- ✅ Pipeline complète et fonctionnelle
|
||||||
|
- ✅ Architecture scalable validée
|
||||||
|
|
||||||
|
### Conformité
|
||||||
|
|
||||||
|
- ✅ **RGPD** : Région EU-West-3 (Paris)
|
||||||
|
- ✅ **Sécurité** : Accès SSH, tunneling sécurisé
|
||||||
|
- ✅ **Coûts** : < 10€ pour la validation
|
||||||
|
|
||||||
|
### Fonctionnalités implémentées
|
||||||
|
|
||||||
|
- ✅ Broadcast des poids MobileNetV2 (manquant dans version initiale)
|
||||||
|
- ✅ PCA distribuée avec Spark ML (manquant dans version initiale)
|
||||||
|
- ✅ Optimisation mémoire avec Pandas UDF Scalar Iterator
|
||||||
|
- ✅ Export des résultats au format Parquet
|
||||||
|
|
||||||
|
## 🚀 Perspectives
|
||||||
|
|
||||||
|
### Court terme
|
||||||
|
|
||||||
|
**Optimisation de la PCA** :
|
||||||
|
- 70 composantes valables pour 103 images de test
|
||||||
|
- Avec dataset complet (~150k images), ajuster le nombre de composantes k
|
||||||
|
- Tester différentes valeurs pour optimiser variance/dimensions
|
||||||
|
|
||||||
|
**Classification finale** :
|
||||||
|
- Entraîner un modèle de classification sur les features PCA
|
||||||
|
- Évaluer les performances sur le jeu de test
|
||||||
|
- Fine-tuning du nombre de composantes
|
||||||
|
|
||||||
|
### Moyen terme
|
||||||
|
|
||||||
|
**Déploiement production** :
|
||||||
|
- Intégration du modèle dans l'application mobile
|
||||||
|
- Pipeline CI/CD automatisée
|
||||||
|
- Monitoring des performances en temps réel
|
||||||
|
- Gestion des versions du modèle
|
||||||
|
|
||||||
|
### Long terme
|
||||||
|
|
||||||
|
**Extensions futures** :
|
||||||
|
- Utilisation de l'application comme MVP marketing et technique
|
||||||
|
- Collecte de nouvelles données terrain
|
||||||
|
- Amélioration continue du modèle
|
||||||
|
- Intégration avec les robots cueilleurs intelligents
|
||||||
|
|
||||||
|
## 🎓 Compétences développées
|
||||||
|
|
||||||
|
- Architecture Big Data sur le cloud (AWS EMR, S3, EC2)
|
||||||
|
- Traitement distribué avec PySpark
|
||||||
|
- Transfer Learning et extraction de features
|
||||||
|
- Réduction de dimensionnalité à grande échelle
|
||||||
|
- Optimisation des performances Spark
|
||||||
|
- Gestion des coûts cloud
|
||||||
|
- Conformité RGPD pour le stockage de données
|
||||||
|
|
||||||
|
## 👤 Auteur
|
||||||
|
|
||||||
|
**Grégoire Mureau**
|
||||||
|
Date de réalisation : Octobre 2025
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Ce projet a été réalisé dans le cadre du parcours AI Engineer*
|
||||||
310
README.md
310
README.md
|
|
@ -1,48 +1,50 @@
|
||||||
**Source de vérité** : https://git.gregoiremureau.com/openclassroom-ai/oc-p11-bigdata-fruits
|
**Source of truth** : https://git.gregoiremureau.com/openclassroom-ai/oc-p11-bigdata-fruits
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://git.gregoiremureau.com/openclassroom-ai/oc-p11-bigdata-fruits.git
|
git clone https://git.gregoiremureau.com/openclassroom-ai/oc-p11-bigdata-fruits.git
|
||||||
git clone https://git.gregoiremureau.com/openclassroom-ai/oc-p11-bigdata-fruits.git
|
git clone https://git.gregoiremureau.com/openclassroom-ai/oc-p11-bigdata-fruits.git
|
||||||
```
|
```
|
||||||
|
|
||||||
Dataset : voir `fetch-data.sh` (hors git si volumineux).
|
Dataset: see `fetch-data.sh` (excluded from git if large).
|
||||||
|
|
||||||
# Projet de Traitement Big Data sur le Cloud - Fruits!
|
# Big Data Cloud Processing Project - Fruits!
|
||||||
|
|
||||||
## 📋 Contexte du projet
|
📘 This project is also available in [French 🇫🇷](./README.fr.md)
|
||||||
|
|
||||||
Ce projet a été réalisé dans le cadre d'une mission de consulting pour **Fruits!**, une jeune start-up AgriTech qui développe des solutions innovantes pour la récolte des fruits. L'entreprise souhaite préserver la biodiversité des fruits en permettant des traitements spécifiques pour chaque espèce grâce au développement de robots cueilleurs intelligents.
|
## 📋 Project Context
|
||||||
|
|
||||||
## 🎯 Objectifs
|
This project was carried out as part of a consulting assignment for **Fruits!**, a young AgriTech start-up developing innovative solutions for fruit harvesting. The company aims to preserve fruit biodiversity by enabling species-specific processing through the development of intelligent harvesting robots.
|
||||||
|
|
||||||
Compléter une chaîne de traitement d'extraction de features dans un environnement Big Data sur le cloud AWS :
|
## 🎯 Objectives
|
||||||
|
|
||||||
1. **Reprise des travaux** : S'approprier le notebook incomplet d'un alternant précédent
|
Complete a feature extraction processing pipeline in a Big Data environment on the AWS cloud:
|
||||||
2. **Complétion de la pipeline** : Implémenter les parties manquantes (broadcast des poids, PCA distribuée)
|
|
||||||
3. **Mise en production** : Déployer la solution sur un cluster AWS EMR conforme au RGPD
|
|
||||||
4. **Optimisation des coûts** : Maintenir les coûts d'exécution sous 10€
|
|
||||||
|
|
||||||
L'objectif à long terme est de mettre en place un moteur de classification des images de fruits pour une application mobile de sensibilisation du grand public.
|
1. **Resuming the work** : Take over the incomplete notebook left by a previous apprentice
|
||||||
|
2. **Completing the pipeline** : Implement the missing parts (weight broadcasting, distributed PCA)
|
||||||
|
3. **Production deployment** : Deploy the solution on a GDPR-compliant AWS EMR cluster
|
||||||
|
4. **Cost optimization** : Keep execution costs under €10
|
||||||
|
|
||||||
## 📊 Données
|
The long-term objective is to build a fruit image classification engine for a mobile app raising public awareness.
|
||||||
|
|
||||||
Le jeu de données utilisé est **Fruits-360**, disponible sur Kaggle :
|
## 📊 Data
|
||||||
- **147 691 images** de fruits de différentes variétés
|
|
||||||
- Format : 100x100 pixels, couleur
|
The dataset used is **Fruits-360**, available on Kaggle:
|
||||||
- Jeu de test spécifique : 103 images de fruits multiples
|
- **147,691 images** of fruits of different varieties
|
||||||
- **⚠️ Note importante** : Le jeu de données n'est pas inclus dans ce dépôt en raison de sa taille
|
- Format: 100x100 pixels, color
|
||||||
|
- Specific test set: 103 images of multiple fruits
|
||||||
|
- **⚠️ Important note** : The dataset is not included in this repository due to its size
|
||||||
- **URL** : https://www.kaggle.com/moltean/fruits
|
- **URL** : https://www.kaggle.com/moltean/fruits
|
||||||
|
|
||||||
## 📁 Structure du projet
|
## 📁 Project Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
├── P11_01_notebook.ipynb
|
├── P11_01_notebook.ipynb
|
||||||
├── P11_02_images/
|
├── P11_02_images/
|
||||||
│ ├── Results_PCA/ # Résultats PCA au format Parquet
|
│ ├── Results_PCA/ # PCA results in Parquet format
|
||||||
│ │ ├── part-00000-*.parquet
|
│ │ ├── part-00000-*.parquet
|
||||||
│ │ ├── part-00001-*.parquet
|
│ │ ├── part-00001-*.parquet
|
||||||
│ │ └── ...
|
│ │ └── ...
|
||||||
│ └── test-multiple-fruits/ # Images de test (103 images)
|
│ └── test-multiple-fruits/ # Test images (103 images)
|
||||||
│ ├── apple.jpg
|
│ ├── apple.jpg
|
||||||
│ ├── apples1.jpg
|
│ ├── apples1.jpg
|
||||||
│ └── ...
|
│ └── ...
|
||||||
|
|
@ -51,204 +53,204 @@ Le jeu de données utilisé est **Fruits-360**, disponible sur Kaggle :
|
||||||
|
|
||||||
### 1. `P11_01_notebook.ipynb`
|
### 1. `P11_01_notebook.ipynb`
|
||||||
|
|
||||||
**Notebook principal de traitement Big Data PySpark**
|
**Main PySpark Big Data processing notebook**
|
||||||
|
|
||||||
Ce notebook contient la chaîne complète de traitement :
|
This notebook contains the complete processing pipeline:
|
||||||
|
|
||||||
- **Initialisation** : Configuration de la SparkSession et connexion à S3
|
- **Initialization** : SparkSession configuration and S3 connection
|
||||||
- **Chargement des données** : Lecture des images depuis S3 en format binaire
|
- **Data loading** : Reading images from S3 in binary format
|
||||||
- **Transfer Learning** : Extraction de features via MobileNetV2 pré-entraîné sur ImageNet
|
- **Transfer Learning** : Feature extraction via MobileNetV2 pre-trained on ImageNet
|
||||||
- Suppression de la couche de classification finale
|
- Removal of the final classification layer
|
||||||
- Extraction de vecteurs de 1280 dimensions
|
- Extraction of 1280-dimensional vectors
|
||||||
- Broadcast des poids du modèle aux workers (ajout critique)
|
- Broadcasting the model weights to the workers (critical addition)
|
||||||
- **Réduction de dimensionnalité** : PCA distribuée avec Spark ML
|
- **Dimensionality reduction** : Distributed PCA with Spark ML
|
||||||
- Réduction de 1280 → 70 dimensions
|
- Reduction from 1280 → 70 dimensions
|
||||||
- Conservation de 99,94% de la variance
|
- 99.94% of variance retained
|
||||||
- Optimisation du stockage et des performances
|
- Storage and performance optimization
|
||||||
- **Export des résultats** : Sauvegarde au format Parquet sur S3
|
- **Results export** : Saving in Parquet format on S3
|
||||||
|
|
||||||
**Optimisations clés implémentées** :
|
**Key optimizations implemented** :
|
||||||
- Pandas UDF Scalar Iterator pour traitement par batch
|
- Pandas UDF Scalar Iterator for batch processing
|
||||||
- Broadcast des poids du modèle pour éviter les chargements répétitifs
|
- Broadcasting the model weights to avoid repeated loading
|
||||||
- PCA distribuée avec calcul parallélisé sur le cluster
|
- Distributed PCA with parallelized computation on the cluster
|
||||||
|
|
||||||
### 2. `P11_02_images/`
|
### 2. `P11_02_images/`
|
||||||
|
|
||||||
**Dossier des images et résultats**
|
**Images and results folder**
|
||||||
|
|
||||||
- **Results_PCA/** : Résultats de la réduction de dimensionnalité stockés au format Parquet distribué (20 fichiers)
|
- **Results_PCA/** : Dimensionality reduction results stored in distributed Parquet format (20 files)
|
||||||
- **test-multiple-fruits/** : 103 images de test variées utilisées pour valider la pipeline
|
- **test-multiple-fruits/** : 103 varied test images used to validate the pipeline
|
||||||
|
|
||||||
### 3. `P11_03_présentation.pdf`
|
### 3. `P11_03_présentation.pdf`
|
||||||
|
|
||||||
**Présentation des résultats**
|
**Results presentation**
|
||||||
|
|
||||||
Cette présentation synthétise :
|
This presentation summarizes:
|
||||||
- Le contexte et les enjeux du projet
|
- The context and challenges of the project
|
||||||
- L'architecture cloud mise en place (AWS EMR, S3, EC2)
|
- The cloud architecture put in place (AWS EMR, S3, EC2)
|
||||||
- La configuration du cluster et les optimisations Spark
|
- The cluster configuration and Spark optimizations
|
||||||
- Le pipeline algorithmique complet
|
- The complete algorithmic pipeline
|
||||||
- Les résultats techniques obtenus
|
- The technical results obtained
|
||||||
- Les perspectives d'amélioration et de déploiement
|
- The improvement and deployment perspectives
|
||||||
|
|
||||||
## 🛠️ Technologies utilisées
|
## 🛠️ Technologies Used
|
||||||
|
|
||||||
### Cloud & Infrastructure
|
### Cloud & Infrastructure
|
||||||
- **AWS EMR** : Cluster de calcul distribué (Spark, Hadoop)
|
- **AWS EMR** : Distributed computing cluster (Spark, Hadoop)
|
||||||
- **AWS S3** : Stockage des données et résultats
|
- **AWS S3** : Storage of data and results
|
||||||
- **AWS EC2** : Instances m5.xlarge (1 Master + 2 Workers)
|
- **AWS EC2** : m5.xlarge instances (1 Master + 2 Workers)
|
||||||
- **Région EU-West-3** (Paris) : Conformité RGPD
|
- **EU-West-3 Region** (Paris) : GDPR compliance
|
||||||
|
|
||||||
### Big Data & Traitement
|
### Big Data & Processing
|
||||||
- **PySpark** : Framework de calcul distribué
|
- **PySpark** : Distributed computing framework
|
||||||
- **Hadoop** : Système de fichiers distribué
|
- **Hadoop** : Distributed file system
|
||||||
- **Spark ML** : Bibliothèque de Machine Learning distribuée
|
- **Spark ML** : Distributed Machine Learning library
|
||||||
|
|
||||||
### Machine Learning
|
### Machine Learning
|
||||||
- **TensorFlow** : Framework de deep learning
|
- **TensorFlow** : Deep learning framework
|
||||||
- **MobileNetV2** : Modèle de transfer learning pré-entraîné sur ImageNet
|
- **MobileNetV2** : Transfer learning model pre-trained on ImageNet
|
||||||
- **PCA** : Algorithme de réduction de dimensionnalité
|
- **PCA** : Dimensionality reduction algorithm
|
||||||
|
|
||||||
### Outils de développement
|
### Development Tools
|
||||||
- **JupyterHub** : Environnement de développement sur le cluster
|
- **JupyterHub** : Development environment on the cluster
|
||||||
- **SSH Tunneling** : Accès sécurisé au cluster
|
- **SSH Tunneling** : Secure access to the cluster
|
||||||
- **Python 3** : Langage de programmation
|
- **Python 3** : Programming language
|
||||||
|
|
||||||
## 📈 Architecture technique
|
## 📈 Technical Architecture
|
||||||
|
|
||||||
### Configuration du Cluster EMR
|
### EMR Cluster Configuration
|
||||||
|
|
||||||
**Instances** :
|
**Instances** :
|
||||||
- 1 nœud Master (driver Spark) - m5.xlarge
|
- 1 Master node (Spark driver) - m5.xlarge
|
||||||
- 2 nœuds Workers (executors Spark) - m5.xlarge
|
- 2 Worker nodes (Spark executors) - m5.xlarge
|
||||||
- Région : eu-west-3 (Paris)
|
- Region: eu-west-3 (Paris)
|
||||||
|
|
||||||
**Logiciels installés** :
|
**Installed software** :
|
||||||
- Hadoop 3.2.1
|
- Hadoop 3.2.1
|
||||||
- Spark 3.1.2
|
- Spark 3.1.2
|
||||||
- JupyterHub 1.4.1
|
- JupyterHub 1.4.1
|
||||||
- TensorFlow 2.4.1
|
- TensorFlow 2.4.1
|
||||||
|
|
||||||
**Bootstrap** : Installation automatique des packages Python
|
**Bootstrap** : Automatic installation of Python packages
|
||||||
```bash
|
```bash
|
||||||
sudo python3 -m pip install numpy pandas pillow pyarrow fsspec s3fs
|
sudo python3 -m pip install numpy pandas pillow pyarrow fsspec s3fs
|
||||||
```
|
```
|
||||||
|
|
||||||
### Accès Sécurisé
|
### Secure Access
|
||||||
|
|
||||||
**Tunneling SSH avec Port Forwarding** :
|
**SSH Tunneling with Port Forwarding** :
|
||||||
```bash
|
```bash
|
||||||
ssh -i ./emr-keypair.pem -L 8890:localhost:8890 -L 9443:localhost:9443 hadoop@[IP-EMR]
|
ssh -i ./emr-keypair.pem -L 8890:localhost:8890 -L 9443:localhost:9443 hadoop@[IP-EMR]
|
||||||
```
|
```
|
||||||
- Port 9443 : JupyterHub (développement)
|
- Port 9443: JupyterHub (development)
|
||||||
- Port 8890 : Interface monitoring Spark
|
- Port 8890: Spark monitoring interface
|
||||||
|
|
||||||
**Avantages** :
|
**Advantages** :
|
||||||
- Connexion chiffrée de bout en bout
|
- End-to-end encrypted connection
|
||||||
- Pas de proxy externe nécessaire
|
- No external proxy required
|
||||||
- Contrôle précis des accès
|
- Precise access control
|
||||||
|
|
||||||
### Pipeline de Traitement
|
### Processing Pipeline
|
||||||
|
|
||||||
1. **Chargement des images** : Format binaire depuis S3, extraction des labels depuis les chemins
|
1. **Image loading** : Binary format from S3, label extraction from paths
|
||||||
2. **Transfer Learning** : MobileNetV2 → features 1280 dimensions
|
2. **Transfer Learning** : MobileNetV2 → 1280-dimension features
|
||||||
- Broadcast des poids pour distribution efficace
|
- Broadcasting weights for efficient distribution
|
||||||
- Pandas UDF Scalar Iterator pour traitement par batch
|
- Pandas UDF Scalar Iterator for batch processing
|
||||||
3. **PCA Distribuée** : Réduction 1280 → 70 dimensions
|
3. **Distributed PCA** : Reduction from 1280 → 70 dimensions
|
||||||
- Calcul distribué de la matrice de covariance
|
- Distributed computation of the covariance matrix
|
||||||
- Extraction des composantes principales
|
- Extraction of principal components
|
||||||
- Transformation des features
|
- Feature transformation
|
||||||
4. **Export** : Sauvegarde au format Parquet sur S3
|
4. **Export** : Saving in Parquet format on S3
|
||||||
|
|
||||||
## 📝 Méthodologie
|
## 📝 Methodology
|
||||||
|
|
||||||
1. **Compréhension** : Analyse du notebook existant et identification des manques
|
1. **Understanding** : Analysis of the existing notebook and identification of gaps
|
||||||
2. **Développement local** : Tests et validation sur échantillon réduit
|
2. **Local development** : Testing and validation on a reduced sample
|
||||||
3. **Migration cloud** : Déploiement sur cluster EMR
|
3. **Cloud migration** : Deployment on the EMR cluster
|
||||||
4. **Optimisation** : Ajout du broadcast et de la PCA distribuée
|
4. **Optimization** : Adding weight broadcasting and distributed PCA
|
||||||
5. **Validation** : Tests sur 103 images, vérification de la scalabilité
|
5. **Validation** : Testing on 103 images, scalability verification
|
||||||
|
|
||||||
## 💰 Gestion des coûts
|
## 💰 Cost Management
|
||||||
|
|
||||||
**Objectif** : < 10€ pour la validation
|
**Objective** : < €10 for validation
|
||||||
|
|
||||||
**Stratégies d'optimisation** :
|
**Optimization strategies** :
|
||||||
- Utilisation d'un cluster modeste (1 Master + 2 Workers)
|
- Use of a modest cluster (1 Master + 2 Workers)
|
||||||
- Instances m5.xlarge (compromis performance/coût)
|
- m5.xlarge instances (performance/cost trade-off)
|
||||||
- Tests sur échantillon réduit avant passage à l'échelle
|
- Testing on a reduced sample before scaling
|
||||||
- Arrêt du cluster après utilisation
|
- Shutting down the cluster after use
|
||||||
- Serveur local pour développement et tests
|
- Local server for development and testing
|
||||||
|
|
||||||
**Résultat** : Coût de validation < 5€ (moins d'1h de cluster)
|
**Result** : Validation cost < €5 (less than 1h of cluster time)
|
||||||
|
|
||||||
## 🎯 Résultats
|
## 🎯 Results
|
||||||
|
|
||||||
### Techniques
|
### Technical
|
||||||
|
|
||||||
- ✅ Réduction de dimensionnalité : 1280 → 70 dimensions
|
- ✅ Dimensionality reduction: 1280 → 70 dimensions
|
||||||
- ✅ Variance conservée : **99,94%**
|
- ✅ Variance retained: **99.94%**
|
||||||
- ✅ Facteur de compression : **x4,1**
|
- ✅ Compression factor: **x4.1**
|
||||||
- ✅ Pipeline complète et fonctionnelle
|
- ✅ Complete and functional pipeline
|
||||||
- ✅ Architecture scalable validée
|
- ✅ Validated scalable architecture
|
||||||
|
|
||||||
### Conformité
|
### Compliance
|
||||||
|
|
||||||
- ✅ **RGPD** : Région EU-West-3 (Paris)
|
- ✅ **GDPR** : EU-West-3 Region (Paris)
|
||||||
- ✅ **Sécurité** : Accès SSH, tunneling sécurisé
|
- ✅ **Security** : SSH access, secure tunneling
|
||||||
- ✅ **Coûts** : < 10€ pour la validation
|
- ✅ **Costs** : < €10 for validation
|
||||||
|
|
||||||
### Fonctionnalités implémentées
|
### Implemented features
|
||||||
|
|
||||||
- ✅ Broadcast des poids MobileNetV2 (manquant dans version initiale)
|
- ✅ MobileNetV2 weight broadcasting (missing in the initial version)
|
||||||
- ✅ PCA distribuée avec Spark ML (manquant dans version initiale)
|
- ✅ Distributed PCA with Spark ML (missing in the initial version)
|
||||||
- ✅ Optimisation mémoire avec Pandas UDF Scalar Iterator
|
- ✅ Memory optimization with Pandas UDF Scalar Iterator
|
||||||
- ✅ Export des résultats au format Parquet
|
- ✅ Results export in Parquet format
|
||||||
|
|
||||||
## 🚀 Perspectives
|
## 🚀 Outlook
|
||||||
|
|
||||||
### Court terme
|
### Short term
|
||||||
|
|
||||||
**Optimisation de la PCA** :
|
**PCA optimization** :
|
||||||
- 70 composantes valables pour 103 images de test
|
- 70 components valid for 103 test images
|
||||||
- Avec dataset complet (~150k images), ajuster le nombre de composantes k
|
- With the full dataset (~150k images), adjust the number of components k
|
||||||
- Tester différentes valeurs pour optimiser variance/dimensions
|
- Test different values to optimize variance/dimensions
|
||||||
|
|
||||||
**Classification finale** :
|
**Final classification** :
|
||||||
- Entraîner un modèle de classification sur les features PCA
|
- Train a classification model on the PCA features
|
||||||
- Évaluer les performances sur le jeu de test
|
- Evaluate performance on the test set
|
||||||
- Fine-tuning du nombre de composantes
|
- Fine-tuning the number of components
|
||||||
|
|
||||||
### Moyen terme
|
### Medium term
|
||||||
|
|
||||||
**Déploiement production** :
|
**Production deployment** :
|
||||||
- Intégration du modèle dans l'application mobile
|
- Integration of the model into the mobile application
|
||||||
- Pipeline CI/CD automatisée
|
- Automated CI/CD pipeline
|
||||||
- Monitoring des performances en temps réel
|
- Real-time performance monitoring
|
||||||
- Gestion des versions du modèle
|
- Model version management
|
||||||
|
|
||||||
### Long terme
|
### Long term
|
||||||
|
|
||||||
**Extensions futures** :
|
**Future extensions** :
|
||||||
- Utilisation de l'application comme MVP marketing et technique
|
- Using the application as a marketing and technical MVP
|
||||||
- Collecte de nouvelles données terrain
|
- Collecting new field data
|
||||||
- Amélioration continue du modèle
|
- Continuous model improvement
|
||||||
- Intégration avec les robots cueilleurs intelligents
|
- Integration with intelligent harvesting robots
|
||||||
|
|
||||||
## 🎓 Compétences développées
|
## 🎓 Skills Developed
|
||||||
|
|
||||||
- Architecture Big Data sur le cloud (AWS EMR, S3, EC2)
|
- Big Data architecture on the cloud (AWS EMR, S3, EC2)
|
||||||
- Traitement distribué avec PySpark
|
- Distributed processing with PySpark
|
||||||
- Transfer Learning et extraction de features
|
- Transfer Learning and feature extraction
|
||||||
- Réduction de dimensionnalité à grande échelle
|
- Large-scale dimensionality reduction
|
||||||
- Optimisation des performances Spark
|
- Spark performance optimization
|
||||||
- Gestion des coûts cloud
|
- Cloud cost management
|
||||||
- Conformité RGPD pour le stockage de données
|
- GDPR compliance for data storage
|
||||||
|
|
||||||
## 👤 Auteur
|
## 👤 Author
|
||||||
|
|
||||||
**Grégoire Mureau**
|
**Grégoire Mureau**
|
||||||
Date de réalisation : Octobre 2025
|
Completion date: October 2025
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*Ce projet a été réalisé dans le cadre du parcours AI Engineer*
|
*This project was carried out as part of the AI Engineer program*
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue