你只需要有浏览器就可以完成。
本次微调的大模型是 internlm2_5-7b-chat 开源大语言模型,当然微调其他大模型的过程和原理也有差不多。
这里说明一下,阿里魔塔社区对于新用户提供了几十小时的免费GPU资源进行使用,正好可以来薅一波羊毛,学习一下大模型的微调。
话不多说,直接开始。
1. 账号和环境准备
首先你需要注册和登录魔搭的账号:https://modelscope.cn/home
注册完成后,登录这个模型网址:
书生·浦语2.5-7B-对话 · 模型库 (modelscope.cn)
然后按照下面的箭头操作。
选择完方式二:GPU环境后,点击“启动”。
启动大概需要2分钟,等GPU环境启动好以后点击"查看NoteBook"进入。
魔塔社区内置了JupyterLab的功能,你进入之后,可以找到 Notebook 标签,新建一个Notebook(当然你在terminal 里执行也没问题)。
如下箭头所示,点击即可创建一个新的 Notebook 页面。
增添一个代码块,并且执行以下命令(点击左侧的运行按钮运行该代码块,下同,这一步是安装依赖库)。
!pip3 install --upgrade pip
!pip3 install bitsandbytes>=0.39.0
拉取 XTuner,过程大约需要几分钟
!git clone https://github.com/InternLM/xtuner.git
接下来需要去 Launcher > Terminal 执行(按照图片剪头指示操作)。
安装依赖的软件,这步需要的时间比较长。
# 下面两行命令在刚启动的Terminal中执行
cd xtuner
pip3 install -e '.[deepspeed]'
等以上所有步骤完成后,再进行下面的操作。
2. 下载模型
internlm2_5-7b-chat 开源大语言模型的权重可以在HuggingFace和ModelScope上找到,这里我选择从ModelScope上下载。
internlm2_5-7b-chat 开源大语言模型大小大约16G,下载大约需要15分钟(取决于网速)。
接下来,你通过下面的命令就可以在 notebook 里执行下载(在 terminal也一样,如果需要在terminal执行需要去掉前面的!)。
!git clone https://www.modelscope.cn/Shanghai_AI_Laboratory/internlm2_5-7b-chat.git
这一步,耐心等待下载完成即可。
3. 下载数据集
我们可以选择从 Github 下载所需要的微调数据集。
!git clone https://github.com/SmartFlowAI/EmoLLM.git
训练用到的数据集是EmoLLM/datasets下提供的multi_turn_dataset_2.json
4. 微调
创建微调训练相关的配置文件在左侧的文件列表,xtuner 的文件夹里,打开xtuner/configs/internlm/internlm2_5_chat_7b下提供的internlm2_5_chat_7b_qlora_oasst1_e3.py,复制一份至根目录。
internlm2_5_chat_7b/internlm2_5_chat_7b_qlora_oasst1_e3.py
此时,文件夹里的路径应该是这样的
|-- xtuner
|-- internlm2_5-7b-chat
|-- internlm2_5_chat_7b_qlora_oasst1_e3.py
|-- EmoLLM
|-- datasets
|-- multi_turn_dataset_2.json
打开这个文件,然后修改预训练模型地址,数据文件地址等。
# PART 1中
#预训练模型存放的位置
pretrained_model_name_or_path = './internlm2_5-7b-chat'
#微调数据存放的位置
data_path='./EmoLLM/datasets/multi_turn_dataset_2.json'
# 训练中最大的文本长度
max_length = 512
# 每一批训练样本的大小
batch_size = 2
#最大训练轮数
max_epochs = 3
# 验证的频率
evaluation_freq = 90
# 用于评估输出内容的问题(用于评估的问题尽量与数据集的question保持一致)
SYSTEM = "你由EmoLLM团队打造的中文领域心理健康助手, 是一个研究过无数具有心理健康问题的病人与心理健康医生对话的心理专家, 在心理方面拥有广博的知识储备和丰富的研究咨询经验,你旨在通过专业心理咨询, 协助来访者完成心理诊断。请充分利用专业心理学知识与咨询技术, 一步步帮助来访者解决心理问题, 接下来你将只使用中文来回答和咨询问题。"
evaluation_inputs = [
'请介绍你自己', # self cognition
'你好',
'我今天心情不好,感觉不开心,很烦。',
'我最近总是感到很焦虑,尤其是在学业上。我有个特别崇拜的同学,他好像在各方面都比我优秀,我总觉得自己怎么努力也追不上他,这让我压力特别大。',
]
# PART 3中
dataset=dict(type=load_dataset, path='json', data_files=dict(train=data path))
dataset_map_fn=None
从上面的配置文件中可以看到,本次微调的数据集是 multi_turn_dataset_2.json。
那这个文件里面写着什么呢?
你可以打开这个文件看一下:EmoLLM/datasets/multi_turn_dataset_2.json at main · SmartFlowAI/EmoLLM (github.com)。
在当前目录下,输入以下命令启动微调脚本
xtuner train internlm2_5_chat_7b_qlora_oasst1_e3.py
训练截图如下
运行过程大概需要2小时。
跑完之后的训练路径长这样
|-- internlm2_5-7b-chat
|-- internlm2_5_chat_7b_qlora_oasst1_e3.py
|-- EmoLLM
|-- xtuner
`-- work_dirs
`-- internlm2_5_chat_7b_qlora_oasst1_e3
|-- 20240804_170059
| |-- 20240804_170059.log
| `-- vis_data
| |-- 20240804_170059.json
| |-- config.py
| `-- scalars.json
|-- iter_1000.pth
|-- iter_1050.pth
`-- last_checkpoint
5. 模型转换
训练后的pth格式参数转Hugging Face格式
xtuner convert pth_to_hf $CONFIG_NAME_OR_PATH $PTH $SAVE_PATH
例如:
xtuner convert pth_to_hf ./internlm2_5_chat_7b_qlora_oasst1_e3.py ./work_dirs/internlm_chat_7b_qlora_oasst1_e3/iter_1050.pth ./hf
将base模型与LORA模型合并
xtuner convert merge $NAME_OR_PATH_TO_LLM $NAME_OR_PATH_TO_ADAPTER $SAVE_PATH --max-shard-size 2GB
例如:
xtuner convert merge ./internlm2_5-7b-chat ./hf ./merged --max-shard-size 2GB
合并后与原来的internlm的完全一样
6. 与合并后的模型对话
# 加载 Adapter 模型对话(Float 16)
xtuner chat ./merged --prompt-template internlm_chat
效果:
7. 创建demo
创建文件demo.py
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
model_name_or_path = "merged" # 这里请修改
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_name_or_path, trust_remote_code=True, torch_dtype=torch.bfloat16, device_map='auto')
model = model.eval()
system_prompt = """You are an AI assistant whose name is InternLM (书生·浦语).
- InternLM (书生·浦语) is a conversational language model that is developed by Shanghai AI Laboratory (上海人工智能实验室). It is designed to be helpful, honest, and harmless.
- InternLM (书生·浦语) can understand and communicate fluently in the language chosen by the user such as English and 中文.
"""
messages = [(system_prompt, '')]
print("=============Welcome to InternLM chatbot, type 'exit' to exit.=============")
while True:
input_text = input("User >>> ")
input_text.replace(' ', '')
if input_text == "exit":
break
response, history = model.chat(tokenizer, input_text, history=messages)
messages.append((input_text, response))
print(f"robot >>> {response}")
运行demo.py
python demo.py
结果展示: