文章目錄
- 基礎作業
- 完成 Llama 3 Web Demo 部署
- 環境配置
- 下載模型
- Web Demo 部署
- 對話截圖
- 使用 XTuner 完成小助手認知微調
- Web Demo 部署
- 自我認知訓練數據集準備
- 訓練模型
- 推理驗證
- 使用 LMDeploy 成功部署 Llama 3 模型
- 環境,模型準備
- LMDeploy CLI chat
- LMDeploy模型量化(lite)
- 1. 設置最大KV Cache緩存大小
- 2. 使用W4A16量化
- LMDeploy服務(serve)
- 1. 啟動API服務器
- 2. 命令行客戶端連接API服務器
- 3. 網頁客戶端連接API服務器
- 進階作業
- 多模態 Llava 微調和部署
- Llama3 工具調用能力訓練
Github 文檔:https://github.com/SmartFlowAI/Llama3-Tutorial
B站視頻:https://www.bilibili.com/video/BV1Kr421u71u/
基礎作業
完成 Llama 3 Web Demo 部署
環境配置
注意,這里用的是12.1的CUDA版本,在新建開發機時不要選錯了。
conda create -n llama3 python=3.10
conda activate llama3
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia
下載模型
軟鏈接 InternStudio 中的模型
mkdir -p ~/model
cd ~/model
ln -s /root/share/new_models/meta-llama/Meta-Llama-3-8B-Instruct ~/model/Meta-Llama-3-8B-Instruct
Web Demo 部署
cd ~
git clone https://github.com/SmartFlowAI/Llama3-Tutorial
安裝 XTuner 時會自動安裝其他依賴
cd ~
git clone -b v0.1.18 https://github.com/InternLM/XTuner
cd XTuner
pip install -e .
添加端口映射
運行 web_demo.py
streamlit run ~/Llama3-Tutorial/tools/internstudio_web_demo.py \~/model/Meta-Llama-3-8B-Instruct
點擊這里進入網頁。
對話截圖
使用 XTuner 完成小助手認知微調
Web Demo 部署
同作業一
自我認知訓練數據集準備
進入 tools/gdata.py
腳本,修改身份認知
import json# 輸入你的名字
name = '貓貓卷'
# 重復次數
n = 2000data = [{"conversation": [{"system":"你是一個懂中文的小助手","input": "你是(請用中文回答)","output": "您好,我是{},一個由 SmartFlowAI 打造的人工智能助手,請問有什么可以幫助您的嗎?".format(name)}]}
]for i in range(n):data.append(data[0])with open('data/personal_assistant.json', 'w', encoding='utf-8') as f:json.dump(data, f, ensure_ascii=False, indent=4)
cd ~/Llama3-Tutorial
python tools/gdata.py
以上腳本在生成了 ~/Llama3-Tutorial/data/personal_assistant.json 數據文件格式如下所示:
[{"conversation": [{"system": "你是一個懂中文的小助手","input": "你是(請用中文回答)","output": "您好,我是貓貓卷,一個由 SmartFlowAI 打造的人工智能助手,請問有什么可以幫助您的嗎?"}]}
]
訓練模型
cd ~/Llama3-Tutorial# 開始訓練,使用 deepspeed 加速,A100 40G顯存 耗時24分鐘。
# train之后包含了兩個路徑,一個是訓練的config,一個是訓練的工作路徑。工作路徑將保存我們的微調權重。
xtuner train configs/assistant/llama3_8b_instruct_qlora_assistant.py --work-dir /root/llama3_pth# Adapter PTH 轉 HF 格式
xtuner convert pth_to_hf /root/llama3_pth/llama3_8b_instruct_qlora_assistant.py \/root/llama3_pth/iter_500.pth \/root/llama3_hf_adapter# 模型合并
# 由三個路徑組成,分別是原始的llama3權重路徑,剛剛轉換好的huggingface的adapter路徑,以及最后合并完成后的路徑
export MKL_SERVICE_FORCE_INTEL=1
xtuner convert merge /root/model/Meta-Llama-3-8B-Instruct \/root/llama3_hf_adapter\/root/llama3_hf_merged
訓練時的顯存占用情況:
訓練時命令行輸出:
模型權重轉化:
合并模型權重:
最終權重保存在/root/llama3_hf_merged
中
推理驗證
streamlit run ~/Llama3-Tutorial/tools/internstudio_web_demo.py \/root/llama3_hf_merged
使用 LMDeploy 成功部署 Llama 3 模型
環境,模型準備
# 如果你是InternStudio 可以直接使用
# studio-conda -t lmdeploy -o pytorch-2.1.2
# 初始化環境
conda create -n lmdeploy python=3.10
conda activate lmdeploy
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia
安裝lmdeploy最新版。
pip install -U lmdeploy[all]
llama3下載:(在作業一中已經軟鏈接過了)
LMDeploy CLI chat
直接在終端運行
conda activate lmdeploy
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct
運行效果:
LMDeploy模型量化(lite)
對模型進行量化。主要包括 KV8量化和W4A16量化。
1. 設置最大KV Cache緩存大小
模型在運行時,占用的顯存可大致分為三部分:模型參數本身占用的顯存、KV Cache占用的顯存,以及中間運算結果占用的顯存。LMDeploy的KV Cache管理器可以通過設置--cache-max-entry-count
參數,控制KV緩存占用剩余顯存的最大比例。默認的比例為0.8。
下面通過幾個例子,來看一下調整--cache-max-entry-count
參數的效果。首先保持不加該參數(默認0.8),運行 Llama3-8b 模型。
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct/
對話效果:
新建一個終端運行
# 如果你是InternStudio 就使用
# studio-smi
nvidia-smi
在使用chat進行對話時的顯存占用為36240MiB
下面,改變–cache-max-entry-count參數,設為0.5。
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct/ --cache-max-entry-count 0.5
對話效果:
看到顯存占用明顯降低,變為28680MiB。
把–cache-max-entry-count參數設置為0.01,約等于禁止KV Cache占用顯存。
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct/ --cache-max-entry-count 0.01
對話效果:
可以看到,此時顯存占用僅為16400M,代價是會降低模型推理速度。
2. 使用W4A16量化
僅需執行一條命令,就可以完成模型量化工作。
lmdeploy lite auto_awq \/root/model/Meta-Llama-3-8B-Instruct \--calib-dataset 'ptb' \--calib-samples 128 \--calib-seqlen 1024 \--w-bits 4 \--w-group-size 128 \--work-dir /root/model/Meta-Llama-3-8B-Instruct_4bit
運行時間較長,需要耐心等待。量化工作結束后,新的HF模型被保存到Meta-Llama-3-8B-Instruct_4bit目錄。下面使用Chat功能運行W4A16量化后的模型。
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct_4bit --model-format awq
顯存占用為34294MiB。
為了更加明顯體會到W4A16的作用,我們將KV Cache比例再次調為0.01,查看顯存占用情況。(W4A16量化+KV Cache量化)
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct_4bit --model-format awq --cache-max-entry-count 0.01
顯存占用為6738MiB。
LMDeploy服務(serve)
在前面的章節,我們都是在本地直接推理大模型,這種方式成為本地部署。在生產環境下,我們有時會將大模型封裝為 API 接口服務,供客戶端訪問。
1. 啟動API服務器
通過以下命令啟動API服務器,推理Meta-Llama-3-8B-Instruct模型:
lmdeploy serve api_server \/root/model/Meta-Llama-3-8B-Instruct \--model-format hf \--quant-policy 0 \--server-name 0.0.0.0 \--server-port 23333 \--tp 1
其中,model-format、quant-policy這些參數是與第三章中量化推理模型一致的;server-name和server-port表示API服務器的服務IP與服務端口;tp參數表示并行數量(GPU數量)。 通過運行以上指令,我們成功啟動了API服務器,請勿關閉該窗口,后面我們要新建客戶端連接該服務。 也可以直接打開http://{host}:23333查看接口的具體使用說明,如下圖所示。
這代表API接口啟動成功了。
這一步由于Server在遠程服務器上,所以本地需要做一下ssh轉發才能直接訪問。在你本地打開一個cmd窗口,輸入命令如下:
<intern-studio的開發機端口號>```打開`127.0.0.1:23333` 
2. 命令行客戶端連接API服務器
在“1.”中,我們在終端里新開了一個API服務器。 本節中,我們要新建一個命令行客戶端去連接API服務器。首先通過VS Code新建一個終端:
激活conda環境
conda activate lmdeploy
運行命令行客戶端:
lmdeploy serve api_client http://localhost:23333
運行后,可以通過命令行窗口直接與模型對話
3. 網頁客戶端連接API服務器
關閉剛剛的VSCode終端,但服務器端的終端不要關閉。 運行之前確保自己的gradio版本低于4.0.0。
pip install gradio==3.50.2
新建一個VSCode終端,激活conda環境。
conda activate lmdeploy
使用Gradio作為前端,啟動網頁客戶端。
lmdeploy serve gradio http://localhost:23333 \--server-name 0.0.0.0 \--server-port 6006
打開瀏覽器,訪問地址http://127.0.0.1:6006 然后就可以與模型進行對話了!
進階作業
多模態 Llava 微調和部署
沒有100%的A100。。。