Progettare AI per l'analisi dei file di registro


12

Sto sviluppando uno strumento di intelligenza artificiale per trovare errori noti delle apparecchiature e trovare nuovi modelli di guasto. Questo file di registro è basato sul tempo e contiene messaggi noti (informazioni ed errori). Sto usando una libreria JavaScript L'evento scende per mostrare i dati in modo morbido, ma il mio vero lavoro e i miei dubbi sono come addestrare l'IA per trovare il noto modelli e trova nuovi possibili modelli. Ho alcuni requisiti:

1 - Lo strumento deve a. non dipende dall'installazione dell'ambiente aggiuntivo o b. tanto meno meglio (lo scenario perfetto è eseguire lo strumento interamente sul browser in modalità standalone);

2 - Possibilità di frammentare l'analizzatore di schemi, una sorta di modularità, un modulo per errore;

Quali sono i tipi di algoritmo consigliati per farlo (rete neurale, algoritmo genetico, ecc.)? Esiste qualcosa per funzionare usando JavaScript? In caso contrario, qual è la lingua migliore per creare questa IA?


1
Sospetto che qualcosa basato sulle regole sarebbe più appropriato per questo rispetto all'apprendimento automatico
antlersoft,

@antlersoft Per i problemi noti sono d'accordo, ma voglio cercare schemi per fare correlazioni anche con i difetti.
Juliano Oliveira,

Consigliato? Pensiamo ... Usando regexp? Le reti neurali sono consigliate per problemi che non hanno soluzione usando algoritmi classici. Quasi tutte le reti neurali ricevono dati preelaborati. Se "preprocedi" il registro, otterrai anche la tua soluzione.
betontalpfa,

Risposte:


9

Correlazione tra voci

La prima raccomandazione è quella di garantire che vengano presentate voci di avvertimento e informative appropriate nel file di registro insieme a errori nei componenti di machine learning della soluzione. Tutte le voci di registro sono dati di input potenzialmente utili se è possibile che vi siano correlazioni tra messaggi informativi, avvisi ed errori. A volte la correlazione è forte e quindi fondamentale per massimizzare il tasso di apprendimento.

Gli amministratori di sistema lo riscontrano spesso come una serie di avvisi seguiti da un errore causato dalla condizione indicata negli avvisi. Le informazioni contenute negli avvisi sono più indicative della causa principale dell'errore rispetto alla voce dell'errore creata come sistema o sottosistema in modo critico.

Se si sta costruendo un cruscotto di integrità del sistema per un pezzo di equipaggiamento o una serie di macchine che interagiscono, il che sembra essere il caso in questa domanda, la causa principale dei problemi e alcune funzionalità di allarme rapido sono le informazioni chiave da visualizzare.

Inoltre, non tutte le cattive condizioni di salute del sistema finiscono per fallire.

Le uniche voci di registro che dovrebbero essere eliminate mediante filtrazione prima della presentazione al meccanismo di apprendimento sono sicuramente irrilevanti e non correlate. Questo può essere il caso in cui il file di registro è un'aggregazione di registrazione da diversi sistemi. In tal caso, le voci per il sistema indipendente da analizzare dovrebbero essere estratte come voci da voci che non potrebbero essere correlate ai fenomeni analizzati.

È importante notare che limitare l'analisi a una voce alla volta limita enormemente l'utilità della dashboard. L'integrità di un sistema non è uguale alle indicazioni di integrità della voce di registro più recente. Non è nemmeno la somma lineare delle indicazioni di salute delle voci N più recenti.

La salute del sistema ha relazioni molto non lineari e molto temporalmente dipendenti con molte voci. I modelli possono emergere gradualmente nel corso dei giorni su molti tipi di sistemi. La rete neurale di base (o una base) nel sistema deve essere addestrata per identificare queste indicazioni non lineari di salute, pericoli imminenti e condizioni di rischio se si desidera un cruscotto altamente utile. Per mostrare la probabilità di un imminente fallimento o di un problema di controllo della qualità, una finestra temporale di voci di registro di notevole lunghezza deve entrare in questa rete neurale.

Distinzione tra schemi noti e sconosciuti

Si noti che l'identificazione di modelli noti è diversa per un aspetto importante rispetto all'identificazione di nuovi modelli. Le idiosincrasie della sintassi di entrata di errori noti sono già state identificate, riducendo considerevolmente il carico di apprendimento nelle fasi di normalizzazione degli input di elaborazione per tali voci. Le idiosincrasie sintattiche di nuovi tipi di errore devono essere scoperte per prime.

Le voci di un tipo noto possono anche essere separate da quelle sconosciute, consentendo l'uso di tipi di voci conosciuti come dati di addestramento per aiutare nell'apprendimento di nuovi schemi sintattici. L'obiettivo è presentare informazioni sintatticamente normalizzate all'analisi semantica.

Prima fase di normalizzazione specifica per i file di registro

Se il timestamp è sempre nello stesso posto nelle voci, convertirlo in millisecondi relativi e forse rimuovere eventuali caratteri 0x0d prima che i caratteri 0x0a possano essere eseguiti prima di ogni altra cosa come primo passo nella normalizzazione. Le tracce dello stack possono anche essere piegate in matrici delimitate da tabulazioni dei livelli di traccia in modo che vi sia una corrispondenza uno-a-uno tra voci di registro e linee di registro.

Le informazioni normalizzate sintatticamente derivanti da voci di errori sia note che sconosciute e di tipo non-errore possono quindi essere presentate a reti non supervisionate per l'identificazione ingenua di categorie di una struttura semantica. Non vogliamo categorizzare numeri o variabili di testo come nomi utente o numeri di serie di parti.

Se le informazioni sintatticamente normalizzate sono opportunamente contrassegnate per indicare simboli altamente variabili come conteggi, capacità, metriche e timestamp, l'estrazione delle caratteristiche può essere applicata per apprendere i modelli di espressione in modo da mantenere la distinzione tra struttura semantica e variabili. Il mantenimento di tale distinzione consente di tracciare tendenze più continue (meno discrete) nelle metriche di sistema. Ciascuna voce può contenere zero o più di tali variabili, sia note a priori sia acquisite di recente tramite l'estrazione di feature.

Le tendenze possono essere rappresentate graficamente rispetto al tempo o al numero di istanze di un particolare tipo. Tale grafica può aiutare a identificare la fatica meccanica, l'approccio di condizioni di sovraccapacità o altri rischi che aumentano fino a un punto di guasto. Ulteriori reti neurali possono essere addestrate per produrre indicatori di avvertimento quando le tendenze indicano che tali condizioni sono imminenti.

Lazy Logging

Tutte queste analisi dei log sarebbero discutibili se gli architetti del software e gli addetti alla tecnologia smettessero di lasciare il formato di archiviazione di importanti informazioni di sistema ai vari e convenienti capricci degli sviluppatori software. I file di registro sono generalmente un disastro e l'estrazione di informazioni statistiche sui modelli in essi contenuti è una delle sfide più comuni nel controllo della qualità del software. La probabilità che il rigore venga mai applicato universalmente alla registrazione è scarsa poiché nessuno dei quadri di registrazione popolari incoraggia il rigore. Questo è probabilmente il motivo per cui questa domanda è stata vista frequentemente.

Requisiti Sezione di questa domanda specifica

Nel caso specifico presentato in questa domanda, il requisito n. 1 indica una preferenza per eseguire l'analisi nel browser, che è possibile ma non è raccomandato. Anche se l'ECMA è un meraviglioso linguaggio di scripting e il meccanismo di espressione regolare che può essere di aiuto nell'apprendimento dei parser è integrato nell'ECMA (che è conforme all'altra parte del requisito n. 1, che non richiede installazioni aggiuntive) i linguaggi non compilati non sono quasi efficiente come Java. E anche Java non è efficiente come C a causa della garbage collection e delle inefficienze che si verificano delegando la mappatura del codice byte al codice macchina per eseguire il tempo.

Molte sperimentazioni sull'apprendimento automatico impiegano Python, un altro linguaggio meraviglioso, ma la maggior parte del lavoro che ho svolto in Python è stato poi trasferito in C ++ computazionalmente efficiente per quasi 1.000 a 1 guadagni di velocità in molti casi. Anche la ricerca del metodo C ++ ha comportato un collo di bottiglia, quindi le porte usano pochissima eredità, in stile ECMA, ma molto più velocemente. Nel tipico codice del kernel tradizionale, l'uso delle strutture C e del puntatore a funzione elimina l'overhead di vtable.

Il secondo requisito dei gestori modulari è ragionevole e implica un ambiente di regole innescato che molti potrebbero essere tentati di ritenere incompatibile con le architetture NN, ma non lo è. Una volta identificate le categorie di pattern, cercare prima le più comuni in ulteriori dati di input è già implicito nella distinzione conosciuta / sconosciuta già incorporata nel processo sopra. Esiste tuttavia una sfida con questo approccio modulare.

Poiché l'integrità del sistema è spesso indicata da tendenze e non singole voci (come discusso in precedenza) e poiché l'integrità del sistema non è una somma lineare del valore di integrità delle singole voci, l'approccio modulare alla gestione delle voci non deve essere semplicemente reindirizzato al display senza ulteriori analisi. Questo è infatti il ​​luogo in cui le reti neurali forniranno i maggiori vantaggi funzionali nel monitoraggio della salute. Gli output dei moduli devono entrare in una rete neurale che può essere addestrata per identificare queste indicazioni non lineari di salute, pericoli imminenti e condizioni di rischio.

Inoltre, l'aspetto temporale del comportamento pre-fallimento implica che un'intera finestra temporale di voci di registro di notevole lunghezza deve entrare in questa rete. Ciò implica inoltre l'inadeguatezza di ECMA o Python come scelta per la parte della soluzione a elevata intensità computazionale. (Si noti che la tendenza in Python è quella di fare ciò che faccio con C ++: utilizzare la progettazione orientata agli oggetti, l'incapsulamento e schemi di progettazione facili da seguire per il codice di supervisione e il codice simile al kernel molto efficiente dal punto di vista computazionale per l'apprendimento effettivo e altri ad alta intensità computazionale o intensiva dei dati funzioni.)

Algoritmi di raccolta

Non è consigliabile scegliere algoritmi nelle fasi iniziali dell'architettura (come era implicito alla fine della domanda). Progettare prima il processo. Determinare i componenti di apprendimento, il tipo di essi necessari, il loro stato obiettivo dopo l'allenamento, dove è possibile utilizzare il rinforzo e come verrà generato il segnale di benessere / errore per rafforzare / correggere il comportamento desiderato della rete. Basare queste determinazioni non solo sul contenuto di visualizzazione desiderato ma sulla velocità prevista, sui requisiti delle risorse di calcolo e sulla velocità di apprendimento minima effettiva. Gli algoritmi, la lingua e la pianificazione della capacità per il sistema possono essere selezionati in modo significativo solo dopo che tutte queste cose sono state definite in modo approssimativo.

Lavoro simile in produzione

Il semplice analisi adattativa è in esecuzione qui in laboratorio come parte dell'automazione dei social network, ma solo per insiemi limitati di simboli e schemi sequenziali. Si adatta senza riconfigurazione a unità linguistiche, prefissi, finali e suffissi arbitrariamente grandi di base, limitati solo dalle nostre capacità hardware e throughput. L'esistenza di librerie di espressioni regolari è stata utile per semplificare la progettazione. Utilizziamo la libreria della serie PCRE versione 8 alimentata da una forma ansiotropica di DCNN per l'estrazione di funzionalità da una finestra che si sposta attraverso il testo di input con una dimensione di finestre configurabile e sposta la dimensione dell'incremento. L'euristica applicata alle statistiche del testo di input raccolte in un primo passaggio produce una serie di ipotetici PCRE disposti in due livelli.

L'ottimizzazione si verifica per applicare pesi probabilistici più elevati ai migliori PCRE in una ricerca di testo caoticamente perturbata. Utilizza le stesse strategie di convergenza per la discesa del gradiente utilizzate nella propagazione posteriore di NN in allenamento. È un approccio ingenuo che non fa ipotesi come l'esistenza di back-trace, file o errori. Si adatterà allo stesso modo ai messaggi arabi e a quelli spagnoli.

L'output è un grafico diretto arbitrario in memoria, che è simile a un dump di un database orientato agli oggetti.

قنبلة -> dangereux -> 4anlyss
bomba -> dangereux
ambiguïté -> 4anlyss -> préemption -> قنبلة

Sebbene un algoritmo rientrante per una versione di rinforzo sia stato eliminato e il segnale di benessere sia già disponibile, altri lavori hanno impedito di promuovere il parser adattivo o di procedere verso il passaggio successivo per utilizzare il lavoro per il linguaggio naturale: Abbinamento dei grafici diretti al grafico diretto persistente filtri che rappresentano idee, che imiterebbero l'aspetto del ricordo dell'idea della comprensione del linguaggio.

Commenti finali

Il sistema ha componenti e architettura di processo simili al problema di analisi dei log e dimostra i concetti sopra elencati. Naturalmente, maggiore è la disorganizzazione nel modo in cui viene effettuata la registrazione tra gli sviluppatori del sistema che effettuano la registrazione, più è difficile per un agente umano o artificiale disambiguare le voci. Alcuni log di sistema sono stati un controllo di qualità così scadente per così tanto tempo che il log è quasi inutile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.