Sviluppa LLMs con i Punti di Inference di Hugging Face

Sviluppa LLMs con Hugging Face's Inference Points.

LLM open source come Falcon, (Open-)LLaMA, X-Gen, StarCoder o RedPajama hanno fatto molti progressi negli ultimi mesi e possono competere con modelli closed source come ChatGPT o GPT4 per determinati casi d’uso. Tuttavia, implementare questi modelli in modo efficiente e ottimizzato rappresenta ancora una sfida.

In questo post del blog, ti mostreremo come implementare LLM open source su Hugging Face Inference Endpoints, la nostra soluzione SaaS gestita che facilita l’implementazione dei modelli. Inoltre, ti insegneremo come trasmettere risposte e testare le prestazioni dei nostri endpoints. Quindi cominciamo!

  1. Come implementare Falcon 40B instruct
  2. Testare l’endpoint LLM
  3. Trasmettere risposte in JavaScript e Python

Prima di iniziare, rinfreschiamo le nostre conoscenze sugli Inference Endpoints.

Cos’è Hugging Face Inference Endpoints

Hugging Face Inference Endpoints offre un modo facile e sicuro per implementare modelli di machine learning per l’uso in produzione. Gli Inference Endpoints consentono ai developer e agli scienziati dei dati di creare applicazioni di intelligenza artificiale senza gestire l’infrastruttura: semplificando il processo di implementazione con pochi clic, inclusa la gestione di grandi volumi di richieste con autoscaling, riducendo i costi dell’infrastruttura con lo scale-to-zero e offrendo sicurezza avanzata.

Ecco alcune delle caratteristiche più importanti per l’implementazione di LLM:

  1. Facilità di implementazione: Implementa modelli come API pronti per la produzione con pochi clic, eliminando la necessità di gestire l’infrastruttura o l’MLOps.
  2. Economicità: Beneficia della capacità di scale-to-zero automatica, riducendo i costi ridimensionando l’infrastruttura quando l’endpoint non è in uso, pagando in base al tempo di attività dell’endpoint, garantendo l’efficienza dei costi.
  3. Sicurezza aziendale: Implementa modelli in endpoint offline sicuri accessibili solo tramite connessioni dirette VPC, supportati da certificazione SOC2 Type 2 e offrendo accordi di elaborazione dati BAA e GDPR per una maggiore sicurezza e conformità dei dati.
  4. Ottimizzazione LLM: Ottimizzato per LLM, consente un’elevata velocità di elaborazione con Paged Attention e bassa latenza attraverso codice personalizzato per i transformer e Flash Attention power per l’Inference di generazione di testo.
  5. Supporto completo per le attività: Supporto out-of-the-box per 🤗 Transformers, Sentence-Transformers e attività e modelli Diffusers e personalizzazione facile per abilitare attività avanzate come la diarizzazione degli speaker o qualsiasi attività e libreria di machine learning.

Puoi iniziare con gli Inference Endpoints su: https://ui.endpoints.huggingface.co/

1. Come implementare Falcon 40B instruct

Per iniziare, devi essere loggato con un account Utente o Organizzazione con un metodo di pagamento registrato (puoi aggiungerne uno qui), quindi accedi agli Inference Endpoints su https://ui.endpoints.huggingface.co

Successivamente, fai clic su “Nuovo endpoint”. Seleziona il repository, il cloud e la regione, configura le impostazioni dell’istanza e della sicurezza e implementa nel nostro caso tiiuae/falcon-40b-instruct.

Gli Inference Endpoints suggeriscono un tipo di istanza in base alla dimensione del modello, che dovrebbe essere sufficientemente grande per eseguire il modello. Qui 4x NVIDIA T4 GPUs. Per ottenere le migliori prestazioni per LLM, cambia l’istanza in GPU [xlarge] · 1x Nvidia A100.

Nota: Se non è possibile selezionare il tipo di istanza, devi contattarci e richiedere una quota di istanze.

Puoi quindi implementare il tuo modello con un clic su “Crea endpoint”. Dopo 10 minuti, l’Endpoint dovrebbe essere online e disponibile per servire le richieste.

2. Testare l’endpoint LLM

La panoramica dell’Endpoint fornisce accesso al Widget di Inference, che può essere utilizzato per inviare manualmente le richieste. Ciò ti consente di testare rapidamente il tuo Endpoint con input diversi e condividerlo con i membri del team. Questi widget non supportano parametri – in questo caso si ottiene una “generazione breve”.

Il widget genera anche un comando cURL che puoi utilizzare. Basta aggiungere il tuo hf_xxx e testare.

curl https://j4xhm53fxl9ussm8.us-east-1.aws.endpoints.huggingface.cloud \
-X POST \
-d '{"inputs":"C'era una volta,"}' \
-H "Authorization: Bearer <hf_token>" \
-H "Content-Type: application/json"

Puoi utilizzare diversi parametri per controllare la generazione, definendoli nell’attributo parameters del payload. Al giorno d’oggi, i seguenti parametri sono supportati:

  • temperature: Controlla la casualità nel modello. Valori più bassi renderanno il modello più deterministico, mentre valori più alti renderanno il modello più casuale. Il valore predefinito è 1.0.
  • max_new_tokens: Il numero massimo di token da generare. Il valore predefinito è 20, il valore massimo è 512.
  • repetition_penalty: Controlla la probabilità di ripetizione. Il valore predefinito è null.
  • seed: Il seme da utilizzare per la generazione casuale. Il valore predefinito è null.
  • stop: Una lista di token per interrompere la generazione. La generazione si interromperà quando verrà generato uno dei token.
  • top_k: Il numero di token del vocabolario con la probabilità più alta da mantenere per il filtraggio top-k. Il valore predefinito è null, che disabilita il filtraggio top-k.
  • top_p: La probabilità cumulativa dei token del vocabolario con la probabilità più alta da mantenere per il campionamento del nucleo, predefinito a null
  • do_sample: Se utilizzare o meno l’assaggio; utilizzare altrimenti la decodifica greedy. Il valore predefinito è false.
  • best_of: Genera sequenze best_of e restituisce quella con i logprobs dei token più alti, predefinito a null.
  • details: Se restituire o meno dettagli sulla generazione. Il valore predefinito è false.
  • return_full_text: Se restituire o meno il testo completo o solo la parte generata. Il valore predefinito è false.
  • truncate: Se troncare o meno l’input alla lunghezza massima del modello. Il valore predefinito è true.
  • typical_p: La probabilità tipica di un token. Il valore predefinito è null.
  • watermark: Il watermark da utilizzare per la generazione. Il valore predefinito è false.

3. Trasmettere le risposte in Javascript e Python

Richiedere e generare testo con LLM può essere un processo lento e iterativo. Un ottimo modo per migliorare l’esperienza dell’utente è trasmettere i token all’utente man mano che vengono generati. Di seguito sono riportati due esempi su come trasmettere i token utilizzando Python e JavaScript. Per Python, utilizzeremo il client da Text Generation Inference e, per JavaScript, la libreria HuggingFace.js

Trasmissione delle richieste con Python

Prima di tutto, è necessario installare la libreria huggingface_hub:

pip install -U huggingface_hub

Possiamo creare un InferenceClient specificando l’URL del nostro endpoint e le credenziali insieme ai parametri iperparametri che vogliamo utilizzare

from huggingface_hub import InferenceClient

# Parametro endpoint HF Inference Endpoints
endpoint_url = "https://YOUR_ENDPOINT.endpoints.huggingface.cloud"
hf_token = "hf_YOUR_TOKEN"

# Client di trasmissione
client = InferenceClient(endpoint_url, token=hf_token)

# Parametro di generazione
gen_kwargs = dict(
    max_new_tokens=512,
    top_k=30,
    top_p=0.9,
    temperature=0.2,
    repetition_penalty=1.02,
    stop_sequences=["\nUtente:", "<|endoftext|>", "</s>"],
)
# Prompt
prompt = "Cosa puoi fare a Norimberga, Germania? Dammi 3 consigli"

stream = client.text_generation(prompt, stream=True, details=True, **gen_kwargs)

# Restituisci ogni token generato
for r in stream:
    # Salta i token speciali
    if r.token.special:
        continue
    # Interrompi se incontriamo una sequenza di stop
    if r.token.text in gen_kwargs["stop_sequences"]:
        break
    # Restituisci il token generato
    print(r.token.text, end = "")
    # Restituisci r.token.text

Sostituisci il comando print con il comando yield o con una funzione a cui vuoi inviare in streaming i token.

Richieste in streaming con JavaScript

Prima di tutto, devi installare la libreria @huggingface/inference.

npm install @huggingface/inference

Puoi creare un HfInferenceEndpoint specificando l’URL del tuo endpoint e le credenziali insieme all’iperparametro che desideri utilizzare.

import { HfInferenceEndpoint } from '@huggingface/inference'

const hf = new HfInferenceEndpoint('https://YOUR_ENDPOINT.endpoints.huggingface.cloud', 'hf_YOUR_TOKEN')

// parametro di generazione
const gen_kwargs = {
  max_new_tokens: 512,
  top_k: 30,
  top_p: 0.9,
  temperature: 0.2,
  repetition_penalty: 1.02,
  stop_sequences: ['\nUser:', '<|endoftext|>', '</s>'],
}
// prompt
const prompt = 'Cosa puoi fare a Norimberga, in Germania? Dammi 3 consigli'

const stream = hf.textGenerationStream({ inputs: prompt, parameters: gen_kwargs })
for await (const r of stream) {
  // # salta i token speciali
  if (r.token.special) {
    continue
  }
  // interrompi se incontri una sequenza di stop
  if (gen_kwargs['stop_sequences'].includes(r.token.text)) {
    break
  }
  // invia in streaming il token generato
  process.stdout.write(r.token.text)
}

Sostituisci la chiamata process.stdout con il comando yield o con una funzione a cui vuoi inviare in streaming i token.

Conclusioni

In questo post, ti abbiamo mostrato come distribuire modelli LLM open-source utilizzando gli Hugging Face Inference Endpoints, come controllare la generazione di testo con parametri avanzati e come inviare in streaming le risposte a un client Python o JavaScript per migliorare l’esperienza dell’utente. Utilizzando gli Hugging Face Inference Endpoints, puoi distribuire modelli come API pronte per la produzione con pochi clic, ridurre i costi grazie alla scalabilità automatica a zero e distribuire modelli in endpoint offline sicuri supportati da certificazione SOC2 Type 2.


Grazie per aver letto! Se hai domande, non esitare a contattarmi su Twitter o LinkedIn.