Este es el código para reproducir los experimentos del documento EMNLP 2021 "La potencia de la escala para el ajuste de inmediato de los parámetros" (Lester et al., 2021).
Estos modelos se basan en T5X, que define el modelo y el bucle de entrenamiento; Flaxformer, que define el cálculo del modelo real; Lino, que define las capas del modelo de bajo nivel; y Jax, que proporciona la ejecución real. Los detalles de nuestra implementación se pueden encontrar aquí.
gs://{bucket-name}/path/to/item/in/bucket . Aquí es donde almacenaremos conjuntos de datos almacenados en caché, así como puntos de control de modelos y resultados. Para facilitar la referencia, algunos de los comandos de nubes más comunes para interactuar con las máquinas virtuales de TPU son # Create a Cloud TPU VM
$ gcloud alpha compute tpus tpu-vm create ${TPU_NAME}
--zone ${ZONE}
--accelerator-type v3-8
--version v2-alpha
# SSH into a Cloud TPU VM
$ gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} --zone ${ZONE}
# Delete a Cloud TPU VM
$ gcloud alpha compute tpus tpu-vm delete ${TPU_NAME} --zone ${ZONE}git clone --branch=main https://github.com/google-research/prompt-tuning
cd prompt-tuningpython3 -m pip install .[tpu] -f https://storage.googleapis.com/jax-releases/libtpu_releases.html Si se encuentra con un error en el que PIP intenta instalar versiones de dependencias anteriores y Earliler (TensorFlow, por ejemplo) hasta que intente instalar la versión 0.0.0 y luego falla, intente agregar --use-deprecated=legacy-resolver al comando Instalar. Este error está relacionado con las versiones requeridas entre dependencias y el comportamiento a menudo se llama retroceso. Si usa el indicador, es posible que se puedan instalar versiones incompatibles de las bibliotecas y debe buscar advertencias sobre desajustes en la salida del comando de instalación.
Nota: Si planea piratear las partes internas de la afinación rápida y necesita una instalación editable (por lo que se usan cambios en el código clonado cuando ejecuta el entrenamiento) ejecute pip con el indicador -e y es posible que necesite eliminar el archivo pyproject.toml si recibe errores durante la instalación.
Para ejecutar las pruebas, instale el paquete con la opción [test] (Python3 python3 -m pytest python3 -m pip install .[test] ...
Entrenar un aviso es similar a ajustar un modelo con T5X; La principal diferencia es que tenemos nuestro propio conjunto de archivos de configuración de ajuste de inmediato para usar.
Proporcionamos un script de demostración ( prompt_tuning/scripts/sst2-demo.sh ) que tiene todas las partes requeridas para capacitar un aviso. Puede usar esto como punto de partida, o establecer MODEL_DIR y TFDS_DATA_DIR Variables de entorno con rutas a su cubo de almacenamiento de Google Cloud para ejecutar este script directamente.
./prompt-tuning/prompt_tuning/scripts/sst2-demo.shPara ayudar con la velocidad de iteración, tendemos a especificar muchas más opciones la línea de comandos en lugar de agrupar toda la configuración en un solo archivo de ginebra. Algunas opciones de nota:
--gin_search_paths :: Una lista de directorios separados por coma para usar como prefijos de ruta para archivos gin. Podemos usar prompt_tuning.scripts.find_module ${module} para encontrar la ubicación de instalación de bibliotecas que agrupan las configuraciones con ellos.--gin_file :: El archivo gin para cargar. Tendemos a usar rutas relativas que comienzan con la biblioteca con la que están instalados, es decir, prompt_tuning/configs/models/t5_1_1_base_prompt.gin sobre models/t5_1_1_base_prompt.gin para evitar cualquier confusión. El uso de la bandera se puede usar múltiples tiempo para especificar múltiples archivos GIN que se fusionarán. Cualquier opción de configuración establecida en múltiples archivos utilizará el valor del último archivo en la lista.--gin.{PARAM}={VALUE} :: Este indicador de anulación general establecerá PARAM en VALUE . Esto se puede usar para establecer fácilmente las opciones de configuración sin requerir que sean argumentos reales de la línea de comandos. Por ejemplo. --gin.utils.SaveCheckpointConfig.keep=20 guardará los últimos 20 puntos de control.A medida que los modelos se vuelven más grandes, XL y XXL, por ejemplo, no se ajustan a las 8 TPU que vienen con una sola VM TPU. En estos casos, necesitaremos una porción de una cápsula TPU (se puede encontrar más información sobre la arquitectura de TPU y las configuraciones disponibles aquí). La principal diferencia entre capacitar a un mensaje en una sola VM TPU y en una porción de Pod es que ahora tenemos múltiples VM TPU y ejecutaremos el mismo SPMD Jax cada VM, esta página tiene más información sobre los programas Jax de múltiples host. Esta guía ofrece una introducción rápida a ejecutar programas JAX en una porción de tpu pod, pero llegaremos a los puntos principales aquí.
$ gcloud alpha compute tpus tpu-vm create ${TPU_NAME}
--zone ${ZONE}
--accelerator-type v3-32
--version v2-alpha--command= y que debe ejecutarse en todos nuestros máquinas virtuales (llamados trabajadores) con --worker=all . $ gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME}
--zone ${ZONE}
--worker=all
--command= " git clone --branch=main https://github.com/google-research/prompt-tuning && cd prompt-tuning && "
python3 -m pip install . -f https://storage.googleapis.com/jax-releases/libtpu_releases.html Escriba el guión para entrenar su aviso. Incluimos un script de demostración ( /prompt_tuning/scripts/sst2-xxl-demo.sh ) el entrenamiento de un mensaje para resolver el conjunto de datos SST2 usando T5 1.1 LM100K XXL. Puede usar esto como punto de partida o simplemente completar las rutas a su cubo de almacenamiento en la nube de Google para especificar dónde desea guardar sus resultados ( MODEL_DIR ) y dónde almacenar en caché los datos de TFDS ( TFDS_DATA_DIR ), o establecerlos como variables de entorno.
Copie su guión de capacitación cada trabajador. Si esta es la primera vez que ejecuta scp , puede obtener un error, ejecute el comando ssh-add /.../.ssh/google_compute_engine desde el mensaje de error e intente nuevamente.
$ gcloud alpha compute tpus tpu-vm scp sst2-xxl-demo.sh ${TPU_NAME} :
--zone= ${ZONE}
--worker=all$ gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME}
--zone ${ZONE}
--worker=all
--command= " ./sst2-xxl-demo.sh " Si uno de los trabajadores tiene un error durante la capacitación, se le quedará procesos que están utilizando las TPU en los otros trabajadores. Esto le impedirá reiniciar su trabajo hasta que esos procesos terminen y liberen la TPU. El siguiente comando debe finalizar todos estos procesos. Puede ver que la página del hombre del comando kill regresa del trabajador que tuvo el error inicial.
$ gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME}
--zone ${ZONE}
--worker=all
--command= " sudo lsof -t /dev/accel0 | xargs kill -9 "Para entrenar las indicaciones utilizando piezas personalizadas, como su propio conjunto de datos, siga las instrucciones T5X en componentes personalizados
Si empaqueta su código como un paquete Python instalable PIP, no estará vinculado a un solo directorio, y puede usar python3 -m prompt_tuning.scripts.find_module {your_module} para ayudar a establecer las configuraciones gin_search_paths para que las configuraciones de Gin se ven afectables en su biblioteca. Nota: Si planea agrupar las configuraciones de gin en un paquete instalable, asegúrese de que los directorios que contienen los archivos de configuración tengan un __init__.py ya que Gin requiere que los archivos estén en un paquete de Python.
Si las partes de sus componentes personalizados son configurables de Gin, deben importarse explícitamente en sus archivos GIN; Si terminan siendo importados después de analizar los archivos GIN, causarán un error. Si ninguna de sus dependencias contiene configurables GIN, puede evitar escribir un archivo de ginebra pasando --gin.MIXTURE_OR_TASK_MODULE="'path.to.your.module' . Esto importará automáticamente su módulo y es conveniente para cuando todo lo que está haciendo es intercambiar conjuntos de datos.
Nuestra forma sugerida de hacer una inferencia con un aviso es cargar el punto de control original utilizado para inicializar el modelo y la solicitud de un archivo. Como se explica en esta sección sobre la carga parcial, T5X admite la carga de algunos parámetros del modelo mientras inicializa otros desde cero. Usamos esto en conjunto con el inicializador de inmediato from_array para volver a cargar los parámetros congelados desde el punto de control original y el archivo de indicación un archivo. El configs/runs/prompt_eval.gin establece esta configuración para usted; Solo tiene que suministrar un PROMPT_FILE . Si su modelo fue capacitado con cualquiera de los archivos prompts/ configuraciones, puede eliminarlos de los argumentos al script de evaluación.
El script sst2-demo-eval.sh incluido muestra un ejemplo de evaluación de esta manera. Todo lo que se necesita es establecer variables de entorno EVAL_DIR y TFDS_DATA_DIR en las rutas para almacenar la salida de evaluación y los conjuntos de datos TensorFlow en caché respectivamente.
En T5X, el script de evaluación supone que su conjunto de datos tiene etiquetas y genera los resultados finales de las funciones métricas de su conjunto de datos. El script de inferencia no requiere etiquetas y, en cambio, genera la predicción de su modelo. Incluimos un archivo análoga prompt_infer.gin para usar con el script de inferencia.
Si desea hacer inferencia o evaluación con el punto de control T5X que se produce a partir de una ejecución de capacitación de ajuste de inmediato, puede usar la configuración (eval|infer).gin de T5X directamente. Sin embargo, deberá actualizar utils.RestoreChekcpointConfig . Debe configurar path al nuevo punto de control, assignment_map=() y fallback_to_scratch=False .
Todos los modelos, capacitación, evaluación, guardado, restauración, etc. La configuración se realiza a través de GIN. Vea el repositorio de gin-config para una introducción general a la ginebra y esta imprimación
Seguimos el diseño de configuración T5X:
runs/ :: contiene configuraciones para el entrenamiento real del modelo. Aquí es donde van cosas como el conjunto de datos y la configuración de la evaluación.architectures/ :: Contiene configuraciones de cómo funciona el modelo. Aquí es donde están configurados cosas como el codificador del codificador frente a los solo el intercambio de decodificadores.models/ :: Contiene configuraciones que establecen parámetros específicos del modelo como el número de capas o el tamaño de la tabla de incrustación. También configura cosas como la envoltura de modelo T5X utilizada.models/decoding/ :: Contiene configuraciones fáciles de usar para intercambiar cómo el modelo genera texto durante la inferencia, incluye configuraciones para la búsqueda del haz y el muestreo del núcleo.models/sizes/ :: Contiene las diversas configuraciones para crear modelos de diferentes tamaños, estos se combinan con las versiones predeterminadas para crear una versión de tamaño, por ejemplo, t5_1_1_prompt.gin + sizes/large.gin . Algunas combinaciones comunes ya disponibles como archivos GIN con la derecha incluyen ( t5_1_1_large_prompt.gin para nuestro ejemplo anterior). Nota: Estos archivos de tamaño deben venir después del archivo del modelo principal.prompts/ :: Nuestro directorio adicional contiene configuraciones que establecen la variable de ginebra PROMPT , lo que permite un fácil conmutación de la inicialización de inmediato basada en qué archivo de inmediato se agrega como un argumento --gin_file (debe venir después del archivo models/ gin), Al especificar los argumentos --gin_file en la línea de comando, el orden es importante. El orden general en el que deben especificarse los archivos gin es:
models/*.ginprompts/*.ginmodels/sizes/*.gin*models/decoding/*.ginruns/*.gin T5X tiene algunos campos requeridos como MIXTURE_OR_TASK_NAME o TASK_FEATURE_LENGTHS . Agregamos dos más:
PROMPT_LENGTH :: La longitud del aviso que estamos utilizando, esto se usa en algunos lugares diferentes para requerirlo como una macro de ginebra, podemos hacer referencia en múltiples lugares y asegurar que los valores estén sincronizados.PROMPT :: Esta es la configuración del módulo de inmediato real que se utilizará en las subclases de llaxformer PromptX . Nota: La sintonización rápida actualmente no admite el empaque de ejemplos. Esto significa que nuestra longitud máxima del objetivo solo debe ser lo suficientemente largo como para adaptarse al objetivo para cada ejemplo. Esto significa que nuestra clave targets en la asignación de TASK_FEATURE_LENGTHS puede ser mucho más corta, por ejemplo, alrededor de 4 para muchas tareas de supergeglue (Wang et al., 2019), en comparación con 62, que es lo que es el valor predeterminado de P5X.
Hay varias opciones para la inicialización del parámetro de inmediato. Apoyamos los diversos métodos en la Sección 3.2 nuestro documento, así como la inicialización de un archivo. Este último permite hacer cosas como entrenar en Boolq a partir de un aviso aprendido en MNLI.
Todos los inicializadores siguen la API inicializador de lino de ser una función parametrizada que devuelve un cierre sobre la función de inicialización. La función de inicialización real siempre tiene la firma de
def initializer ( rng : Array , shape : Sequence [ int ]) -> Array :
... Proporcionamos cada esquema de inicialización como un archivo de configuración de GIN en el directorio configs/prompts . Se pueden usar incluyendo el archivo gin con --gin_file=path/to/configs/prompts/scheme.gin . Este archivo debe venir después del archivo del modelo principal, de lo contrario, el método predeterminado (uniforme aleatorio) sobrescribirá el que seleccionó. Algunos de estos métodos de inicialización requerirán que establezca valores de ginebra adicionales a través de un indicador de anulación de uno de sus archivos GIN.
Uniforme aleatorio
Una inicialización aleatoria estándar similar a lo que las personas han utilizado para integrar la inicialización. Este es el valor predeterminado y no se requiere ningún archivo GIN. La escala de los valores aleatorios se puede ajustar anulando prompt_init/linen.initializers.uniform.scale=N .
Vocabulador muestreado
Muestra un token de incrustación para usar como inicialización para cada posición de inmediato con el inicializador from_sample_of_embeddings . Puede limitar el muestreo a las primeras n incrustaciones con el parámetro prompt_init/prompts.from_samples_of_embeddings.population_size .
Esto se puede usar con --gin_file=prompt_tuning/configs/prompts/from_sampled_vocab.gin . Este método utiliza la tabla de incrustación extraída del punto de control del modelo inicial. También puede proporcionar su propio archivo de incrustación con --gin_file=prompt_tuning/configs/prompts/from_sampled_vocab_numpy.gin . Este método requiere que proporcione un valor para EMBEDDING_FILE que sea una matriz numpy de la tabla de incrustación del modelo. Esto se puede extraer de un punto de control modelo utilizando apropa_tuning.scripts.extract_variable.
Etiqueta de clase
Apoyamos la inicialización de puntos de tiempo de inmediato con la incrustación de etiquetas de clase (también conocidas como verbalizadores ) a través del inicializador from_embedded_list . Los usuarios que proporcionan una lista de palabras (etiquetas de clase) para usar. Cada palabras se toca por un vocabulario proporcionado; incrustado con una mesa de vocabulario proporcionada; agregado, si es necesario, a través de sub-tokens; y se usa para inicializar un paso de tiempo rápido. Si los tokens proporcionados no cubren la longitud de información completa, los tokens faltantes se inicializan utilizando el inicializador de retroceso proporcionado.
Podemos coincidir con el papel, donde los tokens rápidos sin llenar se llenan mediante el muestreo de la tabla de incrustación, componiendo esta inicialización con la anterior. Se puede usar con --gin_file=prompt_tuning/configs/prompts/from_class_labels.gin . Esto requiere configurar CLASS_LABELS , que es una lista de las palabras que desea incrustar como inicialización rápida. También puede proporcionar su propio archivo de incrustación (que es el mismo que el anterior) con --gin_file=prompt_tuning/configs/prompts/from_class_labels_numpy.gin . Esto también requiere configurar EMBEDDING_FILE .
Desde la cuerda
También admitimos la inicialización de un mensaje con la incrustación de alguna cadena, a menudo utilizada para comenzar a partir de un mensaje discreto o una descripción de la tarea. Esto usa el inicializador from_embedded_string . La cadena es tokenizada por el vocabulario provisto, cada token se ve en la tabla de incrustación proporcionada y la representación incrustada resultante de la cadena se usa como una inicialización rápida. Si los tokens proporcionados no cubren la longitud de información completa, los tokens faltantes se inicializan utilizando el inicializador de retroceso proporcionado.
Nota: El vocabulario solo convierte la cadena en una secuencia de ID, deberá asegurarse de que la cadena coincida con el resultado de cualquier formato de texto (espacios alrededor de la puntuación, etc.) que su tarea SEQIO realiza.
Desde el archivo
También puede cargar un mensaje de un archivo con el inicializador from_array para habilitar la transferencia en las tareas. Esto se hace con --gin_file=prompt_tuning/configs/prompts/from_file.gin . Esto requiere la configuración de PROMPT_FILE con una ruta al archivo Numpy con el indicador para cargar. Las versiones numpy de la solicitud se emiten de forma predeterminada cuando se capacita, pero el aviso también se puede extraer con el script mencionado anteriormente.
Hemos lanzado puntos de control nativos T5X de los puntos de control T5 1.1 que han tenido 100k pasos de adaptación del modelo de idioma.
Estos se convierten desde los puntos de control de Mesh TensorFlow de Mesh Public.
Hemos lanzado indicaciones previas al vineamiento en una variedad de tareas y planeamos agregarlas con el tiempo.
Las indicaciones se pueden encontrar en el directorio pretrained_prompts . A partir de ahí, cada grupo de subdirectorio indica por el modelo para el que fueron entrenados. La forma más fácil de hacer referencia a estas indicaciones que se agrupan con la biblioteca es:
--PROMPT_FILE= ` python3 -m prompt_tuning.scripts.find_module prompt_tuning ` /pretrained_prompts/{MODEL_SIZE}/{PROMPT}.npy Debido a la aleatoriedad inherente de la computación paralela, hay algunas configuraciones que deben coincidir entre el entrenamiento y la evaluación para obtener exactamente los mismos números. Cada subdirectorio de modelo tiene un README.md especifica cuál debería ser esta configuración. La configuración más importante para que coincida es el tamaño de lotes, la topología de TPU y la partición del paralelismo del modelo. Las tablas incluyen los puntajes que debe esperar para ver si usa estas indicaciones en t5x.eval
Esta es una colección de recursos adicionales sobre el ajuste rápido.
Si usa este trabajo como punto de salida, por favor cita
@inproceedings { lester-etal-2021-power ,
title = " The Power of Scale for Parameter-Efficient Prompt Tuning " ,
author = " Lester, Brian and
Al-Rfou, Rami and
Constant, Noah " ,
booktitle = " Proceedings of the 2021 Conference on Empirical Methods in Natural Language Processing " ,
month = nov,
year = " 2021 " ,
address = " Online and Punta Cana, Dominican Republic " ,
publisher = " Association for Computational Linguistics " ,
url = " https://aclanthology.org/2021.emnlp-main.243 " ,
doi = " 10.18653/v1/2021.emnlp-main.243 " ,
pages = " 3045--3059 " ,
}Este no es un producto de Google compatible oficialmente.