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
git clone https://github.com/seu-usuario/fl_project.git
cd fl_project
2. Crie um Ambiente Virtual
No Ubuntu (Clientes):
python3 -m venv venv
source venv/bin/activate
No Windows (Servidor):
python -m venv venv
.\venv\Scripts\activate
3. Instale as Dependências
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
Identifique o IP do servidor Windows:
ipconfigProcure pelo IPv4 Address (ex: 192.168.1.100)
Teste a conectividade dos clientes Ubuntu:
ping 192.168.1.100
Passo 1: Iniciar o Servidor (Windows)
# 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:
# 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:
source venv/bin/activate
python client.py --client-id 2 --server-address 192.168.1.100:8080 --prediction-length 10
Cliente 3:
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
Executar análise automática:
python analysis_tool.py --results-dir resultsVisualizações geradas (PDFs):
performance_analysis_*.pdf: Análise de desempenho completaconvergence_analysis_*.pdf: Métricas de convergênciaheatmap_performance_*.pdf: Mapa de calor temporalcomparative_analysis.pdf: Comparação entre estratégiasclient_evolution_analysis.pdf: Evolução individual
Métricas salvas:
results/detailed_metrics_*.csv: Dados completosresults/summary_report.json: Relatório consolidadometrics/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
# 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:
Verifique o firewall do Windows:
# Permitir porta 8080 netsh advfirewall firewall add rule name="FL Server" dir=in action=allow protocol=TCP localport=8080Confirme que o servidor está rodando:
netstat -an | findstr :8080
Erro de Memória
Problema: Out of Memory durante treinamento
Soluções:
- Reduza o batch_size em
utils.py - Diminua sequence_length ou prediction_length
- Use menos épocas por rodada
Dados Insuficientes
Problema: "conjunto de treino ou teste vazio"
Soluções:
- Verifique se há dados suficientes em
data/client_X/ - Ajuste sequence_length e prediction_length
- 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
- Fork o projeto
- Crie sua feature branch (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push para a branch (
git push origin feature/AmazingFeature) - 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 - Framework de Aprendizado Federado
- PyTorch - Framework de Deep Learning
- Dados coletados via OBD Link