【ChatGLM2-6B】小白入門及Docker下部署
- 注意:Docker基于鏡像中網盤上上傳的有已經做好的鏡像,想要便捷使用的可以直接從Docker基于鏡像安裝看
- Docker從0安裝
- 前提
- 下載
- 啟動
- 訪問
- Docker基于鏡像安裝
- 容器打包操作(生成鏡像時使用的命令)
- 安裝時命令
- 微調
- 前提
- 微調和驗證文件準備
- 微調和驗證文件格式轉換
- 修改微調腳本
- 執行微調
- 微調完成
- 結果推理驗證
- 報錯解決
- 出現了$‘\r’: command not found錯誤
- 加載微調模型
- API接口調用
注意:Docker基于鏡像中網盤上上傳的有已經做好的鏡像,想要便捷使用的可以直接從Docker基于鏡像安裝看
Docker從0安裝
前提
- 安裝好了docker
- 安裝好了NVIDIA
- 顯卡16G
下載
-
新建一個文件夾,用來存放下載下來的ChatGLM3代碼和模型
-
右鍵,打開一個git窗口,拉取模型(會很慢,耐心等待)
- 地址: https://modelscope.cn/models/ZhipuAI/chatglm3-6b/summary
git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git
-
右鍵,打開一個git窗口,拉取源代碼
- 地址:https://github.com/THUDM/ChatGLM3
git clone https://github.com/THUDM/ChatGLM3
或
git clone https://ghproxy.com/https://github.com/THUDM/ChatGLM3
- 注意:將下載好的模型(chatglm3-6b-models)和代碼放到一個目錄里面,并上傳到服務器上
啟動
docker run -itd --name chatglm3 -v `pwd`/ChatGLM3:/data \
--gpus=all -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all \
-p 8501:8501 pytorch/pytorch:2.0.1-cuda11.7-cudnn8-devel
# 進入啟動好的容器
docker exec -it chatglm3 bash# 設置pip3下載路徑為國內鏡像
cd /data
pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple
pip3 config set install.trusted-host mirrors.aliyun.com# 安裝基礎依賴
pip3 install -r requirements.txt
修改模型路徑
啟動
streamlit run basic_demo/web_demo2.py
訪問
http://10.22.2.18:8501/
Docker基于鏡像安裝
容器打包操作(生成鏡像時使用的命令)
-
將安裝好、啟動好的容器打包成鏡像
docker commit -m='glm3 commit' -a='zhangzh' chatglm3 chatglm3-6b:1.1
-
將鏡像,打成可以傳到其他地方的tar包
docker save -o chatglm3-6b.tar chatglm3-6b:1.1
安裝時命令
-
網盤地址
? 這里因為網盤上傳文件有大小限制,所以使用了分卷壓縮的方式進行了上傳,全部下載下來就可以。
鏈接:https://pan.baidu.com/s/1wY3QqaWrMyBR39d2ZhN_Kg?pwd=9zdd 提取碼:9zdd
-
將下載好的鏡像文件和代碼模型文件上傳到服務器上,并進行解壓,然后在該目錄進行操作。
-
在其他的docker服務器加載鏡像
docker load -i chatglm3-6b.tar
-
啟動
docker run -itd --name chatglm3 -v `pwd`/ChatGLM3:/data \ --gpus=all -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all \ -p 8501:8501 -p 8000:8000 chatglm3-6b:1.1
-
進入容器
docker exec -it chatglm3 bash
-
啟動
cd /data streamlit run basic_demo/web_demo2.py
-
訪問:http://10.22.2.18:8501/
微調
微調操作直接在docker內進行
docker exec -it chatglm3 bash
前提
運行示例需要 python>=3.9
,除基礎的 torch
依賴外,示例代碼運行還需要依賴
pip install transformers==4.30.2 accelerate sentencepiece astunparse deepspeed
微調和驗證文件準備
微調參數文件為.json文件,先將你的微調數據和驗證數據處理成如下格式:
{"content": "類型#褲*版型#寬松*風格#性感*圖案#線條*褲型#闊腿褲", "summary": "寬松的闊腿褲這兩年真的吸粉不少,明星時尚達人的心頭愛。畢竟好穿時尚,誰都能穿出腿長2米的效果寬松的褲腿,當然是遮肉小能手啊。上身隨性自然不拘束,面料親膚舒適貼身體驗感棒棒噠。系帶部分增加設計看點,還讓單品的設計感更強。腿部線條若隱若現的,性感撩人。顏色敲溫柔的,與褲子本身所呈現的風格有點反差萌。"}
{"content": "類型#裙*風格#簡約*圖案#條紋*圖案#線條*圖案#撞色*裙型#魚尾裙*裙袖長#無袖", "summary": "圓形領口修飾脖頸線條,適合各種臉型,耐看有氣質。無袖設計,尤顯清涼,簡約橫條紋裝飾,使得整身人魚造型更為生動立體。加之撞色的魚尾下擺,深邃富有詩意。收腰包臀,修飾女性身體曲線,結合別出心裁的魚尾裙擺設計,勾勒出自然流暢的身體輪廓,展現了婀娜多姿的迷人姿態。"}
{"content": "類型#上衣*版型#寬松*顏色#粉紅色*圖案#字母*圖案#文字*圖案#線條*衣樣式#衛衣*衣款式#不規則", "summary": "寬松的衛衣版型包裹著整個身材,寬大的衣身與身材形成鮮明的對比描繪出纖瘦的身形。下擺與袖口的不規則剪裁設計,彰顯出時尚前衛的形態。被剪裁過的樣式呈現出布條狀自然地垂墜下來,別具有一番設計感。線條分明的字母樣式有著花式的外觀,棱角分明加上具有少女元氣的棗紅色十分有年輕活力感。粉紅色的衣身把肌膚襯托得很白嫩又健康。"}
{"content": "類型#裙*版型#寬松*材質#雪紡*風格#清新*裙型#a字*裙長#連衣裙", "summary": "踩著輕盈的步伐享受在午后的和煦風中,讓放松與愜意感為你免去一身的壓力與束縛,仿佛要將靈魂也寄托在隨風搖曳的雪紡連衣裙上,吐露出<UNK>微妙而又浪漫的清新之意。寬松的a字版型除了能夠帶來足夠的空間,也能以上窄下寬的方式強化立體層次,攜帶出自然優雅的曼妙體驗。"}
其中content是向模型輸入的內容,summary為模型應該輸出的內容。
其中微調數據是通過本批數據對模型進行調試(文件是train.json),驗證數據是通過這些數據驗證調試的結果(文件是dev.json)。
微調和驗證文件格式轉換
1、在項目代碼的finetune_demo目錄下新建一個AdvertiseGen目錄,并將你的文件上傳上去。
2、然后回到finetune_demo目錄,執行以下腳本進行轉換,轉換后的文件放在formatted_data目錄下。
python ./scripts/format_advertise_gen.py --path "AdvertiseGen/train.json"
修改微調腳本
本方法使用的微調腳本是finetune_demo/scripts/finetune_pt.sh,修改各個參數為自己的環境,其中:
PRE_SEQ_LEN: 模型長度,后續使用微調結果加載時要保持一直
MAX_SOURCE_LEN:模型輸入文本的長度,超過該長度會截取,會影響占用GPU,我這里GPU為16G基本吃滿
MAX_TARGET_LEN:模型輸出文本的最大長度,會影響占用GPU,我這里GPU為16G基本吃滿
BASE_MODEL_PATH:原模型的地址
DATASET_PATH:模型微調參數文件的地址
OUTPUT_DIR:模型微調結果存放的地址
MAX_STEP:調試的步數,主要跟微調需要的時間有關,越小則時間越短,但微調的準確度(影響度)越小
SAVE_INTERVAL:多少步保存一個微調結果
腳本如下:
#! /usr/bin/env bashset -exPRE_SEQ_LEN=128
LR=2e-2
NUM_GPUS=1
MAX_SOURCE_LEN=512
MAX_TARGET_LEN=64
DEV_BATCH_SIZE=1
GRAD_ACCUMULARION_STEPS=32
MAX_STEP=1500
SAVE_INTERVAL=500DATESTR=`date +%Y%m%d-%H%M%S`
RUN_NAME=advertise_gen_ptBASE_MODEL_PATH=/data/chatglm3-6b-models
DATASET_PATH=formatted_data/advertise_gen.jsonl
OUTPUT_DIR=output/${RUN_NAME}-${DATESTR}-${PRE_SEQ_LEN}-${LR}mkdir -p $OUTPUT_DIRtorchrun --standalone --nnodes=1 --nproc_per_node=$NUM_GPUS finetune.py \--train_format input-output \--train_file $DATASET_PATH \--preprocessing_num_workers 1 \--model_name_or_path $BASE_MODEL_PATH \--output_dir $OUTPUT_DIR \--max_source_length $MAX_SOURCE_LEN \--max_target_length $MAX_TARGET_LEN \--per_device_train_batch_size $DEV_BATCH_SIZE \--gradient_accumulation_steps $GRAD_ACCUMULARION_STEPS \--max_steps $MAX_STEP \--logging_steps 1 \--save_steps $SAVE_INTERVAL \--learning_rate $LR \--pre_seq_len $PRE_SEQ_LEN 2>&1 | tee ${OUTPUT_DIR}/train.log
執行微調
先給腳本執行權限
chmod -R 777 ./scripts/finetune_pt.sh
執行腳本
./scripts/finetune_ds.sh # 全量微調
./scripts/finetune_pt.sh # P-Tuning v2 微調
微調完成
結果推理驗證
python inference.py \--pt-checkpoint "/data/finetune_demo/output/advertise_gen_pt-20231123-022517-128-2e-2/checkpoint-1500" \--model /data/chatglm3-6b-models
報錯解決
出現了$‘\r’: command not found錯誤
可能因為該Shell腳本是在Windows系統編寫時,每行結尾是\r\n
而在Linux系統中行每行結尾是\n
在Linux系統中運行腳本時,會認為\r是一個字符,導致運行錯誤
使用dos2unix 轉換一下就可以了
dos2unix <文件名># dos2unix: converting file one-more.sh to Unix format ...
-bash: dos2unix: command not found
就是還沒安裝,安裝一下就可以了
apt install dos2unix
加載微調模型
cd ../composite_demo
MODEL_PATH="/data/chatglm3-6b-models" PT_PATH="/data/finetune_demo/output/advertise_gen_pt-20231123-022517-128-2e-2/checkpoint-1500" streamlit run main.py
重新訪問頁面,即可啦~
API接口調用
-
下載依賴
pip install openai==1.3.0 pip install pydantic==2.5.1
-
進入openai_api_demo目錄
-
修改腳本
-
啟動腳本
python openai_api_wt.py
-
訪問SwaggerUI地址
http://10.22.2.18:8000/docs#/default/list_models_v1_models_get
接口:http://10.22.2.18:8000/v1/chat/completions
參數:
{"model": "chatglm3-6b","messages": [{"role": "user","content": "你好,給我講一個故事,大概100字" # 這里是請求的參數}],"stream": false,"max_tokens": 100,"temperature": 0.8,"top_p": 0.8 }