L'ottimizzazione degli iperparametri è fondamentale per i modelli di apprendimento automatico, ma il processo può essere computazionalmente costoso e complesso. I metodi tradizionali di ottimizzazione a griglia, a ricerca casuale o persino bayesiana spesso trascurano aree critiche dello spazio degli iperparametri, dando origine a modelli subottimali.
In questa presentazione, illustreremo un componente aggiuntivo JMP da noi sviluppato che utilizza il DOE a riempimento di spazio per affrontare in modo più efficiente la sfida dell'ottimizzazione degli iperparametri. L'utilizzo del DOE a riempimento di spazio garantisce che le combinazioni di iperparametri vengano campionate in modo più uniforme nell'intero spazio dei parametri, riducendo così il numero di valutazioni richieste e aumentando la probabilità di trovare le impostazioni ottimali.
Questo intervento evidenzia anche la migliore integrazione con Python presente in JMP 18 e come sfruttare funzionalità come DOE all'interno di JMP possa essere vantaggioso per i data scientist. Questo intervento combina tecniche statistiche avanzate con strumenti pratici e accessibili per migliorare le prestazioni dei modelli in diverse applicazioni.
Salve. Grazie per aver partecipato al nostro intervento. L'obiettivo di questo intervento è migliorare l'apprendimento automatico utilizzando progetti di riempimento dello spazio per ottimizzare gli iperparametri. Mi chiamo Peter Hirsch e il mio co-relatore è Scott Allen. Prima di spiegare il nostro approccio al miglioramento dell'apprendimento automatico, vorrei condividere alcuni risultati.
Ecco due concorrenti a cui è stata data la sfida di costruire 10 modelli predittivi. Ognuno di questi modelli predittivi era una risposta categorica. Se osserviamo il background dei due concorrenti, in un angolo abbiamo un data scientist di fama mondiale, Russ Wolfinger, e nell'altro angolo non uno scienziato di fama mondiale. Questo è come se io giocassi a basket uno contro uno con Michael Jordan. Ci si aspetterebbe un risultato molto sbilanciato.
Come potete vedere, i risultati sono stati molto simili, con i data scientist meno noti che hanno ottenuto risultati migliori. Com'è possibile? Il componente aggiuntivo Torch Companion è stata la mia arma segreta. Questo componente aggiuntivo ci aiuta a migliorare i risultati della nostra modellazione, ed è come avere LeBron James come compagno di squadra in quella partita di basket uno contro uno.
Vorrei iniziare con un quiz molto semplice. Quando guardiamo questa immagine, vediamo un gatto o un cane? E quest'altra immagine? Vediamo un gatto o un cane? Abbastanza semplice, possiamo dire che il cane è a sinistra e il gatto a destra, ma come facciamo a sapere che quell'immagine raffigura un cane o un gatto? Quali sono le caratteristiche principali? Se dovessimo costruire un modello, come addestreremmo quel modello a identificare un gatto o un cane? Ecco un diagramma che ci fornisce una rappresentazione visiva di come è costruita una rete neurale. In questo caso, l'immagine è un quattro scritto a mano, suddiviso in tre strati con dimensioni di quattro nodi ciascuno.
Ogni nodo ha una rappresentazione diversa dell'input originale e questi nodi e livelli vengono combinati per aiutare a formulare una previsione. Ogni set di dati può avere un diverso livello di complessità. Se consideriamo l'esempio in alto, cercare di identificare se un punto è verde o rosso potrebbe essere un modello molto più semplice rispetto a quello in basso, dove osserviamo l'immagine di un cane o di un gatto. Questo potrebbe richiedere un modello molto più complesso. Il numero di livelli e le dimensioni dei livelli, o nodi per livello, sono chiamati iperparametri e dovranno essere ottimizzati per ciascun modello.
Come possiamo adattare il modello per affrontare diversi problemi? Se guardiamo qui, questa è la finestra di avvio del componente aggiuntivo di ottimizzazione Torch all'interno di JMP, e ci sono molte opzioni diverse. Possiamo considerare diversi aspetti come epoche, velocità di apprendimento, dimensione del layer, funzione di attivazione. Con tutte queste opzioni, abbiamo milioni di combinazioni diverse che possiamo eseguire. Da dove iniziamo?
Ci sono un paio di opzioni che potremmo adottare quando esploriamo lo spazio degli iperparametri. La prima è una ricerca a griglia, e credo che sia la più comune o la più strettamente correlata a un disegno fattoriale completo. Se la considerassimo, esamineremmo ogni possibile combinazione di tutti i fattori, e questo porterebbe a oltre due milioni e mezzo di modelli diversi da eseguire. Nella maggior parte dei casi, è troppo. Potremmo anche effettuare una ricerca casuale, scegliendo determinate combinazioni di fattori da eseguire a caso.
Potremmo anche adottare un approccio di ottimizzazione bayesiana, oppure potremmo chiedere a Russ Wolfinger. Ora, sarebbe fantastico avere Russ in rubrica, o un altro data scientist simile a Russ, ma non è sempre un'opzione. Come potremmo io, Scott o un normale sperimentatore risolvere questo problema? Lo trattiamo come un esperimento. In JMP, come conduciamo gli esperimenti? Lo facciamo un fattore alla volta? No, Drake non pensa che sia una buona idea. Probabilmente dovremmo progettare un esperimento. Parleremo un po' di come funziona questo approccio e lascerò la parola a Scott.
Grazie, Peter. Quello che faremo qui è semplicemente spiegare in cosa consiste questo Torch Companion, mostrare alcuni esempi e poi lavorare un po' con il componente aggiuntivo. Prima di entrare nel dettaglio, vorrei parlarvi brevemente di cosa contiene questo componente aggiuntivo.
Questo componente aggiuntivo unisce in realtà molte funzionalità JMP diverse, come le funzioni tabella, la piattaforma DOE, il componente aggiuntivo Torch Deep Learning sviluppato da Russ e il suo team, e poi alcuni output di Graph Builder. Con questo componente aggiuntivo, probabilmente potresti fare tutte queste cose individualmente, ma ciò che fa questo componente aggiuntivo è solo cercare di creare un flusso di lavoro fluido. Il modo in cui interagisci con il componente aggiuntivo è in realtà l'utente, proprio come molte piattaforme JMP, che specificherà colonne che possono essere la tua risposta, i tuoi fattori, la convalida. Quindi specifichi i parametri Torch o, in questo caso, un intervallo di parametri o una selezione di diverse opzioni, e poi li passi al componente aggiuntivo Torch. Vogliamo solo dare un'occhiata veloce ad alcune di queste interfacce.
La finestra di dialogo delle colonne è molto simile a quella che si potrebbe vedere in una piattaforma JMP standard, dove si caricano la risposta, i fattori e le colonne di convalida. I fattori possono essere numerici, caratteri o, in questo caso, un modello di immagine. Credo che una delle caratteristiche uniche del componente aggiuntivo Torch in JMP sia la possibilità di analizzare i modelli di immagine, e quindi ci siamo assicurati di integrarla anche in questo componente aggiuntivo complementare. Si fa clic su OK e si accede alla finestra delle specifiche. Abbiamo collaborato un po' con Russ su questo aspetto, solo per ottenere indicazioni su cosa includere qui in termini di parametri che è possibile analizzare per ottenere un modello ottimale.
L'obiettivo qui è utilizzare Torch Companion insieme al componente aggiuntivo Torch Deep Learning. Non abbiamo incluso tutti i diversi parametri che potreste voler ottimizzare, ma in realtà questo vi avvicinerà a un modello ottimale e vi permetterà di farlo in modo più efficiente. Possiamo ottimizzare aspetti come il modello, il tipo di modello tabulare o il tipo di modello immagine, e alcuni di questi parametri. Possiamo anche esaminare diverse opzioni relative ai parametri della struttura del modello, in particolare il numero di prove DOE. In questo modo, invece di eseguire un modello alla volta, è possibile impostare un approccio basato su un fattore alla volta: è sufficiente impostare un intervallo di parametri e analizzare 200 o 300 modelli con un solo clic.
Noterete che alcune opzioni sono in grigio. Volevamo provare a rendere questo componente aggiuntivo accessibile anche a chi non ha familiarità con Torch o con il machine learning in generale, quindi abbiamo inserito alcune limitazioni, e so che Peter ne ha apprezzate alcune durante la fase di sviluppo.
Sì, sicuramente mi serviva per restare sulla buona strada. È stato utile.
Se non avete familiarità con questi diversi tipi di modelli, ne abbiamo preselezionati alcuni tra i più comuni e alcuni buoni punti di partenza. Se desiderate utilizzare questo componente aggiuntivo per visualizzare i parametri, potete selezionare la casella di controllo "Parametri di visualizzazione" e iniziare a esaminare una serie di parametri. Ancora una volta, evidenzieremo in grigio alcune opzioni che potrebbero non essere ottimali in base all'aspetto della tabella dati che avete. Abbiamo anche selezionato alcune delle funzioni di attivazione più comuni e impostato alcuni di questi parametri per scalare a un fattore di, o per potenza di due, e questo vi aiuta a visualizzare in modo più efficiente una gamma molto ampia di, ad esempio, dimensioni di layer.
Vogliamo anche avere alcune opzioni avanzate qui, e se le selezioni, avrai accesso a tutti i diversi tipi di modelli disponibili nel componente aggiuntivo Torch, così come ai diversi tipi di modelli tabulari e a tutte le diverse funzioni di attivazione disponibili. A seconda del punto in cui ti trovi nella tua conoscenza di Torch Deep Learning, puoi seguire la strada semplice o quella avanzata. Vediamo un esempio di come funziona. In questo caso, ho precaricato alcune opzioni diverse qui, una gamma di epoche e velocità di apprendimento, ho selezionato alcune dimensioni di livello e ho impostato questo valore su 100. Puoi scegliere quante prove desideri.
Quindi, una volta impostati tutti gli intervalli di parametri, fai clic su "Esegui". Una volta fatto clic su "Esegui", entriamo nel dettaglio di quel componente aggiuntivo e, quando fai clic su "Esegui", verrà creato il diagramma di riempimento dello spazio dopo aver eseguito alcune manipolazioni nella tabella. Quindi, ogni riga di quella tabella di progettazione di riempimento dello spazio verrà trasferita a Torch Deep Learning. In realtà, prima di iniziare la presentazione, ho avviato un modello, e come puoi vedere l'ho impostato per eseguire 500 modelli Torch, e come puoi vedere, procede a gonfie vele mentre parliamo, quindi esamina ciascuna di quelle righe in quella progettazione di riempimento dello spazio, dandoci una piccola indicazione di come sta andando la nostra funzione di perdita rispetto alle epoche, giusto per darci un'indicazione di aver selezionato alcuni parametri appropriati. Continueremo con la presentazione qui e torneremo su questo argomento tra qualche minuto.
Una volta che il componente aggiuntivo Torch per il deep learning è in esecuzione, una volta completate tutte quelle centinaia, decine o il numero specificato di modelli, riassumerà i risultati utilizzando alcune funzioni aggiuntive per le tabelle e un generatore di grafici, per poi fornire un output o una finestra di report per interpretare tali risultati. Sulla base di tale interpretazione, si possono seguire due percorsi diversi. Si può scegliere un percorso che riporti alla specifica dei parametri. Forse non si sono ottenuti modelli soddisfacenti. Forse si pensa che ci sia margine di miglioramento.
Puoi impostare nuovi intervalli di parametri, selezionare funzioni diverse e quindi ricominciare il ciclo, e questo aggiungerà semplicemente i nuovi risultati ai risultati originali, oppure potresti aver trovato alcuni modelli davvero validi, di cui ti senti sicuro, che non hai bisogno di migliorare ulteriormente, e quello che puoi fare ora è passarli direttamente al componente aggiuntivo Torch Deep Learning in modo da poter apportare ulteriori perfezionamenti al modello, oppure puoi confrontare, salvare e distribuire quei modelli, oppure puoi ottimizzare i parametri che non riesci a ottimizzare nel companion. Questo è il flusso di lavoro che abbiamo definito, ed è stato divertente metterlo insieme, ma devo dire che Peter è quello che ha fatto la maggior parte del lavoro pesante nella costruzione del modello. Peter, forse puoi parlarci della tua esperienza nell'uso di questo componente aggiuntivo.
Penso che se ci sono sviluppatori software qui, si possa pensare a Scott come allo sviluppatore del componente aggiuntivo, mentre io ero il tester. Mi sono venute in mente un paio di cose. Questo è un DOE, e il DOE è spesso un processo iterativo in cui eseguiamo un singolo DOE, impariamo da quel DOE e poi costruiamo magari un DOE ottimale su di esso. Se osserviamo i risultati che ho ottenuto da un paio di modelli, si può vedere che la maggior parte delle volte eseguo più di un DOE. Spesso, questi modelli venivano eseguiti molto velocemente, in pochi secondi, e quindi si poteva elaborare un numero molto elevato di modelli. A volte ci voleva molto più tempo e si dovevano eseguire più DOE, e non si voleva eseguirne 100 per iniziare. Ad esempio, guardando il modello in alto, quello era un modello di immagine, e ogni modello richiedeva circa 10 minuti per essere eseguito.
Se avessi iniziato con 200 modelli, saresti rimasto lì ad aspettare un weekend prima che accadesse. Poi, se guardi gli altri, forse eseguirne 200, quando impiegano tutti 4 secondi ciascuno, è un po' meglio. Un paio di suggerimenti su questo. Mi piace usare un set di convalida incrociata holdout per iniziare perché è un processo molto più rapido rispetto a K-fold. Quando lo fai effettivamente e se K-fold ti piace, alla fine, quando lo avvii in Torch, puoi cambiare la colonna di convalida, ma credo che per l'ottimizzazione, preferisca usare quel singolo set di convalida.
Inoltre, adoro il controllo del tempo integrato che Scott ha implementato. Se temi che un modello possa richiedere molto tempo, come un modello di immagine, puoi far controllare il componente aggiuntivo di ottimizzazione per te.
Bene. Grazie, Peter. Oserei dire che probabilmente hai creato, a parte Rust, probabilmente il maggior numero di modelli Torch di chiunque altro, su JMP.
Sicuramente quelli con le prestazioni peggiori.
Cambiamo argomento, passiamo al componente aggiuntivo e mostriamo alcuni di questi report e come è possibile analizzarli e ottimizzarli. Torniamo a controllare il nostro modello. Non abbiamo ancora finito. Ne abbiamo circa 270 dei 500 che avevamo specificato.
Un'altra cosa che è stata integrata è la possibilità di annullare. Se annulliamo semplicemente questo, e potresti annullare per diversi motivi. Forse ci stanno mettendo più tempo del previsto, o hai poco tempo. Qualunque sia il motivo, puoi annullare. Quando accetti l'errore Torch, ti verrà data la possibilità di continuare con l'esecuzione successiva, quindi magari stai eseguendo un modello di immagine, e tutti stanno funzionando abbastanza velocemente, ma poi ne trovi uno che richiederà davvero molto tempo.
Si può semplicemente continuare con il DOE e saltarlo e passare a quello successivo, oppure si può semplicemente interrompere del tutto l'esecuzione del DOE, ed è quello che faremo qui. Lo interromperà, creerà il report e la finestra del report è qui sotto. Ecco la finestra del report. Quello che ha fatto è che ne avevamo 500 nel nostro DOE, ma potete vedere che abbiamo i risultati per 270 di questi.
Quello che faremo ora è semplicemente dare un'occhiata a questa tabella dei risultati e vorrei illustrarvi alcuni degli elementi più importanti per iniziare. La prima cosa sono le statistiche di riepilogo. La tabella è organizzata in base all'R-quadrato di convalida, quindi maggiore è l'R-quadrato di convalida, minore è il numero di righe. Quindi avrete accesso a tutte le diverse impostazioni dei parametri, ai diversi input e ad alcuni output come il tempo impiegato per eseguire i modelli e il numero di DOE eseguiti finora.
Il primo strumento diagnostico che puoi prendere in considerazione è la mappa termica R-quadrato. Si tratta semplicemente di tracciare il grafico dell'R-quadrato di convalida rispetto all'R-quadrato di addestramento. Preferiresti sicuramente i modelli con valori di R-quadrato elevati sia per la convalida che per l'addestramento, ma puoi certamente vedere che qui ottieni un'ampia gamma di valori di R-quadrato. Penso che questa sia una considerazione importante se sei nuovo di Torch o del machine learning: se imposti alcuni parametri, se non sei sicuro di quali parametri impostare, potresti ottenere modelli qui sotto. Potresti dire: "Non sarò davvero in grado di costruire un buon modello".
Poi si regolano alcuni parametri, e forse peggiorano. Quello che possiamo fare è vedere che quando si analizzano un gruppo di parametri, si ottiene una visione migliore di ciò che è possibile fare con quel modello. Possiamo vedere, in questo caso, che abbiamo alcuni modelli qui sopra che sono piuttosto buoni con un R-quadrato elevato per la convalida e l'addestramento. Ci sono alcuni filtri dati integrati, ma sono tutti disponibili solo in Graph Builder, quindi si possono certamente prendere questi dati e rappresentarli graficamente come si preferisce. Ci sono anche due schede che esaminano i singoli parametri, quindi i parametri di ottimizzazione del modello come il tasso di apprendimento e le epoche, e il loro andamento nel tempo, o nello spazio del modello, e poi anche le funzioni di attivazione e altri parametri della struttura dei livelli.
Una cosa che potresti considerare qui è la scansione di molti diversi tipi di funzioni di attivazione. So, Peter, che hai trovato risultati interessanti quando hai analizzato questi modelli.
Assolutamente. Quando abbiamo iniziato a sviluppare questo componente aggiuntivo, Russ ci ha consigliato di analizzare una singola funzione di attivazione e di usare ReLU. ReLU è la più comune. È quella che tutti usano. È un buon punto di partenza. In alcuni casi, ReLU funzionava bene, ma nella maggior parte dei casi abbiamo scoperto che una delle altre funzioni di attivazione in realtà funzionava leggermente meglio. Non che l'approccio di Russ non fosse valido, ma è stato bello poter esaminare tutte queste funzioni di attivazione e vedere se si potesse ottenere un risultato leggermente migliore modificando quella funzione di attivazione.
No. Credo che uno degli obiettivi qui sia proprio questo: se non conoscete queste funzioni di attivazione, o forse, se le conoscete, potreste sapere quale potrebbe essere appropriata per un set di dati o un tipo di modello, o in base alla vostra esperienza, ma se non le conoscete, allora questo vi aiuta davvero a esaminarle tutte. In questo caso, abbiamo analizzato sei di queste funzioni, ma ce ne sono 20 disponibili che potreste anche consultare.
Abbiamo anche un output sull'importanza dei parametri. Si tratta semplicemente di dare un'occhiata, di costruire un rapido modello di foresta bootstrap per mostrare quali di questi iperparametri o parametri di ottimizzazione sono più importanti nell'influenzare la risposta, in questo caso, la convalida R-quadrato. Abbiamo anche i dettagli dei singoli modelli. Noterete che nella tabella dei risultati c'è una colonna che fornisce un ID modello univoco, quindi se volete approfondire uno di questi modelli, potete semplicemente aprirla. Questa è solo un'esportazione da Torch mentre era in esecuzione, in modo da avere comunque accesso anche se stiamo riepilogando tutto in base all'R-quadrato per il set di convalida. Sono disponibili tutte le statistiche di riepilogo per tutti i modelli.
Penso che questo copra più o meno ciò che volevo mostrare per la finestra del report, e volevo solo riassumere cosa si può fare con il componente aggiuntivo con un paio di diverse opzioni di flusso di lavoro. La prima è la riesecuzione. In questo caso, forse siamo soddisfatti di alcuni di questi modelli, ma possiamo esaminarli e vedere quali funzioni di attivazione sono state utilizzate, e magari vogliamo aumentare il numero di livelli o la dimensione dei livelli, in modo da poter tornare alle specifiche e selezionare determinate funzioni.
Forse vogliamo esaminare solo questi tre, ma forse vogliamo esaminare livelli di dimensioni maggiori. Quindi, quello che potremmo fare è specificare, magari esamineremo solo 50, quindi fare clic su "Esegui" per eseguire ed eseguire solo quella serie di parametri selezionata, quindi eseguirne altri 50 e aggiungerli alla tabella. Questa sarebbe un'opzione di flusso di lavoro da considerare. Un'altra sono alcune opzioni nel triangolo rosso. Forse sei soddisfatto di questo modello o di questi due modelli e vuoi importarli nel componente aggiuntivo Torch per eseguirli direttamente.
Non è necessario andare avanti e indietro per ricordare quali sono le impostazioni di ciascun parametro e digitarle nel componente aggiuntivo Torch. Basta andare sul triangolo rosso e digitare semplicemente "Esegui selezionati". Quando clicchiamo su "Esegui selezionati", il componente aggiuntivo Torch acquisisce quei parametri, li passa al componente aggiuntivo Torch, li esegue e ci restituisce un report nel componente aggiuntivo Torch nativo, così possiamo confrontare i modelli. Come potete vedere, abbiamo passato tutti i parametri appropriati e ora possiamo confrontare più direttamente i nostri modelli più adatti e ottenere anche una migliore indicazione su quelle statistiche di riepilogo.
Infine, potresti avere modelli che richiedono molto tempo per essere eseguiti. In tal caso, potresti non essere in grado di completare tutte le ottimizzazioni in un giorno. Se desideri salvare questo e riprenderlo in seguito, puoi andare al triangolo rosso e salvare la tabella dati di questo risultato. Quando lo salvo, posso salvarlo in qualsiasi posizione desiderata e ricaricarlo in seguito. Quello che faremo è semplicemente mostrarti come funziona.
Chiudo, clicco su OK e ora, se volessi ricaricare una tabella dati salvata, tornerei alla mia tabella dati originale. Questa era la tabella dati che stavo usando per la modellazione. Eseguo il componente aggiuntivo, il companion, e ora clicco semplicemente su Richiama, assicurandomi di inserire le colonne giuste, le stesse colonne specificate durante l'ottimizzazione, e clicco su OK. Ora, invece di specificare tutti i diversi parametri qui, andiamo semplicemente sul pulsante Carica, e non l'ho attivato.
Andiamo qui, andiamo ai risultati della nostra ottimizzazione e clicchiamo su "Apri". Apparirà una finestra di dialogo che dice: "Sì, abbiamo le stesse variabili x, variabili y e colonna di convalida". Se una di queste non corrisponde a quella eseguita originariamente, non verrà caricata. Quando clicchiamo su "OK", vedremo le nostre precedenti esecuzioni di ottimizzazione e rigenereremo tutti i grafici. Ora puoi tornare alle specifiche e ricominciare a eseguirle.
Credo che questo sia tutto ciò che volevo mostrare. Ci sono alcune altre opzioni nel componente aggiuntivo Torch, e vorrei davvero che le persone lo usassero insieme al componente aggiuntivo Torch Deep Learning sviluppato da Russ e dal suo team, e sono sicuro che troverete altre utili funzionalità una volta che inizierete a lavorarci. Forse ora passerò la parola a Peter per parlare un po' di alcuni dei risultati, o dei risultati finali.
Ottimo. Grazie, Scott. I risultati che abbiamo ottenuto qui in rosso sono i risultati della convalida R-quadrato che ho ottenuto dai miei modelli, e in blu sono i risultati ottenuti da Russ dai suoi modelli. Non è una critica a Russ. Russ è un grande data scientist, ma credo che sia più una promozione della potenza dell'uso del DOE rispetto a un fattore alla volta.
Questo dimostra che, confrontando un chimico con uno scienziato dei dati e lasciandogli eseguire modelli, se si utilizza il DOE, il chimico può ottenere un successo simile o forse persino migliorare ciò che un ottimo scienziato dei dati può fare. Il componente aggiuntivo di tuning offre a tutti questa possibilità e, come ha detto Scott, non è pensato per sostituire il componente aggiuntivo Torch, ma è in combinazione con il componente aggiuntivo Torch e sarà disponibile sul mercato. È possibile ottenere entrambi.
Mi sono dato una medaglia olimpica per aver battuto Russ perché penso che sia un risultato piuttosto buono per chiunque, ma anche per chi non ha una formazione in data science. Abbiamo iniziato a parlare di identificare gatti e cani, ma se pensiamo al mondo in cui lavori, puoi immaginare che ci siano diversi tipi di modelli di immagini o persino modelli tabulari con cui potresti usare questo approccio di tipo rete neurale di deep learning, e la messa a punto di questi iperparametri ti aiuterà a ottenere risultati migliori.
Queste immagini provengono da alcuni esempi diversi nel manuale del componente aggiuntivo Torch. Penso che tutti abbiano questo tipo di dati a cui potrebbero applicare questo approccio. Volevamo ringraziare, ovviamente, Russ. So che gli abbiamo dato un po' del filo da torcere, ma ci ha anche aiutato molto nello sviluppo di questo componente aggiuntivo, aiutandoci a mettere delle barriere, quindi non ero completamente disorientato, e naturalmente, il comitato direttivo di JMP per aver selezionato questo intervento. Come abbiamo detto, sia il componente aggiuntivo Torch che il componente aggiuntivo Tuning sono disponibili sul marketplace. Abbiamo un codice QR qui se volete scaricarlo o semplicemente andare su marketplace.jmp.com. Grazie.
Grazie.