本方案使用阿里云DSW對Llama-2-7B-Chat模型進行全參數微調。DSW是一款交互式建模平臺,適合需要定制化微調模型并追求優化效果的開發者。
準備環境和資源
創建工作空間,詳情請參見創建工作空間。
創建DSW實例,其中關鍵參數配置如下。具體操作,請參見創建DSW實例。
資源規格:推薦使用GU100。本方案選擇:ecs.gn7e-c16g1.4xlarge。
鏡像:建議使用Python3.9及以上版本。本方案在官方鏡像中選擇
pytorch-develop:1.12-gpu-py39-cu113-ubuntu20.04
。
步驟一:準備Llama-2-7B-Chat模型
進入DSW開發環境。
登錄PAI控制臺。
在頁面左上方,選擇DSW實例所在的地域。
在左側導航欄單擊工作空間列表,在工作空間列表頁面中單擊默認工作空間名稱,進入對應工作空間內。
在左側導航欄,選擇模型開發與訓練>交互式建模(DSW)。
單擊需要打開的實例操作列下的打開,進入DSW實例開發環境。
在Launcher頁面中,單擊快速開始區域Notebook下的Python3。
在Notebook中執行以下代碼下載模型文件。代碼會自動選擇適當的下載地址,并將模型文件下載至當前目錄。
說明如果您所在的地域不在url_link指定的可用地域范圍內,您可以選擇與您最近的可用地域鏈接進行下載。不同的地域之間不共享內網,因此您需要將鏈接中的-internal刪除。同一個地域內的數據下載速度更快,雖然不同地域之間的數據也是可以下載的,但下載速度會相對較慢。
import os dsw_region = os.environ.get("dsw_region") url_link = { "cn-shanghai": "https://atp-modelzoo-sh.oss-cn-shanghai-internal.aliyuncs.com/release/tutorials/llama2/llama2-7b.tar.gz", "cn-hangzhou": "https://atp-modelzoo.oss-cn-hangzhou-internal.aliyuncs.com/release/tutorials/llama2/llama2-7b.tar.gz", "cn-shenzhen": "https://atp-modelzoo-sz.oss-cn-shenzhen-internal.aliyuncs.com/release/tutorials/llama2/llama2-7b.tar.gz", "cn-beijing": "https://atp-modelzoo-bj.oss-cn-beijing-internal.aliyuncs.com/release/tutorials/llama2/llama2-7b.tar.gz", } path = url_link[dsw_region] os.environ['LINK_CHAT'] = path !wget $LINK_CHAT !tar -zxvf llama2-7b.tar.gz
系統輸出結果示例如下。
--2024-06-17 15:45:05-- https://atp-modelzoo-bj.oss-cn-beijing-internal.aliyuncs.com/release/tutorials/llama2/llama2-7b.tar.gz Resolving atp-modelzoo-bj.oss-cn-beijing-internal.aliyuncs.com (atp-modelzoo-bj.oss-cn-beijing-internal.aliyuncs.com)... 100.118.58.7, 100.118.58.8, 100.118.58.9, ... Connecting to atp-modelzoo-bj.oss-cn-beijing-internal.aliyuncs.com (atp-modelzoo-bj.oss-cn-beijing-internal.aliyuncs.com)|100.118.58.7|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 12621474981 (12G) [application/gzip] Saving to: ‘llama2-7b.tar.gz’ llama2-7b.tar.gz 100%[===================>] 11.75G 103MB/s in 1m 54s 2024-06-17 15:47:00 (105 MB/s) - ‘llama2-7b.tar.gz’ saved [12621474981/12621474981] llama2-7b/ llama2-7b/generation_config.json llama2-7b/gitattributes.txt llama2-7b/config.json llama2-7b/pytorch_model.bin.index.json llama2-7b/USE_POLICY.md llama2-7b/README.md llama2-7b/LICENSE.txt llama2-7b/pytorch_model-00003-of-00003.bin llama2-7b/special_tokens_map.json llama2-7b/Responsible-Use-Guide.pdf llama2-7b/tokenizer.model llama2-7b/pytorch_model-00001-of-00003.bin llama2-7b/tokenizer_config.json llama2-7b/pytorch_model-00002-of-00003.bin llama2-7b/tokenizer.json llama2-7b/added_tokens.json
此外,您也可以在ModelScope下載Llama-2-7B-Chat模型文件,然后將其上傳到DSW開發環境中。具體操作,請參見上傳與下載數據文件。
步驟二:下載和安裝環境
在DSW的Notebook中執行以下命令,即可下載并安裝微調Llama-2-7B-Chat模型所需的環境。
! wget https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/llama2/ColossalAI.tar.gz
! tar -zxvf ColossalAI.tar.gz
! pip install ColossalAI/.
! pip install ColossalAI/applications/Chat/.
! pip install transformers==4.30.0
! pip install gradio==3.11
其中:
ColossalAI是大規模并行AI訓練系統。在本方案中,DSW使用該框架進行模型微調。
transformers是基于transformers模型結構的預訓練語言庫。
gradio是一個快速構建機器學習Web展示頁面的開源庫。
步驟三:下載訓練數據
在DSW的Notebook中執行以下命令下載模型訓練所需的數據。在本方案中,PAI提供的是一份創意生成數據,包括發言稿生成等內容。您也可以參考該數據格式自行準備訓練數據。
! wget https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/llama2/llama_data.json
! wget https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/llama2/llama_test.json
步驟四:微調模型
在DSW的Notebook中執行以下命令進行模型微調訓練。命令執行成功后,系統將會把訓練得到的模型文件輸出到當前目錄下的sft_llama2-7b
子目錄中。
! sh ColossalAI/applications/Chat/examples/train_sft.sh
命令執行成功后,系統輸出結果示例如下:
[08/01/23 16:00:27] INFO colossalai - colossalai - INFO:
/home/pai/lib/python3.9/site-packages/colossalai/co
ntext/parallel_context.py:522 set_device
INFO colossalai - colossalai - INFO: process rank 0 is
bound to device 0
dsw-76037-687bb6c4c-plp2k:625:625 [0] NCCL INFO Bootstrap : Using eth0:10.224.160.21<0>
dsw-76037-687bb6c4c-plp2k:625:625 [0] NCCL INFO NET/Plugin : No plugin found (libnccl-net.so), using internal implementation
......
steps: 95%|██████████████████████████████▍ | 1178/1240 [11:41<00:36, 1.69it/s][08/01/23 16:14:25] INFO colossalai - colossalai - INFO:
/home/pai/lib/python3.9/site-packages/coati/trainer
/sft.py:98 _eval
INFO colossalai - colossalai - INFO: Eval Epoch 18/20
loss 0.4501953125
steps: 100%|████████████████████████████████| 1240/1240 [12:18<00:00, 1.72it/s][08/01/23 16:15:02] INFO colossalai - colossalai - INFO:
/home/pai/lib/python3.9/site-packages/coati/trainer
/sft.py:98 _eval
INFO colossalai - colossalai - INFO: Eval Epoch 19/20
loss 0.4501953125
steps: 100%|████████████████████████████████| 1240/1240 [13:30<00:00, 1.53it/s]
步驟五:離線推理模型
模型訓練完成后,您可以在DSW的Notebook中執行以下命令啟動WebUI應用。在WebUI頁面試玩模型,并根據返回結果來評估模型推理效果。
import gradio as gr
import requests
import json
from transformers import AutoTokenizer, AutoModelForCausalLM
# 模型地址替換為自己訓練好的模型地址。
tokenizer = AutoTokenizer.from_pretrained("/mnt/workspace/sft_llama2-7b", trust_remote_code=True)
# 模型地址替換為自己訓練好的模型地址。
model = AutoModelForCausalLM.from_pretrained("/mnt/workspace/sft_llama2-7b", trust_remote_code=True).eval().half().cuda()
def inference(text):
from transformers import pipeline
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device='cuda:0', max_new_tokens=50)
res = pipe(text)
parts = res[0]['generated_text'].split('<|endoftext|>', 1)
return parts[0][len(text):]
demo = gr.Blocks()
with demo:
input_prompt = gr.Textbox(label="請輸入問題", value="That game hurt.The emotion expressed in the above sentence is anger or not, answer yes or no.", lines=6)
generated_txt = gr.Textbox(lines=6)
b1 = gr.Button("發送")
b1.click(inference, inputs=[input_prompt], outputs=generated_txt)
demo.launch(enable_queue=True, share=False)
其中:tokenizer和model中的路徑需要替換為步驟四中訓練獲得的模型路徑。
系統返回結果示例如下:
如果在回顯結果中出現錯誤
ImportError: cannot import name 'TypeAliasType' from 'typing_extensions'
,您可以嘗試執行以下命令并重啟Notebook,然后重新執行上述命令即可。pip install --upgrade typing_extensions
如果在回顯結果中出現
TypeError: __init__() got an unexpected keyword argument 'socket_options'
,您可以嘗試執行以下命令并重啟Notebook,然后重新執行上述命令即可。pip install --upgrade httpx httpcore
Loading widget...
Running on local URL: http://127.0.0.1:7860
To create a public link, set `share=True` in `launch()`.
由于http://127.0.0.1:7860
為內網訪問地址,僅支持在當前的DSW實例內部通過單擊鏈接來訪問WebUI頁面,不支持通過外部瀏覽器直接訪問。
在返回結果中,單擊local URL后面的鏈接可以打開WebUI頁面。在WebUI頁面進行離線推理的效果示例如下:
步驟六:部署模型服務
您可以參照以下操作步驟將上述訓練獲得的模型部署至EAS。
將步驟四中訓練獲得的模型文件上傳至OSS Bucket存儲目錄中。
在DSW中安裝ossutil并完成配置,詳情請參見安裝ossutil。
在DSW的Terminal中,在
sft_llama2-7b
目錄同級的目錄中執行以下命令,將模型文件上傳到OSS Bucket存儲空間。更多詳細內容,請參見命令行工具ossutil命令參考。ossutil64 cp -r sft_llama2-7b/ oss://examplebucket/exampledirectory/
登錄PAI控制臺,在頁面上方選擇目標地域,并在右側選擇目標工作空間,然后單擊進入EAS。
單擊部署服務,然后在自定義模型部署區域,單擊自定義部署。
在自定義部署頁面,配置以下關鍵參數。
參數
描述
服務名稱
自定義服務名稱。本案例使用的示例值為:chatllm_llama2_7b。
部署方式
選擇鏡像部署,并選中開啟Web應用。
鏡像配置
在官方鏡像列表中選擇chat-llm-webui>chat-llm-webui:3.0。
說明由于版本迭代迅速,部署時鏡像版本選擇最高版本即可。
模型配置
選擇OSS類型的掛載方式,并配置以下參數:
OSS:配置為模型文件所在的OSS存儲路徑。
掛載路徑:配置為
/llama2-finetune
。
運行命令
服務運行命令配置如下,本方案選擇使用自定義模型配置。
使用自定義模型配置為:
python webui/webui_server.py --port=8000 --model-path=/llama2-finetune
如果使用7B的模型進行部署:
python webui/webui_server.py --port=8000 --model-path=meta-llama/Llama-2-7b-chat-hf
如果使用13B的模型進行部署:
python webui/webui_server.py --port=8000 --model-path=meta-llama/Llama-2-13b-chat-hf --precision=fp16
端口號
8000
資源類型
選擇公共資源。
部署資源
本方案選擇GPU類型,資源規格推薦使用ecs.gn6e-c12g1.3xlarge。
13B的模型務必使用gn6e及更高規格的機型。
7B的模型可以使用A10或GU30機型。
額外系統盤
配置為50 GB。
單擊部署,大約等待5分鐘后即可完成模型部署。
步驟七:啟動WebUI進行模型推理
單擊目標服務的服務方式列下的查看Web應用。
在WebUI頁面進行模型推理驗證。
在輸入文本框中輸入請求內容,例如:
請以軟件工程師的身份,寫一篇入職的發言稿。
,單擊Send,即可輸出結果。