Rede neural para monitoramento de servidor

11

Estou olhando o pybrain para receber alarmes do monitor do servidor e determinar a causa raiz de um problema. Fico feliz em treiná-lo usando aprendizado supervisionado e selecionando os conjuntos de dados de treinamento. Os dados estão estruturados mais ou menos assim:

  • Servidor Tipo A # 1
    • Tipo de alarme 1
    • Tipo de alarme 2
  • Servidor Tipo A # 2
    • Tipo de alarme 1
    • Tipo de alarme 2
  • Servidor Tipo B # 1
    • Tipo de alarme 99
    • Tipo de alarme 2

Portanto, existem n servidores, com x alarmes que podem ser UPou DOWN. Ambos ne xsão variáveis.

Se o Servidor A1 tiver o alarme 1 e 2 como DOWN, então podemos dizer que o serviço a está inativo nesse servidor e é a causa do problema.

Se o alarme 1 estiver desativado em todos os servidores, podemos dizer que o serviço a é a causa.

Pode haver potencialmente várias opções para a causa, portanto, a classificação direta não parece apropriada.

Eu também gostaria de vincular fontes de dados posteriores à rede. Como apenas scripts que fazem ping em algum serviço externo.

Todos os alarmes apropriados podem não ser acionados de uma só vez, devido a verificações de serviço serial, para que ele possa iniciar com um servidor inoperante e outro inoperante 5 minutos depois.

Estou tentando fazer algumas coisas básicas no começo:

from pybrain.tools.shortcuts import buildNetwork
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer


INPUTS = 2
OUTPUTS = 1

# Build network

# 2 inputs, 3 hidden, 1 output neurons
net = buildNetwork(INPUTS, 3, OUTPUTS)


# Build dataset

# Dataset with 2 inputs and 1 output
ds = SupervisedDataSet(INPUTS, OUTPUTS)


# Add one sample, iterable of inputs and iterable of outputs
ds.addSample((0, 0), (0,))



# Train the network with the dataset
trainer = BackpropTrainer(net, ds)

# Train 1000 epochs
for x in xrange(10):
    trainer.train()

# Train infinite epochs until the error rate is low
trainer.trainUntilConvergence()


# Run an input over the network
result = net.activate([2, 1])

Mas estou com dificuldade para mapear números variáveis ​​de alarmes para números estáticos de entradas. Por exemplo, se adicionarmos um alarme a um servidor ou adicionarmos um servidor, toda a rede precisará ser reconstruída. Se isso é algo que precisa ser feito, eu posso fazê-lo, mas quero saber se há uma maneira melhor.

Outra opção que estou tentando pensar é ter uma rede diferente para cada tipo de servidor, mas não vejo como tirar uma conclusão em todo o ambiente, pois ele fará apenas avaliações em um único host, em vez de todos os hosts de uma vez.

Que tipo de algoritmo devo usar e como mapeio o conjunto de dados para tirar conclusões em todo o ambiente com entradas variáveis?

Matt Williamson
fonte
Por que outros métodos de classificação não são apropriados aqui? Parece que você está preocupado com vários casos, levando a um conjunto reduzido de saídas. Mas este é basicamente todo caso de aprendizado de representação na classificação. As redes neurais ajudarão você a descobrir quais efeitos de interação são preditivos quando os recursos básicos não são muito preditivos. Caso contrário, você poderia usar outros métodos.
cwharland
Congratulo-me com qualquer solução. A rede neural era exatamente a que eu estava tentando utilizar.
Matt Williamson
Problema interessante. Desde que você postou isso há mais de 6 meses, posso confirmar que você ainda está interessado nisso antes que eu dedique algum tempo a isso?
Hack-R
Meu pensamento inicial seria usar uma floresta aleatória de regressão logística em modelos por servidor. Então você terá seus benchmarks e descobrirá rapidamente se uma rede neural lhe dará mais. As redes neurais nem sempre dão os melhores resultados.
User1269942

Respostas:

2

Na minha opinião, você está procurando os métodos errados para resolver seu problema.

Você não possui dados numéricos estritamente.

O aprendizado de máquina baseado em estatísticas tem muita dificuldade com esses problemas. Seu problema parece mais um dos problemas que devem ser resolvidos com sistemas baseados em regras. Meu primeiro instinto seria tentar entender as regras e colocá-las no código que leva a uma classificação.

No entanto, existem métodos para aprender esses sistemas baseados em regras baseados na lógica. Hoje, eles são apenas fora de moda para o aprendizado de máquina. https://en.wikipedia.org/wiki/Rule-based_system

Tobias Würfl
fonte
+1, Se você puder mapear facilmente se / então para resolver um problema, não há como a ANN superar a lógica inferencial pura. Mesmo um argumento estatístico (o serviço A está inoperante em 5/6 servidores, portanto o serviço A está inoperante) é melhor do que lidar com a sobrecarga exigida por uma rede neural.
Derek Janni
2

De acordo com o comentário acima, sugiro que você tente uma abordagem baseada em regras. Para cada servidor que você possui, consulte seus serviços. Se todos os serviços estiverem inativos em um servidor, você terá um problema no servidor. Para cada serviço, se nenhum servidor relatar que o serviço está sendo executado, você terá um problema com o serviço. No caso de ambos, você receberá avisos para cada um e poderá inspecionar o que está acontecendo com qualquer um dos constituintes.

O custo, a manutenção e o risco de maus resultados usando um modelo ANN excedem a solução simples e baseada em regras e seu chefe provavelmente dará um tapinha nas costas por fazer o que faz sentido aqui.

Se você realmente quer manter seus servidores e processos funcionais, sugiro que você invista em um serviço APM que fornece notificações confiáveis ​​e em tempo real sobre o que está acontecendo no seu ambiente de produção.

Caso você esteja apenas tentando aprender como a RNA funciona, tente um problema diferente. Qualquer conjunto de dados conhecido para classificação ou detecção de anomalias fornecerá muito mais informações sobre como a ANN funciona do que um conjunto de dados personalizado, que pode ser terrivelmente difícil de coagir a um esquema de aprendizado eficaz.

Derek Janni
fonte