Inferenza per PROs

PROs Inference

Oggi presentiamo Inference per gli utenti PRO: una offerta della comunità che ti dà accesso alle API di punti finali selezionati per alcuni dei modelli più interessanti disponibili, nonché limiti di utilizzo migliorati per l’API di Inference gratuita. Utilizza la seguente pagina per abbonarti a PRO.

Gli utenti PRO di Hugging Face ora hanno accesso a punti finali API esclusivi per una lista selezionata di modelli potenti che beneficiano di un’inferenza ultraveloce alimentata da text-generation-inference. Questo è un vantaggio aggiuntivo rispetto all’API di inferenza gratuita, che è disponibile per tutti gli utenti di Hugging Face per facilitare il testing e il prototipazione su oltre 200.000 modelli. Gli utenti PRO godono di limiti di utilizzo più elevati su questi modelli, nonché di accesso esclusivo ad alcuni dei migliori modelli disponibili oggi.

Contenuti

  • Modelli supportati
  • Introduzione all’Inference per PRO
  • Applicazioni
    • Chat con Llama 2 e Code Llama
    • Code infilling con Code Llama
    • Stable Diffusion XL
  • Parametri di generazione
    • Controllo della generazione di testo
    • Controllo della generazione di immagini
    • Caching
    • Streaming
  • Abbonati a PRO
  • FAQ

Modelli supportati

Oltre a migliaia di modelli pubblici disponibili nell’Hub, gli utenti PRO ottengono accesso gratuito ai seguenti modelli all’avanguardia:

Inference per PRO semplifica l’esperimento e il prototipazione con nuovi modelli senza doverli distribuire sulla propria infrastruttura. Offre agli utenti PRO accesso a endpoint HTTP pronti all’uso per tutti i modelli elencati sopra. Non è destinato all’uso in applicazioni di produzione pesante; per questo, consigliamo di utilizzare i Punti finali di inferenza. L’Inference per PRO consente anche di utilizzare applicazioni che dipendono da un endpoint LLM, ad esempio l’utilizzo di un’estensione VS Code per il completamento del codice o avere la propria versione di Hugging Chat.

Primi passi con Inference per PRO

Utilizzare Inference per PRO è semplice come inviare una richiesta POST all’endpoint API del modello che si desidera eseguire. Sarà inoltre necessario ottenere un token di autenticazione dell’account PRO dalle impostazioni del token e utilizzarlo nella richiesta. Ad esempio, per generare del testo utilizzando Llama 2 70B Chat in una sessione di terminale, si potrebbe fare qualcosa del genere:

curl https://api-inference.huggingface.co/models/meta-llama/Llama-2-70b-chat-hf \
    -X POST \
    -d '{"inputs": "In una svolta sorprendente degli eventi, "}' \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer <YOUR_TOKEN>"

Ciò stamperebbe qualcosa del genere:

[
  {
    "generated_text": "In una svolta sorprendente degli eventi, 20th Century Fox ha pubblicato un nuovo trailer per il film Alien di Ridley Scott"
  }
]

Puoi anche utilizzare molti dei parametri di generazione dei transformer che già conosci, come temperature o max_new_tokens:

curl https://api-inference.huggingface.co/models/meta-llama/Llama-2-70b-chat-hf \
    -X POST \
    -d '{"inputs": "In una svolta sorprendente degli eventi, ", "parameters": {"temperature": 0.7, "max_new_tokens": 100}}' \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer <YOUR_TOKEN>"

[
  {
    "generated_text": "In una svolta sorprendente degli eventi, 2K ha annunciato che rilascerà un nuovo gioco gratuito chiamato NBA 2K23 Arcade Edition. Questo gioco sarà disponibile su dispositivi Apple iOS e consentirà ai giocatori di competere tra loro in partite di pallacanestro veloci, 3 contro 3.\n\nIl gioco promette di offrire un gameplay frenetico e ricco d'azione, con giocatori in grado di scegliere tra una varietà di squadre e giocatori NBA, tra cui alcuni dei più grandi"
  }
]

Per ulteriori dettagli sui parametri di generazione, consulta il paragrafo “Controllo della generazione di testo” qui sotto.

Per inviare le richieste in Python, puoi approfittare di InferenceClient, un’utilità comoda disponibile nella libreria Python huggingface_hub:

pip install huggingface_hub

InferenceClient è un wrapper utile che ti permette di effettuare chiamate all’API di Inferenza e agli Endpoint di Inferenza facilmente:

from huggingface_hub import InferenceClient

client = InferenceClient(model="meta-llama/Llama-2-70b-chat-hf", token=TUO_TOKEN)

output = client.text_generation("Puoi per favore fornirci ulteriori dettagli sulla tua ")
print(output)

Se non vuoi passare il token esplicitamente ogni volta che istanzi il client, puoi utilizzare notebook_login() (nei notebook Jupyter), huggingface-cli login (nel terminale) o login(token=TUO_TOKEN) (ovunque altro) per effettuare l’accesso una volta sola. Il token verrà quindi utilizzato automaticamente da qui in avanti.

Oltre a Python, puoi anche utilizzare JavaScript per integrare le chiamate di inferenza all’interno delle tue applicazioni JS o node. Dai un’occhiata a huggingface.js per iniziare!

Applicazioni

Chat con Llama 2 e Code Llama

I modelli preparati per seguire le conversazioni in chat sono addestrati con template di chat molto particolari e specifici che dipendono dal modello utilizzato. Devi fare attenzione al formato che il modello si aspetta e replicarlo nelle tue richieste.

L’esempio seguente è tratto dal nostro articolo sul blog Llama 2, che descrive in dettaglio come interrogare il modello per una conversazione:

prompt = """<s>[INST] <<SYS>>
Sei un assistente disponibile, rispettoso e onesto. Rispondi sempre nel modo più utile possibile, facendo attenzione alla sicurezza. Le tue risposte non devono includere contenuti dannosi, non etici, razzisti, sessisti, tossici, pericolosi o illegali. Assicurati che le tue risposte siano socialmente imparziali e positive.

Se una domanda non ha senso o non è coerente dal punto di vista fattuale, spiega il motivo anziché fornire una risposta non corretta. Se non conosci la risposta a una domanda, per favore non condividere informazioni false.
<</SYS>>

C'è un lama nel mio giardino 😱 Cosa dovrei fare? [/INST]
"""

response = client.text_generation(prompt, max_new_tokens=200)
print(response)

Questo esempio mostra la struttura del primo messaggio in una conversazione a più turni. Nota come il delimitatore <<SYS>> viene utilizzato per fornire il prompt di sistema, che indica al modello come ci aspettiamo che si comporti. Quindi la nostra query viene inserita tra i delimitatori [INST].

Se desideriamo continuare la conversazione, dobbiamo aggiungere la risposta del modello alla sequenza e inserire una nuova istruzione di follow-up successivamente. Questa è la struttura generale del template del prompt che dobbiamo utilizzare per Llama 2:

<s>[INST] <<SYS>>
{{ system_prompt }}
<</SYS>>

{{ user_msg_1 }} [/INST] {{ model_answer_1 }} </s><s>[INST] {{ user_msg_2 }} [/INST]

Lo stesso formato può essere utilizzato con Code Llama Instruct per intrattenere conversazioni tecniche con un assistente esperto di codice!

Per ulteriori dettagli, consulta il nostro articolo sul blog Llama 2.

Code infilling con Code Llama

I modelli di codice come Code Llama possono essere utilizzati per il completamento del codice utilizzando la stessa strategia di generazione utilizzata negli esempi precedenti: fornisci una stringa iniziale che può contenere codice o commenti e il modello cercherà di continuare la sequenza con contenuti plausibili. I modelli di codice possono anche essere utilizzati per il riempimento, un compito più specializzato in cui fornisci sequenze di prefisso e suffisso e il modello predirà cosa dovrebbe andare al loro interno. Questo è ottimo per applicazioni come le estensioni IDE. Vediamo un esempio utilizzando Code Llama:

client = InferenceClient(model="codellama/CodeLlama-13b-hf", token=TUO_TOKEN)

prompt_prefix = 'def remove_non_ascii(s: str) -> str:\n    """ '
prompt_suffix = "\n    return result"

prompt = f"<PRE> {prompt_prefix} <SUF>{prompt_suffix} <MID>"

infilled = client.text_generation(prompt, max_new_tokens=150)
infilled = infilled.rstrip(" <EOT>")
print(f"{prompt_prefix}{infilled}{prompt_suffix}")

def remove_non_ascii(s: str) -> str:
    """ Remove non-ASCII characters from a string.

    Args:
        s (str): The string to remove non-ASCII characters from.

    Returns:
        str: The string with non-ASCII characters removed.
    """
    result = ""
    for c in s:
        if ord(c) < 128:
            result += c
    return result

Come puoi vedere, il formato utilizzato per l’infusione segue questo schema:

prompt = f"<PRE> {prompt_prefix} <SUF>{prompt_suffix} <MID>"

Per ulteriori dettagli su come funziona questa attività, ti preghiamo di dare un’occhiata a https://huggingface.co/blog/codellama#code-completion.

Stable Diffusion XL

SDXL è anche disponibile per gli utenti PRO. La risposta restituita dall’endpoint consiste in un flusso di byte che rappresenta l’immagine generata. Se si utilizza InferenceClient, verrà automaticamente decodificata in un’immagine PIL:

sdxl = InferenceClient(model="stabilityai/stable-diffusion-xl-base-1.0", token=TUO_TOKEN)
immagine = sdxl.text_to_image(
    "Città gotica scura in una notte nebbiosa, illuminata dai lampioni. Un uomo con un mantello si allontana da noi",
    guidance_scale=9,
)

Per ulteriori dettagli su come controllare la generazione, ti preghiamo di dare un’occhiata a questa sezione.

Parametri di Generazione

Controllo della Generazione del Testo

La generazione di testo è un argomento complesso e esistono diverse strategie di generazione per scopi diversi. Consigliamo questa eccellente panoramica sull’argomento. Molti algoritmi di generazione sono supportati dagli endpoint di generazione di testo e possono essere configurati utilizzando i seguenti parametri:

  • do_sample: Se impostato su False (il valore predefinito), il metodo di generazione sarà la ricerca greedy, che seleziona la sequenza di continuazione più probabile dopo il prompt fornito. La ricerca greedy è deterministica, quindi gli stessi risultati saranno sempre restituiti dalla stessa input. Quando do_sample è True, i token verranno campionati da una distribuzione di probabilità e quindi varieranno tra le invocazioni.
  • temperature: Controlla la quantità di variazione desiderata dalla generazione. Una temperatura di 0 è equivalente alla ricerca greedy. Se impostiamo un valore per temperature, allora do_sample sarà automaticamente abilitato. La stessa cosa accade per top_k e top_p. Quando si eseguono attività relative al codice, si desidera una minore variabilità e quindi si consiglia una temperatura bassa. Per altre attività, come la generazione di testo senza limiti, si consiglia una temperatura più alta.
  • top_k: Abilita il campionamento “Top-K”: il modello sceglierà tra i K token più probabili che possono verificarsi dopo la sequenza di input. I valori tipici sono compresi tra 10 e 50.
  • top_p: Abilita il campionamento “nucleus”: il modello sceglierà quanti token sono necessari per coprire una determinata massa di probabilità. Se top_p è 0,9, verranno considerati per il campionamento i token con la probabilità più alta del 90%, mentre il 10% restante verrà ignorato.
  • repetition_penalty: Cerca di evitare parole ripetute nella sequenza generata.
  • seed: Seme casuale che puoi utilizzare in combinazione con il campionamento, per scopi di riproducibilità.

Oltre ai parametri di campionamento sopra descritti, è possibile controllare anche aspetti generali della generazione con i seguenti:

  • max_new_tokens: numero massimo di nuovi token da generare. Il valore predefinito è 20, sentiti libero di aumentarlo se desideri sequenze più lunghe.
  • return_full_text: se includere o meno la sequenza di input nell’output restituito dall’endpoint. Il valore predefinito utilizzato da InferenceClient è False, ma l’endpoint stesso utilizza True come valore predefinito.
  • stop_sequences: una lista di sequenze che determineranno la fine della generazione quando incontrate nell’output.

Controllo della Generazione di Immagini

Se si desidera un controllo più dettagliato sulle immagini generate con l’endpoint SDXL, è possibile utilizzare i seguenti parametri:

  • negative_prompt: Un testo che descrive il contenuto da cui si desidera che il modello si allontani.
  • guidance_scale: Quanto accuratamente si desidera che il modello corrisponda al prompt. I numeri più bassi sono meno precisi, numeri molto alti potrebbero diminuire la qualità dell’immagine o generare artefatti.
  • width e height: Le dimensioni desiderate dell’immagine. SDXL funziona meglio per dimensioni comprese tra 768 e 1024.
  • num_inference_steps: Il numero di passaggi di denoising da eseguire. Numeri più grandi possono produrre una migliore qualità ma saranno più lenti. I valori tipici sono compresi tra 20 e 50 passaggi.

Per ulteriori dettagli sulla generazione di testo-immagine, ti consigliamo di consultare la documentazione della libreria diffusers.

Caching

Se esegui la stessa generazione più volte, noterai che il risultato restituito dall’API è lo stesso (anche se stai utilizzando il campionamento invece della decodifica greedy). Questo perché i risultati recenti vengono memorizzati nella cache. Per ottenere una risposta diversa ogni volta, possiamo utilizzare un’intestazione HTTP per dire al server di eseguire una nuova generazione ogni volta: x-use-cache: 0.

Se stai utilizzando InferenceClient, puoi semplicemente aggiungerlo alla proprietà client headers:

client = InferenceClient(model="meta-llama/Llama-2-70b-chat-hf", token=TUO_TOKEN)
client.headers["x-use-cache"] = "0"

output = client.text_generation("In una svolta sorprendente degli eventi, ", do_sample=True)
print(output)

Streaming

Lo streaming dei token è la modalità in cui il server restituisce i token uno per volta mentre il modello li genera. Ciò consente di mostrare generazioni progressive all’utente anziché attendere l’intera generazione. Lo streaming è un aspetto essenziale dell’esperienza utente finale in quanto riduce la latenza, uno degli aspetti più critici di un’esperienza fluida.

Per fare lo streaming dei token con InferenceClient, basta passare stream=True e iterare sulla risposta.

for token in client.text_generation("Come si fa il formaggio?", max_new_tokens=12, stream=True):
    print(token)

# Per
# fare
# il
# formaggio
#,
# devi
# iniziare
# con
# il
# latte

Per utilizzare l’endpoint generate_stream con curl, puoi aggiungere l’opzione -N/--no-buffer, che disabilita il buffering predefinito di curl e mostra i dati man mano che arrivano dal server.

curl -N https://api-inference.huggingface.co/models/meta-llama/Llama-2-70b-chat-hf \
    -X POST \
    -d '{"inputs": "In una svolta sorprendente degli eventi, ", "parameters": {"temperature": 0.7, "max_new_tokens": 100}}' \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer <TUO_TOKEN>"

Iscriviti a PRO

Puoi registrarti oggi per un abbonamento PRO qui. Beneficia di limiti di velocità più elevati, endpoint accelerati personalizzati per i modelli più recenti e accesso anticipato alle funzionalità. Se hai sviluppato progetti interessanti con l’API di inferenza o stai cercando un modello non disponibile in Inference per PRO, utilizza questa discussione. Gli utenti Enterprise beneficiano anche dell’API di inferenza PRO oltre ad altre funzionalità, come SSO.

FAQ

Questo influisce sull’API di inferenza gratuita?

No. Continuiamo a esporre migliaia di modelli tramite API gratuite che consentono alle persone di prototipare ed esplorare rapidamente le capacità dei modelli.

Questo influisce sugli utenti Enterprise?

Gli utenti con un abbonamento Enterprise beneficiano anche dell’API di inferenza accelerata per modelli curati.

Posso utilizzare i miei modelli con l’API di inferenza PRO?

L’API di inferenza gratuita supporta già una vasta gamma di modelli piccoli e VoAGI provenienti da diverse librerie (come diffusers, transformers e sentence transformers). Se hai un modello personalizzato o una logica di inferenza personalizzata, ti consigliamo di utilizzare gli Endpoint di Inferenza.