Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Personalizzazione del flusso di lavoro con la libreria fmeval
Puoi personalizzare la valutazione del modello per consentire un modello diverso da un modello Amazon Bedrock JumpStart o utilizzare un flusso di lavoro personalizzato per la valutazione. Se utilizzi il tuo modello, devi creare un ModelRunner personalizzato. Se utilizzi il tuo set di dati per la valutazione, devi configurare un oggetto DataConfig. La sezione seguente mostra come formattare il set di dati di input, personalizzare un oggetto DataConfig per utilizzare tale set di dati e creare un ModelRunner personalizzato.
Per valutare il modello con il tuo set di dati, devi utilizzare un oggetto DataConfig per specificare dataset_name e dataset_uri del set di dati da valutare. Se utilizzi un set di dati integrato, l’oggetto DataConfig è già configurato come predefinito per gli algoritmi di valutazione.
Puoi utilizzare un solo set di dati personalizzato ogni volta che utilizzi la funzione evaluate. Puoi invocare evaluate tutte le volte che vuoi per utilizzare il numero di set di dati desiderato.
Configura un set di dati personalizzato con la richiesta del modello specificata nella colonna della domanda e la risposta di destinazione specificata nella colonna della risposta, come descritto di seguito:
from fmeval.data_loaders.data_config import DataConfig from fmeval.constants import MIME_TYPE_JSONLINES config = DataConfig( dataset_name="tiny_dataset", dataset_uri="tiny_dataset.jsonl", dataset_mime_type=MIME_TYPE_JSONLINES, model_input_location="question", target_output_location="answer", )
La classe DataConfig contiene i parametri seguenti:
-
dataset_name: il nome del set di dati da utilizzare per valutare il tuo LLM.dataset_uri: il percorso locale o l’URI (Uniform Resource Identifier) della posizione S3 del set di dati. -
dataset_mime_type: il formato dei dati di input da utilizzare per valutare il tuo LLM. La FMEval libreria può supportare entrambiMIME_TYPE_JSONeMIME_TYPE_JSONLINES. -
model_input_location: (facoltativo) il nome della colonna nel set di dati che contiene gli input o i prompt del modello da valutare.Utilizza
model_input_locationper specificare il nome della colonna. La colonna deve contenere i valori seguenti, associati alle relative attività:-
Per le valutazioni di generazione aperta, tossicità e accuratezza, specifica la colonna che contiene il prompt a cui il modello deve rispondere.
-
Per un’attività di risposta alle domande, specifica la colonna che contiene la domanda a cui il modello deve rispondere.
-
Per un’attività di sintesi testuale, specifica il nome della colonna che contiene il testo che il modello deve sintetizzare.
-
Per un’attività di classificazione, specifica il nome della colonna che contiene il testo che il modello deve classificare.
-
Per le valutazioni delle conoscenze fattuali, specifica il nome della colonna che contiene la domanda per la quale il modello deve prevedere la risposta.
-
Per le valutazioni di robustezza semantica, specifica il nome della colonna che contiene l’input da modificare nel modello.
-
Per le valutazioni di stereotipizzazione dei prompt, utilizza
sent_more_input_locationesent_less_input_locationinvece dimodel_input_location, come illustrato nei parametri seguenti.
-
-
model_output_location: (facoltativo) il nome della colonna del set di dati che contiene l’output previsto da confrontare con l’output di riferimento contenuto intarget_output_location. Se forniscimodel_output_location, FMEval non invierà una richiesta di inferenza al tuo modello. Utilizzerà invece l’output contenuto nella colonna specificata per valutare il modello. -
target_output_location: il nome della colonna nel set di dati di riferimento che contiene il valore true da confrontare con il valore previsto contenuto inmodel_output_location. Richiesto solo per le conoscenze fattuali, l’accuratezza e la robustezza semantica. Per le conoscenze fattuali, ogni riga di questa colonna deve contenere tutte le possibili risposte separate da un delimitatore. Ad esempio, se le risposte a una domanda sono [“UK”, “England”], la colonna dovrebbe contenere “UK<OR>England”. La previsione tramite modello è corretta se contiene una delle risposte separate dal delimitatore. -
category_location: il nome della colonna che contiene il nome di una categoria. Se fornisci un valore percategory_location, i punteggi vengono aggregati e registrati per ogni categoria. -
sent_more_input_location: il nome della colonna che contiene il prompt con più bias. Obbligatorio solo per la stereotipizzazione dei prompt. Evita i bias inconsci. Per esempi di bias, consulta il set di dati CrowS-Pairs. -
sent_less_input_location: il nome della colonna che contiene il prompt con meno bias. Obbligatorio solo per la stereotipizzazione dei prompt. Evita i bias inconsci. Per esempi di bias, consulta il set di dati CrowS-Pairs. -
sent_more_output_location: (facoltativo) il nome della colonna che contiene una probabilità prevista che la risposta generata dal modello contenga più bias. Questo parametro viene utilizzato solo nelle attività di stereotipizzazione dei prompt. -
sent_less_output_location: (facoltativo) il nome della colonna che contiene una probabilità prevista che la risposta generata dal modello contenga meno bias. Questo parametro viene utilizzato solo nelle attività di stereotipizzazione dei prompt.
Per aggiungere alla DataConfig classe un nuovo attributo che corrisponde a una colonna del set di dati, è necessario aggiungere suffix
_location alla fine del nome dell’attributo.
Per valutare un modello personalizzato, utilizza una classe di dati di base per configurare il modello e creare un ModelRunner personalizzato. Quindi, puoi utilizzare ModelRunner per valutare qualsiasi modello linguistico. Utilizza la procedura seguente per definire una configurazione del modello, creare un ModelRunner personalizzato e testarlo.
L’interfaccia ModelRunner dispone di un metodo astratto come descritto di seguito:
def predict(self, prompt: str) → Tuple[Optional[str], Optional[float]]
Questo metodo accetta un prompt come input di stringa e restituisce una Tupla che contiene una risposta testuale del modello e una probabilità logaritmica di input. Ogni ModelRunner deve implementare un metodo predict.
Creazione di un ModelRunner personalizzato
-
Definisci una configurazione del modello.
L’esempio di codice seguente mostra come applicare un decoratore
dataclassa una classeHFModelConfigpersonalizzata per definire una configurazione per un modello Hugging Face:from dataclasses import dataclass @dataclass class HFModelConfig: model_name: str max_new_tokens: int seed: int = 0 remove_prompt_from_generated_text: bool = TrueNell’esempio di codice precedente, si applica quanto segue:
-
Il parametro
max_new_tokensviene utilizzato per contenere la lunghezza della risposta limitando il numero di token restituiti da un LLM. Il tipo di modello viene impostato passando un valore permodel_namequando viene creata un’istanza della classe. In questo esempio, il nome del modello è impostato sugpt2, come mostrato alla fine di questa sezione. Il parametromax_new_tokensè un’opzione per configurare le strategie di generazione del testo utilizzando una configurazione del modellogpt2per un modello GPT OpenAI preaddestrato. Vedi AutoConfigper altri tipi di modelli. -
Se il parametro
remove_prompt_from_generated_textè impostato suTrue, la risposta generata non conterrà il prompt di origine inviato nella richiesta.
Per altri parametri di generazione del testo, consultate la Hugging Facedocumentazione di GenerationConfig
. -
-
Crea un
ModelRunnerpersonalizzato e implementa un metodo di previsione. L’esempio di codice seguente mostra come creare unModelRunnerpersonalizzato per un modello Hugging Face utilizzando la classeHFModelConfigcreata nell’esempio di codice precedente.from typing import Tuple, Optional import torch from transformers import AutoModelForCausalLM, AutoTokenizer from fmeval.model_runners.model_runner import ModelRunner class HuggingFaceCausalLLMModelRunner(ModelRunner): def __init__(self, model_config: HFModelConfig): self.config = model_config self.model = AutoModelForCausalLM.from_pretrained(self.config.model_name) self.tokenizer = AutoTokenizer.from_pretrained(self.config.model_name) def predict(self, prompt: str) -> Tuple[Optional[str], Optional[float]]: input_ids = self.tokenizer(prompt, return_tensors="pt").to(self.model.device) generations = self.model.generate( **input_ids, max_new_tokens=self.config.max_new_tokens, pad_token_id=self.tokenizer.eos_token_id, ) generation_contains_input = ( input_ids["input_ids"][0] == generations[0][: input_ids["input_ids"].shape[1]] ).all() if self.config.remove_prompt_from_generated_text and not generation_contains_input: warnings.warn( "Your model does not return the prompt as part of its generations. " "`remove_prompt_from_generated_text` does nothing." ) if self.config.remove_prompt_from_generated_text and generation_contains_input: output = self.tokenizer.batch_decode(generations[:, input_ids["input_ids"].shape[1] :])[0] else: output = self.tokenizer.batch_decode(generations, skip_special_tokens=True)[0] with torch.inference_mode(): input_ids = self.tokenizer(self.tokenizer.bos_token + prompt, return_tensors="pt")["input_ids"] model_output = self.model(input_ids, labels=input_ids) probability = -model_output[0].item() return output, probabilityIl codice precedente utilizza una
HuggingFaceCausalLLMModelRunnerclasse personalizzata che eredita le proprietà dalla FMEvalModelRunnerclasse. La classe personalizzata contiene un costruttore e una definizione per una funzione di previsione, che restituisceTuple.Per altri esempi di
ModelRunner, consulta la sezione model_runnerdella libreria fmeval.Il costruttore
HuggingFaceCausalLLMModelRunnercontiene le seguenti definizioni:-
La configurazione è impostata su
HFModelConfig, definito all’inizio di questa sezione. -
Il modello è impostato su un modello preaddestrato di Hugging Face Auto Class
, specificato con il parametro model_name al momento della creazione dell’istanza. -
Il tokenizer è impostato su una classe della libreria di tokenizer Hugging Face
, che corrisponde al modello preaddestrato specificato da model_name.
Il metodo
predictnella classeHuggingFaceCausalLLMModelRunnerutilizza le definizioni seguenti:-
input_ids: una variabile che contiene l’input per il modello. Il modello genera l’input come segue.-
A
tokenizerConverte la richiesta contenutapromptin identificatori di token (). IDs Questi token IDs, che sono valori numerici che rappresentano un token specifico (parola, sottoparola o carattere), possono essere utilizzati direttamente dal modello come input. I token IDs vengono restituiti come oggetti PyTorch tensoriali, come specificato da.return_tensors="pt"Per altri tipi di tensori restituiti, consulta la documentazione di Hugging Face per apply_chat_template. -
IDs I token vengono inviati a un dispositivo in cui si trova il modello in modo che possano essere utilizzati dal modello.
-
-
generations: una variabile che contiene la risposta generata dal tuo LLM. La funzione di generazione del modello utilizza i seguenti input per generare la risposta:-
I valori
input_idsdella fase precedente. -
Il parametro
max_new_tokensspecificato inHFModelConfig. -
pad_token_idaggiunge un token di fine frase (eos) alla risposta. Per altri token che puoi usare, consulta la Hugging Face documentazione di PreTrainedTokenizer.
-
-
generation_contains_input: una variabile booleana che restituisceTruequando la risposta generata include il prompt di input nella sua risposta, altrimenti restituisceFalse. Il valore restituito viene calcolato utilizzando un confronto a livello di elemento tra quanto segue.-
Tutti i token IDs presenti nel prompt di input contenuti in.
input_ids["input_ids"][0] -
L’inizio del contenuto generato contenuto in
generations[0][: input_ids["input_ids"].shape[1]].
Il metodo
predictrestituisce un avviso se hai indirizzato l’LLM aremove_prompt_from_generated_textnella configurazione, ma la risposta generata non contiene il prompt di input.L'output del
predictmetodo contiene una stringa restituita dalbatch_decodemetodo, che converte il token IDs restituito nella risposta in testo leggibile dall'uomo. Se hai specificatoremove_prompt_from_generated_textcomeTrue, il prompt di input viene rimosso dal testo generato. Se hai specificatoremove_prompt_from_generated_textcomeFalse, il testo generato verrà restituito senza i token speciali che hai incluso nel dizionariospecial_token_dict, come specificato daskip_special_tokens=True. -
-
-
Testa
ModelRunner. Invia una richiesta di esempio al tuo modello.L’esempio seguente mostra come testare un modello con il modello preaddestrato
gpt2della classe Hugging FaceAutoConfig:hf_config = HFModelConfig(model_name="gpt2", max_new_tokens=32) model = HuggingFaceCausalLLMModelRunner(model_config=hf_config)Nell’esempio di codice precedente,
model_namespecifica il nome del modello preaddestrato. Per la classeHFModelConfigviene creata un’istanza hf_config con un valore per il parametromax_new_tokens, che viene utilizzata per l’inizializzazione diModelRunner.Se desideri utilizzare un altro modello pre-addestrato diHugging Face, scegline uno
pretrained_model_name_or_pathin sotto.from_pretrainedAutoClassInfine, testa
ModelRunner. Invia una richiesta di esempio al tuo modello come mostrato nell’esempio di codice seguente:model_output = model.predict("London is the capital of?")[0] print(model_output) eval_algo.evaluate_sample()