Data-intensive applications have become widespread in the years, especially in cloud-like environments. Among them, Data Analytics (DA) and Machine Learning (ML) applications are particularly important categories that deeply impacted business and science in the last decade, and are expected to have an even higher impact in the upcoming years. In the latest years, we also saw hardware platforms evolving along different directions to overcome the limitations of Dennard’s scaling and the end of Moore’s law. While heterogeneity is coming into play for several applications, Central Processing Units (CPUs) have also evolved towards a growing number of cores, specialized Single Instruction, Multiple Data (SIMD) units, high memory hierarchies and, in general, a more complex and diverse set of features. On the other side, also data-intensive applications became more complex, to the extent that a current ML model may comprise tens of diverse operators to compute a single prediction value, while taking in input data of multiple types like text, number vectors and images. Oftentimes these applications are structured as “data pipelines” and go through many steps like input parsing, data pre-processing, analysis and possibly loading the output to some “data sink” at the end. Mastering this complexity to achieve the best implementation and deployment of an application in a given setting (hardware platform, software stack, co-located applications, etc.) is becoming a key issue to achieve best usage of the infrastructure and cost-effectiveness. This problem is especially hard with heterogeneous platforms, whose hardware features may not suit some parts of an application to be accelerated or may require a long redesign effort. Here, where the inevitable complexity of applications determines the diversity of operations, CPUs are still central, as they provide the flexibility and the maturity to efficiently run most of these workloads with sufficient performance even for today’s needs, while being easier to program than other architectures. Moreover, their general-purpose design naturally fits the diversity of data-intensive applications. This work explores the performance headroom that lies unused in modern CPUs with data-intensive applications. This headroom encompasses several dimensions, each one with specific problems and solutions. A first problem to solve is the performance isolation of co-located applications on the CPU, which has to take in account the sharing of the Last Level Cache (LLC). Here, we propose and evaluate a mechanism for partitioning the LLC that works on recent server-like CPUs and requires software-only modifications in the Operating System (OS), thus not impacting hardware nor applications. This solution proves to be effective with a diverse set of benchmarks and allows meeting Quality of Service (QoS) goals even in a contentious, hardly predictable environment. The second problem is the optimization of data-intensive applications, which can be composed of multiple, diverse computational kernels. This work explores the limitations of current solutions, revolving around a black-box approach: application kernels are individually optimized and run, disregarding their characteristics and their sequence along the data path; indeed, a simple case study shows that even a manual, naïve solution can achieve noticeable speedups with respect to the current state of the art. Building on these findings, we generalize them into a white-box approach for applications optimization: while applications should be written as sequences of high-level operators, as current development frameworks already do, this sequence should also be exposed to the system where these applications run. By looking at this structure during the deployment of the application, the system can optimize it in an end-to-end fashion, tailoring the implementation to the specific sequence of operators, to the hardware characteristics and to the overall system characteristics, and running it with the most appropriate settings; in this way the application can make the best use of the CPU and provide higher QoS. Such a re-thinking of current systems and frameworks towards a white-box also allows a cleaner support of heterogeneous accelerators. Indeed, the high-level description that we advocate allows the system to transparently map some operations to more specialized accelerators if need be. However, optimized solutions need to keep a sufficient degree of flexibility to cover the diversity of computational kernels. As an example, we explore a case study around Regular Expression (RE) matching, which is a ubiquitous kernel in data-intensive applications with limited performance on CPUs, and we propose an architecture that enhances previous work in terms of performance and flexibility, making it a good candidate for the integration with existing frameworks. Overall, this work proposes several solutions for the main issues around modern CPUs and data-intensive applications, breaking some common abstractions and advocating for an appropriate description level of those applications. The solutions proposed here leverage this level of description that enables various optimizations, providing novel guidelines in order to make the best use of the architecture. From this work, several research directions arise, especially around extending these abstractions and the related solutions to work with heterogeneous devices, whose usage for the masses calls for more automated optimization strategies and prediction models.

Le applicazioni data-intensive si sono diffuse negli ultimi anni, specialmente in ambienti cloud-like. Tra queste, Data Analytics (DA) e Machine Learning (ML) sono categorie particolarmente importanti che hanno avuto un impatto profondo sull’industria e sulla scienza nell'ultimo decennio, e si prevede che avranno un impatto ancora maggiore nei prossimi anni. Negli ultimi anni, abbiamo anche visto piattaforme hardware evolvere lungo diverse direzioni per superare i limiti della lagge di Dennard e la fine della legge di Moore. Mentre l'eterogeneità sta entrando in gioco per diverse applicazioni, le Central Processing Units (CPU) si sono evolute verso un numero crescente di core, unità Single Instruction, Multiple Data (SIMD) specializzate, complesse gerarchie di memoria e, in generale, un insieme di funzionalità più complesse e diverse. D'altra parte, anche le applicazioni data-intensive sono diventate più complesse, al punto che un modello ML attuale può essere composto da decine di operatori diversi per calcolare una predizione, avendo in input dati di tipi diversi come testo, vettori numerici e immagini. Spesso queste applicazioni sono strutturate come "pipeline di dati" e si compongono di molti passaggi come l'analisi degli input, la pre-elaborazione dei dati, l'analisi e, eventualmente, il caricamento dell'output in alcuni "data sink" alla fine. Padroneggiare questa complessità per ottenere la migliore implementazione e installazione di un'applicazione in un determinato ambiente (piattaforma hardware, stack software, applicazioni co-locate, ecc.) sta diventando un problema chiave per ottenere il miglior utilizzo dell'infrastruttura e redditività. Questo problema è particolarmente difficile con piattaforme eterogenee, le cui caratteristiche hardware potrebbero non adattarsi ad alcune parti di un'applicazione da accelerare o richiedere un lungo sforzo di riprogettazione. Qui, dove l'inevitabile complessità delle applicazioni determina la diversità delle operazioni, le CPU sono ancora centrali, in quanto forniscono la flessibilità e la maturità per eseguire in modo efficiente la maggior parte di questi carichi di lavoro con prestazioni sufficienti anche per le esigenze odierne, essendo al contempo più facili da programmare di altre architetture. Inoltre, il loro design generico si adatta naturalmente alla diversità delle applicazioni data-intensive. Questo lavoro esplora la possibilità di ulteriori ottimizzazioni delle prestazioni con le moderne CPU con applicazioni data-intensive. Questa possibilità esplora diverse dimensioni, ognuna con problemi e soluzioni specifici. Un primo problema da risolvere è l'isolamento delle prestazioni delle applicazioni co-locate sulla CPU, che deve tenere conto della condivisione di Last Level Cache (LLC). Qui, proponiamo e valutiamo un meccanismo per il partizionamento della LLC che funziona su recenti CPU server e richiede unicamente modifiche software nel Sistema Operativo (OS), senza quindi alcun impatto sull'hardware o sulle applicazioni. Questa soluzione si rivela efficace con una serie diversificata di applicazioni di riferimento e consente di raggiungere obiettivi di qualità del servizio (QoS) anche in un ambiente con contesa e difficilmente prevedibile. Il secondo problema è l'ottimizzazione delle applicazioni data-intensive, che possono essere composte da molteplici e diversi kernel computazionali. Questo lavoro esplora i limiti delle soluzioni attuali, ruotando attorno a un approccio “a scatola nera”: i kernel dell'applicazione vengono singolarmente ottimizzati ed eseguiti, ignorando le loro caratteristiche e la loro sequenza di computazione; in effetti, un semplice caso di studio mostra che anche una soluzione manuale ed poco avanzata può raggiungere notevoli velocità rispetto allo stato attuale della tecnica. Basandoci su questi risultati, li generalizziamo in un approccio “a scatola bianca” per l'ottimizzazione delle applicazioni: mentre le applicazioni dovrebbero essere scritte come sequenze di operatori di alto livello, come già fanno gli attuali framework di sviluppo, questa sequenza dovrebbe anche essere esposta al sistema dove queste applicazioni eseguire. Osservando questa struttura durante l’installazione dell'applicazione, il sistema può ottimizzarla in modo end-to-end, adattando l'implementazione alla sequenza specifica di operatori, alle caratteristiche hardware e alle caratteristiche generali del sistema ed eseguendolo con le impostazioni più appropriate; in questo modo l'applicazione può sfruttare al meglio la CPU e fornire una QoS più elevata. Un simile ripensamento dei sistemi e delle strutture attuali verso una “scatola bianca” consente anche un supporto più naturale di acceleratori eterogenei. In generale, la descrizione di alto livello che sosteniamo consente al sistema di mappare in modo trasparente alcune operazioni su acceleratori specializzati, se necessario. Tuttavia, le soluzioni ottimizzate devono mantenere un sufficiente grado di flessibilità per coprire la diversità dei kernel computazionali. Ad esempio, qui esploriamo un caso di studio sull'adattamento di espressioni regolari, un kernel onnipresente in applicazioni data-intensive con prestazioni limitate sulle CPU, e proponiamo un'architettura che migliora le soluzioni precedenti in termini di prestazioni e flessibilità, facendone un buon candidato per l'integrazione con i quadri esistenti. Nel complesso, questo lavoro propone diverse soluzioni per i problemi principali relativi alle moderne CPU e alle applicazioni data-intensive, rinunciando ad alcune astrazioni comuni e proponendo un livello di descrizione appropriato di tali applicazioni. Le soluzioni qui proposte sfruttano questo livello di descrizione che consente varie ottimizzazioni, fornendo nuove linee guida al fine di utilizzare al meglio l'architettura. Da questo lavoro derivano diverse direzioni di ricerca, in particolare per estendere queste astrazioni e le relative soluzioni per lavorare con dispositivi eterogenei, il cui utilizzo di massa richiede strategie di ottimizzazione e modelli di previsione più automatizzati.

Optimizing data-intensive applications for modern hardware platforms

SCOLARI, ALBERTO

Abstract

Data-intensive applications have become widespread in the years, especially in cloud-like environments. Among them, Data Analytics (DA) and Machine Learning (ML) applications are particularly important categories that deeply impacted business and science in the last decade, and are expected to have an even higher impact in the upcoming years. In the latest years, we also saw hardware platforms evolving along different directions to overcome the limitations of Dennard’s scaling and the end of Moore’s law. While heterogeneity is coming into play for several applications, Central Processing Units (CPUs) have also evolved towards a growing number of cores, specialized Single Instruction, Multiple Data (SIMD) units, high memory hierarchies and, in general, a more complex and diverse set of features. On the other side, also data-intensive applications became more complex, to the extent that a current ML model may comprise tens of diverse operators to compute a single prediction value, while taking in input data of multiple types like text, number vectors and images. Oftentimes these applications are structured as “data pipelines” and go through many steps like input parsing, data pre-processing, analysis and possibly loading the output to some “data sink” at the end. Mastering this complexity to achieve the best implementation and deployment of an application in a given setting (hardware platform, software stack, co-located applications, etc.) is becoming a key issue to achieve best usage of the infrastructure and cost-effectiveness. This problem is especially hard with heterogeneous platforms, whose hardware features may not suit some parts of an application to be accelerated or may require a long redesign effort. Here, where the inevitable complexity of applications determines the diversity of operations, CPUs are still central, as they provide the flexibility and the maturity to efficiently run most of these workloads with sufficient performance even for today’s needs, while being easier to program than other architectures. Moreover, their general-purpose design naturally fits the diversity of data-intensive applications. This work explores the performance headroom that lies unused in modern CPUs with data-intensive applications. This headroom encompasses several dimensions, each one with specific problems and solutions. A first problem to solve is the performance isolation of co-located applications on the CPU, which has to take in account the sharing of the Last Level Cache (LLC). Here, we propose and evaluate a mechanism for partitioning the LLC that works on recent server-like CPUs and requires software-only modifications in the Operating System (OS), thus not impacting hardware nor applications. This solution proves to be effective with a diverse set of benchmarks and allows meeting Quality of Service (QoS) goals even in a contentious, hardly predictable environment. The second problem is the optimization of data-intensive applications, which can be composed of multiple, diverse computational kernels. This work explores the limitations of current solutions, revolving around a black-box approach: application kernels are individually optimized and run, disregarding their characteristics and their sequence along the data path; indeed, a simple case study shows that even a manual, naïve solution can achieve noticeable speedups with respect to the current state of the art. Building on these findings, we generalize them into a white-box approach for applications optimization: while applications should be written as sequences of high-level operators, as current development frameworks already do, this sequence should also be exposed to the system where these applications run. By looking at this structure during the deployment of the application, the system can optimize it in an end-to-end fashion, tailoring the implementation to the specific sequence of operators, to the hardware characteristics and to the overall system characteristics, and running it with the most appropriate settings; in this way the application can make the best use of the CPU and provide higher QoS. Such a re-thinking of current systems and frameworks towards a white-box also allows a cleaner support of heterogeneous accelerators. Indeed, the high-level description that we advocate allows the system to transparently map some operations to more specialized accelerators if need be. However, optimized solutions need to keep a sufficient degree of flexibility to cover the diversity of computational kernels. As an example, we explore a case study around Regular Expression (RE) matching, which is a ubiquitous kernel in data-intensive applications with limited performance on CPUs, and we propose an architecture that enhances previous work in terms of performance and flexibility, making it a good candidate for the integration with existing frameworks. Overall, this work proposes several solutions for the main issues around modern CPUs and data-intensive applications, breaking some common abstractions and advocating for an appropriate description level of those applications. The solutions proposed here leverage this level of description that enables various optimizations, providing novel guidelines in order to make the best use of the architecture. From this work, several research directions arise, especially around extending these abstractions and the related solutions to work with heterogeneous devices, whose usage for the masses calls for more automated optimization strategies and prediction models.
PERNICI, BARBARA
LANZI, PIER LUCA
6-feb-2019
Le applicazioni data-intensive si sono diffuse negli ultimi anni, specialmente in ambienti cloud-like. Tra queste, Data Analytics (DA) e Machine Learning (ML) sono categorie particolarmente importanti che hanno avuto un impatto profondo sull’industria e sulla scienza nell'ultimo decennio, e si prevede che avranno un impatto ancora maggiore nei prossimi anni. Negli ultimi anni, abbiamo anche visto piattaforme hardware evolvere lungo diverse direzioni per superare i limiti della lagge di Dennard e la fine della legge di Moore. Mentre l'eterogeneità sta entrando in gioco per diverse applicazioni, le Central Processing Units (CPU) si sono evolute verso un numero crescente di core, unità Single Instruction, Multiple Data (SIMD) specializzate, complesse gerarchie di memoria e, in generale, un insieme di funzionalità più complesse e diverse. D'altra parte, anche le applicazioni data-intensive sono diventate più complesse, al punto che un modello ML attuale può essere composto da decine di operatori diversi per calcolare una predizione, avendo in input dati di tipi diversi come testo, vettori numerici e immagini. Spesso queste applicazioni sono strutturate come "pipeline di dati" e si compongono di molti passaggi come l'analisi degli input, la pre-elaborazione dei dati, l'analisi e, eventualmente, il caricamento dell'output in alcuni "data sink" alla fine. Padroneggiare questa complessità per ottenere la migliore implementazione e installazione di un'applicazione in un determinato ambiente (piattaforma hardware, stack software, applicazioni co-locate, ecc.) sta diventando un problema chiave per ottenere il miglior utilizzo dell'infrastruttura e redditività. Questo problema è particolarmente difficile con piattaforme eterogenee, le cui caratteristiche hardware potrebbero non adattarsi ad alcune parti di un'applicazione da accelerare o richiedere un lungo sforzo di riprogettazione. Qui, dove l'inevitabile complessità delle applicazioni determina la diversità delle operazioni, le CPU sono ancora centrali, in quanto forniscono la flessibilità e la maturità per eseguire in modo efficiente la maggior parte di questi carichi di lavoro con prestazioni sufficienti anche per le esigenze odierne, essendo al contempo più facili da programmare di altre architetture. Inoltre, il loro design generico si adatta naturalmente alla diversità delle applicazioni data-intensive. Questo lavoro esplora la possibilità di ulteriori ottimizzazioni delle prestazioni con le moderne CPU con applicazioni data-intensive. Questa possibilità esplora diverse dimensioni, ognuna con problemi e soluzioni specifici. Un primo problema da risolvere è l'isolamento delle prestazioni delle applicazioni co-locate sulla CPU, che deve tenere conto della condivisione di Last Level Cache (LLC). Qui, proponiamo e valutiamo un meccanismo per il partizionamento della LLC che funziona su recenti CPU server e richiede unicamente modifiche software nel Sistema Operativo (OS), senza quindi alcun impatto sull'hardware o sulle applicazioni. Questa soluzione si rivela efficace con una serie diversificata di applicazioni di riferimento e consente di raggiungere obiettivi di qualità del servizio (QoS) anche in un ambiente con contesa e difficilmente prevedibile. Il secondo problema è l'ottimizzazione delle applicazioni data-intensive, che possono essere composte da molteplici e diversi kernel computazionali. Questo lavoro esplora i limiti delle soluzioni attuali, ruotando attorno a un approccio “a scatola nera”: i kernel dell'applicazione vengono singolarmente ottimizzati ed eseguiti, ignorando le loro caratteristiche e la loro sequenza di computazione; in effetti, un semplice caso di studio mostra che anche una soluzione manuale ed poco avanzata può raggiungere notevoli velocità rispetto allo stato attuale della tecnica. Basandoci su questi risultati, li generalizziamo in un approccio “a scatola bianca” per l'ottimizzazione delle applicazioni: mentre le applicazioni dovrebbero essere scritte come sequenze di operatori di alto livello, come già fanno gli attuali framework di sviluppo, questa sequenza dovrebbe anche essere esposta al sistema dove queste applicazioni eseguire. Osservando questa struttura durante l’installazione dell'applicazione, il sistema può ottimizzarla in modo end-to-end, adattando l'implementazione alla sequenza specifica di operatori, alle caratteristiche hardware e alle caratteristiche generali del sistema ed eseguendolo con le impostazioni più appropriate; in questo modo l'applicazione può sfruttare al meglio la CPU e fornire una QoS più elevata. Un simile ripensamento dei sistemi e delle strutture attuali verso una “scatola bianca” consente anche un supporto più naturale di acceleratori eterogenei. In generale, la descrizione di alto livello che sosteniamo consente al sistema di mappare in modo trasparente alcune operazioni su acceleratori specializzati, se necessario. Tuttavia, le soluzioni ottimizzate devono mantenere un sufficiente grado di flessibilità per coprire la diversità dei kernel computazionali. Ad esempio, qui esploriamo un caso di studio sull'adattamento di espressioni regolari, un kernel onnipresente in applicazioni data-intensive con prestazioni limitate sulle CPU, e proponiamo un'architettura che migliora le soluzioni precedenti in termini di prestazioni e flessibilità, facendone un buon candidato per l'integrazione con i quadri esistenti. Nel complesso, questo lavoro propone diverse soluzioni per i problemi principali relativi alle moderne CPU e alle applicazioni data-intensive, rinunciando ad alcune astrazioni comuni e proponendo un livello di descrizione appropriato di tali applicazioni. Le soluzioni qui proposte sfruttano questo livello di descrizione che consente varie ottimizzazioni, fornendo nuove linee guida al fine di utilizzare al meglio l'architettura. Da questo lavoro derivano diverse direzioni di ricerca, in particolare per estendere queste astrazioni e le relative soluzioni per lavorare con dispositivi eterogenei, il cui utilizzo di massa richiede strategie di ottimizzazione e modelli di previsione più automatizzati.
Tesi di dottorato
File allegati
File Dimensione Formato  
phd_thesis.pdf

accessibile in internet per tutti

Descrizione: Thesis text
Dimensione 1.38 MB
Formato Adobe PDF
1.38 MB Adobe PDF Visualizza/Apri

I documenti in POLITesi sono protetti da copyright e tutti i diritti sono riservati, salvo diversa indicazione.

Utilizza questo identificativo per citare o creare un link a questo documento: https://hdl.handle.net/10589/144276