要解決的問題:
如何讓模型知道自己做什么,是什么樣身份。是誰創建了他!!!
概述
目標:通過微調,幫助模型認清了解對自己身份弟位
方式:使用XTuner進行微調
微調前(回答比較官方)
微調后(對自己的身份有了清晰的認知)
實操
# 創建自己的環境
conda create --name personal_assistant python=3.10 -y# 激活環境
conda activate personal_assistant
# 進入家目錄 (~的意思是 “當前用戶的home路徑”)
cd ~
# 創建版本文件夾并進入,以跟隨本教程
# personal_assistant用于存放本教程所使用的東西
mkdir /root/personal_assistant && cd /root/personal_assistant
mkdir /root/personal_assistant/xtuner019 && cd /root/personal_assistant/xtuner019# 拉取 0.1.9 的版本源碼
git clone -b v0.1.9 https://github.com/InternLM/xtuner
# 無法訪問github的用戶請從 gitee 拉取:
# git clone -b v0.1.9 https://gitee.com/Internlm/xtuner# 進入源碼目錄
cd xtuner# 從源碼安裝 XTuner
pip install -e '.[all]'
數據準備
創建data文件夾用于存放用于訓練的數據集
mkdir -p /root/personal_assistant/data && cd /root/personal_assistant/data
在data目錄下創建一個json文件personal_assistant.json
作為本次微調所使用的數據集。json中內容可參考下方(復制粘貼n次做數據增廣,數據量小無法有效微調,下面僅用于展示格式,下面也有生成腳本)
其中conversation
表示一次對話的內容,input
為輸入,即用戶會問的問題,output
為輸出,即想要模型回答的答案
[{"conversation": [{"input": "請介紹一下你自己","output": "我是kaai的小助手,內在是上海AI實驗室書生·浦語的7B大模型哦"}]},{"conversation": [{"input": "請做一下自我介紹","output": "我是kaai的小助手,內在是上海AI實驗室書生·浦語的7B大模型哦"}]}
]
以下是一個python腳本,用于生成數據集。在data目錄下新建一個generate_data.py文件,將以下代碼復制進去,然后運行該腳本即可生成數據集。
import json# 輸入你的名字
name = 'kaai'
# 重復次數
n = 10000# 創建初始問答數據
qa_data = [{"conversation": [{"input": "請介紹一下你自己","output": f"我是{name}的小助手,內在是上海AI實驗室書生·浦語的7B大模型哦"}]},{"conversation": [{"input": "請做一下自我介紹","output": f"我是{name}的小助手,內在是上海AI實驗室書生·浦語的7B大模型哦"}]}
]# 將生成的問答數據保存到JSON文件中
file_path = './qa_data_repeated.json'with open(file_path, 'w', encoding='utf-8') as file:# 使用json.dump直接寫入文件,而不是先創建一個大的字符串json.dump(qa_data * n, file, ensure_ascii=False, indent=4)
下載模型InternLM-chat-7B、
Hugging Face
使用 Hugging Face 官方提供的 huggingface-cli 命令行工具。安裝依賴:
pip install -U huggingface_hub
然后新建 python 文件,填入以下代碼,運行即可。
- resume-download:斷點續下
- local-dir:本地存儲路徑。(linux 環境下需要填寫絕對路徑)
import os# 下載模型
os.system('huggingface-cli download --resume-download internlm/internlm-chat-7b --local-dir your_path')
XTuner 提供多個開箱即用的配置文件,用戶可以通過下列命令查看:
# 列出所有內置配置
xtuner list-cfg
#創建用于存放配置的文件夾config并進入
mkdir /root/personal_assistant/config && cd /root/personal_assistant/config
拷貝一個配置文件到當前目錄:xtuner copy-cfg ${CONFIG_NAME} ${SAVE_PATH}
在本例中:(注意最后有個英文句號,代表復制到當前路徑)
xtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .
修改拷貝后的文件internlm_chat_7b_qlora_oasst1_e3_copy.py
,修改下述位置: (這是一份修改好的文件internlm_chat_7b_qlora_oasst1_e3_copy.py
)
主要改模型的位置同時一些超參數
具體的內容
# PART 1 中
# 預訓練模型存放的位置
pretrained_model_name_or_path = '/root/personal_assistant/model/Shanghai_AI_Laboratory/internlm-chat-7b'# 微調數據存放的位置
data_path = '/root/personal_assistant/data/personal_assistant.json'# 訓練中最大的文本長度
max_length = 512# 每一批訓練樣本的大小
batch_size = 2# 最大訓練輪數
max_epochs = 3# 驗證的頻率
evaluation_freq = 90# 用于評估輸出內容的問題(用于評估的問題盡量與數據集的question保持一致)
evaluation_inputs = [ '請介紹一下你自己', '請做一下自我介紹' ]# PART 3 中
dataset=dict(type=load_dataset, path='json', data_files=dict(train=data_path))
dataset_map_fn=None
微調啟動
xtuner train /root/personal_assistant/config/internlm_chat_7b_qlora_oasst1_e3_copy.py
微調后參數轉換/合并
# 創建用于存放Hugging Face格式參數的hf文件夾
mkdir /root/personal_assistant/config/work_dirs/hfexport MKL_SERVICE_FORCE_INTEL=1# 配置文件存放的位置
export CONFIG_NAME_OR_PATH=/root/personal_assistant/config/internlm_chat_7b_qlora_oasst1_e3_copy.py# 模型訓練后得到的pth格式參數存放的位置
export PTH=/root/personal_assistant/config/work_dirs/internlm_chat_7b_qlora_oasst1_e3_copy/epoch_3.pth# pth文件轉換為Hugging Face格式后參數存放的位置
export SAVE_PATH=/root/personal_assistant/config/work_dirs/hf# 執行參數轉換
xtuner convert pth_to_hf $CONFIG_NAME_OR_PATH $PTH $SAVE_PATH
Merge模型參數
export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER='GNU'# 原始模型參數存放的位置
export NAME_OR_PATH_TO_LLM=/root/personal_assistant/model/Shanghai_AI_Laboratory/internlm-chat-7b# Hugging Face格式參數存放的位置
export NAME_OR_PATH_TO_ADAPTER=/root/personal_assistant/config/work_dirs/hf# 最終Merge后的參數存放的位置
mkdir /root/personal_assistant/config/work_dirs/hf_merge
export SAVE_PATH=/root/personal_assistant/config/work_dirs/hf_merge# 執行參數Merge
xtuner convert merge \$NAME_OR_PATH_TO_LLM \$NAME_OR_PATH_TO_ADAPTER \$SAVE_PATH \--max-shard-size 2GB
網頁DEMO
安裝網頁Demo所需依賴
pip install streamlit==1.24.0
下載demo代碼
# 創建code文件夾用于存放InternLM項目代碼
mkdir /root/personal_assistant/code && cd /root/personal_assistant/code
git clone https://github.com/InternLM/InternLM.git
修改代碼
/mnt/xtuner/xtuner019/personal_assistant/code/InternLM/chat/web_demo.py
@st.cache_resource
def load_model():model = (AutoModelForCausalLM.from_pretrained('/mnt/xtuner/xtuner019/personal_assistant/merge',trust_remote_code=True).to(torch.bfloat16).cuda())tokenizer = AutoTokenizer.from_pretrained('/mnt/xtuner/xtuner019/personal_assistant/merge',trust_remote_code=True)return model, tokenizer
運行
streamlit run web_demo.py --server.address 127.0.0.1 --server.port 6006
效果
微調前
微調后(對自己的身份有了清晰的認知)
你的路徑應該如下
├── code
│ └── InternLM
│ ├── agent
│ │ ├── lagent.md
│ │ ├── lagent_zh-CN.md
│ │ ├── pal_inference.md
│ │ ├── pal_inference.py
│ │ ├── pal_inference_zh-CN.md
│ │ ├── README.md
│ │ └── README_zh-CN.md
│ ├── assets
│ │ ├── compass_support.svg
│ │ ├── license.svg
│ │ ├── logo.svg
│ │ ├── modelscope_logo.png
│ │ ├── robot.png
│ │ └── user.png
│ ├── chat
│ │ ├── chat_format.md
│ │ ├── chat_format_zh-CN.md
│ │ ├── lmdeploy.md
│ │ ├── lmdeploy_zh_cn.md
│ │ ├── openaoe.md
│ │ ├── openaoe_zh_cn.md
│ │ ├── react_web_demo.py
│ │ ├── README.md
│ │ ├── README_zh-CN.md
│ │ └── web_demo.py
│ ├── finetune
│ │ ├── README.md
│ │ └── README_zh-CN.md
│ ├── LICENSE
│ ├── model_cards
│ │ ├── internlm_20b.md
│ │ ├── internlm2_1.8b.md
│ │ ├── internlm2_20b.md
│ │ ├── internlm2_7b.md
│ │ └── internlm_7b.md
│ ├── README.md
│ ├── README_zh-CN.md
│ ├── requirements.txt
│ ├── sonar-project.properties
│ ├── tests
│ │ └── test_hf_model.py
│ └── tools
│ ├── convert2llama.py
│ └── README.md
├── config
│ ├── internlm_chat_7b_qlora_oasst1_e3_copy.py
│ └── work_dirs
│ └── internlm_chat_7b_qlora_oasst1_e3_copy
│ ├── 20240223_160926
│ │ ├── 20240223_160926.log
│ │ └── vis_data
│ │ └── config.py
│ ├── 20240223_161009
│ │ ├── 20240223_161009.log
│ │ └── vis_data
│ │ └── config.py
│ ├── 20240223_161051
│ │ ├── 20240223_161051.log
│ │ └── vis_data
│ │ ├── 20240223_161051.json
│ │ ├── config.py
│ │ └── scalars.json
│ ├── epoch_1.pth
│ ├── epoch_2.pth
│ ├── epoch_3.pth
│ ├── internlm_chat_7b_qlora_oasst1_e3_copy.py
│ └── last_checkpoint
├── data
│ ├── data.py
│ ├── data_QA.py
│ └── personal_assistant.json
├── hf
│ ├── adapter_config.json
│ ├── adapter_model.safetensors
│ ├── README.md
│ └── xtuner_config.py
├── internlm-chat-7b
│ ├── config.json
│ ├── configuration_internlm.py
│ ├── configuration.json
│ ├── generation_config.json
│ ├── modeling_internlm.py
│ ├── pytorch_model-00001-of-00008.bin
│ ├── pytorch_model-00002-of-00008.bin
│ ├── pytorch_model-00003-of-00008.bin
│ ├── pytorch_model-00004-of-00008.bin
│ ├── pytorch_model-00005-of-00008.bin
│ ├── pytorch_model-00006-of-00008.bin
│ ├── pytorch_model-00007-of-00008.bin
│ ├── pytorch_model-00008-of-00008.bin
│ ├── pytorch_model.bin.index.json
│ ├── README.md
│ ├── special_tokens_map.json
│ ├── tokenization_internlm.py
│ ├── tokenizer_config.json
│ └── tokenizer.model
└── merge├── added_tokens.json├── config.json├── configuration_internlm.py├── generation_config.json├── modeling_internlm.py├── pytorch_model-00001-of-00008.bin├── pytorch_model-00002-of-00008.bin├── pytorch_model-00003-of-00008.bin├── pytorch_model-00004-of-00008.bin├── pytorch_model-00005-of-00008.bin├── pytorch_model-00006-of-00008.bin├── pytorch_model-00007-of-00008.bin├── pytorch_model-00008-of-00008.bin├── pytorch_model.bin.index.json├── special_tokens_map.json├── tokenization_internlm.py├── tokenizer_config.json└── tokenizer.model
github鏈接
操作指南