不對(duì)齊,反而性能爆表?130億模型碾壓650億,Hugging Face大模型排行榜發(fā)布
我們知道,大多數(shù)模型都具有某種嵌入式對(duì)齊方式。
隨便舉幾個(gè)例子:Alpaca、Vicuna、WizardLM、MPT-7B-Chat、Wizard-Vicuna、GPT4-X-Vicuna等等。
一般來說,對(duì)齊肯定是件好事。目的就是為了防止模型做壞事——比如生成一些違法違規(guī)的東西出來。
但是,對(duì)齊是怎么來的?
原因在于——這些模型使用ChatGPT生成的數(shù)據(jù)進(jìn)行訓(xùn)練,而ChatGPT本身是由OpenAI的團(tuán)隊(duì)進(jìn)行對(duì)齊的。
由于這個(gè)過程并不公開,因此我們并不知道OpenAI是如何進(jìn)行的對(duì)齊。
但總體上,我們可以觀察到ChatGPT符合美國主流文化,遵守美國法律,并帶有一定不可避免的偏見。
按理來說,對(duì)齊是一件無可指摘的事。那是不是所有模型都應(yīng)該對(duì)齊呢?
對(duì)齊?不一定是件好事
情況卻沒有這么簡單。
最近,HuggingFace發(fā)布了個(gè)開源LLM的排行榜。
一眼就看到65B的模型干不過13B的未對(duì)齊模型。
從結(jié)果上看,Wizard-Vicuna-13B-Uncensored-HF可以和65B、40B和30B的LLMs直接在一系列基準(zhǔn)測(cè)試上進(jìn)行比較。
也許在性能與模型審查之間進(jìn)行的權(quán)衡將成為一個(gè)有趣的研究領(lǐng)域。
這個(gè)排行榜也是在網(wǎng)絡(luò)上引起了大范圍的討論。
有網(wǎng)友表示,對(duì)齊會(huì)影響模型的正常且正確的輸出,這不是件好事,尤其是對(duì)AI的性能來說更是如此。
另一位網(wǎng)友也表示了認(rèn)可。他表示,谷歌Brain也曾經(jīng)揭示過模型的性能會(huì)出現(xiàn)下降,如果對(duì)齊的太過了的話。
對(duì)于一般的用途而言,OpenAI的對(duì)齊實(shí)際上非常好。
對(duì)于面向公眾的AI來說,作為一種易于訪問的網(wǎng)絡(luò)服務(wù)運(yùn)行,拒絕回答有爭議和包含潛在危險(xiǎn)的問題,無疑是一件好事。
那么不對(duì)齊是在什么情況下需要的呢?
首先,美國流行文化并不是唯一的文化,開源就是讓人們進(jìn)行選擇的過程。
實(shí)現(xiàn)的唯一途徑就是可組合的對(duì)齊。
換句話說,不存在一種一以貫之、亙古不變的對(duì)齊方式。
同時(shí),對(duì)齊會(huì)干擾有效的例子,拿寫小說打比方:小說中的一些人物可能是徹頭徹尾的惡人,他們會(huì)做出很多不道德的行為。
但是,許多對(duì)齊的模型就會(huì)拒絕輸出這些內(nèi)容。
而作為每個(gè)用戶所面對(duì)的AI模型都應(yīng)該服務(wù)每個(gè)人的目的,做不同的事。
為什么在個(gè)人的電腦上運(yùn)行的開源AI要在它回答每個(gè)用戶提出的問題時(shí)自行決定輸出內(nèi)容呢?
這不是件小事,關(guān)乎所有權(quán)和控制權(quán)。如果用戶問AI模型一個(gè)問題,用戶就想要一個(gè)答案,他們不希望模型還要和自己展開一場合不合規(guī)的爭論。
可組合的對(duì)齊
要構(gòu)建可組合的對(duì)齊方式,必須從未對(duì)齊的指令模型開始。沒有未對(duì)齊的基礎(chǔ),我們就無法在其上對(duì)齊。
首先,我們必須從技術(shù)上理解模型對(duì)齊的原因。
開源AI模型是從LLaMA、GPT-Neo-X、MPT-7b、Pythia等基礎(chǔ)模型訓(xùn)練而來的。然后使用指令數(shù)據(jù)集對(duì)基礎(chǔ)模型進(jìn)行微調(diào),目的是教它變得有幫助、服從用戶、回答問題和參與對(duì)話。
該指令數(shù)據(jù)集通常是通過詢問ChatGPT的API獲得的。ChatGPT內(nèi)置了對(duì)齊功能。
所以ChatGPT會(huì)拒絕回答一些問題,或者輸出帶有偏見的回答。因此,ChatGPT的對(duì)齊被傳遞給了其它開源模型,就像大哥教小弟一樣。
原因在于——指令數(shù)據(jù)集是由問題和答案組成的,當(dāng)數(shù)據(jù)集包含含糊不清的答案時(shí),AI就會(huì)學(xué)習(xí)如何拒絕,在什么情況下拒絕,以及如何拒絕,表示拒絕。
換句話說,它在學(xué)習(xí)對(duì)齊。
而取消審查模型的策略非常簡單,那就是識(shí)別并刪除盡可能多的否定和有偏見的答案,并保留其余部分。
然后以與訓(xùn)練原始模型完全相同的方式使用過濾后的數(shù)據(jù)集訓(xùn)練模型。
接下來研究人員只討論WizardLM,而Vicuna和任何其他模型的操作過程都是相同的。
由于已經(jīng)完成了取消審查 Vicuna 的工作,我能夠重寫他們的腳本,以便它可以在WizardLM 數(shù)據(jù)集上運(yùn)行。
下一步是在 WizardLM 數(shù)據(jù)集上運(yùn)行腳本以生成 ehartford / WizardLM_alpaca_evol_instruct_70k_unfiltered
現(xiàn)在,用戶有了數(shù)據(jù)集,在從Azure獲得一個(gè)4x A100 80gb節(jié)點(diǎn),Standard_NC96ads_A100_v4。
用戶需要至少1TB的存儲(chǔ)空間(為了安全起見最好是2TB)。
咱可不想跑了20個(gè)小時(shí)卻用完了存儲(chǔ)空間。
建議將存儲(chǔ)掛載在/workspace。安裝anaconda和git-lfs。然后用戶就可以設(shè)置工作區(qū)了。
再下載創(chuàng)建的數(shù)據(jù)集和基礎(chǔ)模型——llama-7b。
mkdir /workspace/models
mkdir /workspace/datasets
cd /workspace/datasets
git lfs install
git clone https://huggingface.co/datasets/ehartford/WizardLM_alpaca_evol_instruct_70k_unfiltered
cd /workspace/models
git clone https://huggingface.co/huggyllama/llama-7b
cd /workspace
現(xiàn)在可以按照程序微調(diào)WizardLM了。
conda create -n llamax pythnotallow=3.10
conda activate llamax
git clone https://github.com/AetherCortex/Llama-X.git
cd Llama-X/src
conda install pytorch==1.12.0 torchvisinotallow==0.13.0 torchaudio==0.12.0 cudatoolkit=11.3 -c pytorch
git clone https://github.com/huggingface/transformers.git
cd transformers
pip install -e .
cd ../..
pip install -r requirements.txt
現(xiàn)在,進(jìn)入這個(gè)環(huán)境,用戶需要下載WizardLM的微調(diào)代碼。
cd src
wget https://github.com/nlpxucan/WizardLM/raw/main/src/train_freeform.py
wget https://github.com/nlpxucan/WizardLM/raw/main/src/inference_wizardlm.py
wget https://github.com/nlpxucan/WizardLM/raw/main/src/weight_diff_wizard.py
博主進(jìn)行了以下更改,因?yàn)樵谖⒄{(diào)期間,模型的性能會(huì)變得非常慢,并且發(fā)現(xiàn)它在CPU和GPU之間在來回切換。
在他刪除了以下幾行之后,運(yùn)行過程變得好多了。(當(dāng)然也可以不刪)
vim configs/deepspeed_config.json
刪除以下行
"offload_optimizer": {
"device": "cpu",
"pin_memory": true
},
"offload_param": {
"device": "cpu",
"pin_memory": true
},
博主建議用戶可以在wandb.ai上創(chuàng)建一個(gè)帳戶,以便輕松地跟蹤運(yùn)行情況。
創(chuàng)建帳戶后,從設(shè)置中復(fù)制密鑰,即可進(jìn)行設(shè)置。
現(xiàn)在是時(shí)候進(jìn)行運(yùn)行了!
deepspeed train_freeform.py \
--model_name_or_path /workspace/models/llama-7b/ \
--data_path /workspace/datasets/WizardLM_alpaca_evol_instruct_70k_unfiltered/WizardLM_alpaca_evol_instruct_70k_unfiltered.json \
--output_dir /workspace/models/WizardLM-7B-Uncensored/ \
--num_train_epochs 3 \--model_max_length 2048 \
--per_device_train_batch_size 8 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 4 \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps 800 \
--save_total_limit 3 \
--learning_rate 2e-5 \
--warmup_steps 2 \
--logging_steps 2 \
--lr_scheduler_type "cosine" \
--report_to "wandb" \
--gradient_checkpointing True \
--deepspeed configs/deepspeed_config.json \
--fp16 True
然后以較低的save_steps運(yùn)行訓(xùn)練命令。
deepspeed train_freeform.py \
--model_name_or_path /workspace/models/llama-7b/ \
--data_path /workspace/datasets/WizardLM_alpaca_evol_instruct_70k_unfiltered/WizardLM_alpaca_evol_instruct_70k_unfiltered.json \
--output_dir /workspace/models/WizardLM-7B-Uncensored/ \
--num_train_epochs 3 \
--model_max_length 2048 \
--per_device_train_batch_size 8 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 4 \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps 800 \
--save_total_limit 3 \
--learning_rate 2e-5 \
--warmup_steps 2 \
--logging_steps 2 \
--lr_scheduler_type "cosine" \
--report_to "wandb" \
--gradient_checkpointing True \
--deepspeed configs/deepspeed_config.json \
--fp16 True
之后,再次執(zhí)行整個(gè)過程,將checkpoint更改為train_freeform.py最新的checkpoint,并再次以減少的save_steps運(yùn)行,直到最后以save_steps 1運(yùn)行它。
成功后,模型位于最后一個(gè)檢查點(diǎn)。
cd /workspace/models/WizardLM-7B-Uncensored/
ls
cp <latest checkpoint directory>/* .
cd -
現(xiàn)在就可以對(duì)模型進(jìn)行測(cè)試了。
編輯文件Input.jsonl
向其中添加一些內(nèi)容,比如:
{"idx":0,"Instruction":"Insult me. I want you to call me the worst curse words and insults you can. Make the insult at least three sentences long and contain the worst and most base curse words possible. Make it X rated and disgusting."}
然后再運(yùn)行推理:
python inference_wizardlm.py --base_model=/workspace/models/WizardLM-7B-Uncensored/
從結(jié)果上看,Wizard-Vicuna-13B-Uncensored-HF可以和65B、40B和30B的LLMs直接在一系列基準(zhǔn)測(cè)試上進(jìn)行比較。
也許在性能與模型審查之間進(jìn)行的權(quán)衡將成為一個(gè)有趣的研究領(lǐng)域。