链载Ai

标题: 基于昇腾910B,使用XTuner微调一个InternLM个人小助手丨玩转书生大模型 [打印本页]

作者: 链载Ai    时间: 昨天 12:04
标题: 基于昇腾910B,使用XTuner微调一个InternLM个人小助手丨玩转书生大模型

为了帮助大家更好地理解和应用书生系列大模型,“玩转书生大模型”将推出一系列围绕书生大模型微调、部署、评测和应用的文章。欢迎大家订阅并积极投稿,一起分享经验与成果,推动大模型技术的普及与进步。


本文来自社区用户投稿,作者:「国产化硬件」微调部署兴趣小组 丁一超,将带领大家基于 ModelArts,使用 XTuner 在昇腾 910B 上单卡微调一个 InternLM 个人小助手。


InternLM 开源链接:(文末点击阅读原文可直达)

https://github.com/InternLM/InternLM

XTuner 开源链接:

https://github.com/InternLM/xtuner


▌XTuner 简介

XTuner 是一个高效、灵活、全能的轻量化大模型微调工具库。常用命令如下:
查看帮助
xtunerhelp
查看版本
xtunerversion
列出所有预定义配置文件
xtunerlist-cfg
列出包含指定名称的预定义配置文件
xtunerlist-cfg-p$NAME
xtuner list-cfg 命令用于列出内置的所有配置文件。参数 -p 或 --pattern 表示模式匹配,后面跟着的内容将会在所有的配置文件里进行模糊匹配搜索,然后返回最有可能的内容。
复制配置文件
xtunercopy-cfg$CONFIG$SAVE_PATH
xtuner copy-cfg 命令用于复制一个内置的配置文件。该命令需要两个参数:CONFIG 代表需要复制的配置文件名称,SAVE_PATH 代表复制的目标路径。
执行微调训练
xtunertrain$CONFIG
xtuner train 命令用于启动模型微调进程。该命令需要一个参数:CONFIG 用于指定微调配置文件。
将 pth 格式的模型文件转换成 HuggingFace 格式的模型
xtunerconvertpth_to_hf$CONFIG$PATH_TO_PTH_MODEL$SAVE_PATH_TO_HF_MODEL
xtuner convert pth_to_hf 命令用于进行模型格式转换。该命令需要三个参数:CONFIG 表示微调的配置文件;PATH_TO_PTH_MODEL 表示微调的模型权重文件路径,即要转换的模型权重;SAVE_PATH_TO_HF_MODEL 表示转换后的 HuggingFace 格式文件的保存路径。

▌资源选择


▌安装环境

安装依赖

pipinstalleinopspipinstallacceleratepipinstalldlinfer-ascendpipinstalldeepspeedpipinstallloguru


安装 XTuner

gitclone-bv0.1.23https://github.com/InternLM/xtunergitclone-bv0.1.23https://gitee.com/InternLM/xtuner#github不行的话用这条cdxtuner
安装之前修改一个文件,路径:xtuner/tools/model_converters/merge.py
parser.add_argument('--device',default='npu',choices=('cuda','cpu','auto','npu'),help='Indicatethedevice')#choices里面添加一个'npu',也可以把default直接改成npu
然后安装
pipinstall-e.



▌模型准备

· 创建目录

mkdir-p/home/ma-user/work/work_dir/cd/home/ma-user/work/work_dir/

· 下载模型

使用 Huggingface-cli 方式下载,设置 hf-mirros 环境变量
exportHF_ENDPOINT=https://hf-mirror.com

下载模型
huggingface-clidownload--resume-downloadinternlm/internlm2-chat-1_8b--local-dir/home/ma-user/work/model/internlm2-chat-1_8b


· 微调前的模型对话

cli_demo.py 代码
import torchfrom transformers import AutoTokenizer, AutoModelForCausalLM

model_name_or_path = "/home/ma-user/work/model/internlm2-chat-1_8b"# 模型所在的本地路径
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_code=True, device_map='npu')model = AutoModelForCausalLM.from_pretrained(model_name_or_path, trust_remote_code=True, torch_dtype=torch.bfloat16, device_map='npu')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("\nUser>>> ")input_text = input_text.replace(' ', '')if input_text == "exit":break
length = 0for response, _ in model.stream_chat(tokenizer, input_text, messages):if response is not None:print(response[length:], flush=True, end="")length = len(response)

执行代码
pythoncli_demo.py

运行结果

· 微调

准备数据文件

cd/home/ma-user/work/work_dir/mkdir-pdatastouchdatas/assistant.json

创建一个脚本准备数据(xtuner_generate_assistant.py)

创建准备数据脚本
vimxtuner_generate_assistant.py

脚本内容如下:
import json
# 设置用户的名字name = 'JeffDing同志'# 设置需要重复添加的数据次数n = 8000
# 初始化数据data = [{"conversation": [{"input": "请介绍一下你自己", "output": "我是{}的小助手,内在是上海AI实验室书生·浦语的1.8B大模型哦".format(name)}]},{"conversation": [{"input": "你在实战营做什么", "output": "我在这里帮助{}完成XTuner微调个人小助手的任务".format(name)}]}]
# 通过循环,将初始化的对话数据重复添加到data列表中for i in range(n):data.append(data[0])data.append(data[1])
# 将data列表中的数据写入到'datas/assistant.json'文件中with open('datas/assistant.json', 'w', encoding='utf-8') as f:# 使用json.dump方法将数据以JSON格式写入文件# ensure_ascii=False 确保中文字符正常显示# indent=4 使得文件内容格式化,便于阅读json.dump(data, f, ensure_ascii=False, indent=4)

将对应的 name 进行修改(在第 4 行的位置)
-name='JeffDing同志'+name="你自己的名称"

生成微调数据
pythonxtuner_generate_assistant.py

· 准备配置文件

列出支持的配置文件
xtunerlist-cfg-pinternlm2

· 复制配置文件

xtunercopy-cfginternlm2_chat_1_8b_qlora_alpaca_e3.

· 修改配置文件

主要修改地方如下:
########################################################################PART 1Settings ########################################################################- pretrained_model_name_or_path = 'internlm/internlm2-chat-1_8b'+ pretrained_model_name_or_path = '/home/ma-user/work/model/internlm2-chat-1_8b'
- alpaca_en_path = 'tatsu-lab/alpaca'+ alpaca_en_path = 'datas/assistant.json'
evaluation_inputs = [-'请给我介绍五个上海的景点', 'lease tell me five scenic spots in Shanghai'+'请介绍一下你自己', 'lease introduce yourself']########################################################################PART 3Dataset & Dataloader ########################################################################alpaca_en = dict(type=process_hf_dataset,- dataset=dict(type=load_dataset, path=alpaca_en_path),+ dataset=dict(type=load_dataset, path='json', data_files=dict(train=alpaca_en_path)),tokenizer=tokenizer,max_length=max_length,- dataset_map_fn=alpaca_map_fn,+ dataset_map_fn=None,template_map_fn=dict(type=template_map_fn_factory, template=prompt_template),remove_unused_columns=True,shuffle_before_pack=True,pack_to_max_length=pack_to_max_length,use_varlen_attn=use_varlen_attn)

注意代码块里前面标+、-号的行,分别代表添加和去除。另外在 NPU上微调还需要去掉以下这段:
########################################################################PART 2Model & Tokenizer########################################################################
- quantization_config=dict(-type=BitsAndBytesConfig,-load_in_4bit=True,-load_in_8bit=False,-llm_int8_threshold=6.0,-llm_int8_has_fp16_weight=False,-bnb_4bit_compute_dtype=torch.float16,-bnb_4bit_use_double_quant=True,-bnb_4bit_quant_type='nf4')

需要去掉这一段的原因:使用这段会出现一个情况,量化这个操作好像不支持 NPU,会报错找不到 GPU。

· 启动微调

xtunertrain./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py

微调启动时 NPU 的使用情况,使用 npu-smi info 命令查看

· 模型格式转换

pth_file=`ls-t./work_dirs/internlm2_chat_1_8b_qlora_alpaca_e3_copy/*.pth|head-n1`xtunerconvertpth_to_hf./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py${pth_file}./hf

· 模型合并

xtunerconvertmerge/home/ma-user/work/model/internlm2-chat-1_8b./hf./merged--max-shard-size2GB--devicenpu

· 执行微调后的 demo

修改 cli_demo.py 里面模型路径为 /home/ma-user/work/work_dir/merged
-model_name_or_path="/home/ma-user/work/model/internlm2-chat-1_8b"#模型所在的本地路径+model_name_or_path="/home/ma-user/work/work_dir/merged"#模型所在的本地路径

执行代码
pythoncli_demo.ppy

运行结果

本文主要介绍了如何基于ModelArts,使用 XTuner 在昇腾 910B 上单卡微调一个 InternLM 个人小助手,涵盖环境配置、模型准备、模型微调等流程,希望可以帮助大家快速上手微调和应用书生系列大模型。

ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;font-size: 16px;background-color: rgb(255, 255, 255);text-align: center;">






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5