GPT大語言模型Alpaca-lora在地化部署實踐【大語言模型實踐一】

2023-05-17 15:00:11

模型介紹

Alpaca模型是斯坦福大學研發的LLM(Large Language Model,大語言)開源模型,是一個在52K指令上從LLaMA 7B(Meta公司開源的7B)模型微調而來,具有70億的模型引數(模型引數越大,模型的推理能力越強,當然隨之訓練模型的成本也就越高)。

LoRA,英文全稱Low-Rank Adaptation of Large Language Models,直譯為大語言模型的低階適應,這是微軟的研究人員為了解決大語言模型微調而開發的一項技術。如果想讓一個預訓練大語言模型能夠執行特定領域內的任務,一般需要做fine-tuning,但是目前推理效果好的大語言模型引數維度非常非常大,有些甚至是上千億維,如果直接在大語言模型上做fine-tuning,計算量會非常的大,成本也會非常的高。

’LoRA的做法是凍結預訓練好的模型引數,然後在每個Transformer塊裡注入可訓練的層,由於不需要對模型的引數重新計算梯度,所以,會大大的減少計算量。

具體如下圖所示,核心思想是在原始預訓練模型增加一個旁路,做一個降維再升維的操作。訓練的時候固定預訓練模型的引數,只訓練降維矩陣 A 與升維矩陣 B。而模型的輸入輸出維度不變,輸出時將 BA 與預訓練語言模型的引數疊加。

用隨機高斯分佈初始化 A,用 0 矩陣初始化 B。這樣能保證訓練時,新增的旁路BA=0,從而對模型結果沒有影響。在推理時,將左右兩部分的結果加到一起,即h=Wx+BAx=(W+BA)x,所以,只要將訓練完成的矩陣乘積BA跟原本的權重矩陣W加到一起作為新權重引數替換原始預訓練語言模型的W即可,不會增加額外的計算資源。LoRA 的最大優勢是訓練速度更快,使用的記憶體更少。

本文進行在地化部署實踐的Alpaca-lora模型就是Alpaca模型的低階適配版本。本文將對Alpaca-lora模型在地化部署、微調和推理過程進行實踐並描述相關步驟。

GPU伺服器環境部署

本文進行部署的GPU伺服器具有4塊獨立的GPU,型號是P40,單個P40算力相當於60個同等主頻CPU的算力。(也可以考慮使用京東雲GPU的P40,
jdcloud.com/cn/calculator/calHost))

拿到GPU伺服器我們首先就是安裝顯示卡驅動和CUDA驅動(是顯示卡廠商NVIDIA推出的運算平臺。 CUDA是一種由NVIDIA推出的通用平行計算架構,該架構使GPU能夠解決複雜的計算問題)。顯示卡驅動需要到NVIDIA的官方網站去查詢相應的顯示卡型號和適配的CUDA版本,下載地址:
https://www.nvidia.com/Download/index.aspx ,選擇相應的顯示卡和CUDA版本就可以下載驅動檔案啦。

我下載的檔案是NVIDIA-Linux-x86_64-515.105.01.run,這是一個可執行檔案,用root許可權執行即可,注意安裝驅動過程中不能有執行的nvidia程序,如果有需要全部kill掉,否則會安裝失敗,如下圖所示:

然後一路next,沒有報錯的話就安裝成功啦。為了後續檢視顯示卡資源情況,最好還是再安裝一個顯示卡監控工具,比如nvitop,用pip install nvitop即可,這裡注意,由於不同伺服器python版本有差異,最好安裝anaconda部署自己的私有python空間,防止執行時報各種奇怪的錯誤,具體步驟如下:

1.安裝anaconda 下載方式:wget
https://repo.anaconda.com/archive/Anaconda3-5.3.0-Linux-x86_64.sh。 安裝命令: shAnaconda3-5.3.0-Linux-x86_64.sh 每個安裝步驟都輸入「yes」,最後conda init後完成安裝,這樣每次進入安裝使用者的session,都會直接進入自己的python環境。如果安裝最後一步選擇no,即不進行conda init,則後續可以通過source/home/jd_ad_sfxn/anaconda3/bin/activate來進入到私有的python環境。

2.安裝setuptools 接下來需要安裝打包和分發工具setuptools,下載地址:wget
https://files.pythonhosted.org/packages/26/e5/9897eee1100b166a61f91b68528cb692e8887300d9cbdaa1a349f6304b79/setuptools-40.5.0.zip 安裝命令: unzip setuptools-40.5.0.zip cd setuptools-40.5.0/ python setup.py install

3.安裝pip 下載地址:wget
https://files.pythonhosted.org/packages/45/ae/8a0ad77defb7cc903f09e551d88b443304a9bd6e6f124e75c0fbbf6de8f7/pip-18.1.tar.gz 安裝命令: tar -xzf pip-18.1.tar.gz cd pip-18.1 python setup.py install

至此,漫長的安裝過程終於告一段落了,我們現在建立一個私有的python空間,執行

conda create -n alpaca python=3.9
conda activate alpaca

然後驗證一下,如下圖所示說明已經建立成功啦。

模型訓練

上文已經把GPU伺服器的基礎環境安裝好了,下面我們就要開始激動人心的模型訓練了(激動ing),在訓練之前我們首先需要下載模型檔案,下載地址:
https://github.com/tloen/alpaca-lora ,整個模型都是開源的,真好!首先把模型檔案下載到本地,執行git clonehttps://github.com/tloen/alpaca-lora.git .。

本地會有資料夾alpaca-lora,然後cd alpaca-lora到資料夾內部執行

pip install -r requirements.txt

這個過程可能會比較慢,需要從網上下載大量的依賴包,過程中可能也會報各種包衝突,依賴沒有等問題,這塊只能見招拆招,缺什麼裝什麼(解決包依賴和版本衝突確實是個頭疼的事情,不過這步做不好,模型也跑不起來,所以只能耐心的一點一點解決),這裡痛苦的過程就不贅述了,因為不同機器可能遇到的問題也不太一樣,參考意義不是很大。

如果安裝過程執行完成,並沒再有報錯資訊,並提示Successful compeleted,那麼恭喜你啦,萬里長征已經走完一半啦,你已經離成功很近了,再堅持一下下就很有可能成功啦:)。

由於我們的目標是對模型進行fine-tuning,所以我們得有一個fine-tuning的目標,由於原始模型對中文支援並不好,所以我們的目標就有了,用中文語料庫讓模型更好的支援中文,這個社群也給我準備好了,我們直接下載中文的語料庫就好了,在本地執行 wget
https://github.com/LC1332/Chinese-alpaca-lora/blob/main/data/trans_chinese_alpaca_data.json?raw=true ,將後面模型訓練用到的語料庫下載到alpaca-lora根目錄下(後面方便使用)。

語料庫的內容就是很多的三元組(instruction,input,output,如下圖所示),instruction就是指令,讓模型做什麼事,input就是輸入,output是模型的輸出,根據指令和輸入,訓練模型應該輸出什麼資訊,讓模型能夠更好的適應中文。

好的,到現在為止,萬里長征已經走完2/3了,彆著急訓練模型,我們現在驗證一下GPU環境和CUDA版本資訊,還記得之前我們安裝的nvitop嘛,現在就用上了,在本地直接執行nvitop,我們就可以看到GPU環境和CUDA版本資訊了,如下圖:

在這裡我們能夠看到有幾塊顯示卡,驅動版本和CUDA版本等資訊,當然最重要的我們還能看到GPU資源的實時使用情況。

怎麼還沒到模型訓練呢,彆著急呀,這就來啦。

我們先到根目錄下然後執行訓練模型命令:

如果是單個GPU,那麼執行命令即可:

python finetune.py \
    --base_model 'decapoda-research/llama-7b-hf' \
    --data_path 'trans_chinese_alpaca_data.json' \
    --output_dir './lora-alpaca-zh'

如果是多個GPU,則執行:

WORLD_SIZE=2 CUDA_VISIBLE_DEVICES=0,1 torchrun \
--nproc_per_node=2 \
--master_port=1234 \
finetune.py \
--base_model 'decapoda-research/llama-7b-hf' \
--data_path 'trans_chinese_alpaca_data.json' \
--output_dir './lora-alpaca-zh'

如果可以看到進度條在走,說明模型已經啟動成功啦。

在模型訓練過程中,每迭代一定數量的資料就會列印相關的資訊,會輸出損失率,學習率和代資訊,如上圖所示,當loss波動較小時,模型就會收斂,最終訓練完成。

我用的是2塊GPU顯示卡進行訓練,總共訓練了1904分鐘,也就是31.73個小時,模型就收斂了,模型訓練是個漫長的過程,所以在訓練的時候我們可以適當的放鬆一下,做點其他的事情:)。

模型推理

模型訓練好後,我們就可以測試一下模型的訓練效果了,由於我們是多個GPU顯示卡,所以想把模型引數載入到多個GPU上,這樣會使模型推理的更快,需要修改

generate.py 檔案,新增下面這樣即可。

然後我們把服務啟起來,看看效果,根目錄執行:

python generate.py --base_model "decapoda-research/llama-7b-hf" \
--lora_weights './lora-alpaca-zh' \
--load_8bit

其中./lora-alpaca-zh目錄下的檔案,就是我們剛剛fine tuning模型訓練的引數所在位置,啟動服務的時候把它載入到記憶體(這個記憶體指的是GPU記憶體)裡面。

如果成功,那麼最終會輸出相應的IP和Port資訊,如下圖所示:

我們可以用瀏覽器存取一下看看,如果能看到頁面,就說明服務已經啟動成功啦。

激動ing,費了九牛二虎之力,終於成功啦!!

因為我們目標是讓模型說中文,所以我們測試一下對中文的理解,看看效果怎麼樣?

簡單的問題,還是能給出答案的,但是針對稍微複雜一點的問題,雖然能夠理解中文,但是並沒有用中文進行回答,訓練後的模型還是不太穩定啊。

在推理的時候我們也可以監控一下GPU的變化,可以看到GPU負載是比較高的,說明GPU在進行大量的計算來完成推理。

總結

1.效果問題:由於語料庫不夠豐富,所以目前用社群提供的語料庫訓練的效果並不是很好,對中文的理解力有限,如果想訓練出能夠執行特定領域的任務,則需要大量的語料支援,同時訓練時間也會更長;

2. 推理時間問題:由於目前部署的GPU伺服器有4塊GPU,能夠執行的有3塊,基於3塊GPU,在推理的時候還是比較吃力的,執行一次互動需要大概30s-1min,如果達到chatGPT那樣實時返回,則需要大量的算力進行支援,可以反推,chatGPT後臺肯定是有大叢集算力支援的,所以如果想做成服務,成本投入是需要考量的一個問題;

3. 中文亂碼問題:在input為中文的時候,有時候返回結果會亂碼,懷疑跟切詞有關,由於中文的編碼問題,中文不像英文以空格區分,所以可能會有一定的亂碼情況產生,呼叫open AI 的API也會有這種情況,後面看看社群是否有相應解決辦法;

4. 模型選擇問題:由於目前GPT社群比較活躍,模型的產生和變化也是日新月異,由於時間倉促,目前只調研了alpaca-lora模型的在地化部署,後面針對實際落地的應用應該也會有更好的更低成本的落地方案,需要持續跟進社群的發展,選擇合適的開源方案。

京東雲P40型號GPU的【ChatGLM語言模型】實踐篇詳見

https://my.oschina.net/u/4090830/blog/8695561

作者:Beyond_luo

內容來源:京東雲開發者社群