fl_project / README.md
jwsouza2025's picture
Update README.md
90420be verified
---
license: mit
---
# Federated Learning para Previsão de Consumo de Combustível
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.
## 📋 Visão Geral
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
## 🏗️ Arquitetura do Sistema
```
┌─────────────────┐
│ Servidor (Win) │
│ 16GB RAM │
│ Porta: 8080 │
└────────┬────────┘
┌────┴────┬──────────┐
│ │ │
┌───▼───┐ ┌──▼───┐ ┌────▼───┐
│Cliente│ │Cliente│ │Cliente │
│ 1 │ │ 2 │ │ 3 │
│Ubuntu │ │Ubuntu│ │Ubuntu │
│ 8GB │ │ 8GB │ │ 8GB │
└───────┘ └──────┘ └────────┘
```
## 📁 Estrutura do Projeto
```
fl_project/
├── data/ # Dados dos veículos (não versionado)
│ ├── client_1/ # Percursos do veículo 1
│ │ ├── percurso_1.csv
│ │ ├── percurso_2.csv
│ │ └── ...
│ ├── client_2/ # Percursos do veículo 2
│ └── client_3/ # Percursos do veículo 3
├── server.py # Código do servidor FL
├── client.py # Código dos clientes FL
├── utils.py # Modelo LSTM e funções auxiliares
├── analysis_tool.py # Ferramenta de análise pós-treinamento
├── run.sh # Script para execução local
├── run_all_strategies.sh # Script para testar todas as estratégias
├── requirements.txt # Dependências Python
└── README.md # Este arquivo
```
## 🔧 Requisitos do Sistema
### Hardware Mínimo
- **Servidor**: 8GB RAM (recomendado 16GB)
- **Clientes**: 4GB RAM cada (recomendado 8GB)
- **Rede**: Conexão estável entre servidor e clientes
### Software
- **Python**: 3.10 - 3.11
- **Sistema Operacional**:
- Servidor: Windows 10/11 ou Linux
- Clientes: Ubuntu 20.04/22.04
## 📦 Instalação
### 1. Clone o Repositório
```bash
git clone https://github.com/seu-usuario/fl_project.git
cd fl_project
```
### 2. Crie um Ambiente Virtual
**No Ubuntu (Clientes):**
```bash
python3 -m venv venv
source venv/bin/activate
```
**No Windows (Servidor):**
```powershell
python -m venv venv
.\venv\Scripts\activate
```
### 3. Instale as Dependências
```bash
pip install -r requirements.txt
```
### 4. Prepare os Dados
Organize os dados de cada veículo na estrutura:
```
data/
├── client_1/ # Dados do veículo 1
├── client_2/ # Dados do veículo 2
└── client_3/ # Dados do veículo 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
## 🚀 Execução em Ambiente Distribuído
### Configuração de Rede
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
```
### Passo 1: Iniciar o Servidor (Windows)
```powershell
# Ative o ambiente virtual
.\venv\Scripts\activate
# Execute o servidor
python server.py --strategy fedavg --rounds 15
# Ou com parâmetros customizados
python server.py --strategy fedadam --rounds 20 --min-clients 3
```
O servidor iniciará na porta 8080 e aguardará a conexão dos clientes.
### Passo 2: Iniciar os Clientes (Ubuntu)
**Em cada máquina Ubuntu, execute em terminais separados:**
**Cliente 1:**
```bash
# Ative o ambiente virtual
source venv/bin/activate
# Execute o cliente 1
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
```
### Monitoramento
O progresso será exibido em tempo real:
- **Servidor**: Mostra rodadas completas e métricas globais
- **Clientes**: Exibem perdas locais de treino/validação
## 📊 Análise dos Resultados
### Após o Treinamento
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égias de Agregação
| 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 |
### Comparar Todas as Estratégias
```bash
# Linux/Ubuntu
chmod +x run_all_strategies.sh
./run_all_strategies.sh 15 10
# Windows (usando Git Bash ou WSL)
bash run_all_strategies.sh 15 10
```
## 🛠️ Troubleshooting
### Erro de Conexão
**Problema**: Clientes não conseguem conectar ao servidor
**Soluções**:
1. Verifique o firewall do Windows:
```powershell
# Permitir porta 8080
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
```
### Erro de Memória
**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
### Dados Insuficientes
**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
## 📈 Parâmetros Importantes
### Server.py
- `--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.py
- `--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)
### Utils.py (configurações internas)
- `sequence_length`: Janela de entrada (default: 60)
- `batch_size`: Tamanho do batch (default: 32)
- `learning_rate`: Taxa de aprendizado (default: 1e-5)
## 📝 Notas de Desenvolvimento
### Modelo LSTM
- 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)
### Divisão dos Dados
- 80% para treinamento
- 20% para validação
- Normalização MinMaxScaler por cliente
### Métricas
- Loss: MSE (Mean Squared Error)
- Avaliação: Por cliente e global
- Convergência: Variância entre clientes
## 🤝 Contribuindo
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
## 📄 Licença
Distribuído sob a licença MIT. Veja `LICENSE` para mais informações.
## 👥 Autores
- José Wilson C. Souza
- Erick Andrade Borba
- João Alfredo Cal Braz
## 🙏 Agradecimentos
- [Flower Framework](https://flower.dev/) - Framework de Aprendizado Federado
- [PyTorch](https://pytorch.org/) - Framework de Deep Learning
- Dados coletados via OBD Link
---