Aplicação paralela em C com MPI para processar o conjunto de dados Spotify Million Song Dataset. O objetivo é acelerar tarefas de análise exploratória das letras das músicas e fornecer integração com um modelo local de linguagem para classificação de sentimento.
- Contagem de palavras – o processo mestre separa o CSV original em colunas independentes (artistas e letras) e cada processo MPI analisa uma partição do arquivo de letras, mantendo contagens locais que posteriormente são agregadas para produzir o ranking global das palavras mais frequentes.
- Artistas com mais músicas – em paralelo, os processos também percorrem o arquivo de artistas gerado na etapa anterior e reportam os artistas mais prolíficos.
- Classificação de sentimento – script auxiliar em Python permite enviar as letras para um modelo local (por exemplo, via Ollama) e sumarizar o total de músicas Positivas, Neutras e Negativas.
- Métricas de desempenho – o executável MPI exporta métricas de tempo de processamento e comunicação para análise comparativa entre diferentes números de processos.
- Contagem serial detalhada – script independente permite gerar, sem uso de MPI, a contagem total de palavras e o detalhamento por música para consultas adicionais sem impactar as métricas do executável paralelo.
- Compilador e runtime MPI (
mpicc,mpirun). - Python 3.9+ para a etapa de classificação com LLM.
- (Opcional) Pacote
requestspara chamadas HTTP ao servidor do modelo. - (Opcional) Servidor Ollama ou outra solução que exponha um endpoint
compatível com
/api/generate.
makeO binário principal será gerado em bin/parallel_spotify.
mpirun -np <processos> ./bin/parallel_spotify spotify_millsongdata.csv \
[--word-limit N] [--artist-limit N] [--output-dir diretório]Parâmetros opcionais:
--word-limit: limita o número de palavras escritas emword_counts.csv(valor padrão: salvar todas; informe um número positivo para restringir).--artist-limit: controla a quantidade de artistas exportados (padrão: salvar todos; informe um número positivo para limitar).--output-dir: diretório onde os artefatos são gerados (padrão:output).
Ao final da execução são produzidos:
word_counts.csv– ranking decrescente de palavras.top_artists.csv– artistas ordenados pela quantidade de músicas.performance_metrics.json– tempos mínimo, médio e máximo por processo.split_columns/– diretório auxiliar contendo os arquivosartist.csvetext.csv, usados como insumos independentes para as contagens paralelas.
O script Python scripts/sentiment_classifier.py consome o mesmo dataset e
consulta um modelo via HTTP. Ele pode operar em dois modos:
- Modo real (padrão) – envia requisições para um servidor compatível com
Ollama em
http://localhost:11434. Ajuste a variável de ambienteOLLAMA_ENDPOINTou utilize--modelpara trocar o modelo. - Modo
--mock– aplica uma heurística simples baseada em palavras-chave para facilitar testes sem LLM instalado.
Exemplo de uso (modo real):
python scripts/sentiment_classifier.py spotify_millsongdata.csv \
--model llama3 --limit 200 --output-dir outputModo simulado:
python scripts/sentiment_classifier.py spotify_millsongdata.csv --mockSaídas geradas:
sentiment_totals.json– contagem agregada por classe.sentiment_details.csv– detalhamento por música e tempo de inferência.
O arquivo performance_metrics.json produzido pelo executável MPI contém
estatísticas de tempo médio, mínimo e máximo para cada estágio (cômputo local e
tempo total). Para facilitar a comparação entre diferentes tamanhos de cluster,
utilize o script scripts/run_performance.sh:
scripts/run_performance.sh spotify_millsongdata.csv 2 4 8O script não recompila o projeto automaticamente; execute make antes de
realizar os experimentos para garantir que o binário esteja atualizado.
Quando precisar analisar as letras de forma isolada, sem acionar o executável
paralelo, utilize scripts/word_count_per_song.py. O script lê o CSV original,
mantém as aspas e apóstrofos das letras e processa as músicas em paralelo com
threads, gravando dois arquivos:
word_counts_global.csv– frequência total de cada palavra com três ou mais caracteres.word_counts_by_song.csv– frequência das palavras por artista e por música.
Exemplo de uso:
python scripts/word_count_per_song.py spotify_millsongdata.csv \
--output-dir output/serial_word_counts --workers 8O parâmetro --workers é opcional; quando omitido ou definido como zero, o
script usa automaticamente o número de CPUs disponíveis.
Os arquivos são gravados no diretório informado (padrão: output/serial_word_counts).
├── bin/parallel_spotify # executável (gerado pelo make)
├── output/ # resultados (criado em tempo de execução)
├── scripts/
│ ├── run_performance.sh # facilita execuções com vários processos
│ ├── sentiment_classifier.py # classificação de sentimento com LLM local
│ ├── split_csv_columns.py # utilitário para dividir CSV em arquivos por coluna
│ └── word_count_per_song.py # contagem serial de palavras e detalhamento por música
└── src/parallel_spotify.c # código-fonte principal em C/MPI
| Versão | Descrição | Principais diferenças |
|---|---|---|
v0.1 (bdde614) |
Estrutura inicial do projeto. | Repositório criado com README mínimo e configuração base. |
v0.2 (4f78f8e, 732a70c) |
Detalhamento do enunciado. | README atualizado com os requisitos completos do trabalho prático. |
v0.3 (293e8f8) |
Inclusão do dataset. | Arquivo spotify_millsongdata.csv adicionado para possibilitar testes locais. |
v1.0 (8cc21fe) – versão atual |
Implementação paralela com MPI e pipeline de sentimento. | Código C distribuído, geração de métricas de desempenho, scripts auxiliares em Python e shell, documentação completa em português. |
- Os arquivos CSV gerados podem ser grandes, pois por padrão incluem todos os
artistas e todas as palavras; ajuste
--word-limite--artist-limitconforme necessário. - Certifique-se de apontar o
mpirunpara o mesmompiccutilizado na compilação para evitar incompatibilidades de runtime.