Quando lavori nel campo della scienza dei dati, di solito ti ritrovi ad affrontare una nuova sfida dopo aver terminato un lungo ciclo di formazione, perfezionamento e miglioramento. Congratulazioni per aver creato un modello ML che offre buone prestazioni e risponde alle tue esigenze. Ora la sfida che hai a portata di mano è come puoi fornire questo bel pezzo di tecnologia agli utenti previsti? O forse come puoi comunicare in modo efficace il tuo risultato con le parti interessate della tua azienda? O ancora, come puoi condividere i risultati del tuo modello con i tuoi colleghi in modo efficace per una migliore collaborazione?
L’implementazione dell’apprendimento automatico può essere a volte difficile poiché utilizzeremo tecnologie e tecniche esterne alle consuete competenze necessarie per costruire i modelli.
In questo articolo scopriremo un modo per distribuire modelli di machine learning utilizzando solo Python. E lungo il percorso costruiremo un modello di traduzione automatica e una pagina web.
Quindi ecco i passaggi che vedremo:
-
Utilizzo di modelli di traduzione automatica Huggingface.
-
Scoprire Anvil e creare un'interfaccia utente Web per il nostro modello.
-
Collegare backend e frontend e servire al mondo il nostro lavoro!
Costruisci un modello di traduzione automatica
Huggingface è una comunità di intelligenza artificiale che lavora per "democratizzare il buon machine learning". Nell'ambito di questa iniziativa, puoi trovare molti modelli addestrati su diverse attività di apprendimento automatico: segmentazione di immagini, sintesi vocale, generazione di testo... e anche traduzione automatica!
La traduzione automatica è semplicemente un'attività di traduzione tra due lingue eseguita da un software, nel nostro caso un modello di apprendimento automatico costruito con trasformatori.
Un trasformatore è un'architettura di deep learning basata sull'attenzione. Facciamolo funzionare sulla tua macchina!
Utilizzeremo transformers, una libreria Python per scaricare il modello MT ed eseguire una traduzione.
pip install torch
pip install transformers
Dopo aver installato i pacchetti necessari, importa i seguenti moduli:
from transformers import MarianTokenizer, MarianMTModel
from typing import List
Prendiamo un modello che traduca una frase dal tedesco all'inglese. Abbiamo bisogno del nome del modello:
src= "de"
trg= "en"
mname= f'Helsinki-NLP/opus-mt-{src}-{trg}'
Ora importiamo il modello addestrato e il tokenizzatore utilizzando le seguenti righe:
model = MarianMTModel.from_pretrained(mname)
tok = MarianTokenizer.from_pretrained(mname)
La dimensione del download è di circa 300 MB, al termine è possibile archiviare il modello in una directory locale utilizzando quanto segue:
model.save_pretrained("./models/de_en/")
tok.save_pretrained("./models/de_en/tok")
Prendiamo il modello:
text="ich habe keine ahnung"
gen = model.generate(**tok.prepare_seq2seq_batch(src_texts=[text], return_tensors="pt"))
words: List[str] = tok.batch_decode(gen, skip_special_tokens=True)
print(words[0])
Ora dovresti avere la traduzione inglese della frase memorizzata in "words[0]".
Scopri Anvil e crea un'interfaccia utente web
Anvil è un framework e uno stack di soluzioni che ti consentono di creare applicazioni web utilizzando solo codice Python. Dispone di un editor drag and drop per creare un'interfaccia utente Web e ti consente di connettere il codice dal tuo computer locale all'interfaccia utente che crei e ospita la tua applicazione fornendo un collegamento che puoi condividere.
Quindi iniziamo con la creazione di un'applicazione da qui. Scegli l'applicazione vuota, quindi il design del materiale.
Dovresti vedere qualcosa del genere:
Ora conterò su di te per utilizzare l'editor e creare qualcosa di simile al seguente:
In questa semplice interfaccia utente abbiamo due DropDown per scegliere la lingua di origine e quella di destinazione. Abbiamo anche un TextBox per inserire il testo sorgente e un componente richText per visualizzare il testo tradotto. Puoi anche vedere un pulsante per avviare l'attività di traduzione.
Per sincronizzarti con gli snippet di codice che vedrai di seguito, dai gli stessi ID ai componenti. Di seguito puoi trovare un esempio di dove puoi impostare l'id di un componente:
Gli ID che stiamo utilizzando sono:
Componente
ID
Funzione Onclick
Abbiamo aggiunto un pulsante che viene utilizzato per avviare la traduzione. Dal tuo editor fai clic sul pulsante quindi scorri verso il basso nel pannello delle proprietà. In basso vedrai una sezione eventi. Nella zona di testo accanto a "clic", inserisci "traduci" e quindi fai clic sulla freccia a destra di questa zona di testo.
Questo ti porterà alla visualizzazione codice dove vedrai del codice Python generato automaticamente.
Scoprirai che anvil ha aggiunto automaticamente una funzione chiamata Translate. Verrà chiamato ogni volta che si fa clic sul pulsante nella nostra interfaccia utente.
Ecco come dovrebbe apparire la funzione:
def translate(self, **event_args):
"""This method is called when the button is clicked"""
src_lang=self.source_lang.selected_value #get the selected source language
dest_lang=self.dest_lang.selected_value #get the selected destination language
text=self.source_text.text #get the text written in source language
#call the server function
translated_text=anvil.server.call("translation",text,src_lang,dest_lang)
#write the translated text to the UI
self.translated_text.content=translated_text
Questa funzione svolge 3 compiti principali:
-
Ottieni informazioni dall'interfaccia utente
-
Invia le informazioni al nostro backend utilizzando la funzione del server “traduzione” (lo spiegheremo nella sezione successiva)
-
Invia il testo tradotto all'interfaccia utente.
Funzione server
Concentriamoci su questa riga di codice:
translated_text=anvil.server.call("translation",text,src_lang,dest_lang)
Usiamo anvil.server.call per chiamare una funzione server chiamata "translation" che definiremo nel nostro codice backend nella macchina locale.
Questa funzione servirà da connessione tra l'interfaccia utente web e il codice backend che verrà eseguito sul nostro modello di traduzione automatica.
Come hai notato, inviamo anche i parametri di questa funzione nella funzione anvil.server.call
.
Implementa il nostro modello MT
Installiamo prima l'incudine
pip install anvil-uplink
Ora abbiamo creato la nostra interfaccia web nell'editor incudine e disponiamo di blocchi di codice di base per eseguire il nostro modello di traduzione automatica ed eseguire una traduzione.
Il passo successivo è definire la funzione server di cui abbiamo discusso nella sezione precedente.
Ecco il codice della funzione:
@anvil.server.callable
def translation(text,src,dest):
lang_code={"English":"en",
"German":"de",
"French":"fr",
"Spanish":"es"}
model=MarianMTModel.from_pretrained("./models/"+lang_code[src]+"_"+lang_code[dest])
tok=MarianTokenizer.from_pretrained("./models/"+lang_code[src]+"_"+lang_code[dest]+"/tok")
gen = model.generate(**tok.prepare_seq2seq_batch(src_texts=[text], return_tensors="pt"))
words: List[str] = tok.batch_decode(gen, skip_special_tokens=True)
return words[0]
La funzione prenderà i 3 parametri inviati dal frontend, convertirà le lingue di origine e di destinazione nei rispettivi codici lingua, quindi caricherà i modelli, calcolerà la traduzione e restituirà il risultato.
Il modo per dichiarare questa funzione su anvil come funzione server è utilizzare il decoratore
@anvil.server.callable
.
Abbiamo un ultimo passaggio da fare per connettere il codice backend che possiamo eseguire in un notebook jupyter alla nostra applicazione incudine.
Vai all'editor online di incudine, fai clic sull'icona a forma di ingranaggio, quindi fai clic su "Uplink...".
Vedi la schermata qui sotto
Verrà visualizzato un popup, quindi fai clic su "Abilita uplink del server per questa app" per ottenere il codice di connessione che copi.
Incolla il codice nella seguente riga di codice:
anvil.server.connect("code here")
Questa riga avvierà un server che connette il tuo script di codice locale o il tuo notebook jupyter all'applicazione incudine con la funzione "traduzione" registrata come funzione server.
Passo finale
A questo punto, il tuo server backend è in esecuzione con una funzione server che carica il modello di traduzione automatica ed esegue la traduzione dopo aver preso in considerazione i parametri inviati dal frontend. Questa figura riassume ciò che abbiamo implementato insieme finora.
Il passaggio finale consiste nell'eseguire l'applicazione facendo clic sul pulsante Esegui in alto al centro dell'editor dell'incudine.
Dopo aver eseguito l'applicazione vedrai nell'angolo in alto a destra un pulsante "pubblica questa app" che ti darà un collegamento che puoi condividere per accedere all'applicazione ed eseguire la tua traduzione!
Conclusione
Seguendo questo articolo sei stato in grado di implementare un modello MT e creare un'interfaccia web per utilizzarlo.
C'è ancora molto da scoprire su come distribuire in modo efficace un modello utilizzando incudine, ma ora hai le basi per iniziare il tuo percorso di distribuzione e sfruttare ulteriormente il potenziale delle tue conoscenze precedenti in Python per fare molto di più!
Vieni a uno dei nostri workshop gratuiti
Inizia la tua carriera come data scientist con i nostri workshop gratuiti, basati su un curriculum adattabile e guidati da esperti del settore.