deepbbt.py 로 시도해 보시겠습니까?블랙 박스 튜닝 (BBT)은 소수의 학습을위한 대형 언어 모델 (LLM)을 구동하는 그라디언트가없는 방법입니다. LLMS의 그라디언트/역전 준비가 필요하지 않고 LLM의 입력에 미리 된 소프트 프롬프트 토큰 시퀀스를 최적화합니다. 따라서, 사전 훈련 된 일반 장착 LLM은 블랙 박스 모델로 간주 될 수 있으며 일부 추론 서버에서 효율적으로 배포 할 수 있습니다. LMAA (Language-Model-as-a-Service)라고하는 이러한 시나리오에서 BBT는 모델 추론 API 만 액세스하여 전체 모델 튜닝과 비슷한 성능을 달성 할 수 있습니다. 일반적으로 BBT는 8K 모델 포워드 패스 내에서 대부분의 언어 이해 데이터 세트에서 상당한 결과를 얻을 수 있습니다.
자세한 내용은 ICML 종이에 대한 언어 모델에 대한 ICML 용지 블랙 박스 튜닝 및 EMNLP 용지 BBTV2 : 큰 언어 모델을 가진 그라디언트가없는 미래를 향해 제공됩니다.
논문에서보고 된 결과를 재현하기 위해 각 임의의 시드를 사용하여 각 데이터 세트에 BBTV2 성능을 기록하는 Google 시트도 출시됩니다. 비슷한 결과를 얻을 수 없다면 저에게 연락하십시오.
블랙 박스 튜닝 구현은 매우 간단합니다. 코드를 확인하고 자신의 환경에서 쉽게 구현할 수 있습니다. 또는 pycma , Transformers 및 FastNLP 기반으로 구현을 실행할 수있는 새로운 환경을 만들 수 있습니다. 선택적으로 fitlog 사용하여 실험 결과를 모니터링 할 수 있습니다. 코드에서 FitLog 관련 라인을 사용하여 사용하여 사용할 수 있습니다.
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 이제 run.sh 로 블랙 박스 튜닝을 실행할 수 있습니다.
bash run.sh일반적으로 ~ 13 분 안에 다음 결과를 얻게됩니다 (NVIDIA 3090 GPU에서 테스트) :
| SST-2 분할 | 최고의 정확도 |
|---|---|
| 기차 | 100 % |
| Dev | 96.88 % |
| 시험 | 90.48 % |
우리 논문에서 다른 실험을 재현하려면 bbt.py 의 주장을 변경하십시오.
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 원래 논문에보고 된 것과 유사한 결과를 얻으려면 문장 쌍 작업 (예 : MRPC, SNLI 및 RTE)에 --loss_type "hinge" 사용하고 DBPedia에 --budget 20000 사용하는 것이 좋습니다.
또한 블랙 박스 튜닝은 병렬 평가도 지원합니다. 즉, 솔루션 집단을 단일 큰 배치에 넣어서 동시에 평가할 수 있습니다. 예를 들어,
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는 개선 된 BBT 버전입니다. BBTV2는 입력 계층에서 프롬프트를 최적화하는 대신 모든 계층 (즉, 깊은 프롬프트)에서 프롬프트를 번갈아 최적화하기 위해 분할 및 정복 알고리즘을 채택합니다. 다음 명령을 사용하여 BBTV2를 사용해 볼 수 있습니다.
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는 일반적으로 많은 레이블 분류 작업 (예 : DBPEDIA) 및 수반 작업 (예 : MRPC, SNLI, RTE 등)에 더 나은 결과를 제공합니다. BBTV2의 결과를 재현하는 데 문제가있는 경우 Google 시트를 확인하십시오.
그라디언트 하강과의 훈련과 달리 BBT (및 BBTV2)는 모델 전방 계산 만 필요하므로 ONNX 런타임 또는 NVIDIA Tensorrt를 사용하여 크게 가속화 될 수 있습니다.
여기서 우리는 ONNX 런타임을 사용하여 추론 최적화 구현을 제공합니다. 한 줄의 코드 만 사용하여 ~ 2x 속도를 얻을 수 있습니다.
최적화를 위해서는 sdk onnxruntime-gpu 필요합니다. 이 패키지의 설치는 귀찮을 수 있습니다. 환경 별 오류 또는 예기치 않은 성능이있을 수 있습니다. 그러나 실제 시나리오에서는 서버 측의 블랙 박스의 일부입니다.
다음 코드는 드라이버 버전과 함께 Nvidia Geforce RTX 3090 GPU의 환경을 구성하는 데 적합합니다. 470.82.00 및 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 PyTorch 기반으로 BBT 모델을 ONNX 모델로 내보내려면 모든 인수를 기본적으로 설정하여 Demo Onnx 모델을 얻으려면 export_and_optimize.py 실행할 수 있습니다.
python export_and_optimize.py 두 가지 모델이 ./onnx_models/ , 즉 내보내기 (가속화되지 않음) 및 최적화 된 모델로 저장됩니다. 그런 다음 run.sh 수정할 수 있습니다. 매개 변수 inference_framework 'ort' 및 onnx_model_path 로 설정하여 <Your model path> 로 설정하면 더 빠른 버전의 BBT가 준비되었습니다. 여기 예입니다.
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 ' 모델 최적화에 약간의 유연성을 추가하기 위해 export_and_optimize.py 에서 몇 가지 옵션을 제공했습니다. export_and_optimize.sh 에서 이러한 인수를 조정할 수 있습니다. 여기 예입니다.
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 'ONNX 모델은 정적이지만 고양이 또는 추가하는 것은 모델의 분기입니다. 구축 단계에서 모델 그래프에서 사용하지 않은 노드가 제거되어 성능이 향상됩니다. 따라서 각 모드마다 하나를 빌드해야합니다.
교육 시간이 8.9 ± 0.15 분인 BBT의 Pytorch 버전에 비해 다음 결과를 4.3 ± 0.1 분 안에 얻을 수 있습니다 (하드웨어 설정에 따라 다름)
1 ~ 100의 임의의 시드 세트로 SST2에서 BBT에서 100 회 실행하여 다음 결과를 얻을 수 있습니다. FP16 최적화가 모든 작업에서 성능을 손상 시키지는 않습니다.
| SST-2 분할 | 최고의 정확도 |
|---|---|
| 시험 | 88.0 % |
이 작업이 도움이된다면 다음과 같이 인용하십시오.
@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 }
}