论文分类打榜赛Baseline(2):InternLM昇腾硬件微调实践

本文来自社区投稿,作者丁一超

书生大模型实战营第5期已正式启动,本期实战营新增「论文分类打榜赛」,以帮助学员更好地掌握大模型技能。

本文将手把手带领大家如何基于昇腾微调 InternLM 模型,轻松上手论文自动分类任务。从环境配置、数据准备,到 模型微调和推理部署,完整教程不藏私。即使你是模型微调新手,也能快速参与打榜实践!

InternLM开源链接:

https://github.com/InternLM/InternLM

在线体验链接:

https://chat.intern-ai.org.cn/

1.环境配置

创建云脑任务

登录OpenI平台并创建云脑任务(https://openi.pcl.ac.cn/)。

  • 计算资源:昇腾NPU
  • 资源规格:按下图圈红处选择
  • 镜像:openmind_cann8
  • 选择模型:internlm2_5-7b-chat(找到【选择模型】-【公开模型】,搜索框内输入【internlm2_5】,在出来的列表里选择【internlm2_5-7b-chat】)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

全部选择完成后点【新建任务】即可完成云脑任务创建。因为需要拉取模型文件,所以这一步的时间会有点长,第一次加载整个过程有可能会需要 1-2 小时,后续再加载就快了。耐心等到任务状态由【Waiting】变为【Running】即可,期间可以先学习其他内容。

当任务状态变为【Runing】后,点【调试】就可以开始体验操作了。

在这里插入图片描述
在这里插入图片描述

Tips:启智社区的调试任务单次运行只能 4 小时,另外除了 /home/ma-user/work 目录下的文件在环境结束后都会恢复。

创建 Conda 环境

conda create -n internlm  python=3.10 -y
conda activate internlm
pip install torch==2.3.1 torch-npu==2.3.1 torchaudio==2.3.1 torchvision

Tips:因为启智社区环境关机后 /home/ma-user/work 目录外的文件会被还原,所以如果想后面继续使用这个调试任务又不想多花一点时间重新配置环境的话,可以在创建 conda 环境的时候使用以下命令,关机后再开直接执行 conda activate 即可。

conda create -p /home/ma-user/work/anaconda/internlm python=3.10 -y
conda activate /home/ma-user/work/anaconda/internlm

克隆代码仓

git clone https://github.moeyy.xyz/https://github.com/InternLM/lmdeploy
git clone https://github.moeyy.xyz/https://github.com/InternLM/xtuner.git

安装 LMDeploy

cd lmdeploy
pip install -r requirements_ascend.txt -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
LMDEPLOY_TARGET_DEVICE=ascend pip3 install -v --no-build-isolation -e .

安装 Transformers4.48.0

pip install transformers==4.48.0

安装 deepspeed 及 mpi4py

pip install deepspeed==0.16.2
conda install mpi4py

安装 XTuner

cd ../xtuner/
# 删除requirements/runtime.txt中的第一行bitsandbytes==0.45.0
# 删除requirements.txt文件中的-r requirements/deepspeed.txt 这一行
pip install -e '.[all]'

将模型导入到容器内

这一步建议第一次创建好云脑任务启动完成就执行好,以免后面模型如果有更新,可能会出现只有部分文件同步到容器中的情况。

# 导入包
from c2net.context import prepare, upload_output
# 初始化导入数据集和预训练模型到容器内
c2net_context = prepare()

如果遇到没有成功加载模型的话,可以看下 notebook 用的 kernel 是不是【MindSpore】。

在这里插入图片描述

模型导入到容器内会存放在该路径下:/home/ma-user/work/pretrainmodel

验证 XTuner

因为 XTuner 暂时没有 internlm3 的配置文件,不过可以使用 internlm2.5 的配置文件修改一下也是能够使用的。

xtuner list-cfg |grep internlm2_5

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

复制配置文件

找到 internlm2_5_chat_7b_qlora_alpaca_e3,然后复制到 config/internlm2_5_chat_7b_qlora_alpaca_e3_copy.py

mkdir config
xtuner copy-cfg internlm2_5_chat_7b_qlora_alpaca_e3 ./config

2.准备训练数据

数据获取

modelscope download --dataset JimmyMa99/smartflow-arxiv-dataset --local_dir ./datasets/smartflow-arxiv-dataset

数据集转换

关于数据详情可参考这篇文章的数据部分。
https://blog.csdn.net/2402_82411485/article/details/148402132?spm=1001.2014.3001.5501

原本的数据是 swift 版本,因此需要创建一个数据集转换脚本 convert_to_alpaca.py

touch convert_to_alpaca.py

数据集转换脚本 convert_to_alpaca.py 代码如下:

import json
import os
import argparsedef convert_to_alpaca_format(input_file, output_file):"""将 Swift 格式的数据转换为 Alpaca 格式输入格式:{"system": "你是个优秀的论文分类师","conversation": [{"human": "Based on the title...","assistant": "D"}]}输出格式 (Alpaca):{"instruction": "根据论文的标题、作者和摘要,确定该论文的科学类别。","input": "Based on the title...","output": "D"}"""print(f"转换数据: {input_file} -> {output_file}")converted_data = []with open(input_file, "r", encoding="utf-8") as f:for line in f:try:data = json.loads(line.strip())# 检查数据结构if "system" not in data or "conversation" not in data:print(f"警告: 数据缺少必要字段: {data}")continue# 从 system 提取指令instruction = data.get("system", "")if not instruction:instruction = "根据论文的标题、作者和摘要,确定该论文的科学类别。"# 处理对话for turn in data["conversation"]:if "human" in turn and "assistant" in turn:# 创建新的 Alpaca 格式数据new_data = {"instruction": instruction,"input": turn["human"],"output": turn["assistant"],}converted_data.append(new_data)except json.JSONDecodeError:print(f"警告: 无法解析JSON行: {line}")except Exception as e:print(f"处理行时发生错误: {str(e)}")# 写入输出文件with open(output_file, "w", encoding="utf-8") as f:for item in converted_data:f.write(json.dumps(item, ensure_ascii=False) + "\n")print(f"转换完成! 共转换 {len(converted_data)} 条数据")if __name__ == "__main__":parser = argparse.ArgumentParser(description="转换数据到Alpaca格式")parser.add_argument("--input",type=str,required=True,help="输入文件路径 (swift_formatted_sft_train_data.jsonl)",)parser.add_argument("--output", type=str, required=True, help="输出文件路径")args = parser.parse_args()convert_to_alpaca_format(args.input, args.output)

执行代码转换:

python convert_to_alpaca.py --input datasets/smartflow-arxiv-dataset/swift_formatted_sft_train_data.jsonl --output datasets/sftdata.jsonl

3.模型训练

链接模型地址

ln -s /home/ma-user/work/pretrainmodel/internlm2_5-7b-chat ./

修改 config 文件 internlm2_5_chat_7b_qlora_alpaca_e3.py

# 第34行修改为模型地址
pretrained_model_name_or_path = "internlm2_5-7b-chat"# 第38行修改为数据集地址
- alpaca_en_path = "tatsu-lab/alpaca"
+ alpaca_en_path = "datasets/sftdata.jsonl"# 第110行-121行替换为下面这段
alpaca_en = dict(type=process_hf_dataset,dataset=dict(type=load_dataset, path='json', data_files=alpaca_en_path),tokenizer=tokenizer,max_length=max_length,dataset_map_fn=alpaca_map_fn,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 上微调还需要修改以下两段代码:

# 代码头引入库的部分
- from transformers import (AutoModelForCausalLM, AutoTokenizer,BitsAndBytesConfig)
+ from transformers import (AutoModelForCausalLM, AutoTokenizer)#######################################################################
#                      PART 2  Model & Tokenizer                      #
######################################################################## 第86行左右删除
- 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')

启动微调训练

xtuner train config/internlm2_5_chat_7b_qlora_alpaca_e3_copy.py --deepspeed deepspeed_zero1

模型格式转换

xtuner convert pth_to_hf ./config/internlm2_5_chat_7b_qlora_alpaca_e3_copy.py ${pth_file} ./hf #pth_file位置填写训练后保存的权重地址,取最后一个iter开头的文件夹即可,一般在work_dir目录下

模型合并

xtuner convert merge ./internlm2_5-7b-chat ./hf ./merged --max-shard-size 2GB --device npu

如果模型使用的不是 InternLM2.5 而是 InternLM3-8B 的话,模型合并完毕后看一下 merged 目录下有没有一个 modeling_internlm3.py。如果没有的话需要手动复制到合并后的目录下。

cp -r ./internlm3-8b-instruct/modeling_internlm3.py ./merged

4.模型评测

可参考这篇文章中的模型评测部分
https://blog.csdn.net/2402_82411485/article/details/148402132?spm=1001.2014.3001.5501

5.提交模型完成评测

前置条件

获取 hub_model_id,如下图圈红部分

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

hub_token 获取:【账号设置】-【访问令牌】复制SDK/API令牌即可

在这里插入图片描述

上传模型到魔搭

因为 OpenI 环境无法安装 git-lfs,所以只能使用 modelscope 库进行模型的上传

创建一个上传的 python 脚本 upload.py

cd ~/work
touch upload.py

代码脚本如下:

from modelscope.hub.api import HubApi
from modelscope.hub.constants import Licenses, ModelVisibilityYOUR_ACCESS_TOKEN = '你的ACCESS_TOKEN'   #需要手动修改,获取地址https://www.modelscope.cn/my/myaccesstoken
api = HubApi()
api.login(YOUR_ACCESS_TOKEN)owner_name = '你的用户名'   #需要手动修改
model_name = '模型名称'     #需要手动修改
model_id = f"{owner_name}/{model_name}"api.create_model(model_id,visibility=ModelVisibility.PUBLIC,license=Licenses.APACHE_V2,chinese_name="模型中文名"   #需要手动修改,写英文的也没事
)api.upload_folder(repo_id=f"{owner_name}/{model_name}", #前面获取的hub_model_idfolder_path='xtuner/merged',  #合并以后的模型目录commit_message='upload model folder to repo', #commit信息随便填
)

执行上传脚本

cd ~/work
python upload.py

将上传至魔搭的模型提交至比赛评测平台

填写下方表单即可完成提交

https://aicarrier.feishu.cn/share/base/form/shrcn0JkjbZKMeMPw04uHCWc5Pg

6.参赛奖励

在以下时间点,排行榜位列前 10 的选手将获得相应奖励:

  • 6 月 10 日 20:00:前 10 名获得 InternStudio 平台 1688 算力点
  • 6 月 17 日 20:00:前 10 名获得 InternStudio 平台 999 算力点
  • 6 月 24 日 20:00:前 10 名获得 InternStudio 平台 666 算力点
  • 6 月 30 日 20:00:前 10 名额外获得 官方证书

注:算力有效期仅第五期实战营内有效

在这里插入图片描述

6 月 6 日榜单部分截图

访问下方链接可查看全部榜单内容

https://aicarrier.feishu.cn/share/base/dashboard/shrcnqpXY6Uy9FodNF3It75GSNe?iframeFrom=docx&ccm_open=iframe

本文主要介绍了如何基于昇腾硬件微调 InternLM 模型,并应用于论文分类任务,涵盖了从环境配置、数据准备到模型训练与评测的完整流程,希望对大家参加赛事有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/84767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac安装mvnd结合idea

mac安装mvnd结合idea hi,我是阿昌,今天记录一下mac系统下如何安装mvnd同时通过maven-helper插件配置mvnd命令,提升编译速度; 0、前言 如果你正在开发一个由大量模块组成的大型项目,Gradle可以让大型项目构建的更快&…

扩展模块--QWebEngine功能及架构解析

Qt WebEngine 模块在 Qt 6.9 中提供了基于 Chromium 的网页渲染引擎功能。 一、主要功能 核心功能 网页渲染引擎 基于 Chromium 项目的最新稳定版本 支持现代 HTML5、CSS3 和 JavaScript 标准 主要组件 QWebEngineView - 用于显示网页内容的 widget QWebEnginePage - 表示…

Spring Boot Admin监控

1、概述 Spring Boot Admin 是一款用于监控 Spring Boot 应用程序的开源工具,可帮助开发者实时监控应用的运行状态、性能指标、日志信息等。 2、核心功能 应用状态监控 显示应用是否在线、启动时间、运行时长等基础信息。监控 JVM 相关指标:内存使用情…

【QT】QTableView自定义样式:仅显示行间隔、隐藏列间隔、表头样式、表格样式、单行选中等

目录 0.背景 1.详细代码 0.背景 项目需要,我有一个自定义的类Steer_Electrode_Table,是一个QTableView; 记录一下QTableView修改前后的样式,仅供参考 看一下我修改前后的样式对比 1.详细代码 void Steer_Electrode_Table::init…

mvnd-快速打包maven项目

mvnd 一、简介一、定位与背景二、核心架构与加速原理三、使用注意事项 二、下载安装三、idea集成mvnd插件四、打包测试时长 一、简介 mvnd(Maven Daemon)是Apache Maven团队推出的高性能构建工具,旨在解决传统Maven构建速度慢的问题。它通过…

C++ 中的尾调用优化TCO:原理、实战与汇编分析

C尾调用优化 什么是尾调用?描述无返回值函数最后调用函数也可能做尾调用优化 例子关键特征(写法) 尾调用和尾递归的区别?为什么尾调用优化可以提高效率?通常的递归调用:尾调用优化:为什么栈帧复…

Java集合 - ArrayList底层源码解析

下面开始对 Java 中 ArrayList 的深度源码分析,基于 JDK 8 的实现(后续版本略有差异,但核心逻辑一致)。我们将从 类结构、扩容机制、核心方法实现、性能优化、线程安全问题 等角度进行详细解析 一、类结构与核心字段 1. 类继承关…

【Qt】Qt控件

文章目录 Qt控件Layout Spacer垂直布局QVBoxLayout水平排列布局QHBoxLayout网格布局 QGridLayout表格布局 QFormLayout Button Contain命令按钮Push Button工具按钮Tool Button单选按钮Radio Button复选框按钮Check Box命令链接按钮Command Link Button按钮盒Button Box组合框G…

PHP基础-运算符

PHP 的运算符是编程中非常基础但又非常重要的一部分&#xff0c;掌握它们能让你更灵活地处理各种逻辑、计算和流程控制。 算术运算符 用于基本数学运算&#xff1a; 运算符含义示例加法$a $b-减法$a - $b*乘法$a * $b/除法$a / $b%取模$a % $b 示例&#xff1a; <?ph…

AR珠宝佩戴与传统的珠宝购物有哪些区别?​

AR 珠宝佩戴与传统的珠宝购物究竟存在着哪些显著区别呢?在传统的珠宝购物模式里&#xff0c;顾客往往需要花费时间和精力前往实体珠宝店。踏入店内&#xff0c;首先映入眼帘的便是那一排排的玻璃展柜&#xff0c;此时&#xff0c;销售人员会热情地走上前&#xff0c;小心翼翼地…

华为云CAE部署spring cloud服务

1 概述 华为云CAE&#xff08;Cloud Application Engine云应用引擎&#xff09;是一个面向WEB、微服务应用的Serverless托管服务&#xff0c;提供极速部署、极低成本、极简运维的一站式应用托管方案。支持从源码、软件包、镜像包快速发布应用&#xff0c;秒级弹性伸缩、按量付…

【技术工具】源码管理 - GIT工具

【技术工具】源码管理 - GIT工具 1 前言 之前参考语雀一位大佬的&#xff0c;但链接找不到了&#xff0c;仅供参考。 1、检查空白错误 //确认将提交的内容中有无空白信息 git diff --check 2、尝试让每一个提交成为一个逻辑的独立变更集 尽量使每笔提交都成为独立的patch&a…

Objective-c Block 面试题

以下是对我们这整段关于 Objective-C 中 Block、__block 修饰符、内存管理行为、生命周期等内容的全面总结&#xff0c;并附带了一套适合面试准备的面试题集&#xff08;带答案&#xff09;。 &#x1f9e0; 一、知识总结&#xff1a;Objective-C Block __block 修饰符 ✅ Bl…

AndroidMJ-基础-05

基础part5: 9:测试相关 postman genemotion espresso 10:性能相关 profiler 9.测试相关 espresso相关&#xff1a; Android Espresso 自动化测试指南&#xff08;Java 版&#xff09;-CSDN博客 10.性能相关 profiler相关&#xff1a; AndroidStudio之内层泄漏工具Profiler…

R语言 | 如何使用R书写html文档?

更灵活的书写方式&#xff0c;可以直接看3. 1. 可用函数 cat()函数writeLines()函数sink()函数重定向输出到HTML文件 小结&#xff1a;cat()适合简单HTML&#xff0c;writeLines()适合多行内容&#xff0c;sink()适合复杂场景。 说明&#xff1a;尽可能不用R包&#xff0c;减…

oracle 表空间超过最大限度,清理数据释放内存

目录 一、扩容&#xff1a;参考 https://blog.csdn.net/weixin_40841731/article/details/134931289 二、清理数据 1、查询文件大小情况&#xff08;管理员账号&#xff09; 2、查询表的大小&#xff08;使用该表空间的用户&#xff09; 3、清理数据&#xff08;使用该表空…

初版BL程序一些细节整理(碎碎念)

一.串口的中断触发 一般我们都是使用TXE或者RXNE来触发中断&#xff0c;其实还有完整传输结束的TC标志位和接收完成的IDLE标志位 这两个标志位有些不同&#xff0c;RXNE标志位只需要读取寄存器就会自行清除&#xff0c;但是这两个需要读取两个&#xff0c;拿IDLE举例子 这里需要…

为何京东与蚂蚁集团竞相申请稳定币牌照?

京东与蚂蚁集团竞相申请稳定币牌照&#xff0c;主要是为了抢占数字金融新赛道&#xff0c;结合香港的宽松监管政策与全球稳定币市场的快速增长。香港2023年推出的稳定币监管框架及2025年8月即将实施的《稳定币条例》&#xff0c;为企业提供了合规路径&#xff0c;吸引京东通过币…

[特殊字符] Harmony OS Next里的Web组件:网页加载的全流程掌控手册

&#x1f389; Harmony OS Next里的Web组件&#xff1a;网页加载的全流程掌控手册 ##Harmony OS Next ##Ark Ts ##教育 本文适用于教育科普行业进行学习&#xff0c;有错误之处请指出我会修改。 开发者必看的生命周期回调详解代码实操指南 作为开发者&#xff0c;你可能经常需…

【Java学习笔记】集合介绍

集合 > > 集合的引出 在之前常使用数组存储数据&#xff0c;存在的问题如下&#xff1a; &#xff08;1&#xff09;初始化时&#xff0c;长度必须指定&#xff0c;而且一旦指定&#xff0c;不能更改 &#xff08;2&#xff09;不方便扩容&#xff08;使用循环复制原…