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

        博客園 2023-05-17 14:35:14

        模型介紹

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


        【資料圖】

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

        ’LoRA的做法是凍結(jié)預訓練好的模型參數(shù),然后在每個Transformer塊里注入可訓練的層,由于不需要對模型的參數(shù)重新計算梯度,所以,會大大的減少計算量。

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

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

        本文進行本地化部署實踐的Alpaca-lora模型就是Alpaca模型的低階適配版本。本文將對Alpaca-lora模型本地化部署、微調(diào)和推理過程進行實踐并描述相關(guān)步驟。

        GPU服務器環(huán)境部署

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

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

        我下載的文件是NVIDIA-Linux-x86_64-515.105.01.run,這是一個可執(zhí)行文件,用root權(quán)限執(zhí)行即可,注意安裝驅(qū)動過程中不能有運行的nvidia進程,如果有需要全部kill掉,否則會安裝失敗,如下圖所示:

        然后一路next,沒有報錯的話就安裝成功啦。為了后續(xù)查看顯卡資源情況,最好還是再安裝一個顯卡監(jiān)控工具,比如nvitop,用pip install nvitop即可,這里注意,由于不同服務器python版本有差異,最好安裝anaconda部署自己的私有python空間,防止運行時報各種奇怪的錯誤,具體步驟如下:

        1.安裝anaconda 下載方式:wgethttps://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環(huán)境。如果安裝最后一步選擇no,即不進行conda init,則后續(xù)可以通過source/home/jd_ad_sfxn/anaconda3/bin/activate來進入到私有的python環(huán)境。

        2.安裝setuptools 接下來需要安裝打包和分發(fā)工具setuptools,下載地址:wgethttps://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 下載地址:wgethttps://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

        至此,漫長的安裝過程終于告一段落了,我們現(xiàn)在創(chuàng)建一個私有的python空間,執(zhí)行

        conda create -n alpaca python=3.9conda activate alpaca

        然后驗證一下,如下圖所示說明已經(jīng)創(chuàng)建成功啦。

        模型訓練

        上文已經(jīng)把GPU服務器的基礎(chǔ)環(huán)境安裝好了,下面我們就要開始激動人心的模型訓練了(激動ing),在訓練之前我們首先需要下載模型文件,下載地址:https://github.com/tloen/alpaca-lora ,整個模型都是開源的,真好!首先把模型文件下載到本地,執(zhí)行g(shù)it clonehttps://github.com/tloen/alpaca-lora.git .。

        本地會有文件夾alpaca-lora,然后cd alpaca-lora到文件夾內(nèi)部執(zhí)行

        pip install -r requirements.txt

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

        如果安裝過程執(zhí)行完成,并沒再有報錯信息,并提示Successful compeleted,那么恭喜你啦,萬里長征已經(jīng)走完一半啦,你已經(jīng)離成功很近了,再堅持一下下就很有可能成功啦:)。

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

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

        好的,到現(xiàn)在為止,萬里長征已經(jīng)走完2/3了,別著急訓練模型,我們現(xiàn)在驗證一下GPU環(huán)境和CUDA版本信息,還記得之前我們安裝的nvitop嘛,現(xiàn)在就用上了,在本地直接執(zhí)行nvitop,我們就可以看到GPU環(huán)境和CUDA版本信息了,如下圖:

        在這里我們能夠看到有幾塊顯卡,驅(qū)動版本和CUDA版本等信息,當然最重要的我們還能看到GPU資源的實時使用情況。

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

        我們先到根目錄下然后執(zhí)行訓練模型命令:

        如果是單個GPU,那么執(zhí)行命令即可:

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

        如果是多個GPU,則執(zhí)行:

        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"

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

        在模型訓練過程中,每迭代一定數(shù)量的數(shù)據(jù)就會打印相關(guān)的信息,會輸出損失率,學習率和代信息,如上圖所示,當loss波動較小時,模型就會收斂,最終訓練完成。

        我用的是2塊GPU顯卡進行訓練,總共訓練了1904分鐘,也就是31.73個小時,模型就收斂了,模型訓練是個漫長的過程,所以在訓練的時候我們可以適當?shù)姆潘梢幌拢鳇c其他的事情:)。

        模型推理

        模型訓練好后,我們就可以測試一下模型的訓練效果了,由于我們是多個GPU顯卡,所以想把模型參數(shù)加載到多個GPU上,這樣會使模型推理的更快,需要修改

        generate.py 文件,添加下面這樣即可。

        然后我們把服務啟起來,看看效果,根目錄執(zhí)行:

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

        其中./lora-alpaca-zh目錄下的文件,就是我們剛剛fine tuning模型訓練的參數(shù)所在位置,啟動服務的時候把它加載到內(nèi)存(這個內(nèi)存指的是GPU內(nèi)存)里面。

        如果成功,那么最終會輸出相應的IP和Port信息,如下圖所示:

        我們可以用瀏覽器訪問一下看看,如果能看到頁面,就說明服務已經(jīng)啟動成功啦。

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

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

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

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

        總結(jié)

        1.效果問題:由于語料庫不夠豐富,所以目前用社區(qū)提供的語料庫訓練的效果并不是很好,對中文的理解力有限,如果想訓練出能夠執(zhí)行特定領(lǐng)域的任務,則需要大量的語料支持,同時訓練時間也會更長;

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

        3. 中文亂碼問題:在input為中文的時候,有時候返回結(jié)果會亂碼,懷疑跟切詞有關(guān),由于中文的編碼問題,中文不像英文以空格區(qū)分,所以可能會有一定的亂碼情況產(chǎn)生,調(diào)用open AI 的API也會有這種情況,后面看看社區(qū)是否有相應解決辦法;

        4. 模型選擇問題:由于目前GPT社區(qū)比較活躍,模型的產(chǎn)生和變化也是日新月異,由于時間倉促,目前只調(diào)研了alpaca-lora模型的本地化部署,后面針對實際落地的應用應該也會有更好的更低成本的落地方案,需要持續(xù)跟進社區(qū)的發(fā)展,選擇合適的開源方案。

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

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

        作者:Beyond_luo

        內(nèi)容來源:京東云開發(fā)者社區(qū)

        關(guān)鍵詞:

        免責聲明:市場有風險,選擇需謹慎!此文僅供參考,不作買賣依據(jù)。

        最新推薦