背景
上一篇文章《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過程。
注意這裡要選擇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(未經授權請勿轉載)