GPT大語言模型Vicuna本地化部署實踐(效果秒殺Alpaca)

京東雲開發者發表於2023-05-18

背景

上一篇文章《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本地化部署實踐》。

  1. 本地化部署或GPU雲主機部署:GPU伺服器具有4塊獨立的GPU,型號是P40,單個P40算力相當於60個同等主頻CPU的算力;GPU雲主機要選購P40https://www.jdcloud.com/cn/calculator/calHost
  2. 安裝顯示卡驅動和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(未經授權請勿轉載)

相關文章