|
|
|
|
| Sistema de Aprendizado Federado (FL) para prever consumo de combustível usando dados de sensores OBD de diferentes veículos, mantendo a privacidade dos dados em cada cliente.
|
|
|
|
|
|
|
| Este projeto implementa um sistema de Aprendizado Federado usando o framework Flower, onde:
|
| - **3 clientes** (Ubuntu) representam diferentes veículos com seus dados locais
|
| - **1 servidor** (Windows) coordena o treinamento sem acessar os dados brutos
|
| - Modelo LSTM para previsão de séries temporais de consumo (P_kW)
|
| - Múltiplas estratégias de agregação: FedAvg, FedAdam, FedYogi, FedAdagrad
|
|
|
|
|
|
|
| ```
|
| ┌─────────────────┐
|
| │ Servidor (Win) │
|
| │ 16GB RAM │
|
| │ Porta: 8080 │
|
| └────────┬────────┘
|
| │
|
| ┌────┴────┬──────────┐
|
| │ │ │
|
| ┌───▼───┐ ┌──▼───┐ ┌────▼───┐
|
| │Cliente│ │Cliente│ │Cliente │
|
| │ 1 │ │ 2 │ │ 3 │
|
| │Ubuntu │ │Ubuntu│ │Ubuntu │
|
| │ 8GB │ │ 8GB │ │ 8GB │
|
| └───────┘ └──────┘ └────────┘
|
| ```
|
|
|
|
|
|
|
| ```
|
| fl_project/
|
| ├── data/
|
| │ ├── client_1/
|
| │ │ ├── percurso_1.csv
|
| │ │ ├── percurso_2.csv
|
| │ │ └── ...
|
| │ ├── client_2/
|
| │ └── client_3/
|
| ├── server.py
|
| ├── client.py
|
| ├── utils.py
|
| ├── analysis_tool.py
|
| ├── run.sh
|
| ├── run_all_strategies.sh
|
| ├── requirements.txt
|
| └── README.md
|
| ```
|
|
|
|
|
|
|
|
|
| - **Servidor**: 8GB RAM (recomendado 16GB)
|
| - **Clientes**: 4GB RAM cada (recomendado 8GB)
|
| - **Rede**: Conexão estável entre servidor e clientes
|
|
|
|
|
| - **Python**: 3.10 - 3.11
|
| - **Sistema Operacional**:
|
| - Servidor: Windows 10/11 ou Linux
|
| - Clientes: Ubuntu 20.04/22.04
|
|
|
|
|
|
|
|
|
|
|
| ```bash
|
| git clone https://github.com/seu-usuario/fl_project.git
|
| cd fl_project
|
| ```
|
|
|
|
|
|
|
| **No Ubuntu (Clientes):**
|
| ```bash
|
| python3 -m venv venv
|
| source venv/bin/activate
|
| ```
|
|
|
| **No Windows (Servidor):**
|
| ```powershell
|
| python -m venv venv
|
| .\venv\Scripts\activate
|
| ```
|
|
|
|
|
|
|
| ```bash
|
| pip install -r requirements.txt
|
| ```
|
|
|
|
|
|
|
| Organize os dados de cada veículo na estrutura:
|
| ```
|
| data/
|
| ├── client_1/
|
| ├── client_2/
|
| └── client_3/
|
| ```
|
|
|
| **Formato esperado dos CSVs:**
|
| - Colunas principais: `vehicle_speed`, `engine_rpm`, `accel_x`, `accel_y`, `P_kW`, `dt`
|
| - Cada arquivo representa um percurso diferente
|
| - Mínimo de 2 percursos por cliente recomendado
|
|
|
|
|
|
|
|
|
|
|
| 1. **Identifique o IP do servidor Windows:**
|
| ```powershell
|
| ipconfig
|
| ```
|
| Procure pelo IPv4 Address (ex: 192.168.1.100)
|
|
|
| 2. **Teste a conectividade dos clientes Ubuntu:**
|
| ```bash
|
| ping 192.168.1.100
|
| ```
|
|
|
|
|
|
|
| ```powershell
|
|
|
| .\venv\Scripts\activate
|
|
|
|
|
| python server.py --strategy fedavg --rounds 15
|
|
|
|
|
| python server.py --strategy fedadam --rounds 20 --min-clients 3
|
| ```
|
|
|
| O servidor iniciará na porta 8080 e aguardará a conexão dos clientes.
|
|
|
|
|
|
|
| **Em cada máquina Ubuntu, execute em terminais separados:**
|
|
|
| **Cliente 1:**
|
| ```bash
|
|
|
| source venv/bin/activate
|
|
|
|
|
| python client.py --client-id 1 --server-address 192.168.1.100:8080 --prediction-length 10
|
| ```
|
|
|
| **Cliente 2:**
|
| ```bash
|
| source venv/bin/activate
|
| python client.py --client-id 2 --server-address 192.168.1.100:8080 --prediction-length 10
|
| ```
|
|
|
| **Cliente 3:**
|
| ```bash
|
| source venv/bin/activate
|
| python client.py --client-id 3 --server-address 192.168.1.100:8080 --prediction-length 10
|
| ```
|
|
|
|
|
|
|
| O progresso será exibido em tempo real:
|
| - **Servidor**: Mostra rodadas completas e métricas globais
|
| - **Clientes**: Exibem perdas locais de treino/validação
|
|
|
|
|
|
|
|
|
|
|
| 1. **Executar análise automática:**
|
| ```bash
|
| python analysis_tool.py --results-dir results
|
| ```
|
|
|
| 2. **Visualizações geradas (PDFs):**
|
| - `performance_analysis_*.pdf`: Análise de desempenho completa
|
| - `convergence_analysis_*.pdf`: Métricas de convergência
|
| - `heatmap_performance_*.pdf`: Mapa de calor temporal
|
| - `comparative_analysis.pdf`: Comparação entre estratégias
|
| - `client_evolution_analysis.pdf`: Evolução individual
|
|
|
| 3. **Métricas salvas:**
|
| - `results/detailed_metrics_*.csv`: Dados completos
|
| - `results/summary_report.json`: Relatório consolidado
|
| - `metrics/client_*/metrics_history.json`: Histórico por cliente
|
|
|
|
|
|
|
| | Estratégia | Descrição | Quando Usar |
|
| |------------|-----------|-------------|
|
| | **FedAvg** | Média ponderada simples | Dados homogêneos |
|
| | **FedAdam** | Otimização adaptativa | Convergência mais rápida |
|
| | **FedYogi** | Adam com controle de variância | Dados heterogêneos |
|
| | **FedAdagrad** | Taxa de aprendizado adaptativa | Dados esparsos |
|
|
|
|
|
|
|
| ```bash
|
|
|
| chmod +x run_all_strategies.sh
|
| ./run_all_strategies.sh 15 10
|
|
|
|
|
| bash run_all_strategies.sh 15 10
|
| ```
|
|
|
|
|
|
|
|
|
|
|
| **Problema**: Clientes não conseguem conectar ao servidor
|
|
|
| **Soluções**:
|
| 1. Verifique o firewall do Windows:
|
| ```powershell
|
|
|
| netsh advfirewall firewall add rule name="FL Server" dir=in action=allow protocol=TCP localport=8080
|
| ```
|
|
|
| 2. Confirme que o servidor está rodando:
|
| ```powershell
|
| netstat -an | findstr :8080
|
| ```
|
|
|
|
|
|
|
| **Problema**: Out of Memory durante treinamento
|
|
|
| **Soluções**:
|
| 1. Reduza o batch_size em `utils.py`
|
| 2. Diminua sequence_length ou prediction_length
|
| 3. Use menos épocas por rodada
|
|
|
|
|
|
|
| **Problema**: "conjunto de treino ou teste vazio"
|
|
|
| **Soluções**:
|
| 1. Verifique se há dados suficientes em `data/client_X/`
|
| 2. Ajuste sequence_length e prediction_length
|
| 3. Confirme que os CSVs têm as colunas esperadas
|
|
|
|
|
|
|
|
|
| - `--strategy`: Estratégia de agregação (fedavg, fedadam, etc.)
|
| - `--rounds`: Número de rodadas de FL (default: 10)
|
| - `--min-clients`: Clientes mínimos para iniciar (default: 3)
|
|
|
|
|
| - `--client-id`: ID do cliente (1, 2 ou 3)
|
| - `--server-address`: Endereço IP:porta do servidor
|
| - `--prediction-length`: Passos futuros a prever (default: 10)
|
|
|
|
|
| - `sequence_length`: Janela de entrada (default: 60)
|
| - `batch_size`: Tamanho do batch (default: 32)
|
| - `learning_rate`: Taxa de aprendizado (default: 1e-5)
|
|
|
|
|
|
|
|
|
| - Entrada: 6 features (velocidade, RPM, acelerações, consumo, tempo)
|
| - Hidden size: 50 neurônios
|
| - Saída: Previsão de N passos futuros de consumo (P_kW)
|
|
|
|
|
| - 80% para treinamento
|
| - 20% para validação
|
| - Normalização MinMaxScaler por cliente
|
|
|
|
|
| - Loss: MSE (Mean Squared Error)
|
| - Avaliação: Por cliente e global
|
| - Convergência: Variância entre clientes
|
|
|
|
|
|
|
| 1. Fork o projeto
|
| 2. Crie sua feature branch (`git checkout -b feature/AmazingFeature`)
|
| 3. Commit suas mudanças (`git commit -m 'Add some AmazingFeature'`)
|
| 4. Push para a branch (`git push origin feature/AmazingFeature`)
|
| 5. Abra um Pull Request
|
|
|
|
|
|
|
| Distribuído sob a licença MIT. Veja `LICENSE` para mais informações.
|
|
|
|
|
|
|
| - José Wilson C. Souza
|
| - Erick Andrade Borba
|
| - João Alfredo Cal Braz
|
|
|
|
|
|
|
| - [Flower Framework](https://flower.dev/) - Framework de Aprendizado Federado
|
| - [PyTorch](https://pytorch.org/) - Framework de Deep Learning
|
| - Dados coletados via OBD Link
|
|
|
| --- |