migrating your github ci to hugging face jobs github è diventato uno strumento di base per la collaborazione su progetti open source. Se si possiede un repository GitHub e si utilizzano GitHub Actions, molto probabilmente si usano i runner gestiti da GitHub per l'esecuzione di CI. Questo è il default per molti progetti perché è semplice: aggiungi un workflow, scrivi runs-on: ubuntu-latest, e GitHub ti fornisce una macchina.

Questo default è conveniente, ma presenta anche limiti. GitHub Actions può essere lento o in manutenzione, le macchine ospitate sono generiche, e l'accesso GPU non è qualcosa che quasi tutti i progetti open source possono attivare facilmente. Per Trackio, questi limiti hanno cominciato a pesare. Volevamo una CI affidabile su CPU per i test di base e di front-end, ma anche una CI su GPU per i test che richiedevano hardware CUDA.

Ci siamo creati un'alternativa: manteniamo GitHub Actions a gestire la CI, ma eseguiamo i compiti su Hugging Face Jobs.

Risultato: La CI di Trackio ora viene eseguita su Hugging Face Jobs e mostra i log in tempo reale, riducendo i tempi di CI per i compiti CPU di circa il 30% ed abilitando un intero nuovo set di test sull'hardware GPU!

In questo articolo spieghiamo passo per passo come replicare questa configurazione per il vostro repository GitHub. Se state usando un agente, potete puntare a questo articolo, in quanto forniamo istruzioni CLI insieme a quelle basate sulla finestra del browser per gli umani.

Iniziamo con una breve introduzione a Hugging Face Jobs!

Hugging Face Jobs vi permette di eseguire comandi o script sull'infrastruttura serverless di Hugging Face con quasi qualsiasi tipo di hardware. Un Job è essenzialmente un contenitore leggero, con accesso a una configurazione precisa di CPU e GPU, un ambiente pulito e la scalabilità per eseguire task su larga scala.

Questo fa sì che i Jobs siano ideali per la CI (Continuous Integration). I Jobs di CI sono già comandi su file di test, e spesso richiedono l'accesso ad hardware dedicato come GPU.

Il passo chiave è collegare GitHub Actions a HF Jobs, che spieghiamo di seguito.

Per questa configurazione abbiamo creato huggingface/jobs-actions, un ponte che trasforma un compito GitHub Actions in un runner self-hosted eseguito all'interno di un Job HF.

Dalla prospettiva di GitHub, è soltanto un runner self-hosted. Dalla prospettiva di Hugging Face, è un Job che lancia un contenitore per eseguire i passi del workflow dal repository GitHub Actions.

La cosa necessaria è prima un dispacciatore. Questo è uno spazio Docker piccolo che riceve gli eventi webhook workflowjob di GitHub e lancia Jobs HF in risposta.

Create questo in primo luogo perché l'app GitHub necessita di un URL webhook, e quell'URL proviene dallo spazio. Questo spazio dovrebbe essere sotto il nome della vostra organizzazione o personale su Hugging Face, in modo che abbiate accesso in scrittura.

Vai su huggingface/jobs-actions-dispatcher e clicca Duplicate this Space.

Usate cpu-upgrade per CI reali in modo che il dispacciatore resti disponibile per i webhook di GitHub. cpu-basic va bene per test e potrebbe funzionare, ma può andare in sleep dopo l'inattività; se un webhook di GitHub arriva mentre si sta svegliando, il workflow potrebbe rimanere in sospeso all'infinito.

Dopo la costruzione, apri lo spazio duplicato. Vedrete una sezione che indica Required Space secrets, che potete ignorare per ora. La pagina principale dovrebbe mostrare l'URL del webhook dell'app GitHub di cui avrete bisogno per il passo successivo. Sembra qualcosa del tipo:

Se preferite configurare lo spazio del dispacciatore come agente o con un workflow CLI:

Inserite $GITHUBREPO nello spazio e cliccate il bottone creazione dell’app GitHub. GitHub chiederà un nome per l’app; il nome può essere qualsiasi, a condizione che sia disponibile nel vostro account o organizzazione GitHub. Una volta inviato, la schermata finale vi mostrerà i comandi generati per caricare le credenziali dell’app, il segreto webhook e il token di Hugging Face nello spazio con l’hf CLI.

Notate che avrete bisogno di un token Hugging Face che abbia i permessi per lanciare Jobs, associato al vostro account personale o ad un organizzazione in cui i Jobs siano contabilizzati. Questo token va salvato come segreto HFTOKEN nello spazio del dispacciatore.

Infine, installerete l’App sull’unico repo GitHub che avete specificato nello spazio. Nella configurazione Trackio abbiamo installato l’app su gradio-app/trackio.

L’installazione di un’app GitHub tramite manifesti è comunque un processo browser-based. Tuttavia, un agente può seguire lo stesso percorso guidato dallo spazio.

Incollate $GITHUBREPO nello spazio, cliccate il pulsante di creazione dell’app GitHub, scegliete un nome disponibile e seguite le istruzioni generate.

Dopo che l’app è stata creata, installatela nel vostro repo dal menu dell’app. Per un'organizzazione GitHub le impostazioni di installazione sono disponibili qui:

A questo punto, lo spazio del dispacciatore dovrebbe essere configurato. Il flusso di configurazione dell’app GitHub ha generato i comandi necessari per caricare le credenziali dell’app, il segreto webhook e il token di Hugging Face nello spazio.

Per default, i Jobs HF vengono lanciati nello stesso spazio del dispacciatore. Se volete inviare i Jobs a una diversa organizzazione o utente su Hugging Face invece, potete impostare HF_NAMESPACE come variabile di ambiente dello spazio:

Istruzioni opzionali: il token che impostate nel passo 2 dovrebbe corrispondere a questo namespace.

Per qualsiasi GitHub Action che desideriate eseguire con HF Jobs, avete bisogno solo di una linea di codice!

Avete accesso a log visibili esattamente come quelli di un'azione GitHub normale. Ad esempio, potete verificare il log di questo Pull Request di Trackio #565.

Nella nostra prima configurazione CPU abbiamo utilizzato ubuntu:22.04 e installato i pacchetti di sistema mancanti ad ogni esecuzione. Funzionava, ma era più lento del necessario. L'immagine ubuntu-latest di GitHub include molte strumentalità di sviluppo di default; l'immagine Ubuntu base non le include.

Per Trackio, i test su interfaccia grafica richiedevano browser Playwright, Node, ffmpeg, sqlite, git e dipendenze di compilazione Linux standard. Le Hugging Face Jobs supportano l'uso di qualsiasi immagine Docker, quindi abbiamo testato con