deepbbt.py ?Black-Box Tuning (BBT) es un método sin gradiente para conducir modelos de idiomas grandes (LLM) para un aprendizaje de pocos disparos. Optimiza una secuencia de tokens de inmediato suave prepuesto a la entrada de LLMS, sin requerir gradientes/propagación de back de los LLM. Por lo tanto, las LLM previas altas de uso general se pueden ver como modelos de caja negra y implementarse de manera eficiente en algunos servidores de inferencia. En tal escenario, que llamamos lenguaje-modelo como servicio (LMAAS), BBT puede lograr un rendimiento comparable a la sintonización del modelo completo al acceder solo a las API de inferencia del modelo. En general, BBT puede lograr resultados considerables en la mayoría de los conjuntos de datos de comprensión del lenguaje dentro de los pases de avance del modelo 8K.
Se proporcionan más detalles en nuestro ajuste de caja negra de papel ICML para el model de lenguaje como servicio y nuestro documento EMNLP BBTV2: hacia un futuro sin gradiente con modelos de idiomas grandes.
Para ayudar a reproducir los resultados reportados en el documento, también lanzamos una hojas de Google que registra el rendimiento de BBTV2 en cada conjunto de datos utilizando cada semilla aleatoria. Siéntase libre de comunicarse conmigo si no puede obtener resultados similares.
La implementación de Black-Box Tuning es bastante simple, puede verificar nuestro código e implementarlo fácilmente en su propio entorno. O puede crear un nuevo entorno para ejecutar nuestra implementación basada en pycma , Transformers y FastNLP . Opcionalmente, puede usar fitlog para monitorear los resultados experimentales. Puede desenchufar las líneas relacionadas con FitLog en nuestro código para usarlo.
conda create --name bbt python=3.8
conda activate bbt
pip install transformers==4.1.1
pip install fastNLP==0.6.0
pip install datasets
pip install cma
pip install sklearn
git clone https://github.com/txsun1997/Black-Box-Tuning
cd Black-Box-Tuning Ahora puedes ejecutar el ajuste de la caja negra con run.sh :
bash run.shEn general, obtendrá los siguientes resultados en ~ 13 minutos (probado en NVIDIA 3090 GPU):
| SST-2 Split | Mejor precisión |
|---|---|
| Tren | 100 % |
| Enchufe | 96.88 % |
| Prueba | 90.48 % |
Para reproducir otros experimentos en nuestro artículo, cambie los argumentos de bbt.py , por ejemplo,
python bbt.py
--task_name " sst2 "
--n_prompt_tokens 50
--intrinsic_dim 500
--k_shot 16
--device " cuda:0 "
--seed 42
--loss_type " ce "
--cat_or_add " add "
--budget 8000
--print_every 50
--eval_every 100 Para obtener resultados similares informados en el documento original, recomendamos usar --loss_type "hinge" para tareas de par de oraciones (es decir, MRPC, SNLI y RTE) y usar --budget 20000 para DBPEDIA.
Además, la sintonización de cajas negras también admite una evaluación paralela. Es decir, puede evaluar una población de soluciones en paralelo colocándolas en un solo lote grande. Por ejemplo,
python bbt.py
--task_name " sst2 "
--n_prompt_tokens 50
--intrinsic_dim 500
--k_shot 16
--device " cuda:0 "
--seed 42
--loss_type " ce "
--cat_or_add " add "
--budget 300
--print_every 10
--eval_every 20
--parallelBBTV2 es una versión mejorada de BBT. En lugar de optimizar la solicitud simplemente en la capa de entrada, BBTV2 adopta un algoritmo de división y conquista para optimizar alternativamente las indicaciones en cada capa (es decir, un mensaje profundo). Simplemente puede probar BBTV2 usando el siguiente comando,
python deepbbt.py
--model_name " roberta-large "
--task_name " agnews "
--n_prompt_tokens 50
--intrinsic_dim 500
--k_shot 16
--device " cuda:0 "
--seed 42
--loss_type " ce "
--cat_or_add " add "
--random_proj " normal "
--sigma 0.2
--alpha 0.2
--popsize 20
--bound 0
--budget 8000
--print_every 50
--eval_every 100BBTV2 generalmente confiere mejores resultados en muchas tareas de clasificación de etiquetas (por ejemplo, dbpedia) y tareas de implicación (por ejemplo, MRPC, SNLI, RTE, etc.). Consulte nuestras hojas de Google si tiene problemas para reproducir los resultados de BBTV2.
A diferencia del entrenamiento con el descenso de gradiente, BBT (y BBTV2) solo requiere el cálculo del modelo hacia adelante y, por lo tanto, se puede acelerar significativamente utilizando tiempo de ejecución ONNX o tensor Nvidia.
Aquí proporcionamos una implementación de la optimización de inferencia utilizando el tiempo de ejecución de ONNX. Puede obtener ~ 2x aceleración usando solo una línea de código.
Se requiere SDK onnxruntime-gpu para la optimización. La instalación de este paquete puede ser problemática. Y puede haber algunos errores específicos del entorno o un rendimiento inesperado. Pero en escenarios del mundo real, esta es una parte de la caja negra en el lado del servidor.
El siguiente código funciona bien para configurar el entorno en una GPU NVIDIA GeForce RTX 3090 con versión del controlador: 470.82.00 y la versión CUDA: 11.4.
pip install transformers==4.1.1
pip install datasets
pip install fastNLP
pip install cma
pip install sklearn
pip3 install torch --extra-index-url https://download.pytorch.org/whl/cu113
pip install onnx
pip install onnxruntime-gpu==1.10.0
pip install coloredlogs
pip install sympy Para exportar un modelo BBT basado en PyTorch a un modelo ONNX , puede ejecutar export_and_optimize.py con todos los argumentos establecidos para obtener un modelo de demostración ONNX.
python export_and_optimize.py Se guardarán dos modelos en ./onnx_models/ , a saber, exportado (no acelerado) y modelo optimizado. Entonces puede modificar run.sh Al establecer Parameter inference_framework en 'ort' y onnx_model_path en <Your model path> , una versión más rápida de BBT está lista. Aquí hay un ejemplo.
python bbt.py
--task_name " sst2 "
--n_prompt_tokens 50
--intrinsic_dim 500
--k_shot 16
--device " cuda:0 "
--seed 42
--loss_type " ce "
--cat_or_add " add "
--budget 8000
--print_every 50
--eval_every 100
--inference_framework ' ort '
--onnx_model_path ' ./onnx_models/optimized_model.onnx ' Para agregar cierta flexibilidad a la optimización del modelo, proporcionamos algunas opciones en export_and_optimize.py . Puede ajustar estos argumentos en export_and_optimize.sh . Aquí hay un ejemplo.
python export_and_optimize.py
--batch_size 32
--max_seq_len 128
--n_prompt_tokens 50
--prompt_embed_dim 1024
--cat_or_add " add "
--exported_model_name ' model '
--optimized_model_name ' optimized_model 'Los modelos ONNX son estáticos, pero para CAT o agregar es una rama en el modelo. Durante la fase de construcción, los nodos no utilizados en el gráfico del modelo se eliminan para un mejor rendimiento. Entonces tienes que construir uno para cada modo.
Puede obtener los siguientes resultados en 4.3 ± 0.1 minutos, en comparación con la versión Pytorch de BBT cuyo tiempo de entrenamiento es de 8.9 ± 0.15 minutos (depende de la configuración de hardware)
Puede obtener los siguientes resultados ejecutando BBT 100 veces en SST2 con un conjunto de semillas aleatorias del 1 al 100. La optimización FP16 no perjudica el rendimiento en todas las tareas.
| SST-2 Split | Mejor precisión |
|---|---|
| Prueba | 88.0 % |
Si encuentra útil este trabajo, cite:
@inproceedings { sun2022bbt ,
title = { Black-Box Tuning for Language-Model-as-a-Service } ,
author = { Tianxiang Sun and Yunfan Shao and Hong Qian and Xuanjing Huang and Xipeng Qiu } ,
booktitle = { Proceedings of {ICML} } ,
year = { 2022 }
} @inproceedings { sun2022bbtv2 ,
title = { BBTv2: Towards a Gradient-Free Future with Large Language Models } ,
author = { Tianxiang Sun and Zhengfu He and Hong Qian and Yunhua Zhou and Xuanjing Huang and Xipeng Qiu } ,
booktitle = { Proceedings of {EMNLP} } ,
year = { 2022 }
}