基于华为昇腾910B,实战InternLM个人小助手认知微调

devtools/2024/11/29 5:21:15/

本文将带领大家基于华为云 ModelArts,使用 XTuner 单卡微调一个 InternLM 个人小助手。

开源链接:(欢迎 star)

https://github.com/InternLM/InternLM

https://github.com/InternLM/xtuner

XTuner 简介

XTuner 是一个高效、灵活、全能的轻量化大模型微调工具库。 常用命令****如下:

查看帮助

xtuner help

查看版本

xtuner version

列出所有预定义配置文件

xtuner list-cfg

列出包含指定名称的预定义配置文件

xtuner list-cfg -p $NAME

xtuner list-cfg 命令用于列出内置的所有配置文件。参数 -p 或 --pattern 表示模式匹配,后面跟着的内容将会在所有的配置文件里进行模糊匹配搜索,然后返回最有可能的内容。

复制配置文件

xtuner copy-cfg $CONFIG $SAVE_PATH

xtuner copy-cfg 命令用于复制一个内置的配置文件。该命令需要两个参数:CONFIG 代表需要复制的配置文件名称,SAVE_PATH 代表复制的目标路径。

执行微调训练

xtuner train $CONFIG

xtuner train 命令用于启动模型微调进程。该命令需要一个参数:CONFIG 用于指定微调配置文件。

将 pth 格式的模型文件转换成 HuggingFace 格式的模型

xtuner convert pth_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 格式文件的保存路径。

华为云资源选择

模块:【华为云】-【控制台】-【AI开发平台ModelArts】-【开发空间】-【Notebook】

镜像:pytorch_2.1.0-cann_8.0.rc1-py_3.9-euler_2.10.7-aarch64-snt9b
在这里插入图片描述

类型:【Ascend】

规格:【Ascend: 1*ascend-snt9b2|ARM: 24核 192GB】

磁盘规格:按需即可

在这里插入图片描述

安装环境

安装依赖

pip install einops
pip install accelerate
pip install dlinfer-ascend
pip install deepspeed
pip install loguru

安装 XTuner

git clone -b v0.1.23 https://github.com/InternLM/xtuner
git clone -b v0.1.23 https://gitee.com/InternLM/xtuner #github 不行的话用这条
cd xtuner

安装之前修改一个文件,路径:xtuner/tools/model_converters/merge.py

parser.add_argument('--device',default='npu',choices=('cuda', 'cpu', 'auto','npu'),help='Indicate the device')  # choices里面添加一个'npu',也可以把default直接改成npu

然后安装

pip install -e .

模型准备

创建目录

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

下载模型

使用 Huggingface-cli 方式下载,设置 hf-mirros 环境变量

export HF_ENDPOINT=https://hf-mirror.com

下载模型

huggingface-cli download --resume-download internlm/internlm2-chat-1_8b --local-dir /home/ma-user/work/model/internlm2-chat-1_8b

微调前的模型对话

cli_demo.py 代码

import torch
from transformers import AutoTokenizer, AutoModelForCausalLMmodel_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":breaklength = 0for response, _ in model.stream_chat(tokenizer, input_text, messages):if response is not None:print(response[length:], flush=True, end="")length = len(response)

执行代码

python cli_demo.py

运行结果

在这里插入图片描述

微调

准备数据文件

cd /home/ma-user/work/work_dir/
mkdir -p datas
touch datas/assistant.json

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

创建准备数据脚本

vim xtuner_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 = "你自己的名称"

生成微调数据

python xtuner_generate_assistant.py

准备配置文件

列出支持的配置文件

xtuner list-cfg -p internlm2

复制配置文件

xtuner copy-cfg internlm2_chat_1_8b_qlora_alpaca_e3 .

修改配置文件

主要修改地方如下:

########################################################################                          PART 1  Settings                           ########################################################################
- 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 = [
-    '请给我介绍五个上海的景点', 'Please tell me five scenic spots in Shanghai'
+    '请介绍一下你自己', 'Please introduce yourself']
########################################################################                      PART 3  Dataset & 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 2  Model & 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。

启动微调

xtuner train ./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 -n 1`
xtuner convert pth_to_hf ./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py ${pth_file} ./hf

模型合并

xtuner convert merge /home/ma-user/work/model/internlm2-chat-1_8b ./hf ./merged --max-shard-size 2GB --device npu

执行微调后的 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"  # 模型所在的本地路径

执行代码

python cli_demo.ppy

运行结果

hard-size 2GB --device npu


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

执行代码

python cli_demo.ppy

运行结果

在这里插入图片描述


http://www.ppmy.cn/devtools/137837.html

相关文章

【数字图像处理+MATLAB】通过迭代全局阈值处理算法(Iterative Global Algorithm)实现图像分割

引言 图像分割是将数字图像划分为多个区域(或像素的集合)的过程,这些区域通常对应于真实世界的物体或图像中的特定部分。图像分割的目标是简化或改变图像的表示形式,使得图像更容易理解和分析。图像分割通常用于定位图像中的物体…

比特币libsecp256k1中safegcd算法形式化验证完成

1. 引言 比特币和其他链(如 Liquid)的安全性取决于 ECDSA 和 Schnorr 签名等数字签名算法的使用。Bitcoin Core 和 Liquid 都使用名为 libsecp256k1 的 C 库来提供这些数字签名算法,该库以其所运行的椭圆曲线命名。这些算法利用一种称为modu…

DataGuard 主要参数配置详解

1. 基本概念 DB_NAME:主备各节点实例使用相同的 db_name。推荐与 service_name 一致。DB_UNIQUE_NAME:主备端数据库的唯一名称,设定后不可再更改。注意,如果主备 db_unique_name 不一样,需要与 LOG_ARCHIVE_CONFIG 配…

ffmpeg.js视频播放(转换)

chrome 临时设置SharedArrayBuffer "C:\Program Files\Google\Chrome\Application\chrome.exe" --enable-featuresSharedArrayBuffer 引用的js及相关文件 ffmpeg.min.js ffmpeg.min.js.map ffmpeg-core.js ffmpeg-core.wasm ffmpeg-core.worker.js 以上几个现…

网络安全期末复习

第1章 网络安全概括 (1)用户模式切换到系统配置模式(enable)。 (2)显示当前位置的设置信息,很方便了解系统设置(show running-config)。 (3)显…

C++ 【异步日志模块和std::cout << 一样使用习惯替代性好】 使用示例,后续加上远程日志

简单 易用 使用示例 CLogSystem::Instance().SetLogLevel( E_LOG_LEVEL::LOG_LEVEL_INFO | E_LOG_LEVEL::LOG_LEVEL_DEBUG | E_LOG_LEVEL::LOG_LEVEL_DUMP );CLogSystem::Instance().SetFileInfo(true, "./log.txt");LogDebug() << 12;LogInfo() << &qu…

一分钟食用前端测试框架Jest

安装 其实食用Jest是很简单的,我们只需要安装Jest即可 npm install --save-dev jestyarn add --dev jestpnpm add --save-dev jest ESmodule 本身来说,Jest是不支持Esmodule的,他支持CommonJS,我们需要Babel改一下 npm i --save-dev babel-jest babel/core babel/preset-env …

【八股文】小米

文章目录 一、vector 和 list 的区别&#xff1f;二、include 双引号和尖括号的区别&#xff1f;三、set 的底层数据结构&#xff1f;四、set 和 multiset 的区别&#xff1f;五、map 和 unordered_map 的区别&#xff1f;六、虚函数和纯虚函数的区别&#xff1f;七、extern C …