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伺服器具有4塊獨立的GPU,型號是P40,單一P40算力相當於60個同等主頻CPU的算力。
如果只是測試覺得實體卡太貴了,也可以使用「平替版」-GPU雲端伺服器。相較於實體卡,用GPU雲端伺服器搭建不僅能保障彈性的高效能運算,還有這些好處──
京東雲端的GPU雲端主機最近在做618活動,非常划算
//m.sbmmt.com/link/5d3145e1226fd39ee3b3039bfa90c95d
拿到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。安裝指令: sh Anaconda3-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/9897eee1100b166a61f91b68528cb692288886d 0.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 -fbbf6de8f7/pip-18.1.tar。
conda create -n alpaca pythnotallow=3.9conda activate alpaca
https://github.com/tloen/alpaca-lora ,整個模型都是開源的,真好!先把模型檔下載到本地,執行git clone https://github.com/tloen/alpaca-lora.git .。
pip install -r requirements.txt
https://github.com/LC1332/Chinese-alpaca-lora/ blob/main/data/trans_chinese_alpaca_data.json?raw=true ,將後面模型訓練用到的語料庫下載到alpaca-lora根目錄下(後面方便使用)。
好的,到现在为止,万里长征已经走完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語言模型】實務篇詳見://m.sbmmt.com/link/f044bd02e4fe1aa3315ace7645f8597a
#作者:京東零售駱永健
內容來源:京東雲端開發者社群
以上是GPT大語言模式Alpaca-lora在地化部署實踐的詳細內容。更多資訊請關注PHP中文網其他相關文章!