deepbbt.py ?A ajuste de caixa preta (BBT) é um método sem gradiente para conduzir modelos de idiomas grandes (LLMs) para aprendizado de poucos anos. Ele otimiza uma sequência de tokens de prompt Soft presos à entrada de LLMs, sem exigir gradientes/propagação de volta dos LLMs. Portanto, os LLMs gerais pré-treinados podem ser vistos como modelos de caixa preta e implantados com eficiência em alguns servidores de inferência. Nesse cenário, que chamamos de model de linguagem como serviço (LMAAs), o BBT pode obter um desempenho comparável ao ajuste completo do modelo, acessando apenas as APIs de inferência do modelo. Geralmente, o BBT pode obter resultados consideráveis na maioria dos conjuntos de dados de entendimento de idiomas dentro de 8K Model Forward Passe.
Mais detalhes são fornecidos em nosso ajuste de caixa preta de papel ICML para o modelo como serviço e nosso artigo EMNLP BBTV2: em direção a um futuro sem gradiente com grandes modelos de idiomas.
Para ajudar a reproduzir os resultados relatados no artigo, também lançamos um Google Sheets que registra o desempenho do BBTV2 em cada conjunto de dados usando cada semente aleatória. Sinta -se à vontade para me alcançar se não puder obter resultados semelhantes.
A implementação do ajuste de caixa preta é bastante simples, você pode verificar nosso código e implementá-lo facilmente em seu próprio ambiente. Ou você pode criar um novo ambiente para executar nossa implementação com base em pycma , Transformers e FastNLP . Opcionalmente, você pode usar fitlog para monitorar resultados experimentais. Você pode descomentar as linhas relacionadas ao FitLog em nosso código para usá-lo.
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 Agora você pode executar o ajuste de caixa preta com run.sh :
bash run.shEm geral, você obterá os seguintes resultados em ~ 13 minutos (testados na GPU da NVIDIA 3090):
| SST-2 Split | Melhor precisão |
|---|---|
| Trem | 100 % |
| Dev | 96,88 % |
| Teste | 90,48 % |
Para reproduzir outros experimentos em nosso artigo, mude os argumentos do bbt.py , por exemplo,
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 obter resultados semelhantes relatados no artigo original, recomendamos o uso de --loss_type "hinge" para tarefas de pares de frases (ou seja, MRPC, SNLI e RTE) e usando --budget 20000 para DBpedia.
Além disso, o ajuste de caixa preta também suporta avaliação paralela. Ou seja, você pode avaliar uma população de soluções em paralelo, colocando -as em um único lote grande. Por exemplo,
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
--parallelO BBTV2 é uma versão aprimorada do BBT. Em vez de otimizar o prompt apenas na camada de entrada, o BBTV2 adota um algoritmo de divisão e conquista para otimizar alternadamente os prompts em todas as camadas (ou seja, prompt profundo). Você pode simplesmente tentar o BBTV2 usando o seguinte 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 100O BBTV2 geralmente confere melhores resultados em muitas tarefas de classificação de etiquetas (por exemplo, dbpedia) e tarefas de interrupção (por exemplo, mrpc, snli, rte, etc.). Verifique nossas folhas do Google se tiver problemas para reproduzir os resultados do BBTV2.
Em contraste com o treinamento com a ascendência de gradiente, o BBT (e o BBTV2) requer apenas o cálculo do modelo e, portanto, pode ser significativamente acelerado usando o tempo de execução do ONNX ou o NVIDIA Tensorrt.
Aqui fornecemos uma implementação da otimização de inferência usando o tempo de execução do ONNX. Você pode obter ~ 2x aceleração usando apenas uma linha de código.
O SDK onnxruntime-gpu é necessário para otimização. A instalação deste pacote pode ser problemática. E pode haver alguns erros específicos do ambiente ou desempenho inesperado. Mas em cenários do mundo real, isso faz parte da caixa preta do lado do servidor.
O código a seguir funciona bem para configurar o ambiente em uma GPU NVIDIA GeForce RTX 3090 com a versão do driver: 470.82.00 e CUDA Versão: 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 um modelo BBT baseado no PyTorch para um modelo ONNX , você pode executar export_and_optimize.py com todos os argumentos definidos como padrão para obter um modelo de demonstração ONNX.
python export_and_optimize.py Dois modelos serão salvos para ./onnx_models/ , nomeadamente exportados (não acelerados) e otimizado. Então você pode modificar run.sh Ao definir o parâmetro inference_framework como 'ort' e onnx_model_path para <Your model path> , uma versão mais rápida do BBT está pronta. Aqui está um exemplo.
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 adicionar alguma flexibilidade à otimização do modelo, fornecemos algumas opções em export_and_optimize.py . Você pode ajustar esses argumentos em export_and_optimize.sh . Aqui está um exemplo.
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 'Os modelos ONNX são estáticos, mas Cat ou adicionar é uma ramificação no modelo. Durante a fase de construção, os nós não utilizados no gráfico do modelo são removidos para melhor desempenho. Então você precisa construir um para cada modo.
Você pode obter os seguintes resultados em 4,3 ± 0,1 minutos, em comparação com a versão Pytorch do BBT cujo tempo de treinamento é de 8,9 ± 0,15 minutos (depende das configurações de hardware)
Você pode obter os seguintes resultados executando o BBT 100 vezes no SST2 com conjunto de sementes aleatórias de 1 a 100. A otimização do FP16 não prejudica o desempenho em todas as tarefas.
| SST-2 Split | Melhor precisão |
|---|---|
| Teste | 88,0 % |
Se você achar esse trabalho útil, 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 }
}