背景
上一篇文章《GPT大語言模型Alpaca-lora本地化部署實踐》介紹了斯坦福大學的Alpaca-lora模型的本地化部署,并驗證了實際的推理效果,
總體感覺其實并不是特別理想,原始Alpaca-lora模型對中文支持并不好,用52k的中文指令集對模型進行fine-tuning之后,效果依然達不到網上說的媲美GPT-3.5的推理效果,驗證了那句話:“事不目見耳聞,而臆斷其有無,可乎?”
在具有3塊Tesla P40顯卡的服務器上,利用3塊GPU顯卡加載模型引數和計算,進行一次簡單的推理(非數學運算和邏輯運算)也需要大概30s-1min的時間,效率簡直慢的驚人,在京東云GPU云主機部署上,雖然推理效率提高了很多,用中文資料集對模型進行了fine-tuning,然而對中文的支持也并不是很好,經常會出現亂碼、重復問題、詞不達意等情況,
最近大模型也同雨后春筍般的層出不窮,各個大廠和科研機構都推出了自己的大模型,其中基于LLaMA(開源且好用)的最多,所以決定再看看其他模型,有沒有推理效果好,中文支持好,同時推理效率高的模型,
經過篩選,Vicuna-13B的推理效果據說達到了ChatGPT的90%以上的能力,優于LLaMA-13B和Alpaca-13B的效果(具體如下圖所示),評估方法是對各個模型Alpaca、LLaMA、ChatGPT和Bard輸入同樣的問題,然后通過GPT-4當裁判對推理結果進行打分,以ChatGPT的回答作為100分,回答越接近得分越高(雖然評估方法并不科學,但是目前看也沒有更好的辦法對模型推理結果進行更科學的評估),
同時Vicuna的訓練成本也很低,據說只需要$300左右,所以嘗試本地化部署一下Vicuna-7B,看看效果如何,說干就干,
環境準備
由于之前本地化部署過Alpaca-lora模型了,本以為可以直接下載開源包,簡單部署一下就可以看到效果了,結果發現我還是“too young,too simple”了,環境部署和解決包沖突的程序竟然比第一次部署Alpaca-lora模型還要費勁,
簡單的復述一下部署流程,詳細的可以參考上一篇內容《GPT大語言模型Alpaca-lora本地化部署實踐》,
- 本地化部署或GPU云主機部署:GPU服務器具有4塊獨立的GPU,型號是P40,單個P40算力相當于60個同等主頻CPU的算力;GPU云主機要選購P40https://www.jdcloud.com/cn/calculator/calHost
- 安裝顯卡驅動和CUDA驅動
模型準備
由于Vicuna 是基于LLaMA模型的,為了符合LLaMA 模型license授權,僅發布了 delta 權重,所以我們需要將原始llama-7b模型與delta模型權重合并之后,才能得到vicuna權重,
首先是下載llama-7b模型,由于檔案比較大,所以用lfs直接從檔案服務器上下載,大小有26G,執行:
git lfsclonehttps://huggingface.co/decapoda-research/llama-7b-hf
然后是下載delta模型,執行:
git lfsclonehttps://huggingface.co/lmsys/vicuna-7b-delta-v1.1
下載完成后進行權重合并,執行:
python -m fastchat.model.apply_delta \ --base ./model/llama-7b-hf \ --delta ./model/vicuna-7b-delta-v1.1 \ --target ./model/vicuna-7b-all-v1.1
這個合并程序會很快,最終結果如下,合并之后引數大小變成了13G,
合并之后的目錄下會有組態檔和資料檔案,
安裝依賴包
Vicuna主要用到3個依賴包,fschat、tensorboardX和flash-attn,前2個安裝比較順利,直接pip install fschat、tensorboardX即可安裝完成,flash-attn安裝遇到了問題,一直報以下錯誤:
經過一番檢索,發現是gcc版本太低導致的,需要升級gcc,首先查看了一下本地的gcc版本,gcc -v和g++ -v發現是4.8.5的,確實是太低了,那么既然要升級,就升級到最新版,直接下載13.1版本,可以在
http://ftp.gnu.org/gnu/gcc/選擇想要安裝的版本,這里選擇的是gcc-13.1.0.tar.gz,
執行:
tar -xzf gcc-13.1.0.tar.gz
cd gcc-13.1.0
./contrib/download_prerequisites
mkdir build
cd build/
../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
然后執行make編譯,注意這里make時間會非常長,可能會持續幾個小時,可以使用 make -j 8讓make最多運行8個編譯命令同時運行,加快編譯速度,
順利完成后,我們再執行make install進行安裝,
然后用gcc -v和g++ -v驗證版本是否已經更新,如果提示如下,說明安裝完成,
然后我們需要卸載原有的gcc和g++,切換到root權限,執行yum -y remove gcc g++,
配置新版本全域可用,執行ln -s /usr/local/bin/gcc /usr/bin/gcc,
更新鏈接庫,執行:
查看原鏈接庫:strings /usr/lib64/libstdc++.so.6 | grep CXXABI
洗掉原鏈接庫:rm -f /usr/lib64/libstdc++.so.6
建立軟連接:ln -s /usr/local/lib64/libstdc++.so.6.0.29 /usr/lib64/libstdc++.so.6
查看新鏈接庫:strings /usr/lib64/libstdc++.so.6 | grep CXXABI
如果最新版本有變化,那么恭喜你,說明已經升級成功啦,
安裝cuda
由于之前是用rpm包安裝的cuda,有些檔案是缺失的,運行時會報各種奇奇怪怪的錯誤,這里就不贅述了(只有經歷過才會懂),直接介紹用二進制檔案安裝cuda程序,
下載地址:
https://developer.nvidia.com/cuda-11-7-0-download-archive?target_os=Linux&target_arch=x86_64&Distribution=CentOS&target_version=7&target_type=runfile_local
注意這里要選擇runfile(local),
然后執行sh
cuda_11.7.0_515.43.04_linux.run,
安裝完成后,需要配置環境變數,在本地.bash_profile中配置如下兩項:
下面驗證一下安裝是否成功,執行nvcc -V,如下圖所示,那么恭喜你,安裝成功啦,
安裝cudnn和nccl
安裝cudnn和nccl需要先在nvidia注冊賬號,注冊之后可以在以下兩個地址下載相應的rpm包,然后rpm -ivh XXXXX.rpm包即可,
cudnn下載地址: https://developer.nvidia.com/cudnn
nccl下載地址: https://developer.nvidia.com/nccl/nccl-legacy-downloads
安裝完成后,如下圖所示說明已經安裝成功rpm包,
模型推理
又到激動人心的時刻啦,讓我們來測驗一下看看模型的推理效果如何?首先我們先擦拭一下還沒有干透辛勤的汗水,一切努力,都是為了最終能跟機器人程式對上話,理想情況是讓我們感覺它并不是一個機器人,
在終端執行如下命令,然后輸入問題即可,
python -m fastchat.serve.cli --model-path ./model/vicuna-7b-all-v1.1 --style rich
當然,還可以根據不同的需求場景,設定不用的運行引數,如下:
壓縮模型 預測效果會稍差一點,適合GPU顯存不夠的場景
python -m fastchat.serve.cli --model-path ./model/vicuna-7b-all-v1.1 --load-8bit --style rich
使用cpu進行推理,速度會很慢,慎用
python -m fastchat.serve.cli --model-path ./model/vicuna-7b-all-v1.1 --device cpu --style rich
使用多個GPU進行預測
python -m fastchat.serve.cli --model-path ./model/vicuna-7b-all-v1.1 --num-gpus 3 --style rich
1)推薦菜譜測驗:
2)多語言測驗:
3)代碼能力測驗:
4)數學計算測驗
5)普通對話推薦
推理程序中GPU服務器資源使用情況,目前使用單GPU進行推理,都可以做到秒級回應,GPU記憶體空加載13G,推理時不到15G,推理時單GPU算力基本可以達到90%以上,甚至100%,如下圖所示,
總結一下:
1)對精確的推理效果并不是很理想,比如推薦菜譜,感覺是在一本正經的胡說八道,按照推理的結果很難做出可口的飯菜?;
2)對多種自然語言的支持,這個真的是出乎預料,竟然日語和西班牙語完全都能夠自如應對,可以說是相當的驚艷了;
3)編碼能力還是可以的,能夠大概給出基本需求,當然如果想直接編譯執行可能還需要人工微調,但是作為輔助工具應該是沒問題的;
4)資料計算能力目前看還是比較弱的,簡單的乘法目前還不能夠給出正確的答案;
5)普通的對話是完全沒有問題的,對中文的理解也完全能否符合預期,解解悶排解一下孤獨是能夠cover住的,
由于模型目前還沒有做fine-tuning,從目前的推理效果來看,已經是非常不錯了,而且推理的效率也是非常不錯的,即使使用單GPU進行推理也可以做到秒級回應,而且推理程序中顯存占用也才只有60%多,跟空載時候的50%多沒差多少,總之在沒有經過fine-tuning的情況下,模型的推理表現和推理效率還是可以打7-8分(滿分10分)的,如果假以時日,有足夠的語料庫和進行fine-tuning的話,效果還是可期的,
模型fine-tuning
要想使模型適合某一特定領域內的場景,獲取特定領域的知識是必不可少的,基于原始模型就要做fine-tuning操作,那么我們嘗試做一下fine-tuning,看看效果如何吧,
fine-tuning需要在終端執行一下命令:
torchrun --nproc_per_node=3 --master_port=40001 ./FastChat/fastchat/train/train_mem.py \
--model_name_or_path ./model/llama-7b-hf \
--data_path dummy.json \
--bf16 False \
--output_dir ./model/vicuna-dummy \
--num_train_epochs 2 \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 8 \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps 300 \
--save_total_limit 10 \
--learning_rate 2e-5 \
--weight_decay 0. \
--warmup_ratio 0.03 \
--lr_scheduler_type "cosine" \
--logging_steps 1 \
--report_to "tensorboard" \
--fsdp "full_shard auto_wrap" \
--fsdp_transformer_layer_cls_to_wrap 'LlamaDecoderLayer' \
--tf32 False \
--model_max_length 2048 \
--gradient_checkpointing True \
--lazy_preprocess True
最終./model/vicuna-dummy目錄輸出就是我們fine-tuning之后的模型權重檔案目錄,
很遺憾,本文fine-tuning沒有成功,報錯如下:
原因也很簡單,由于我們使用的GPU型號是Tesla P40,此款顯卡使用的SM_62架構,目前模型fine-tuning至少需要SM_75及以上架構,看社區有在4090、A100或者A80顯卡上fine-tuning成功的,所以fine-tuning只能后續再更高架構的顯卡上進行了,
后續作業
終上,Vicuna模型在整體表現和推理效率上可以說是秒殺Alpaca模型的,我們本文測驗用的是Vicuna-7b,如果是Vicuna-13b效果會更好,而且對多種自然語言(包含中文)的支持也要遠遠好于Alpaca模型,確實像社區所說的,目前Vicuna模型可以說是開源大模型的天花板了,如果想基于開源大模型進行二次開發,是個不二的選擇,
基于大模型的本地化部署作業目前就告一段落了,后續做的作業可能有以下幾點:
1)如果有更好的顯卡,可以對vicuna進行fine-tuinig,驗證一下fine-tuning之后模型能不能學到特定領域的知識;后續準備使用公司內部提供的試用資源【京東云GPU云主機p.n3a100系列】,這個產品提供Nvidia? A100 GPU(80G顯存),搭配使用Intel? Xeon? Platinum 8338C 處理器及DDR4記憶體,支持NVLink,單精度浮點運算峰值能達到156TFlops,可以說是最強算力了,
2)找到合適的與目前應用結合的場景,將大語言模型應用落地;
3)基于vicuna開源專案進行二次開發,封裝成可用的服務;
4)基于大語言模型進行更多的探索和學習,
來源:京東云開發者社區
作者:Beyond_luo(未經授權請勿轉載)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/552841.html
標籤:其他
下一篇:返回列表
