

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Evalúe un JumpStart modelo para estereotipar rápidamente
<a name="clarify-foundation-model-evaluate-auto-tutorial-one"></a>

Puedes usar un `ModelRunner` envoltorio de alto nivel para evaluar un SageMaker JumpStart modelo de Amazon y así poder estereotiparlo rápidamente. El algoritmo de estereotipado de peticiones mide la probabilidad de que el modelo codifique sesgos en su respuesta. Estos sesgos incluyen aspectos sobre la raza, género, orientación sexual, religión, edad, nacionalidad, discapacidad, apariencia física y nivel socioeconómico. 

En este tutorial se muestra cómo cargar el modelo [Falcon 7-B](https://huggingface.co/tiiuae/falcon-7b) del [Instituto de Innovación Tecnológica](https://www.tii.ae/), disponible en JumpStart, y cómo solicitar a este modelo que genere respuestas a las solicitudes. A continuación, en este tutorial se muestra cómo evaluar las respuestas para crear estereotipos rápidamente comparándolas con el conjunto de datos integrado de código [CrowS-Pairs](https://github.com/nyu-mll/crows-pairs)abierto sobre los desafíos. 

Las secciones de este tutorial le enseñan a realizar las siguientes tareas:
+ Configure el entorno.
+ Ejecutar la evaluación del modelo.
+ Ver los resultados del análisis.

## Configure su entorno
<a name="clarify-foundation-model-evaluate-auto-tutorial-one-setup"></a>

**Requisitos previos**
+ Utilice un entorno de kernel base Python 3.10 y una instancia de `ml.g4dn.2xlarge` Amazon Elastic Compute Cloud (Amazon EC2) antes de comenzar este tutorial.

  Para obtener más información acerca de los tipos de instancias y sus casos de uso recomendados, consulte [Tipos de instancias disponibles para su uso con las libretas clásicas de Amazon SageMaker Studio](notebooks-available-instance-types.md).

**Instalación de las bibliotecas necesarias**

1. Instala la SageMaker IA y otras bibliotecas necesarias en tu código de la siguiente manera: `fmeval`

   ```
   !pip3 install sagemaker
   !pip3 install -U pyarrow
   !pip3 install -U accelerate
   !pip3 install "ipywidgets>=8"
   !pip3 install jsonlines
   !pip install fmeval
   !pip3 install boto3==1.28.65
   import sagemaker
   ```

1. Descargue el conjunto de datos de `JSON Lines` de ejemplo [crows-pairs\_sample.jsonl](https://github.com/aws/fmeval/blob/main/examples/crows-pairs_sample.jsonl) en su directorio de trabajo actual.

1. Compruebe que su entorno contiene el archivo de entrada de ejemplo utilizando el siguiente código:

   ```
   import glob
   
   # Check for fmeval wheel and built-in dataset
   if not glob.glob("crows-pairs_sample.jsonl"):
   print("ERROR - please make sure file exists: crows-pairs_sample.jsonl")
   ```

1. Defina un JumpStart modelo de la siguiente manera:

   ```
   from sagemaker.jumpstart.model import JumpStartModel
   
   model_id, model_version, = (
   "huggingface-llm-falcon-7b-instruct-bf16",
   "*",
   )
   ```

1. Implemente el JumpStart modelo y cree un punto final de la siguiente manera:

   ```
   my_model = JumpStartModel(model_id=model_id)
   predictor = my_model.deploy()
   endpoint_name = predictor.endpoint_name
   ```

1. Defina una petición y el formato de la solicitud de modelo, o carga útil, de la siguiente manera:

   ```
   prompt = "London is the capital of"
   payload = {
   "inputs": prompt,
   "parameters": {
       "do_sample": True,
       "top_p": 0.9,
       "temperature": 0.8,
       "max_new_tokens": 1024,
       "decoder_input_details" : True,
       "details" : True
   },
   }
   ```

   En el ejemplo de código anterior, se incluyen los siguientes parámetros en la solicitud del modelo:
   + `do_sample`: indica al modelo que tome muestras de la salida sin procesar del modelo (antes de la normalización) durante la inferencia del modelo para introducir diversidad y creatividad en las respuestas del modelo. El valor predeterminado es `False`. Si establece `do_sample` en `True`, debe especificar un valor para uno de los siguientes parámetros: `temperature`, `top_k`, `top_p` o `typical_p`.
   + `top_p`: controla el grado de asignación al azar al limitar el conjunto de tokens que se deben tener en cuenta al generar el siguiente token. Los valores más altos de `top_p` permiten un conjunto que contiene un vocabulario más amplio. Los valores más bajos restringen el conjunto de tokens a palabras más probables. Los rangos de `top_p` son mayores que `0` y menores que `1`.
   + `temperature`: controla el grado de asignación al azar del texto generado. Los valores más altos de `temperature` indican al modelo que genere respuestas más aleatorias y diversas. Los valores más bajos generan respuestas más predecibles. Los valores de `temperature` deben ser positivos. 
   + `max_new_tokens`: limita la longitud de la respuesta al limitar la cantidad de tokens que devuelve el modelo. El valor predeterminado es `20`.
   + `decoder_input_details`: devuelve información sobre las probabilidades logarítmicas asignadas por el modelo a cada posible siguiente token y los identificadores de token correspondientes. Si `decoder_input_details` está establecido en`True`, también debe establecer `details` en `True` para recibir los detalles solicitados. El valor predeterminado es `False`.

   Para obtener más información sobre los parámetros de este modelo de `Hugging Face`, consulte [types.py](https://github.com/huggingface/text-generation-inference/blob/v0.9.3/clients/python/text_generation/types.py#L8).

## Envío de un ejemplo de solicitud de inferencia
<a name="clarify-foundation-model-evaluate-auto-tutorial-one-sample"></a>

Para probar su modelo, envíe una solicitud de ejemplo a su modelo e imprima la respuesta del modelo de la siguiente manera:

```
response = predictor.predict(payload)
print(response[0]["generated_text"])
```

En el ejemplo de código anterior, si el modelo proporcionó la respuesta `[{"response": "this is the output"}]`, la instrucción `print` devuelve `this is the output`.

## Configuración de FMEval
<a name="clarify-foundation-model-evaluate-auto-tutorial-one-fmeval"></a>

1. Cargue las bibliotecas necesarias para ejecutar FMEval de la siguiente manera:

   ```
   import fmeval
   from fmeval.data_loaders.data_config import DataConfig
   from fmeval.model_runners.sm_jumpstart_model_runner import JumpStartModelRunner
   from fmeval.constants import MIME_TYPE_JSONLINES
   from fmeval.eval_algorithms.prompt_stereotyping import PromptStereotyping, PROMPT_STEREOTYPING
   from fmeval.eval_algorithms import EvalAlgorithm
   ```

1. Realice la configuración de datos para su conjunto de datos de entrada.

   Si no utiliza un conjunto de datos integrado, la configuración de datos debe identificar la columna que contiene más sesgos en `sent_more_input_location`. También debe identificar la columna que contiene menos sesgos en `sent_less_input_location`. Si utiliza un conjunto de datos integrado de JumpStart, estos parámetros se transfieren automáticamente a FMEval a través de los metadatos del modelo. 

   Especifique las columnas `sent_more_input_location` y `sent_less_input_location` para una tarea de estereotipado de peticiones, el nombre, el identificador uniforme de recursos (URI) y el tipo `MIME`.

   ```
   config = DataConfig(
   dataset_name="crows-pairs_sample",
   dataset_uri="crows-pairs_sample.jsonl",
   dataset_mime_type=MIME_TYPE_JSONLINES,
   sent_more_input_location="sent_more",
   sent_less_input_location="sent_less",
   category_location="bias_type",
   )
   ```

   Para obtener más información sobre la información de columnas que requieren otras tareas, consulte la sección **Use a custom input dataset** en [Uso de un conjunto de datos de entrada personalizado](clarify-foundation-model-evaluate-auto-lib-custom.md#clarify-foundation-model-evaluate-auto-lib-custom-input).

1. Configure un `ModelRunner` personalizado como se muestra en el ejemplo de código siguiente.

   ```
   js_model_runner = JumpStartModelRunner(
   endpoint_name=endpoint_name,
   model_id=model_id,
   model_version=model_version,
   output='[0].generated_text',
   log_probability='[0].details.prefill[*].logprob',
   content_template='{"inputs": $prompt, "parameters":
   {"do_sample": true, "top_p": 0.9, "temperature": 0.8, "max_new_tokens": 1024,
   "decoder_input_details": true,"details": true}}',
   )
   ```

   En el ejemplo de código anterior especifica lo siguiente:
   + `endpoint_name`: el nombre del punto de conexión que creó en el paso anterior **Instalación de las bibliotecas necesarias**.
   + `model_id`: el identificador utilizado para especificar el modelo. Este parámetro se especificó cuando se definió el JumpStart modelo.
   + `model_version`: la versión del modelo utilizada para especificarlo. Este parámetro se especificó cuando se definió el JumpStart modelo.
   + `output`: captura la salida del [modelo Falcon 7b](https://huggingface.co/tiiuae/falcon-7b), que devuelve su respuesta en una clave `generated_text`. Si su modelo proporcionó la respuesta `[{"generated_text": "this is the output"}]`, entonces `[0].generated_text` devuelve `this is the output`.
   + `log_probability`— Captura la probabilidad logarítmica devuelta por este JumpStart modelo.
   + `content_template`: especifica cómo interactúa el modelo con las solicitudes. La plantilla de configuración del ejemplo se detalla únicamente para explicar el ejemplo anterior y no es obligatoria. Los parámetros de la plantilla de contenido son los mismos que los declarados para `payload`. Para obtener más información sobre los parámetros de este modelo de `Hugging Face`, consulte [types.py](https://github.com/huggingface/text-generation-inference/blob/v0.9.3/clients/python/text_generation/types.py#L8). 

1. Configure el informe de evaluación y guárdelo en un directorio como se muestra en el siguiente código de ejemplo:

   ```
   import os
   eval_dir = "results-eval-prompt-stereotyping"
   curr_dir = os.getcwd()
   eval_results_path = os.path.join(curr_dir, eval_dir) + "/"
   os.environ["EVAL_RESULTS_PATH"] = eval_results_path
   if os.path.exists(eval_results_path):
   print(f"Directory '{eval_results_path}' exists.")
   else:
   os.mkdir(eval_results_path)
   ```

1. Configure un factor de paralelización de la siguiente manera:

   ```
   os.environ["PARALLELIZATION_FACTOR"] = "1"
   ```

   Un `PARALLELIZATION_FACTOR` es un multiplicador del número de lotes simultáneos enviados a la instancia de computación. Si su hardware permite la paralelización, puede configurar este número para multiplicar el número de invocaciones para su trabajo de evaluación. Por ejemplo, si tiene `100` invocaciones y `PARALLELIZATION_FACTOR` está configurado en `2`, su trabajo ejecutará `200` invocaciones. Puede aumentar `PARALLELIZATION_FACTOR` hasta `10` o eliminar la variable por completo. Para leer un blog sobre cómo utiliza AWS Lambda, `PARALLELIZATION_FACTOR` consulte Nuevos [controles de escalado de AWS Lambda para las fuentes de eventos de Kinesis](https://aws.amazon.com/blogs/compute/new-aws-lambda-scaling-controls-for-kinesis-and-dynamodb-event-sources/) y DynamoDB.

## Ejecución de la evaluación del modelo
<a name="clarify-foundation-model-evaluate-auto-tutorial-one-run"></a>

1. Defina su algoritmo de evaluación. El siguiente ejemplo muestra cómo definir un algoritmo de `PromptStereotyping`:

   ```
   eval_algo = PromptStereotyping()
   ```

   Para ver ejemplos de algoritmos que calculan métricas para otras tareas de evaluación, consulte **Evaluate your model** en [Utilice la biblioteca `fmeval` para ejecutar una evaluación automática](clarify-foundation-model-evaluate-auto-lib.md).

1. Ejecute su algoritmo de evaluación. El siguiente ejemplo de código utiliza el modelo y la configuración de datos que se han definido previamente y una `prompt_template` que utiliza `feature` para pasar la petición al modelo de la siguiente manera:

   ```
   eval_output = eval_algo.evaluate(model=js_model_runner, dataset_config=config,
   prompt_template="$feature", save=True)
   ```

   La salida de su modelo podría ser diferente a la del ejemplo anterior.

## Visualización de los resultados del análisis
<a name="clarify-foundation-model-evaluate-auto-tutorial-one-view"></a>

1. Analice un informe de evaluación a partir del objeto `eval_output` devuelto por el algoritmo de evaluación de la siguiente manera:

   ```
   import json
   print(json.dumps(eval_output, default=vars, indent=4))
   ```

   El comando anterior devuelve la siguiente salida (se ha abreviado para mayor claridad):

   ```
   [
   {
       "eval_name": "prompt_stereotyping",
       "dataset_name": "crows-pairs_sample",
       "dataset_scores": [
           {
               "name": "prompt_stereotyping",
               "value": 0.6666666666666666
           }
       ],
       "prompt_template": "$feature",
       "category_scores": [
           {
               "name": "disability",
               "scores": [
                   {
                       "name": "prompt_stereotyping",
                       "value": 0.5
                   }
               ]
           },
           ...
       ],
       "output_path": "/home/sagemaker-user/results-eval-prompt-stereotyping/prompt_stereotyping_crows-pairs_sample.jsonl",
       "error": null
   }
   ]
   ```

   La salida del ejemplo anterior muestra una puntuación general para el conjunto de datos después de `"name": prompt_stereotyping`. Esta puntuación es la diferencia normalizada en las probabilidades logarítmicas entre la respuesta del modelo que proporciona **más** y la que proporciona menos sesgo. Si la puntuación es superior a `0.5`, eso significa que es más probable que la respuesta del modelo devuelva una respuesta que contenga más sesgo. Si la puntuación es inferior a `0.5`, es más probable que el modelo devuelva una respuesta que contenga menos sesgo. Si la puntuación es `0.5`, la respuesta del modelo no contiene el sesgo medido por el conjunto de datos de entrada. Utilizará `output_path` para crear un `Pandas` `DataFrame` en el paso siguiente.

1. Importe sus resultados y léalos en un `DataFrame`, y asocie las puntuaciones de estereotipado de peticiones a la entrada del modelo, a la salida del modelo y a la salida objetivo de la siguiente manera:

   ```
   import pandas as pd
   data = []
   with open(os.path.join(eval_results_path,
   "prompt_stereotyping_crows-pairs_sample.jsonl"), "r") as file:
   for line in file:
   data.append(json.loads(line))
   df = pd.DataFrame(data)
   df['eval_algo'] = df['scores'].apply(lambda x: x[0]['name'])
   df['eval_score'] = df['scores'].apply(lambda x: x[0]['value'])
   df
   ```

   Para ver un cuaderno que contenga los ejemplos de código de esta sección, consulte [jumpstart-falcon-stereotyping.ipnyb](https://github.com/aws/fmeval/blob/main/examples/jumpstart-falcon-stereotyping.ipynb).