Skip to content

alissonpef/content_steering

Repository files navigation

Contributors Forks Stargazers Issues MIT License LinkedIn


Logo

Content Steering com Aprendizado por Reforço (DASH)

Ambiente de simulação nativo em Kubernetes para avaliação de estratégias de Content Steering em streaming de vídeo DASH utilizando algoritmos de Aprendizado por Reforço sob latências de rede reais.
Explore a documentação »

Ver Demonstração · Reportar Bug · Solicitar Recurso

Índice
  1. Sobre O Projeto
  2. Começando
  3. Arquitetura
  4. Uso
  5. Pipeline de Análise
  6. Contribuindo
  7. Licença
  8. Contato
  9. Agradecimentos

Sobre O Projeto

Captura de Tela do Produto

Este projeto simula o mecanismo de Content Steering em streaming adaptativo DASH usando múltiplas estratégias de decisão inteligente. O objetivo principal é treinar e avaliar algoritmos de Aprendizado por Reforço (como Multi-Armed Bandits e PPO) para selecionar dinamicamente a melhor fonte de entrega (CDN) com base nas flutuações de latência, jitter e bufferbloat em tempo real.

Principais recursos:

  • Servidor de Steering em FastAPI contendo as estratégias:
    • epsilon_greedy (MAB clássico)
    • ucb1 (Upper Confidence Bound)
    • linucb (Contextual Bandit)
    • thompson_sampling (Contextual Thompson Sampling)
    • ppo_hybrid (Algoritmo de política híbrida para bitrate + steering)
    • round_robin, random, no_steering e oracle_best_choice (baselines)
  • Ambiente Kubernetes nativo (Kind) para emulação e isolamento de rede real entre os pods.
  • 3 servidores de cache simulados (Delivery Nodes) usando Caddy para entrega local via HTTPS.
  • Pipeline automatizado de testes com orquestração via Playwright em navegadores Headless.
  • Módulo completo de análise para agregação de logs e geração de gráficos estatísticos com qualidade de publicação.

(voltar ao topo)

Construído Com

Abaixo estão listadas as tecnologias e ferramentas utilizadas para construir este ecossistema:

  • Python
  • FastAPI
  • Kubernetes
  • Docker
  • Playwright
  • Nginx
  • Caddy

(voltar ao topo)

Começando

Siga as instruções a seguir para configurar e executar a simulação localmente no seu ambiente de desenvolvimento.

Pré-requisitos

Para rodar este simulador, você precisará de:

  • Sistema Operacional: Linux (recomendado Ubuntu/Debian) ou WSL2 no Windows.
  • Gerenciador de Dependências Python: uv instalado localmente.
    curl -LsSf https://astral.sh/uv/install.sh | sh
  • Docker e Kind instalados e em execução.
  • kubectl para gerenciamento de recursos do Kubernetes.
  • mkcert para geração de certificados SSL locais confiáveis:
    sudo apt install mkcert
    mkcert -install

Instalação

  1. Clone o repositório do projeto:
    git clone https://github.com/alissonpef/content_steering.git
  2. Instale as dependências de Python do projeto de forma isolada com o uv:
    uv sync
  3. Obtenha a pasta de dataset necessária:
    • Baixe os arquivos do dataset do Google Drive Link.
    • Coloque a pasta baixada como ./dataset no diretório raiz do projeto (de forma que o caminho para o manifesto do vídeo seja ./dataset/Eldorado/4sec/avc/manifest.mpd).

(voltar ao topo)

Arquitetura

O sistema é implantado de forma totalmente emulada e nativa dentro de um cluster Kubernetes rodando via Kind:

flowchart TD
    classDef browser fill:#f9f9f9,stroke:#333,stroke-width:2px;
    classDef proxy fill:#4caf50,stroke:#fff,stroke-width:2px,color:#fff;
    classDef frontend fill:#ffeb3b,stroke:#f57f17,stroke-width:2px,color:#333;
    classDef backend fill:#00bcd4,stroke:#fff,stroke-width:2px,color:#fff;
    classDef storage fill:#607d8b,stroke:#fff,stroke-width:2px,color:#fff;

    Browser("🌐 Navegador Cliente (Dash.js)"):::browser

    subgraph Cluster ["☸️ Cluster Kubernetes (Kind)"]
        Gateway{"🛡️ Nginx Gateway"}:::proxy

        UI["💻 dash-client (UI Nginx)"]:::frontend
        RL["🧠 steering-server (FastAPI)"]:::backend
        
        subgraph CDNNodes ["📦 Nós de Entrega CDN (Caddy)"]
            direction LR
            Node1[("Delivery Node 1")]:::storage
            Node2[("Delivery Node 2")]:::storage
            Node3[("Delivery Node 3")]:::storage
        end
    end

    Browser -- "1. Carrega UI (localhost:5000/)" --> Gateway
    Gateway -- "Rota: /" --> UI

    Browser -- "2. Obtém Decisão (/steering/coords)" --> Gateway
    Gateway -- "Rota: /steering" --> RL

    Browser -- "3. Baixa Chunks (/nodeX/...)" --> Gateway
    Gateway -- "Rota: /node[1-3]" --> CDNNodes
    
    RL -. "Sondas de Latência em Backgound" .-> CDNNodes
Loading
  • Nginx Gateway: Atua como o ponto único de entrada do cluster (proxy reverso), roteando o tráfego e lidando com políticas de CORS.
  • dash-client: Servidor web que serve os arquivos estáticos da interface web e do player customizado do dash.js.
  • steering-server: O backend inteligente contendo os algoritmos de Aprendizado por Reforço e monitoramento de latência ativa e passiva.
  • CDNNodes: Nós de entrega (servidores Caddy) que armazenam os blocos do vídeo de simulação. Eles utilizam a ferramenta tc (Traffic Control) do kernel Linux para injetar latência, jitter e perturbações configuradas nos cenários de teste.

(voltar ao topo)

Uso

Para interagir com o ambiente e executar as simulações, utilize os utilitários de infraestrutura e execução disponibilizados no repositório.

Inicializando o Ambiente Kubernetes

  1. Primeiro, gere os certificados HTTPS necessários localmente:

    uv run python tasks.py generate_certificates
  2. Inicialize o cluster local do Kubernetes (Kind) e implante todos os manifestos de simulação:

    uv run python tasks.py setup_k8s
  3. Acesse o painel de visualização no seu navegador local em:

    Caso a porta não esteja respondendo automaticamente, faça o redirecionamento manual da porta com o comando:

    kubectl port-forward deployment/gateway 5000:80
  4. Para destruir o cluster e interromper o ambiente de simulação:

    uv run python tasks.py stop_k8s

(voltar ao topo)

Pipeline de Análise

O projeto conta com um script automatizado que executa toda a bateria de testes e compila os resultados para os diferentes modelos e cenários.

Orquestração Automatizada com Playwright

Você pode orquestrar uma execução de simulação em lote completa executando o seguinte script:

uv run python scripts/run_all.py

Esse pipeline realiza as seguintes ações de forma automatizada:

  1. Roda as simulações do navegador cliente de forma headless via Playwright para cada algoritmo e cenário configurados.
  2. Copia os arquivos de log gerados internamente de dentro dos pods no Kubernetes para o host local.
  3. Agrega todos os arquivos de log brutos.
  4. Processa estatísticas de desempenho e gera gráficos comparativos de latência média, arrependimento acumulado (cumulative regret), acurácia de escolha ótima e gráficos de séries temporais das simulações.
  5. Gera um relatório em markdown consolidado chamado analise_cenarios.md.

Executando Módulos de Análise Manualmente

Caso prefira processar dados brutos que já estejam salvos no diretório local, você pode acionar os scripts de análise de forma independente:

  • Agregação de logs por estratégia e cenário:
    uv run python analysis/aggregate_logs.py linucb --suffix_pattern _baseline
  • Geração de gráficos comparativos gerais (Latência e Regret):
    uv run python analysis/plotting/generate_compare_graphs.py
  • Geração de gráficos de distribuição de escolha (Heatmaps):
    uv run python analysis/plotting/generate_compare_graphs.py --metric dynamic_best_server_latency
  • Geração de gráficos de corridas de simulação individuais:
    uv run python analysis/plotting/generate_graphs.py
  • Geração de boxplots estatísticos comparativos:
    uv run python analysis/plotting/generate_boxplots.py

Todos os resultados estruturados e figuras finais em formato pronto para artigos acadêmicos serão armazenados na pasta data/results/.

(voltar ao topo)

Contribuindo

Contribuições são o que tornam a comunidade open source um lugar tão incrível para aprender, inspirar e criar. Qualquer contribuição que você fizer será muito apreciada.

Se você tiver alguma sugestão que tornaria isso melhor, por favor faça o fork do repositório e crie um pull request. Você também pode simplesmente abrir uma issue com a tag "enhancement". Não se esqueça de dar uma estrela ao projeto! Obrigado novamente!

  1. Faça o Fork do Projeto
  2. Crie a sua Branch de Funcionalidade (git checkout -b feature/FuncionalidadeIncrivel)
  3. Commit suas Mudanças (git commit -m 'Adicione alguma FuncionalidadeIncrivel')
  4. Faça o Push para a Branch (git push origin feature/FuncionalidadeIncrivel)
  5. Abra um Pull Request

Principais contribuidores:

imagem de contribuidores

(voltar ao topo)

Licença

Distribuído sob a Licença MIT. Veja LICENSE.txt para mais informações.

(voltar ao topo)

Contato

Álisson Pereira Ferreira - alissonpef@gmail.com

Link do Projeto: https://github.com/alissonpef/content_steering

(voltar ao topo)

Agradecimentos

Este projeto baseia-se e expande os trabalhos dos seguintes repositórios:

(voltar ao topo)

About

A Kubernetes-native simulation platform to evaluate dynamic content steering in DASH streaming, built with Python, FastAPI, Kubernetes, Docker, and JavaScript. Features adaptive reinforcement learning strategies to optimize client-side CDN selection based on real-time network latency.

Topics

Resources

License

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors