Inteligência Artificial em Redes Programáveis

A linha temática Inteligência Artificial em Redes Programáveis visa propor como o plano de dados e seus dispositivos podem ser utilizados para a execução de algoritmos de aprendizado de máquina. Abaixo são descritas as tarefas envolvidas nessa linha temática.

Tarefa 7: Mapeamento de RNAs na Infraestrutura Subjacente

Apesar dos diversos esforços na literatura para operacionalizar mecanismos de inteligência em planos de dados, a implementação e a operação de Redes Neurais Artificais (RNA) ainda está longe de ser uma realidade. Ao operar aplicações assistidas por redes neurais artificiais diretamente nos planos de dados, é possı́vel se beneficiar do alto desempenho dos dispositivos de encaminhamento para (i) aprender diferentes comportamentos existentes nas infraestruturas de rede enquanto os pacotes são encaminhados, ou seja, sem a sobrecarga de espelhar (parte dos) pacotes da rede para analisadores no plano de controle; (ii) tomar decisões em tempo real – ou seja, a latência do plano de dados é na ordem de nanossegundos, enquanto as aplicações tradicionais (baseadas em aprendizado de máquina) operam em uma escala na ordem de milissegundos (ou mesmo segundos); e (iii) reduzir a necessidade de atualizar continuamente os valores nas tabelas de pesquisa, uma vez que as decisões serão baseadas no comportamento aprendido.

Apesar dos benefı́cios mencionados, a operacionalização de RNAs, de maneira distribuı́da e escalável, em infraestruturas programáveis, é especialmente desafiadora por dois motivos. Primeiro, as arquiteturas programáveis existentes ainda são limitadas em relação às operações (por exemplo, operações em ponto flutuante e atualização autônoma das tabelas de pesquisa), fluxos de controle (por exemplo, estruturas de iteração) e quantidade de memória disponı́vel. Segundo, tecnologias de virtualização de planos de dados ainda são incipientes e pouco eficazes – o que dificulta a execução isolada de múltiplas aplicações (por exemplo, múltiplos neurônios ou RNAs sobre um mesmo plano de dados). A ausência de soluções efetivas para virtualização em planos de dados programáveis impõe restrições quanto à orquestração dos recursos disponı́veis na infraestrutura e das próprias RNAs. Existem ainda outros desafios relacionados à implementação e a operacionalização de RNAs em planos de dados programáveis. Entre eles, destacam-se três: (i) a implementação da lógica dos neurônios (dadas as limitações das arquiteturas) e mecanismos para a transmissão e sincronização de dados entre camadas, (ii) o projeto de estratégias algorı́tmicas para a orquestração do ciclo de vida de RNAs (por exemplo, alocação e realocação dinâmica de RNAs) em planos de dados, e (iii) a operacionalização em larga escala desses mecanismos. Pretende-se, nessa tarefa, propor soluções para esses três desafios.

Luizelli et al. foram os primeiros a definir os requisitos e desafios para a implantação de redes neurais artificiais de forma distribuı́da no plano de dados, entre os quais a necessidade de mapeamento de RNAs na infraestrutura subjacente. Em paralelo, Saquetti et al. propuseram a primeira rede neural artificial executando de forma distribuı́da no plano de dados. Apesar de demonstrar a viabilidade técnica de se executar RNAs diretamente no plano de dados, os autores fizeram um mapeamento manual de neurônios na infraestrutura subjacente, sem um mecanismo que possa definir de forma automatizada tal mapeamento.

O objetivo de pesquisa desta tarefa é a formalização teórica e avaliação de problemas de otimização relacionados com a orquestração de RNAs em planos de dados programáveis. A orquestração compreende os procedimentos necessários à operação, incluindo o mapeamento de RNAs para as infraestruturas programáveis e possı́veis operações durante o ciclo de vida das mesmas (por exemplo, a migração de neurônios frente a novas demandas). O plano para desenvolvimento da tarefa compreende a modelagem, a partir de técnicas como Programação Linear Inteira, e avaliados de maneira ótima. A avaliação de soluções ótimas objetiva (i) estabelecer um limitante superior/inferior (upperbound/lowerbound) para o problema e (ii) entender as caracterı́sticas gerais das soluções. Considerando a natureza já NP-Difı́cil de partes dos problemas relacionados com a operação de RNAs (por exemplo, o mapeamento), ela torna-se ainda mais complicada quando da necessidade de conferir aos modelos a capacidade de lidar com ambientes muito dinâmicos, exigindo, por exemplo, o rearranjo periódico de neurônios. Tal é indispensável para agilizar a dinâmica de múltiplas RNAs em PDPs. A avaliação da proposta será feita por meio de simulações e emulações, além de modelagem analı́tica e resolução dos modelos usando, por exemplo, CPLEX.

Tarefa 8: Criação de Redes Neurais Artificiais para o Plano de Dados

A materialização de aplicações inteligentes executando diretamente no plano de dados passa pela necessidade de se desenvolver uma linguagem de domı́nio especı́fico (domain-specific language, DSL) que permita criar e instanciar RNAs, bem como apoiar o treinamento das mesmas, assim como o TensorFlow permite a construção de aplicações inteligentes usando APIs em Python e C, entre outras. Uma DSL para a criação de aplicações inteligentes deve oferecer abstrações para (i) criação de neurônios ou perceptrons, pela definição de funções não-lineares de ativação ou de transferência, (ii) configuração das camadas de neurônios e do encadeamento entre as camadas (perceptron multicamadas) e (iii) definição de rotinas de treinamento da rede neural [132]. Esta última pode incluir, por exemplo, funções de perda para avaliar a acurácia da rede neural artificial durante o treinamento, retro-propagação dos erros, aprendizado de caracterı́sticas (feature learning) e otimizadores do processo de aprendizado em um ambiente distribuı́do. As abstrações, por sua vez, devem se apoiar naquelas oferecidas pelas linguagens como POF e P4, para permitir a comunicação entre neurônios executando em diferentes dispositivos na rede.

O provisionamento dessas abstrações para programação de aplicações inteligentes requer que sejam abordadas as limitações das DSLs para PDPs. Por exemplo, a criação de neurônios ou perceptrons requer lidar com combinadores lineares e limiares de ativação, cálculos de gradientes durante a retro-propagação de erros, etc. Essas ações, por sua vez, podem envolvem operações de ponto flutuante e mesmo convoluções, as quais não são suportadas em P4 ou NPL, principais linguagens existentes para planos de dados programáveis. Além disso, a materialização da capacidade de aprendizado da rede requer que a aplicação inteligente possa incluir (ou remover), de forma autônoma, ações a serem executadas em resposta a determinados estı́mulos observados na rede. Atualmente, a definição dessas ações requer intervenção direta do plano de controle, uma vez que as DSLs para o plano de dados não permitem alterar dinamicamente as tabelas de encaminhamento no pipeline de switches programáveis.

A rápida adoção de planos de dados programáveis pela academia e indústria tem sido fomentada principalmente pela flexibilidade de DSLs como POF, P4, NPL e Lyra, as quais permitem o rápido desenvolvimento de funções de rede customizadas para o plano de dados. Essas linguagens são usadas para programação de switches independentes de protocolo (Protocol Independent Switch Architecture, PISA), um dos principais pilares da programabilidade do plano de dados. A arquitetura PISA, em conjunto com as lin permitindo que desenvolvedores de rede possam definir a forma como um switch interpreta (via parser) e processa pacotes (via pipeline de unidades match e action). Para esse fim, o desenvolvedor deve especificar um programa, usando uma linguagem de alto nı́vel (como P4), e então compilar o programa para a plataforma alvo, que pode ser um switch fı́sico (como os switches baseados na linha de chips Intel Tofino), um software switch ou mesmo um FPGA. A comunidade cientı́fica também tem pesquisado outras DSLs com propriedades especı́ficas, como por exemplo o uP4, focada em desenvolvimento modular de programas P4. No entanto, apesar dos avanços, ainda não existe na literatura uma linguagem que permita a definição de aplicações inteligentes para planos de dados programáveis que contemple as abstrações necessárias para o desenvolvimento das mesmas.

No escopo da presente tarefa, propõe-se definir uma DSL para aplicações inteligentes no plano de dados programáveis. Para a definição do arcabouço de desenvolvimento de RNAs para redes, prevê-se como etapas da metodologia 1) Projeto de uma linguagem de domı́nio-especı́fico: esta etapa se materializa na necessidade de projetar uma linguagem expressiva o suficiente para descrever as RNAs e seus propósitos especı́ficos; 2) Implementação de mecanismos para a transmissão e a sincronização eficiente entre neurônios: considerando as implementações distribuı́das de RNAs, a etapa consiste em garantir que as informações sejam corretamente processadas (isto é, mecanismo de sincronização) e que a transmissão entre camadas gere o menor impacto possı́vel para os demais tráfegos (por exemplo, ao se utilizar o princı́pio de INT; 3) Definição de estruturas de dados especı́ficas para armazenar informações em neurônios: considerando as limitações de memória existentes nos dispositivos (por exemplo, SmartNICs), estruturas de dados como Space Saving (derivadas de Bloom Filters) podem ser utilizadas para armazenar, de maneira eficiente, as informações computadas; 4) Implementação de estruturas de iteração: dado que muitas operações precisam ser executas iterativamente, a etapa consiste em implementar as operações com a mı́nima degradação; e 5) Implementação de operação de múltiplos neurônios em um único plano de dados programável: a etapa surge devido à necessidade de tecnologias para virtualizar ou para construir aplicações monolı́ticas compostas pelas lógicas de múltiplos neurônios. Para a avaliação, prevê-se a utilização de switches em software, como por exemplo o BMv2, SmartNICs programáveis NVIDIA BlueField-2, Xilinx Alveo SN1000, e switches Edgecore Wedge 100BF-32X. No escopo do presente projeto, pretende-se ainda adquirir servidores com GPUs para treinamento e simulação/emulação de RNAs visando topologias fat-tree de datacenters.

Tarefa 9: Virtualização Leve baseada em Containers no Plano de Dados

Uma limitação dos atuais dispositivos para planos de dados programáveis é o suporte à execução de apenas um programa em um dado instante, Nesse contexto, alocar cada neurônio que compõe a RNA a um dispositivo de rede programável implica em desperdı́cio de recursos, no caso de neurônios que requerem uma fração mı́nima de recursos do dispositivo de rede (ou do perfil de encaminhamento, no caso de switches programáveis com suporte a múltiplos perfis).

Para suprir essa lacuna, algumas soluções propõem a composição de diversos programas para planos de dados programáveis em um único programa, ou o uso de programas de propósito geral para emular outros programas para planos de dados programáveis [58, 169]. Soluções baseadas na composição de programas impedem a alocação dinâmica de neurônios em planos de dados programáveis sem interferir na operação dos outros neurônios que coexistem no mesmo programa composto. Por outro lado, as soluções baseadas em um programa de propósito geral impõem um alto custo em termos de recursos e processamento para a operação de múltiplos neurônios, comprometendo assim o desempenho das RNAs.

Na linha de emulação de switches programáveis, Hancock e van der Merwe foram os primeiros a propor a ideia de um programa P4 de propósito geral (chamado de Hyper4) que expõe um conjunto de tabelas match e actions que podem ser configuradas de modo a emular outros programas P4. No entanto, Hyper4 sofre com a penalidade de desempenho devido à emulação. Além disso, ele exige várias tabelas no programa de propósito geral para emular cada tabela dos programas P4 originais, resultando assim em alto consumo de memória. Na linha de composição de switches, por sua vez, destacam-se iniciativas como P4Visor, Dejavu e P4SC. Essas soluções para composição de programas agregam vários códigos P4 em um único programa, e otimizam o uso de recursos através da fusão de funcionalidades similares dos programas originais. No entanto, essas soluções não oferecem suporte ao isolamento de switches e à implantação de novas instâncias de switches sem interrupções às instâncias em operação. Por fim, trabalhos como VirtP4 e P4VBox propõem a execução de várias instâncias de switches programáveis em uma placa NetFPGA, permitindo troca dinâmica de switches no plano de dados. No entanto, essas soluções não contemplam abstrações de gerenciamento para controlar as instâncias virtuais, e não oferecem mecanismos para execução de switches virtuais com requisitos mı́nimos de memória.

O foco desse eixo será a pesquisa de uma arquitetura para a instanciação de switches virtuais como contêineres, similar a ambientes como Mininet e Docker. Nessa arquitetura, os switches virtuais poderão compartilhar funções em comum, visando a economia de recursos no dispositivo fı́sico. A solução de virtualização baseada em containers deve permitir a alocação dinâmica de múltiplos neurônios em um mesmo dispositivo fı́sico da infraestrutura de rede subjacente. Os containers, por sua vez, devem possibilitar o compartilhamento de recursos como buffers, filas e portas. Esse compartilhamento pode ser habilitado dependendo se os neurônios pertencem ou não a uma mesma RNA (de um mesmo tenant ou de tenants diferentes). Ao se criar um container para cada neurônio, e ao se permitir o uso de recursos compartilhados entre múltiplos containers, minimiza-se a quantidade necessária de recursos por RNA, maximizando, assim, a utilidade dos recursos na infraestrutura de rede e o conjunto de redes neurais artificiais que podem operar em paralelo na rede fı́sica. Em relação à metodologia de pesquisa, o projeto do ambiente para virtualização leve baseada em contêineres deverá compreender a definição de um substrato para a execução de módulos (bytecode) de software em dispositivos programáveis. O substrato deverá oferecer as mesmas abstrações que aquelas providas pelos dispositivos programáveis, como, por exemplo, filas de entrada e de saı́da, e portas virtuais. No entanto, o substrato deverá permitir que os módulos possam acessar funções compartilhadas (por exemplo, actions e rotinas para o cálculo de checksum de pacotes). Por fim, o projeto deverá contemplar a especificação de abstrações de recursos compartilhados, que poderão ser utilizados pelos módulos executando em contêineres. Exemplos incluem buffers, filas de ingresso e egresso de pacotes, portas virtuais, etc.

Tarefa 10: Treinamento Eficiente de Algoritmos de Aprendizado de Máquina em Planos de Dados Programáveis

A crescente popularização de sistemas de aprendizado de máquina (ML) e a quantidade de dados usados para treinar esses modelos têm demandado cada vez mais poder computacional. A possibilidade de distribuir as tarefas de treinamento entre vários trabalhadores tem sido investigada como forma de superar esses desafios. No ML distribuı́do, vários trabalhadores treinam a mesma instância de modelo executando diferentes partes de um conjunto de dados em paralelo. Após cada trabalhador ter treinado um modelo local, o treinamento distribuı́do passa por uma fase de agregação. Alcançar uma agregação de alto desempenho é essencial para acelerar o processo de treinamento. Abordagens tradicionais para agregação consideram o uso de um servidor de parâmetros ou a execução de um algoritmo de comunicação distribuı́da entre os trabalhadores. No entanto, essas abordagens são caras em termos de largura de banda e latência para concluir a agregação.

Uma alternativa promissora para acelerar o processo de agregação é transferi-lo para um hardware de plano de dados programável. Embora trabalhos anteriores tenham proposto o descarregamento da tarefa de treinamento para planos de dados programáveis, eles geralmente dependem de estratégias sı́ncronas para agregação. No entanto, conseguir realizar estratégias de sincronização mais flexı́veis que podem acelerar o treinamento e oferecer alta precisão ainda é um problema de pesquisa em aberto e o objetivo da presente tarefa. Devido às restrições do modelo de programação do switch, é necessário manter um baixo uso de memória e permitir que o controle das barreiras de sincronização seja realizado de maneira leve. Para isso, estruturas de dados otimizadas e algoritmos eficientes são necessários.

Trabalhos recentes na literatura apresentam abordagens para realizar o treinamento de algoritmos de aprendizagem de máquina com o auxı́lio de planos de dados programáveis, tais como SwitchML e ATP. No entanto, soluções para treinamento distribuı́do não lidam com o problema de stragglers, que são trabalhadores que levam mais tempo para concluir suas tarefas. Como resultado, outros trabalhadores que contribuem para o mesmo trabalho devem esperar pelos retardatários, o que pode atrasar o processo de treinamento e afetar negativamente o tempo de conclusão do treinamento. Em sistemas distribuı́dos de larga escala, testes empı́ricos mostram que mesmo um pequeno número de retardatários pode impactar consideravelmente o tempo total necessário para completar um trabalho.

O objetivo dessa tarefa é projetar e implementar uma estratégia de sincronização hı́brida descarregando as barreiras lógicas de sincronização para o switch que executa a agregação. A abordagem deve ser inspirada em trabalhos recentes que adotam a abordagem Stale Synchronous Parallel, porém realizando esse controle inteiramente no plano de dados. A solução visa definir controles no switch responsável por agregar os gradientes, de forma a garantir que todos os trabalhadores permaneçam dentro de uma janela de treinamento, que é um parâmetro que define a diferença máxima (em iterações de treinamento) entre os trabalhadores mais rápidos e os mais lentos. Para a avaliação, prevê-se a utilização inicial de switches em software, como o BMv2, e em um segundo momento a avaliação de um protótipo construı́do sobre um testbed usando SmartNICs programáveis e switches programáveis Edgecore Wedge 100BF-32X.